diff --git a/AUTHORS b/AUTHORS index 7311f1869..8fbf6f37 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -96,6 +96,7 @@ Byungwoo Lee <bw80.lee@samsung.com> Caio Marcelo de Oliveira Filho <caio.de.oliveira.filho@intel.com> Caitlin Potter <caitpotter88@gmail.com> +Cameron Gutman <aicommander@gmail.com> Catalin Badea <badea@adobe.com> Cem Kocagil <cem.kocagil@gmail.com> Chakshu Ahuja <chakshu.a@samsung.com>
diff --git a/BUILD.gn b/BUILD.gn index 0bb77f1..6fa5f29 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -590,7 +590,6 @@ deps += [ "//components/filesystem:apptests", "//components/leveldb:apptests", - "//components/mus/ws:tests", "//components/resource_provider:apptests", "//components/resource_provider:resource_provider_unittests", "//mash/wm:tests", @@ -617,6 +616,7 @@ if (is_win || is_linux) { deps += [ ":mojo_apptests", + "//components/mus/ws:tests", "//mash:all", "//mojo", ]
diff --git a/DEPS b/DEPS index a433eed..4d2a752 100644 --- a/DEPS +++ b/DEPS
@@ -39,11 +39,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': '8a21c9fe7f5fef9e87115defef27bd7218419f28', + 'skia_revision': '236640872fa8cad105273055fdcf6829d5c025a1', # 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': 'b9d7ce540ef95c280c5e83a83ce13f3b63c60d9d', + 'v8_revision': 'f72954451b6d4d92c7d583eefe79abce29a993c8', # 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. @@ -59,7 +59,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '317758574e173367b41928a1575d70600c6b6ea8', + 'pdfium_revision': 'f1fa151e146d70c5e031726581e176a8c7d0d579', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -87,7 +87,7 @@ # 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': '13ef02b40c583648d7275e68244173b770f18f3b', + 'nacl_revision': '878664c34e02d61eed4cc9cf64aaea02123e9256', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling dEQP # and whatever else without interference from each other. @@ -133,9 +133,6 @@ 'src/third_party/icu': Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'e466f6ac8f60bb9697af4a91c6911c6fc4aec95f', - 'src/third_party/libexif/sources': - Var('chromium_git') + '/chromium/deps/libexif/sources.git' + '@' + '9d467f7d21e4749ee22ee7520e561ac7b38484b9', - 'src/third_party/hunspell_dictionaries': Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + 'c106afdcec5d3de2622e19f1b3294c47bbd8bd72', @@ -270,7 +267,7 @@ 'src/third_party/catapult': Var('chromium_git') + '/external/github.com/catapult-project/catapult.git' + '@' + - 'c75918b2b2d2f4b95a5e90b5e379c4214628ac6e', + 'aa910ba5517667b17b5fca67aa5c5985d9d8247a', 'src/third_party/openh264/src': Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'b37cda248234162033e3e11b0335f3131cdfe488', @@ -558,6 +555,27 @@ ], }, { + # Ensure that while generating dependencies lists in .gyp files we don't + # accidentally reference any .pyc files whose corresponding .py files have + # already been deleted. + # We should actually try to avoid generating .pyc files, crbug.com/500078. + 'name': 'remove_stale_pyc_files', + 'pattern': '.', + 'action': [ + 'python', + 'src/tools/remove_stale_pyc_files.py', + 'src/android_webview/tools', + 'src/build/android', + 'src/gpu/gles2_conform_support', + 'src/infra', + 'src/ppapi', + 'src/printing', + 'src/third_party/catapult', + 'src/third_party/closure_compiler/build', + 'src/tools', + ], + }, + { # This downloads binaries for Native Client's newlib toolchain. # Done in lieu of building the toolchain from scratch as it can take # anywhere from 30 minutes to 4 hours depending on platform to build. @@ -834,26 +852,6 @@ 'action': ['python', 'src/third_party/instrumented_libraries/scripts/download_binaries.py'], }, { - # Ensure that while generating dependencies lists in .gyp files we don't - # accidentally reference any .pyc files whose corresponding .py files have - # already been deleted. - # We should actually try to avoid generating .pyc files, crbug.com/500078. - 'name': 'remove_stale_pyc_files', - 'pattern': '.', - 'action': [ - 'python', - 'src/tools/remove_stale_pyc_files.py', - 'src/android_webview/tools', - 'src/gpu/gles2_conform_support', - 'src/infra', - 'src/ppapi', - 'src/printing', - 'src/third_party/catapult', - 'src/third_party/closure_compiler/build', - 'src/tools', - ], - }, - { # A change to a .gyp, .gypi, or to GYP itself should run the generator. 'name': 'gyp', 'pattern': '.',
diff --git a/android_webview/browser/net/aw_cookie_store_wrapper.cc b/android_webview/browser/net/aw_cookie_store_wrapper.cc index 35af1a5..16f55dd 100644 --- a/android_webview/browser/net/aw_cookie_store_wrapper.cc +++ b/android_webview/browser/net/aw_cookie_store_wrapper.cc
@@ -335,6 +335,10 @@ return subscription->Subscribe(url, name, callback); } +bool AwCookieStoreWrapper::IsEphemeral() { + return GetCookieStore()->IsEphemeral(); +} + base::Closure AwCookieStoreWrapper::CreateWrappedClosureCallback( const base::Closure& callback) { if (callback.is_null())
diff --git a/android_webview/browser/net/aw_cookie_store_wrapper.h b/android_webview/browser/net/aw_cookie_store_wrapper.h index 86114fac..2272c4d1 100644 --- a/android_webview/browser/net/aw_cookie_store_wrapper.h +++ b/android_webview/browser/net/aw_cookie_store_wrapper.h
@@ -84,6 +84,7 @@ const GURL& url, const std::string& name, const CookieChangedCallback& callback) override; + bool IsEphemeral() override; private: // Used by CreateWrappedCallback below. Takes an arugment of Type and posts
diff --git a/android_webview/java/src/org/chromium/android_webview/AwAutofillClient.java b/android_webview/java/src/org/chromium/android_webview/AwAutofillClient.java index bccd5c6c..172c2b3 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwAutofillClient.java +++ b/android_webview/java/src/org/chromium/android_webview/AwAutofillClient.java
@@ -87,7 +87,8 @@ @CalledByNative private static void addToAutofillSuggestionArray(AutofillSuggestion[] array, int index, String name, String label, int uniqueId) { - array[index] = new AutofillSuggestion(name, label, DropdownItem.NO_ICON, uniqueId, false); + array[index] = + new AutofillSuggestion(name, label, DropdownItem.NO_ICON, uniqueId, false, false); } private native void nativeSuggestionSelected(long nativeAwAutofillClient,
diff --git a/android_webview/java/strings/translations/android_webview_strings_fa.xtb b/android_webview/java/strings/translations/android_webview_strings_fa.xtb index 7b2d1d1..b3fe811 100644 --- a/android_webview/java/strings/translations/android_webview_strings_fa.xtb +++ b/android_webview/java/strings/translations/android_webview_strings_fa.xtb
@@ -1,6 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fa"> -<translation id="3572484393913897457">مجوزهای WebView سیستم</translation> +<translation id="3572484393913897457">مجوزهای وبنمای سیستم</translation> <translation id="8916631167640856213">این قابلیت در این نسخه Android پشتیبانی نمیشود.</translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/renderer/aw_render_frame_ext.cc b/android_webview/renderer/aw_render_frame_ext.cc index 673cc5a..69b06f054 100644 --- a/android_webview/renderer/aw_render_frame_ext.cc +++ b/android_webview/renderer/aw_render_frame_ext.cc
@@ -143,7 +143,7 @@ content::DocumentState* document_state = content::DocumentState::FromDataSource(frame->dataSource()); if (document_state->can_load_local_resources()) { - blink::WebSecurityOrigin origin = frame->document().securityOrigin(); + blink::WebSecurityOrigin origin = frame->document().getSecurityOrigin(); origin.grantLoadLocalResources(); } }
diff --git a/android_webview/tools/WebViewShell/src/org/chromium/webview_shell/TelemetryActivity.java b/android_webview/tools/WebViewShell/src/org/chromium/webview_shell/TelemetryActivity.java index e2a34f93..654f641f 100644 --- a/android_webview/tools/WebViewShell/src/org/chromium/webview_shell/TelemetryActivity.java +++ b/android_webview/tools/WebViewShell/src/org/chromium/webview_shell/TelemetryActivity.java
@@ -31,7 +31,7 @@ settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); settings.setDomStorageEnabled(true); - + settings.setMediaPlaybackRequiresUserGesture(false); Intent intent = getIntent(); String userAgentString = intent.getStringExtra("userAgent"); if (userAgentString != null) {
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index bb443e6..1c6c9c8 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc
@@ -435,8 +435,8 @@ // TODO(mazda): Add other actions which should not be repeated. CYCLE_BACKWARD_MRU, CYCLE_FORWARD_MRU, - TOGGLE_OVERVIEW, EXIT, + OPEN_FEEDBACK_PAGE, PRINT_UI_HIERARCHIES, // Don't fill the logs if the key is held down. ROTATE_SCREEN, ROTATE_WINDOW, @@ -447,6 +447,7 @@ TAKE_SCREENSHOT, TOGGLE_FULLSCREEN, TOGGLE_MAXIMIZED, + TOGGLE_OVERVIEW, WINDOW_MINIMIZE, #if defined(OS_CHROMEOS) DEBUG_TOGGLE_TOUCH_PAD,
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index b2d9ed6c..019e28ef 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -4,7 +4,7 @@ <translation id="1012876632442809908">USB-C 设备(前方端口)</translation> <translation id="1013923882670373915">蓝牙设备“<ph name="DEVICE_NAME" />”需要配对许可。请在该设备上输入以下PIN码:<ph name="PINCODE" /></translation> <translation id="1021311941847921177">用于切换到下一种输入法的快捷键已更改。请使用 <ph name="NEW_SHORTCUT" />,而不是 <ph name="OLD_SHORTCUT" />。</translation> -<translation id="112308213915226829">自动隐藏文件架</translation> +<translation id="112308213915226829">自动隐藏任务栏</translation> <translation id="1195412055398077112">过扫描</translation> <translation id="1252999807265626933">正在通过“<ph name="POWER_SOURCE" />”充电</translation> <translation id="1270290102613614947">屏幕键盘已停用</translation> @@ -60,10 +60,10 @@ <translation id="2792498699870441125">Alt + 搜索键</translation> <translation id="2805756323405976993">应用</translation> <translation id="2819276065543622893">您将立即退出。</translation> -<translation id="2825619548187458965">文件架</translation> +<translation id="2825619548187458965">任务栏</translation> <translation id="2844169650293029770">USB-C 设备(左侧前端端口)</translation> <translation id="2872961005593481000">关闭</translation> -<translation id="2942516765047364088">文件架位置</translation> +<translation id="2942516765047364088">任务栏位置</translation> <translation id="2946640296642327832">启用蓝牙</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2964193600955408481">停用 Wi-Fi</translation>
diff --git a/ash/wm/overview/window_grid.cc b/ash/wm/overview/window_grid.cc index 2036d55..e4157268 100644 --- a/ash/wm/overview/window_grid.cc +++ b/ash/wm/overview/window_grid.cc
@@ -68,8 +68,7 @@ } // A comparator for locating a given target window. -struct WindowSelectorItemComparator - : public std::unary_function<WindowSelectorItem*, bool> { +struct WindowSelectorItemComparator { explicit WindowSelectorItemComparator(const aura::Window* target_window) : target(target_window) { }
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc index c940dff0..109143e 100644 --- a/ash/wm/overview/window_selector.cc +++ b/ash/wm/overview/window_selector.cc
@@ -73,8 +73,7 @@ const int kTextFilterCornerRadius = 1; // A comparator for locating a grid with a given root window. -struct RootWindowGridComparator - : public std::unary_function<WindowGrid*, bool> { +struct RootWindowGridComparator { explicit RootWindowGridComparator(const aura::Window* root_window) : root_window_(root_window) { } @@ -87,8 +86,7 @@ }; // A comparator for locating a selectable window given a targeted window. -struct WindowSelectorItemTargetComparator - : public std::unary_function<WindowSelectorItem*, bool> { +struct WindowSelectorItemTargetComparator { explicit WindowSelectorItemTargetComparator(const aura::Window* target_window) : target(target_window) { } @@ -101,8 +99,7 @@ }; // A comparator for locating a selector item for a given root. -struct WindowSelectorItemForRoot - : public std::unary_function<WindowSelectorItem*, bool> { +struct WindowSelectorItemForRoot { explicit WindowSelectorItemForRoot(const aura::Window* root) : root_window(root) { }
diff --git a/base/BUILD.gn b/base/BUILD.gn index a06dfa3..f19c8f4 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -18,6 +18,7 @@ # huge sequence of random-looking conditionals. import("//build/buildflag_header.gni") +import("//build/config/allocator.gni") import("//build/config/compiler/compiler.gni") import("//build/config/nacl/config.gni") import("//build/config/sysroot.gni") @@ -974,6 +975,7 @@ deps = [ "//base/allocator", + "//base/allocator:features", "//base/third_party/dynamic_annotations", "//third_party/modp_b64", ] @@ -990,6 +992,12 @@ libs = [ "atomic" ] } + if (use_experimental_allocator_shim) { + # The allocator shim is part of the base API. This is to allow clients of + # base should to install hooks into the allocator path. + public_deps += [ "//base/allocator:unified_allocator_shim" ] + } + # Allow more direct string conversions on platforms with native utf8 # strings if (is_mac || is_ios || is_chromeos) { @@ -1898,6 +1906,10 @@ deps += [ ":base_profiler_test_support_library" ] } + if (use_experimental_allocator_shim) { + sources += [ "allocator/allocator_shim_unittest.cc" ] + } + # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. configs += [ "//build/config/compiler:no_size_t_to_int_warning" ] @@ -2059,6 +2071,9 @@ "android/junit/src/org/chromium/base/BaseChromiumApplicationTest.java", "android/junit/src/org/chromium/base/LogTest.java", "test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java", + "test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java", + "test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java", + "test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java", ] deps = [ ":base_java",
diff --git a/base/allocator/BUILD.gn b/base/allocator/BUILD.gn index 0049800c..887d544 100644 --- a/base/allocator/BUILD.gn +++ b/base/allocator/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/buildflag_header.gni") import("//build/config/allocator.gni") import("//build/config/compiler/compiler.gni") @@ -294,3 +295,35 @@ deps += [ "//base/third_party/dynamic_annotations" ] } } # use_allocator == "tcmalloc" + +buildflag_header("features") { + header = "features.h" + flags = [ "USE_EXPERIMENTAL_ALLOCATOR_SHIM=$use_experimental_allocator_shim" ] +} + +if (use_experimental_allocator_shim) { + source_set("unified_allocator_shim") { + # TODO(primiano): support other platforms, currently this works only on + # Linux/CrOS. http://crbug.com/550886 . + configs += [ "//base:base_implementation" ] # for BASE_EXPORT + visibility = [ "//base:base" ] + sources = [ + "allocator_shim.cc", + "allocator_shim.h", + "allocator_shim_internals.h", + "allocator_shim_override_cpp_symbols.h", + "allocator_shim_override_libc_symbols.h", + ] + if (is_linux && use_allocator == "tcmalloc") { + sources += [ + "allocator_shim_default_dispatch_to_tcmalloc.cc", + "allocator_shim_override_glibc_weak_symbols.h", + ] + deps = [ + ":tcmalloc", + ] + } else if (is_linux && use_allocator == "none") { + sources += [ "allocator_shim_default_dispatch_to_glibc.cc" ] + } + } +}
diff --git a/base/allocator/allocator.gyp b/base/allocator/allocator.gyp index b5d751e..adc78fd 100644 --- a/base/allocator/allocator.gyp +++ b/base/allocator/allocator.gyp
@@ -20,7 +20,6 @@ # e.g. for profiling (it's more rare to profile Debug builds, # but people sometimes need to do that). 'disable_debugallocation%': 0, - 'use_experimental_allocator_shim%': 0, }, 'targets': [ # The only targets that should depend on allocator are 'base' and @@ -379,6 +378,18 @@ }], ], # conditions of 'allocator' target. }, # 'allocator' target. + { + # GN: //base/allocator:features + 'target_name': 'allocator_features', + 'includes': [ '../../build/buildflag_header.gypi' ], + 'toolsets': ['host', 'target'], + 'variables': { + 'buildflag_header_path': 'base/allocator/features.h', + 'buildflag_flags': [ + 'USE_EXPERIMENTAL_ALLOCATOR_SHIM=<(use_experimental_allocator_shim)', + ], + }, + }, # 'allocator_features' target. ], # targets. 'conditions': [ ['OS=="win" and win_use_allocator_shim==1', { @@ -408,5 +419,39 @@ }, ], }], + ['use_experimental_allocator_shim==1', { + 'targets': [ + { + # GN: //base/allocator:unified_allocator_shim + 'target_name': 'unified_allocator_shim', + 'toolsets': ['host', 'target'], + 'type': 'static_library', + 'defines': [ 'BASE_IMPLEMENTATION' ], + 'sources': [ + 'allocator_shim.cc', + 'allocator_shim.h', + 'allocator_shim_internals.h', + 'allocator_shim_override_cpp_symbols.h', + 'allocator_shim_override_libc_symbols.h', + ], + 'include_dirs': [ + '../..', + ], + 'conditions': [ + ['OS=="linux" and use_allocator=="tcmalloc"', { + 'sources': [ + 'allocator_shim_default_dispatch_to_tcmalloc.cc', + 'allocator_shim_override_glibc_weak_symbols.h', + ], + }], + ['OS=="linux" and use_allocator=="none"', { + 'sources': [ + 'allocator_shim_default_dispatch_to_glibc.cc', + ], + }], + ] + }, # 'unified_allocator_shim' target. + ], + }] ], }
diff --git a/base/allocator/allocator_shim.cc b/base/allocator/allocator_shim.cc new file mode 100644 index 0000000..cc5097ec --- /dev/null +++ b/base/allocator/allocator_shim.cc
@@ -0,0 +1,246 @@ +// 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 "base/allocator/allocator_shim.h" + +#include <errno.h> +#include <unistd.h> + +#include <new> + +#include "base/atomicops.h" +#include "base/logging.h" +#include "base/macros.h" +#include "base/threading/platform_thread.h" +#include "build/build_config.h" + +// No calls to malloc / new in this file. They would would cause re-entrancy of +// the shim, which is hard to deal with. Keep this code as simple as possible +// and don't use any external C++ object here, not even //base ones. Even if +// they are safe to use today, in future they might be refactored. + +namespace { + +using namespace base; + +subtle::AtomicWord g_chain_head = reinterpret_cast<subtle::AtomicWord>( + &allocator::AllocatorDispatch::default_dispatch); + +bool g_call_new_handler_on_malloc_failure = false; +subtle::Atomic32 g_new_handler_lock = 0; + +// In theory this should be just base::ThreadChecker. But we can't afford +// the luxury of a LazyInstance<ThreadChecker> here as it would cause a new(). +bool CalledOnValidThread() { + using subtle::Atomic32; + const Atomic32 kInvalidTID = static_cast<Atomic32>(kInvalidThreadId); + static Atomic32 g_tid = kInvalidTID; + Atomic32 cur_tid = static_cast<Atomic32>(PlatformThread::CurrentId()); + Atomic32 prev_tid = + subtle::NoBarrier_CompareAndSwap(&g_tid, kInvalidTID, cur_tid); + return prev_tid == kInvalidTID || prev_tid == cur_tid; +} + +inline size_t GetPageSize() { + static size_t pagesize = 0; + if (!pagesize) + pagesize = sysconf(_SC_PAGESIZE); + return pagesize; +} + +// Calls the std::new handler thread-safely. Returns true if a new_handler was +// set and called, false if no new_handler was set. +bool CallNewHandler() { + // TODO(primiano): C++11 has introduced ::get_new_handler() which is supposed + // to be thread safe and would avoid the spinlock boilerplate here. However + // it doesn't seem to be available yet in the Linux chroot headers yet. + std::new_handler nh; + { + while (subtle::Acquire_CompareAndSwap(&g_new_handler_lock, 0, 1)) + PlatformThread::YieldCurrentThread(); + nh = std::set_new_handler(0); + ignore_result(std::set_new_handler(nh)); + subtle::Release_Store(&g_new_handler_lock, 0); + } + if (!nh) + return false; + (*nh)(); + // Assume the new_handler will abort if it fails. Exception are disabled and + // we don't support the case of a new_handler throwing std::bad_balloc. + return true; +} + +inline const allocator::AllocatorDispatch* GetChainHead() { + return reinterpret_cast<const allocator::AllocatorDispatch*>( + subtle::NoBarrier_Load(&g_chain_head)); +} + +} // namespace + +namespace base { +namespace allocator { + +void SetCallNewHandlerOnMallocFailure(bool value) { + g_call_new_handler_on_malloc_failure = value; +} + +void* UncheckedAlloc(size_t size) { + const allocator::AllocatorDispatch* const chain_head = GetChainHead(); + return chain_head->alloc_function(chain_head, size); +} + +void InsertAllocatorDispatch(AllocatorDispatch* dispatch) { + // Ensure this is always called on the same thread. + DCHECK(CalledOnValidThread()); + + dispatch->next = GetChainHead(); + + // This function does not guarantee to be thread-safe w.r.t. concurrent + // insertions, but still has to guarantee that all the threads always + // see a consistent chain, hence the MemoryBarrier() below. + // InsertAllocatorDispatch() is NOT a fastpath, as opposite to malloc(), so + // we don't really want this to be a release-store with a corresponding + // acquire-load during malloc(). + subtle::MemoryBarrier(); + + subtle::NoBarrier_Store(&g_chain_head, + reinterpret_cast<subtle::AtomicWord>(dispatch)); +} + +void RemoveAllocatorDispatchForTesting(AllocatorDispatch* dispatch) { + DCHECK(CalledOnValidThread()); + DCHECK_EQ(GetChainHead(), dispatch); + subtle::NoBarrier_Store(&g_chain_head, + reinterpret_cast<subtle::AtomicWord>(dispatch->next)); +} + +} // namespace allocator +} // namespace base + +// The Shim* functions below are the entry-points into the shim-layer and +// are supposed to be invoked / aliased by the allocator_shim_override_* +// headers to route the malloc / new symbols through the shim layer. +extern "C" { + +// The general pattern for allocations is: +// - Try to allocate, if succeded return the pointer. +// - If the allocation failed: +// - Call the std::new_handler if it was a C++ allocation. +// - Call the std::new_handler if it was a malloc() (or calloc() or similar) +// AND SetCallNewHandlerOnMallocFailure(true). +// - If the std::new_handler is NOT set just return nullptr. +// - If the std::new_handler is set: +// - Assume it will abort() if it fails (very likely the new_handler will +// just suicide priting a message). +// - Assume it did succeed if it returns, in which case reattempt the alloc. + +void* ShimCppNew(size_t size) { + const allocator::AllocatorDispatch* const chain_head = GetChainHead(); + void* ptr; + do { + ptr = chain_head->alloc_function(chain_head, size); + } while (!ptr && CallNewHandler()); + return ptr; +} + +void ShimCppDelete(void* address) { + const allocator::AllocatorDispatch* const chain_head = GetChainHead(); + return chain_head->free_function(chain_head, address); +} + +void* ShimMalloc(size_t size) { + const allocator::AllocatorDispatch* const chain_head = GetChainHead(); + void* ptr; + do { + ptr = chain_head->alloc_function(chain_head, size); + } while (!ptr && g_call_new_handler_on_malloc_failure && CallNewHandler()); + return ptr; +} + +void* ShimCalloc(size_t n, size_t size) { + const allocator::AllocatorDispatch* const chain_head = GetChainHead(); + void* ptr; + do { + ptr = chain_head->alloc_zero_initialized_function(chain_head, n, size); + } while (!ptr && g_call_new_handler_on_malloc_failure && CallNewHandler()); + return ptr; +} + +void* ShimRealloc(void* address, size_t size) { + // realloc(size == 0) means free() and might return a nullptr. We should + // not call the std::new_handler in that case, though. + const allocator::AllocatorDispatch* const chain_head = GetChainHead(); + void* ptr; + do { + ptr = chain_head->realloc_function(chain_head, address, size); + } while (!ptr && size && g_call_new_handler_on_malloc_failure && + CallNewHandler()); + return ptr; +} + +void* ShimMemalign(size_t alignment, size_t size) { + const allocator::AllocatorDispatch* const chain_head = GetChainHead(); + void* ptr; + do { + ptr = chain_head->alloc_aligned_function(chain_head, alignment, size); + } while (!ptr && g_call_new_handler_on_malloc_failure && CallNewHandler()); + return ptr; +} + +int ShimPosixMemalign(void** res, size_t alignment, size_t size) { + // posix_memalign is supposed to check the arguments. See tc_posix_memalign() + // in tc_malloc.cc. + if (((alignment % sizeof(void*)) != 0) || + ((alignment & (alignment - 1)) != 0) || (alignment == 0)) { + return EINVAL; + } + void* ptr = ShimMemalign(alignment, size); + *res = ptr; + return ptr ? 0 : ENOMEM; +} + +void* ShimValloc(size_t size) { + return ShimMemalign(GetPageSize(), size); +} + +void* ShimPvalloc(size_t size) { + // pvalloc(0) should allocate one page, according to its man page. + if (size == 0) { + size = GetPageSize(); + } else { + size = (size + GetPageSize() - 1) & ~(GetPageSize() - 1); + } + return ShimMemalign(GetPageSize(), size); +} + +void ShimFree(void* address) { + const allocator::AllocatorDispatch* const chain_head = GetChainHead(); + return chain_head->free_function(chain_head, address); +} + +} // extern "C" + +// Cpp symbols (new / delete) should always be routed through the shim layer. +#include "base/allocator/allocator_shim_override_cpp_symbols.h" + +// Ditto for plain malloc() / calloc() / free() etc. symbols. +#include "base/allocator/allocator_shim_override_libc_symbols.h" + +// In the case of tcmalloc we also want to plumb into the glibc hooks +// to avoid that allocations made in glibc itself (e.g., strdup()) get +// accidentally performed on the glibc heap instead of the tcmalloc one. +#if defined(USE_TCMALLOC) +#include "base/allocator/allocator_shim_override_glibc_weak_symbols.h" +#endif + +// Cross-checks. + +#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) +#error The allocator shim should not be compiled when building for memory tools. +#endif + +#if (defined(__GNUC__) && defined(__EXCEPTIONS)) || \ + (defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS) +#error This code cannot be used when exceptions are turned on. +#endif
diff --git a/base/allocator/allocator_shim.h b/base/allocator/allocator_shim.h new file mode 100644 index 0000000..f1a1e3d --- /dev/null +++ b/base/allocator/allocator_shim.h
@@ -0,0 +1,96 @@ +// 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 BASE_ALLOCATOR_ALLOCATOR_SHIM_H_ +#define BASE_ALLOCATOR_ALLOCATOR_SHIM_H_ + +#include <stddef.h> + +#include "base/base_export.h" + +namespace base { +namespace allocator { + +// Allocator Shim API. Allows to to: +// - Configure the behavior of the allocator (what to do on OOM failures). +// - Install new hooks (AllocatorDispatch) in the allocator chain. + +// When this shim layer is enabled, the route of an allocation is as-follows: +// +// [allocator_shim_override_*.h] Intercept malloc() / operator new calls: +// The override_* headers define the symbols required to intercept calls to +// malloc() and operator new (if not overridden by specific C++ classes). +// +// [allocator_shim.cc] Routing allocation calls to the shim: +// The headers above route the calls to the internal ShimMalloc(), ShimFree(), +// ShimCppNew() etc. methods defined in allocator_shim.cc. +// These methods will: (1) forward the allocation call to the front of the +// AllocatorDispatch chain. (2) perform security hardenings (e.g., might +// call std::new_handler on OOM failure). +// +// [allocator_shim_default_dispatch_to_*.cc] The AllocatorDispatch chain: +// It is a singly linked list where each element is a struct with function +// pointers (|malloc_function|, |free_function|, etc). Normally the chain +// consists of a single AllocatorDispatch element, herein called +// the "default dispatch", which is statically defined at build time and +// ultimately routes the calls to the actual allocator defined by the build +// config (tcmalloc, glibc, ...). +// +// It is possible to dynamically insert further AllocatorDispatch stages +// to the front of the chain, for debugging / profiling purposes. +// +// All the functions must be thred safe. The shim does not enforce any +// serialization. This is to route to thread-aware allocators (e.g, tcmalloc) +// wihout introducing unnecessary perf hits. + +struct AllocatorDispatch { + using AllocFn = void*(const AllocatorDispatch* self, size_t size); + using AllocZeroInitializedFn = void*(const AllocatorDispatch* self, + size_t n, + size_t size); + using AllocAlignedFn = void*(const AllocatorDispatch* self, + size_t alignment, + size_t size); + using ReallocFn = void*(const AllocatorDispatch* self, + void* address, + size_t size); + using FreeFn = void(const AllocatorDispatch* self, void* address); + + AllocFn* const alloc_function; + AllocZeroInitializedFn* const alloc_zero_initialized_function; + AllocAlignedFn* const alloc_aligned_function; + ReallocFn* const realloc_function; + FreeFn* const free_function; + + const AllocatorDispatch* next; + + // |default_dispatch| is statically defined by one (and only one) of the + // allocator_shim_default_dispatch_to_*.cc files, depending on the build + // configuration. + static const AllocatorDispatch default_dispatch; +}; + +// When true makes malloc behave like new, w.r.t calling the new_handler if +// the allocation fails (see set_new_mode() in Windows). +BASE_EXPORT void SetCallNewHandlerOnMallocFailure(bool value); + +// Allocates |size| bytes or returns nullptr. It does NOT call the new_handler, +// regardless of SetCallNewHandlerOnMallocFailure(). +BASE_EXPORT void* UncheckedAlloc(size_t size); + +// Inserts |dispatch| in front of the allocator chain. This method is NOT +// thread-safe w.r.t concurrent invocations of InsertAllocatorDispatch(). +// The callers have the responsibility of linearizing the changes to the chain +// (or more likely call these always on the same thread). +BASE_EXPORT void InsertAllocatorDispatch(AllocatorDispatch* dispatch); + +// Test-only. Rationale: (1) lack of use cases; (2) dealing safely with a +// removal of arbitrary elements from a singly linked list would require a lock +// in malloc(), which we really don't want. +BASE_EXPORT void RemoveAllocatorDispatchForTesting(AllocatorDispatch* dispatch); + +} // namespace allocator +} // namespace base + +#endif // BASE_ALLOCATOR_ALLOCATOR_SHIM_H_
diff --git a/base/allocator/allocator_shim_default_dispatch_to_glibc.cc b/base/allocator/allocator_shim_default_dispatch_to_glibc.cc new file mode 100644 index 0000000..02facbad --- /dev/null +++ b/base/allocator/allocator_shim_default_dispatch_to_glibc.cc
@@ -0,0 +1,52 @@ +// 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 "base/allocator/allocator_shim.h" + +// This translation unit defines a default dispatch for the allocator shim which +// routes allocations to libc functions. +// The code here is strongly inspired from tcmalloc's libc_override_glibc.h. + +extern "C" { +void* __libc_malloc(size_t size); +void* __libc_calloc(size_t n, size_t size); +void* __libc_realloc(void* address, size_t size); +void* __libc_memalign(size_t alignment, size_t size); +void __libc_free(void* ptr); +} // extern "C" + +namespace { + +using base::allocator::AllocatorDispatch; + +void* GlibcMalloc(const AllocatorDispatch*, size_t size) { + return __libc_malloc(size); +} + +void* GlibcCalloc(const AllocatorDispatch*, size_t n, size_t size) { + return __libc_calloc(n, size); +} + +void* GlibcRealloc(const AllocatorDispatch*, void* address, size_t size) { + return __libc_realloc(address, size); +} + +void* GlibcMemalign(const AllocatorDispatch*, size_t alignment, size_t size) { + return __libc_memalign(alignment, size); +} + +void GlibcFree(const AllocatorDispatch*, void* address) { + __libc_free(address); +} + +} // namespace + +const AllocatorDispatch AllocatorDispatch::default_dispatch = { + &GlibcMalloc, /* alloc_function */ + &GlibcCalloc, /* alloc_zero_initialized_function */ + &GlibcMemalign, /* alloc_aligned_function */ + &GlibcRealloc, /* realloc_function */ + &GlibcFree, /* free_function */ + nullptr, /* next */ +};
diff --git a/base/allocator/allocator_shim_default_dispatch_to_tcmalloc.cc b/base/allocator/allocator_shim_default_dispatch_to_tcmalloc.cc new file mode 100644 index 0000000..d851f13f --- /dev/null +++ b/base/allocator/allocator_shim_default_dispatch_to_tcmalloc.cc
@@ -0,0 +1,76 @@ +// 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 "base/allocator/allocator_shim.h" +#include "base/allocator/allocator_shim_internals.h" +#include "third_party/tcmalloc/chromium/src/config.h" +#include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h" + +namespace { + +using base::allocator::AllocatorDispatch; + +void* TCMalloc(const AllocatorDispatch*, size_t size) { + return tc_malloc(size); +} + +void* TCCalloc(const AllocatorDispatch*, size_t n, size_t size) { + return tc_calloc(n, size); +} + +void* TCMemalign(const AllocatorDispatch*, size_t alignment, size_t size) { + return tc_memalign(alignment, size); +} + +void* TCRealloc(const AllocatorDispatch*, void* address, size_t size) { + return tc_realloc(address, size); +} + +void TCFree(const AllocatorDispatch*, void* address) { + tc_free(address); +} + +} // namespace + +const AllocatorDispatch AllocatorDispatch::default_dispatch = { + &TCMalloc, /* alloc_function */ + &TCCalloc, /* alloc_zero_initialized_function */ + &TCMemalign, /* alloc_aligned_function */ + &TCRealloc, /* realloc_function */ + &TCFree, /* free_function */ + nullptr, /* next */ +}; + +// In the case of tcmalloc we have also to route the diagnostic symbols, +// which are not part of the unified shim layer, to tcmalloc for consistency. + +extern "C" { + +SHIM_ALWAYS_EXPORT void malloc_stats(void) __THROW { + return tc_malloc_stats(); +} + +SHIM_ALWAYS_EXPORT int mallopt(int cmd, int value) __THROW { + return tc_mallopt(cmd, value); +} + +#ifdef HAVE_STRUCT_MALLINFO +SHIM_ALWAYS_EXPORT struct mallinfo mallinfo(void) __THROW { + return tc_mallinfo(); +} +#endif + +SHIM_ALWAYS_EXPORT size_t malloc_size(void* address) __THROW { + return tc_malloc_size(address); +} + +#if defined(__ANDROID__) +SHIM_ALWAYS_EXPORT size_t malloc_usable_size(const void* address) __THROW { +#else +SHIM_ALWAYS_EXPORT size_t malloc_usable_size(void* address) __THROW { +#endif + return tc_malloc_size(address); +} + +} // extern "C"
diff --git a/base/allocator/allocator_shim_internals.h b/base/allocator/allocator_shim_internals.h new file mode 100644 index 0000000..35df284 --- /dev/null +++ b/base/allocator/allocator_shim_internals.h
@@ -0,0 +1,23 @@ +// 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 BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_ +#define BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_ + +#if defined(__GNUC__) + +#include <sys/cdefs.h> // for __THROW + +#ifndef __THROW /* Not a glibc system */ +#define __THROW +#endif + +// Shim layer symbols need to be ALWAYS exported, regardless of component build. +#define SHIM_ALWAYS_EXPORT __attribute__((visibility("default"))) + +#define SHIM_ALIAS_SYMBOL(fn) __attribute__((alias(#fn))) + +#endif // __GNUC__ + +#endif // BASE_ALLOCATOR_ALLOCATOR_SHIM_INTERNALS_H_
diff --git a/base/allocator/allocator_shim_override_cpp_symbols.h b/base/allocator/allocator_shim_override_cpp_symbols.h new file mode 100644 index 0000000..616716fb --- /dev/null +++ b/base/allocator/allocator_shim_override_cpp_symbols.h
@@ -0,0 +1,42 @@ +// 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. + +#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_ +#error This header is meant to be included only once by allocator_shim.cc +#endif +#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_ + +// Alias the default new/delete C++ symbols to the shim entry points. +// This file is strongly inspired by tcmalloc's libc_override_redefine.h. + +#include <new> + +#include "base/allocator/allocator_shim_internals.h" + +SHIM_ALWAYS_EXPORT void* operator new(size_t size) + SHIM_ALIAS_SYMBOL(ShimCppNew); + +SHIM_ALWAYS_EXPORT void operator delete(void* p) __THROW + SHIM_ALIAS_SYMBOL(ShimCppDelete); + +SHIM_ALWAYS_EXPORT void* operator new[](size_t size) + SHIM_ALIAS_SYMBOL(ShimCppNew); + +SHIM_ALWAYS_EXPORT void operator delete[](void* p) __THROW + SHIM_ALIAS_SYMBOL(ShimCppDelete); + +SHIM_ALWAYS_EXPORT void* operator new(size_t size, + const std::nothrow_t&) __THROW + SHIM_ALIAS_SYMBOL(ShimCppNew); + +SHIM_ALWAYS_EXPORT void* operator new[](size_t size, + const std::nothrow_t&) __THROW + SHIM_ALIAS_SYMBOL(ShimCppNew); + +SHIM_ALWAYS_EXPORT void operator delete(void* p, const std::nothrow_t&) __THROW + SHIM_ALIAS_SYMBOL(ShimCppDelete); + +SHIM_ALWAYS_EXPORT void operator delete[](void* p, + const std::nothrow_t&) __THROW + SHIM_ALIAS_SYMBOL(ShimCppDelete);
diff --git a/base/allocator/allocator_shim_override_glibc_weak_symbols.h b/base/allocator/allocator_shim_override_glibc_weak_symbols.h new file mode 100644 index 0000000..dda49aa --- /dev/null +++ b/base/allocator/allocator_shim_override_glibc_weak_symbols.h
@@ -0,0 +1,109 @@ +// 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. + +#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_GLIBC_WEAK_SYMBOLS_H_ +#error This header is meant to be included only once by allocator_shim.cc +#endif +#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_GLIBC_WEAK_SYMBOLS_H_ + +// Alias the internal Glibc symbols to the shim entry points. +// This file is strongly inspired by tcmalloc's libc_override_glibc.h. +// Effectively this file does two things: +// 1) Re-define the __malloc_hook & co symbols. Those symbols are defined as +// weak in glibc and are meant to be defined strongly by client processes +// to hook calls initiated from within glibc. +// 2) Re-define Glibc-specific symbols (__libc_malloc). The historical reason +// is that in the past (in RedHat 9) we had instances of libraries that were +// allocating via malloc() and freeing using __libc_free(). +// See tcmalloc's libc_override_glibc.h for more context. + +#include <features.h> // for __GLIBC__ +#include <malloc.h> +#include <unistd.h> + +#include <new> + +#include "base/allocator/allocator_shim_internals.h" + +// __MALLOC_HOOK_VOLATILE not defined in all Glibc headers. +#if !defined(__MALLOC_HOOK_VOLATILE) +#define MALLOC_HOOK_MAYBE_VOLATILE /**/ +#else +#define MALLOC_HOOK_MAYBE_VOLATILE __MALLOC_HOOK_VOLATILE +#endif + +extern "C" { + +// 1) Re-define malloc_hook weak symbols. +namespace { + +void* GlibcMallocHook(size_t size, const void* caller) { + return ShimMalloc(size); +} + +void* GlibcReallocHook(void* ptr, size_t size, const void* caller) { + return ShimRealloc(ptr, size); +} + +void GlibcFreeHook(void* ptr, const void* caller) { + return ShimFree(ptr); +} + +void* GlibcMemalignHook(size_t align, size_t size, const void* caller) { + return ShimMemalign(align, size); +} + +} // namespace + +SHIM_ALWAYS_EXPORT void* (*MALLOC_HOOK_MAYBE_VOLATILE __malloc_hook)( + size_t, + const void*) = &GlibcMallocHook; + +SHIM_ALWAYS_EXPORT void* (*MALLOC_HOOK_MAYBE_VOLATILE __realloc_hook)( + void*, + size_t, + const void*) = &GlibcReallocHook; + +SHIM_ALWAYS_EXPORT void (*MALLOC_HOOK_MAYBE_VOLATILE __free_hook)(void*, + const void*) = + &GlibcFreeHook; + +SHIM_ALWAYS_EXPORT void* (*MALLOC_HOOK_MAYBE_VOLATILE __memalign_hook)( + size_t, + size_t, + const void*) = &GlibcMemalignHook; + +// 2) Redefine libc symbols themselves. + +SHIM_ALWAYS_EXPORT void* __libc_malloc(size_t size) + SHIM_ALIAS_SYMBOL(ShimMalloc); + +SHIM_ALWAYS_EXPORT void __libc_free(void* ptr) SHIM_ALIAS_SYMBOL(ShimFree); + +SHIM_ALWAYS_EXPORT void* __libc_realloc(void* ptr, size_t size) + SHIM_ALIAS_SYMBOL(ShimRealloc); + +SHIM_ALWAYS_EXPORT void* __libc_calloc(size_t n, size_t size) + SHIM_ALIAS_SYMBOL(ShimCalloc); + +SHIM_ALWAYS_EXPORT void __libc_cfree(void* ptr) SHIM_ALIAS_SYMBOL(ShimFree); + +SHIM_ALWAYS_EXPORT void* __libc_memalign(size_t align, size_t s) + SHIM_ALIAS_SYMBOL(ShimMemalign); + +SHIM_ALWAYS_EXPORT void* __libc_valloc(size_t size) + SHIM_ALIAS_SYMBOL(ShimValloc); + +SHIM_ALWAYS_EXPORT void* __libc_pvalloc(size_t size) + SHIM_ALIAS_SYMBOL(ShimPvalloc); + +SHIM_ALWAYS_EXPORT int __posix_memalign(void** r, size_t a, size_t s) + SHIM_ALIAS_SYMBOL(ShimPosixMemalign); + +} // extern "C" + +// Safety check. +#if !defined(__GLIBC__) +#error The current platform does not seem to use Glibc. +#endif
diff --git a/base/allocator/allocator_shim_override_libc_symbols.h b/base/allocator/allocator_shim_override_libc_symbols.h new file mode 100644 index 0000000..37b3b4eb --- /dev/null +++ b/base/allocator/allocator_shim_override_libc_symbols.h
@@ -0,0 +1,54 @@ +// 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. + +// Its purpose is to SHIM_ALIAS_SYMBOL the Libc symbols for malloc/new to the +// shim layer entry points. + +#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_LIBC_SYMBOLS_H_ +#error This header is meant to be included only once by allocator_shim.cc +#endif +#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_LIBC_SYMBOLS_H_ + +#include <malloc.h> + +#include "base/allocator/allocator_shim_internals.h" + +extern "C" { + +SHIM_ALWAYS_EXPORT void* malloc(size_t size) __THROW + SHIM_ALIAS_SYMBOL(ShimMalloc); + +SHIM_ALWAYS_EXPORT void free(void* ptr) __THROW + SHIM_ALIAS_SYMBOL(ShimFree); + +SHIM_ALWAYS_EXPORT void* realloc(void* ptr, size_t size) __THROW + SHIM_ALIAS_SYMBOL(ShimRealloc); + +SHIM_ALWAYS_EXPORT void* calloc(size_t n, size_t size) __THROW + SHIM_ALIAS_SYMBOL(ShimCalloc); + +SHIM_ALWAYS_EXPORT void cfree(void* ptr) __THROW + SHIM_ALIAS_SYMBOL(ShimFree); + +SHIM_ALWAYS_EXPORT void* memalign(size_t align, size_t s) __THROW + SHIM_ALIAS_SYMBOL(ShimMemalign); + +SHIM_ALWAYS_EXPORT void* valloc(size_t size) __THROW + SHIM_ALIAS_SYMBOL(ShimValloc); + +SHIM_ALWAYS_EXPORT void* pvalloc(size_t size) __THROW + SHIM_ALIAS_SYMBOL(ShimPvalloc); + +SHIM_ALWAYS_EXPORT int posix_memalign(void** r, size_t a, size_t s) __THROW + SHIM_ALIAS_SYMBOL(ShimPosixMemalign); + +// The default dispatch translation unit has to define also the following +// symbols (unless they are ultimately routed to the system symbols): +// void malloc_stats(void); +// int mallopt(int, int); +// struct mallinfo mallinfo(void); +// size_t malloc_size(void*); +// size_t malloc_usable_size(const void*); + +} // extern "C"
diff --git a/base/allocator/allocator_shim_unittest.cc b/base/allocator/allocator_shim_unittest.cc new file mode 100644 index 0000000..4e987b6 --- /dev/null +++ b/base/allocator/allocator_shim_unittest.cc
@@ -0,0 +1,314 @@ +// 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 "base/allocator/allocator_shim.h" + +#include <malloc.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <new> +#include <vector> + +#include "base/atomicops.h" +#include "base/memory/scoped_ptr.h" +#include "base/synchronization/waitable_event.h" +#include "base/threading/platform_thread.h" +#include "base/threading/thread_local.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace base { +namespace allocator { +namespace { + +using testing::MockFunction; +using testing::_; + +class AllocatorShimTest : public testing::Test { + public: + static const size_t kMaxSizeTracked = 8192; + AllocatorShimTest() : testing::Test() {} + + static size_t Hash(const void* ptr) { + return reinterpret_cast<uintptr_t>(ptr) % kMaxSizeTracked; + } + + static void* MockAlloc(const AllocatorDispatch* self, size_t size) { + if (instance_ && size < kMaxSizeTracked) + ++(instance_->allocs_intercepted_by_size[size]); + return self->next->alloc_function(self->next, size); + } + + static void* MockAllocZeroInit(const AllocatorDispatch* self, + size_t n, + size_t size) { + const size_t real_size = n * size; + if (instance_ && real_size < kMaxSizeTracked) + ++(instance_->zero_allocs_intercepted_by_size[real_size]); + return self->next->alloc_zero_initialized_function(self->next, n, size); + } + + static void* MockAllocAligned(const AllocatorDispatch* self, + size_t alignment, + size_t size) { + if (instance_) { + if (size < kMaxSizeTracked) + ++(instance_->aligned_allocs_intercepted_by_size[size]); + if (alignment < kMaxSizeTracked) + ++(instance_->aligned_allocs_intercepted_by_alignment[alignment]); + } + return self->next->alloc_aligned_function(self->next, alignment, size); + } + + static void* MockRealloc(const AllocatorDispatch* self, + void* address, + size_t size) { + if (instance_) { + // Address 0x42 is a special sentinel for the NewHandlerConcurrency test. + // The first time (but only the first one) it is hit it fails, causing the + // invocation of the std::new_handler. + if (address == reinterpret_cast<void*>(0x42)) { + if (!instance_->did_fail_realloc_0x42_once->Get()) { + instance_->did_fail_realloc_0x42_once->Set(true); + return nullptr; + } else { + return reinterpret_cast<void*>(0x42ul); + } + } + + if (size < kMaxSizeTracked) + ++(instance_->reallocs_intercepted_by_size[size]); + ++instance_->reallocs_intercepted_by_addr[Hash(address)]; + } + return self->next->realloc_function(self->next, address, size); + } + + static void MockFree(const AllocatorDispatch* self, void* address) { + if (instance_) { + ++instance_->frees_intercepted_by_addr[Hash(address)]; + } + self->next->free_function(self->next, address); + } + + static void NewHandler() { + if (!instance_) + return; + subtle::Barrier_AtomicIncrement(&instance_->num_new_handler_calls, 1); + } + + int32_t GetNumberOfNewHandlerCalls() { + return subtle::Acquire_Load(&instance_->num_new_handler_calls); + } + + void SetUp() override { + const size_t array_size = kMaxSizeTracked * sizeof(size_t); + memset(&allocs_intercepted_by_size, 0, array_size); + memset(&zero_allocs_intercepted_by_size, 0, array_size); + memset(&aligned_allocs_intercepted_by_size, 0, array_size); + memset(&aligned_allocs_intercepted_by_alignment, 0, array_size); + memset(&reallocs_intercepted_by_size, 0, array_size); + memset(&frees_intercepted_by_addr, 0, array_size); + did_fail_realloc_0x42_once.reset(new ThreadLocalBoolean()); + subtle::Release_Store(&num_new_handler_calls, 0); + instance_ = this; + } + + void TearDown() override { instance_ = nullptr; } + + protected: + size_t allocs_intercepted_by_size[kMaxSizeTracked]; + size_t zero_allocs_intercepted_by_size[kMaxSizeTracked]; + size_t aligned_allocs_intercepted_by_size[kMaxSizeTracked]; + size_t aligned_allocs_intercepted_by_alignment[kMaxSizeTracked]; + size_t reallocs_intercepted_by_size[kMaxSizeTracked]; + size_t reallocs_intercepted_by_addr[kMaxSizeTracked]; + size_t frees_intercepted_by_addr[kMaxSizeTracked]; + scoped_ptr<ThreadLocalBoolean> did_fail_realloc_0x42_once; + subtle::Atomic32 num_new_handler_calls; + + private: + static AllocatorShimTest* instance_; +}; + +struct TestStruct1 { + uint32_t ignored; + uint8_t ignored_2; +}; + +struct TestStruct2 { + uint64_t ignored; + uint8_t ignored_3; +}; + +class ThreadDelegateForNewHandlerTest : public PlatformThread::Delegate { + public: + ThreadDelegateForNewHandlerTest(WaitableEvent* event) : event_(event) {} + + void ThreadMain() override { + event_->Wait(); + void* res = realloc(reinterpret_cast<void*>(0x42ul), 1); + EXPECT_EQ(0x42u, reinterpret_cast<uintptr_t>(res)); + } + + private: + WaitableEvent* event_; +}; + +AllocatorShimTest* AllocatorShimTest::instance_ = nullptr; + +AllocatorDispatch g_mock_dispatch = { + &AllocatorShimTest::MockAlloc, /* alloc_function */ + &AllocatorShimTest::MockAllocZeroInit, /* alloc_zero_initialized_function */ + &AllocatorShimTest::MockAllocAligned, /* alloc_aligned_function */ + &AllocatorShimTest::MockRealloc, /* realloc_function */ + &AllocatorShimTest::MockFree, /* free_function */ + nullptr, /* next */ +}; + +TEST_F(AllocatorShimTest, InterceptLibcSymbols) { + const size_t kPageSize = sysconf(_SC_PAGESIZE); + InsertAllocatorDispatch(&g_mock_dispatch); + + void* alloc_ptr = malloc(19); + ASSERT_NE(nullptr, alloc_ptr); + ASSERT_GE(allocs_intercepted_by_size[19], 1u); + + void* zero_alloc_ptr = calloc(2, 23); + ASSERT_NE(nullptr, zero_alloc_ptr); + ASSERT_GE(zero_allocs_intercepted_by_size[2 * 23], 1u); + + void* memalign_ptr = memalign(128, 53); + ASSERT_NE(nullptr, memalign_ptr); + ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(memalign_ptr) % 128); + ASSERT_GE(aligned_allocs_intercepted_by_alignment[128], 1u); + ASSERT_GE(aligned_allocs_intercepted_by_size[53], 1u); + + void* posix_memalign_ptr = nullptr; + int res = posix_memalign(&posix_memalign_ptr, 256, 59); + ASSERT_EQ(0, res); + ASSERT_NE(nullptr, posix_memalign_ptr); + ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(posix_memalign_ptr) % 256); + ASSERT_GE(aligned_allocs_intercepted_by_alignment[256], 1u); + ASSERT_GE(aligned_allocs_intercepted_by_size[59], 1u); + + void* valloc_ptr = valloc(61); + ASSERT_NE(nullptr, valloc_ptr); + ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(valloc_ptr) % kPageSize); + ASSERT_GE(aligned_allocs_intercepted_by_alignment[kPageSize], 1u); + ASSERT_GE(aligned_allocs_intercepted_by_size[61], 1u); + + void* pvalloc_ptr = pvalloc(67); + ASSERT_NE(nullptr, pvalloc_ptr); + ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(pvalloc_ptr) % kPageSize); + ASSERT_GE(aligned_allocs_intercepted_by_alignment[kPageSize], 1u); + // pvalloc rounds the size up to the next page. + ASSERT_GE(aligned_allocs_intercepted_by_size[kPageSize], 1u); + + char* realloc_ptr = static_cast<char*>(realloc(nullptr, 71)); + ASSERT_NE(nullptr, realloc_ptr); + ASSERT_GE(reallocs_intercepted_by_size[71], 1u); + ASSERT_GE(reallocs_intercepted_by_addr[Hash(nullptr)], 1u); + strcpy(realloc_ptr, "foobar"); + realloc_ptr = static_cast<char*>(realloc(realloc_ptr, 73)); + ASSERT_GE(reallocs_intercepted_by_size[73], 1u); + ASSERT_GE(reallocs_intercepted_by_addr[Hash(realloc_ptr)], 1u); + ASSERT_EQ(0, strcmp(realloc_ptr, "foobar")); + + free(alloc_ptr); + ASSERT_GE(frees_intercepted_by_addr[Hash(alloc_ptr)], 1u); + + free(zero_alloc_ptr); + ASSERT_GE(frees_intercepted_by_addr[Hash(zero_alloc_ptr)], 1u); + + free(memalign_ptr); + ASSERT_GE(frees_intercepted_by_addr[Hash(memalign_ptr)], 1u); + + free(posix_memalign_ptr); + ASSERT_GE(frees_intercepted_by_addr[Hash(posix_memalign_ptr)], 1u); + + free(valloc_ptr); + ASSERT_GE(frees_intercepted_by_addr[Hash(valloc_ptr)], 1u); + + free(pvalloc_ptr); + ASSERT_GE(frees_intercepted_by_addr[Hash(pvalloc_ptr)], 1u); + + free(realloc_ptr); + ASSERT_GE(frees_intercepted_by_addr[Hash(realloc_ptr)], 1u); + + RemoveAllocatorDispatchForTesting(&g_mock_dispatch); + + void* non_hooked_ptr = malloc(4095); + ASSERT_NE(nullptr, non_hooked_ptr); + ASSERT_EQ(0u, allocs_intercepted_by_size[4095]); + free(non_hooked_ptr); +} + +TEST_F(AllocatorShimTest, InterceptCppSymbols) { + InsertAllocatorDispatch(&g_mock_dispatch); + + TestStruct1* new_ptr = new TestStruct1; + ASSERT_NE(nullptr, new_ptr); + ASSERT_GE(allocs_intercepted_by_size[sizeof(TestStruct1)], 1u); + + TestStruct1* new_array_ptr = new TestStruct1[3]; + ASSERT_NE(nullptr, new_array_ptr); + ASSERT_GE(allocs_intercepted_by_size[sizeof(TestStruct1) * 3], 1u); + + TestStruct2* new_nt_ptr = new (std::nothrow) TestStruct2; + ASSERT_NE(nullptr, new_nt_ptr); + ASSERT_GE(allocs_intercepted_by_size[sizeof(TestStruct2)], 1u); + + TestStruct2* new_array_nt_ptr = new TestStruct2[3]; + ASSERT_NE(nullptr, new_array_nt_ptr); + ASSERT_GE(allocs_intercepted_by_size[sizeof(TestStruct2) * 3], 1u); + + delete new_ptr; + ASSERT_GE(frees_intercepted_by_addr[Hash(new_ptr)], 1u); + + delete[] new_array_ptr; + ASSERT_GE(frees_intercepted_by_addr[Hash(new_array_ptr)], 1u); + + delete new_nt_ptr; + ASSERT_GE(frees_intercepted_by_addr[Hash(new_nt_ptr)], 1u); + + delete[] new_array_nt_ptr; + ASSERT_GE(frees_intercepted_by_addr[Hash(new_array_nt_ptr)], 1u); + + RemoveAllocatorDispatchForTesting(&g_mock_dispatch); +} + +// This test exercises the case of concurrent OOM failure, which would end up +// invoking std::new_handler concurrently. This is to cover the CallNewHandler() +// paths of allocator_shim.cc and smoke-test its thread safey. +// The test creates kNumThreads threads. Each of them does just a realloc(0x42). +// The shim intercepts such realloc and makes it fail only once on each thread. +// We expect to see excactly kNumThreads invocations of the new_handler. +TEST_F(AllocatorShimTest, NewHandlerConcurrency) { + const int kNumThreads = 32; + PlatformThreadHandle threads[kNumThreads]; + + // The WaitableEvent here is used to attempt to trigger all the threads at + // the same time, after they have been initialized. + WaitableEvent event(/*manual_reset=*/true, /*initially_signaled=*/false); + + ThreadDelegateForNewHandlerTest mock_thread_main(&event); + + for (int i = 0; i < kNumThreads; ++i) + PlatformThread::Create(0, &mock_thread_main, &threads[i]); + + std::set_new_handler(&AllocatorShimTest::NewHandler); + SetCallNewHandlerOnMallocFailure(true); // It's going to fail on realloc(). + InsertAllocatorDispatch(&g_mock_dispatch); + event.Signal(); + for (int i = 0; i < kNumThreads; ++i) + PlatformThread::Join(threads[i]); + RemoveAllocatorDispatchForTesting(&g_mock_dispatch); + ASSERT_EQ(kNumThreads, GetNumberOfNewHandlerCalls()); +} + +} // namespace +} // namespace allocator +} // namespace base
diff --git a/base/base.gyp b/base/base.gyp index 46ec1aa..5b20cfe 100644 --- a/base/base.gyp +++ b/base/base.gyp
@@ -22,6 +22,7 @@ }, 'dependencies': [ 'allocator/allocator.gyp:allocator', + 'allocator/allocator.gyp:allocator_features', 'base_debugging_flags#target', 'base_static', 'base_build_date#target', @@ -235,6 +236,9 @@ 'sync_socket_posix.cc', ] }], + ['use_experimental_allocator_shim==1', { + 'dependencies': [ 'allocator/allocator.gyp:unified_allocator_shim'] + }], ], 'sources': [ 'auto_reset.h', @@ -719,6 +723,9 @@ 'third_party/libevent/libevent.gyp:libevent' ], }], + ['use_experimental_allocator_shim==1', { + 'sources': [ 'allocator/allocator_shim_unittest.cc'] + }], ], # conditions 'target_conditions': [ ['OS == "ios" and _toolset != "host"', { @@ -1551,6 +1558,9 @@ 'src_paths': [ '../base/android/junit/', '../base/test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java', + '../base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java', + '../base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java', + '../base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java', ], 'test_type': 'junit', 'wrapper_script_name': 'helper/<(_target_name)',
diff --git a/base/containers/mru_cache.h b/base/containers/mru_cache.h index d9e64872..6c1d6260 100644 --- a/base/containers/mru_cache.h +++ b/base/containers/mru_cache.h
@@ -41,12 +41,9 @@ }; // Base class for the MRU cache specializations defined below. -// The deletor will get called on all payloads that are being removed or -// replaced. template <class KeyType, class PayloadType, class HashOrCompareType, - class DeletorType, template <typename, typename, typename> class MapType = MRUCacheStandardMap> class MRUCacheBase { @@ -75,18 +72,9 @@ // a new item is inserted. If the caller wants to manager this itself (for // example, maybe it has special work to do when something is evicted), it // can pass NO_AUTO_EVICT to not restrict the cache size. - explicit MRUCacheBase(size_type max_size) : max_size_(max_size) { - } + explicit MRUCacheBase(size_type max_size) : max_size_(max_size) {} - MRUCacheBase(size_type max_size, const DeletorType& deletor) - : max_size_(max_size), deletor_(deletor) { - } - - virtual ~MRUCacheBase() { - iterator i = begin(); - while (i != end()) - i = Erase(i); - } + virtual ~MRUCacheBase() {} size_type max_size() const { return max_size_; } @@ -94,14 +82,14 @@ // the same key, it is removed prior to insertion. An iterator indicating the // inserted item will be returned (this will always be the front of the list). // - // The payload will be copied. In the case of an OwningMRUCache, this function - // will take ownership of the pointer. - iterator Put(const KeyType& key, const PayloadType& payload) { + // The payload will be forwarded. + template <typename Payload> + iterator Put(const KeyType& key, Payload&& payload) { // Remove any existing payload with that key. typename KeyIndex::iterator index_iter = index_.find(key); if (index_iter != index_.end()) { - // Erase the reference to it. This will call the deletor on the removed - // element. The index reference will be replaced in the code below. + // Erase the reference to it. The index reference will be replaced in the + // code below. Erase(index_iter->second); } else if (max_size_ != NO_AUTO_EVICT) { // New item is being inserted which might make it larger than the maximum @@ -109,7 +97,7 @@ ShrinkToSize(max_size_ - 1); } - ordering_.push_front(value_type(key, payload)); + ordering_.push_front(value_type(key, std::forward<Payload>(payload))); index_.insert(std::make_pair(key, ordering_.begin())); return ordering_.begin(); } @@ -150,14 +138,12 @@ void Swap(MRUCacheBase& other) { ordering_.swap(other.ordering_); index_.swap(other.index_); - std::swap(deletor_, other.deletor_); std::swap(max_size_, other.max_size_); } // Erases the item referenced by the given iterator. An iterator to the item // following it will be returned. The iterator must be valid. iterator Erase(iterator pos) { - deletor_(pos->second); index_.erase(pos->first); return ordering_.erase(pos); } @@ -180,9 +166,6 @@ // Deletes everything from the cache. void Clear() { - for (typename PayloadList::iterator i(ordering_.begin()); - i != ordering_.end(); ++i) - deletor_(i->second); index_.clear(); ordering_.clear(); } @@ -219,83 +202,28 @@ size_type max_size_; - DeletorType deletor_; - DISALLOW_COPY_AND_ASSIGN(MRUCacheBase); }; // MRUCache -------------------------------------------------------------------- -// A functor that does nothing. Used by the MRUCache. -template<class PayloadType> -class MRUCacheNullDeletor { - public: - void operator()(const PayloadType& payload) {} -}; - // A container that does not do anything to free its data. Use this when storing // value types (as opposed to pointers) in the list. template <class KeyType, class PayloadType> -class MRUCache : public MRUCacheBase<KeyType, - PayloadType, - std::less<KeyType>, - MRUCacheNullDeletor<PayloadType>> { +class MRUCache : public MRUCacheBase<KeyType, PayloadType, std::less<KeyType>> { private: - typedef MRUCacheBase<KeyType, - PayloadType, - std::less<KeyType>, - MRUCacheNullDeletor<PayloadType>> - ParentType; + using ParentType = MRUCacheBase<KeyType, PayloadType, std::less<KeyType>>; public: // See MRUCacheBase, noting the possibility of using NO_AUTO_EVICT. explicit MRUCache(typename ParentType::size_type max_size) - : ParentType(max_size) { - } - virtual ~MRUCache() { - } + : ParentType(max_size) {} + virtual ~MRUCache() {} private: DISALLOW_COPY_AND_ASSIGN(MRUCache); }; -// OwningMRUCache -------------------------------------------------------------- - -template<class PayloadType> -class MRUCachePointerDeletor { - public: - void operator()(const PayloadType& payload) { delete payload; } -}; - -// A cache that owns the payload type, which must be a non-const pointer type. -// The pointers will be deleted when they are removed, replaced, or when the -// cache is destroyed. -// TODO(vmpstr): This should probably go away in favor of storing scoped_ptrs. -template <class KeyType, class PayloadType> -class OwningMRUCache - : public MRUCacheBase<KeyType, - PayloadType, - std::less<KeyType>, - MRUCachePointerDeletor<PayloadType>> { - private: - typedef MRUCacheBase<KeyType, - PayloadType, - std::less<KeyType>, - MRUCachePointerDeletor<PayloadType>> - ParentType; - - public: - // See MRUCacheBase, noting the possibility of using NO_AUTO_EVICT. - explicit OwningMRUCache(typename ParentType::size_type max_size) - : ParentType(max_size) { - } - virtual ~OwningMRUCache() { - } - - private: - DISALLOW_COPY_AND_ASSIGN(OwningMRUCache); -}; - // HashingMRUCache ------------------------------------------------------------ template <class KeyType, class ValueType, class HashType> @@ -307,26 +235,17 @@ // the map type instead of std::map. Note that your KeyType must be hashable to // use this cache or you need to provide a hashing class. template <class KeyType, class PayloadType, class HashType = std::hash<KeyType>> -class HashingMRUCache : public MRUCacheBase<KeyType, - PayloadType, - HashType, - MRUCacheNullDeletor<PayloadType>, - MRUCacheHashMap> { +class HashingMRUCache + : public MRUCacheBase<KeyType, PayloadType, HashType, MRUCacheHashMap> { private: - typedef MRUCacheBase<KeyType, - PayloadType, - HashType, - MRUCacheNullDeletor<PayloadType>, - MRUCacheHashMap> - ParentType; + using ParentType = + MRUCacheBase<KeyType, PayloadType, HashType, MRUCacheHashMap>; public: // See MRUCacheBase, noting the possibility of using NO_AUTO_EVICT. explicit HashingMRUCache(typename ParentType::size_type max_size) - : ParentType(max_size) { - } - virtual ~HashingMRUCache() { - } + : ParentType(max_size) {} + virtual ~HashingMRUCache() {} private: DISALLOW_COPY_AND_ASSIGN(HashingMRUCache);
diff --git a/base/containers/mru_cache_unittest.cc b/base/containers/mru_cache_unittest.cc index 8ebecdb7..d38337e 100644 --- a/base/containers/mru_cache_unittest.cc +++ b/base/containers/mru_cache_unittest.cc
@@ -5,6 +5,7 @@ #include <stddef.h> #include "base/containers/mru_cache.h" +#include "base/memory/scoped_ptr.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -187,15 +188,15 @@ // Make sure that the owning version release its pointers properly. TEST(MRUCacheTest, Owning) { - typedef base::OwningMRUCache<int, CachedItem*> Cache; + using Cache = base::MRUCache<int, scoped_ptr<CachedItem>>; Cache cache(Cache::NO_AUTO_EVICT); int initial_count = cached_item_live_count; // First insert and item and then overwrite it. static const int kItem1Key = 1; - cache.Put(kItem1Key, new CachedItem(20)); - cache.Put(kItem1Key, new CachedItem(22)); + cache.Put(kItem1Key, make_scoped_ptr(new CachedItem(20))); + cache.Put(kItem1Key, make_scoped_ptr(new CachedItem(22))); // There should still be one item, and one extra live item. Cache::iterator iter = cache.Get(kItem1Key); @@ -211,8 +212,8 @@ // go away. { Cache cache2(Cache::NO_AUTO_EVICT); - cache2.Put(1, new CachedItem(20)); - cache2.Put(2, new CachedItem(20)); + cache2.Put(1, make_scoped_ptr(new CachedItem(20))); + cache2.Put(2, make_scoped_ptr(new CachedItem(20))); } // There should be no objects leaked. @@ -221,8 +222,8 @@ // Check that Clear() also frees things correctly. { Cache cache2(Cache::NO_AUTO_EVICT); - cache2.Put(1, new CachedItem(20)); - cache2.Put(2, new CachedItem(20)); + cache2.Put(1, make_scoped_ptr(new CachedItem(20))); + cache2.Put(2, make_scoped_ptr(new CachedItem(20))); EXPECT_EQ(initial_count + 2, cached_item_live_count); cache2.Clear(); EXPECT_EQ(initial_count, cached_item_live_count); @@ -230,7 +231,7 @@ } TEST(MRUCacheTest, AutoEvict) { - typedef base::OwningMRUCache<int, CachedItem*> Cache; + using Cache = base::MRUCache<int, scoped_ptr<CachedItem>>; static const Cache::size_type kMaxSize = 3; int initial_count = cached_item_live_count; @@ -239,10 +240,10 @@ Cache cache(kMaxSize); static const int kItem1Key = 1, kItem2Key = 2, kItem3Key = 3, kItem4Key = 4; - cache.Put(kItem1Key, new CachedItem(20)); - cache.Put(kItem2Key, new CachedItem(21)); - cache.Put(kItem3Key, new CachedItem(22)); - cache.Put(kItem4Key, new CachedItem(23)); + cache.Put(kItem1Key, make_scoped_ptr(new CachedItem(20))); + cache.Put(kItem2Key, make_scoped_ptr(new CachedItem(21))); + cache.Put(kItem3Key, make_scoped_ptr(new CachedItem(22))); + cache.Put(kItem4Key, make_scoped_ptr(new CachedItem(23))); // The cache should only have kMaxSize items in it even though we inserted // more.
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc index 802ed51..0e99b01 100644 --- a/base/files/file_util_posix.cc +++ b/base/files/file_util_posix.cc
@@ -351,7 +351,7 @@ #endif // !defined(OS_NACL_NONSFI) bool SetNonBlocking(int fd) { - int flags = fcntl(fd, F_GETFL, 0); + const int flags = fcntl(fd, F_GETFL); if (flags == -1) return false; if (flags & O_NONBLOCK)
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc index 7feacdb..ea4f816 100644 --- a/base/metrics/histogram.cc +++ b/base/metrics/histogram.cc
@@ -154,22 +154,10 @@ ImportPersistentHistograms(); HistogramBase* histogram = StatisticsRecorder::FindHistogram(name_); - - // crbug.com/588946 debugging. See comment at end of function. - const BucketRanges* created_ranges = - reinterpret_cast<const BucketRanges*>(0xDEADBEEF); - const BucketRanges* registered_ranges = - reinterpret_cast<const BucketRanges*>(0xDEADBEEF); - HistogramBase* tentative_histogram = - reinterpret_cast<HistogramBase*>(0xDEADBEEF); - PersistentMemoryAllocator* allocator = - reinterpret_cast<PersistentMemoryAllocator*>(0xDEADBEEF); - PersistentMemoryAllocator::Reference histogram_ref = 0xDEADBEEF; - if (!histogram) { // To avoid racy destruction at shutdown, the following will be leaked. - created_ranges = CreateRanges(); - registered_ranges = + const BucketRanges* created_ranges = CreateRanges(); + const BucketRanges* registered_ranges = StatisticsRecorder::RegisterOrDeleteDuplicateRanges(created_ranges); // In most cases, the bucket-count, minimum, and maximum values are known @@ -182,17 +170,15 @@ minimum_ = registered_ranges->range(1); maximum_ = registered_ranges->range(bucket_count_ - 1); } - CHECK_LT(0, minimum_); - CHECK_LT(0, maximum_); // Try to create the histogram using a "persistent" allocator. As of // 2015-01-14, the availability of such is controlled by a base::Feature // that is off by default. If the allocator doesn't exist or if // allocating from it fails, code below will allocate the histogram from // the process heap. - histogram_ref = 0; - tentative_histogram = nullptr; - allocator = + PersistentMemoryAllocator::Reference histogram_ref = 0; + HistogramBase* tentative_histogram = nullptr; + PersistentMemoryAllocator* allocator = GetPersistentHistogramMemoryAllocator(); if (allocator) { flags_ |= HistogramBase::kIsPersistent; @@ -205,12 +191,6 @@ registered_ranges, flags_, &histogram_ref); - CHECK_LT(0, minimum_); - CHECK_LT(0, maximum_); - CHECK_EQ(minimum_, - static_cast<Histogram*>(tentative_histogram)->declared_min_); - CHECK_EQ(maximum_, - static_cast<Histogram*>(tentative_histogram)->declared_max_); } // Handle the case where no persistent allocator is present or the @@ -220,12 +200,6 @@ DCHECK(!allocator); // Shouldn't have failed. flags_ &= ~HistogramBase::kIsPersistent; tentative_histogram = HeapAlloc(registered_ranges); - CHECK_LT(0, minimum_); - CHECK_LT(0, maximum_); - CHECK_EQ(minimum_, - static_cast<Histogram*>(tentative_histogram)->declared_min_); - CHECK_EQ(maximum_, - static_cast<Histogram*>(tentative_histogram)->declared_max_); } FillHistogram(tentative_histogram); @@ -240,15 +214,6 @@ } DCHECK_EQ(histogram_type_, histogram->GetHistogramType()); - bool bad_args = false; - HistogramBase* existing_histogram = histogram; - HistogramType existing_type = histogram->GetHistogramType(); - const char* existing_name = histogram->histogram_name().c_str(); - Sample existing_minimum = static_cast<Histogram*>(histogram)->declared_min_; - Sample existing_maximum = static_cast<Histogram*>(histogram)->declared_max_; - uint32_t existing_bucket_count = - static_cast<Histogram*>(histogram)->bucket_count(); - if (bucket_count_ != 0 && !histogram->HasConstructionArguments(minimum_, maximum_, bucket_count_)) { // The construction arguments do not match the existing histogram. This can @@ -258,45 +223,8 @@ // on dereference, but extension/Pepper APIs will guard against NULL and not // crash. DLOG(ERROR) << "Histogram " << name_ << " has bad construction arguments"; - bad_args = true; - histogram = nullptr; + return nullptr; } - -#if !DCHECK_IS_ON() // Don't affect tests, only release builds. - // For the moment, crash here so that collected crash reports have access - // to the construction values in order to figure out why this is failing. - // TODO(bcwhite): Remove this once crbug.com/588946 is resolved. Also remove - // from beta-branch because we don't want crashes due to misbehaving - // extensions (see comment above). - if (!histogram) { - HistogramType histogram_type = histogram_type_; - HistogramBase::Sample minimum = minimum_; - HistogramBase::Sample maximum = maximum_; - uint32_t bucket_count = bucket_count_; - int32_t flags = flags_; - CHECK(histogram) << name_ << ": bad-args=" << bad_args; - base::debug::Alias(&histogram_type); - base::debug::Alias(&minimum); - base::debug::Alias(&maximum); - base::debug::Alias(&bucket_count); - base::debug::Alias(&flags); - base::debug::Alias(&created_ranges); - base::debug::Alias(®istered_ranges); - base::debug::Alias(&histogram_ref); - base::debug::Alias(&tentative_histogram); - base::debug::Alias(&allocator); - base::debug::Alias(&tentative_histogram); - } -#endif - - // Down here so vars are always "used". - base::debug::Alias(&bad_args); - base::debug::Alias(&existing_histogram); - base::debug::Alias(&existing_type); - base::debug::Alias(&existing_name); - base::debug::Alias(&existing_minimum); - base::debug::Alias(&existing_maximum); - base::debug::Alias(&existing_bucket_count); return histogram; } @@ -558,12 +486,8 @@ bucket_ranges_(ranges), declared_min_(minimum), declared_max_(maximum) { - CHECK_LT(0, minimum); - CHECK_LT(0, maximum); if (ranges) samples_.reset(new SampleVector(HashMetricName(name), ranges)); - CHECK_EQ(minimum, declared_min_); - CHECK_EQ(maximum, declared_max_); } Histogram::Histogram(const std::string& name, @@ -579,16 +503,12 @@ bucket_ranges_(ranges), declared_min_(minimum), declared_max_(maximum) { - CHECK_LT(0, minimum); - CHECK_LT(0, maximum); if (ranges) { samples_.reset(new SampleVector(HashMetricName(name), counts, counts_size, meta, ranges)); logged_samples_.reset(new SampleVector(samples_->id(), logged_counts, counts_size, logged_meta, ranges)); } - CHECK_EQ(minimum, declared_min_); - CHECK_EQ(maximum, declared_max_); } Histogram::~Histogram() {
diff --git a/base/metrics/histogram_persistence.cc b/base/metrics/histogram_persistence.cc index 8b946475..f18d175 100644 --- a/base/metrics/histogram_persistence.cc +++ b/base/metrics/histogram_persistence.cc
@@ -288,8 +288,6 @@ HistogramBase::AtomicCount* logged_data = counts_data + histogram_data.bucket_count; - CHECK_LT(0, histogram_data.minimum); - CHECK_LT(0, histogram_data.maximum); std::string name(histogram_data_ptr->name); HistogramBase* histogram = nullptr; switch (histogram_data.histogram_type) {
diff --git a/base/metrics/histogram_unittest.cc b/base/metrics/histogram_unittest.cc index e6aefd3..beb6a71 100644 --- a/base/metrics/histogram_unittest.cc +++ b/base/metrics/histogram_unittest.cc
@@ -668,7 +668,7 @@ EXPECT_FALSE(iter.SkipBytes(1)); } -TEST_P(HistogramTest, DISABLED_BadConstruction) { +TEST_P(HistogramTest, BadConstruction) { HistogramBase* histogram = Histogram::FactoryGet( "BadConstruction", 0, 100, 8, HistogramBase::kNoFlags); EXPECT_TRUE(histogram->HasConstructionArguments(1, 100, 8));
diff --git a/base/metrics/metrics_hashes.cc b/base/metrics/metrics_hashes.cc index 54c117b..5672b06d 100644 --- a/base/metrics/metrics_hashes.cc +++ b/base/metrics/metrics_hashes.cc
@@ -4,7 +4,6 @@ #include "base/metrics/metrics_hashes.h" -#include "base/debug/alias.h" #include "base/logging.h" #include "base/md5.h" #include "base/sys_byteorder.h" @@ -16,14 +15,9 @@ // Converts the 8-byte prefix of an MD5 hash into a uint64_t value. inline uint64_t DigestToUInt64(const base::MD5Digest& digest) { uint64_t value; - CHECK_GE(sizeof(digest.a), sizeof(value)); + DCHECK_GE(sizeof(digest.a), sizeof(value)); memcpy(&value, digest.a, sizeof(value)); - uint64_t hash = base::NetToHost64(value); - CHECK_NE(0U, hash); - base::debug::Alias(&hash); - base::debug::Alias(&value); - base::debug::Alias(&digest); - return hash; + return base::NetToHost64(value); } } // namespace
diff --git a/base/metrics/statistics_recorder.cc b/base/metrics/statistics_recorder.cc index 90d64bb..d0fa2ad 100644 --- a/base/metrics/statistics_recorder.cc +++ b/base/metrics/statistics_recorder.cc
@@ -5,7 +5,6 @@ #include "base/metrics/statistics_recorder.h" #include "base/at_exit.h" -#include "base/debug/alias.h" #include "base/debug/leak_annotations.h" #include "base/json/string_escape.h" #include "base/logging.h" @@ -124,17 +123,13 @@ histogram_to_return = histogram; } else { // We already have one histogram with this name. - CHECK_EQ(histogram->histogram_name(), - it->second->histogram_name()) << "hash collision"; + DCHECK_EQ(histogram->histogram_name(), + it->second->histogram_name()) << "hash collision"; histogram_to_return = it->second; histogram_to_delete = histogram; } - base::debug::Alias(&it); - base::debug::Alias(&name); - base::debug::Alias(&name_hash); } } - base::debug::Alias(&histogram); delete histogram_to_delete; return histogram_to_return; } @@ -284,22 +279,10 @@ if (histograms_ == NULL) return NULL; - const uint64_t lookup_hash = HashMetricName(name); - HistogramMap::iterator it = histograms_->find(lookup_hash); + HistogramMap::iterator it = histograms_->find(HashMetricName(name)); if (histograms_->end() == it) return NULL; - - const uint64_t existing_hash = it->first; - const char* existing_name = it->second->histogram_name().c_str(); - HistogramMap* histograms = histograms_; - CHECK_EQ(name, it->second->histogram_name()) << "hash collision"; - base::debug::Alias(&lookup_hash); - base::debug::Alias(&existing_hash); - base::debug::Alias(&name); - base::debug::Alias(&existing_name); - base::debug::Alias(&it); - base::debug::Alias(&histograms); - + DCHECK_EQ(name, it->second->histogram_name()) << "hash collision"; return it->second; }
diff --git a/base/process/memory_linux.cc b/base/process/memory_linux.cc index b5c96408..9fb630b 100644 --- a/base/process/memory_linux.cc +++ b/base/process/memory_linux.cc
@@ -8,6 +8,8 @@ #include <new> +#include "base/allocator/allocator_shim.h" +#include "base/allocator/features.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/logging.h" @@ -41,8 +43,12 @@ } // namespace +// TODO(primiano): Once the unified shim is on by default (crbug.com/550886) +// get rid of the code in this entire #if section. The whole termination-on-OOM +// logic is implemented in the shim. #if !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER) && \ - !defined(THREAD_SANITIZER) && !defined(LEAK_SANITIZER) + !defined(THREAD_SANITIZER) && !defined(LEAK_SANITIZER) && \ + !BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) #if defined(LIBC_GLIBC) && !defined(USE_TCMALLOC) @@ -150,7 +156,10 @@ // If we're using glibc's allocator, the above functions will override // malloc and friends and make them die on out of memory. #endif -#if defined(USE_TCMALLOC) + +#if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) + allocator::SetCallNewHandlerOnMallocFailure(true); +#elif defined(USE_TCMALLOC) // For tcmalloc, we need to tell it to behave like new. tc_set_new_mode(1); #endif @@ -194,7 +203,9 @@ } bool UncheckedMalloc(size_t size, void** result) { -#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) || \ +#if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) + *result = allocator::UncheckedAlloc(size); +#elif defined(MEMORY_TOOL_REPLACES_ALLOCATOR) || \ (!defined(LIBC_GLIBC) && !defined(USE_TCMALLOC)) *result = malloc(size); #elif defined(LIBC_GLIBC) && !defined(USE_TCMALLOC)
diff --git a/base/sync_socket_posix.cc b/base/sync_socket_posix.cc index 7b9995ce..5d9e25e 100644 --- a/base/sync_socket_posix.cc +++ b/base/sync_socket_posix.cc
@@ -222,7 +222,7 @@ DCHECK_LE(length, kMaxMessageLength); DCHECK_NE(handle_, kInvalidHandle); - const long flags = fcntl(handle_, F_GETFL, NULL); + const int flags = fcntl(handle_, F_GETFL); if (flags != -1 && (flags & O_NONBLOCK) == 0) { // Set the socket to non-blocking mode for sending if its original mode // is blocking.
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseInstrumentationTestRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseInstrumentationTestRunner.java index fd6fafd1..d875724 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseInstrumentationTestRunner.java +++ b/base/test/android/javatests/src/org/chromium/base/test/BaseInstrumentationTestRunner.java
@@ -8,29 +8,19 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.os.Build; import android.os.Bundle; import android.test.AndroidTestRunner; import android.test.InstrumentationTestRunner; -import android.text.TextUtils; -import junit.framework.TestCase; import junit.framework.TestResult; -import org.chromium.base.Log; -import org.chromium.base.SysUtils; import org.chromium.base.multidex.ChromiumMultiDexInstaller; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIfSkipCheck; -import org.chromium.base.test.util.MinAndroidSdkLevel; -import org.chromium.base.test.util.Restriction; -import org.chromium.base.test.util.SkipCheck; +import org.chromium.base.test.util.MinAndroidSdkLevelSkipCheck; +import org.chromium.base.test.util.RestrictionSkipCheck; import org.chromium.test.reporter.TestStatusListener; -import java.lang.reflect.Method; - // TODO(jbudorick): Add support for on-device handling of timeouts. /** * An Instrumentation test runner that checks SDK level for tests with specific requirements. @@ -67,97 +57,12 @@ */ protected void addTestHooks(BaseTestResult result) { result.addSkipCheck(new MinAndroidSdkLevelSkipCheck()); - result.addSkipCheck(new RestrictionSkipCheck()); + result.addSkipCheck(new RestrictionSkipCheck(getTargetContext())); result.addSkipCheck(new DisableIfSkipCheck()); result.addPreTestHook(CommandLineFlags.getRegistrationHook()); } - - /** - * Checks if any restrictions exist and skip the test if it meets those restrictions. - */ - public class RestrictionSkipCheck extends SkipCheck { - @Override - public boolean shouldSkip(TestCase testCase) { - Method method = getTestMethod(testCase); - if (method == null) return true; - - Restriction restrictions = method.getAnnotation(Restriction.class); - if (restrictions != null) { - for (String restriction : restrictions.value()) { - if (restrictionApplies(restriction)) { - Log.i(TAG, "Test " + testCase.getClass().getName() + "#" - + testCase.getName() + " skipped because of restriction " - + restriction); - return true; - } - } - } - return false; - } - - protected boolean restrictionApplies(String restriction) { - if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_LOW_END_DEVICE) - && !SysUtils.isLowEndDevice()) { - return true; - } - if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE) - && SysUtils.isLowEndDevice()) { - return true; - } - if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_INTERNET) - && !isNetworkAvailable()) { - return true; - } - return false; - } - - private boolean isNetworkAvailable() { - final ConnectivityManager connectivityManager = (ConnectivityManager) - getTargetContext().getSystemService(Context.CONNECTIVITY_SERVICE); - final NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); - return activeNetworkInfo != null && activeNetworkInfo.isConnected(); - } - } - - /** - * Checks the device's SDK level against any specified minimum requirement. - */ - public static class MinAndroidSdkLevelSkipCheck extends SkipCheck { - - /** - * If {@link MinAndroidSdkLevel} is present, checks its value - * against the device's SDK level. - * - * @param testCase The test to check. - * @return true if the device's SDK level is below the specified minimum. - */ - @Override - public boolean shouldSkip(TestCase testCase) { - Class<?> testClass = testCase.getClass(); - Method testMethod = getTestMethod(testCase); - - int minSdkLevel = 0; - if (testClass.isAnnotationPresent(MinAndroidSdkLevel.class)) { - minSdkLevel = Math.max(testClass.getAnnotation(MinAndroidSdkLevel.class).value(), - minSdkLevel); - } - if (testMethod != null && testMethod.isAnnotationPresent(MinAndroidSdkLevel.class)) { - minSdkLevel = Math.max(testMethod.getAnnotation(MinAndroidSdkLevel.class).value(), - minSdkLevel); - } - - if (Build.VERSION.SDK_INT < minSdkLevel) { - Log.i(TAG, "Test " + testClass.getName() + "#" + testCase.getName() - + " is not enabled at SDK level " + Build.VERSION.SDK_INT - + "."); - return true; - } - return false; - } - } - @Override public Context getTargetContext() { return new ContextWrapper(super.getTargetContext()) {
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java new file mode 100644 index 0000000..c95ae22 --- /dev/null +++ b/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java
@@ -0,0 +1,47 @@ +// 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. + +package org.chromium.base.test.util; + +import android.os.Build; + +import junit.framework.TestCase; + +import org.chromium.base.Log; + +import java.lang.reflect.Method; + +/** + * Checks the device's SDK level against any specified minimum requirement. + */ +public class MinAndroidSdkLevelSkipCheck extends SkipCheck { + + private static final String TAG = "base_test"; + + /** + * If {@link MinAndroidSdkLevel} is present, checks its value + * against the device's SDK level. + * + * @param testCase The test to check. + * @return true if the device's SDK level is below the specified minimum. + */ + @Override + public boolean shouldSkip(TestCase testCase) { + Class testClass = testCase.getClass(); + Method testMethod = getTestMethod(testCase); + + int minSdkLevel = 0; + for (MinAndroidSdkLevel m : getAnnotations(testMethod, MinAndroidSdkLevel.class)) { + minSdkLevel = Math.max(minSdkLevel, m.value()); + } + + if (Build.VERSION.SDK_INT < minSdkLevel) { + Log.i(TAG, "Test " + testClass.getName() + "#" + testCase.getName() + + " is not enabled at SDK level " + Build.VERSION.SDK_INT + + "."); + return true; + } + return false; + } +}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java b/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java index 7c6dc22..9d27d42 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java +++ b/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java
@@ -15,7 +15,7 @@ * @Restriction({RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_SMALL_MEMORY}) * Test classes are free to define restrictions and enforce them using reflection at runtime. */ -@Target(ElementType.METHOD) +@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Restriction { /** Specifies the test is only valid on low end devices that have less memory. */
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java new file mode 100644 index 0000000..b4beef2 --- /dev/null +++ b/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java
@@ -0,0 +1,72 @@ +// 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. + +package org.chromium.base.test.util; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.text.TextUtils; + +import junit.framework.TestCase; + +import org.chromium.base.Log; +import org.chromium.base.SysUtils; + +import java.lang.reflect.Method; + +/** + * Checks if any restrictions exist and skip the test if it meets those restrictions. + */ +public class RestrictionSkipCheck extends SkipCheck { + + private static final String TAG = "base_test"; + + private final Context mTargetContext; + + public RestrictionSkipCheck(Context targetContext) { + mTargetContext = targetContext; + } + + @Override + public boolean shouldSkip(TestCase testCase) { + Method method = getTestMethod(testCase); + if (method == null) return true; + + for (Restriction restriction : getAnnotations(method, Restriction.class)) { + for (String restrictionVal : restriction.value()) { + if (restrictionApplies(restrictionVal)) { + Log.i(TAG, "Test " + testCase.getClass().getName() + "#" + + testCase.getName() + " skipped because of restriction " + + restriction); + return true; + } + } + } + return false; + } + + protected boolean restrictionApplies(String restriction) { + if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_LOW_END_DEVICE) + && !SysUtils.isLowEndDevice()) { + return true; + } + if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE) + && SysUtils.isLowEndDevice()) { + return true; + } + if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_INTERNET) + && !isNetworkAvailable()) { + return true; + } + return false; + } + + private boolean isNetworkAvailable() { + final ConnectivityManager connectivityManager = (ConnectivityManager) + mTargetContext.getSystemService(Context.CONNECTIVITY_SERVICE); + final NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); + return activeNetworkInfo != null && activeNetworkInfo.isConnected(); + } +}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java index cb21dfd..b55a838 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java +++ b/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java
@@ -8,7 +8,11 @@ import org.chromium.base.Log; +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; /** * Check whether a test case should be skipped. @@ -35,5 +39,22 @@ return null; } } + + protected static <T extends Annotation> List<T> getAnnotations(AnnotatedElement element, + Class<T> annotationClass) { + AnnotatedElement parent = (element instanceof Method) + ? ((Method) element).getDeclaringClass() + : ((Class) element).getSuperclass(); + List<T> annotations = (parent == null) + ? new ArrayList<T>() + : getAnnotations(parent, annotationClass); + Annotation[] allAnnotations = element.getAnnotations(); + for (Annotation a : allAnnotations) { + if (annotationClass.isInstance(a)) { + annotations.add((T) a); + } + } + return annotations; + } }
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java new file mode 100644 index 0000000..1ab2270 --- /dev/null +++ b/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java
@@ -0,0 +1,93 @@ +// 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. + +package org.chromium.base.test.util; + +import junit.framework.TestCase; + +import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +/** Unit tests for MinAndroidSdkLevelSkipCheck. */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE, reportSdk = 19) +public class MinAndroidSdkLevelSkipCheckTest { + + private static class UnannotatedBaseClass extends TestCase { + public UnannotatedBaseClass(String name) { + super(name); + } + @MinAndroidSdkLevel(18) public void min18Method() {} + @MinAndroidSdkLevel(20) public void min20Method() {} + } + + @MinAndroidSdkLevel(18) + private static class Min18Class extends UnannotatedBaseClass { + public Min18Class(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + @MinAndroidSdkLevel(20) + private static class Min20Class extends UnannotatedBaseClass { + public Min20Class(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + private static class ExtendsMin18Class extends Min18Class { + public ExtendsMin18Class(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + private static class ExtendsMin20Class extends Min20Class { + public ExtendsMin20Class(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + @Test + public void testAnnotatedMethodAboveMin() { + Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip( + new UnannotatedBaseClass("min18Method"))); + } + + @Test + public void testAnnotatedMethodBelowMin() { + Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip( + new UnannotatedBaseClass("min20Method"))); + } + + @Test + public void testAnnotatedClassAboveMin() { + Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip( + new Min18Class("unannotatedMethod"))); + } + + @Test + public void testAnnotatedClassBelowMin() { + Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip( + new Min20Class("unannotatedMethod"))); + } + + @Test + public void testAnnotatedSuperclassAboveMin() { + Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip( + new ExtendsMin18Class("unannotatedMethod"))); + } + + @Test + public void testAnnotatedSuperclassBelowMin() { + Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip( + new ExtendsMin20Class("unannotatedMethod"))); + } +}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java new file mode 100644 index 0000000..4e9996b --- /dev/null +++ b/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java
@@ -0,0 +1,127 @@ +// 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. + +package org.chromium.base.test.util; + +import android.text.TextUtils; + +import junit.framework.TestCase; + +import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +/** Unit tests for RestrictionSkipCheck. */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class RestrictionSkipCheckTest { + + private static final String TEST_RESTRICTION_APPLIES = + "org.chromium.base.test.util.RestrictionSkipCheckTest.TEST_RESTRICTION_APPLIES"; + private static final String TEST_RESTRICTION_DOES_NOT_APPLY = + "org.chromium.base.test.util.RestrictionSkipCheckTest.TEST_RESTRICTION_DOES_NOT_APPLY"; + + private static class TestRestrictionSkipCheck extends RestrictionSkipCheck { + public TestRestrictionSkipCheck() { + super(null); + } + protected boolean restrictionApplies(String restriction) { + return TextUtils.equals(restriction, TEST_RESTRICTION_APPLIES); + } + } + + private static class UnannotatedBaseClass extends TestCase { + public UnannotatedBaseClass(String name) { + super(name); + } + @Restriction({TEST_RESTRICTION_APPLIES}) public void restrictedMethod() {} + @Restriction({TEST_RESTRICTION_DOES_NOT_APPLY}) public void unrestrictedMethod() {} + } + + @Restriction({TEST_RESTRICTION_APPLIES}) + private static class RestrictedClass extends UnannotatedBaseClass { + public RestrictedClass(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + @Restriction({TEST_RESTRICTION_DOES_NOT_APPLY}) + private static class UnrestrictedClass extends UnannotatedBaseClass { + public UnrestrictedClass(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + @Restriction({ + TEST_RESTRICTION_APPLIES, + TEST_RESTRICTION_DOES_NOT_APPLY}) + private static class MultipleRestrictionsRestrictedClass extends UnannotatedBaseClass { + public MultipleRestrictionsRestrictedClass(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + private static class ExtendsRestrictedClass extends RestrictedClass { + public ExtendsRestrictedClass(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + private static class ExtendsUnrestrictedClass extends UnrestrictedClass { + public ExtendsUnrestrictedClass(String name) { + super(name); + } + public void unannotatedMethod() {} + } + + @Test + public void testMethodRestricted() { + Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip( + new UnannotatedBaseClass("restrictedMethod"))); + } + + @Test + public void testMethodUnrestricted() { + Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip( + new UnannotatedBaseClass("unrestrictedMethod"))); + } + + @Test + public void testClassRestricted() { + Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip( + new RestrictedClass("unannotatedMethod"))); + } + + @Test + public void testClassUnrestricted() { + Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip( + new UnrestrictedClass("unannotatedMethod"))); + } + + @Test + public void testMultipleRestrictionsClassRestricted() { + Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip( + new MultipleRestrictionsRestrictedClass("unannotatedMethod"))); + } + + @Test + public void testSuperclassRestricted() { + Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip( + new ExtendsRestrictedClass("unannotatedMethod"))); + } + + @Test + public void testSuperclassUnrestricted() { + Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip( + new ExtendsUnrestrictedClass("unannotatedMethod"))); + } + +} +
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java new file mode 100644 index 0000000..efca734 --- /dev/null +++ b/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java
@@ -0,0 +1,123 @@ +// 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. + +package org.chromium.base.test.util; + +import junit.framework.TestCase; + +import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +import java.lang.annotation.Annotation; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; +import java.util.List; + +/** Unit tests for SkipCheck. */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class SkipCheckTest { + + private static class TestableSkipCheck extends SkipCheck { + public static <T extends Annotation> List<T> getAnnotationsForTesting( + AnnotatedElement element, Class<T> annotationClass) { + return getAnnotations(element, annotationClass); + } + + @Override + public boolean shouldSkip(TestCase t) { + return false; + } + } + + @Retention(RetentionPolicy.RUNTIME) + private @interface TestAnnotation {} + + private class UnannotatedBaseClass { + public void unannotatedMethod() {} + @TestAnnotation public void annotatedMethod() {} + } + + @TestAnnotation + private class AnnotatedBaseClass { + public void unannotatedMethod() {} + @TestAnnotation public void annotatedMethod() {} + } + + private class ExtendsAnnotatedBaseClass extends AnnotatedBaseClass { + public void anotherUnannotatedMethod() {} + } + + @Test + public void getAnnotationsForClassNone() { + List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( + UnannotatedBaseClass.class, TestAnnotation.class); + Assert.assertEquals(0, annotations.size()); + } + + @Test + public void getAnnotationsForClassOnClass() { + List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( + AnnotatedBaseClass.class, TestAnnotation.class); + Assert.assertEquals(1, annotations.size()); + } + + @Test + public void getAnnotationsForClassOnSuperclass() { + List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( + ExtendsAnnotatedBaseClass.class, TestAnnotation.class); + Assert.assertEquals(1, annotations.size()); + } + + @Test + public void getAnnotationsForMethodNone() throws NoSuchMethodException { + Method testMethod = UnannotatedBaseClass.class.getMethod("unannotatedMethod", + (Class[]) null); + List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( + testMethod, TestAnnotation.class); + Assert.assertEquals(0, annotations.size()); + } + + @Test + public void getAnnotationsForMethodOnMethod() throws NoSuchMethodException { + Method testMethod = UnannotatedBaseClass.class.getMethod("annotatedMethod", + (Class[]) null); + List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( + testMethod, TestAnnotation.class); + Assert.assertEquals(1, annotations.size()); + } + + @Test + public void getAnnotationsForMethodOnClass() throws NoSuchMethodException { + Method testMethod = AnnotatedBaseClass.class.getMethod("unannotatedMethod", + (Class[]) null); + List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( + testMethod, TestAnnotation.class); + Assert.assertEquals(1, annotations.size()); + } + + @Test + public void getAnnotationsForMethodOnSuperclass() throws NoSuchMethodException { + Method testMethod = ExtendsAnnotatedBaseClass.class.getMethod("unannotatedMethod", + (Class[]) null); + List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( + testMethod, TestAnnotation.class); + Assert.assertEquals(1, annotations.size()); + } + + @Test + public void getAnnotationsOverlapping() throws NoSuchMethodException { + Method testMethod = AnnotatedBaseClass.class.getMethod("annotatedMethod", + (Class[]) null); + List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( + testMethod, TestAnnotation.class); + Assert.assertEquals(2, annotations.size()); + } + +}
diff --git a/base/win/scoped_handle.cc b/base/win/scoped_handle.cc index 8739ea7..c429375 100644 --- a/base/win/scoped_handle.cc +++ b/base/win/scoped_handle.cc
@@ -15,6 +15,7 @@ #include "base/logging.h" #include "base/macros.h" #include "base/synchronization/lock_impl.h" +#include "base/threading/thread_local.h" extern "C" { __declspec(dllexport) void* GetHandleVerifier(); @@ -73,7 +74,7 @@ class ActiveVerifier { public: explicit ActiveVerifier(bool enabled) - : enabled_(enabled), closing_(false), lock_(g_lock.Pointer()) { + : enabled_(enabled), lock_(g_lock.Pointer()) { } // Retrieves the current verifier. @@ -97,7 +98,7 @@ base::debug::StackTrace creation_stack_; bool enabled_; - bool closing_; + base::ThreadLocalBoolean closing_; NativeLock* lock_; HandleMap map_; DISALLOW_COPY_AND_ASSIGN(ActiveVerifier); @@ -145,10 +146,9 @@ if (!enabled_) return CloseHandleWrapper(handle); - AutoNativeLock lock(*lock_); - closing_ = true; + closing_.Set(true); CloseHandleWrapper(handle); - closing_ = false; + closing_.Set(false); return true; } @@ -204,10 +204,10 @@ if (!enabled_) return; - AutoNativeLock lock(*lock_); - if (closing_) + if (closing_.Get()) return; + AutoNativeLock lock(*lock_); HandleMap::iterator i = map_.find(handle); if (i == map_.end()) return;
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_bg.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_bg.xtb index edc8d303..066911e 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_bg.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_bg.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bg"> +<translation id="1091157412887719337">Получаването на заданието не бе успешно. Няма налична машина.</translation> +<translation id="2004526128230838685">Получаването на заданието не бе успешно. Неизвестен проблем.</translation> +<translation id="2023631438558435272">Получаването на заданието не бе успешно. Невалиден отговор.</translation> +<translation id="2353984724370197742">Получаването на заданието не бе успешно поради проблем с мрежовата заявка.</translation> +<translation id="3046825211487065480">Получаването на заданието не бе успешно. Изпратена е втора заявка, преди да е постъпил отговор за първата.</translation> <translation id="3407245330823033366">Моля, изберете профил, който да използвате с Blimp.</translation> +<translation id="3775180005489871350">Получаването на заданието не бе успешно. Грешка 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Получаването на заданието не бе успешно. Потребителското означение за достъп е с изтекла валидност.</translation> +<translation id="4562971394107096647">Получаването на заданието не бе успешно. Грешка в сървъра.</translation> <translation id="4641972508298030550">Удостоверяването на потребителя не бе успешно.</translation> +<translation id="5860346505531085166">Получаването на заданието не бе успешно. Профилът няма достъп.</translation> +<translation id="704835510384979817">Получаването на заданието не бе успешно. Няма съответстваща версия на машина.</translation> +<translation id="7961542533680218955">Получаването на заданието бе успешно.</translation> <translation id="8514856595257368555">Означението бе извлечено.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ca.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ca.xtb index f0340c1..63961f8 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ca.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ca.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ca"> +<translation id="1091157412887719337">No s'ha pogut obtenir l'assignació. No hi havia cap motor disponible.</translation> +<translation id="2004526128230838685">No s'ha pogut obtenir l'assignació. S'ha produït un error desconegut.</translation> +<translation id="2023631438558435272">No s'ha pogut obtenir l'assignació. La resposta no era vàlida.</translation> +<translation id="2353984724370197742">No s'ha pogut obtenir l'assignació. S'ha produït un error a la sol·licitud de xarxa.</translation> +<translation id="3046825211487065480">No s'ha pogut obtenir l'assignació. La segona sol·licitud s'ha enviat abans de rebre resposta per a la primera.</translation> <translation id="3407245330823033366">Trieu un compte per utilitzar-lo amb Blimp.</translation> +<translation id="3775180005489871350">No s'ha pogut obtenir l'assignació. Error 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">No s'ha pogut obtenir l'assignació. El testimoni d'accés de l'usuari ha caducat.</translation> +<translation id="4562971394107096647">No s'ha pogut obtenir l'assignació. S'ha produït un error al servidor.</translation> <translation id="4641972508298030550">No es pot autenticar l'usuari.</translation> +<translation id="5860346505531085166">No s'ha pogut obtenir l'assignació. El compte no hi té accés.</translation> +<translation id="704835510384979817">No s'ha pogut obtenir l'assignació. La versió del motor no és correcta.</translation> +<translation id="7961542533680218955">L'assignació s'ha obtingut correctament.</translation> <translation id="8514856595257368555">S'ha recuperat el testimoni.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_cs.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_cs.xtb index c19fa2a..43321724 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_cs.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_cs.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="cs"> +<translation id="1091157412887719337">Přidružení se nezdařilo. Není k dispozici žádný modul.</translation> +<translation id="2004526128230838685">Přidružení se nezdařilo. Neznámý problém.</translation> +<translation id="2023631438558435272">Přidružení se nezdařilo. Neplatná odpověď.</translation> +<translation id="2353984724370197742">Přidružení se nezdařilo. Síťový požadavek se nezdařil.</translation> +<translation id="3046825211487065480">Přidružení se nezdařilo. Druhý požadavek byl odeslán ještě před přijetím odpovědi na první požadavek.</translation> <translation id="3407245330823033366">Vyberte účet, který chcete použít se službou Blimp.</translation> +<translation id="3775180005489871350">Přidružení se nezdařilo. Chyba 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Přidružení se nezdařilo. Platnost přístupového tokenu uživatele vypršela.</translation> +<translation id="4562971394107096647">Přidružení se nezdařilo. Chyba serveru.</translation> <translation id="4641972508298030550">Uživatele nelze ověřit.</translation> +<translation id="5860346505531085166">Přidružení se nezdařilo. Účet nemá přístup.</translation> +<translation id="704835510384979817">Přidružení se nezdařilo. Není k dispozici odpovídající verze modulu.</translation> +<translation id="7961542533680218955">Přidružení bylo úspěšné.</translation> <translation id="8514856595257368555">Token byl načten.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_da.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_da.xtb index a93f8aa2..bbd51ae 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_da.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_da.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="da"> +<translation id="1091157412887719337">Tildelingen mislykkedes. Der var ingen tilgængelig maskine.</translation> +<translation id="2004526128230838685">Tildelingen mislykkedes. Ukendt problem.</translation> +<translation id="2023631438558435272">Tildelingen mislykkedes. Ugyldigt svar.</translation> +<translation id="2353984724370197742">Tildelingen mislykkedes. Netværksanmodningen mislykkedes.</translation> +<translation id="3046825211487065480">Tildelingen mislykkedes. Anden anmodning blev sendt, før første anmodning reagerede.</translation> <translation id="3407245330823033366">Vælg en konto, som du vil bruge med Blimp.</translation> +<translation id="3775180005489871350">Tildelingen mislykkedes. Fejl 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Tildelingen mislykkedes. Udløbet brugeradgangstoken.</translation> +<translation id="4562971394107096647">Tildelingen mislykkedes. Serverfejl.</translation> <translation id="4641972508298030550">Brugeren kunne ikke godkendes.</translation> +<translation id="5860346505531085166">Tildelingen mislykkedes. Kontoen har ikke adgang.</translation> +<translation id="704835510384979817">Tildelingen mislykkedes. Ingen matchende maskinversion.</translation> +<translation id="7961542533680218955">Tildelingen lykkedes.</translation> <translation id="8514856595257368555">Tokenet blev hentet.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_de.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_de.xtb index 93f4bd5..67ce736 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_de.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_de.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="de"> +<translation id="1091157412887719337">Zuweisung fehlgeschlagen. Kein Modul verfügbar.</translation> +<translation id="2004526128230838685">Zuweisung fehlgeschlagen. Unbekanntes Problem.</translation> +<translation id="2023631438558435272">Zuweisung fehlgeschlagen. Ungültige Antwort.</translation> +<translation id="2353984724370197742">Zuweisung fehlgeschlagen. Netzwerkanfrage fehlgeschlagen.</translation> +<translation id="3046825211487065480">Zuweisung fehlgeschlagen. Zweite Anfrage wurde vor Antwort auf erste Anfrage gesendet.</translation> <translation id="3407245330823033366">Bitte wählen Sie ein Konto zur Nutzung mit Blimp aus.</translation> +<translation id="3775180005489871350">Zuweisung fehlgeschlagen. Fehler 400 (FEHLERHAFTE ANFRAGE).</translation> +<translation id="4542350224991263059">Zuweisung fehlgeschlagen. Abgelaufenes Nutzerzugriffs-Token.</translation> +<translation id="4562971394107096647">Zuweisung fehlgeschlagen. Serverfehler.</translation> <translation id="4641972508298030550">Nutzer kann nicht authentifiziert werden.</translation> +<translation id="5860346505531085166">Zuweisung fehlgeschlagen. Konto hat keinen Zugriff.</translation> +<translation id="704835510384979817">Zuweisung fehlgeschlagen. Keine übereinstimmende Modulversion.</translation> +<translation id="7961542533680218955">Zuweisung ist erfolgt.</translation> <translation id="8514856595257368555">Token abgerufen.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_es-419.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_es-419.xtb index e224415..0bac96c 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_es-419.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_es-419.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="es-419"> +<translation id="1091157412887719337">Se produjo un error de asignación. No hay motores disponibles.</translation> +<translation id="2004526128230838685">Se produjo un error de asignación. Hay un problema desconocido.</translation> +<translation id="2023631438558435272">Se produjo un error de asignación. La respuesta no es válida.</translation> +<translation id="2353984724370197742">Se produjo un error de asignación. Se produjo un error en la solicitud de la red.</translation> +<translation id="3046825211487065480">Se produjo un error de asignación. Se envió una segunda solicitud antes de que se respondiera la primera.</translation> <translation id="3407245330823033366">Elige una cuenta para usar con Blimp.</translation> +<translation id="3775180005489871350">Se produjo un error de asignación. Se produjo el error 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Se produjo un error de asignación. Caducó el token de acceso del usuario.</translation> +<translation id="4562971394107096647">Se produjo un error de asignación. Se produjo un error en el servidor.</translation> <translation id="4641972508298030550">No se puede autenticar el usuario.</translation> +<translation id="5860346505531085166">Se produjo un error de asignación. La cuenta no tiene acceso.</translation> +<translation id="704835510384979817">Se produjo un error de asignación. No hay ninguna versión coincidente del motor.</translation> +<translation id="7961542533680218955">La asignación se completó correctamente.</translation> <translation id="8514856595257368555">Se recuperó el token.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_es.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_es.xtb index 619c48b..33dc95e 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_es.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_es.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="es"> +<translation id="1091157412887719337">Ha fallado la asignación. No hay motores disponibles.</translation> +<translation id="2004526128230838685">Ha fallado la asignación. Problema desconocido.</translation> +<translation id="2023631438558435272">Ha fallado la asignación. La respuesta no es válida.</translation> +<translation id="2353984724370197742">Ha fallado la asignación. Error en la solicitud de red.</translation> +<translation id="3046825211487065480">Ha fallado la asignación. Se ha enviado la segunda petición antes de que se respondiera la primera.</translation> <translation id="3407245330823033366">Selecciona una cuenta para utilizar con Blimp.</translation> +<translation id="3775180005489871350">Ha fallado la asignación. Error 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Ha fallado la asignación. Ha caducado el token de acceso del usuario.</translation> +<translation id="4562971394107096647">Ha fallado la asignación. Error del servidor.</translation> <translation id="4641972508298030550">No ha sido posible autenticar el usuario.</translation> +<translation id="5860346505531085166">Ha fallado la asignación. La cuenta no dispone de acceso.</translation> +<translation id="704835510384979817">Ha fallado la asignación. La versión del motor no coincide.</translation> +<translation id="7961542533680218955">Asignación correcta.</translation> <translation id="8514856595257368555">Se ha recuperado el token.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fil.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fil.xtb index 81e7276..a2c79e7 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fil.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fil.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fil"> +<translation id="1091157412887719337">Hindi naitalaga. Walang available na engine.</translation> +<translation id="2004526128230838685">Hindi naitalaga. May hindi matukoy na isyu.</translation> +<translation id="2023631438558435272">Hindi naitalaga. Di-wasto ang tugon.</translation> +<translation id="2353984724370197742">Hindi naitalaga. Hindi naisagawa ang kahilingan sa network.</translation> +<translation id="3046825211487065480">Hindi naitalaga. Nagpadala ng pangalawang kahilingan bago pa natugunan ang unang kahilingan.</translation> <translation id="3407245330823033366">Mangyaring pumili ng account na gagamitin sa Blimp.</translation> +<translation id="3775180005489871350">Hindi naitalaga. 400 (BAD_REQUEST) error.</translation> +<translation id="4542350224991263059">Hindi naitalaga. Nag-expire na ang token ng access ng user.</translation> +<translation id="4562971394107096647">Hindi naitalaga. May error sa server.</translation> <translation id="4641972508298030550">Hindi mapatotohanan ang user.</translation> +<translation id="5860346505531085166">Hindi naitalaga. Walang access ang account.</translation> +<translation id="704835510384979817">Hindi naitalaga. Walang tumutugmang bersyon ng engine.</translation> +<translation id="7961542533680218955">Naging matagumpay ang pagtatalaga.</translation> <translation id="8514856595257368555">Nabawi ang token.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fr.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fr.xtb index 892298d..9bc5c29 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fr.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fr.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr"> +<translation id="1091157412887719337">Échec de l'attribution. Aucun moteur disponible.</translation> +<translation id="2004526128230838685">Échec de l'attribution. Problème inconnu.</translation> +<translation id="2023631438558435272">Échec de l'attribution. Réponse incorrecte.</translation> +<translation id="2353984724370197742">Échec de l'attribution. Échec de la demande réseau.</translation> +<translation id="3046825211487065480">Échec de l'attribution. Deuxième demande envoyée avant la réponse de la première demande.</translation> <translation id="3407245330823033366">Sélectionnez un compte à utiliser avec Blimp.</translation> +<translation id="3775180005489871350">Échec de l'attribution. Erreur 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Échec de l'attribution. Le jeton d'accès utilisateur a expiré.</translation> +<translation id="4562971394107096647">Échec de l'attribution. Erreur du serveur.</translation> <translation id="4641972508298030550">Impossible d'authentifier l'utilisateur.</translation> +<translation id="5860346505531085166">Échec de l'attribution. Le compte ne dispose pas de l'accès.</translation> +<translation id="704835510384979817">Échec de l'attribution. Aucune version de moteur correspondante.</translation> +<translation id="7961542533680218955">L'attribution a bien été effectuée.</translation> <translation id="8514856595257368555">Le jeton a bien été récupéré.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hi.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hi.xtb index b7b99b80..56fc646 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hi.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hi.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hi"> +<translation id="1091157412887719337">असाइनमेंट विफल रहा. कोई इंजन उपलब्ध नहीं.</translation> +<translation id="2004526128230838685">असाइनमेंट विफल रहा. अज्ञात समस्या.</translation> +<translation id="2023631438558435272">असाइनमेंट विफल रहा. अमान्य प्रतिसाद.</translation> +<translation id="2353984724370197742">असाइनमेंट विफल रहा. नेटवर्क अनुरोध विफल रहा.</translation> +<translation id="3046825211487065480">असाइनमेंट विफल रहा. पहले अनुरोध की प्रतिक्रिया से पूर्व दूसरा अनुरोध भेजा गया.</translation> <translation id="3407245330823033366">कृपया Blimp के साथ उपयोग करने के लिए एक खाता चुनें.</translation> +<translation id="3775180005489871350">असाइनमेंट विफल रहा. 400 (BAD_REQUEST) त्रुटि.</translation> +<translation id="4542350224991263059">असाइनमेंट विफल रहा. उपयोगकर्ता एक्सेस टोकन की समय सीमा समाप्त.</translation> +<translation id="4562971394107096647">असाइनमेंट विफल रहा. सर्वर त्रुटि.</translation> <translation id="4641972508298030550">उपयोगकर्ता को प्रमाणित करने में असमर्थ.</translation> +<translation id="5860346505531085166">असाइनमेंट विफल रहा. खाते के पास एक्सेस नहीं है.</translation> +<translation id="704835510384979817">असाइनमेंट विफल रहा. मिलान वाला कोई इंजन वर्शन नहीं है.</translation> +<translation id="7961542533680218955">असाइनमेंट सफल रहा.</translation> <translation id="8514856595257368555">टोकन प्राप्त हुआ.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hu.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hu.xtb index fd917a2..b03e80b 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hu.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hu.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hu"> +<translation id="1091157412887719337">A hozzárendelés nem sikerült. Nem áll rendelkezésre motor.</translation> +<translation id="2004526128230838685">A hozzárendelés nem sikerült. Ismeretlen hiba történt.</translation> +<translation id="2023631438558435272">A hozzárendelés nem sikerült. Érvénytelen válasz.</translation> +<translation id="2353984724370197742">A hozzárendelés nem sikerült. Sikertelen hálózati kérés.</translation> +<translation id="3046825211487065480">A hozzárendelés nem sikerült. Második kérést küldtek az első kérés megválaszolása előtt.</translation> <translation id="3407245330823033366">Válassza ki a Blimp alkalmazással használni kívánt fiókot.</translation> +<translation id="3775180005489871350">A hozzárendelés nem sikerült. 400-as (BAD_REQUEST) hiba.</translation> +<translation id="4542350224991263059">A hozzárendelés nem sikerült. Lejárt a felhasználói hozzáférés tokenje.</translation> +<translation id="4562971394107096647">A hozzárendelés nem sikerült. Szerverhiba.</translation> <translation id="4641972508298030550">Nem lehet hitelesíteni a felhasználót.</translation> +<translation id="5860346505531085166">A hozzárendelés nem sikerült. A fióknak nincs hozzáférése.</translation> +<translation id="704835510384979817">A hozzárendelés nem sikerült. Nincs egyező motorverzió.</translation> +<translation id="7961542533680218955">A hozzárendelés sikerült.</translation> <translation id="8514856595257368555">Token lekérve.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_it.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_it.xtb index 76b0504..d868118 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_it.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_it.xtb
@@ -5,13 +5,13 @@ <translation id="2004526128230838685">Assegnazione non riuscita. Problema sconosciuto.</translation> <translation id="2023631438558435272">Assegnazione non riuscita. Risposta non valida.</translation> <translation id="2353984724370197742">Assegnazione non riuscita. Richiesta di rete non riuscita.</translation> -<translation id="3046825211487065480">Assegnazione non riuscita. Seconda richiesta inviata prima della risposta della prima richiesta.</translation> +<translation id="3046825211487065480">Assegnazione non riuscita. Seconda richiesta inviata prima che la precedente sia stata ricevuta.</translation> <translation id="3407245330823033366">Seleziona un account da utilizzare con Blimp.</translation> <translation id="3775180005489871350">Assegnazione non riuscita. Errore 400 (BAD_REQUEST).</translation> <translation id="4542350224991263059">Assegnazione non riuscita. Token di accesso dell'utente scaduto.</translation> <translation id="4562971394107096647">Assegnazione non riuscita. Errore del server.</translation> <translation id="4641972508298030550">Impossibile eseguire l'autenticazione dell'utente.</translation> -<translation id="5860346505531085166">Assegnazione non riuscita. L'account non è autorizzato ad accedere.</translation> +<translation id="5860346505531085166">Assegnazione non riuscita. All'account non è consentito l'accesso.</translation> <translation id="704835510384979817">Assegnazione non riuscita. Nessuna versione del motore corrispondente.</translation> <translation id="7961542533680218955">Assegnazione riuscita.</translation> <translation id="8514856595257368555">Token recuperato.</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_iw.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_iw.xtb index 44e6c3f7..f8619c5 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_iw.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_iw.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="iw"> +<translation id="1091157412887719337">ההקצאה נכשלה. אין מנוע זמין.</translation> +<translation id="2004526128230838685">ההקצאה נכשלה. בעיה לא ידועה.</translation> +<translation id="2023631438558435272">ההקצאה נכשלה. תגובה לא חוקית.</translation> +<translation id="2353984724370197742">ההקצאה נכשלה. בקשת הרשת נכשלה.</translation> +<translation id="3046825211487065480">ההקצאה נכשלה. הבקשה השנייה נשלחה לפני התגובה לבקשה הראשונה.</translation> <translation id="3407245330823033366">בחר חשבון לשימוש עם Blimp.</translation> +<translation id="3775180005489871350">ההקצאה נכשלה. שגיאה 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">ההקצאה נכשלה. פג תוקף אסימון הגישה של המשתמש.</translation> +<translation id="4562971394107096647">ההקצאה נכשלה. שגיאת שרת.</translation> <translation id="4641972508298030550">לא ניתן לאמת את המשתמש.</translation> +<translation id="5860346505531085166">ההקצאה נכשלה. אין לחשבון הרשאת גישה.</translation> +<translation id="704835510384979817">ההקצאה נכשלה. לא נמצאה גירסת מנוע תואמת.</translation> +<translation id="7961542533680218955">ההקצאה הצליחה.</translation> <translation id="8514856595257368555">האסימון אוחזר.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ja.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ja.xtb index 3133627c..18178eb 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ja.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ja.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ja"> +<translation id="1091157412887719337">割り当てが失敗しました。利用できるエンジンがありません。</translation> +<translation id="2004526128230838685">割り当てが失敗しました。不明なエラーが発生しました。</translation> +<translation id="2023631438558435272">割り当てが失敗しました。無効な応答が返されました。</translation> +<translation id="2353984724370197742">割り当てが失敗しました。ネットワーク リクエストが失敗しました。</translation> +<translation id="3046825211487065480">割り当てが失敗しました。最初のリクエストの応答がある前に、2 番目のリクエストが送信されました。</translation> <translation id="3407245330823033366">Blimp で使用するアカウントを選択してください。</translation> +<translation id="3775180005489871350">割り当てが失敗しました。400(BAD_REQUEST)エラーが発生しました。</translation> +<translation id="4542350224991263059">割り当てが失敗しました。ユーザー アクセス トークンが期限切れです。</translation> +<translation id="4562971394107096647">割り当てが失敗しました。サーバーエラーが発生しました。</translation> <translation id="4641972508298030550">ユーザーを認証できません。</translation> +<translation id="5860346505531085166">割り当てが失敗しました。アカウントにアクセス権がありません。</translation> +<translation id="704835510384979817">割り当てが失敗しました。一致するエンジン バージョンがありません。</translation> +<translation id="7961542533680218955">割り当てが成功しました。</translation> <translation id="8514856595257368555">トークンを取得しました。</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ko.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ko.xtb index 9f5f478..dec5bc8 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ko.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ko.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> +<translation id="1091157412887719337">할당하지 못했습니다. 사용 가능한 엔진이 없습니다.</translation> +<translation id="2004526128230838685">할당하지 못했습니다. 알 수 없는 문제가 발생했습니다.</translation> +<translation id="2023631438558435272">할당하지 못했습니다. 응답이 잘못되었습니다.</translation> +<translation id="2353984724370197742">할당하지 못했습니다. 네트워크 요청에 실패했습니다.</translation> +<translation id="3046825211487065480">할당하지 못했습니다. 첫 번째 요청이 응답되기 전에 두 번째 요청이 전송되었습니다.</translation> <translation id="3407245330823033366">Blimp에서 사용할 계정을 선택하세요.</translation> +<translation id="3775180005489871350">할당하지 못했습니다. 400(BAD_REQUEST) 오류가 발생했습니다.</translation> +<translation id="4542350224991263059">할당하지 못했습니다. 사용자 액세스 토큰이 만료되었습니다.</translation> +<translation id="4562971394107096647">할당하지 못했습니다. 서버 오류가 발생했습니다.</translation> <translation id="4641972508298030550">사용자를 인증할 수 없습니다.</translation> +<translation id="5860346505531085166">할당하지 못했습니다. 계정에 액세스 권한이 없습니다.</translation> +<translation id="704835510384979817">할당하지 못했습니다. 일치하는 엔진 버전이 없습니다.</translation> +<translation id="7961542533680218955">할당이 완료되었습니다.</translation> <translation id="8514856595257368555">토큰을 가져왔습니다.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_lt.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_lt.xtb index f8ad3045..0d953111 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_lt.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_lt.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="1091157412887719337">Priskirti nepavyko. Nėra jokių pasiekiamų variklių.</translation> +<translation id="2004526128230838685">Priskirti nepavyko. Nežinoma problema.</translation> +<translation id="2023631438558435272">Priskirti nepavyko. Netinkamas atsakas.</translation> +<translation id="2353984724370197742">Priskirti nepavyko. Nepavyko tinklo užklausa.</translation> +<translation id="3046825211487065480">Priskirti nepavyko. Antra užklausa išsiųsta prieš pateikiant atsaką į pirmą užklausą.</translation> <translation id="3407245330823033366">Pasirinkite paskyrą, kurią norite naudoti su „Blimp“.</translation> +<translation id="3775180005489871350">Priskirti nepavyko. 400 (BAD_REQUEST) klaida.</translation> +<translation id="4542350224991263059">Priskirti nepavyko. Baigėsi naudotojo prieigos kodo galiojimo laikas.</translation> +<translation id="4562971394107096647">Priskirti nepavyko. Serverio klaida.</translation> <translation id="4641972508298030550">Nepavyko autentifikuoti naudotojo.</translation> +<translation id="5860346505531085166">Priskirti nepavyko. Naudojant paskyrą negalima pasiekti duomenų.</translation> +<translation id="704835510384979817">Priskirti nepavyko. Nėra atitinkamos versijos variklio.</translation> +<translation id="7961542533680218955">Priskirti pavyko.</translation> <translation id="8514856595257368555">Prieigos raktas gautas.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_lv.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_lv.xtb index e9d5d9a6..4f449ed 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_lv.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_lv.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lv"> +<translation id="1091157412887719337">Piešķires kļūme. Nav pieejamas programmas.</translation> +<translation id="2004526128230838685">Piešķires kļūme. Nezināma problēma.</translation> +<translation id="2023631438558435272">Piešķires kļūme. Nederīga atbilde.</translation> +<translation id="2353984724370197742">Piešķires kļūme. Tīkla pieprasījuma kļūme.</translation> +<translation id="3046825211487065480">Piešķires kļūme. Otrs pieprasījums nosūtīts, pirms tika saņemta atbilde uz pirmo pieprasījumu.</translation> <translation id="3407245330823033366">Lūdzu, izvēlieties kontu, kurš tiks izmantots ar Blimp.</translation> +<translation id="3775180005489871350">Piešķires kļūme. 400. kļūda (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Piešķires kļūme. Lietotāja piekļuves pilnvaras derīgums ir beidzies.</translation> +<translation id="4562971394107096647">Piešķires kļūme. Servera kļūda.</translation> <translation id="4641972508298030550">Nevarēja autentificēt lietotāju.</translation> +<translation id="5860346505531085166">Piešķires kļūme. Kontam nav piekļuves.</translation> +<translation id="704835510384979817">Piešķires kļūme. Nav atbilstošas programmas versijas.</translation> +<translation id="7961542533680218955">Piešķire bija veiksmīga.</translation> <translation id="8514856595257368555">Pilnvara ir iegūta.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_no.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_no.xtb index cf9de4f..4324d03b 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_no.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_no.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="no"> +<translation id="1091157412887719337">Oppgaven kunne ikke utføres. Ingen motorer var tilgjengelige.</translation> +<translation id="2004526128230838685">Oppgaven kunne ikke utføres. Ukjent problem.</translation> +<translation id="2023631438558435272">Oppgaven kunne ikke utføres. Ugyldig svar.</translation> +<translation id="2353984724370197742">Oppgaven kunne ikke utføres. Nettverksforespørselen mislyktes.</translation> +<translation id="3046825211487065480">Oppgaven kunne ikke utføres. Den andre forespørselen ble sendt før den første forespørselen svarte.</translation> <translation id="3407245330823033366">Velg en konto du vil bruke med Blimp.</translation> +<translation id="3775180005489871350">Oppgaven kunne ikke utføres. 400-feil (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Oppgaven kunne ikke utføres. Brukerens tilgangstoken er utløpt..</translation> +<translation id="4562971394107096647">Oppgaven kunne ikke utføres. Tjenerfeil.</translation> <translation id="4641972508298030550">Kan ikke autentisere brukeren.</translation> +<translation id="5860346505531085166">Oppgaven kunne ikke utføres. Kontoen har ikke tilgang.</translation> +<translation id="704835510384979817">Oppgaven kunne ikke utføres. Ingen samsvarende motorversjon.</translation> +<translation id="7961542533680218955">Oppgaven ble utført.</translation> <translation id="8514856595257368555">Tokenet er hentet.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_pl.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_pl.xtb index f25f1e05..de18bd23 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_pl.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_pl.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pl"> +<translation id="1091157412887719337">Przypisanie się nie udało. Nie jest dostępna żadna wyszukiwarka.</translation> +<translation id="2004526128230838685">Przypisanie się nie udało. Nieznany problem.</translation> +<translation id="2023631438558435272">Przypisanie się nie udało. Nieprawidłowa odpowiedź.</translation> +<translation id="2353984724370197742">Przypisanie się nie udało. Błąd żądania sieciowego.</translation> +<translation id="3046825211487065480">Przypisanie się nie udało. Drugie żądanie zostało wysłane przed otrzymaniem odpowiedzi na pierwsze.</translation> <translation id="3407245330823033366">Wybierz konto, którego chcesz używać w aplikacji Blimp.</translation> +<translation id="3775180005489871350">Przypisanie się nie udało. Błąd 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Przypisanie się nie udało. Token dostępu użytkownika wygasł.</translation> +<translation id="4562971394107096647">Przypisanie się nie udało. Błąd serwera.</translation> <translation id="4641972508298030550">Nie można uwierzytelnić użytkownika.</translation> +<translation id="5860346505531085166">Przypisanie się nie udało. Konto nie ma dostępu.</translation> +<translation id="704835510384979817">Przypisanie się nie udało. Brak pasującej wersji przeglądarki.</translation> +<translation id="7961542533680218955">Przypisano.</translation> <translation id="8514856595257368555">Token został pobrany.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ro.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ro.xtb index de1a585e..8205ecf 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ro.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ro.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ro"> +<translation id="1091157412887719337">Atribuirea nu a reușit. Niciun motor disponibil.</translation> +<translation id="2004526128230838685">Atribuirea nu a reușit. Problemă necunoscută.</translation> +<translation id="2023631438558435272">Atribuirea nu a reușit. Răspuns nevalid.</translation> +<translation id="2353984724370197742">Atribuirea nu a reușit. Solicitarea din rețea nu a reușit.</translation> +<translation id="3046825211487065480">Atribuirea nu a reușit. A fost trimisă o a doua solicitare înainte ca prima solicitare să primească răspuns.</translation> <translation id="3407245330823033366">Alege un cont de folosit cu Blimp.</translation> +<translation id="3775180005489871350">Atribuirea nu a reușit. Eroarea 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Atribuirea nu a reușit. Indicativul de acces al utilizatorului a expirat.</translation> +<translation id="4562971394107096647">Atribuirea nu a reușit. Eroare de server.</translation> <translation id="4641972508298030550">Utilizatorul nu poate fi autentificat.</translation> +<translation id="5860346505531085166">Atribuirea nu a reușit. Contul nu are acces.</translation> +<translation id="704835510384979817">Atribuirea nu a reușit. Nicio versiune a motorului potrivită.</translation> +<translation id="7961542533680218955">Atribuirea a reușit.</translation> <translation id="8514856595257368555">Indicativul a fost preluat.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ru.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ru.xtb index 5c4627e..42cfebb 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ru.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ru.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ru"> +<translation id="1091157412887719337">Ошибка. Поисковая система недоступна.</translation> +<translation id="2004526128230838685">Неизвестная ошибка.</translation> +<translation id="2023631438558435272">Ошибка. Недействительный ответ.</translation> +<translation id="2353984724370197742">Ошибка. Не удалось обработать запрос.</translation> +<translation id="3046825211487065480">Ошибка. Второй запрос был отправлен раньше, чем пришел ответ на первый.</translation> <translation id="3407245330823033366">Выберите аккаунт для входа в Blimp.</translation> +<translation id="3775180005489871350">Ошибка 400: неверный запрос.</translation> +<translation id="4542350224991263059">Ошибка. Срок действия токена доступа истек.</translation> +<translation id="4562971394107096647">Ошибка сервера.</translation> <translation id="4641972508298030550">Не удалось идентифицировать пользователя.</translation> +<translation id="5860346505531085166">Ошибка. У аккаунта нет права доступа.</translation> +<translation id="704835510384979817">Ошибка. Совместимая версия поисковой системы отсутствует.</translation> +<translation id="7961542533680218955">Готово.</translation> <translation id="8514856595257368555">Токен получен.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sl.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sl.xtb index 0ba422b7..58e39b14 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sl.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sl.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sl"> +<translation id="1091157412887719337">Dodelitev ni uspela. Na voljo ni iskalnika.</translation> +<translation id="2004526128230838685">Dodelitev ni uspela. Neznana težava.</translation> +<translation id="2023631438558435272">Dodelitev ni uspela. Neveljaven odgovor.</translation> +<translation id="2353984724370197742">Dodelitev ni uspela. Omrežna zahteva ni uspela.</translation> +<translation id="3046825211487065480">Dodelitev ni uspela. Pred odgovorom na prvo zahtevo je bila poslana druga zahteva.</translation> <translation id="3407245330823033366">Izberite račun, ki ga želite uporabljati s storitvijo Blimp.</translation> +<translation id="3775180005489871350">Dodelitev ni uspela. Napaka 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Dodelitev ni uspela. Potekel žeton za uporabniški dostop.</translation> +<translation id="4562971394107096647">Dodelitev ni uspela. Napaka strežnika.</translation> <translation id="4641972508298030550">Pristnosti uporabnika ni mogoče preveriti.</translation> +<translation id="5860346505531085166">Dodelitev ni uspela. Račun nima dostopa.</translation> +<translation id="704835510384979817">Dodelitev ni uspela. Ni ujemajoče se različice iskalnika.</translation> +<translation id="7961542533680218955">Dodelitev je uspela.</translation> <translation id="8514856595257368555">Žeton pridobljen.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sr.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sr.xtb index 9755c13..82d29c2c 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sr.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sr.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sr"> +<translation id="1091157412887719337">Пренос права није успео. Нема доступног механизма.</translation> +<translation id="2004526128230838685">Пренос права није успео. Дошло је до непознатог проблема.</translation> +<translation id="2023631438558435272">Пренос права није успео. Неважећи одговор.</translation> +<translation id="2353984724370197742">Пренос права није успео. Захтев мреже није успео.</translation> +<translation id="3046825211487065480">Пренос права није успео. Други захтев је послат пре одговора на први захтев.</translation> <translation id="3407245330823033366">Изаберите налог који ћете користити са Blimp-ом.</translation> +<translation id="3775180005489871350">Пренос права није успео. Грешка 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Пренос права није успео. Ознака приступа за корисника је истекла.</translation> +<translation id="4562971394107096647">Пренос права није успео. Грешка на серверу.</translation> <translation id="4641972508298030550">Потврда аутентичности корисника није успела.</translation> +<translation id="5860346505531085166">Пренос права није успео. Налог нема приступ.</translation> +<translation id="704835510384979817">Пренос права није успео. Нема одговарајуће верзије механизма.</translation> +<translation id="7961542533680218955">Пренос права је успео.</translation> <translation id="8514856595257368555">Токен је преузет.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sv.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sv.xtb index 85d1bbd4..fc21160c 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sv.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sv.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sv"> +<translation id="1091157412887719337">Tilldelningen misslyckades. Det finns ingen tillgänglig motor.</translation> +<translation id="2004526128230838685">Tilldelningen misslyckades. Okänt problem.</translation> +<translation id="2023631438558435272">Tilldelningen misslyckades. Ogiltigt svar.</translation> +<translation id="2353984724370197742">Tilldelningen misslyckades. Nätverksbegäran misslyckades.</translation> +<translation id="3046825211487065480">Tilldelningen misslyckades. Den andra begäran skickades innan den första begäran hade besvarats.</translation> <translation id="3407245330823033366">Välj ett konto som du vill använda med Blimp.</translation> +<translation id="3775180005489871350">Tilldelningen misslyckades. Fel 400 (FELAKTIG BEGÄRAN).</translation> +<translation id="4542350224991263059">Tilldelningen misslyckades. Åtkomsttoken för användare har upphört.</translation> +<translation id="4562971394107096647">Tilldelningen misslyckades. Serverfel.</translation> <translation id="4641972508298030550">Användaren kunde inte autentiseras.</translation> +<translation id="5860346505531085166">Tilldelningen misslyckades. Kontot har ingen åtkomst.</translation> +<translation id="704835510384979817">Tilldelningen misslyckades. Det finns ingen matchande motorversion.</translation> +<translation id="7961542533680218955">Tilldelningen lyckades.</translation> <translation id="8514856595257368555">Token har hämtats.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_th.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_th.xtb index 8b1219e..a2e201e 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_th.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_th.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="th"> +<translation id="1091157412887719337">การมอบหมายล้มเหลว ไม่มีเครื่องที่พร้อมใช้งาน</translation> +<translation id="2004526128230838685">การมอบหมายล้มเหลว ไม่ทราบปัญหา</translation> +<translation id="2023631438558435272">การมอบหมายล้มเหลว การตอบกลับไม่ถูกต้อง</translation> +<translation id="2353984724370197742">การมอบหมายล้มเหลว คำขอเครือข่ายล้มเหลว</translation> +<translation id="3046825211487065480">การมอบหมายล้มเหลว คำขอที่ 2 ถูกส่งออกไปก่อนที่จะมีการตอบกลับคำขอแรก</translation> <translation id="3407245330823033366">โปรดเลือกบัญชีที่จะใช้กับ Blimp</translation> +<translation id="3775180005489871350">การมอบหมายล้มเหลว ข้อผิดพลาด 400 (BAD_REQUEST)</translation> +<translation id="4542350224991263059">การมอบหมายล้มเหลว โทเค็นเพื่อการเข้าถึงของผู้ใช้หมดอายุ</translation> +<translation id="4562971394107096647">การมอบหมายล้มเหลว ข้อผิดพลาดของเซิร์ฟเวอร์</translation> <translation id="4641972508298030550">ไม่สามารถตรวจสอบสิทธิ์ผู้ใช้</translation> +<translation id="5860346505531085166">การมอบหมายล้มเหลว บัญชีไม่มีสิทธิ์เข้าถึง</translation> +<translation id="704835510384979817">การมอบหมายล้มเหลว เวอร์ชันของเครื่องไม่ตรงกัน</translation> +<translation id="7961542533680218955">การมอบหมายสำเร็จ</translation> <translation id="8514856595257368555">ดึงข้อมูลโทเค็นแล้ว</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_tr.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_tr.xtb index 32bd65d..9de45cec8 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_tr.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_tr.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="tr"> +<translation id="1091157412887719337">Atama başarısız oldu. Kullanılabilir motor yok.</translation> +<translation id="2004526128230838685">Atama başarısız oldu. Bilinmeyen sorun.</translation> +<translation id="2023631438558435272">Atama başarısız oldu. Geçersiz yanıt.</translation> +<translation id="2353984724370197742">Atama başarısız oldu. Ağ isteği başarısız oldu.</translation> +<translation id="3046825211487065480">Atama başarısız oldu. Birinci isteğe yanıt verilmeden ikinci istek gönderildi.</translation> <translation id="3407245330823033366">Lütfen Blimp ile kullanılacak bir hesap seçin.</translation> +<translation id="3775180005489871350">Atama başarısız oldu. 400 (BAD_REQUEST) hatası.</translation> +<translation id="4542350224991263059">Atama başarısız oldu. Kullanıcı erişim kodunun süresi doldu.</translation> +<translation id="4562971394107096647">Atama başarısız oldu. Sunucu hatası.</translation> <translation id="4641972508298030550">Kullanıcının kimliği doğrulanamıyor.</translation> +<translation id="5860346505531085166">Atama başarısız oldu. Hesabın erişimi yok.</translation> +<translation id="704835510384979817">Atama başarısız oldu. Eşleşen motor sürümü yok.</translation> +<translation id="7961542533680218955">Atama başarılı oldu.</translation> <translation id="8514856595257368555">Jeton alındı.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_uk.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_uk.xtb index 8caed8e..74c6bae7 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_uk.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_uk.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="uk"> +<translation id="1091157412887719337">Не вдалось отримати завдання. Немає доступних ресурсів.</translation> +<translation id="2004526128230838685">Не вдалось отримати завдання. Невідома проблема.</translation> +<translation id="2023631438558435272">Не вдалось отримати завдання. Недійсна відповідь.</translation> +<translation id="2353984724370197742">Не вдалось отримати завдання. Помилка мережі.</translation> +<translation id="3046825211487065480">Не вдалось отримати завдання. Другий запит надіслано до того, як надійшла відповідь на перший.</translation> <translation id="3407245330823033366">Виберіть обліковий запис для Blimp.</translation> +<translation id="3775180005489871350">Не вдалось отримати завдання. Помилка 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Не вдалось отримати завдання. Маркер доступу вже не діє.</translation> +<translation id="4562971394107096647">Не вдалось отримати завдання. Помилка сервера.</translation> <translation id="4641972508298030550">Не вдається підтвердити облікові дані користувача.</translation> +<translation id="5860346505531085166">Не вдалось отримати завдання. Обліковий запис не має доступу.</translation> +<translation id="704835510384979817">Не вдалось отримати завдання. Немає відповідної версії ресурсу.</translation> +<translation id="7961542533680218955">Завдання отримано.</translation> <translation id="8514856595257368555">Маркер отримано.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_vi.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_vi.xtb index 4e9232b9..c8aa03d4 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_vi.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_vi.xtb
@@ -1,18 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="vi"> -<translation id="1091157412887719337">Phân công không thành công. Không có công cụ.</translation> -<translation id="2004526128230838685">Phân công không thành công. Sự cố không xác định.</translation> -<translation id="2023631438558435272">Phân công không thành công. Phản hồi không hợp lệ.</translation> -<translation id="2353984724370197742">Phân công không thành công. Yêu cầu mạng không thành công.</translation> -<translation id="3046825211487065480">Phân công không thành công. Yêu cầu thứ hai đã được gửi trước khi yêu cầu thứ nhất được phản hồi.</translation> +<translation id="1091157412887719337">Gán không thành công. Không có công cụ.</translation> +<translation id="2004526128230838685">Gán không thành công. Sự cố không xác định.</translation> +<translation id="2023631438558435272">Gán không thành công. Phản hồi không hợp lệ.</translation> +<translation id="2353984724370197742">Gán không thành công. Yêu cầu mạng không thành công.</translation> +<translation id="3046825211487065480">Gán không thành công. Yêu cầu thứ hai đã được gửi trước khi yêu cầu thứ nhất được phản hồi.</translation> <translation id="3407245330823033366">Vui lòng chọn tài khoản để sử dụng với Blimp.</translation> -<translation id="3775180005489871350">Phân công không thành công. Lỗi 400 (BAD_REQUEST).</translation> -<translation id="4542350224991263059">Phân công không thành công. Mã truy cập người dùng đã hết hạn.</translation> -<translation id="4562971394107096647">Phân công không thành công. Lỗi máy chủ.</translation> +<translation id="3775180005489871350">Gán không thành công. Lỗi 400 (BAD_REQUEST).</translation> +<translation id="4542350224991263059">Gán không thành công. Mã truy cập người dùng đã hết hạn.</translation> +<translation id="4562971394107096647">Gán không thành công. Lỗi máy chủ.</translation> <translation id="4641972508298030550">Không thể xác thực được người dùng.</translation> -<translation id="5860346505531085166">Phân công không thành công. Tài khoản không có quyền truy cập.</translation> -<translation id="704835510384979817">Phân công không thành công. Không có phiên bản công cụ phù hợp.</translation> -<translation id="7961542533680218955">Đã phân công thành công.</translation> +<translation id="5860346505531085166">Gán không thành công. Tài khoản không có quyền truy cập.</translation> +<translation id="704835510384979817">Gán không thành công. Không có phiên bản công cụ phù hợp.</translation> +<translation id="7961542533680218955">Đã gán thành công.</translation> <translation id="8514856595257368555">Đã truy xuất mã thông báo.</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-CN.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-CN.xtb index 8c1ee1b..d689c5a 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-CN.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-CN.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> +<translation id="1091157412887719337">无法获取任务,因为没有可用的引擎。</translation> +<translation id="2004526128230838685">无法获取任务,因为出现了未知问题。</translation> +<translation id="2023631438558435272">无法获取任务,因为响应无效。</translation> +<translation id="2353984724370197742">无法获取任务,因为网络请求失败。</translation> +<translation id="3046825211487065480">无法获取任务,因为您在系统响应第一个请求之前就发送了第二个请求。</translation> <translation id="3407245330823033366">请选择一个要使用 Blimp 的帐户。</translation> +<translation id="3775180005489871350">无法获取任务,因为出现了 400 (BAD_REQUEST) 错误。</translation> +<translation id="4542350224991263059">无法获取任务,因为用户访问令牌已过期。</translation> +<translation id="4562971394107096647">无法获取任务,因为出现了服务器错误。</translation> <translation id="4641972508298030550">无法对用户进行身份验证。</translation> +<translation id="5860346505531085166">无法获取任务,因为相关帐户无访问权限。</translation> +<translation id="704835510384979817">无法获取任务,因为没有相符的引擎版本。</translation> +<translation id="7961542533680218955">已成功获取任务。</translation> <translation id="8514856595257368555">已检索到令牌。</translation> </translationbundle> \ No newline at end of file
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-TW.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-TW.xtb index aed55b4..466bd5a9 100644 --- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-TW.xtb +++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-TW.xtb
@@ -1,7 +1,18 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-TW"> +<translation id="1091157412887719337">指派失敗。沒有可用的引擎。</translation> +<translation id="2004526128230838685">指派失敗。發生不明問題。</translation> +<translation id="2023631438558435272">指派失敗。回應無效。</translation> +<translation id="2353984724370197742">指派失敗。網路要求失敗。</translation> +<translation id="3046825211487065480">指派失敗。第一個要求尚未回應即送出第二個要求。</translation> <translation id="3407245330823033366">請選取要用於存取 Blimp 的帳戶。</translation> +<translation id="3775180005489871350">指派失敗。錯誤 400 (BAD_REQUEST)。</translation> +<translation id="4542350224991263059">指派失敗。使用者存取憑證已過期。</translation> +<translation id="4562971394107096647">指派失敗。伺服器錯誤。</translation> <translation id="4641972508298030550">無法驗證使用者。</translation> +<translation id="5860346505531085166">指派失敗。帳戶沒有存取權。</translation> +<translation id="704835510384979817">指派失敗。沒有相符的引擎版本。</translation> +<translation id="7961542533680218955">指派成功。</translation> <translation id="8514856595257368555">已擷取憑證。</translation> </translationbundle> \ No newline at end of file
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index f5e70018..f998edba 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn
@@ -78,6 +78,7 @@ group("devil_py") { data = [ + "devil_chromium.json", "devil_chromium.py", "//third_party/catapult/catapult_base/", "//third_party/catapult/dependency_manager/",
diff --git a/build/android/PRESUBMIT.py b/build/android/PRESUBMIT.py index 8cfe59c..b0e38e80 100644 --- a/build/android/PRESUBMIT.py +++ b/build/android/PRESUBMIT.py
@@ -27,9 +27,13 @@ input_api, output_api, pylintrc='pylintrc', - # devil and symbols have their own PRESUBMIT.py - black_list=build_pys + [r'devil/.*\.py$', r'pylib/symbols/.*\.py$'], - extra_paths_list=[J(), J('buildbot')])) + # symbols has their own PRESUBMIT.py + black_list=build_pys + [r'pylib/symbols/.*\.py$'], + extra_paths_list=[ + J(), + J('buildbot'), + J('..', '..', 'third_party', 'catapult', 'devil') + ])) output.extend(input_api.canned_checks.RunPylint( input_api, output_api,
diff --git a/build/android/devil/OWNERS b/build/android/devil/OWNERS deleted file mode 100644 index fd584fc..0000000 --- a/build/android/devil/OWNERS +++ /dev/null
@@ -1,4 +0,0 @@ -jbudorick@chromium.org -mikecase@chromium.org -perezju@chromium.org -rnephew@chromium.org
diff --git a/build/android/devil/PRESUBMIT.py b/build/android/devil/PRESUBMIT.py deleted file mode 100644 index 5684d261..0000000 --- a/build/android/devil/PRESUBMIT.py +++ /dev/null
@@ -1,107 +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. - -"""Presubmit script for devil. - -See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for -details on the presubmit API built into depot_tools. -""" - - -def _RunPylint(input_api, output_api): - return input_api.canned_checks.RunPylint( - input_api, - output_api, - pylintrc='pylintrc', - extra_paths_list=[ - input_api.os_path.join(input_api.PresubmitLocalPath(), '..'), - ]) - - -def _RunUnitTests(input_api, output_api): - def J(*dirs): - """Returns a path relative to presubmit directory.""" - return input_api.os_path.join(input_api.PresubmitLocalPath(), *dirs) - - test_env = dict(input_api.environ) - test_env.update({ - 'PYTHONDONTWRITEBYTECODE': '1', - 'PYTHONPATH': ':'.join([J(), J('..')]), - }) - - return input_api.canned_checks.RunUnitTests( - input_api, - output_api, - unit_tests=[ - J('devil_env_test.py'), - J('android', 'battery_utils_test.py'), - J('android', 'device_utils_test.py'), - J('android', 'fastboot_utils_test.py'), - J('android', 'md5sum_test.py'), - J('android', 'logcat_monitor_test.py'), - J('android', 'tools', 'script_common_test.py'), - J('utils', 'cmd_helper_test.py'), - J('utils', 'timeout_retry_unittest.py'), - ], - env=test_env) - - -def _EnsureNoPylibUse(input_api, output_api): - def other_python_files(f): - this_presubmit_file = input_api.os_path.join( - input_api.PresubmitLocalPath(), 'PRESUBMIT.py') - return (f.LocalPath().endswith('.py') - and not f.AbsoluteLocalPath() == this_presubmit_file) - - changed_files = input_api.AffectedSourceFiles(other_python_files) - import_error_re = input_api.re.compile( - r'(from pylib.* import)|(import pylib)') - - errors = [] - for f in changed_files: - errors.extend( - '%s:%d' % (f.LocalPath(), line_number) - for line_number, line_text in f.ChangedContents() - if import_error_re.search(line_text)) - - if errors: - return [output_api.PresubmitError( - 'pylib modules should not be imported from devil modules.', - items=errors)] - return [] - - -def _CatapultMoveWarning(input_api, output_api): - # TODO(jbudorick): Remove this after the move is complete. - - def other_files(f): - this_presubmit_file = input_api.os_path.join( - input_api.PresubmitLocalPath(), 'PRESUBMIT.py') - return not f.AbsoluteLocalPath() == this_presubmit_file - - changed_files = input_api.AffectedSourceFiles(other_files) - if changed_files: - return [output_api.PresubmitNotifyResult( - 'devil/ changes should also be made in catapult ' - '(https://github.com/catapult-project/catapult). ' - 'Questions? Contact jbudorick@', - items=changed_files)] - return [] - - -def CommonChecks(input_api, output_api): - output = [] - output += _RunPylint(input_api, output_api) - output += _RunUnitTests(input_api, output_api) - output += _EnsureNoPylibUse(input_api, output_api) - output += _CatapultMoveWarning(input_api, output_api) - return output - - -def CheckChangeOnUpload(input_api, output_api): - return CommonChecks(input_api, output_api) - - -def CheckChangeOnCommit(input_api, output_api): - return CommonChecks(input_api, output_api)
diff --git a/build/android/devil/README.md b/build/android/devil/README.md deleted file mode 100644 index b3eb5d0..0000000 --- a/build/android/devil/README.md +++ /dev/null
@@ -1,17 +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. ---> -devil -===== - -devil is a library used by the Chromium developers to interact with Android -devices. It currently supports SDK level 16 and above. - -😈 - -Contributing -============ - -Please see the [contributor's guide](https://github.com/catapult-project/catapult/blob/master/CONTRIBUTING.md). -
diff --git a/build/android/devil/__init__.py b/build/android/devil/__init__.py deleted file mode 100644 index 50b23df..0000000 --- a/build/android/devil/__init__.py +++ /dev/null
@@ -1,3 +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.
diff --git a/build/android/devil/android/__init__.py b/build/android/devil/android/__init__.py deleted file mode 100644 index 50b23df..0000000 --- a/build/android/devil/android/__init__.py +++ /dev/null
@@ -1,3 +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.
diff --git a/build/android/devil/android/apk_helper.py b/build/android/devil/android/apk_helper.py deleted file mode 100644 index 81c49cf7..0000000 --- a/build/android/devil/android/apk_helper.py +++ /dev/null
@@ -1,141 +0,0 @@ -# Copyright (c) 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Module containing utilities for apk packages.""" - -import re - -from devil.android.sdk import aapt - - -_MANIFEST_ATTRIBUTE_RE = re.compile( - r'\s*A: ([^\(\)= ]*)(?:\([^\(\)= ]*\))?=' - r'(?:"(.*)" \(Raw: .*\)|\(type.*?\)(.*))$') -_MANIFEST_ELEMENT_RE = re.compile(r'\s*(?:E|N): (\S*) .*$') - - -def GetPackageName(apk_path): - """Returns the package name of the apk.""" - return ApkHelper(apk_path).GetPackageName() - - -# TODO(jbudorick): Deprecate and remove this function once callers have been -# converted to ApkHelper.GetInstrumentationName -def GetInstrumentationName(apk_path): - """Returns the name of the Instrumentation in the apk.""" - return ApkHelper(apk_path).GetInstrumentationName() - - -def ToHelper(path_or_helper): - """Creates an ApkHelper unless one is already given.""" - if isinstance(path_or_helper, basestring): - return ApkHelper(path_or_helper) - return path_or_helper - - -def _ParseManifestFromApk(apk_path): - aapt_output = aapt.Dump('xmltree', apk_path, 'AndroidManifest.xml') - - parsed_manifest = {} - node_stack = [parsed_manifest] - indent = ' ' - - for line in aapt_output[1:]: - if len(line) == 0: - continue - - indent_depth = 0 - while line[(len(indent) * indent_depth):].startswith(indent): - indent_depth += 1 - - node_stack = node_stack[:indent_depth] - node = node_stack[-1] - - m = _MANIFEST_ELEMENT_RE.match(line[len(indent) * indent_depth:]) - if m: - if not m.group(1) in node: - node[m.group(1)] = {} - node_stack += [node[m.group(1)]] - continue - - m = _MANIFEST_ATTRIBUTE_RE.match(line[len(indent) * indent_depth:]) - if m: - if not m.group(1) in node: - node[m.group(1)] = [] - node[m.group(1)].append(m.group(2) or m.group(3)) - continue - - return parsed_manifest - - -class ApkHelper(object): - def __init__(self, path): - self._apk_path = path - self._manifest = None - - @property - def path(self): - return self._apk_path - - def GetActivityName(self): - """Returns the name of the Activity in the apk.""" - manifest_info = self._GetManifest() - try: - activity = ( - manifest_info['manifest']['application']['activity'] - ['android:name'][0]) - except KeyError: - return None - if '.' not in activity: - activity = '%s.%s' % (self.GetPackageName(), activity) - elif activity.startswith('.'): - activity = '%s%s' % (self.GetPackageName(), activity) - return activity - - def GetInstrumentationName( - self, default='android.test.InstrumentationTestRunner'): - """Returns the name of the Instrumentation in the apk.""" - manifest_info = self._GetManifest() - try: - return manifest_info['manifest']['instrumentation']['android:name'][0] - except KeyError: - return default - - def GetPackageName(self): - """Returns the package name of the apk.""" - manifest_info = self._GetManifest() - try: - return manifest_info['manifest']['package'][0] - except KeyError: - raise Exception('Failed to determine package name of %s' % self._apk_path) - - def GetPermissions(self): - manifest_info = self._GetManifest() - try: - return manifest_info['manifest']['uses-permission']['android:name'] - except KeyError: - return [] - - def GetSplitName(self): - """Returns the name of the split of the apk.""" - manifest_info = self._GetManifest() - try: - return manifest_info['manifest']['split'][0] - except KeyError: - return None - - def HasIsolatedProcesses(self): - """Returns whether any services exist that use isolatedProcess=true.""" - manifest_info = self._GetManifest() - try: - services = manifest_info['manifest']['application']['service'] - return any(int(v, 0) for v in services['android:isolatedProcess']) - except KeyError: - return False - - def _GetManifest(self): - if not self._manifest: - self._manifest = _ParseManifestFromApk(self._apk_path) - return self._manifest -
diff --git a/build/android/devil/android/app_ui.py b/build/android/devil/android/app_ui.py deleted file mode 100644 index 20a0bf34..0000000 --- a/build/android/devil/android/app_ui.py +++ /dev/null
@@ -1,212 +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. - -"""Provides functionality to interact with UI elements of an Android app.""" - -import re -from xml.etree import ElementTree as element_tree - -from devil.android import decorators -from devil.android import device_temp_file -from devil.utils import geometry -from devil.utils import timeout_retry - -_DEFAULT_SHORT_TIMEOUT = 10 -_DEFAULT_SHORT_RETRIES = 3 -_DEFAULT_LONG_TIMEOUT = 30 -_DEFAULT_LONG_RETRIES = 0 - -# Parse rectangle bounds given as: '[left,top][right,bottom]'. -_RE_BOUNDS = re.compile( - r'\[(?P<left>\d+),(?P<top>\d+)\]\[(?P<right>\d+),(?P<bottom>\d+)\]') - - -class _UiNode(object): - def __init__(self, device, xml_node, package=None): - """Object to interact with a UI node from an xml snapshot. - - Note: there is usually no need to call this constructor directly. Instead, - use an AppUi object (below) to grab an xml screenshot from a device and - find nodes in it. - - Args: - device: A device_utils.DeviceUtils instance. - xml_node: An ElementTree instance of the node to interact with. - package: An optional package name for the app owning this node. - """ - self._device = device - self._xml_node = xml_node - self._package = package - - def _GetAttribute(self, key): - """Get the value of an attribute of this node.""" - return self._xml_node.attrib.get(key) - - @property - def bounds(self): - """Get a rectangle with the bounds of this UI node. - - Returns: - A geometry.Rectangle instance. - """ - d = _RE_BOUNDS.match(self._GetAttribute('bounds')).groupdict() - return geometry.Rectangle.FromDict({k: int(v) for k, v in d.iteritems()}) - - def Tap(self, point=None, dp_units=False): - """Send a tap event to the UI node. - - Args: - point: An optional geometry.Point instance indicating the location to - tap, relative to the bounds of the UI node, i.e. (0, 0) taps the - top-left corner. If ommited, the center of the node is tapped. - dp_units: If True, indicates that the coordinates of the point are given - in device-independent pixels; otherwise they are assumed to be "real" - pixels. This option has no effect when the point is ommited. - """ - if point is None: - point = self.bounds.center - else: - if dp_units: - point = (float(self._device.pixel_density) / 160) * point - point += self.bounds.top_left - - x, y = (str(int(v)) for v in point) - self._device.RunShellCommand(['input', 'tap', x, y], check_return=True) - - def __getitem__(self, key): - """Retrieve a child of this node by its index. - - Args: - key: An integer with the index of the child to retrieve. - Returns: - A UI node instance of the selected child. - Raises: - IndexError if the index is out of range. - """ - return type(self)(self._device, self._xml_node[key], package=self._package) - - def _Find(self, **kwargs): - """Find the first descendant node that matches a given criteria. - - Note: clients would usually call AppUi.GetUiNode or AppUi.WaitForUiNode - instead. - - For example: - - app = app_ui.AppUi(device, package='org.my.app') - app.GetUiNode(resource_id='some_element', text='hello') - - would retrieve the first matching node with both of the xml attributes: - - resource-id='org.my.app:id/some_element' - text='hello' - - As the example shows, if given and needed, the value of the resource_id key - is auto-completed with the package name specified in the AppUi constructor. - - Args: - Arguments are specified as key-value pairs, where keys correnspond to - attribute names in xml nodes (replacing any '-' with '_' to make them - valid identifiers). At least one argument must be supplied, and arguments - with a None value are ignored. - Returns: - A UI node instance of the first descendant node that matches ALL the - given key-value criteria; or None if no such node is found. - Raises: - TypeError if no search arguments are provided. - """ - matches_criteria = self._NodeMatcher(kwargs) - for node in self._xml_node.iter(): - if matches_criteria(node): - return type(self)(self._device, node, package=self._package) - return None - - def _NodeMatcher(self, kwargs): - # Auto-complete resource-id's using the package name if available. - resource_id = kwargs.get('resource_id') - if (resource_id is not None - and self._package is not None - and ':id/' not in resource_id): - kwargs['resource_id'] = '%s:id/%s' % (self._package, resource_id) - - criteria = [(k.replace('_', '-'), v) - for k, v in kwargs.iteritems() - if v is not None] - if not criteria: - raise TypeError('At least one search criteria should be specified') - return lambda node: all(node.get(k) == v for k, v in criteria) - - -class AppUi(object): - # timeout and retry arguments appear unused, but are handled by decorator. - # pylint: disable=unused-argument - - def __init__(self, device, package=None): - """Object to interact with the UI of an Android app. - - Args: - device: A device_utils.DeviceUtils instance. - package: An optional package name for the app. - """ - self._device = device - self._package = package - - @property - def package(self): - return self._package - - @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_SHORT_TIMEOUT, - _DEFAULT_SHORT_RETRIES) - def _GetRootUiNode(self, timeout=None, retries=None): - """Get a node pointing to the root of the UI nodes on screen. - - Note: This is currently implemented via adb calls to uiatomator and it - is *slow*, ~2 secs per call. Do not rely on low-level implementation - details that may change in the future. - - TODO(crbug.com/567217): Swap to a more efficient implementation. - - Args: - timeout: A number of seconds to wait for the uiautomator dump. - retries: Number of times to retry if the adb command fails. - Returns: - A UI node instance pointing to the root of the xml screenshot. - """ - with device_temp_file.DeviceTempFile(self._device.adb) as dtemp: - self._device.RunShellCommand(['uiautomator', 'dump', dtemp.name], - check_return=True) - xml_node = element_tree.fromstring( - self._device.ReadFile(dtemp.name, force_pull=True)) - return _UiNode(self._device, xml_node, package=self._package) - - def GetUiNode(self, **kwargs): - """Get the first node found matching a specified criteria. - - Args: - See _UiNode._Find. - Returns: - A UI node instance of the node if found, otherwise None. - """ - # pylint: disable=protected-access - return self._GetRootUiNode()._Find(**kwargs) - - @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_LONG_TIMEOUT, - _DEFAULT_LONG_RETRIES) - def WaitForUiNode(self, timeout=None, retries=None, **kwargs): - """Wait for a node matching a given criteria to appear on the screen. - - Args: - timeout: A number of seconds to wait for the matching node to appear. - retries: Number of times to retry in case of adb command errors. - For other args, to specify the search criteria, see _UiNode._Find. - Returns: - The UI node instance found. - Raises: - device_errors.CommandTimeoutError if the node is not found before the - timeout. - """ - def node_found(): - return self.GetUiNode(**kwargs) - - return timeout_retry.WaitFor(node_found)
diff --git a/build/android/devil/android/app_ui_test.py b/build/android/devil/android/app_ui_test.py deleted file mode 100644 index 22390a65..0000000 --- a/build/android/devil/android/app_ui_test.py +++ /dev/null
@@ -1,190 +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. - -"""Unit tests for the app_ui module.""" - -import unittest -from xml.etree import ElementTree as element_tree - -from devil import devil_env -from devil.android import app_ui -from devil.android import device_errors -from devil.utils import geometry - -with devil_env.SysPath(devil_env.config.LocalPath('pymock')): - import mock # pylint: disable=import-error - - -MOCK_XML_LOADING = ''' -<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> -<hierarchy rotation="0"> - <node bounds="[0,50][1536,178]" content-desc="Loading" - resource-id="com.example.app:id/spinner"/> -</hierarchy> -'''.strip() - - -MOCK_XML_LOADED = ''' -<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> -<hierarchy rotation="0"> - <node bounds="[0,50][1536,178]" content-desc="" - resource-id="com.example.app:id/toolbar"> - <node bounds="[0,58][112,170]" content-desc="Open navigation drawer"/> - <node bounds="[121,50][1536,178]" - resource-id="com.example.app:id/actionbar_custom_view"> - <node bounds="[121,50][1424,178]" - resource-id="com.example.app:id/actionbar_title" text="Primary"/> - <node bounds="[1424,50][1536,178]" content-desc="Search" - resource-id="com.example.app:id/actionbar_search_button"/> - </node> - </node> - <node bounds="[0,178][576,1952]" resource-id="com.example.app:id/drawer"> - <node bounds="[0,178][144,1952]" - resource-id="com.example.app:id/mini_drawer"> - <node bounds="[40,254][104,318]" resource-id="com.example.app:id/avatar"/> - <node bounds="[16,354][128,466]" content-desc="Primary" - resource-id="com.example.app:id/image_view"/> - <node bounds="[16,466][128,578]" content-desc="Social" - resource-id="com.example.app:id/image_view"/> - <node bounds="[16,578][128,690]" content-desc="Promotions" - resource-id="com.example.app:id/image_view"/> - </node> - </node> -</hierarchy> -'''.strip() - - -class UiAppTest(unittest.TestCase): - def setUp(self): - self.device = mock.Mock() - self.device.pixel_density = 320 # Each dp pixel is 2 real pixels. - self.app = app_ui.AppUi(self.device, package='com.example.app') - self._setMockXmlScreenshots([MOCK_XML_LOADED]) - - def _setMockXmlScreenshots(self, xml_docs): - """Mock self.app._GetRootUiNode to load nodes from some test xml_docs. - - Each time the method is called it will return a UI node for each string - given in |xml_docs|, or rise a time out error when the list is exhausted. - """ - # pylint: disable=protected-access - def get_mock_root_ui_node(value): - if isinstance(value, Exception): - raise value - return app_ui._UiNode( - self.device, element_tree.fromstring(value), self.app.package) - - xml_docs.append(device_errors.CommandTimeoutError('Timed out!')) - - self.app._GetRootUiNode = mock.Mock( - side_effect=(get_mock_root_ui_node(doc) for doc in xml_docs)) - - def assertNodeHasAttribs(self, node, attr): - # pylint: disable=protected-access - for key, value in attr.iteritems(): - self.assertEquals(node._GetAttribute(key), value) - - def assertTappedOnceAt(self, x, y): - self.device.RunShellCommand.assert_called_once_with( - ['input', 'tap', str(x), str(y)], check_return=True) - - def testFind_byText(self): - node = self.app.GetUiNode(text='Primary') - self.assertNodeHasAttribs(node, { - 'text': 'Primary', - 'content-desc': None, - 'resource-id': 'com.example.app:id/actionbar_title', - }) - self.assertEquals(node.bounds, geometry.Rectangle([121, 50], [1424, 178])) - - def testFind_byContentDesc(self): - node = self.app.GetUiNode(content_desc='Social') - self.assertNodeHasAttribs(node, { - 'text': None, - 'content-desc': 'Social', - 'resource-id': 'com.example.app:id/image_view', - }) - self.assertEquals(node.bounds, geometry.Rectangle([16, 466], [128, 578])) - - def testFind_byResourceId_autocompleted(self): - node = self.app.GetUiNode(resource_id='image_view') - self.assertNodeHasAttribs(node, { - 'content-desc': 'Primary', - 'resource-id': 'com.example.app:id/image_view', - }) - - def testFind_byResourceId_absolute(self): - node = self.app.GetUiNode(resource_id='com.example.app:id/image_view') - self.assertNodeHasAttribs(node, { - 'content-desc': 'Primary', - 'resource-id': 'com.example.app:id/image_view', - }) - - def testFind_byMultiple(self): - node = self.app.GetUiNode(resource_id='image_view', - content_desc='Promotions') - self.assertNodeHasAttribs(node, { - 'content-desc': 'Promotions', - 'resource-id': 'com.example.app:id/image_view', - }) - self.assertEquals(node.bounds, geometry.Rectangle([16, 578], [128, 690])) - - def testFind_notFound(self): - node = self.app.GetUiNode(resource_id='does_not_exist') - self.assertIsNone(node) - - def testFind_noArgsGiven(self): - # Same exception given by Python for a function call with not enough args. - with self.assertRaises(TypeError): - self.app.GetUiNode() - - def testGetChildren(self): - node = self.app.GetUiNode(resource_id='mini_drawer') - self.assertNodeHasAttribs( - node[0], {'resource-id': 'com.example.app:id/avatar'}) - self.assertNodeHasAttribs(node[1], {'content-desc': 'Primary'}) - self.assertNodeHasAttribs(node[2], {'content-desc': 'Social'}) - self.assertNodeHasAttribs(node[3], {'content-desc': 'Promotions'}) - with self.assertRaises(IndexError): - # pylint: disable=pointless-statement - node[4] - - def testTap_center(self): - node = self.app.GetUiNode(content_desc='Open navigation drawer') - node.Tap() - self.assertTappedOnceAt(56, 114) - - def testTap_topleft(self): - node = self.app.GetUiNode(content_desc='Open navigation drawer') - node.Tap(geometry.Point(0, 0)) - self.assertTappedOnceAt(0, 58) - - def testTap_withOffset(self): - node = self.app.GetUiNode(content_desc='Open navigation drawer') - node.Tap(geometry.Point(10, 20)) - self.assertTappedOnceAt(10, 78) - - def testTap_withOffsetInDp(self): - node = self.app.GetUiNode(content_desc='Open navigation drawer') - node.Tap(geometry.Point(10, 20), dp_units=True) - self.assertTappedOnceAt(20, 98) - - def testTap_dpUnitsIgnored(self): - node = self.app.GetUiNode(content_desc='Open navigation drawer') - node.Tap(dp_units=True) - self.assertTappedOnceAt(56, 114) # Still taps at center. - - @mock.patch('time.sleep', mock.Mock()) - def testWaitForUiNode_found(self): - self._setMockXmlScreenshots( - [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADED]) - node = self.app.WaitForUiNode(resource_id='actionbar_title') - self.assertNodeHasAttribs(node, {'text': 'Primary'}) - - @mock.patch('time.sleep', mock.Mock()) - def testWaitForUiNode_notFound(self): - self._setMockXmlScreenshots( - [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADING]) - with self.assertRaises(device_errors.CommandTimeoutError): - self.app.WaitForUiNode(resource_id='actionbar_title')
diff --git a/build/android/devil/android/battery_utils.py b/build/android/devil/android/battery_utils.py deleted file mode 100644 index f499720..0000000 --- a/build/android/devil/android/battery_utils.py +++ /dev/null
@@ -1,649 +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. - -"""Provides a variety of device interactions with power. -""" -# pylint: disable=unused-argument - -import collections -import contextlib -import csv -import logging - -from devil.android import decorators -from devil.android import device_errors -from devil.android import device_utils -from devil.android.sdk import version_codes -from devil.utils import timeout_retry - -_DEFAULT_TIMEOUT = 30 -_DEFAULT_RETRIES = 3 - - -_DEVICE_PROFILES = [ - { - 'name': 'Nexus 4', - 'witness_file': '/sys/module/pm8921_charger/parameters/disabled', - 'enable_command': ( - 'echo 0 > /sys/module/pm8921_charger/parameters/disabled && ' - 'dumpsys battery reset'), - 'disable_command': ( - 'echo 1 > /sys/module/pm8921_charger/parameters/disabled && ' - 'dumpsys battery set ac 0 && dumpsys battery set usb 0'), - 'charge_counter': None, - 'voltage': None, - 'current': None, - }, - { - 'name': 'Nexus 5', - # Nexus 5 - # Setting the HIZ bit of the bq24192 causes the charger to actually ignore - # energy coming from USB. Setting the power_supply offline just updates the - # Android system to reflect that. - 'witness_file': '/sys/kernel/debug/bq24192/INPUT_SRC_CONT', - 'enable_command': ( - 'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && ' - 'chmod 644 /sys/class/power_supply/usb/online && ' - 'echo 1 > /sys/class/power_supply/usb/online && ' - 'dumpsys battery reset'), - 'disable_command': ( - 'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && ' - 'chmod 644 /sys/class/power_supply/usb/online && ' - 'echo 0 > /sys/class/power_supply/usb/online && ' - 'dumpsys battery set ac 0 && dumpsys battery set usb 0'), - 'charge_counter': None, - 'voltage': None, - 'current': None, - }, - { - 'name': 'Nexus 6', - 'witness_file': None, - 'enable_command': ( - 'echo 1 > /sys/class/power_supply/battery/charging_enabled && ' - 'dumpsys battery reset'), - 'disable_command': ( - 'echo 0 > /sys/class/power_supply/battery/charging_enabled && ' - 'dumpsys battery set ac 0 && dumpsys battery set usb 0'), - 'charge_counter': ( - '/sys/class/power_supply/max170xx_battery/charge_counter_ext'), - 'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now', - 'current': '/sys/class/power_supply/max170xx_battery/current_now', - }, - { - 'name': 'Nexus 9', - 'witness_file': None, - 'enable_command': ( - 'echo Disconnected > ' - '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && ' - 'dumpsys battery reset'), - 'disable_command': ( - 'echo Connected > ' - '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && ' - 'dumpsys battery set ac 0 && dumpsys battery set usb 0'), - 'charge_counter': '/sys/class/power_supply/battery/charge_counter_ext', - 'voltage': '/sys/class/power_supply/battery/voltage_now', - 'current': '/sys/class/power_supply/battery/current_now', - }, - { - 'name': 'Nexus 10', - 'witness_file': None, - 'enable_command': None, - 'disable_command': None, - 'charge_counter': None, - 'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now', - 'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now', - - }, -] - -# The list of useful dumpsys columns. -# Index of the column containing the format version. -_DUMP_VERSION_INDEX = 0 -# Index of the column containing the type of the row. -_ROW_TYPE_INDEX = 3 -# Index of the column containing the uid. -_PACKAGE_UID_INDEX = 4 -# Index of the column containing the application package. -_PACKAGE_NAME_INDEX = 5 -# The column containing the uid of the power data. -_PWI_UID_INDEX = 1 -# The column containing the type of consumption. Only consumption since last -# charge are of interest here. -_PWI_AGGREGATION_INDEX = 2 -_PWS_AGGREGATION_INDEX = _PWI_AGGREGATION_INDEX -# The column containing the amount of power used, in mah. -_PWI_POWER_CONSUMPTION_INDEX = 5 -_PWS_POWER_CONSUMPTION_INDEX = _PWI_POWER_CONSUMPTION_INDEX - -_MAX_CHARGE_ERROR = 20 - - -class BatteryUtils(object): - - def __init__(self, device, default_timeout=_DEFAULT_TIMEOUT, - default_retries=_DEFAULT_RETRIES): - """BatteryUtils constructor. - - Args: - device: A DeviceUtils instance. - default_timeout: An integer containing the default number of seconds to - wait for an operation to complete if no explicit value - is provided. - default_retries: An integer containing the default number or times an - operation should be retried on failure if no explicit - value is provided. - Raises: - TypeError: If it is not passed a DeviceUtils instance. - """ - if not isinstance(device, device_utils.DeviceUtils): - raise TypeError('Must be initialized with DeviceUtils object.') - self._device = device - self._cache = device.GetClientCache(self.__class__.__name__) - self._default_timeout = default_timeout - self._default_retries = default_retries - - @decorators.WithTimeoutAndRetriesFromInstance() - def SupportsFuelGauge(self, timeout=None, retries=None): - """Detect if fuel gauge chip is present. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - True if known fuel gauge files are present. - False otherwise. - """ - self._DiscoverDeviceProfile() - return (self._cache['profile']['enable_command'] != None - and self._cache['profile']['charge_counter'] != None) - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetFuelGaugeChargeCounter(self, timeout=None, retries=None): - """Get value of charge_counter on fuel gauge chip. - - Device must have charging disabled for this, not just battery updates - disabled. The only device that this currently works with is the nexus 5. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - value of charge_counter for fuel gauge chip in units of nAh. - - Raises: - device_errors.CommandFailedError: If fuel gauge chip not found. - """ - if self.SupportsFuelGauge(): - return int(self._device.ReadFile( - self._cache['profile']['charge_counter'])) - raise device_errors.CommandFailedError( - 'Unable to find fuel gauge.') - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetNetworkData(self, package, timeout=None, retries=None): - """Get network data for specific package. - - Args: - package: package name you want network data for. - timeout: timeout in seconds - retries: number of retries - - Returns: - Tuple of (sent_data, recieved_data) - None if no network data found - """ - # If device_utils clears cache, cache['uids'] doesn't exist - if 'uids' not in self._cache: - self._cache['uids'] = {} - if package not in self._cache['uids']: - self.GetPowerData() - if package not in self._cache['uids']: - logging.warning('No UID found for %s. Can\'t get network data.', - package) - return None - - network_data_path = '/proc/uid_stat/%s/' % self._cache['uids'][package] - try: - send_data = int(self._device.ReadFile(network_data_path + 'tcp_snd')) - # If ReadFile throws exception, it means no network data usage file for - # package has been recorded. Return 0 sent and 0 received. - except device_errors.AdbShellCommandFailedError: - logging.warning('No sent data found for package %s', package) - send_data = 0 - try: - recv_data = int(self._device.ReadFile(network_data_path + 'tcp_rcv')) - except device_errors.AdbShellCommandFailedError: - logging.warning('No received data found for package %s', package) - recv_data = 0 - return (send_data, recv_data) - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetPowerData(self, timeout=None, retries=None): - """Get power data for device. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - Dict containing system power, and a per-package power dict keyed on - package names. - { - 'system_total': 23.1, - 'per_package' : { - package_name: { - 'uid': uid, - 'data': [1,2,3] - }, - } - } - """ - if 'uids' not in self._cache: - self._cache['uids'] = {} - dumpsys_output = self._device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True) - csvreader = csv.reader(dumpsys_output) - pwi_entries = collections.defaultdict(list) - system_total = None - for entry in csvreader: - if entry[_DUMP_VERSION_INDEX] not in ['8', '9']: - # Wrong dumpsys version. - raise device_errors.DeviceVersionError( - 'Dumpsys version must be 8 or 9. %s found.' - % entry[_DUMP_VERSION_INDEX]) - if _ROW_TYPE_INDEX < len(entry) and entry[_ROW_TYPE_INDEX] == 'uid': - current_package = entry[_PACKAGE_NAME_INDEX] - if (self._cache['uids'].get(current_package) - and self._cache['uids'].get(current_package) - != entry[_PACKAGE_UID_INDEX]): - raise device_errors.CommandFailedError( - 'Package %s found multiple times with different UIDs %s and %s' - % (current_package, self._cache['uids'][current_package], - entry[_PACKAGE_UID_INDEX])) - self._cache['uids'][current_package] = entry[_PACKAGE_UID_INDEX] - elif (_PWI_POWER_CONSUMPTION_INDEX < len(entry) - and entry[_ROW_TYPE_INDEX] == 'pwi' - and entry[_PWI_AGGREGATION_INDEX] == 'l'): - pwi_entries[entry[_PWI_UID_INDEX]].append( - float(entry[_PWI_POWER_CONSUMPTION_INDEX])) - elif (_PWS_POWER_CONSUMPTION_INDEX < len(entry) - and entry[_ROW_TYPE_INDEX] == 'pws' - and entry[_PWS_AGGREGATION_INDEX] == 'l'): - # This entry should only appear once. - assert system_total is None - system_total = float(entry[_PWS_POWER_CONSUMPTION_INDEX]) - - per_package = {p: {'uid': uid, 'data': pwi_entries[uid]} - for p, uid in self._cache['uids'].iteritems()} - return {'system_total': system_total, 'per_package': per_package} - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetBatteryInfo(self, timeout=None, retries=None): - """Gets battery info for the device. - - Args: - timeout: timeout in seconds - retries: number of retries - Returns: - A dict containing various battery information as reported by dumpsys - battery. - """ - result = {} - # Skip the first line, which is just a header. - for line in self._device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True)[1:]: - # If usb charging has been disabled, an extra line of header exists. - if 'UPDATES STOPPED' in line: - logging.warning('Dumpsys battery not receiving updates. ' - 'Run dumpsys battery reset if this is in error.') - elif ':' not in line: - logging.warning('Unknown line found in dumpsys battery: "%s"', line) - else: - k, v = line.split(':', 1) - result[k.strip()] = v.strip() - return result - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetCharging(self, timeout=None, retries=None): - """Gets the charging state of the device. - - Args: - timeout: timeout in seconds - retries: number of retries - Returns: - True if the device is charging, false otherwise. - """ - battery_info = self.GetBatteryInfo() - for k in ('AC powered', 'USB powered', 'Wireless powered'): - if (k in battery_info and - battery_info[k].lower() in ('true', '1', 'yes')): - return True - return False - - # TODO(rnephew): Make private when all use cases can use the context manager. - @decorators.WithTimeoutAndRetriesFromInstance() - def DisableBatteryUpdates(self, timeout=None, retries=None): - """Resets battery data and makes device appear like it is not - charging so that it will collect power data since last charge. - - Args: - timeout: timeout in seconds - retries: number of retries - - Raises: - device_errors.CommandFailedError: When resetting batterystats fails to - reset power values. - device_errors.DeviceVersionError: If device is not L or higher. - """ - def battery_updates_disabled(): - return self.GetCharging() is False - - self._ClearPowerData() - self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'ac', '0'], - check_return=True) - self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'usb', '0'], - check_return=True) - timeout_retry.WaitFor(battery_updates_disabled, wait_period=1) - - # TODO(rnephew): Make private when all use cases can use the context manager. - @decorators.WithTimeoutAndRetriesFromInstance() - def EnableBatteryUpdates(self, timeout=None, retries=None): - """Restarts device charging so that dumpsys no longer collects power data. - - Args: - timeout: timeout in seconds - retries: number of retries - - Raises: - device_errors.DeviceVersionError: If device is not L or higher. - """ - def battery_updates_enabled(): - return (self.GetCharging() - or not bool('UPDATES STOPPED' in self._device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True))) - - self._device.RunShellCommand(['dumpsys', 'battery', 'reset'], - check_return=True) - timeout_retry.WaitFor(battery_updates_enabled, wait_period=1) - - @contextlib.contextmanager - def BatteryMeasurement(self, timeout=None, retries=None): - """Context manager that enables battery data collection. It makes - the device appear to stop charging so that dumpsys will start collecting - power data since last charge. Once the with block is exited, charging is - resumed and power data since last charge is no longer collected. - - Only for devices L and higher. - - Example usage: - with BatteryMeasurement(): - browser_actions() - get_power_data() # report usage within this block - after_measurements() # Anything that runs after power - # measurements are collected - - Args: - timeout: timeout in seconds - retries: number of retries - - Raises: - device_errors.DeviceVersionError: If device is not L or higher. - """ - if self._device.build_version_sdk < version_codes.LOLLIPOP: - raise device_errors.DeviceVersionError('Device must be L or higher.') - try: - self.DisableBatteryUpdates(timeout=timeout, retries=retries) - yield - finally: - self.EnableBatteryUpdates(timeout=timeout, retries=retries) - - def _DischargeDevice(self, percent, wait_period=120): - """Disables charging and waits for device to discharge given amount - - Args: - percent: level of charge to discharge. - - Raises: - ValueError: If percent is not between 1 and 99. - """ - battery_level = int(self.GetBatteryInfo().get('level')) - if not 0 < percent < 100: - raise ValueError('Discharge amount(%s) must be between 1 and 99' - % percent) - if battery_level is None: - logging.warning('Unable to find current battery level. Cannot discharge.') - return - # Do not discharge if it would make battery level too low. - if percent >= battery_level - 10: - logging.warning('Battery is too low or discharge amount requested is too ' - 'high. Cannot discharge phone %s percent.', percent) - return - - self._HardwareSetCharging(False) - def device_discharged(): - self._HardwareSetCharging(True) - current_level = int(self.GetBatteryInfo().get('level')) - logging.info('current battery level: %s', current_level) - if battery_level - current_level >= percent: - return True - self._HardwareSetCharging(False) - return False - - timeout_retry.WaitFor(device_discharged, wait_period=wait_period) - - def ChargeDeviceToLevel(self, level, wait_period=60): - """Enables charging and waits for device to be charged to given level. - - Args: - level: level of charge to wait for. - wait_period: time in seconds to wait between checking. - Raises: - device_errors.DeviceChargingError: If error while charging is detected. - """ - self.SetCharging(True) - charge_status = { - 'charge_failure_count': 0, - 'last_charge_value': 0 - } - def device_charged(): - battery_level = self.GetBatteryInfo().get('level') - if battery_level is None: - logging.warning('Unable to find current battery level.') - battery_level = 100 - else: - logging.info('current battery level: %s', battery_level) - battery_level = int(battery_level) - - # Use > so that it will not reset if charge is going down. - if battery_level > charge_status['last_charge_value']: - charge_status['last_charge_value'] = battery_level - charge_status['charge_failure_count'] = 0 - else: - charge_status['charge_failure_count'] += 1 - - if (not battery_level >= level - and charge_status['charge_failure_count'] >= _MAX_CHARGE_ERROR): - raise device_errors.DeviceChargingError( - 'Device not charging properly. Current level:%s Previous level:%s' - % (battery_level, charge_status['last_charge_value'])) - return battery_level >= level - - timeout_retry.WaitFor(device_charged, wait_period=wait_period) - - def LetBatteryCoolToTemperature(self, target_temp, wait_period=180): - """Lets device sit to give battery time to cool down - Args: - temp: maximum temperature to allow in tenths of degrees c. - wait_period: time in seconds to wait between checking. - """ - def cool_device(): - temp = self.GetBatteryInfo().get('temperature') - if temp is None: - logging.warning('Unable to find current battery temperature.') - temp = 0 - else: - logging.info('Current battery temperature: %s', temp) - if int(temp) <= target_temp: - return True - else: - if self._cache['profile']['name'] == 'Nexus 5': - self._DischargeDevice(1) - return False - - self._DiscoverDeviceProfile() - self.EnableBatteryUpdates() - logging.info('Waiting for the device to cool down to %s (0.1 C)', - target_temp) - timeout_retry.WaitFor(cool_device, wait_period=wait_period) - - @decorators.WithTimeoutAndRetriesFromInstance() - def SetCharging(self, enabled, timeout=None, retries=None): - """Enables or disables charging on the device. - - Args: - enabled: A boolean indicating whether charging should be enabled or - disabled. - timeout: timeout in seconds - retries: number of retries - """ - if self.GetCharging() == enabled: - logging.warning('Device charging already in expected state: %s', enabled) - return - - self._DiscoverDeviceProfile() - if enabled: - if self._cache['profile']['enable_command']: - self._HardwareSetCharging(enabled) - else: - logging.info('Unable to enable charging via hardware. ' - 'Falling back to software enabling.') - self.EnableBatteryUpdates() - else: - if self._cache['profile']['enable_command']: - self._ClearPowerData() - self._HardwareSetCharging(enabled) - else: - logging.info('Unable to disable charging via hardware. ' - 'Falling back to software disabling.') - self.DisableBatteryUpdates() - - def _HardwareSetCharging(self, enabled, timeout=None, retries=None): - """Enables or disables charging on the device. - - Args: - enabled: A boolean indicating whether charging should be enabled or - disabled. - timeout: timeout in seconds - retries: number of retries - - Raises: - device_errors.CommandFailedError: If method of disabling charging cannot - be determined. - """ - self._DiscoverDeviceProfile() - if not self._cache['profile']['enable_command']: - raise device_errors.CommandFailedError( - 'Unable to find charging commands.') - - command = (self._cache['profile']['enable_command'] if enabled - else self._cache['profile']['disable_command']) - - def verify_charging(): - return self.GetCharging() == enabled - - self._device.RunShellCommand( - command, check_return=True, as_root=True, large_output=True) - timeout_retry.WaitFor(verify_charging, wait_period=1) - - @contextlib.contextmanager - def PowerMeasurement(self, timeout=None, retries=None): - """Context manager that enables battery power collection. - - Once the with block is exited, charging is resumed. Will attempt to disable - charging at the hardware level, and if that fails will fall back to software - disabling of battery updates. - - Only for devices L and higher. - - Example usage: - with PowerMeasurement(): - browser_actions() - get_power_data() # report usage within this block - after_measurements() # Anything that runs after power - # measurements are collected - - Args: - timeout: timeout in seconds - retries: number of retries - """ - try: - self.SetCharging(False, timeout=timeout, retries=retries) - yield - finally: - self.SetCharging(True, timeout=timeout, retries=retries) - - def _ClearPowerData(self): - """Resets battery data and makes device appear like it is not - charging so that it will collect power data since last charge. - - Returns: - True if power data cleared. - False if power data clearing is not supported (pre-L) - - Raises: - device_errors.DeviceVersionError: If power clearing is supported, - but fails. - """ - if self._device.build_version_sdk < version_codes.LOLLIPOP: - logging.warning('Dumpsys power data only available on 5.0 and above. ' - 'Cannot clear power data.') - return False - - self._device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True) - self._device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True) - self._device.RunShellCommand( - ['dumpsys', 'batterystats', '--reset'], check_return=True) - battery_data = self._device.RunShellCommand( - ['dumpsys', 'batterystats', '--charged', '-c'], - check_return=True, large_output=True) - for line in battery_data: - l = line.split(',') - if (len(l) > _PWI_POWER_CONSUMPTION_INDEX and l[_ROW_TYPE_INDEX] == 'pwi' - and l[_PWI_POWER_CONSUMPTION_INDEX] != 0): - self._device.RunShellCommand( - ['dumpsys', 'battery', 'reset'], check_return=True) - raise device_errors.CommandFailedError( - 'Non-zero pmi value found after reset.') - self._device.RunShellCommand( - ['dumpsys', 'battery', 'reset'], check_return=True) - return True - - def _DiscoverDeviceProfile(self): - """Checks and caches device information. - - Returns: - True if profile is found, false otherwise. - """ - - if 'profile' in self._cache: - return True - for profile in _DEVICE_PROFILES: - if self._device.product_model == profile['name']: - self._cache['profile'] = profile - return True - self._cache['profile'] = { - 'name': None, - 'witness_file': None, - 'enable_command': None, - 'disable_command': None, - 'charge_counter': None, - 'voltage': None, - 'current': None, - } - return False
diff --git a/build/android/devil/android/battery_utils_test.py b/build/android/devil/android/battery_utils_test.py deleted file mode 100755 index 0d26b964..0000000 --- a/build/android/devil/android/battery_utils_test.py +++ /dev/null
@@ -1,674 +0,0 @@ -#!/usr/bin/env python -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -Unit tests for the contents of battery_utils.py -""" - -# pylint: disable=protected-access,unused-argument - -import logging -import unittest - -from devil import devil_env -from devil.android import battery_utils -from devil.android import device_errors -from devil.android import device_utils -from devil.android import device_utils_test -from devil.utils import mock_calls - -with devil_env.SysPath(devil_env.PYMOCK_PATH): - import mock # pylint: disable=import-error - -_DUMPSYS_OUTPUT = [ - '9,0,i,uid,1000,test_package1', - '9,0,i,uid,1001,test_package2', - '9,1000,l,pwi,uid,1', - '9,1001,l,pwi,uid,2', - '9,0,l,pws,1728,2000,190,207', -] - - -class BatteryUtilsTest(mock_calls.TestCase): - - _NEXUS_5 = { - 'name': 'Nexus 5', - 'witness_file': '/sys/kernel/debug/bq24192/INPUT_SRC_CONT', - 'enable_command': ( - 'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && ' - 'echo 1 > /sys/class/power_supply/usb/online'), - 'disable_command': ( - 'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && ' - 'chmod 644 /sys/class/power_supply/usb/online && ' - 'echo 0 > /sys/class/power_supply/usb/online'), - 'charge_counter': None, - 'voltage': None, - 'current': None, - } - - _NEXUS_6 = { - 'name': 'Nexus 6', - 'witness_file': None, - 'enable_command': None, - 'disable_command': None, - 'charge_counter': ( - '/sys/class/power_supply/max170xx_battery/charge_counter_ext'), - 'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now', - 'current': '/sys/class/power_supply/max170xx_battery/current_now', - } - - _NEXUS_10 = { - 'name': 'Nexus 10', - 'witness_file': None, - 'enable_command': None, - 'disable_command': None, - 'charge_counter': ( - '/sys/class/power_supply/ds2784-fuelgauge/charge_counter_ext'), - 'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now', - 'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now', - } - - def ShellError(self, output=None, status=1): - def action(cmd, *args, **kwargs): - raise device_errors.AdbShellCommandFailedError( - cmd, output, status, str(self.device)) - if output is None: - output = 'Permission denied\n' - return action - - def setUp(self): - self.adb = device_utils_test._AdbWrapperMock('0123456789abcdef') - self.device = device_utils.DeviceUtils( - self.adb, default_timeout=10, default_retries=0) - self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial']) - self.battery = battery_utils.BatteryUtils( - self.device, default_timeout=10, default_retries=0) - - -class BatteryUtilsInitTest(unittest.TestCase): - - def testInitWithDeviceUtil(self): - serial = '0fedcba987654321' - d = device_utils.DeviceUtils(serial) - b = battery_utils.BatteryUtils(d) - self.assertEqual(d, b._device) - - def testInitWithMissing_fails(self): - with self.assertRaises(TypeError): - battery_utils.BatteryUtils(None) - with self.assertRaises(TypeError): - battery_utils.BatteryUtils('') - -class BatteryUtilsSetChargingTest(BatteryUtilsTest): - @mock.patch('time.sleep', mock.Mock()) - def testHardwareSetCharging_enabled(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertCalls( - (self.call.device.RunShellCommand( - mock.ANY, check_return=True, as_root=True, large_output=True), []), - (self.call.battery.GetCharging(), False), - (self.call.battery.GetCharging(), True)): - self.battery._HardwareSetCharging(True) - - def testHardwareSetCharging_alreadyEnabled(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertCalls( - (self.call.device.RunShellCommand( - mock.ANY, check_return=True, as_root=True, large_output=True), []), - (self.call.battery.GetCharging(), True)): - self.battery._HardwareSetCharging(True) - - @mock.patch('time.sleep', mock.Mock()) - def testHardwareSetCharging_disabled(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertCalls( - (self.call.device.RunShellCommand( - mock.ANY, check_return=True, as_root=True, large_output=True), []), - (self.call.battery.GetCharging(), True), - (self.call.battery.GetCharging(), False)): - self.battery._HardwareSetCharging(False) - - -class BatteryUtilsSetBatteryMeasurementTest(BatteryUtilsTest): - - @mock.patch('time.sleep', mock.Mock()) - def testBatteryMeasurementWifi(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=22): - with self.assertCalls( - (self.call.battery._ClearPowerData(), True), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), - []), - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'reset'], check_return=True), []), - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']), - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True), [])): - with self.battery.BatteryMeasurement(): - pass - - @mock.patch('time.sleep', mock.Mock()) - def testBatteryMeasurementUsb(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=22): - with self.assertCalls( - (self.call.battery._ClearPowerData(), True), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), - []), - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'reset'], check_return=True), []), - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']), - (self.call.battery.GetCharging(), True)): - with self.battery.BatteryMeasurement(): - pass - - -class BatteryUtilsGetPowerData(BatteryUtilsTest): - - def testGetPowerData(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True), - _DUMPSYS_OUTPUT)): - data = self.battery.GetPowerData() - check = { - 'system_total': 2000.0, - 'per_package': { - 'test_package1': {'uid': '1000', 'data': [1.0]}, - 'test_package2': {'uid': '1001', 'data': [2.0]} - } - } - self.assertEqual(data, check) - - def testGetPowerData_packageCollisionSame(self): - self.battery._cache['uids'] = {'test_package1': '1000'} - with self.assertCall( - self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True), - _DUMPSYS_OUTPUT): - data = self.battery.GetPowerData() - check = { - 'system_total': 2000.0, - 'per_package': { - 'test_package1': {'uid': '1000', 'data': [1.0]}, - 'test_package2': {'uid': '1001', 'data': [2.0]} - } - } - self.assertEqual(data, check) - - def testGetPowerData_packageCollisionDifferent(self): - self.battery._cache['uids'] = {'test_package1': '1'} - with self.assertCall( - self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True), - _DUMPSYS_OUTPUT): - with self.assertRaises(device_errors.CommandFailedError): - self.battery.GetPowerData() - - def testGetPowerData_cacheCleared(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True), - _DUMPSYS_OUTPUT)): - self.battery._cache.clear() - data = self.battery.GetPowerData() - check = { - 'system_total': 2000.0, - 'per_package': { - 'test_package1': {'uid': '1000', 'data': [1.0]}, - 'test_package2': {'uid': '1001', 'data': [2.0]} - } - } - self.assertEqual(data, check) - - -class BatteryUtilsChargeDevice(BatteryUtilsTest): - - @mock.patch('time.sleep', mock.Mock()) - def testChargeDeviceToLevel_pass(self): - with self.assertCalls( - (self.call.battery.SetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '50'}), - (self.call.battery.GetBatteryInfo(), {'level': '100'})): - self.battery.ChargeDeviceToLevel(95) - - @mock.patch('time.sleep', mock.Mock()) - def testChargeDeviceToLevel_failureSame(self): - with self.assertCalls( - (self.call.battery.SetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '50'}), - (self.call.battery.GetBatteryInfo(), {'level': '50'}), - - (self.call.battery.GetBatteryInfo(), {'level': '50'})): - with self.assertRaises(device_errors.DeviceChargingError): - old_max = battery_utils._MAX_CHARGE_ERROR - try: - battery_utils._MAX_CHARGE_ERROR = 2 - self.battery.ChargeDeviceToLevel(95) - finally: - battery_utils._MAX_CHARGE_ERROR = old_max - - @mock.patch('time.sleep', mock.Mock()) - def testChargeDeviceToLevel_failureDischarge(self): - with self.assertCalls( - (self.call.battery.SetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '50'}), - (self.call.battery.GetBatteryInfo(), {'level': '49'}), - (self.call.battery.GetBatteryInfo(), {'level': '48'})): - with self.assertRaises(device_errors.DeviceChargingError): - old_max = battery_utils._MAX_CHARGE_ERROR - try: - battery_utils._MAX_CHARGE_ERROR = 2 - self.battery.ChargeDeviceToLevel(95) - finally: - battery_utils._MAX_CHARGE_ERROR = old_max - - -class BatteryUtilsDischargeDevice(BatteryUtilsTest): - - @mock.patch('time.sleep', mock.Mock()) - def testDischargeDevice_exact(self): - with self.assertCalls( - (self.call.battery.GetBatteryInfo(), {'level': '100'}), - (self.call.battery._HardwareSetCharging(False)), - (self.call.battery._HardwareSetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '99'})): - self.battery._DischargeDevice(1) - - @mock.patch('time.sleep', mock.Mock()) - def testDischargeDevice_over(self): - with self.assertCalls( - (self.call.battery.GetBatteryInfo(), {'level': '100'}), - (self.call.battery._HardwareSetCharging(False)), - (self.call.battery._HardwareSetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '50'})): - self.battery._DischargeDevice(1) - - @mock.patch('time.sleep', mock.Mock()) - def testDischargeDevice_takeslong(self): - with self.assertCalls( - (self.call.battery.GetBatteryInfo(), {'level': '100'}), - (self.call.battery._HardwareSetCharging(False)), - (self.call.battery._HardwareSetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '100'}), - (self.call.battery._HardwareSetCharging(False)), - (self.call.battery._HardwareSetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '99'}), - (self.call.battery._HardwareSetCharging(False)), - (self.call.battery._HardwareSetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '98'}), - (self.call.battery._HardwareSetCharging(False)), - (self.call.battery._HardwareSetCharging(True)), - (self.call.battery.GetBatteryInfo(), {'level': '97'})): - self.battery._DischargeDevice(3) - - @mock.patch('time.sleep', mock.Mock()) - def testDischargeDevice_dischargeTooClose(self): - with self.assertCalls( - (self.call.battery.GetBatteryInfo(), {'level': '100'})): - self.battery._DischargeDevice(99) - - @mock.patch('time.sleep', mock.Mock()) - def testDischargeDevice_percentageOutOfBounds(self): - with self.assertCalls( - (self.call.battery.GetBatteryInfo(), {'level': '100'})): - with self.assertRaises(ValueError): - self.battery._DischargeDevice(100) - with self.assertCalls( - (self.call.battery.GetBatteryInfo(), {'level': '100'})): - with self.assertRaises(ValueError): - self.battery._DischargeDevice(0) - - -class BatteryUtilsGetBatteryInfoTest(BatteryUtilsTest): - - def testGetBatteryInfo_normal(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True), - [ - 'Current Battery Service state:', - ' AC powered: false', - ' USB powered: true', - ' level: 100', - ' temperature: 321', - ])): - self.assertEquals( - { - 'AC powered': 'false', - 'USB powered': 'true', - 'level': '100', - 'temperature': '321', - }, - self.battery.GetBatteryInfo()) - - def testGetBatteryInfo_nothing(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True), [])): - self.assertEquals({}, self.battery.GetBatteryInfo()) - - -class BatteryUtilsGetChargingTest(BatteryUtilsTest): - - def testGetCharging_usb(self): - with self.assertCall( - self.call.battery.GetBatteryInfo(), {'USB powered': 'true'}): - self.assertTrue(self.battery.GetCharging()) - - def testGetCharging_usbFalse(self): - with self.assertCall( - self.call.battery.GetBatteryInfo(), {'USB powered': 'false'}): - self.assertFalse(self.battery.GetCharging()) - - def testGetCharging_ac(self): - with self.assertCall( - self.call.battery.GetBatteryInfo(), {'AC powered': 'true'}): - self.assertTrue(self.battery.GetCharging()) - - def testGetCharging_wireless(self): - with self.assertCall( - self.call.battery.GetBatteryInfo(), {'Wireless powered': 'true'}): - self.assertTrue(self.battery.GetCharging()) - - def testGetCharging_unknown(self): - with self.assertCall( - self.call.battery.GetBatteryInfo(), {'level': '42'}): - self.assertFalse(self.battery.GetCharging()) - - -class BatteryUtilsGetNetworkDataTest(BatteryUtilsTest): - - def testGetNetworkData_noDataUsage(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True), - _DUMPSYS_OUTPUT), - (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), - self.ShellError()), - (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), - self.ShellError())): - self.assertEquals(self.battery.GetNetworkData('test_package1'), (0, 0)) - - def testGetNetworkData_badPackage(self): - with self.assertCall( - self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True), - _DUMPSYS_OUTPUT): - self.assertEqual(self.battery.GetNetworkData('asdf'), None) - - def testGetNetworkData_packageNotCached(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True), - _DUMPSYS_OUTPUT), - (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), - (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): - self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2)) - - def testGetNetworkData_packageCached(self): - self.battery._cache['uids'] = {'test_package1': '1000'} - with self.assertCalls( - (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), - (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): - self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2)) - - def testGetNetworkData_clearedCache(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '-c'], - check_return=True, large_output=True), - _DUMPSYS_OUTPUT), - (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), - (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): - self.battery._cache.clear() - self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2)) - - -class BatteryUtilsLetBatteryCoolToTemperatureTest(BatteryUtilsTest): - - @mock.patch('time.sleep', mock.Mock()) - def testLetBatteryCoolToTemperature_startUnder(self): - self.battery._cache['profile'] = self._NEXUS_6 - with self.assertCalls( - (self.call.battery.EnableBatteryUpdates(), []), - (self.call.battery.GetBatteryInfo(), {'temperature': '500'})): - self.battery.LetBatteryCoolToTemperature(600) - - @mock.patch('time.sleep', mock.Mock()) - def testLetBatteryCoolToTemperature_startOver(self): - self.battery._cache['profile'] = self._NEXUS_6 - with self.assertCalls( - (self.call.battery.EnableBatteryUpdates(), []), - (self.call.battery.GetBatteryInfo(), {'temperature': '500'}), - (self.call.battery.GetBatteryInfo(), {'temperature': '400'})): - self.battery.LetBatteryCoolToTemperature(400) - - @mock.patch('time.sleep', mock.Mock()) - def testLetBatteryCoolToTemperature_nexus5Hot(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertCalls( - (self.call.battery.EnableBatteryUpdates(), []), - (self.call.battery.GetBatteryInfo(), {'temperature': '500'}), - (self.call.battery._DischargeDevice(1), []), - (self.call.battery.GetBatteryInfo(), {'temperature': '400'})): - self.battery.LetBatteryCoolToTemperature(400) - - @mock.patch('time.sleep', mock.Mock()) - def testLetBatteryCoolToTemperature_nexus5Cool(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertCalls( - (self.call.battery.EnableBatteryUpdates(), []), - (self.call.battery.GetBatteryInfo(), {'temperature': '400'})): - self.battery.LetBatteryCoolToTemperature(400) - - -class BatteryUtilsSupportsFuelGaugeTest(BatteryUtilsTest): - - def testSupportsFuelGauge_false(self): - self.battery._cache['profile'] = self._NEXUS_5 - self.assertFalse(self.battery.SupportsFuelGauge()) - - def testSupportsFuelGauge_trueMax(self): - self.battery._cache['profile'] = self._NEXUS_6 - # TODO(rnephew): Change this to assertTrue when we have support for - # disabling hardware charging on nexus 6. - self.assertFalse(self.battery.SupportsFuelGauge()) - - def testSupportsFuelGauge_trueDS(self): - self.battery._cache['profile'] = self._NEXUS_10 - # TODO(rnephew): Change this to assertTrue when we have support for - # disabling hardware charging on nexus 10. - self.assertFalse(self.battery.SupportsFuelGauge()) - - -class BatteryUtilsGetFuelGaugeChargeCounterTest(BatteryUtilsTest): - - def testGetFuelGaugeChargeCounter_noFuelGauge(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertRaises(device_errors.CommandFailedError): - self.battery.GetFuelGaugeChargeCounter() - - def testGetFuelGaugeChargeCounter_fuelGaugePresent(self): - self.battery._cache['profile'] = self._NEXUS_6 - with self.assertCalls( - (self.call.battery.SupportsFuelGauge(), True), - (self.call.device.ReadFile(mock.ANY), '123')): - self.assertEqual(self.battery.GetFuelGaugeChargeCounter(), 123) - - -class BatteryUtilsSetCharging(BatteryUtilsTest): - - @mock.patch('time.sleep', mock.Mock()) - def testSetCharging_softwareSetTrue(self): - self.battery._cache['profile'] = self._NEXUS_6 - with self.assertCalls( - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'reset'], check_return=True), []), - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']), - (self.call.battery.GetCharging(), True)): - self.battery.SetCharging(True) - - @mock.patch('time.sleep', mock.Mock()) - def testSetCharging_softwareSetFalse(self): - self.battery._cache['profile'] = self._NEXUS_6 - with self.assertCalls( - (self.call.battery.GetCharging(), True), - (self.call.battery._ClearPowerData(), True), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []), - (self.call.battery.GetCharging(), False)): - self.battery.SetCharging(False) - - @mock.patch('time.sleep', mock.Mock()) - def testSetCharging_hardwareSetTrue(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertCalls( - (self.call.battery.GetCharging(), False), - (self.call.battery._HardwareSetCharging(True))): - self.battery.SetCharging(True) - - @mock.patch('time.sleep', mock.Mock()) - def testSetCharging_hardwareSetFalse(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertCalls( - (self.call.battery.GetCharging(), True), - (self.call.battery._ClearPowerData(), True), - (self.call.battery._HardwareSetCharging(False))): - self.battery.SetCharging(False) - - def testSetCharging_expectedStateAlreadyTrue(self): - with self.assertCalls((self.call.battery.GetCharging(), True)): - self.battery.SetCharging(True) - - def testSetCharging_expectedStateAlreadyFalse(self): - with self.assertCalls((self.call.battery.GetCharging(), False)): - self.battery.SetCharging(False) - - -class BatteryUtilsPowerMeasurement(BatteryUtilsTest): - - def testPowerMeasurement_hardware(self): - self.battery._cache['profile'] = self._NEXUS_5 - with self.assertCalls( - (self.call.battery.GetCharging(), True), - (self.call.battery._ClearPowerData(), True), - (self.call.battery._HardwareSetCharging(False)), - (self.call.battery.GetCharging(), False), - (self.call.battery._HardwareSetCharging(True))): - with self.battery.PowerMeasurement(): - pass - - @mock.patch('time.sleep', mock.Mock()) - def testPowerMeasurement_software(self): - self.battery._cache['profile'] = self._NEXUS_6 - with self.assertCalls( - (self.call.battery.GetCharging(), True), - (self.call.battery._ClearPowerData(), True), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []), - (self.call.battery.GetCharging(), False), - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'reset'], check_return=True), []), - (self.call.battery.GetCharging(), False), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']), - (self.call.battery.GetCharging(), True)): - with self.battery.PowerMeasurement(): - pass - - -class BatteryUtilsDiscoverDeviceProfile(BatteryUtilsTest): - - def testDiscoverDeviceProfile_known(self): - with self.patch_call(self.call.device.product_model, - return_value='Nexus 4'): - self.battery._DiscoverDeviceProfile() - self.assertEqual(self.battery._cache['profile']['name'], "Nexus 4") - - def testDiscoverDeviceProfile_unknown(self): - with self.patch_call(self.call.device.product_model, - return_value='Other'): - self.battery._DiscoverDeviceProfile() - self.assertEqual(self.battery._cache['profile']['name'], None) - - -class BatteryUtilsClearPowerData(BatteryUtilsTest): - - def testClearPowerData_preL(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=20): - self.assertFalse(self.battery._ClearPowerData()) - - def testClearPowerData_clearedL(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=22): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True), - []), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '--reset'], check_return=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '--charged', '-c'], - check_return=True, large_output=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'reset'], check_return=True), [])): - self.assertTrue(self.battery._ClearPowerData()) - - def testClearPowerData_notClearedL(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=22): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True), - []), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '--reset'], check_return=True), []), - (self.call.device.RunShellCommand( - ['dumpsys', 'batterystats', '--charged', '-c'], - check_return=True, large_output=True), - ['9,1000,l,pwi,uid,0.0327']), - (self.call.device.RunShellCommand( - ['dumpsys', 'battery', 'reset'], check_return=True), [])): - with self.assertRaises(device_errors.CommandFailedError): - self.battery._ClearPowerData() - - -if __name__ == '__main__': - logging.getLogger().setLevel(logging.DEBUG) - unittest.main(verbosity=2)
diff --git a/build/android/devil/android/constants/__init__.py b/build/android/devil/android/constants/__init__.py deleted file mode 100644 index 50b23df..0000000 --- a/build/android/devil/android/constants/__init__.py +++ /dev/null
@@ -1,3 +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.
diff --git a/build/android/devil/android/constants/file_system.py b/build/android/devil/android/constants/file_system.py deleted file mode 100644 index bffec614..0000000 --- a/build/android/devil/android/constants/file_system.py +++ /dev/null
@@ -1,5 +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. - -TEST_EXECUTABLE_DIR = '/data/local/tmp'
diff --git a/build/android/devil/android/decorators.py b/build/android/devil/android/decorators.py deleted file mode 100644 index 004ac8bc..0000000 --- a/build/android/devil/android/decorators.py +++ /dev/null
@@ -1,174 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -Function/method decorators that provide timeout and retry logic. -""" - -import functools -import itertools -import sys - -from devil.android import device_errors -from devil.utils import cmd_helper -from devil.utils import reraiser_thread -from devil.utils import timeout_retry - -DEFAULT_TIMEOUT_ATTR = '_default_timeout' -DEFAULT_RETRIES_ATTR = '_default_retries' - - -def _TimeoutRetryWrapper( - f, timeout_func, retries_func, retry_if_func=timeout_retry.AlwaysRetry, - pass_values=False): - """ Wraps a funcion with timeout and retry handling logic. - - Args: - f: The function to wrap. - timeout_func: A callable that returns the timeout value. - retries_func: A callable that returns the retries value. - pass_values: If True, passes the values returned by |timeout_func| and - |retries_func| to the wrapped function as 'timeout' and - 'retries' kwargs, respectively. - Returns: - The wrapped function. - """ - @functools.wraps(f) - def timeout_retry_wrapper(*args, **kwargs): - timeout = timeout_func(*args, **kwargs) - retries = retries_func(*args, **kwargs) - if pass_values: - kwargs['timeout'] = timeout - kwargs['retries'] = retries - @functools.wraps(f) - def impl(): - return f(*args, **kwargs) - try: - if timeout_retry.CurrentTimeoutThreadGroup(): - # Don't wrap if there's already an outer timeout thread. - return impl() - else: - desc = '%s(%s)' % (f.__name__, ', '.join(itertools.chain( - (str(a) for a in args), - ('%s=%s' % (k, str(v)) for k, v in kwargs.iteritems())))) - return timeout_retry.Run(impl, timeout, retries, desc=desc, - retry_if_func=retry_if_func) - except reraiser_thread.TimeoutError as e: - raise device_errors.CommandTimeoutError(str(e)), None, ( - sys.exc_info()[2]) - except cmd_helper.TimeoutError as e: - raise device_errors.CommandTimeoutError(str(e)), None, ( - sys.exc_info()[2]) - return timeout_retry_wrapper - - -def WithTimeoutAndRetries(f): - """A decorator that handles timeouts and retries. - - 'timeout' and 'retries' kwargs must be passed to the function. - - Args: - f: The function to decorate. - Returns: - The decorated function. - """ - get_timeout = lambda *a, **kw: kw['timeout'] - get_retries = lambda *a, **kw: kw['retries'] - return _TimeoutRetryWrapper(f, get_timeout, get_retries) - - -def WithTimeoutAndConditionalRetries(retry_if_func): - """Returns a decorator that handles timeouts and, in some cases, retries. - - 'timeout' and 'retries' kwargs must be passed to the function. - - Args: - retry_if_func: A unary callable that takes an exception and returns - whether failures should be retried. - Returns: - The actual decorator. - """ - def decorator(f): - get_timeout = lambda *a, **kw: kw['timeout'] - get_retries = lambda *a, **kw: kw['retries'] - return _TimeoutRetryWrapper( - f, get_timeout, get_retries, retry_if_func=retry_if_func) - return decorator - - -def WithExplicitTimeoutAndRetries(timeout, retries): - """Returns a decorator that handles timeouts and retries. - - The provided |timeout| and |retries| values are always used. - - Args: - timeout: The number of seconds to wait for the decorated function to - return. Always used. - retries: The number of times the decorated function should be retried on - failure. Always used. - Returns: - The actual decorator. - """ - def decorator(f): - get_timeout = lambda *a, **kw: timeout - get_retries = lambda *a, **kw: retries - return _TimeoutRetryWrapper(f, get_timeout, get_retries) - return decorator - - -def WithTimeoutAndRetriesDefaults(default_timeout, default_retries): - """Returns a decorator that handles timeouts and retries. - - The provided |default_timeout| and |default_retries| values are used only - if timeout and retries values are not provided. - - Args: - default_timeout: The number of seconds to wait for the decorated function - to return. Only used if a 'timeout' kwarg is not passed - to the decorated function. - default_retries: The number of times the decorated function should be - retried on failure. Only used if a 'retries' kwarg is not - passed to the decorated function. - Returns: - The actual decorator. - """ - def decorator(f): - get_timeout = lambda *a, **kw: kw.get('timeout', default_timeout) - get_retries = lambda *a, **kw: kw.get('retries', default_retries) - return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True) - return decorator - - -def WithTimeoutAndRetriesFromInstance( - default_timeout_name=DEFAULT_TIMEOUT_ATTR, - default_retries_name=DEFAULT_RETRIES_ATTR, - min_default_timeout=None): - """Returns a decorator that handles timeouts and retries. - - The provided |default_timeout_name| and |default_retries_name| are used to - get the default timeout value and the default retries value from the object - instance if timeout and retries values are not provided. - - Note that this should only be used to decorate methods, not functions. - - Args: - default_timeout_name: The name of the default timeout attribute of the - instance. - default_retries_name: The name of the default retries attribute of the - instance. - min_timeout: Miniumum timeout to be used when using instance timeout. - Returns: - The actual decorator. - """ - def decorator(f): - def get_timeout(inst, *_args, **kwargs): - ret = getattr(inst, default_timeout_name) - if min_default_timeout is not None: - ret = max(min_default_timeout, ret) - return kwargs.get('timeout', ret) - def get_retries(inst, *_args, **kwargs): - return kwargs.get('retries', getattr(inst, default_retries_name)) - return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True) - return decorator -
diff --git a/build/android/devil/android/decorators_test.py b/build/android/devil/android/decorators_test.py deleted file mode 100644 index a00b128..0000000 --- a/build/android/devil/android/decorators_test.py +++ /dev/null
@@ -1,326 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -Unit tests for decorators.py. -""" - -# pylint: disable=W0613 - -import time -import traceback -import unittest - -from devil.android import decorators -from devil.android import device_errors -from devil.utils import reraiser_thread - -_DEFAULT_TIMEOUT = 30 -_DEFAULT_RETRIES = 3 - -class DecoratorsTest(unittest.TestCase): - _decorated_function_called_count = 0 - - def testFunctionDecoratorDoesTimeouts(self): - """Tests that the base decorator handles the timeout logic.""" - DecoratorsTest._decorated_function_called_count = 0 - @decorators.WithTimeoutAndRetries - def alwaysTimesOut(timeout=None, retries=None): - DecoratorsTest._decorated_function_called_count += 1 - time.sleep(100) - - start_time = time.time() - with self.assertRaises(device_errors.CommandTimeoutError): - alwaysTimesOut(timeout=1, retries=0) - elapsed_time = time.time() - start_time - self.assertTrue(elapsed_time >= 1) - self.assertEquals(1, DecoratorsTest._decorated_function_called_count) - - def testFunctionDecoratorDoesRetries(self): - """Tests that the base decorator handles the retries logic.""" - DecoratorsTest._decorated_function_called_count = 0 - @decorators.WithTimeoutAndRetries - def alwaysRaisesCommandFailedError(timeout=None, retries=None): - DecoratorsTest._decorated_function_called_count += 1 - raise device_errors.CommandFailedError('testCommand failed') - - with self.assertRaises(device_errors.CommandFailedError): - alwaysRaisesCommandFailedError(timeout=30, retries=10) - self.assertEquals(11, DecoratorsTest._decorated_function_called_count) - - def testFunctionDecoratorRequiresParams(self): - """Tests that the base decorator requires timeout and retries params.""" - @decorators.WithTimeoutAndRetries - def requiresExplicitTimeoutAndRetries(timeout=None, retries=None): - return (timeout, retries) - - with self.assertRaises(KeyError): - requiresExplicitTimeoutAndRetries() - with self.assertRaises(KeyError): - requiresExplicitTimeoutAndRetries(timeout=10) - with self.assertRaises(KeyError): - requiresExplicitTimeoutAndRetries(retries=0) - expected_timeout = 10 - expected_retries = 1 - (actual_timeout, actual_retries) = ( - requiresExplicitTimeoutAndRetries(timeout=expected_timeout, - retries=expected_retries)) - self.assertEquals(expected_timeout, actual_timeout) - self.assertEquals(expected_retries, actual_retries) - - def testFunctionDecoratorTranslatesReraiserExceptions(self): - """Tests that the explicit decorator translates reraiser exceptions.""" - @decorators.WithTimeoutAndRetries - def alwaysRaisesProvidedException(exception, timeout=None, retries=None): - raise exception - - exception_desc = 'Reraiser thread timeout error' - with self.assertRaises(device_errors.CommandTimeoutError) as e: - alwaysRaisesProvidedException( - reraiser_thread.TimeoutError(exception_desc), - timeout=10, retries=1) - self.assertEquals(exception_desc, str(e.exception)) - - def testConditionalRetriesDecoratorRetries(self): - def do_not_retry_no_adb_error(exc): - return not isinstance(exc, device_errors.NoAdbError) - - actual_tries = [0] - - @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error) - def alwaysRaisesCommandFailedError(timeout=None, retries=None): - actual_tries[0] += 1 - raise device_errors.CommandFailedError('Command failed :(') - - with self.assertRaises(device_errors.CommandFailedError): - alwaysRaisesCommandFailedError(timeout=10, retries=10) - self.assertEquals(11, actual_tries[0]) - - def testConditionalRetriesDecoratorDoesntRetry(self): - def do_not_retry_no_adb_error(exc): - return not isinstance(exc, device_errors.NoAdbError) - - actual_tries = [0] - - @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error) - def alwaysRaisesNoAdbError(timeout=None, retries=None): - actual_tries[0] += 1 - raise device_errors.NoAdbError() - - with self.assertRaises(device_errors.NoAdbError): - alwaysRaisesNoAdbError(timeout=10, retries=10) - self.assertEquals(1, actual_tries[0]) - - def testDefaultsFunctionDecoratorDoesTimeouts(self): - """Tests that the defaults decorator handles timeout logic.""" - DecoratorsTest._decorated_function_called_count = 0 - @decorators.WithTimeoutAndRetriesDefaults(1, 0) - def alwaysTimesOut(timeout=None, retries=None): - DecoratorsTest._decorated_function_called_count += 1 - time.sleep(100) - - start_time = time.time() - with self.assertRaises(device_errors.CommandTimeoutError): - alwaysTimesOut() - elapsed_time = time.time() - start_time - self.assertTrue(elapsed_time >= 1) - self.assertEquals(1, DecoratorsTest._decorated_function_called_count) - - DecoratorsTest._decorated_function_called_count = 0 - with self.assertRaises(device_errors.CommandTimeoutError): - alwaysTimesOut(timeout=2) - elapsed_time = time.time() - start_time - self.assertTrue(elapsed_time >= 2) - self.assertEquals(1, DecoratorsTest._decorated_function_called_count) - - def testDefaultsFunctionDecoratorDoesRetries(self): - """Tests that the defaults decorator handles retries logic.""" - DecoratorsTest._decorated_function_called_count = 0 - @decorators.WithTimeoutAndRetriesDefaults(30, 10) - def alwaysRaisesCommandFailedError(timeout=None, retries=None): - DecoratorsTest._decorated_function_called_count += 1 - raise device_errors.CommandFailedError('testCommand failed') - - with self.assertRaises(device_errors.CommandFailedError): - alwaysRaisesCommandFailedError() - self.assertEquals(11, DecoratorsTest._decorated_function_called_count) - - DecoratorsTest._decorated_function_called_count = 0 - with self.assertRaises(device_errors.CommandFailedError): - alwaysRaisesCommandFailedError(retries=5) - self.assertEquals(6, DecoratorsTest._decorated_function_called_count) - - def testDefaultsFunctionDecoratorPassesValues(self): - """Tests that the defaults decorator passes timeout and retries kwargs.""" - @decorators.WithTimeoutAndRetriesDefaults(30, 10) - def alwaysReturnsTimeouts(timeout=None, retries=None): - return timeout - - self.assertEquals(30, alwaysReturnsTimeouts()) - self.assertEquals(120, alwaysReturnsTimeouts(timeout=120)) - - @decorators.WithTimeoutAndRetriesDefaults(30, 10) - def alwaysReturnsRetries(timeout=None, retries=None): - return retries - - self.assertEquals(10, alwaysReturnsRetries()) - self.assertEquals(1, alwaysReturnsRetries(retries=1)) - - def testDefaultsFunctionDecoratorTranslatesReraiserExceptions(self): - """Tests that the explicit decorator translates reraiser exceptions.""" - @decorators.WithTimeoutAndRetriesDefaults(30, 10) - def alwaysRaisesProvidedException(exception, timeout=None, retries=None): - raise exception - - exception_desc = 'Reraiser thread timeout error' - with self.assertRaises(device_errors.CommandTimeoutError) as e: - alwaysRaisesProvidedException( - reraiser_thread.TimeoutError(exception_desc)) - self.assertEquals(exception_desc, str(e.exception)) - - def testExplicitFunctionDecoratorDoesTimeouts(self): - """Tests that the explicit decorator handles timeout logic.""" - DecoratorsTest._decorated_function_called_count = 0 - @decorators.WithExplicitTimeoutAndRetries(1, 0) - def alwaysTimesOut(): - DecoratorsTest._decorated_function_called_count += 1 - time.sleep(100) - - start_time = time.time() - with self.assertRaises(device_errors.CommandTimeoutError): - alwaysTimesOut() - elapsed_time = time.time() - start_time - self.assertTrue(elapsed_time >= 1) - self.assertEquals(1, DecoratorsTest._decorated_function_called_count) - - def testExplicitFunctionDecoratorDoesRetries(self): - """Tests that the explicit decorator handles retries logic.""" - DecoratorsTest._decorated_function_called_count = 0 - @decorators.WithExplicitTimeoutAndRetries(30, 10) - def alwaysRaisesCommandFailedError(): - DecoratorsTest._decorated_function_called_count += 1 - raise device_errors.CommandFailedError('testCommand failed') - - with self.assertRaises(device_errors.CommandFailedError): - alwaysRaisesCommandFailedError() - self.assertEquals(11, DecoratorsTest._decorated_function_called_count) - - def testExplicitDecoratorTranslatesReraiserExceptions(self): - """Tests that the explicit decorator translates reraiser exceptions.""" - @decorators.WithExplicitTimeoutAndRetries(30, 10) - def alwaysRaisesProvidedException(exception): - raise exception - - exception_desc = 'Reraiser thread timeout error' - with self.assertRaises(device_errors.CommandTimeoutError) as e: - alwaysRaisesProvidedException( - reraiser_thread.TimeoutError(exception_desc)) - self.assertEquals(exception_desc, str(e.exception)) - - class _MethodDecoratorTestObject(object): - """An object suitable for testing the method decorator.""" - - def __init__(self, test_case, default_timeout=_DEFAULT_TIMEOUT, - default_retries=_DEFAULT_RETRIES): - self._test_case = test_case - self.default_timeout = default_timeout - self.default_retries = default_retries - self.function_call_counters = { - 'alwaysRaisesCommandFailedError': 0, - 'alwaysTimesOut': 0, - 'requiresExplicitTimeoutAndRetries': 0, - } - - @decorators.WithTimeoutAndRetriesFromInstance( - 'default_timeout', 'default_retries') - def alwaysTimesOut(self, timeout=None, retries=None): - self.function_call_counters['alwaysTimesOut'] += 1 - time.sleep(100) - self._test_case.assertFalse(True, msg='Failed to time out?') - - @decorators.WithTimeoutAndRetriesFromInstance( - 'default_timeout', 'default_retries') - def alwaysRaisesCommandFailedError(self, timeout=None, retries=None): - self.function_call_counters['alwaysRaisesCommandFailedError'] += 1 - raise device_errors.CommandFailedError('testCommand failed') - - # pylint: disable=no-self-use - - @decorators.WithTimeoutAndRetriesFromInstance( - 'default_timeout', 'default_retries') - def alwaysReturnsTimeout(self, timeout=None, retries=None): - return timeout - - @decorators.WithTimeoutAndRetriesFromInstance( - 'default_timeout', 'default_retries', min_default_timeout=100) - def alwaysReturnsTimeoutWithMin(self, timeout=None, retries=None): - return timeout - - @decorators.WithTimeoutAndRetriesFromInstance( - 'default_timeout', 'default_retries') - def alwaysReturnsRetries(self, timeout=None, retries=None): - return retries - - @decorators.WithTimeoutAndRetriesFromInstance( - 'default_timeout', 'default_retries') - def alwaysRaisesProvidedException(self, exception, timeout=None, - retries=None): - raise exception - - # pylint: enable=no-self-use - - - def testMethodDecoratorDoesTimeout(self): - """Tests that the method decorator handles timeout logic.""" - test_obj = self._MethodDecoratorTestObject(self) - start_time = time.time() - with self.assertRaises(device_errors.CommandTimeoutError): - try: - test_obj.alwaysTimesOut(timeout=1, retries=0) - except: - traceback.print_exc() - raise - elapsed_time = time.time() - start_time - self.assertTrue(elapsed_time >= 1) - self.assertEquals(1, test_obj.function_call_counters['alwaysTimesOut']) - - def testMethodDecoratorDoesRetries(self): - """Tests that the method decorator handles retries logic.""" - test_obj = self._MethodDecoratorTestObject(self) - with self.assertRaises(device_errors.CommandFailedError): - try: - test_obj.alwaysRaisesCommandFailedError(retries=10) - except: - traceback.print_exc() - raise - self.assertEquals( - 11, test_obj.function_call_counters['alwaysRaisesCommandFailedError']) - - def testMethodDecoratorPassesValues(self): - """Tests that the method decorator passes timeout and retries kwargs.""" - test_obj = self._MethodDecoratorTestObject( - self, default_timeout=42, default_retries=31) - self.assertEquals(42, test_obj.alwaysReturnsTimeout()) - self.assertEquals(41, test_obj.alwaysReturnsTimeout(timeout=41)) - self.assertEquals(31, test_obj.alwaysReturnsRetries()) - self.assertEquals(32, test_obj.alwaysReturnsRetries(retries=32)) - - def testMethodDecoratorUsesMiniumumTimeout(self): - test_obj = self._MethodDecoratorTestObject( - self, default_timeout=42, default_retries=31) - self.assertEquals(100, test_obj.alwaysReturnsTimeoutWithMin()) - self.assertEquals(41, test_obj.alwaysReturnsTimeoutWithMin(timeout=41)) - - def testMethodDecoratorTranslatesReraiserExceptions(self): - test_obj = self._MethodDecoratorTestObject(self) - - exception_desc = 'Reraiser thread timeout error' - with self.assertRaises(device_errors.CommandTimeoutError) as e: - test_obj.alwaysRaisesProvidedException( - reraiser_thread.TimeoutError(exception_desc)) - self.assertEquals(exception_desc, str(e.exception)) - -if __name__ == '__main__': - unittest.main(verbosity=2) -
diff --git a/build/android/devil/android/device_blacklist.py b/build/android/devil/android/device_blacklist.py deleted file mode 100644 index 94f9cbe..0000000 --- a/build/android/devil/android/device_blacklist.py +++ /dev/null
@@ -1,71 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import json -import logging -import os -import threading -import time - - -class Blacklist(object): - - def __init__(self, path): - self._blacklist_lock = threading.RLock() - self._path = path - - def Read(self): - """Reads the blacklist from the blacklist file. - - Returns: - A dict containing bad devices. - """ - with self._blacklist_lock: - if not os.path.exists(self._path): - return dict() - - with open(self._path, 'r') as f: - blacklist = json.load(f) - if not isinstance(blacklist, dict): - logging.warning('Ignoring %s: %s (a dict was expected instead)', - self._path, blacklist) - blacklist = dict() - return blacklist - - def Write(self, blacklist): - """Writes the provided blacklist to the blacklist file. - - Args: - blacklist: list of bad devices to write to the blacklist file. - """ - with self._blacklist_lock: - with open(self._path, 'w') as f: - json.dump(blacklist, f) - - def Extend(self, devices, reason='unknown'): - """Adds devices to blacklist file. - - Args: - devices: list of bad devices to be added to the blacklist file. - reason: string specifying the reason for blacklist (eg: 'unauthorized') - """ - timestamp = time.time() - event_info = { - 'timestamp': timestamp, - 'reason': reason, - } - device_dicts = {device: event_info for device in devices} - logging.info('Adding %s to blacklist %s for reason: %s', - ','.join(devices), self._path, reason) - with self._blacklist_lock: - blacklist = self.Read() - blacklist.update(device_dicts) - self.Write(blacklist) - - def Reset(self): - """Erases the blacklist file if it exists.""" - logging.info('Resetting blacklist %s', self._path) - with self._blacklist_lock: - if os.path.exists(self._path): - os.remove(self._path)
diff --git a/build/android/devil/android/device_errors.py b/build/android/devil/android/device_errors.py deleted file mode 100644 index b1b8890..0000000 --- a/build/android/devil/android/device_errors.py +++ /dev/null
@@ -1,124 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -Exception classes raised by AdbWrapper and DeviceUtils. -""" - -from devil import base_error -from devil.utils import cmd_helper - - -class CommandFailedError(base_error.BaseError): - """Exception for command failures.""" - - def __init__(self, message, device_serial=None): - if device_serial is not None: - message = '(device: %s) %s' % (device_serial, message) - self.device_serial = device_serial - super(CommandFailedError, self).__init__(message) - - -class _BaseCommandFailedError(CommandFailedError): - """Base Exception for adb and fastboot command failures.""" - - def __init__(self, args, output, status=None, device_serial=None, - message=None): - self.args = args - self.output = output - self.status = status - if not message: - adb_cmd = ' '.join(cmd_helper.SingleQuote(arg) for arg in self.args) - message = ['adb %s: failed ' % adb_cmd] - if status: - message.append('with exit status %s ' % self.status) - if output: - message.append('and output:\n') - message.extend('- %s\n' % line for line in output.splitlines()) - else: - message.append('and no output.') - message = ''.join(message) - super(_BaseCommandFailedError, self).__init__(message, device_serial) - - -class AdbCommandFailedError(_BaseCommandFailedError): - """Exception for adb command failures.""" - - def __init__(self, args, output, status=None, device_serial=None, - message=None): - super(AdbCommandFailedError, self).__init__( - args, output, status=status, message=message, - device_serial=device_serial) - - -class FastbootCommandFailedError(_BaseCommandFailedError): - """Exception for fastboot command failures.""" - - def __init__(self, args, output, status=None, device_serial=None, - message=None): - super(FastbootCommandFailedError, self).__init__( - args, output, status=status, message=message, - device_serial=device_serial) - - -class DeviceVersionError(CommandFailedError): - """Exception for device version failures.""" - - def __init__(self, message, device_serial=None): - super(DeviceVersionError, self).__init__(message, device_serial) - - -class AdbShellCommandFailedError(AdbCommandFailedError): - """Exception for shell command failures run via adb.""" - - def __init__(self, command, output, status, device_serial=None): - self.command = command - message = ['shell command run via adb failed on the device:\n', - ' command: %s\n' % command] - message.append(' exit status: %s\n' % status) - if output: - message.append(' output:\n') - if isinstance(output, basestring): - output_lines = output.splitlines() - else: - output_lines = output - message.extend(' - %s\n' % line for line in output_lines) - else: - message.append(" output: ''\n") - message = ''.join(message) - super(AdbShellCommandFailedError, self).__init__( - ['shell', command], output, status, device_serial, message) - - -class CommandTimeoutError(base_error.BaseError): - """Exception for command timeouts.""" - pass - - -class DeviceUnreachableError(base_error.BaseError): - """Exception for device unreachable failures.""" - pass - - -class NoDevicesError(base_error.BaseError): - """Exception for having no devices attached.""" - - def __init__(self): - super(NoDevicesError, self).__init__( - 'No devices attached.', is_infra_error=True) - - -class NoAdbError(base_error.BaseError): - """Exception for being unable to find ADB.""" - - def __init__(self, msg=None): - super(NoAdbError, self).__init__( - msg or 'Unable to find adb.', is_infra_error=True) - - -class DeviceChargingError(CommandFailedError): - """Exception for device charging errors.""" - - def __init__(self, message, device_serial=None): - super(DeviceChargingError, self).__init__(message, device_serial)
diff --git a/build/android/devil/android/device_list.py b/build/android/devil/android/device_list.py deleted file mode 100644 index 0eb6acba..0000000 --- a/build/android/devil/android/device_list.py +++ /dev/null
@@ -1,30 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""A module to keep track of devices across builds.""" - -import os - -LAST_DEVICES_FILENAME = '.last_devices' -LAST_MISSING_DEVICES_FILENAME = '.last_missing' - - -def GetPersistentDeviceList(file_name): - """Returns a list of devices. - - Args: - file_name: the file name containing a list of devices. - - Returns: List of device serial numbers that were on the bot. - """ - with open(file_name) as f: - return f.read().splitlines() - - -def WritePersistentDeviceList(file_name, device_list): - path = os.path.dirname(file_name) - if not os.path.exists(path): - os.makedirs(path) - with open(file_name, 'w') as f: - f.write('\n'.join(set(device_list)))
diff --git a/build/android/devil/android/device_signal.py b/build/android/devil/android/device_signal.py deleted file mode 100644 index 6a5b709..0000000 --- a/build/android/devil/android/device_signal.py +++ /dev/null
@@ -1,41 +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. - -"""Defines constants for signals that should be supported on devices. - -Note: Obtained by running `kill -l` on a user device. -""" - - -SIGHUP = 1 # Hangup -SIGINT = 2 # Interrupt -SIGQUIT = 3 # Quit -SIGILL = 4 # Illegal instruction -SIGTRAP = 5 # Trap -SIGABRT = 6 # Aborted -SIGBUS = 7 # Bus error -SIGFPE = 8 # Floating point exception -SIGKILL = 9 # Killed -SIGUSR1 = 10 # User signal 1 -SIGSEGV = 11 # Segmentation fault -SIGUSR2 = 12 # User signal 2 -SIGPIPE = 13 # Broken pipe -SIGALRM = 14 # Alarm clock -SIGTERM = 15 # Terminated -SIGSTKFLT = 16 # Stack fault -SIGCHLD = 17 # Child exited -SIGCONT = 18 # Continue -SIGSTOP = 19 # Stopped (signal) -SIGTSTP = 20 # Stopped -SIGTTIN = 21 # Stopped (tty input) -SIGTTOU = 22 # Stopped (tty output) -SIGURG = 23 # Urgent I/O condition -SIGXCPU = 24 # CPU time limit exceeded -SIGXFSZ = 25 # File size limit exceeded -SIGVTALRM = 26 # Virtual timer expired -SIGPROF = 27 # Profiling timer expired -SIGWINCH = 28 # Window size changed -SIGIO = 29 # I/O possible -SIGPWR = 30 # Power failure -SIGSYS = 31 # Bad system call
diff --git a/build/android/devil/android/device_temp_file.py b/build/android/devil/android/device_temp_file.py deleted file mode 100644 index af2c489..0000000 --- a/build/android/devil/android/device_temp_file.py +++ /dev/null
@@ -1,55 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""A temp file that automatically gets pushed and deleted from a device.""" - -# pylint: disable=W0622 - -import posixpath -import random -import threading - -from devil.android import device_errors -from devil.utils import cmd_helper - - -class DeviceTempFile(object): - def __init__(self, adb, suffix='', prefix='temp_file', dir='/data/local/tmp'): - """Find an unused temporary file path on the device. - - When this object is closed, the file will be deleted on the device. - - Args: - adb: An instance of AdbWrapper - suffix: The suffix of the name of the temp file. - prefix: The prefix of the name of the temp file. - dir: The directory on the device where to place the temp file. - """ - self._adb = adb - # Python's random module use 52-bit numbers according to its docs. - random_hex = hex(random.randint(0, 2 ** 52))[2:] - self.name = posixpath.join(dir, '%s-%s%s' % (prefix, random_hex, suffix)) - self.name_quoted = cmd_helper.SingleQuote(self.name) - - def close(self): - """Deletes the temporary file from the device.""" - # ignore exception if the file is already gone. - def delete_temporary_file(): - try: - self._adb.Shell('rm -f %s' % self.name_quoted, expect_status=None) - except device_errors.AdbCommandFailedError: - # file does not exist on Android version without 'rm -f' support (ICS) - pass - - # It shouldn't matter when the temp file gets deleted, so do so - # asynchronously. - threading.Thread( - target=delete_temporary_file, - name='delete_temporary_file(%s)' % self._adb.GetDeviceSerial()).start() - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - self.close()
diff --git a/build/android/devil/android/device_utils.py b/build/android/devil/android/device_utils.py deleted file mode 100644 index 71ccff4..0000000 --- a/build/android/devil/android/device_utils.py +++ /dev/null
@@ -1,2180 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Provides a variety of device interactions based on adb. - -Eventually, this will be based on adb_wrapper. -""" -# pylint: disable=unused-argument - -import collections -import itertools -import json -import logging -import multiprocessing -import os -import posixpath -import re -import shutil -import tempfile -import time -import zipfile - -from devil import base_error -from devil import devil_env -from devil.utils import cmd_helper -from devil.android import apk_helper -from devil.android import device_signal -from devil.android import decorators -from devil.android import device_errors -from devil.android import device_temp_file -from devil.android import install_commands -from devil.android import logcat_monitor -from devil.android import md5sum -from devil.android.sdk import adb_wrapper -from devil.android.sdk import gce_adb_wrapper -from devil.android.sdk import intent -from devil.android.sdk import keyevent -from devil.android.sdk import split_select -from devil.android.sdk import version_codes -from devil.utils import host_utils -from devil.utils import parallelizer -from devil.utils import reraiser_thread -from devil.utils import timeout_retry -from devil.utils import zip_utils - -_DEFAULT_TIMEOUT = 30 -_DEFAULT_RETRIES = 3 - -# A sentinel object for default values -# TODO(jbudorick,perezju): revisit how default values are handled by -# the timeout_retry decorators. -DEFAULT = object() - -_RESTART_ADBD_SCRIPT = """ - trap '' HUP - trap '' TERM - trap '' PIPE - function restart() { - stop adbd - start adbd - } - restart & -""" - -# Not all permissions can be set. -_PERMISSIONS_BLACKLIST = [ - 'android.permission.ACCESS_MOCK_LOCATION', - 'android.permission.ACCESS_NETWORK_STATE', - 'android.permission.AUTHENTICATE_ACCOUNTS', - 'android.permission.BLUETOOTH', - 'android.permission.BLUETOOTH_ADMIN', - 'android.permission.DOWNLOAD_WITHOUT_NOTIFICATION', - 'android.permission.INTERNET', - 'android.permission.MANAGE_ACCOUNTS', - 'android.permission.MODIFY_AUDIO_SETTINGS', - 'android.permission.NFC', - 'android.permission.READ_SYNC_SETTINGS', - 'android.permission.READ_SYNC_STATS', - 'android.permission.RECEIVE_BOOT_COMPLETED', - 'android.permission.RUN_INSTRUMENTATION', - 'android.permission.USE_CREDENTIALS', - 'android.permission.VIBRATE', - 'android.permission.WAKE_LOCK', - 'android.permission.WRITE_SYNC_SETTINGS', - 'com.android.browser.permission.READ_HISTORY_BOOKMARKS', - 'com.android.browser.permission.WRITE_HISTORY_BOOKMARKS', - 'com.android.launcher.permission.INSTALL_SHORTCUT', - 'com.chrome.permission.DEVICE_EXTRAS', - 'com.google.android.apps.chrome.permission.C2D_MESSAGE', - 'com.google.android.apps.chrome.permission.READ_WRITE_BOOKMARK_FOLDERS', - 'com.google.android.apps.chrome.TOS_ACKED', - 'com.google.android.c2dm.permission.RECEIVE', - 'com.google.android.providers.gsf.permission.READ_GSERVICES', - 'com.sec.enterprise.knox.MDM_CONTENT_PROVIDER', - 'org.chromium.chrome.permission.C2D_MESSAGE', - 'org.chromium.chrome.permission.READ_WRITE_BOOKMARK_FOLDERS', - 'org.chromium.chrome.TOS_ACKED', -] - -_CURRENT_FOCUS_CRASH_RE = re.compile( - r'\s*mCurrentFocus.*Application (Error|Not Responding): (\S+)}') - -_GETPROP_RE = re.compile(r'\[(.*?)\]: \[(.*?)\]') -_IPV4_ADDRESS_RE = re.compile(r'([0-9]{1,3}\.){3}[0-9]{1,3}\:[0-9]{4,5}') - -@decorators.WithExplicitTimeoutAndRetries( - _DEFAULT_TIMEOUT, _DEFAULT_RETRIES) -def GetAVDs(): - """Returns a list of Android Virtual Devices. - - Returns: - A list containing the configured AVDs. - """ - lines = cmd_helper.GetCmdOutput([ - os.path.join(devil_env.config.LocalPath('android_sdk'), - 'tools', 'android'), - 'list', 'avd']).splitlines() - avds = [] - for line in lines: - if 'Name:' not in line: - continue - key, value = (s.strip() for s in line.split(':', 1)) - if key == 'Name': - avds.append(value) - return avds - - -@decorators.WithExplicitTimeoutAndRetries( - _DEFAULT_TIMEOUT, _DEFAULT_RETRIES) -def RestartServer(): - """Restarts the adb server. - - Raises: - CommandFailedError if we fail to kill or restart the server. - """ - def adb_killed(): - return not adb_wrapper.AdbWrapper.IsServerOnline() - - def adb_started(): - return adb_wrapper.AdbWrapper.IsServerOnline() - - adb_wrapper.AdbWrapper.KillServer() - if not timeout_retry.WaitFor(adb_killed, wait_period=1, max_tries=5): - # TODO(perezju): raise an exception after fixng http://crbug.com/442319 - logging.warning('Failed to kill adb server') - adb_wrapper.AdbWrapper.StartServer() - if not timeout_retry.WaitFor(adb_started, wait_period=1, max_tries=5): - raise device_errors.CommandFailedError('Failed to start adb server') - - -def _GetTimeStamp(): - """Return a basic ISO 8601 time stamp with the current local time.""" - return time.strftime('%Y%m%dT%H%M%S', time.localtime()) - - -def _JoinLines(lines): - # makes sure that the last line is also terminated, and is more memory - # efficient than first appending an end-line to each line and then joining - # all of them together. - return ''.join(s for line in lines for s in (line, '\n')) - - -def _IsGceInstance(serial): - return _IPV4_ADDRESS_RE.match(serial) - - -def _CreateAdbWrapper(device): - if _IsGceInstance(str(device)): - return gce_adb_wrapper.GceAdbWrapper(str(device)) - else: - if isinstance(device, adb_wrapper.AdbWrapper): - return device - else: - return adb_wrapper.AdbWrapper(device) - - -class DeviceUtils(object): - - _MAX_ADB_COMMAND_LENGTH = 512 - _MAX_ADB_OUTPUT_LENGTH = 32768 - _LAUNCHER_FOCUSED_RE = re.compile( - r'\s*mCurrentFocus.*(Launcher|launcher).*') - _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$') - - LOCAL_PROPERTIES_PATH = posixpath.join('/', 'data', 'local.prop') - - # Property in /data/local.prop that controls Java assertions. - JAVA_ASSERT_PROPERTY = 'dalvik.vm.enableassertions' - - def __init__(self, device, enable_device_files_cache=False, - default_timeout=_DEFAULT_TIMEOUT, - default_retries=_DEFAULT_RETRIES): - """DeviceUtils constructor. - - Args: - device: Either a device serial, an existing AdbWrapper instance, or an - an existing AndroidCommands instance. - enable_device_files_cache: For PushChangedFiles(), cache checksums of - pushed files rather than recomputing them on a subsequent call. - default_timeout: An integer containing the default number of seconds to - wait for an operation to complete if no explicit value is provided. - default_retries: An integer containing the default number or times an - operation should be retried on failure if no explicit value is provided. - """ - self.adb = None - if isinstance(device, basestring): - self.adb = _CreateAdbWrapper(device) - elif isinstance(device, adb_wrapper.AdbWrapper): - self.adb = device - else: - raise ValueError('Unsupported device value: %r' % device) - self._commands_installed = None - self._default_timeout = default_timeout - self._default_retries = default_retries - self._enable_device_files_cache = enable_device_files_cache - self._cache = {} - self._client_caches = {} - assert hasattr(self, decorators.DEFAULT_TIMEOUT_ATTR) - assert hasattr(self, decorators.DEFAULT_RETRIES_ATTR) - - self._ClearCache() - - def __eq__(self, other): - """Checks whether |other| refers to the same device as |self|. - - Args: - other: The object to compare to. This can be a basestring, an instance - of adb_wrapper.AdbWrapper, or an instance of DeviceUtils. - Returns: - Whether |other| refers to the same device as |self|. - """ - return self.adb.GetDeviceSerial() == str(other) - - def __lt__(self, other): - """Compares two instances of DeviceUtils. - - This merely compares their serial numbers. - - Args: - other: The instance of DeviceUtils to compare to. - Returns: - Whether |self| is less than |other|. - """ - return self.adb.GetDeviceSerial() < other.adb.GetDeviceSerial() - - def __str__(self): - """Returns the device serial.""" - return self.adb.GetDeviceSerial() - - @decorators.WithTimeoutAndRetriesFromInstance() - def IsOnline(self, timeout=None, retries=None): - """Checks whether the device is online. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - True if the device is online, False otherwise. - - Raises: - CommandTimeoutError on timeout. - """ - try: - return self.adb.GetState() == 'device' - except base_error.BaseError as exc: - logging.info('Failed to get state: %s', exc) - return False - - @decorators.WithTimeoutAndRetriesFromInstance() - def HasRoot(self, timeout=None, retries=None): - """Checks whether or not adbd has root privileges. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - True if adbd has root privileges, False otherwise. - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - try: - self.RunShellCommand('ls /root', check_return=True) - return True - except device_errors.AdbCommandFailedError: - return False - - def NeedsSU(self, timeout=DEFAULT, retries=DEFAULT): - """Checks whether 'su' is needed to access protected resources. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - True if 'su' is available on the device and is needed to to access - protected resources; False otherwise if either 'su' is not available - (e.g. because the device has a user build), or not needed (because adbd - already has root privileges). - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - if 'needs_su' not in self._cache: - try: - self.RunShellCommand( - '%s && ! ls /root' % self._Su('ls /root'), check_return=True, - timeout=self._default_timeout if timeout is DEFAULT else timeout, - retries=self._default_retries if retries is DEFAULT else retries) - self._cache['needs_su'] = True - except device_errors.AdbCommandFailedError: - self._cache['needs_su'] = False - return self._cache['needs_su'] - - def _Su(self, command): - if self.build_version_sdk >= version_codes.MARSHMALLOW: - return 'su 0 %s' % command - return 'su -c %s' % command - - @decorators.WithTimeoutAndRetriesFromInstance() - def EnableRoot(self, timeout=None, retries=None): - """Restarts adbd with root privileges. - - Args: - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandFailedError if root could not be enabled. - CommandTimeoutError on timeout. - """ - if self.IsUserBuild(): - raise device_errors.CommandFailedError( - 'Cannot enable root in user builds.', str(self)) - if 'needs_su' in self._cache: - del self._cache['needs_su'] - self.adb.Root() - self.WaitUntilFullyBooted() - - @decorators.WithTimeoutAndRetriesFromInstance() - def IsUserBuild(self, timeout=None, retries=None): - """Checks whether or not the device is running a user build. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - True if the device is running a user build, False otherwise (i.e. if - it's running a userdebug build). - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - return self.build_type == 'user' - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetExternalStoragePath(self, timeout=None, retries=None): - """Get the device's path to its SD card. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - The device's path to its SD card. - - Raises: - CommandFailedError if the external storage path could not be determined. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - if 'external_storage' in self._cache: - return self._cache['external_storage'] - - value = self.RunShellCommand('echo $EXTERNAL_STORAGE', - single_line=True, - check_return=True) - if not value: - raise device_errors.CommandFailedError('$EXTERNAL_STORAGE is not set', - str(self)) - self._cache['external_storage'] = value - return value - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetApplicationPaths(self, package, timeout=None, retries=None): - """Get the paths of the installed apks on the device for the given package. - - Args: - package: Name of the package. - - Returns: - List of paths to the apks on the device for the given package. - """ - return self._GetApplicationPathsInternal(package) - - def _GetApplicationPathsInternal(self, package, skip_cache=False): - cached_result = self._cache['package_apk_paths'].get(package) - if cached_result is not None and not skip_cache: - if package in self._cache['package_apk_paths_to_verify']: - self._cache['package_apk_paths_to_verify'].remove(package) - # Don't verify an app that is not thought to be installed. We are - # concerned only with apps we think are installed having been - # uninstalled manually. - if cached_result and not self.PathExists(cached_result): - cached_result = None - self._cache['package_apk_checksums'].pop(package, 0) - if cached_result is not None: - return list(cached_result) - # 'pm path' is liable to incorrectly exit with a nonzero number starting - # in Lollipop. - # TODO(jbudorick): Check if this is fixed as new Android versions are - # released to put an upper bound on this. - should_check_return = (self.build_version_sdk < version_codes.LOLLIPOP) - output = self.RunShellCommand( - ['pm', 'path', package], check_return=should_check_return) - apks = [] - for line in output: - if not line.startswith('package:'): - raise device_errors.CommandFailedError( - 'pm path returned: %r' % '\n'.join(output), str(self)) - apks.append(line[len('package:'):]) - self._cache['package_apk_paths'][package] = list(apks) - return apks - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetApplicationVersion(self, package, timeout=None, retries=None): - """Get the version name of a package installed on the device. - - Args: - package: Name of the package. - - Returns: - A string with the version name or None if the package is not found - on the device. - """ - output = self.RunShellCommand( - ['dumpsys', 'package', package], check_return=True) - if not output: - return None - for line in output: - line = line.strip() - if line.startswith('versionName='): - return line[len('versionName='):] - raise device_errors.CommandFailedError( - 'Version name for %s not found on dumpsys output' % package, str(self)) - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetApplicationDataDirectory(self, package, timeout=None, retries=None): - """Get the data directory on the device for the given package. - - Args: - package: Name of the package. - - Returns: - The package's data directory, or None if the package doesn't exist on the - device. - """ - try: - output = self._RunPipedShellCommand( - 'pm dump %s | grep dataDir=' % cmd_helper.SingleQuote(package)) - for line in output: - _, _, dataDir = line.partition('dataDir=') - if dataDir: - return dataDir - except device_errors.CommandFailedError: - logging.exception('Could not find data directory for %s', package) - return None - - @decorators.WithTimeoutAndRetriesFromInstance() - def WaitUntilFullyBooted(self, wifi=False, timeout=None, retries=None): - """Wait for the device to fully boot. - - This means waiting for the device to boot, the package manager to be - available, and the SD card to be ready. It can optionally mean waiting - for wifi to come up, too. - - Args: - wifi: A boolean indicating if we should wait for wifi to come up or not. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandFailedError on failure. - CommandTimeoutError if one of the component waits times out. - DeviceUnreachableError if the device becomes unresponsive. - """ - def sd_card_ready(): - try: - self.RunShellCommand(['test', '-d', self.GetExternalStoragePath()], - check_return=True) - return True - except device_errors.AdbCommandFailedError: - return False - - def pm_ready(): - try: - return self._GetApplicationPathsInternal('android', skip_cache=True) - except device_errors.CommandFailedError: - return False - - def boot_completed(): - return self.GetProp('sys.boot_completed', cache=False) == '1' - - def wifi_enabled(): - return 'Wi-Fi is enabled' in self.RunShellCommand(['dumpsys', 'wifi'], - check_return=False) - - self.adb.WaitForDevice() - timeout_retry.WaitFor(sd_card_ready) - timeout_retry.WaitFor(pm_ready) - timeout_retry.WaitFor(boot_completed) - if wifi: - timeout_retry.WaitFor(wifi_enabled) - - REBOOT_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT - - @decorators.WithTimeoutAndRetriesFromInstance( - min_default_timeout=REBOOT_DEFAULT_TIMEOUT) - def Reboot(self, block=True, wifi=False, timeout=None, retries=None): - """Reboot the device. - - Args: - block: A boolean indicating if we should wait for the reboot to complete. - wifi: A boolean indicating if we should wait for wifi to be enabled after - the reboot. The option has no effect unless |block| is also True. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - def device_offline(): - return not self.IsOnline() - - self.adb.Reboot() - self._ClearCache() - timeout_retry.WaitFor(device_offline, wait_period=1) - if block: - self.WaitUntilFullyBooted(wifi=wifi) - - INSTALL_DEFAULT_TIMEOUT = 4 * _DEFAULT_TIMEOUT - - @decorators.WithTimeoutAndRetriesFromInstance( - min_default_timeout=INSTALL_DEFAULT_TIMEOUT) - def Install(self, apk, allow_downgrade=False, reinstall=False, - permissions=None, timeout=None, retries=None): - """Install an APK. - - Noop if an identical APK is already installed. - - Args: - apk: An ApkHelper instance or string containing the path to the APK. - allow_downgrade: A boolean indicating if we should allow downgrades. - reinstall: A boolean indicating if we should keep any existing app data. - permissions: Set of permissions to set. If not set, finds permissions with - apk helper. To set no permissions, pass []. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandFailedError if the installation fails. - CommandTimeoutError if the installation times out. - DeviceUnreachableError on missing device. - """ - self._InstallInternal(apk, None, allow_downgrade=allow_downgrade, - reinstall=reinstall, permissions=permissions) - - @decorators.WithTimeoutAndRetriesFromInstance( - min_default_timeout=INSTALL_DEFAULT_TIMEOUT) - def InstallSplitApk(self, base_apk, split_apks, allow_downgrade=False, - reinstall=False, allow_cached_props=False, - permissions=None, timeout=None, retries=None): - """Install a split APK. - - Noop if all of the APK splits are already installed. - - Args: - base_apk: An ApkHelper instance or string containing the path to the base - APK. - split_apks: A list of strings of paths of all of the APK splits. - allow_downgrade: A boolean indicating if we should allow downgrades. - reinstall: A boolean indicating if we should keep any existing app data. - allow_cached_props: Whether to use cached values for device properties. - permissions: Set of permissions to set. If not set, finds permissions with - apk helper. To set no permissions, pass []. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandFailedError if the installation fails. - CommandTimeoutError if the installation times out. - DeviceUnreachableError on missing device. - DeviceVersionError if device SDK is less than Android L. - """ - self._InstallInternal(base_apk, split_apks, reinstall=reinstall, - allow_cached_props=allow_cached_props, - permissions=permissions, - allow_downgrade=allow_downgrade) - - def _InstallInternal(self, base_apk, split_apks, allow_downgrade=False, - reinstall=False, allow_cached_props=False, - permissions=None): - if split_apks: - self._CheckSdkLevel(version_codes.LOLLIPOP) - - base_apk = apk_helper.ToHelper(base_apk) - - all_apks = [base_apk.path] - if split_apks: - all_apks += split_select.SelectSplits( - self, base_apk.path, split_apks, allow_cached_props=allow_cached_props) - if len(all_apks) == 1: - logging.warning('split-select did not select any from %s', split_apks) - - package_name = base_apk.GetPackageName() - device_apk_paths = self._GetApplicationPathsInternal(package_name) - - apks_to_install = None - host_checksums = None - if not device_apk_paths: - apks_to_install = all_apks - elif len(device_apk_paths) > 1 and not split_apks: - logging.warning( - 'Installing non-split APK when split APK was previously installed') - apks_to_install = all_apks - elif len(device_apk_paths) == 1 and split_apks: - logging.warning( - 'Installing split APK when non-split APK was previously installed') - apks_to_install = all_apks - else: - try: - apks_to_install, host_checksums = ( - self._ComputeStaleApks(package_name, all_apks)) - except EnvironmentError as e: - logging.warning('Error calculating md5: %s', e) - apks_to_install, host_checksums = all_apks, None - if apks_to_install and not reinstall: - self.Uninstall(package_name) - apks_to_install = all_apks - - if apks_to_install: - # Assume that we won't know the resulting device state. - self._cache['package_apk_paths'].pop(package_name, 0) - self._cache['package_apk_checksums'].pop(package_name, 0) - if split_apks: - partial = package_name if len(apks_to_install) < len(all_apks) else None - self.adb.InstallMultiple( - apks_to_install, partial=partial, reinstall=reinstall, - allow_downgrade=allow_downgrade) - else: - self.adb.Install( - base_apk.path, reinstall=reinstall, allow_downgrade=allow_downgrade) - if (permissions is None - and self.build_version_sdk >= version_codes.MARSHMALLOW): - permissions = base_apk.GetPermissions() - self.GrantPermissions(package_name, permissions) - # Upon success, we know the device checksums, but not their paths. - if host_checksums is not None: - self._cache['package_apk_checksums'][package_name] = host_checksums - else: - # Running adb install terminates running instances of the app, so to be - # consistent, we explicitly terminate it when skipping the install. - self.ForceStop(package_name) - - @decorators.WithTimeoutAndRetriesFromInstance() - def Uninstall(self, package_name, keep_data=False, timeout=None, - retries=None): - """Remove the app |package_name| from the device. - - This is a no-op if the app is not already installed. - - Args: - package_name: The package to uninstall. - keep_data: (optional) Whether to keep the data and cache directories. - timeout: Timeout in seconds. - retries: Number of retries. - - Raises: - CommandFailedError if the uninstallation fails. - CommandTimeoutError if the uninstallation times out. - DeviceUnreachableError on missing device. - """ - installed = self._GetApplicationPathsInternal(package_name) - if not installed: - return - try: - self.adb.Uninstall(package_name, keep_data) - self._cache['package_apk_paths'][package_name] = [] - self._cache['package_apk_checksums'][package_name] = set() - except: - # Clear cache since we can't be sure of the state. - self._cache['package_apk_paths'].pop(package_name, 0) - self._cache['package_apk_checksums'].pop(package_name, 0) - raise - - def _CheckSdkLevel(self, required_sdk_level): - """Raises an exception if the device does not have the required SDK level. - """ - if self.build_version_sdk < required_sdk_level: - raise device_errors.DeviceVersionError( - ('Requires SDK level %s, device is SDK level %s' % - (required_sdk_level, self.build_version_sdk)), - device_serial=self.adb.GetDeviceSerial()) - - - @decorators.WithTimeoutAndRetriesFromInstance() - def RunShellCommand(self, cmd, check_return=False, cwd=None, env=None, - as_root=False, single_line=False, large_output=False, - timeout=None, retries=None): - """Run an ADB shell command. - - The command to run |cmd| should be a sequence of program arguments or else - a single string. - - When |cmd| is a sequence, it is assumed to contain the name of the command - to run followed by its arguments. In this case, arguments are passed to the - command exactly as given, without any further processing by the shell. This - allows to easily pass arguments containing spaces or special characters - without having to worry about getting quoting right. Whenever possible, it - is recomended to pass |cmd| as a sequence. - - When |cmd| is given as a string, it will be interpreted and run by the - shell on the device. - - This behaviour is consistent with that of command runners in cmd_helper as - well as Python's own subprocess.Popen. - - TODO(perezju) Change the default of |check_return| to True when callers - have switched to the new behaviour. - - Args: - cmd: A string with the full command to run on the device, or a sequence - containing the command and its arguments. - check_return: A boolean indicating whether or not the return code should - be checked. - cwd: The device directory in which the command should be run. - env: The environment variables with which the command should be run. - as_root: A boolean indicating whether the shell command should be run - with root privileges. - single_line: A boolean indicating if only a single line of output is - expected. - large_output: Uses a work-around for large shell command output. Without - this large output will be truncated. - timeout: timeout in seconds - retries: number of retries - - Returns: - If single_line is False, the output of the command as a list of lines, - otherwise, a string with the unique line of output emmited by the command - (with the optional newline at the end stripped). - - Raises: - AdbCommandFailedError if check_return is True and the exit code of - the command run on the device is non-zero. - CommandFailedError if single_line is True but the output contains two or - more lines. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - def env_quote(key, value): - if not DeviceUtils._VALID_SHELL_VARIABLE.match(key): - raise KeyError('Invalid shell variable name %r' % key) - # using double quotes here to allow interpolation of shell variables - return '%s=%s' % (key, cmd_helper.DoubleQuote(value)) - - def run(cmd): - return self.adb.Shell(cmd) - - def handle_check_return(cmd): - try: - return run(cmd) - except device_errors.AdbCommandFailedError as exc: - if check_return: - raise - else: - return exc.output - - def handle_large_command(cmd): - if len(cmd) < self._MAX_ADB_COMMAND_LENGTH: - return handle_check_return(cmd) - else: - with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script: - self._WriteFileWithPush(script.name, cmd) - logging.info('Large shell command will be run from file: %s ...', - cmd[:self._MAX_ADB_COMMAND_LENGTH]) - return handle_check_return('sh %s' % script.name_quoted) - - def handle_large_output(cmd, large_output_mode): - if large_output_mode: - with device_temp_file.DeviceTempFile(self.adb) as large_output_file: - cmd = '( %s )>%s' % (cmd, large_output_file.name) - logging.debug('Large output mode enabled. Will write output to ' - 'device and read results from file.') - handle_large_command(cmd) - return self.ReadFile(large_output_file.name, force_pull=True) - else: - try: - return handle_large_command(cmd) - except device_errors.AdbCommandFailedError as exc: - if exc.status is None: - logging.exception('No output found for %s', cmd) - logging.warning('Attempting to run in large_output mode.') - logging.warning('Use RunShellCommand(..., large_output=True) for ' - 'shell commands that expect a lot of output.') - return handle_large_output(cmd, True) - else: - raise - - if not isinstance(cmd, basestring): - cmd = ' '.join(cmd_helper.SingleQuote(s) for s in cmd) - if env: - env = ' '.join(env_quote(k, v) for k, v in env.iteritems()) - cmd = '%s %s' % (env, cmd) - if cwd: - cmd = 'cd %s && %s' % (cmd_helper.SingleQuote(cwd), cmd) - if as_root and self.NeedsSU(): - # "su -c sh -c" allows using shell features in |cmd| - cmd = self._Su('sh -c %s' % cmd_helper.SingleQuote(cmd)) - - output = handle_large_output(cmd, large_output).splitlines() - - if single_line: - if not output: - return '' - elif len(output) == 1: - return output[0] - else: - msg = 'one line of output was expected, but got: %s' - raise device_errors.CommandFailedError(msg % output, str(self)) - else: - return output - - def _RunPipedShellCommand(self, script, **kwargs): - PIPESTATUS_LEADER = 'PIPESTATUS: ' - - script += '; echo "%s${PIPESTATUS[@]}"' % PIPESTATUS_LEADER - kwargs['check_return'] = True - output = self.RunShellCommand(script, **kwargs) - pipestatus_line = output[-1] - - if not pipestatus_line.startswith(PIPESTATUS_LEADER): - logging.error('Pipe exit statuses of shell script missing.') - raise device_errors.AdbShellCommandFailedError( - script, output, status=None, - device_serial=self.adb.GetDeviceSerial()) - - output = output[:-1] - statuses = [ - int(s) for s in pipestatus_line[len(PIPESTATUS_LEADER):].split()] - if any(statuses): - raise device_errors.AdbShellCommandFailedError( - script, output, status=statuses, - device_serial=self.adb.GetDeviceSerial()) - return output - - @decorators.WithTimeoutAndRetriesFromInstance() - def KillAll(self, process_name, exact=False, signum=device_signal.SIGKILL, - as_root=False, blocking=False, quiet=False, - timeout=None, retries=None): - """Kill all processes with the given name on the device. - - Args: - process_name: A string containing the name of the process to kill. - exact: A boolean indicating whether to kill all processes matching - the string |process_name| exactly, or all of those which contain - |process_name| as a substring. Defaults to False. - signum: An integer containing the signal number to send to kill. Defaults - to SIGKILL (9). - as_root: A boolean indicating whether the kill should be executed with - root privileges. - blocking: A boolean indicating whether we should wait until all processes - with the given |process_name| are dead. - quiet: A boolean indicating whether to ignore the fact that no processes - to kill were found. - timeout: timeout in seconds - retries: number of retries - - Returns: - The number of processes attempted to kill. - - Raises: - CommandFailedError if no process was killed and |quiet| is False. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - procs_pids = self.GetPids(process_name) - if exact: - procs_pids = {process_name: procs_pids.get(process_name, [])} - pids = set(itertools.chain(*procs_pids.values())) - if not pids: - if quiet: - return 0 - else: - raise device_errors.CommandFailedError( - 'No process "%s"' % process_name, str(self)) - - logging.info( - 'KillAll(%r, ...) attempting to kill the following:', process_name) - for name, ids in procs_pids.iteritems(): - for i in ids: - logging.info(' %05s %s', str(i), name) - - cmd = ['kill', '-%d' % signum] + sorted(pids) - self.RunShellCommand(cmd, as_root=as_root, check_return=True) - - def all_pids_killed(): - procs_pids_remain = self.GetPids(process_name) - return not pids.intersection(itertools.chain(*procs_pids_remain.values())) - - if blocking: - timeout_retry.WaitFor(all_pids_killed, wait_period=0.1) - - return len(pids) - - @decorators.WithTimeoutAndRetriesFromInstance() - def StartActivity(self, intent_obj, blocking=False, trace_file_name=None, - force_stop=False, timeout=None, retries=None): - """Start package's activity on the device. - - Args: - intent_obj: An Intent object to send. - blocking: A boolean indicating whether we should wait for the activity to - finish launching. - trace_file_name: If present, a string that both indicates that we want to - profile the activity and contains the path to which the - trace should be saved. - force_stop: A boolean indicating whether we should stop the activity - before starting it. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandFailedError if the activity could not be started. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - cmd = ['am', 'start'] - if blocking: - cmd.append('-W') - if trace_file_name: - cmd.extend(['--start-profiler', trace_file_name]) - if force_stop: - cmd.append('-S') - cmd.extend(intent_obj.am_args) - for line in self.RunShellCommand(cmd, check_return=True): - if line.startswith('Error:'): - raise device_errors.CommandFailedError(line, str(self)) - - @decorators.WithTimeoutAndRetriesFromInstance() - def StartInstrumentation(self, component, finish=True, raw=False, - extras=None, timeout=None, retries=None): - if extras is None: - extras = {} - - cmd = ['am', 'instrument'] - if finish: - cmd.append('-w') - if raw: - cmd.append('-r') - for k, v in extras.iteritems(): - cmd.extend(['-e', str(k), str(v)]) - cmd.append(component) - - # Store the package name in a shell variable to help the command stay under - # the _MAX_ADB_COMMAND_LENGTH limit. - package = component.split('/')[0] - shell_snippet = 'p=%s;%s' % (package, - cmd_helper.ShrinkToSnippet(cmd, 'p', package)) - return self.RunShellCommand(shell_snippet, check_return=True, - large_output=True) - - @decorators.WithTimeoutAndRetriesFromInstance() - def BroadcastIntent(self, intent_obj, timeout=None, retries=None): - """Send a broadcast intent. - - Args: - intent: An Intent to broadcast. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - cmd = ['am', 'broadcast'] + intent_obj.am_args - self.RunShellCommand(cmd, check_return=True) - - @decorators.WithTimeoutAndRetriesFromInstance() - def GoHome(self, timeout=None, retries=None): - """Return to the home screen and obtain launcher focus. - - This command launches the home screen and attempts to obtain - launcher focus until the timeout is reached. - - Args: - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - def is_launcher_focused(): - output = self.RunShellCommand(['dumpsys', 'window', 'windows'], - check_return=True, large_output=True) - return any(self._LAUNCHER_FOCUSED_RE.match(l) for l in output) - - def dismiss_popups(): - # There is a dialog present; attempt to get rid of it. - # Not all dialogs can be dismissed with back. - self.SendKeyEvent(keyevent.KEYCODE_ENTER) - self.SendKeyEvent(keyevent.KEYCODE_BACK) - return is_launcher_focused() - - # If Home is already focused, return early to avoid unnecessary work. - if is_launcher_focused(): - return - - self.StartActivity( - intent.Intent(action='android.intent.action.MAIN', - category='android.intent.category.HOME'), - blocking=True) - - if not is_launcher_focused(): - timeout_retry.WaitFor(dismiss_popups, wait_period=1) - - @decorators.WithTimeoutAndRetriesFromInstance() - def ForceStop(self, package, timeout=None, retries=None): - """Close the application. - - Args: - package: A string containing the name of the package to stop. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - cmd = 'p=%s;if [[ "$(ps)" = *$p* ]]; then am force-stop $p; fi' - self.RunShellCommand(cmd % package, check_return=True) - - @decorators.WithTimeoutAndRetriesFromInstance() - def ClearApplicationState( - self, package, permissions=None, timeout=None, retries=None): - """Clear all state for the given package. - - Args: - package: A string containing the name of the package to stop. - permissions: List of permissions to set after clearing data. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - # Check that the package exists before clearing it for android builds below - # JB MR2. Necessary because calling pm clear on a package that doesn't exist - # may never return. - if ((self.build_version_sdk >= version_codes.JELLY_BEAN_MR2) - or self._GetApplicationPathsInternal(package)): - self.RunShellCommand(['pm', 'clear', package], check_return=True) - self.GrantPermissions(package, permissions) - - @decorators.WithTimeoutAndRetriesFromInstance() - def SendKeyEvent(self, keycode, timeout=None, retries=None): - """Sends a keycode to the device. - - See the devil.android.sdk.keyevent module for suitable keycode values. - - Args: - keycode: A integer keycode to send to the device. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - self.RunShellCommand(['input', 'keyevent', format(keycode, 'd')], - check_return=True) - - PUSH_CHANGED_FILES_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT - - @decorators.WithTimeoutAndRetriesFromInstance( - min_default_timeout=PUSH_CHANGED_FILES_DEFAULT_TIMEOUT) - def PushChangedFiles(self, host_device_tuples, timeout=None, - retries=None, delete_device_stale=False): - """Push files to the device, skipping files that don't need updating. - - When a directory is pushed, it is traversed recursively on the host and - all files in it are pushed to the device as needed. - Additionally, if delete_device_stale option is True, - files that exist on the device but don't exist on the host are deleted. - - Args: - host_device_tuples: A list of (host_path, device_path) tuples, where - |host_path| is an absolute path of a file or directory on the host - that should be minimially pushed to the device, and |device_path| is - an absolute path of the destination on the device. - timeout: timeout in seconds - retries: number of retries - delete_device_stale: option to delete stale files on device - - Raises: - CommandFailedError on failure. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - - all_changed_files = [] - all_stale_files = [] - missing_dirs = [] - cache_commit_funcs = [] - for h, d in host_device_tuples: - assert os.path.isabs(h) and posixpath.isabs(d) - changed_files, up_to_date_files, stale_files, cache_commit_func = ( - self._GetChangedAndStaleFiles(h, d, delete_device_stale)) - all_changed_files += changed_files - all_stale_files += stale_files - cache_commit_funcs.append(cache_commit_func) - if (os.path.isdir(h) and changed_files and not up_to_date_files - and not stale_files): - missing_dirs.append(d) - - if delete_device_stale and all_stale_files: - self.RunShellCommand(['rm', '-f'] + all_stale_files, - check_return=True) - - if all_changed_files: - if missing_dirs: - self.RunShellCommand(['mkdir', '-p'] + missing_dirs, check_return=True) - self._PushFilesImpl(host_device_tuples, all_changed_files) - for func in cache_commit_funcs: - func() - - def _GetChangedAndStaleFiles(self, host_path, device_path, track_stale=False): - """Get files to push and delete - - Args: - host_path: an absolute path of a file or directory on the host - device_path: an absolute path of a file or directory on the device - track_stale: whether to bother looking for stale files (slower) - - Returns: - a three-element tuple - 1st element: a list of (host_files_path, device_files_path) tuples to push - 2nd element: a list of host_files_path that are up-to-date - 3rd element: a list of stale files under device_path, or [] when - track_stale == False - """ - try: - # Length calculations below assume no trailing /. - host_path = host_path.rstrip('/') - device_path = device_path.rstrip('/') - - specific_device_paths = [device_path] - ignore_other_files = not track_stale and os.path.isdir(host_path) - if ignore_other_files: - specific_device_paths = [] - for root, _, filenames in os.walk(host_path): - relative_dir = root[len(host_path) + 1:] - specific_device_paths.extend( - posixpath.join(device_path, relative_dir, f) for f in filenames) - - def calculate_host_checksums(): - return md5sum.CalculateHostMd5Sums([host_path]) - - def calculate_device_checksums(): - if self._enable_device_files_cache: - cache_entry = self._cache['device_path_checksums'].get(device_path) - if cache_entry and cache_entry[0] == ignore_other_files: - return dict(cache_entry[1]) - - sums = md5sum.CalculateDeviceMd5Sums(specific_device_paths, self) - - cache_entry = [ignore_other_files, sums] - self._cache['device_path_checksums'][device_path] = cache_entry - return dict(sums) - - host_checksums, device_checksums = reraiser_thread.RunAsync(( - calculate_host_checksums, - calculate_device_checksums)) - except EnvironmentError as e: - logging.warning('Error calculating md5: %s', e) - return ([(host_path, device_path)], [], [], lambda: 0) - - to_push = [] - up_to_date = [] - to_delete = [] - if os.path.isfile(host_path): - host_checksum = host_checksums.get(host_path) - device_checksum = device_checksums.get(device_path) - if host_checksum == device_checksum: - up_to_date.append(host_path) - else: - to_push.append((host_path, device_path)) - else: - for host_abs_path, host_checksum in host_checksums.iteritems(): - device_abs_path = posixpath.join( - device_path, os.path.relpath(host_abs_path, host_path)) - device_checksum = device_checksums.pop(device_abs_path, None) - if device_checksum == host_checksum: - up_to_date.append(host_abs_path) - else: - to_push.append((host_abs_path, device_abs_path)) - to_delete = device_checksums.keys() - - def cache_commit_func(): - new_sums = {posixpath.join(device_path, path[len(host_path) + 1:]): val - for path, val in host_checksums.iteritems()} - cache_entry = [ignore_other_files, new_sums] - self._cache['device_path_checksums'][device_path] = cache_entry - - return (to_push, up_to_date, to_delete, cache_commit_func) - - def _ComputeDeviceChecksumsForApks(self, package_name): - ret = self._cache['package_apk_checksums'].get(package_name) - if ret is None: - device_paths = self._GetApplicationPathsInternal(package_name) - file_to_checksums = md5sum.CalculateDeviceMd5Sums(device_paths, self) - ret = set(file_to_checksums.values()) - self._cache['package_apk_checksums'][package_name] = ret - return ret - - def _ComputeStaleApks(self, package_name, host_apk_paths): - def calculate_host_checksums(): - return md5sum.CalculateHostMd5Sums(host_apk_paths) - - def calculate_device_checksums(): - return self._ComputeDeviceChecksumsForApks(package_name) - - host_checksums, device_checksums = reraiser_thread.RunAsync(( - calculate_host_checksums, calculate_device_checksums)) - stale_apks = [k for (k, v) in host_checksums.iteritems() - if v not in device_checksums] - return stale_apks, set(host_checksums.values()) - - def _PushFilesImpl(self, host_device_tuples, files): - if not files: - return - - size = sum(host_utils.GetRecursiveDiskUsage(h) for h, _ in files) - file_count = len(files) - dir_size = sum(host_utils.GetRecursiveDiskUsage(h) - for h, _ in host_device_tuples) - dir_file_count = 0 - for h, _ in host_device_tuples: - if os.path.isdir(h): - dir_file_count += sum(len(f) for _r, _d, f in os.walk(h)) - else: - dir_file_count += 1 - - push_duration = self._ApproximateDuration( - file_count, file_count, size, False) - dir_push_duration = self._ApproximateDuration( - len(host_device_tuples), dir_file_count, dir_size, False) - zip_duration = self._ApproximateDuration(1, 1, size, True) - - if dir_push_duration < push_duration and dir_push_duration < zip_duration: - self._PushChangedFilesIndividually(host_device_tuples) - elif push_duration < zip_duration: - self._PushChangedFilesIndividually(files) - elif self._commands_installed is False: - # Already tried and failed to install unzip command. - self._PushChangedFilesIndividually(files) - elif not self._PushChangedFilesZipped( - files, [d for _, d in host_device_tuples]): - self._PushChangedFilesIndividually(files) - - def _MaybeInstallCommands(self): - if self._commands_installed is None: - try: - if not install_commands.Installed(self): - install_commands.InstallCommands(self) - self._commands_installed = True - except device_errors.CommandFailedError as e: - logging.warning('unzip not available: %s', str(e)) - self._commands_installed = False - return self._commands_installed - - @staticmethod - def _ApproximateDuration(adb_calls, file_count, byte_count, is_zipping): - # We approximate the time to push a set of files to a device as: - # t = c1 * a + c2 * f + c3 + b / c4 + b / (c5 * c6), where - # t: total time (sec) - # c1: adb call time delay (sec) - # a: number of times adb is called (unitless) - # c2: push time delay (sec) - # f: number of files pushed via adb (unitless) - # c3: zip time delay (sec) - # c4: zip rate (bytes/sec) - # b: total number of bytes (bytes) - # c5: transfer rate (bytes/sec) - # c6: compression ratio (unitless) - - # All of these are approximations. - ADB_CALL_PENALTY = 0.1 # seconds - ADB_PUSH_PENALTY = 0.01 # seconds - ZIP_PENALTY = 2.0 # seconds - ZIP_RATE = 10000000.0 # bytes / second - TRANSFER_RATE = 2000000.0 # bytes / second - COMPRESSION_RATIO = 2.0 # unitless - - adb_call_time = ADB_CALL_PENALTY * adb_calls - adb_push_setup_time = ADB_PUSH_PENALTY * file_count - if is_zipping: - zip_time = ZIP_PENALTY + byte_count / ZIP_RATE - transfer_time = byte_count / (TRANSFER_RATE * COMPRESSION_RATIO) - else: - zip_time = 0 - transfer_time = byte_count / TRANSFER_RATE - return adb_call_time + adb_push_setup_time + zip_time + transfer_time - - def _PushChangedFilesIndividually(self, files): - for h, d in files: - self.adb.Push(h, d) - - def _PushChangedFilesZipped(self, files, dirs): - with tempfile.NamedTemporaryFile(suffix='.zip') as zip_file: - zip_proc = multiprocessing.Process( - target=DeviceUtils._CreateDeviceZip, - args=(zip_file.name, files)) - zip_proc.start() - try: - # While it's zipping, ensure the unzip command exists on the device. - if not self._MaybeInstallCommands(): - zip_proc.terminate() - return False - - # Warm up NeedsSU cache while we're still zipping. - self.NeedsSU() - with device_temp_file.DeviceTempFile( - self.adb, suffix='.zip') as device_temp: - zip_proc.join() - self.adb.Push(zip_file.name, device_temp.name) - quoted_dirs = ' '.join(cmd_helper.SingleQuote(d) for d in dirs) - self.RunShellCommand( - 'unzip %s&&chmod -R 777 %s' % (device_temp.name, quoted_dirs), - as_root=True, - env={'PATH': '%s:$PATH' % install_commands.BIN_DIR}, - check_return=True) - finally: - if zip_proc.is_alive(): - zip_proc.terminate() - return True - - @staticmethod - def _CreateDeviceZip(zip_path, host_device_tuples): - with zipfile.ZipFile(zip_path, 'w') as zip_file: - for host_path, device_path in host_device_tuples: - zip_utils.WriteToZipFile(zip_file, host_path, device_path) - - # TODO(nednguyen): remove this and migrate the callsite to PathExists(). - @decorators.WithTimeoutAndRetriesFromInstance() - def FileExists(self, device_path, timeout=None, retries=None): - """Checks whether the given file exists on the device. - - Arguments are the same as PathExists. - """ - return self.PathExists(device_path, timeout=timeout, retries=retries) - - @decorators.WithTimeoutAndRetriesFromInstance() - def PathExists(self, device_paths, as_root=False, timeout=None, retries=None): - """Checks whether the given path(s) exists on the device. - - Args: - device_path: A string containing the absolute path to the file on the - device, or an iterable of paths to check. - as_root: Whether root permissions should be use to check for the existence - of the given path(s). - timeout: timeout in seconds - retries: number of retries - - Returns: - True if the all given paths exist on the device, False otherwise. - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - paths = device_paths - if isinstance(paths, basestring): - paths = (paths,) - condition = ' -a '.join('-e %s' % cmd_helper.SingleQuote(p) for p in paths) - cmd = 'test %s' % condition - try: - self.RunShellCommand(cmd, as_root=as_root, check_return=True, - timeout=timeout, retries=retries) - return True - except device_errors.CommandFailedError: - return False - - @decorators.WithTimeoutAndRetriesFromInstance() - def PullFile(self, device_path, host_path, timeout=None, retries=None): - """Pull a file from the device. - - Args: - device_path: A string containing the absolute path of the file to pull - from the device. - host_path: A string containing the absolute path of the destination on - the host. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandFailedError on failure. - CommandTimeoutError on timeout. - """ - # Create the base dir if it doesn't exist already - dirname = os.path.dirname(host_path) - if dirname and not os.path.exists(dirname): - os.makedirs(dirname) - self.adb.Pull(device_path, host_path) - - def _ReadFileWithPull(self, device_path): - try: - d = tempfile.mkdtemp() - host_temp_path = os.path.join(d, 'tmp_ReadFileWithPull') - self.adb.Pull(device_path, host_temp_path) - with open(host_temp_path, 'r') as host_temp: - return host_temp.read() - finally: - if os.path.exists(d): - shutil.rmtree(d) - - _LS_RE = re.compile( - r'(?P<perms>\S+) +(?P<owner>\S+) +(?P<group>\S+) +(?:(?P<size>\d+) +)?' - + r'(?P<date>\S+) +(?P<time>\S+) +(?P<name>.+)$') - - @decorators.WithTimeoutAndRetriesFromInstance() - def ReadFile(self, device_path, as_root=False, force_pull=False, - timeout=None, retries=None): - """Reads the contents of a file from the device. - - Args: - device_path: A string containing the absolute path of the file to read - from the device. - as_root: A boolean indicating whether the read should be executed with - root privileges. - force_pull: A boolean indicating whether to force the operation to be - performed by pulling a file from the device. The default is, when the - contents are short, to retrieve the contents using cat instead. - timeout: timeout in seconds - retries: number of retries - - Returns: - The contents of |device_path| as a string. Contents are intepreted using - universal newlines, so the caller will see them encoded as '\n'. Also, - all lines will be terminated. - - Raises: - AdbCommandFailedError if the file can't be read. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - def get_size(path): - # TODO(jbudorick): Implement a generic version of Stat() that handles - # as_root=True, then switch this implementation to use that. - ls_out = self.RunShellCommand(['ls', '-l', device_path], as_root=as_root, - check_return=True) - for line in ls_out: - m = self._LS_RE.match(line) - if m and m.group('name') == posixpath.basename(device_path): - return int(m.group('size')) - logging.warning('Could not determine size of %s.', device_path) - return None - - if (not force_pull - and 0 < get_size(device_path) <= self._MAX_ADB_OUTPUT_LENGTH): - return _JoinLines(self.RunShellCommand( - ['cat', device_path], as_root=as_root, check_return=True)) - elif as_root and self.NeedsSU(): - with device_temp_file.DeviceTempFile(self.adb) as device_temp: - cmd = 'SRC=%s DEST=%s;cp "$SRC" "$DEST" && chmod 666 "$DEST"' % ( - cmd_helper.SingleQuote(device_path), - cmd_helper.SingleQuote(device_temp.name)) - self.RunShellCommand(cmd, as_root=True, check_return=True) - return self._ReadFileWithPull(device_temp.name) - else: - return self._ReadFileWithPull(device_path) - - def _WriteFileWithPush(self, device_path, contents): - with tempfile.NamedTemporaryFile() as host_temp: - host_temp.write(contents) - host_temp.flush() - self.adb.Push(host_temp.name, device_path) - - @decorators.WithTimeoutAndRetriesFromInstance() - def WriteFile(self, device_path, contents, as_root=False, force_push=False, - timeout=None, retries=None): - """Writes |contents| to a file on the device. - - Args: - device_path: A string containing the absolute path to the file to write - on the device. - contents: A string containing the data to write to the device. - as_root: A boolean indicating whether the write should be executed with - root privileges (if available). - force_push: A boolean indicating whether to force the operation to be - performed by pushing a file to the device. The default is, when the - contents are short, to pass the contents using a shell script instead. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandFailedError if the file could not be written on the device. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - if not force_push and len(contents) < self._MAX_ADB_COMMAND_LENGTH: - # If the contents are small, for efficieny we write the contents with - # a shell command rather than pushing a file. - cmd = 'echo -n %s > %s' % (cmd_helper.SingleQuote(contents), - cmd_helper.SingleQuote(device_path)) - self.RunShellCommand(cmd, as_root=as_root, check_return=True) - elif as_root and self.NeedsSU(): - # Adb does not allow to "push with su", so we first push to a temp file - # on a safe location, and then copy it to the desired location with su. - with device_temp_file.DeviceTempFile(self.adb) as device_temp: - self._WriteFileWithPush(device_temp.name, contents) - # Here we need 'cp' rather than 'mv' because the temp and - # destination files might be on different file systems (e.g. - # on internal storage and an external sd card). - self.RunShellCommand(['cp', device_temp.name, device_path], - as_root=True, check_return=True) - else: - # If root is not needed, we can push directly to the desired location. - self._WriteFileWithPush(device_path, contents) - - @decorators.WithTimeoutAndRetriesFromInstance() - def Ls(self, device_path, timeout=None, retries=None): - """Lists the contents of a directory on the device. - - Args: - device_path: A string containing the path of the directory on the device - to list. - timeout: timeout in seconds - retries: number of retries - - Returns: - A list of pairs (filename, stat) for each file found in the directory, - where the stat object has the properties: st_mode, st_size, and st_time. - - Raises: - AdbCommandFailedError if |device_path| does not specify a valid and - accessible directory in the device. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - return self.adb.Ls(device_path) - - @decorators.WithTimeoutAndRetriesFromInstance() - def Stat(self, device_path, timeout=None, retries=None): - """Get the stat attributes of a file or directory on the device. - - Args: - device_path: A string containing the path of from which to get attributes - on the device. - timeout: timeout in seconds - retries: number of retries - - Returns: - A stat object with the properties: st_mode, st_size, and st_time - - Raises: - CommandFailedError if device_path cannot be found on the device. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - dirname, target = device_path.rsplit('/', 1) - for filename, stat in self.adb.Ls(dirname): - if filename == target: - return stat - raise device_errors.CommandFailedError( - 'Cannot find file or directory: %r' % device_path, str(self)) - - @decorators.WithTimeoutAndRetriesFromInstance() - def SetJavaAsserts(self, enabled, timeout=None, retries=None): - """Enables or disables Java asserts. - - Args: - enabled: A boolean indicating whether Java asserts should be enabled - or disabled. - timeout: timeout in seconds - retries: number of retries - - Returns: - True if the device-side property changed and a restart is required as a - result, False otherwise. - - Raises: - CommandTimeoutError on timeout. - """ - def find_property(lines, property_name): - for index, line in enumerate(lines): - if line.strip() == '': - continue - key_value = tuple(s.strip() for s in line.split('=', 1)) - if len(key_value) != 2: - continue - key, value = key_value - if key == property_name: - return index, value - return None, '' - - new_value = 'all' if enabled else '' - - # First ensure the desired property is persisted. - try: - properties = self.ReadFile(self.LOCAL_PROPERTIES_PATH).splitlines() - except device_errors.CommandFailedError: - properties = [] - index, value = find_property(properties, self.JAVA_ASSERT_PROPERTY) - if new_value != value: - if new_value: - new_line = '%s=%s' % (self.JAVA_ASSERT_PROPERTY, new_value) - if index is None: - properties.append(new_line) - else: - properties[index] = new_line - else: - assert index is not None # since new_value == '' and new_value != value - properties.pop(index) - self.WriteFile(self.LOCAL_PROPERTIES_PATH, _JoinLines(properties)) - - # Next, check the current runtime value is what we need, and - # if not, set it and report that a reboot is required. - value = self.GetProp(self.JAVA_ASSERT_PROPERTY) - if new_value != value: - self.SetProp(self.JAVA_ASSERT_PROPERTY, new_value) - return True - else: - return False - - def GetLanguage(self, cache=False): - """Returns the language setting on the device. - Args: - cache: Whether to use cached properties when available. - """ - return self.GetProp('persist.sys.language', cache=cache) - - def GetCountry(self, cache=False): - """Returns the country setting on the device. - - Args: - cache: Whether to use cached properties when available. - """ - return self.GetProp('persist.sys.country', cache=cache) - - - @property - def screen_density(self): - """Returns the screen density of the device.""" - DPI_TO_DENSITY = { - 120: 'ldpi', - 160: 'mdpi', - 240: 'hdpi', - 320: 'xhdpi', - 480: 'xxhdpi', - 640: 'xxxhdpi', - } - return DPI_TO_DENSITY.get(self.pixel_density, 'tvdpi') - - @property - def pixel_density(self): - return int(self.GetProp('ro.sf.lcd_density', cache=True)) - - @property - def build_description(self): - """Returns the build description of the system. - - For example: - nakasi-user 4.4.4 KTU84P 1227136 release-keys - """ - return self.GetProp('ro.build.description', cache=True) - - @property - def build_fingerprint(self): - """Returns the build fingerprint of the system. - - For example: - google/nakasi/grouper:4.4.4/KTU84P/1227136:user/release-keys - """ - return self.GetProp('ro.build.fingerprint', cache=True) - - @property - def build_id(self): - """Returns the build ID of the system (e.g. 'KTU84P').""" - return self.GetProp('ro.build.id', cache=True) - - @property - def build_product(self): - """Returns the build product of the system (e.g. 'grouper').""" - return self.GetProp('ro.build.product', cache=True) - - @property - def build_type(self): - """Returns the build type of the system (e.g. 'user').""" - return self.GetProp('ro.build.type', cache=True) - - @property - def build_version_sdk(self): - """Returns the build version sdk of the system as a number (e.g. 19). - - For version code numbers see: - http://developer.android.com/reference/android/os/Build.VERSION_CODES.html - - For named constants see devil.android.sdk.version_codes - - Raises: - CommandFailedError if the build version sdk is not a number. - """ - value = self.GetProp('ro.build.version.sdk', cache=True) - try: - return int(value) - except ValueError: - raise device_errors.CommandFailedError( - 'Invalid build version sdk: %r' % value) - - @property - def product_cpu_abi(self): - """Returns the product cpu abi of the device (e.g. 'armeabi-v7a').""" - return self.GetProp('ro.product.cpu.abi', cache=True) - - @property - def product_model(self): - """Returns the name of the product model (e.g. 'Nexus 7').""" - return self.GetProp('ro.product.model', cache=True) - - @property - def product_name(self): - """Returns the product name of the device (e.g. 'nakasi').""" - return self.GetProp('ro.product.name', cache=True) - - @property - def product_board(self): - """Returns the product board name of the device (e.g. 'shamu').""" - return self.GetProp('ro.product.board', cache=True) - - def GetProp(self, property_name, cache=False, timeout=DEFAULT, - retries=DEFAULT): - """Gets a property from the device. - - Args: - property_name: A string containing the name of the property to get from - the device. - cache: Whether to use cached properties when available. - timeout: timeout in seconds - retries: number of retries - - Returns: - The value of the device's |property_name| property. - - Raises: - CommandTimeoutError on timeout. - """ - assert isinstance(property_name, basestring), ( - "property_name is not a string: %r" % property_name) - - prop_cache = self._cache['getprop'] - if cache: - if property_name not in prop_cache: - # It takes ~120ms to query a single property, and ~130ms to query all - # properties. So, when caching we always query all properties. - output = self.RunShellCommand( - ['getprop'], check_return=True, large_output=True, - timeout=self._default_timeout if timeout is DEFAULT else timeout, - retries=self._default_retries if retries is DEFAULT else retries) - prop_cache.clear() - for key, value in _GETPROP_RE.findall(''.join(output)): - prop_cache[key] = value - if property_name not in prop_cache: - prop_cache[property_name] = '' - else: - # timeout and retries are handled down at run shell, because we don't - # want to apply them in the other branch when reading from the cache - value = self.RunShellCommand( - ['getprop', property_name], single_line=True, check_return=True, - timeout=self._default_timeout if timeout is DEFAULT else timeout, - retries=self._default_retries if retries is DEFAULT else retries) - prop_cache[property_name] = value - return prop_cache[property_name] - - @decorators.WithTimeoutAndRetriesFromInstance() - def SetProp(self, property_name, value, check=False, timeout=None, - retries=None): - """Sets a property on the device. - - Args: - property_name: A string containing the name of the property to set on - the device. - value: A string containing the value to set to the property on the - device. - check: A boolean indicating whether to check that the property was - successfully set on the device. - timeout: timeout in seconds - retries: number of retries - - Raises: - CommandFailedError if check is true and the property was not correctly - set on the device (e.g. because it is not rooted). - CommandTimeoutError on timeout. - """ - assert isinstance(property_name, basestring), ( - "property_name is not a string: %r" % property_name) - assert isinstance(value, basestring), "value is not a string: %r" % value - - self.RunShellCommand(['setprop', property_name, value], check_return=True) - prop_cache = self._cache['getprop'] - if property_name in prop_cache: - del prop_cache[property_name] - # TODO(perezju) remove the option and make the check mandatory, but using a - # single shell script to both set- and getprop. - if check and value != self.GetProp(property_name, cache=False): - raise device_errors.CommandFailedError( - 'Unable to set property %r on the device to %r' - % (property_name, value), str(self)) - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetABI(self, timeout=None, retries=None): - """Gets the device main ABI. - - Args: - timeout: timeout in seconds - retries: number of retries - - Returns: - The device's main ABI name. - - Raises: - CommandTimeoutError on timeout. - """ - return self.GetProp('ro.product.cpu.abi', cache=True) - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetPids(self, process_name, timeout=None, retries=None): - """Returns the PIDs of processes with the given name. - - Note that the |process_name| is often the package name. - - Args: - process_name: A string containing the process name to get the PIDs for. - timeout: timeout in seconds - retries: number of retries - - Returns: - A dict mapping process name to a list of PIDs for each process that - contained the provided |process_name|. - - Raises: - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - procs_pids = collections.defaultdict(list) - try: - ps_output = self._RunPipedShellCommand( - 'ps | grep -F %s' % cmd_helper.SingleQuote(process_name)) - except device_errors.AdbShellCommandFailedError as e: - if e.status and isinstance(e.status, list) and not e.status[0]: - # If ps succeeded but grep failed, there were no processes with the - # given name. - return procs_pids - else: - raise - - for line in ps_output: - try: - ps_data = line.split() - if process_name in ps_data[-1]: - pid, process = ps_data[1], ps_data[-1] - procs_pids[process].append(pid) - except IndexError: - pass - return procs_pids - - @decorators.WithTimeoutAndRetriesFromInstance() - def TakeScreenshot(self, host_path=None, timeout=None, retries=None): - """Takes a screenshot of the device. - - Args: - host_path: A string containing the path on the host to save the - screenshot to. If None, a file name in the current - directory will be generated. - timeout: timeout in seconds - retries: number of retries - - Returns: - The name of the file on the host to which the screenshot was saved. - - Raises: - CommandFailedError on failure. - CommandTimeoutError on timeout. - DeviceUnreachableError on missing device. - """ - if not host_path: - host_path = os.path.abspath('screenshot-%s-%s.png' % ( - self.adb.GetDeviceSerial(), _GetTimeStamp())) - with device_temp_file.DeviceTempFile(self.adb, suffix='.png') as device_tmp: - self.RunShellCommand(['/system/bin/screencap', '-p', device_tmp.name], - check_return=True) - self.PullFile(device_tmp.name, host_path) - return host_path - - @decorators.WithTimeoutAndRetriesFromInstance() - def GetMemoryUsageForPid(self, pid, timeout=None, retries=None): - """Gets the memory usage for the given PID. - - Args: - pid: PID of the process. - timeout: timeout in seconds - retries: number of retries - - Returns: - A dict containing memory usage statistics for the PID. May include: - Size, Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean, - Private_Dirty, VmHWM - - Raises: - CommandTimeoutError on timeout. - """ - result = collections.defaultdict(int) - - try: - result.update(self._GetMemoryUsageForPidFromSmaps(pid)) - except device_errors.CommandFailedError: - logging.exception('Error getting memory usage from smaps') - - try: - result.update(self._GetMemoryUsageForPidFromStatus(pid)) - except device_errors.CommandFailedError: - logging.exception('Error getting memory usage from status') - - return result - - @decorators.WithTimeoutAndRetriesFromInstance() - def DismissCrashDialogIfNeeded(self, timeout=None, retries=None): - """Dismiss the error/ANR dialog if present. - - Returns: Name of the crashed package if a dialog is focused, - None otherwise. - """ - def _FindFocusedWindow(): - match = None - # TODO(jbudorick): Try to grep the output on the device instead of using - # large_output if/when DeviceUtils exposes a public interface for piped - # shell command handling. - for line in self.RunShellCommand(['dumpsys', 'window', 'windows'], - check_return=True, large_output=True): - match = re.match(_CURRENT_FOCUS_CRASH_RE, line) - if match: - break - return match - - match = _FindFocusedWindow() - if not match: - return None - package = match.group(2) - logging.warning('Trying to dismiss %s dialog for %s', *match.groups()) - self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT) - self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT) - self.SendKeyEvent(keyevent.KEYCODE_ENTER) - match = _FindFocusedWindow() - if match: - logging.error('Still showing a %s dialog for %s', *match.groups()) - return package - - def _GetMemoryUsageForPidFromSmaps(self, pid): - SMAPS_COLUMNS = ( - 'Size', 'Rss', 'Pss', 'Shared_Clean', 'Shared_Dirty', 'Private_Clean', - 'Private_Dirty') - - showmap_out = self._RunPipedShellCommand( - 'showmap %d | grep TOTAL' % int(pid), as_root=True) - - split_totals = showmap_out[-1].split() - if (not split_totals - or len(split_totals) != 9 - or split_totals[-1] != 'TOTAL'): - raise device_errors.CommandFailedError( - 'Invalid output from showmap: %s' % '\n'.join(showmap_out)) - - return dict(itertools.izip(SMAPS_COLUMNS, (int(n) for n in split_totals))) - - def _GetMemoryUsageForPidFromStatus(self, pid): - for line in self.ReadFile( - '/proc/%s/status' % str(pid), as_root=True).splitlines(): - if line.startswith('VmHWM:'): - return {'VmHWM': int(line.split()[1])} - raise device_errors.CommandFailedError( - 'Could not find memory peak value for pid %s', str(pid)) - - def GetLogcatMonitor(self, *args, **kwargs): - """Returns a new LogcatMonitor associated with this device. - - Parameters passed to this function are passed directly to - |logcat_monitor.LogcatMonitor| and are documented there. - """ - return logcat_monitor.LogcatMonitor(self.adb, *args, **kwargs) - - def GetClientCache(self, client_name): - """Returns client cache.""" - if client_name not in self._client_caches: - self._client_caches[client_name] = {} - return self._client_caches[client_name] - - def _ClearCache(self): - """Clears all caches.""" - for client in self._client_caches: - self._client_caches[client].clear() - self._cache = { - # Map of packageId -> list of on-device .apk paths - 'package_apk_paths': {}, - # Set of packageId that were loaded from LoadCacheData and not yet - # verified. - 'package_apk_paths_to_verify': set(), - # Map of packageId -> set of on-device .apk checksums - 'package_apk_checksums': {}, - # Map of property_name -> value - 'getprop': {}, - # Map of device_path -> [ignore_other_files, map of path->checksum] - 'device_path_checksums': {}, - } - - def LoadCacheData(self, data): - """Initializes the cache from data created using DumpCacheData.""" - obj = json.loads(data) - self._cache['package_apk_paths'] = obj.get('package_apk_paths', {}) - # When using a cache across script invokations, verify that apps have - # not been uninstalled. - self._cache['package_apk_paths_to_verify'] = set( - self._cache['package_apk_paths'].iterkeys()) - - package_apk_checksums = obj.get('package_apk_checksums', {}) - for k, v in package_apk_checksums.iteritems(): - package_apk_checksums[k] = set(v) - self._cache['package_apk_checksums'] = package_apk_checksums - device_path_checksums = obj.get('device_path_checksums', {}) - self._cache['device_path_checksums'] = device_path_checksums - - def DumpCacheData(self): - """Dumps the current cache state to a string.""" - obj = {} - obj['package_apk_paths'] = self._cache['package_apk_paths'] - obj['package_apk_checksums'] = self._cache['package_apk_checksums'] - # JSON can't handle sets. - for k, v in obj['package_apk_checksums'].iteritems(): - obj['package_apk_checksums'][k] = list(v) - obj['device_path_checksums'] = self._cache['device_path_checksums'] - return json.dumps(obj, separators=(',', ':')) - - @classmethod - def parallel(cls, devices, async=False): - """Creates a Parallelizer to operate over the provided list of devices. - - Args: - devices: A list of either DeviceUtils instances or objects from - from which DeviceUtils instances can be constructed. If None, - all attached devices will be used. - async: If true, returns a Parallelizer that runs operations - asynchronously. - - Returns: - A Parallelizer operating over |devices|. - - Raises: - device_errors.NoDevicesError: If no devices are passed. - """ - if not devices: - raise device_errors.NoDevicesError() - - devices = [d if isinstance(d, cls) else cls(d) for d in devices] - if async: - return parallelizer.Parallelizer(devices) - else: - return parallelizer.SyncParallelizer(devices) - - @classmethod - def HealthyDevices(cls, blacklist=None, **kwargs): - blacklisted_devices = blacklist.Read() if blacklist else [] - def blacklisted(adb): - if adb.GetDeviceSerial() in blacklisted_devices: - logging.warning('Device %s is blacklisted.', adb.GetDeviceSerial()) - return True - return False - - devices = [] - for adb in adb_wrapper.AdbWrapper.Devices(): - if not blacklisted(adb): - devices.append(cls(_CreateAdbWrapper(adb), **kwargs)) - return devices - - @decorators.WithTimeoutAndRetriesFromInstance() - def RestartAdbd(self, timeout=None, retries=None): - logging.info('Restarting adbd on device.') - with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script: - self.WriteFile(script.name, _RESTART_ADBD_SCRIPT) - self.RunShellCommand(['source', script.name], as_root=True) - self.adb.WaitForDevice() - - @decorators.WithTimeoutAndRetriesFromInstance() - def GrantPermissions(self, package, permissions, timeout=None, retries=None): - # Permissions only need to be set on M and above because of the changes to - # the permission model. - if not permissions or self.build_version_sdk < version_codes.MARSHMALLOW: - return - # TODO(rnephew): After permission blacklist is complete, switch to using - # &&s instead of ;s. - cmd = '' - logging.info('Setting permissions for %s.', package) - permissions = [p for p in permissions if p not in _PERMISSIONS_BLACKLIST] - if ('android.permission.WRITE_EXTERNAL_STORAGE' in permissions - and 'android.permission.READ_EXTERNAL_STORAGE' not in permissions): - permissions.append('android.permission.READ_EXTERNAL_STORAGE') - cmd = ';'.join('pm grant %s %s' % (package, p) for p in permissions) - if cmd: - output = self.RunShellCommand(cmd) - if output: - logging.warning('Possible problem when granting permissions. Blacklist ' - 'may need to be updated.') - for line in output: - logging.warning(' %s', line) - - @decorators.WithTimeoutAndRetriesFromInstance() - def IsScreenOn(self, timeout=None, retries=None): - """Determines if screen is on. - - Dumpsys input_method exposes screen on/off state. Below is an explination of - the states. - - Pre-L: - On: mScreenOn=true - Off: mScreenOn=false - L+: - On: mInteractive=true - Off: mInteractive=false - - Returns: - True if screen is on, false if it is off. - - Raises: - device_errors.CommandFailedError: If screen state cannot be found. - """ - if self.build_version_sdk < version_codes.LOLLIPOP: - input_check = 'mScreenOn' - check_value = 'mScreenOn=true' - else: - input_check = 'mInteractive' - check_value = 'mInteractive=true' - dumpsys_out = self._RunPipedShellCommand( - 'dumpsys input_method | grep %s' % input_check) - if not dumpsys_out: - raise device_errors.CommandFailedError( - 'Unable to detect screen state', str(self)) - return check_value in dumpsys_out[0] - - @decorators.WithTimeoutAndRetriesFromInstance() - def SetScreen(self, on, timeout=None, retries=None): - """Turns screen on and off. - - Args: - on: bool to decide state to switch to. True = on False = off. - """ - def screen_test(): - return self.IsScreenOn() == on - - if screen_test(): - logging.info('Screen already in expected state.') - return - self.RunShellCommand('input keyevent 26') - timeout_retry.WaitFor(screen_test, wait_period=1)
diff --git a/build/android/devil/android/device_utils_device_test.py b/build/android/devil/android/device_utils_device_test.py deleted file mode 100755 index d4b823d..0000000 --- a/build/android/devil/android/device_utils_device_test.py +++ /dev/null
@@ -1,216 +0,0 @@ -#!/usr/bin/env python -# 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. - -""" -Unit tests for the contents of device_utils.py (mostly DeviceUtils). -The test will invoke real devices -""" - -import os -import tempfile -import unittest - -from devil.android import device_utils -from devil.android.sdk import adb_wrapper -from devil.utils import cmd_helper - -_OLD_CONTENTS = "foo" -_NEW_CONTENTS = "bar" -_DEVICE_DIR = "/data/local/tmp/device_utils_test" -_SUB_DIR = "sub" -_SUB_DIR1 = "sub1" -_SUB_DIR2 = "sub2" - -class DeviceUtilsPushDeleteFilesTest(unittest.TestCase): - - def setUp(self): - devices = adb_wrapper.AdbWrapper.Devices() - assert devices, 'A device must be attached' - self.adb = devices[0] - self.adb.WaitForDevice() - self.device = device_utils.DeviceUtils( - self.adb, default_timeout=10, default_retries=0) - - @staticmethod - def _MakeTempFile(contents): - """Make a temporary file with the given contents. - - Args: - contents: string to write to the temporary file. - - Returns: - the tuple contains the absolute path to the file and the file name - """ - fi, path = tempfile.mkstemp(text=True) - with os.fdopen(fi, 'w') as f: - f.write(contents) - file_name = os.path.basename(path) - return (path, file_name) - - @staticmethod - def _MakeTempFileGivenDir(directory, contents): - """Make a temporary file under the given directory - with the given contents - - Args: - directory: the temp directory to create the file - contents: string to write to the temp file - - Returns: - the list contains the absolute path to the file and the file name - """ - fi, path = tempfile.mkstemp(dir=directory, text=True) - with os.fdopen(fi, 'w') as f: - f.write(contents) - file_name = os.path.basename(path) - return (path, file_name) - - @staticmethod - def _ChangeTempFile(path, contents): - with os.open(path, 'w') as f: - f.write(contents) - - @staticmethod - def _DeleteTempFile(path): - os.remove(path) - - def testPushChangedFiles_noFileChange(self): - (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS) - device_file_path = "%s/%s" % (_DEVICE_DIR, file_name) - self.adb.Push(host_file_path, device_file_path) - self.device.PushChangedFiles([(host_file_path, device_file_path)]) - result = self.device.RunShellCommand(['cat', device_file_path], - single_line=True) - self.assertEqual(_OLD_CONTENTS, result) - - cmd_helper.RunCmd(['rm', host_file_path]) - self.device.RunShellCommand(['rm', '-rf', _DEVICE_DIR]) - - def testPushChangedFiles_singleFileChange(self): - (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS) - device_file_path = "%s/%s" % (_DEVICE_DIR, file_name) - self.adb.Push(host_file_path, device_file_path) - - with open(host_file_path, 'w') as f: - f.write(_NEW_CONTENTS) - self.device.PushChangedFiles([(host_file_path, device_file_path)]) - result = self.device.RunShellCommand(['cat', device_file_path], - single_line=True) - self.assertEqual(_NEW_CONTENTS, result) - - cmd_helper.RunCmd(['rm', host_file_path]) - self.device.RunShellCommand(['rm', '-rf', _DEVICE_DIR]) - - def testDeleteFiles(self): - host_tmp_dir = tempfile.mkdtemp() - (host_file_path, file_name) = self._MakeTempFileGivenDir( - host_tmp_dir, _OLD_CONTENTS) - - device_file_path = "%s/%s" % (_DEVICE_DIR, file_name) - self.adb.Push(host_file_path, device_file_path) - - cmd_helper.RunCmd(['rm', host_file_path]) - self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)], - delete_device_stale=True) - result = self.device.RunShellCommand(['ls', _DEVICE_DIR], single_line=True) - self.assertEqual('', result) - - cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir]) - self.device.RunShellCommand(['rm', '-rf', _DEVICE_DIR]) - - def testPushAndDeleteFiles_noSubDir(self): - host_tmp_dir = tempfile.mkdtemp() - (host_file_path1, file_name1) = self._MakeTempFileGivenDir( - host_tmp_dir, _OLD_CONTENTS) - (host_file_path2, file_name2) = self._MakeTempFileGivenDir( - host_tmp_dir, _OLD_CONTENTS) - - device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1) - device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2) - self.adb.Push(host_file_path1, device_file_path1) - self.adb.Push(host_file_path2, device_file_path2) - - with open(host_file_path1, 'w') as f: - f.write(_NEW_CONTENTS) - cmd_helper.RunCmd(['rm', host_file_path2]) - - self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)], - delete_device_stale=True) - result = self.device.RunShellCommand(['cat', device_file_path1], - single_line=True) - self.assertEqual(_NEW_CONTENTS, result) - result = self.device.RunShellCommand(['ls', _DEVICE_DIR], single_line=True) - self.assertEqual(file_name1, result) - - self.device.RunShellCommand(['rm', '-rf', _DEVICE_DIR]) - cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir]) - - def testPushAndDeleteFiles_SubDir(self): - host_tmp_dir = tempfile.mkdtemp() - host_sub_dir1 = "%s/%s" % (host_tmp_dir, _SUB_DIR1) - host_sub_dir2 = "%s/%s/%s" % (host_tmp_dir, _SUB_DIR, _SUB_DIR2) - cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir1]) - cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir2]) - - (host_file_path1, file_name1) = self._MakeTempFileGivenDir( - host_tmp_dir, _OLD_CONTENTS) - (host_file_path2, file_name2) = self._MakeTempFileGivenDir( - host_tmp_dir, _OLD_CONTENTS) - (host_file_path3, file_name3) = self._MakeTempFileGivenDir( - host_sub_dir1, _OLD_CONTENTS) - (host_file_path4, file_name4) = self._MakeTempFileGivenDir( - host_sub_dir2, _OLD_CONTENTS) - - device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1) - device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2) - device_file_path3 = "%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR1, file_name3) - device_file_path4 = "%s/%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR, - _SUB_DIR2, file_name4) - - self.adb.Push(host_file_path1, device_file_path1) - self.adb.Push(host_file_path2, device_file_path2) - self.adb.Push(host_file_path3, device_file_path3) - self.adb.Push(host_file_path4, device_file_path4) - - with open(host_file_path1, 'w') as f: - f.write(_NEW_CONTENTS) - cmd_helper.RunCmd(['rm', host_file_path2]) - cmd_helper.RunCmd(['rm', host_file_path4]) - - self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)], - delete_device_stale=True) - result = self.device.RunShellCommand(['cat', device_file_path1], - single_line=True) - self.assertEqual(_NEW_CONTENTS, result) - - result = self.device.RunShellCommand(['ls', _DEVICE_DIR]) - self.assertIn(file_name1, result) - self.assertIn(_SUB_DIR1, result) - self.assertIn(_SUB_DIR, result) - self.assertEqual(3, len(result)) - - result = self.device.RunShellCommand(['cat', device_file_path3], - single_line=True) - self.assertEqual(_OLD_CONTENTS, result) - - result = self.device.RunShellCommand(["ls", "%s/%s/%s" - % (_DEVICE_DIR, _SUB_DIR, _SUB_DIR2)], - single_line=True) - self.assertEqual('', result) - - self.device.RunShellCommand(['rm', '-rf', _DEVICE_DIR]) - cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir]) - - def testRestartAdbd(self): - old_adbd_pid = self.device.RunShellCommand( - ['ps', '|', 'grep', 'adbd'])[1].split()[1] - self.device.RestartAdbd() - new_adbd_pid = self.device.RunShellCommand( - ['ps', '|', 'grep', 'adbd'])[1].split()[1] - self.assertNotEqual(old_adbd_pid, new_adbd_pid) - - -if __name__ == '__main__': - unittest.main()
diff --git a/build/android/devil/android/device_utils_test.py b/build/android/devil/android/device_utils_test.py deleted file mode 100755 index 659cea7..0000000 --- a/build/android/devil/android/device_utils_test.py +++ /dev/null
@@ -1,2291 +0,0 @@ -#!/usr/bin/env python -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -Unit tests for the contents of device_utils.py (mostly DeviceUtils). -""" - -# pylint: disable=protected-access -# pylint: disable=unused-argument - -import logging -import unittest - -from devil import devil_env -from devil.android import device_errors -from devil.android import device_signal -from devil.android import device_utils -from devil.android.sdk import adb_wrapper -from devil.android.sdk import intent -from devil.android.sdk import version_codes -from devil.utils import cmd_helper -from devil.utils import mock_calls - -with devil_env.SysPath(devil_env.PYMOCK_PATH): - import mock # pylint: disable=import-error - - -class _MockApkHelper(object): - def __init__(self, path, package_name, perms=None): - self.path = path - self.package_name = package_name - self.perms = perms - - def GetPackageName(self): - return self.package_name - - def GetPermissions(self): - return self.perms - - -class DeviceUtilsInitTest(unittest.TestCase): - - def testInitWithStr(self): - serial_as_str = str('0123456789abcdef') - d = device_utils.DeviceUtils('0123456789abcdef') - self.assertEqual(serial_as_str, d.adb.GetDeviceSerial()) - - def testInitWithUnicode(self): - serial_as_unicode = unicode('fedcba9876543210') - d = device_utils.DeviceUtils(serial_as_unicode) - self.assertEqual(serial_as_unicode, d.adb.GetDeviceSerial()) - - def testInitWithAdbWrapper(self): - serial = '123456789abcdef0' - a = adb_wrapper.AdbWrapper(serial) - d = device_utils.DeviceUtils(a) - self.assertEqual(serial, d.adb.GetDeviceSerial()) - - def testInitWithMissing_fails(self): - with self.assertRaises(ValueError): - device_utils.DeviceUtils(None) - with self.assertRaises(ValueError): - device_utils.DeviceUtils('') - - -class DeviceUtilsGetAVDsTest(mock_calls.TestCase): - - def testGetAVDs(self): - mocked_attrs = { - 'android_sdk': '/my/sdk/path' - } - with mock.patch('devil.devil_env._Environment.LocalPath', - mock.Mock(side_effect=lambda a: mocked_attrs[a])): - with self.assertCall( - mock.call.devil.utils.cmd_helper.GetCmdOutput( - [mock.ANY, 'list', 'avd']), - 'Available Android Virtual Devices:\n' - ' Name: my_android5.0\n' - ' Path: /some/path/to/.android/avd/my_android5.0.avd\n' - ' Target: Android 5.0 (API level 21)\n' - ' Tag/ABI: default/x86\n' - ' Skin: WVGA800\n'): - self.assertEquals(['my_android5.0'], device_utils.GetAVDs()) - - -class DeviceUtilsRestartServerTest(mock_calls.TestCase): - - @mock.patch('time.sleep', mock.Mock()) - def testRestartServer_succeeds(self): - with self.assertCalls( - mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.KillServer(), - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput( - ['pgrep', 'adb']), - (1, '')), - mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.StartServer(), - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput( - ['pgrep', 'adb']), - (1, '')), - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput( - ['pgrep', 'adb']), - (0, '123\n'))): - device_utils.RestartServer() - - -class MockTempFile(object): - - def __init__(self, name='/tmp/some/file'): - self.file = mock.MagicMock(spec=file) - self.file.name = name - self.file.name_quoted = cmd_helper.SingleQuote(name) - - def __enter__(self): - return self.file - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - @property - def name(self): - return self.file.name - - -class _PatchedFunction(object): - def __init__(self, patched=None, mocked=None): - self.patched = patched - self.mocked = mocked - - -def _AdbWrapperMock(test_serial, is_ready=True): - adb = mock.Mock(spec=adb_wrapper.AdbWrapper) - adb.__str__ = mock.Mock(return_value=test_serial) - adb.GetDeviceSerial.return_value = test_serial - adb.is_ready = is_ready - return adb - - -class DeviceUtilsTest(mock_calls.TestCase): - - def setUp(self): - self.adb = _AdbWrapperMock('0123456789abcdef') - self.device = device_utils.DeviceUtils( - self.adb, default_timeout=10, default_retries=0) - self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial']) - - def AdbCommandError(self, args=None, output=None, status=None, msg=None): - if args is None: - args = ['[unspecified]'] - return mock.Mock(side_effect=device_errors.AdbCommandFailedError( - args, output, status, msg, str(self.device))) - - def CommandError(self, msg=None): - if msg is None: - msg = 'Command failed' - return mock.Mock(side_effect=device_errors.CommandFailedError( - msg, str(self.device))) - - def ShellError(self, output=None, status=1): - def action(cmd, *args, **kwargs): - raise device_errors.AdbShellCommandFailedError( - cmd, output, status, str(self.device)) - if output is None: - output = 'Permission denied\n' - return action - - def TimeoutError(self, msg=None): - if msg is None: - msg = 'Operation timed out' - return mock.Mock(side_effect=device_errors.CommandTimeoutError( - msg, str(self.device))) - - -class DeviceUtilsEqTest(DeviceUtilsTest): - - def testEq_equal_deviceUtils(self): - other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef')) - self.assertTrue(self.device == other) - self.assertTrue(other == self.device) - - def testEq_equal_adbWrapper(self): - other = adb_wrapper.AdbWrapper('0123456789abcdef') - self.assertTrue(self.device == other) - self.assertTrue(other == self.device) - - def testEq_equal_string(self): - other = '0123456789abcdef' - self.assertTrue(self.device == other) - self.assertTrue(other == self.device) - - def testEq_devicesNotEqual(self): - other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdee')) - self.assertFalse(self.device == other) - self.assertFalse(other == self.device) - - def testEq_identity(self): - self.assertTrue(self.device == self.device) - - def testEq_serialInList(self): - devices = [self.device] - self.assertTrue('0123456789abcdef' in devices) - - -class DeviceUtilsLtTest(DeviceUtilsTest): - - def testLt_lessThan(self): - other = device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff')) - self.assertTrue(self.device < other) - self.assertTrue(other > self.device) - - def testLt_greaterThan_lhs(self): - other = device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000')) - self.assertFalse(self.device < other) - self.assertFalse(other > self.device) - - def testLt_equal(self): - other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef')) - self.assertFalse(self.device < other) - self.assertFalse(other > self.device) - - def testLt_sorted(self): - devices = [ - device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff')), - device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000')), - ] - sorted_devices = sorted(devices) - self.assertEquals('0000000000000000', - sorted_devices[0].adb.GetDeviceSerial()) - self.assertEquals('ffffffffffffffff', - sorted_devices[1].adb.GetDeviceSerial()) - - -class DeviceUtilsStrTest(DeviceUtilsTest): - - def testStr_returnsSerial(self): - with self.assertCalls( - (self.call.adb.GetDeviceSerial(), '0123456789abcdef')): - self.assertEqual('0123456789abcdef', str(self.device)) - - -class DeviceUtilsIsOnlineTest(DeviceUtilsTest): - - def testIsOnline_true(self): - with self.assertCall(self.call.adb.GetState(), 'device'): - self.assertTrue(self.device.IsOnline()) - - def testIsOnline_false(self): - with self.assertCall(self.call.adb.GetState(), 'offline'): - self.assertFalse(self.device.IsOnline()) - - def testIsOnline_error(self): - with self.assertCall(self.call.adb.GetState(), self.CommandError()): - self.assertFalse(self.device.IsOnline()) - - -class DeviceUtilsHasRootTest(DeviceUtilsTest): - - def testHasRoot_true(self): - with self.assertCall(self.call.adb.Shell('ls /root'), 'foo\n'): - self.assertTrue(self.device.HasRoot()) - - def testHasRoot_false(self): - with self.assertCall(self.call.adb.Shell('ls /root'), self.ShellError()): - self.assertFalse(self.device.HasRoot()) - - -class DeviceUtilsEnableRootTest(DeviceUtilsTest): - - def testEnableRoot_succeeds(self): - with self.assertCalls( - (self.call.device.IsUserBuild(), False), - self.call.adb.Root(), - self.call.device.WaitUntilFullyBooted()): - self.device.EnableRoot() - - def testEnableRoot_userBuild(self): - with self.assertCalls( - (self.call.device.IsUserBuild(), True)): - with self.assertRaises(device_errors.CommandFailedError): - self.device.EnableRoot() - - def testEnableRoot_rootFails(self): - with self.assertCalls( - (self.call.device.IsUserBuild(), False), - (self.call.adb.Root(), self.CommandError())): - with self.assertRaises(device_errors.CommandFailedError): - self.device.EnableRoot() - - -class DeviceUtilsIsUserBuildTest(DeviceUtilsTest): - - def testIsUserBuild_yes(self): - with self.assertCall( - self.call.device.GetProp('ro.build.type', cache=True), 'user'): - self.assertTrue(self.device.IsUserBuild()) - - def testIsUserBuild_no(self): - with self.assertCall( - self.call.device.GetProp('ro.build.type', cache=True), 'userdebug'): - self.assertFalse(self.device.IsUserBuild()) - - -class DeviceUtilsGetExternalStoragePathTest(DeviceUtilsTest): - - def testGetExternalStoragePath_succeeds(self): - with self.assertCall( - self.call.adb.Shell('echo $EXTERNAL_STORAGE'), '/fake/storage/path\n'): - self.assertEquals('/fake/storage/path', - self.device.GetExternalStoragePath()) - - def testGetExternalStoragePath_fails(self): - with self.assertCall(self.call.adb.Shell('echo $EXTERNAL_STORAGE'), '\n'): - with self.assertRaises(device_errors.CommandFailedError): - self.device.GetExternalStoragePath() - - -class DeviceUtilsGetApplicationPathsInternalTest(DeviceUtilsTest): - - def testGetApplicationPathsInternal_exists(self): - with self.assertCalls( - (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'), - (self.call.device.RunShellCommand( - ['pm', 'path', 'android'], check_return=True), - ['package:/path/to/android.apk'])): - self.assertEquals(['/path/to/android.apk'], - self.device._GetApplicationPathsInternal('android')) - - def testGetApplicationPathsInternal_notExists(self): - with self.assertCalls( - (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'), - (self.call.device.RunShellCommand( - ['pm', 'path', 'not.installed.app'], check_return=True), - '')): - self.assertEquals([], - self.device._GetApplicationPathsInternal('not.installed.app')) - - def testGetApplicationPathsInternal_fails(self): - with self.assertCalls( - (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'), - (self.call.device.RunShellCommand( - ['pm', 'path', 'android'], check_return=True), - self.CommandError('ERROR. Is package manager running?\n'))): - with self.assertRaises(device_errors.CommandFailedError): - self.device._GetApplicationPathsInternal('android') - - -class DeviceUtils_GetApplicationVersionTest(DeviceUtilsTest): - - def test_GetApplicationVersion_exists(self): - with self.assertCalls( - (self.call.adb.Shell('dumpsys package com.android.chrome'), - 'Packages:\n' - ' Package [com.android.chrome] (3901ecfb):\n' - ' userId=1234 gids=[123, 456, 789]\n' - ' pkg=Package{1fecf634 com.android.chrome}\n' - ' versionName=45.0.1234.7\n')): - self.assertEquals('45.0.1234.7', - self.device.GetApplicationVersion('com.android.chrome')) - - def test_GetApplicationVersion_notExists(self): - with self.assertCalls( - (self.call.adb.Shell('dumpsys package com.android.chrome'), '')): - self.assertEquals(None, - self.device.GetApplicationVersion('com.android.chrome')) - - def test_GetApplicationVersion_fails(self): - with self.assertCalls( - (self.call.adb.Shell('dumpsys package com.android.chrome'), - 'Packages:\n' - ' Package [com.android.chrome] (3901ecfb):\n' - ' userId=1234 gids=[123, 456, 789]\n' - ' pkg=Package{1fecf634 com.android.chrome}\n')): - with self.assertRaises(device_errors.CommandFailedError): - self.device.GetApplicationVersion('com.android.chrome') - - -class DeviceUtilsGetApplicationDataDirectoryTest(DeviceUtilsTest): - - def testGetApplicationDataDirectory_exists(self): - with self.assertCall( - self.call.device._RunPipedShellCommand( - 'pm dump foo.bar.baz | grep dataDir='), - ['dataDir=/data/data/foo.bar.baz']): - self.assertEquals( - '/data/data/foo.bar.baz', - self.device.GetApplicationDataDirectory('foo.bar.baz')) - - def testGetApplicationDataDirectory_notExists(self): - with self.assertCall( - self.call.device._RunPipedShellCommand( - 'pm dump foo.bar.baz | grep dataDir='), - self.ShellError()): - self.assertIsNone(self.device.GetApplicationDataDirectory('foo.bar.baz')) - - -@mock.patch('time.sleep', mock.Mock()) -class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsTest): - - def testWaitUntilFullyBooted_succeedsNoWifi(self): - with self.assertCalls( - self.call.adb.WaitForDevice(), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), ''), - # pm_ready - (self.call.device._GetApplicationPathsInternal('android', - skip_cache=True), - ['package:/some/fake/path']), - # boot_completed - (self.call.device.GetProp('sys.boot_completed', cache=False), '1')): - self.device.WaitUntilFullyBooted(wifi=False) - - def testWaitUntilFullyBooted_succeedsWithWifi(self): - with self.assertCalls( - self.call.adb.WaitForDevice(), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), ''), - # pm_ready - (self.call.device._GetApplicationPathsInternal('android', - skip_cache=True), - ['package:/some/fake/path']), - # boot_completed - (self.call.device.GetProp('sys.boot_completed', cache=False), '1'), - # wifi_enabled - (self.call.adb.Shell('dumpsys wifi'), - 'stuff\nWi-Fi is enabled\nmore stuff\n')): - self.device.WaitUntilFullyBooted(wifi=True) - - def testWaitUntilFullyBooted_deviceNotInitiallyAvailable(self): - with self.assertCalls( - self.call.adb.WaitForDevice(), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), self.AdbCommandError()), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), ''), - # pm_ready - (self.call.device._GetApplicationPathsInternal('android', - skip_cache=True), - ['package:/some/fake/path']), - # boot_completed - (self.call.device.GetProp('sys.boot_completed', cache=False), '1')): - self.device.WaitUntilFullyBooted(wifi=False) - - def testWaitUntilFullyBooted_sdCardReadyFails_noPath(self): - with self.assertCalls( - self.call.adb.WaitForDevice(), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), self.CommandError())): - with self.assertRaises(device_errors.CommandFailedError): - self.device.WaitUntilFullyBooted(wifi=False) - - def testWaitUntilFullyBooted_sdCardReadyFails_notExists(self): - with self.assertCalls( - self.call.adb.WaitForDevice(), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), - self.TimeoutError())): - with self.assertRaises(device_errors.CommandTimeoutError): - self.device.WaitUntilFullyBooted(wifi=False) - - def testWaitUntilFullyBooted_devicePmFails(self): - with self.assertCalls( - self.call.adb.WaitForDevice(), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), ''), - # pm_ready - (self.call.device._GetApplicationPathsInternal('android', - skip_cache=True), - self.CommandError()), - # pm_ready - (self.call.device._GetApplicationPathsInternal('android', - skip_cache=True), - self.CommandError()), - # pm_ready - (self.call.device._GetApplicationPathsInternal('android', - skip_cache=True), - self.TimeoutError())): - with self.assertRaises(device_errors.CommandTimeoutError): - self.device.WaitUntilFullyBooted(wifi=False) - - def testWaitUntilFullyBooted_bootFails(self): - with self.assertCalls( - self.call.adb.WaitForDevice(), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), ''), - # pm_ready - (self.call.device._GetApplicationPathsInternal('android', - skip_cache=True), - ['package:/some/fake/path']), - # boot_completed - (self.call.device.GetProp('sys.boot_completed', cache=False), '0'), - # boot_completed - (self.call.device.GetProp('sys.boot_completed', cache=False), '0'), - # boot_completed - (self.call.device.GetProp('sys.boot_completed', cache=False), - self.TimeoutError())): - with self.assertRaises(device_errors.CommandTimeoutError): - self.device.WaitUntilFullyBooted(wifi=False) - - def testWaitUntilFullyBooted_wifiFails(self): - with self.assertCalls( - self.call.adb.WaitForDevice(), - # sd_card_ready - (self.call.device.GetExternalStoragePath(), '/fake/storage/path'), - (self.call.adb.Shell('test -d /fake/storage/path'), ''), - # pm_ready - (self.call.device._GetApplicationPathsInternal('android', - skip_cache=True), - ['package:/some/fake/path']), - # boot_completed - (self.call.device.GetProp('sys.boot_completed', cache=False), '1'), - # wifi_enabled - (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'), - # wifi_enabled - (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'), - # wifi_enabled - (self.call.adb.Shell('dumpsys wifi'), self.TimeoutError())): - with self.assertRaises(device_errors.CommandTimeoutError): - self.device.WaitUntilFullyBooted(wifi=True) - - -@mock.patch('time.sleep', mock.Mock()) -class DeviceUtilsRebootTest(DeviceUtilsTest): - - def testReboot_nonBlocking(self): - with self.assertCalls( - self.call.adb.Reboot(), - (self.call.device.IsOnline(), True), - (self.call.device.IsOnline(), False)): - self.device.Reboot(block=False) - - def testReboot_blocking(self): - with self.assertCalls( - self.call.adb.Reboot(), - (self.call.device.IsOnline(), True), - (self.call.device.IsOnline(), False), - self.call.device.WaitUntilFullyBooted(wifi=False)): - self.device.Reboot(block=True) - - def testReboot_blockUntilWifi(self): - with self.assertCalls( - self.call.adb.Reboot(), - (self.call.device.IsOnline(), True), - (self.call.device.IsOnline(), False), - self.call.device.WaitUntilFullyBooted(wifi=True)): - self.device.Reboot(block=True, wifi=True) - - -class DeviceUtilsInstallTest(DeviceUtilsTest): - - mock_apk = _MockApkHelper('/fake/test/app.apk', 'test.package', ['p1']) - - def testInstall_noPriorInstall(self): - with self.patch_call(self.call.device.build_version_sdk, return_value=23): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), []), - self.call.adb.Install('/fake/test/app.apk', reinstall=False, - allow_downgrade=False), - (self.call.device.GrantPermissions('test.package', ['p1']), [])): - self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0) - - def testInstall_permissionsPreM(self): - with self.patch_call(self.call.device.build_version_sdk, return_value=20): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), []), - (self.call.adb.Install('/fake/test/app.apk', reinstall=False, - allow_downgrade=False))): - self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0) - - def testInstall_findPermissions(self): - with self.patch_call(self.call.device.build_version_sdk, return_value=23): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), []), - (self.call.adb.Install('/fake/test/app.apk', reinstall=False, - allow_downgrade=False)), - (self.call.device.GrantPermissions('test.package', ['p1']), [])): - self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0) - - def testInstall_passPermissions(self): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), []), - (self.call.adb.Install('/fake/test/app.apk', reinstall=False, - allow_downgrade=False)), - (self.call.device.GrantPermissions('test.package', ['p1', 'p2']), [])): - self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0, - permissions=['p1', 'p2']) - - def testInstall_differentPriorInstall(self): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), - ['/fake/data/app/test.package.apk']), - (self.call.device._ComputeStaleApks('test.package', - ['/fake/test/app.apk']), - (['/fake/test/app.apk'], None)), - self.call.device.Uninstall('test.package'), - self.call.adb.Install('/fake/test/app.apk', reinstall=False, - allow_downgrade=False)): - self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0, - permissions=[]) - - def testInstall_differentPriorInstall_reinstall(self): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), - ['/fake/data/app/test.package.apk']), - (self.call.device._ComputeStaleApks('test.package', - ['/fake/test/app.apk']), - (['/fake/test/app.apk'], None)), - self.call.adb.Install('/fake/test/app.apk', reinstall=True, - allow_downgrade=False)): - self.device.Install(DeviceUtilsInstallTest.mock_apk, - reinstall=True, retries=0, permissions=[]) - - def testInstall_identicalPriorInstall_reinstall(self): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), - ['/fake/data/app/test.package.apk']), - (self.call.device._ComputeStaleApks('test.package', - ['/fake/test/app.apk']), - ([], None)), - (self.call.device.ForceStop('test.package'))): - self.device.Install(DeviceUtilsInstallTest.mock_apk, - reinstall=True, retries=0, permissions=[]) - - def testInstall_fails(self): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), []), - (self.call.adb.Install('/fake/test/app.apk', reinstall=False, - allow_downgrade=False), - self.CommandError('Failure\r\n'))): - with self.assertRaises(device_errors.CommandFailedError): - self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0) - - def testInstall_downgrade(self): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), - ['/fake/data/app/test.package.apk']), - (self.call.device._ComputeStaleApks('test.package', - ['/fake/test/app.apk']), - (['/fake/test/app.apk'], None)), - self.call.adb.Install('/fake/test/app.apk', reinstall=True, - allow_downgrade=True)): - self.device.Install(DeviceUtilsInstallTest.mock_apk, - reinstall=True, retries=0, permissions=[], allow_downgrade=True) - - -class DeviceUtilsInstallSplitApkTest(DeviceUtilsTest): - - mock_apk = _MockApkHelper('base.apk', 'test.package', ['p1']) - - def testInstallSplitApk_noPriorInstall(self): - with self.assertCalls( - (self.call.device._CheckSdkLevel(21)), - (mock.call.devil.android.sdk.split_select.SelectSplits( - self.device, 'base.apk', - ['split1.apk', 'split2.apk', 'split3.apk'], - allow_cached_props=False), - ['split2.apk']), - (self.call.device._GetApplicationPathsInternal('test.package'), []), - (self.call.adb.InstallMultiple( - ['base.apk', 'split2.apk'], partial=None, reinstall=False, - allow_downgrade=False))): - self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk, - ['split1.apk', 'split2.apk', 'split3.apk'], permissions=[], retries=0) - - def testInstallSplitApk_partialInstall(self): - with self.assertCalls( - (self.call.device._CheckSdkLevel(21)), - (mock.call.devil.android.sdk.split_select.SelectSplits( - self.device, 'base.apk', - ['split1.apk', 'split2.apk', 'split3.apk'], - allow_cached_props=False), - ['split2.apk']), - (self.call.device._GetApplicationPathsInternal('test.package'), - ['base-on-device.apk', 'split2-on-device.apk']), - (self.call.device._ComputeStaleApks('test.package', - ['base.apk', 'split2.apk']), - (['split2.apk'], None)), - (self.call.adb.InstallMultiple( - ['split2.apk'], partial='test.package', reinstall=True, - allow_downgrade=False))): - self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk, - ['split1.apk', 'split2.apk', 'split3.apk'], - reinstall=True, permissions=[], retries=0) - - def testInstallSplitApk_downgrade(self): - with self.assertCalls( - (self.call.device._CheckSdkLevel(21)), - (mock.call.devil.android.sdk.split_select.SelectSplits( - self.device, 'base.apk', - ['split1.apk', 'split2.apk', 'split3.apk'], - allow_cached_props=False), - ['split2.apk']), - (self.call.device._GetApplicationPathsInternal('test.package'), - ['base-on-device.apk', 'split2-on-device.apk']), - (self.call.device._ComputeStaleApks('test.package', - ['base.apk', 'split2.apk']), - (['split2.apk'], None)), - (self.call.adb.InstallMultiple( - ['split2.apk'], partial='test.package', reinstall=True, - allow_downgrade=True))): - self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk, - ['split1.apk', 'split2.apk', 'split3.apk'], - reinstall=True, permissions=[], retries=0, - allow_downgrade=True) - - -class DeviceUtilsUninstallTest(DeviceUtilsTest): - def testUninstall_callsThrough(self): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), - ['/path.apk']), - self.call.adb.Uninstall('test.package', True)): - self.device.Uninstall('test.package', True) - - def testUninstall_noop(self): - with self.assertCalls( - (self.call.device._GetApplicationPathsInternal('test.package'), [])): - self.device.Uninstall('test.package', True) - - -class DeviceUtilsSuTest(DeviceUtilsTest): - def testSu_preM(self): - with self.patch_call( - self.call.device.build_version_sdk, - return_value=version_codes.LOLLIPOP_MR1): - self.assertEquals('su -c foo', self.device._Su('foo')) - - def testSu_mAndAbove(self): - with self.patch_call( - self.call.device.build_version_sdk, - return_value=version_codes.MARSHMALLOW): - self.assertEquals('su 0 foo', self.device._Su('foo')) - - -class DeviceUtilsRunShellCommandTest(DeviceUtilsTest): - - def setUp(self): - super(DeviceUtilsRunShellCommandTest, self).setUp() - self.device.NeedsSU = mock.Mock(return_value=False) - - def testRunShellCommand_commandAsList(self): - with self.assertCall(self.call.adb.Shell('pm list packages'), ''): - self.device.RunShellCommand(['pm', 'list', 'packages']) - - def testRunShellCommand_commandAsListQuoted(self): - with self.assertCall(self.call.adb.Shell("echo 'hello world' '$10'"), ''): - self.device.RunShellCommand(['echo', 'hello world', '$10']) - - def testRunShellCommand_commandAsString(self): - with self.assertCall(self.call.adb.Shell('echo "$VAR"'), ''): - self.device.RunShellCommand('echo "$VAR"') - - def testNewRunShellImpl_withEnv(self): - with self.assertCall( - self.call.adb.Shell('VAR=some_string echo "$VAR"'), ''): - self.device.RunShellCommand('echo "$VAR"', env={'VAR': 'some_string'}) - - def testNewRunShellImpl_withEnvQuoted(self): - with self.assertCall( - self.call.adb.Shell('PATH="$PATH:/other/path" run_this'), ''): - self.device.RunShellCommand('run_this', env={'PATH': '$PATH:/other/path'}) - - def testNewRunShellImpl_withEnv_failure(self): - with self.assertRaises(KeyError): - self.device.RunShellCommand('some_cmd', env={'INVALID NAME': 'value'}) - - def testNewRunShellImpl_withCwd(self): - with self.assertCall(self.call.adb.Shell('cd /some/test/path && ls'), ''): - self.device.RunShellCommand('ls', cwd='/some/test/path') - - def testNewRunShellImpl_withCwdQuoted(self): - with self.assertCall( - self.call.adb.Shell("cd '/some test/path with/spaces' && ls"), ''): - self.device.RunShellCommand('ls', cwd='/some test/path with/spaces') - - def testRunShellCommand_withHugeCmd(self): - payload = 'hi! ' * 1024 - expected_cmd = "echo '%s'" % payload - with self.assertCalls( - (mock.call.devil.android.device_temp_file.DeviceTempFile( - self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')), - self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd), - (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')): - self.assertEquals([payload], - self.device.RunShellCommand(['echo', payload])) - - def testRunShellCommand_withHugeCmdAndSU(self): - payload = 'hi! ' * 1024 - expected_cmd_without_su = """sh -c 'echo '"'"'%s'"'"''""" % payload - expected_cmd = 'su -c %s' % expected_cmd_without_su - with self.assertCalls( - (self.call.device.NeedsSU(), True), - (self.call.device._Su(expected_cmd_without_su), expected_cmd), - (mock.call.devil.android.device_temp_file.DeviceTempFile( - self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')), - self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd), - (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')): - self.assertEquals( - [payload], - self.device.RunShellCommand(['echo', payload], as_root=True)) - - def testRunShellCommand_withSu(self): - expected_cmd_without_su = "sh -c 'setprop service.adb.root 0'" - expected_cmd = 'su -c %s' % expected_cmd_without_su - with self.assertCalls( - (self.call.device.NeedsSU(), True), - (self.call.device._Su(expected_cmd_without_su), expected_cmd), - (self.call.adb.Shell(expected_cmd), '')): - self.device.RunShellCommand('setprop service.adb.root 0', as_root=True) - - def testRunShellCommand_manyLines(self): - cmd = 'ls /some/path' - with self.assertCall(self.call.adb.Shell(cmd), 'file1\nfile2\nfile3\n'): - self.assertEquals(['file1', 'file2', 'file3'], - self.device.RunShellCommand(cmd)) - - def testRunShellCommand_singleLine_success(self): - cmd = 'echo $VALUE' - with self.assertCall(self.call.adb.Shell(cmd), 'some value\n'): - self.assertEquals('some value', - self.device.RunShellCommand(cmd, single_line=True)) - - def testRunShellCommand_singleLine_successEmptyLine(self): - cmd = 'echo $VALUE' - with self.assertCall(self.call.adb.Shell(cmd), '\n'): - self.assertEquals('', - self.device.RunShellCommand(cmd, single_line=True)) - - def testRunShellCommand_singleLine_successWithoutEndLine(self): - cmd = 'echo -n $VALUE' - with self.assertCall(self.call.adb.Shell(cmd), 'some value'): - self.assertEquals('some value', - self.device.RunShellCommand(cmd, single_line=True)) - - def testRunShellCommand_singleLine_successNoOutput(self): - cmd = 'echo -n $VALUE' - with self.assertCall(self.call.adb.Shell(cmd), ''): - self.assertEquals('', - self.device.RunShellCommand(cmd, single_line=True)) - - def testRunShellCommand_singleLine_failTooManyLines(self): - cmd = 'echo $VALUE' - with self.assertCall(self.call.adb.Shell(cmd), - 'some value\nanother value\n'): - with self.assertRaises(device_errors.CommandFailedError): - self.device.RunShellCommand(cmd, single_line=True) - - def testRunShellCommand_checkReturn_success(self): - cmd = 'echo $ANDROID_DATA' - output = '/data\n' - with self.assertCall(self.call.adb.Shell(cmd), output): - self.assertEquals([output.rstrip()], - self.device.RunShellCommand(cmd, check_return=True)) - - def testRunShellCommand_checkReturn_failure(self): - cmd = 'ls /root' - output = 'opendir failed, Permission denied\n' - with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)): - with self.assertRaises(device_errors.AdbCommandFailedError): - self.device.RunShellCommand(cmd, check_return=True) - - def testRunShellCommand_checkReturn_disabled(self): - cmd = 'ls /root' - output = 'opendir failed, Permission denied\n' - with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)): - self.assertEquals([output.rstrip()], - self.device.RunShellCommand(cmd, check_return=False)) - - def testRunShellCommand_largeOutput_enabled(self): - cmd = 'echo $VALUE' - temp_file = MockTempFile('/sdcard/temp-123') - cmd_redirect = '( %s )>%s' % (cmd, temp_file.name) - with self.assertCalls( - (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb), - temp_file), - (self.call.adb.Shell(cmd_redirect)), - (self.call.device.ReadFile(temp_file.name, force_pull=True), - 'something')): - self.assertEquals( - ['something'], - self.device.RunShellCommand( - cmd, large_output=True, check_return=True)) - - def testRunShellCommand_largeOutput_disabledNoTrigger(self): - cmd = 'something' - with self.assertCall(self.call.adb.Shell(cmd), self.ShellError('')): - with self.assertRaises(device_errors.AdbCommandFailedError): - self.device.RunShellCommand(cmd, check_return=True) - - def testRunShellCommand_largeOutput_disabledTrigger(self): - cmd = 'echo $VALUE' - temp_file = MockTempFile('/sdcard/temp-123') - cmd_redirect = '( %s )>%s' % (cmd, temp_file.name) - with self.assertCalls( - (self.call.adb.Shell(cmd), self.ShellError('', None)), - (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb), - temp_file), - (self.call.adb.Shell(cmd_redirect)), - (self.call.device.ReadFile(mock.ANY, force_pull=True), - 'something')): - self.assertEquals(['something'], - self.device.RunShellCommand(cmd, check_return=True)) - - -class DeviceUtilsRunPipedShellCommandTest(DeviceUtilsTest): - - def testRunPipedShellCommand_success(self): - with self.assertCall( - self.call.device.RunShellCommand( - 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"', - check_return=True), - ['This line contains foo', 'PIPESTATUS: 0 0']): - self.assertEquals(['This line contains foo'], - self.device._RunPipedShellCommand('ps | grep foo')) - - def testRunPipedShellCommand_firstCommandFails(self): - with self.assertCall( - self.call.device.RunShellCommand( - 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"', - check_return=True), - ['PIPESTATUS: 1 0']): - with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec: - self.device._RunPipedShellCommand('ps | grep foo') - self.assertEquals([1, 0], ec.exception.status) - - def testRunPipedShellCommand_secondCommandFails(self): - with self.assertCall( - self.call.device.RunShellCommand( - 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"', - check_return=True), - ['PIPESTATUS: 0 1']): - with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec: - self.device._RunPipedShellCommand('ps | grep foo') - self.assertEquals([0, 1], ec.exception.status) - - def testRunPipedShellCommand_outputCutOff(self): - with self.assertCall( - self.call.device.RunShellCommand( - 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"', - check_return=True), - ['foo.bar'] * 256 + ['foo.ba']): - with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec: - self.device._RunPipedShellCommand('ps | grep foo') - self.assertIs(None, ec.exception.status) - - -@mock.patch('time.sleep', mock.Mock()) -class DeviceUtilsKillAllTest(DeviceUtilsTest): - - def testKillAll_noMatchingProcessesFailure(self): - with self.assertCall(self.call.device.GetPids('test_process'), {}): - with self.assertRaises(device_errors.CommandFailedError): - self.device.KillAll('test_process') - - def testKillAll_noMatchingProcessesQuiet(self): - with self.assertCall(self.call.device.GetPids('test_process'), {}): - self.assertEqual(0, self.device.KillAll('test_process', quiet=True)) - - def testKillAll_nonblocking(self): - with self.assertCalls( - (self.call.device.GetPids('some.process'), - {'some.process': ['1234'], 'some.processing.thing': ['5678']}), - (self.call.adb.Shell('kill -9 1234 5678'), '')): - self.assertEquals( - 2, self.device.KillAll('some.process', blocking=False)) - - def testKillAll_blocking(self): - with self.assertCalls( - (self.call.device.GetPids('some.process'), - {'some.process': ['1234'], 'some.processing.thing': ['5678']}), - (self.call.adb.Shell('kill -9 1234 5678'), ''), - (self.call.device.GetPids('some.process'), - {'some.processing.thing': ['5678']}), - (self.call.device.GetPids('some.process'), - {'some.process': ['1111']})): # Other instance with different pid. - self.assertEquals( - 2, self.device.KillAll('some.process', blocking=True)) - - def testKillAll_exactNonblocking(self): - with self.assertCalls( - (self.call.device.GetPids('some.process'), - {'some.process': ['1234'], 'some.processing.thing': ['5678']}), - (self.call.adb.Shell('kill -9 1234'), '')): - self.assertEquals( - 1, self.device.KillAll('some.process', exact=True, blocking=False)) - - def testKillAll_exactBlocking(self): - with self.assertCalls( - (self.call.device.GetPids('some.process'), - {'some.process': ['1234'], 'some.processing.thing': ['5678']}), - (self.call.adb.Shell('kill -9 1234'), ''), - (self.call.device.GetPids('some.process'), - {'some.process': ['1234'], 'some.processing.thing': ['5678']}), - (self.call.device.GetPids('some.process'), - {'some.processing.thing': ['5678']})): - self.assertEquals( - 1, self.device.KillAll('some.process', exact=True, blocking=True)) - - def testKillAll_root(self): - with self.assertCalls( - (self.call.device.GetPids('some.process'), {'some.process': ['1234']}), - (self.call.device.NeedsSU(), True), - (self.call.device._Su("sh -c 'kill -9 1234'"), - "su -c sh -c 'kill -9 1234'"), - (self.call.adb.Shell("su -c sh -c 'kill -9 1234'"), '')): - self.assertEquals( - 1, self.device.KillAll('some.process', as_root=True)) - - def testKillAll_sigterm(self): - with self.assertCalls( - (self.call.device.GetPids('some.process'), - {'some.process': ['1234']}), - (self.call.adb.Shell('kill -15 1234'), '')): - self.assertEquals( - 1, self.device.KillAll('some.process', signum=device_signal.SIGTERM)) - - def testKillAll_multipleInstances(self): - with self.assertCalls( - (self.call.device.GetPids('some.process'), - {'some.process': ['1234', '4567']}), - (self.call.adb.Shell('kill -15 1234 4567'), '')): - self.assertEquals( - 2, self.device.KillAll('some.process', signum=device_signal.SIGTERM)) - - -class DeviceUtilsStartActivityTest(DeviceUtilsTest): - - def testStartActivity_actionOnly(self): - test_intent = intent.Intent(action='android.intent.action.VIEW') - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - def testStartActivity_success(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main') - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - def testStartActivity_failure(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main') - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main'), - 'Error: Failed to start test activity'): - with self.assertRaises(device_errors.CommandFailedError): - self.device.StartActivity(test_intent) - - def testStartActivity_blocking(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main') - with self.assertCall( - self.call.adb.Shell('am start ' - '-W ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent, blocking=True) - - def testStartActivity_withCategory(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main', - category='android.intent.category.HOME') - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-c android.intent.category.HOME ' - '-n test.package/.Main'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - def testStartActivity_withMultipleCategories(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main', - category=['android.intent.category.HOME', - 'android.intent.category.BROWSABLE']) - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-c android.intent.category.HOME ' - '-c android.intent.category.BROWSABLE ' - '-n test.package/.Main'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - def testStartActivity_withData(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main', - data='http://www.google.com/') - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-d http://www.google.com/ ' - '-n test.package/.Main'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - def testStartActivity_withStringExtra(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main', - extras={'foo': 'test'}) - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main ' - '--es foo test'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - def testStartActivity_withBoolExtra(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main', - extras={'foo': True}) - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main ' - '--ez foo True'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - def testStartActivity_withIntExtra(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main', - extras={'foo': 123}) - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main ' - '--ei foo 123'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - def testStartActivity_withTraceFile(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main') - with self.assertCall( - self.call.adb.Shell('am start ' - '--start-profiler test_trace_file.out ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent, - trace_file_name='test_trace_file.out') - - def testStartActivity_withForceStop(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main') - with self.assertCall( - self.call.adb.Shell('am start ' - '-S ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent, force_stop=True) - - def testStartActivity_withFlags(self): - test_intent = intent.Intent(action='android.intent.action.VIEW', - package='test.package', - activity='.Main', - flags='0x10000000') - with self.assertCall( - self.call.adb.Shell('am start ' - '-a android.intent.action.VIEW ' - '-n test.package/.Main ' - '-f 0x10000000'), - 'Starting: Intent { act=android.intent.action.VIEW }'): - self.device.StartActivity(test_intent) - - -class DeviceUtilsStartInstrumentationTest(DeviceUtilsTest): - - def testStartInstrumentation_nothing(self): - with self.assertCalls( - self.call.device.RunShellCommand( - 'p=test.package;am instrument "$p"/.TestInstrumentation', - check_return=True, large_output=True)): - self.device.StartInstrumentation( - 'test.package/.TestInstrumentation', - finish=False, raw=False, extras=None) - - def testStartInstrumentation_finish(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - 'p=test.package;am instrument -w "$p"/.TestInstrumentation', - check_return=True, large_output=True), - ['OK (1 test)'])): - output = self.device.StartInstrumentation( - 'test.package/.TestInstrumentation', - finish=True, raw=False, extras=None) - self.assertEquals(['OK (1 test)'], output) - - def testStartInstrumentation_raw(self): - with self.assertCalls( - self.call.device.RunShellCommand( - 'p=test.package;am instrument -r "$p"/.TestInstrumentation', - check_return=True, large_output=True)): - self.device.StartInstrumentation( - 'test.package/.TestInstrumentation', - finish=False, raw=True, extras=None) - - def testStartInstrumentation_extras(self): - with self.assertCalls( - self.call.device.RunShellCommand( - 'p=test.package;am instrument -e "$p".foo Foo -e bar \'Val \'"$p" ' - '"$p"/.TestInstrumentation', - check_return=True, large_output=True)): - self.device.StartInstrumentation( - 'test.package/.TestInstrumentation', - finish=False, raw=False, extras={'test.package.foo': 'Foo', - 'bar': 'Val test.package'}) - - -class DeviceUtilsBroadcastIntentTest(DeviceUtilsTest): - - def testBroadcastIntent_noExtras(self): - test_intent = intent.Intent(action='test.package.with.an.INTENT') - with self.assertCall( - self.call.adb.Shell('am broadcast -a test.package.with.an.INTENT'), - 'Broadcasting: Intent { act=test.package.with.an.INTENT } '): - self.device.BroadcastIntent(test_intent) - - def testBroadcastIntent_withExtra(self): - test_intent = intent.Intent(action='test.package.with.an.INTENT', - extras={'foo': 'bar value'}) - with self.assertCall( - self.call.adb.Shell( - "am broadcast -a test.package.with.an.INTENT --es foo 'bar value'"), - 'Broadcasting: Intent { act=test.package.with.an.INTENT } '): - self.device.BroadcastIntent(test_intent) - - def testBroadcastIntent_withExtra_noValue(self): - test_intent = intent.Intent(action='test.package.with.an.INTENT', - extras={'foo': None}) - with self.assertCall( - self.call.adb.Shell( - 'am broadcast -a test.package.with.an.INTENT --esn foo'), - 'Broadcasting: Intent { act=test.package.with.an.INTENT } '): - self.device.BroadcastIntent(test_intent) - - -class DeviceUtilsGoHomeTest(DeviceUtilsTest): - - def testGoHome_popupsExist(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), []), - (self.call.device.RunShellCommand( - ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', - '-c', 'android.intent.category.HOME'], check_return=True), - 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), []), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '66'], check_return=True)), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '4'], check_return=True)), - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), - ['mCurrentFocus Launcher'])): - self.device.GoHome() - - def testGoHome_willRetry(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), []), - (self.call.device.RunShellCommand( - ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', - '-c', 'android.intent.category.HOME'], check_return=True), - 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), []), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '66'], check_return=True,)), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '4'], check_return=True)), - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), []), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '66'], check_return=True)), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '4'], check_return=True)), - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), - self.TimeoutError())): - with self.assertRaises(device_errors.CommandTimeoutError): - self.device.GoHome() - - def testGoHome_alreadyFocused(self): - with self.assertCall( - self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), - ['mCurrentFocus Launcher']): - self.device.GoHome() - - def testGoHome_alreadyFocusedAlternateCase(self): - with self.assertCall( - self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), - [' mCurrentFocus .launcher/.']): - self.device.GoHome() - - def testGoHome_obtainsFocusAfterGoingHome(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), []), - (self.call.device.RunShellCommand( - ['am', 'start', '-W', '-a', 'android.intent.action.MAIN', - '-c', 'android.intent.category.HOME'], check_return=True), - 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''), - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), - ['mCurrentFocus Launcher'])): - self.device.GoHome() - -class DeviceUtilsForceStopTest(DeviceUtilsTest): - - def testForceStop(self): - with self.assertCall( - self.call.adb.Shell('p=test.package;if [[ "$(ps)" = *$p* ]]; then ' - 'am force-stop $p; fi'), - ''): - self.device.ForceStop('test.package') - - -class DeviceUtilsClearApplicationStateTest(DeviceUtilsTest): - - def testClearApplicationState_setPermissions(self): - with self.assertCalls( - (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'), - (self.call.device._GetApplicationPathsInternal('this.package.exists'), - ['/data/app/this.package.exists.apk']), - (self.call.device.RunShellCommand( - ['pm', 'clear', 'this.package.exists'], - check_return=True), - ['Success']), - (self.call.device.GrantPermissions( - 'this.package.exists', ['p1']), [])): - self.device.ClearApplicationState( - 'this.package.exists', permissions=['p1']) - - def testClearApplicationState_packageDoesntExist(self): - with self.assertCalls( - (self.call.device.GetProp('ro.build.version.sdk', cache=True), '11'), - (self.call.device._GetApplicationPathsInternal('does.not.exist'), - [])): - self.device.ClearApplicationState('does.not.exist') - - def testClearApplicationState_packageDoesntExistOnAndroidJBMR2OrAbove(self): - with self.assertCalls( - (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'), - (self.call.device.RunShellCommand( - ['pm', 'clear', 'this.package.does.not.exist'], - check_return=True), - ['Failed'])): - self.device.ClearApplicationState('this.package.does.not.exist') - - def testClearApplicationState_packageExists(self): - with self.assertCalls( - (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'), - (self.call.device._GetApplicationPathsInternal('this.package.exists'), - ['/data/app/this.package.exists.apk']), - (self.call.device.RunShellCommand( - ['pm', 'clear', 'this.package.exists'], - check_return=True), - ['Success'])): - self.device.ClearApplicationState('this.package.exists') - - def testClearApplicationState_packageExistsOnAndroidJBMR2OrAbove(self): - with self.assertCalls( - (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'), - (self.call.device.RunShellCommand( - ['pm', 'clear', 'this.package.exists'], - check_return=True), - ['Success'])): - self.device.ClearApplicationState('this.package.exists') - - -class DeviceUtilsSendKeyEventTest(DeviceUtilsTest): - - def testSendKeyEvent(self): - with self.assertCall(self.call.adb.Shell('input keyevent 66'), ''): - self.device.SendKeyEvent(66) - - -class DeviceUtilsPushChangedFilesIndividuallyTest(DeviceUtilsTest): - - def testPushChangedFilesIndividually_empty(self): - test_files = [] - with self.assertCalls(): - self.device._PushChangedFilesIndividually(test_files) - - def testPushChangedFilesIndividually_single(self): - test_files = [('/test/host/path', '/test/device/path')] - with self.assertCalls(self.call.adb.Push(*test_files[0])): - self.device._PushChangedFilesIndividually(test_files) - - def testPushChangedFilesIndividually_multiple(self): - test_files = [ - ('/test/host/path/file1', '/test/device/path/file1'), - ('/test/host/path/file2', '/test/device/path/file2')] - with self.assertCalls( - self.call.adb.Push(*test_files[0]), - self.call.adb.Push(*test_files[1])): - self.device._PushChangedFilesIndividually(test_files) - - -class DeviceUtilsPushChangedFilesZippedTest(DeviceUtilsTest): - - def testPushChangedFilesZipped_noUnzipCommand(self): - test_files = [('/test/host/path/file1', '/test/device/path/file1')] - mock_zip_temp = mock.mock_open() - mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip' - with self.assertCalls( - (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp), - (mock.call.multiprocessing.Process( - target=device_utils.DeviceUtils._CreateDeviceZip, - args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()), - (self.call.device._MaybeInstallCommands(), False)): - self.assertFalse(self.device._PushChangedFilesZipped(test_files, - ['/test/dir'])) - - def _testPushChangedFilesZipped_spec(self, test_files): - mock_zip_temp = mock.mock_open() - mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip' - with self.assertCalls( - (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp), - (mock.call.multiprocessing.Process( - target=device_utils.DeviceUtils._CreateDeviceZip, - args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()), - (self.call.device._MaybeInstallCommands(), True), - (self.call.device.NeedsSU(), True), - (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb, - suffix='.zip'), - MockTempFile('/test/sdcard/foo123.zip')), - self.call.adb.Push( - '/test/temp/file/tmp.zip', '/test/sdcard/foo123.zip'), - self.call.device.RunShellCommand( - 'unzip /test/sdcard/foo123.zip&&chmod -R 777 /test/dir', - as_root=True, - env={'PATH': '/data/local/tmp/bin:$PATH'}, - check_return=True)): - self.assertTrue(self.device._PushChangedFilesZipped(test_files, - ['/test/dir'])) - - def testPushChangedFilesZipped_single(self): - self._testPushChangedFilesZipped_spec( - [('/test/host/path/file1', '/test/device/path/file1')]) - - def testPushChangedFilesZipped_multiple(self): - self._testPushChangedFilesZipped_spec( - [('/test/host/path/file1', '/test/device/path/file1'), - ('/test/host/path/file2', '/test/device/path/file2')]) - - -class DeviceUtilsPathExistsTest(DeviceUtilsTest): - - def testPathExists_pathExists(self): - with self.assertCall( - self.call.device.RunShellCommand( - "test -e '/path/file exists'", - as_root=False, check_return=True, timeout=10, retries=0), - []): - self.assertTrue(self.device.PathExists('/path/file exists')) - - def testPathExists_multiplePathExists(self): - with self.assertCall( - self.call.device.RunShellCommand( - "test -e '/path 1' -a -e /path2", - as_root=False, check_return=True, timeout=10, retries=0), - []): - self.assertTrue(self.device.PathExists(('/path 1', '/path2'))) - - def testPathExists_pathDoesntExist(self): - with self.assertCall( - self.call.device.RunShellCommand( - "test -e /path/file.not.exists", - as_root=False, check_return=True, timeout=10, retries=0), - self.ShellError()): - self.assertFalse(self.device.PathExists('/path/file.not.exists')) - - def testPathExists_asRoot(self): - with self.assertCall( - self.call.device.RunShellCommand( - "test -e /root/path/exists", - as_root=True, check_return=True, timeout=10, retries=0), - self.ShellError()): - self.assertFalse( - self.device.PathExists('/root/path/exists', as_root=True)) - - def testFileExists_pathDoesntExist(self): - with self.assertCall( - self.call.device.RunShellCommand( - "test -e /path/file.not.exists", - as_root=False, check_return=True, timeout=10, retries=0), - self.ShellError()): - self.assertFalse(self.device.FileExists('/path/file.not.exists')) - - -class DeviceUtilsPullFileTest(DeviceUtilsTest): - - def testPullFile_existsOnDevice(self): - with mock.patch('os.path.exists', return_value=True): - with self.assertCall( - self.call.adb.Pull('/data/app/test.file.exists', - '/test/file/host/path')): - self.device.PullFile('/data/app/test.file.exists', - '/test/file/host/path') - - def testPullFile_doesntExistOnDevice(self): - with mock.patch('os.path.exists', return_value=True): - with self.assertCall( - self.call.adb.Pull('/data/app/test.file.does.not.exist', - '/test/file/host/path'), - self.CommandError('remote object does not exist')): - with self.assertRaises(device_errors.CommandFailedError): - self.device.PullFile('/data/app/test.file.does.not.exist', - '/test/file/host/path') - - -class DeviceUtilsReadFileTest(DeviceUtilsTest): - - def testReadFileWithPull_success(self): - tmp_host_dir = '/tmp/dir/on.host/' - tmp_host = MockTempFile('/tmp/dir/on.host/tmp_ReadFileWithPull') - tmp_host.file.read.return_value = 'some interesting contents' - with self.assertCalls( - (mock.call.tempfile.mkdtemp(), tmp_host_dir), - (self.call.adb.Pull('/path/to/device/file', mock.ANY)), - (mock.call.__builtin__.open(mock.ANY, 'r'), tmp_host), - (mock.call.os.path.exists(tmp_host_dir), True), - (mock.call.shutil.rmtree(tmp_host_dir), None)): - self.assertEquals('some interesting contents', - self.device._ReadFileWithPull('/path/to/device/file')) - tmp_host.file.read.assert_called_once_with() - - def testReadFileWithPull_rejected(self): - tmp_host_dir = '/tmp/dir/on.host/' - with self.assertCalls( - (mock.call.tempfile.mkdtemp(), tmp_host_dir), - (self.call.adb.Pull('/path/to/device/file', mock.ANY), - self.CommandError()), - (mock.call.os.path.exists(tmp_host_dir), True), - (mock.call.shutil.rmtree(tmp_host_dir), None)): - with self.assertRaises(device_errors.CommandFailedError): - self.device._ReadFileWithPull('/path/to/device/file') - - def testReadFile_exists(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['ls', '-l', '/read/this/test/file'], - as_root=False, check_return=True), - ['-rw-rw---- root foo 256 1970-01-01 00:00 file']), - (self.call.device.RunShellCommand( - ['cat', '/read/this/test/file'], - as_root=False, check_return=True), - ['this is a test file'])): - self.assertEqual('this is a test file\n', - self.device.ReadFile('/read/this/test/file')) - - def testReadFile_doesNotExist(self): - with self.assertCall( - self.call.device.RunShellCommand( - ['ls', '-l', '/this/file/does.not.exist'], - as_root=False, check_return=True), - self.CommandError('File does not exist')): - with self.assertRaises(device_errors.CommandFailedError): - self.device.ReadFile('/this/file/does.not.exist') - - def testReadFile_zeroSize(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['ls', '-l', '/this/file/has/zero/size'], - as_root=False, check_return=True), - ['-r--r--r-- root foo 0 1970-01-01 00:00 zero_size_file']), - (self.call.device._ReadFileWithPull('/this/file/has/zero/size'), - 'but it has contents\n')): - self.assertEqual('but it has contents\n', - self.device.ReadFile('/this/file/has/zero/size')) - - def testReadFile_withSU(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['ls', '-l', '/this/file/can.be.read.with.su'], - as_root=True, check_return=True), - ['-rw------- root root 256 1970-01-01 00:00 can.be.read.with.su']), - (self.call.device.RunShellCommand( - ['cat', '/this/file/can.be.read.with.su'], - as_root=True, check_return=True), - ['this is a test file', 'read with su'])): - self.assertEqual( - 'this is a test file\nread with su\n', - self.device.ReadFile('/this/file/can.be.read.with.su', - as_root=True)) - - def testReadFile_withPull(self): - contents = 'a' * 123456 - with self.assertCalls( - (self.call.device.RunShellCommand( - ['ls', '-l', '/read/this/big/test/file'], - as_root=False, check_return=True), - ['-rw-rw---- root foo 123456 1970-01-01 00:00 file']), - (self.call.device._ReadFileWithPull('/read/this/big/test/file'), - contents)): - self.assertEqual( - contents, self.device.ReadFile('/read/this/big/test/file')) - - def testReadFile_withPullAndSU(self): - contents = 'b' * 123456 - with self.assertCalls( - (self.call.device.RunShellCommand( - ['ls', '-l', '/this/big/file/can.be.read.with.su'], - as_root=True, check_return=True), - ['-rw------- root root 123456 1970-01-01 00:00 can.be.read.with.su']), - (self.call.device.NeedsSU(), True), - (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb), - MockTempFile('/sdcard/tmp/on.device')), - self.call.device.RunShellCommand( - 'SRC=/this/big/file/can.be.read.with.su DEST=/sdcard/tmp/on.device;' - 'cp "$SRC" "$DEST" && chmod 666 "$DEST"', - as_root=True, check_return=True), - (self.call.device._ReadFileWithPull('/sdcard/tmp/on.device'), - contents)): - self.assertEqual( - contents, - self.device.ReadFile('/this/big/file/can.be.read.with.su', - as_root=True)) - - def testReadFile_forcePull(self): - contents = 'a' * 123456 - with self.assertCall( - self.call.device._ReadFileWithPull('/read/this/big/test/file'), - contents): - self.assertEqual( - contents, - self.device.ReadFile('/read/this/big/test/file', force_pull=True)) - - -class DeviceUtilsWriteFileTest(DeviceUtilsTest): - - def testWriteFileWithPush_success(self): - tmp_host = MockTempFile('/tmp/file/on.host') - contents = 'some interesting contents' - with self.assertCalls( - (mock.call.tempfile.NamedTemporaryFile(), tmp_host), - self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file')): - self.device._WriteFileWithPush('/path/to/device/file', contents) - tmp_host.file.write.assert_called_once_with(contents) - - def testWriteFileWithPush_rejected(self): - tmp_host = MockTempFile('/tmp/file/on.host') - contents = 'some interesting contents' - with self.assertCalls( - (mock.call.tempfile.NamedTemporaryFile(), tmp_host), - (self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file'), - self.CommandError())): - with self.assertRaises(device_errors.CommandFailedError): - self.device._WriteFileWithPush('/path/to/device/file', contents) - - def testWriteFile_withPush(self): - contents = 'some large contents ' * 26 # 20 * 26 = 520 chars - with self.assertCalls( - self.call.device._WriteFileWithPush('/path/to/device/file', contents)): - self.device.WriteFile('/path/to/device/file', contents) - - def testWriteFile_withPushForced(self): - contents = 'tiny contents' - with self.assertCalls( - self.call.device._WriteFileWithPush('/path/to/device/file', contents)): - self.device.WriteFile('/path/to/device/file', contents, force_push=True) - - def testWriteFile_withPushAndSU(self): - contents = 'some large contents ' * 26 # 20 * 26 = 520 chars - with self.assertCalls( - (self.call.device.NeedsSU(), True), - (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb), - MockTempFile('/sdcard/tmp/on.device')), - self.call.device._WriteFileWithPush('/sdcard/tmp/on.device', contents), - self.call.device.RunShellCommand( - ['cp', '/sdcard/tmp/on.device', '/path/to/device/file'], - as_root=True, check_return=True)): - self.device.WriteFile('/path/to/device/file', contents, as_root=True) - - def testWriteFile_withEcho(self): - with self.assertCall(self.call.adb.Shell( - "echo -n the.contents > /test/file/to.write"), ''): - self.device.WriteFile('/test/file/to.write', 'the.contents') - - def testWriteFile_withEchoAndQuotes(self): - with self.assertCall(self.call.adb.Shell( - "echo -n 'the contents' > '/test/file/to write'"), ''): - self.device.WriteFile('/test/file/to write', 'the contents') - - def testWriteFile_withEchoAndSU(self): - expected_cmd_without_su = "sh -c 'echo -n contents > /test/file'" - expected_cmd = 'su -c %s' % expected_cmd_without_su - with self.assertCalls( - (self.call.device.NeedsSU(), True), - (self.call.device._Su(expected_cmd_without_su), expected_cmd), - (self.call.adb.Shell(expected_cmd), - '')): - self.device.WriteFile('/test/file', 'contents', as_root=True) - - -class DeviceUtilsLsTest(DeviceUtilsTest): - - def testLs_directory(self): - result = [('.', adb_wrapper.DeviceStat(16889, 4096, 1417436123)), - ('..', adb_wrapper.DeviceStat(16873, 4096, 12382237)), - ('testfile.txt', adb_wrapper.DeviceStat(33206, 3, 1417436122))] - with self.assertCalls( - (self.call.adb.Ls('/data/local/tmp'), result)): - self.assertEquals(result, - self.device.Ls('/data/local/tmp')) - - def testLs_nothing(self): - with self.assertCalls( - (self.call.adb.Ls('/data/local/tmp/testfile.txt'), [])): - self.assertEquals([], - self.device.Ls('/data/local/tmp/testfile.txt')) - - -class DeviceUtilsStatTest(DeviceUtilsTest): - - def testStat_file(self): - result = [('.', adb_wrapper.DeviceStat(16889, 4096, 1417436123)), - ('..', adb_wrapper.DeviceStat(16873, 4096, 12382237)), - ('testfile.txt', adb_wrapper.DeviceStat(33206, 3, 1417436122))] - with self.assertCalls( - (self.call.adb.Ls('/data/local/tmp'), result)): - self.assertEquals(adb_wrapper.DeviceStat(33206, 3, 1417436122), - self.device.Stat('/data/local/tmp/testfile.txt')) - - def testStat_directory(self): - result = [('.', adb_wrapper.DeviceStat(16873, 4096, 12382237)), - ('..', adb_wrapper.DeviceStat(16873, 4096, 12382237)), - ('tmp', adb_wrapper.DeviceStat(16889, 4096, 1417436123))] - with self.assertCalls( - (self.call.adb.Ls('/data/local'), result)): - self.assertEquals(adb_wrapper.DeviceStat(16889, 4096, 1417436123), - self.device.Stat('/data/local/tmp')) - - def testStat_doesNotExist(self): - result = [('.', adb_wrapper.DeviceStat(16889, 4096, 1417436123)), - ('..', adb_wrapper.DeviceStat(16873, 4096, 12382237)), - ('testfile.txt', adb_wrapper.DeviceStat(33206, 3, 1417436122))] - with self.assertCalls( - (self.call.adb.Ls('/data/local/tmp'), result)): - with self.assertRaises(device_errors.CommandFailedError): - self.device.Stat('/data/local/tmp/does.not.exist.txt') - - -class DeviceUtilsSetJavaAssertsTest(DeviceUtilsTest): - - def testSetJavaAsserts_enable(self): - with self.assertCalls( - (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH), - 'some.example.prop=with an example value\n' - 'some.other.prop=value_ok\n'), - self.call.device.WriteFile( - self.device.LOCAL_PROPERTIES_PATH, - 'some.example.prop=with an example value\n' - 'some.other.prop=value_ok\n' - 'dalvik.vm.enableassertions=all\n'), - (self.call.device.GetProp('dalvik.vm.enableassertions'), ''), - self.call.device.SetProp('dalvik.vm.enableassertions', 'all')): - self.assertTrue(self.device.SetJavaAsserts(True)) - - def testSetJavaAsserts_disable(self): - with self.assertCalls( - (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH), - 'some.example.prop=with an example value\n' - 'dalvik.vm.enableassertions=all\n' - 'some.other.prop=value_ok\n'), - self.call.device.WriteFile( - self.device.LOCAL_PROPERTIES_PATH, - 'some.example.prop=with an example value\n' - 'some.other.prop=value_ok\n'), - (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all'), - self.call.device.SetProp('dalvik.vm.enableassertions', '')): - self.assertTrue(self.device.SetJavaAsserts(False)) - - def testSetJavaAsserts_alreadyEnabled(self): - with self.assertCalls( - (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH), - 'some.example.prop=with an example value\n' - 'dalvik.vm.enableassertions=all\n' - 'some.other.prop=value_ok\n'), - (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')): - self.assertFalse(self.device.SetJavaAsserts(True)) - - def testSetJavaAsserts_malformedLocalProp(self): - with self.assertCalls( - (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH), - 'some.example.prop=with an example value\n' - 'malformed_property\n' - 'dalvik.vm.enableassertions=all\n' - 'some.other.prop=value_ok\n'), - (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')): - self.assertFalse(self.device.SetJavaAsserts(True)) - - -class DeviceUtilsGetPropTest(DeviceUtilsTest): - - def testGetProp_exists(self): - with self.assertCall( - self.call.device.RunShellCommand( - ['getprop', 'test.property'], check_return=True, single_line=True, - timeout=self.device._default_timeout, - retries=self.device._default_retries), - 'property_value'): - self.assertEqual('property_value', - self.device.GetProp('test.property')) - - def testGetProp_doesNotExist(self): - with self.assertCall( - self.call.device.RunShellCommand( - ['getprop', 'property.does.not.exist'], - check_return=True, single_line=True, - timeout=self.device._default_timeout, - retries=self.device._default_retries), - ''): - self.assertEqual('', self.device.GetProp('property.does.not.exist')) - - def testGetProp_cachedRoProp(self): - with self.assertCall( - self.call.device.RunShellCommand( - ['getprop'], check_return=True, large_output=True, - timeout=self.device._default_timeout, - retries=self.device._default_retries), - ['[ro.build.type]: [userdebug]']): - self.assertEqual('userdebug', - self.device.GetProp('ro.build.type', cache=True)) - self.assertEqual('userdebug', - self.device.GetProp('ro.build.type', cache=True)) - - def testGetProp_retryAndCache(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['getprop'], check_return=True, large_output=True, - timeout=self.device._default_timeout, - retries=3), - ['[ro.build.type]: [userdebug]'])): - self.assertEqual('userdebug', - self.device.GetProp('ro.build.type', - cache=True, retries=3)) - self.assertEqual('userdebug', - self.device.GetProp('ro.build.type', - cache=True, retries=3)) - - -class DeviceUtilsSetPropTest(DeviceUtilsTest): - - def testSetProp(self): - with self.assertCall( - self.call.device.RunShellCommand( - ['setprop', 'test.property', 'test value'], check_return=True)): - self.device.SetProp('test.property', 'test value') - - def testSetProp_check_succeeds(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['setprop', 'test.property', 'new_value'], check_return=True)), - (self.call.device.GetProp('test.property', cache=False), 'new_value')): - self.device.SetProp('test.property', 'new_value', check=True) - - def testSetProp_check_fails(self): - with self.assertCalls( - (self.call.device.RunShellCommand( - ['setprop', 'test.property', 'new_value'], check_return=True)), - (self.call.device.GetProp('test.property', cache=False), 'old_value')): - with self.assertRaises(device_errors.CommandFailedError): - self.device.SetProp('test.property', 'new_value', check=True) - - -class DeviceUtilsGetPidsTest(DeviceUtilsTest): - - def testGetPids_noMatches(self): - with self.assertCall( - self.call.device._RunPipedShellCommand('ps | grep -F does.not.match'), - []): - self.assertEqual({}, self.device.GetPids('does.not.match')) - - def testGetPids_oneMatch(self): - with self.assertCall( - self.call.device._RunPipedShellCommand('ps | grep -F one.match'), - ['user 1001 100 1024 1024 ffffffff 00000000 one.match']): - self.assertEqual( - {'one.match': ['1001']}, - self.device.GetPids('one.match')) - - def testGetPids_multipleMatches(self): - with self.assertCall( - self.call.device._RunPipedShellCommand('ps | grep -F match'), - ['user 1001 100 1024 1024 ffffffff 00000000 one.match', - 'user 1002 100 1024 1024 ffffffff 00000000 two.match', - 'user 1003 100 1024 1024 ffffffff 00000000 three.match']): - self.assertEqual( - {'one.match': ['1001'], - 'two.match': ['1002'], - 'three.match': ['1003']}, - self.device.GetPids('match')) - - def testGetPids_exactMatch(self): - with self.assertCall( - self.call.device._RunPipedShellCommand('ps | grep -F exact.match'), - ['user 1000 100 1024 1024 ffffffff 00000000 not.exact.match', - 'user 1234 100 1024 1024 ffffffff 00000000 exact.match']): - self.assertEqual( - {'not.exact.match': ['1000'], 'exact.match': ['1234']}, - self.device.GetPids('exact.match')) - - def testGetPids_quotable(self): - with self.assertCall( - self.call.device._RunPipedShellCommand("ps | grep -F 'my$process'"), - ['user 1234 100 1024 1024 ffffffff 00000000 my$process']): - self.assertEqual( - {'my$process': ['1234']}, self.device.GetPids('my$process')) - - def testGetPids_multipleInstances(self): - with self.assertCall( - self.call.device._RunPipedShellCommand('ps | grep -F foo'), - ['user 1000 100 1024 1024 ffffffff 00000000 foo', - 'user 1234 100 1024 1024 ffffffff 00000000 foo']): - self.assertEqual( - {'foo': ['1000', '1234']}, - self.device.GetPids('foo')) - - -class DeviceUtilsTakeScreenshotTest(DeviceUtilsTest): - - def testTakeScreenshot_fileNameProvided(self): - with self.assertCalls( - (mock.call.devil.android.device_temp_file.DeviceTempFile( - self.adb, suffix='.png'), - MockTempFile('/tmp/path/temp-123.png')), - (self.call.adb.Shell('/system/bin/screencap -p /tmp/path/temp-123.png'), - ''), - self.call.device.PullFile('/tmp/path/temp-123.png', - '/test/host/screenshot.png')): - self.device.TakeScreenshot('/test/host/screenshot.png') - - -class DeviceUtilsGetMemoryUsageForPidTest(DeviceUtilsTest): - - def setUp(self): - super(DeviceUtilsGetMemoryUsageForPidTest, self).setUp() - - def testGetMemoryUsageForPid_validPid(self): - with self.assertCalls( - (self.call.device._RunPipedShellCommand( - 'showmap 1234 | grep TOTAL', as_root=True), - ['100 101 102 103 104 105 106 107 TOTAL']), - (self.call.device.ReadFile('/proc/1234/status', as_root=True), - 'VmHWM: 1024 kB\n')): - self.assertEqual( - { - 'Size': 100, - 'Rss': 101, - 'Pss': 102, - 'Shared_Clean': 103, - 'Shared_Dirty': 104, - 'Private_Clean': 105, - 'Private_Dirty': 106, - 'VmHWM': 1024 - }, - self.device.GetMemoryUsageForPid(1234)) - - def testGetMemoryUsageForPid_noSmaps(self): - with self.assertCalls( - (self.call.device._RunPipedShellCommand( - 'showmap 4321 | grep TOTAL', as_root=True), - ['cannot open /proc/4321/smaps: No such file or directory']), - (self.call.device.ReadFile('/proc/4321/status', as_root=True), - 'VmHWM: 1024 kb\n')): - self.assertEquals({'VmHWM': 1024}, self.device.GetMemoryUsageForPid(4321)) - - def testGetMemoryUsageForPid_noStatus(self): - with self.assertCalls( - (self.call.device._RunPipedShellCommand( - 'showmap 4321 | grep TOTAL', as_root=True), - ['100 101 102 103 104 105 106 107 TOTAL']), - (self.call.device.ReadFile('/proc/4321/status', as_root=True), - self.CommandError())): - self.assertEquals( - { - 'Size': 100, - 'Rss': 101, - 'Pss': 102, - 'Shared_Clean': 103, - 'Shared_Dirty': 104, - 'Private_Clean': 105, - 'Private_Dirty': 106, - }, - self.device.GetMemoryUsageForPid(4321)) - - -class DeviceUtilsDismissCrashDialogIfNeededTest(DeviceUtilsTest): - - def testDismissCrashDialogIfNeeded_crashedPageckageNotFound(self): - sample_dumpsys_output = ''' -WINDOW MANAGER WINDOWS (dumpsys window windows) - Window #11 Window{f8b647a u0 SearchPanel}: - mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5 - mOwnerUid=100 mShowToOwnerOnly=false package=com.android.systemui appop=NONE - mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100 - Requested w=1080 h=1920 mLayoutSeq=426 - mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000 -''' - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), sample_dumpsys_output.split('\n'))): - package_name = self.device.DismissCrashDialogIfNeeded() - self.assertIsNone(package_name) - - def testDismissCrashDialogIfNeeded_crashedPageckageFound(self): - sample_dumpsys_output = ''' -WINDOW MANAGER WINDOWS (dumpsys window windows) - Window #11 Window{f8b647a u0 SearchPanel}: - mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5 - mOwnerUid=102 mShowToOwnerOnly=false package=com.android.systemui appop=NONE - mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100 - Requested w=1080 h=1920 mLayoutSeq=426 - mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000 - mHasPermanentDpad=false - mCurrentFocus=Window{3a27740f u0 Application Error: com.android.chrome} - mFocusedApp=AppWindowToken{470af6f token=Token{272ec24e ActivityRecord{t894}}} -''' - with self.assertCalls( - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), sample_dumpsys_output.split('\n')), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '22'], check_return=True)), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '22'], check_return=True)), - (self.call.device.RunShellCommand( - ['input', 'keyevent', '66'], check_return=True)), - (self.call.device.RunShellCommand( - ['dumpsys', 'window', 'windows'], check_return=True, - large_output=True), [])): - package_name = self.device.DismissCrashDialogIfNeeded() - self.assertEqual(package_name, 'com.android.chrome') - - -class DeviceUtilsClientCache(DeviceUtilsTest): - - def testClientCache_twoCaches(self): - self.device._cache['test'] = 0 - client_cache_one = self.device.GetClientCache('ClientOne') - client_cache_one['test'] = 1 - client_cache_two = self.device.GetClientCache('ClientTwo') - client_cache_two['test'] = 2 - self.assertEqual(self.device._cache['test'], 0) - self.assertEqual(client_cache_one, {'test': 1}) - self.assertEqual(client_cache_two, {'test': 2}) - self.device._ClearCache() - self.assertTrue('test' not in self.device._cache) - self.assertEqual(client_cache_one, {}) - self.assertEqual(client_cache_two, {}) - - def testClientCache_multipleInstances(self): - client_cache_one = self.device.GetClientCache('ClientOne') - client_cache_one['test'] = 1 - client_cache_two = self.device.GetClientCache('ClientOne') - self.assertEqual(client_cache_one, {'test': 1}) - self.assertEqual(client_cache_two, {'test': 1}) - self.device._ClearCache() - self.assertEqual(client_cache_one, {}) - self.assertEqual(client_cache_two, {}) - - -class DeviceUtilsHealthyDevicesTest(mock_calls.TestCase): - - def testHealthyDevices_emptyBlacklist(self): - test_serials = ['0123456789abcdef', 'fedcba9876543210'] - with self.assertCalls( - (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), - [_AdbWrapperMock(s) for s in test_serials])): - blacklist = mock.NonCallableMock(**{'Read.return_value': []}) - devices = device_utils.DeviceUtils.HealthyDevices(blacklist) - for serial, device in zip(test_serials, devices): - self.assertTrue(isinstance(device, device_utils.DeviceUtils)) - self.assertEquals(serial, device.adb.GetDeviceSerial()) - - def testHealthyDevices_blacklist(self): - test_serials = ['0123456789abcdef', 'fedcba9876543210'] - with self.assertCalls( - (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), - [_AdbWrapperMock(s) for s in test_serials])): - blacklist = mock.NonCallableMock( - **{'Read.return_value': ['fedcba9876543210']}) - devices = device_utils.DeviceUtils.HealthyDevices(blacklist) - self.assertEquals(1, len(devices)) - self.assertTrue(isinstance(devices[0], device_utils.DeviceUtils)) - self.assertEquals('0123456789abcdef', devices[0].adb.GetDeviceSerial()) - - -class DeviceUtilsRestartAdbdTest(DeviceUtilsTest): - - def testAdbdRestart(self): - mock_temp_file = '/sdcard/temp-123.sh' - with self.assertCalls( - (mock.call.devil.android.device_temp_file.DeviceTempFile( - self.adb, suffix='.sh'), MockTempFile(mock_temp_file)), - self.call.device.WriteFile(mock.ANY, mock.ANY), - (self.call.device.RunShellCommand( - ['source', mock_temp_file], as_root=True)), - self.call.adb.WaitForDevice()): - self.device.RestartAdbd() - - -class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest): - - def testGrantPermissions_none(self): - self.device.GrantPermissions('package', []) - - def testGrantPermissions_underM(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.LOLLIPOP): - self.device.GrantPermissions('package', ['p1']) - - def testGrantPermissions_one(self): - permissions_cmd = 'pm grant package p1' - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.MARSHMALLOW): - with self.assertCalls( - (self.call.device.RunShellCommand(permissions_cmd), [])): - self.device.GrantPermissions('package', ['p1']) - - def testGrantPermissions_multiple(self): - permissions_cmd = 'pm grant package p1;pm grant package p2' - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.MARSHMALLOW): - with self.assertCalls( - (self.call.device.RunShellCommand(permissions_cmd), [])): - self.device.GrantPermissions('package', ['p1', 'p2']) - - def testGrantPermissions_WriteExtrnalStorage(self): - permissions_cmd = ( - 'pm grant package android.permission.WRITE_EXTERNAL_STORAGE;' - 'pm grant package android.permission.READ_EXTERNAL_STORAGE') - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.MARSHMALLOW): - with self.assertCalls( - (self.call.device.RunShellCommand(permissions_cmd), [])): - self.device.GrantPermissions( - 'package', ['android.permission.WRITE_EXTERNAL_STORAGE']) - - def testGrantPermissions_BlackList(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.MARSHMALLOW): - self.device.GrantPermissions( - 'package', ['android.permission.ACCESS_MOCK_LOCATION']) - - -class DeviecUtilsIsScreenOn(DeviceUtilsTest): - - _L_SCREEN_ON = ['test=test mInteractive=true'] - _K_SCREEN_ON = ['test=test mScreenOn=true'] - _L_SCREEN_OFF = ['mInteractive=false'] - _K_SCREEN_OFF = ['mScreenOn=false'] - - def testIsScreenOn_onPreL(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.KITKAT): - with self.assertCalls( - (self.call.device._RunPipedShellCommand( - 'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_ON)): - self.assertTrue(self.device.IsScreenOn()) - - def testIsScreenOn_onL(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.LOLLIPOP): - with self.assertCalls( - (self.call.device._RunPipedShellCommand( - 'dumpsys input_method | grep mInteractive'), self._L_SCREEN_ON)): - self.assertTrue(self.device.IsScreenOn()) - - def testIsScreenOn_offPreL(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.KITKAT): - with self.assertCalls( - (self.call.device._RunPipedShellCommand( - 'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_OFF)): - self.assertFalse(self.device.IsScreenOn()) - - def testIsScreenOn_offL(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.LOLLIPOP): - with self.assertCalls( - (self.call.device._RunPipedShellCommand( - 'dumpsys input_method | grep mInteractive'), self._L_SCREEN_OFF)): - self.assertFalse(self.device.IsScreenOn()) - - def testIsScreenOn_noOutput(self): - with self.patch_call(self.call.device.build_version_sdk, - return_value=version_codes.LOLLIPOP): - with self.assertCalls( - (self.call.device._RunPipedShellCommand( - 'dumpsys input_method | grep mInteractive'), [])): - with self.assertRaises(device_errors.CommandFailedError): - self.device.IsScreenOn() - - -class DeviecUtilsSetScreen(DeviceUtilsTest): - - @mock.patch('time.sleep', mock.Mock()) - def testSetScren_alreadySet(self): - with self.assertCalls( - (self.call.device.IsScreenOn(), False)): - self.device.SetScreen(False) - - @mock.patch('time.sleep', mock.Mock()) - def testSetScreen_on(self): - with self.assertCalls( - (self.call.device.IsScreenOn(), False), - (self.call.device.RunShellCommand('input keyevent 26'), []), - (self.call.device.IsScreenOn(), True)): - self.device.SetScreen(True) - - - @mock.patch('time.sleep', mock.Mock()) - def testSetScreen_off(self): - with self.assertCalls( - (self.call.device.IsScreenOn(), True), - (self.call.device.RunShellCommand('input keyevent 26'), []), - (self.call.device.IsScreenOn(), False)): - self.device.SetScreen(False) - - @mock.patch('time.sleep', mock.Mock()) - def testSetScreen_slow(self): - with self.assertCalls( - (self.call.device.IsScreenOn(), True), - (self.call.device.RunShellCommand('input keyevent 26'), []), - (self.call.device.IsScreenOn(), True), - (self.call.device.IsScreenOn(), True), - (self.call.device.IsScreenOn(), False)): - self.device.SetScreen(False) - -if __name__ == '__main__': - logging.getLogger().setLevel(logging.DEBUG) - unittest.main(verbosity=2)
diff --git a/build/android/devil/android/fastboot_utils.py b/build/android/devil/android/fastboot_utils.py deleted file mode 100644 index 587f42f..0000000 --- a/build/android/devil/android/fastboot_utils.py +++ /dev/null
@@ -1,245 +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. - -"""Provides a variety of device interactions based on fastboot.""" -# pylint: disable=unused-argument - -import contextlib -import fnmatch -import logging -import os -import re - -from devil.android import decorators -from devil.android import device_errors -from devil.android.sdk import fastboot -from devil.utils import timeout_retry - -_DEFAULT_TIMEOUT = 30 -_DEFAULT_RETRIES = 3 -_FASTBOOT_REBOOT_TIMEOUT = 10 * _DEFAULT_TIMEOUT -ALL_PARTITIONS = [ - 'bootloader', - 'radio', - 'boot', - 'recovery', - 'system', - 'userdata', - 'cache', -] - -class FastbootUtils(object): - - _FASTBOOT_WAIT_TIME = 1 - _RESTART_WHEN_FLASHING = ['bootloader', 'radio'] - _BOARD_VERIFICATION_FILE = 'android-info.txt' - _FLASH_IMAGE_FILES = { - 'bootloader': 'bootloader*.img', - 'radio': 'radio*.img', - 'boot': 'boot.img', - 'recovery': 'recovery.img', - 'system': 'system.img', - 'userdata': 'userdata.img', - 'cache': 'cache.img', - } - - def __init__(self, device, fastbooter=None, default_timeout=_DEFAULT_TIMEOUT, - default_retries=_DEFAULT_RETRIES): - """FastbootUtils constructor. - - Example Usage to flash a device: - fastboot = fastboot_utils.FastbootUtils(device) - fastboot.FlashDevice('/path/to/build/directory') - - Args: - device: A DeviceUtils instance. - fastbooter: Optional fastboot object. If none is passed, one will - be created. - default_timeout: An integer containing the default number of seconds to - wait for an operation to complete if no explicit value is provided. - default_retries: An integer containing the default number or times an - operation should be retried on failure if no explicit value is provided. - """ - self._device = device - self._board = device.product_board - self._serial = str(device) - self._default_timeout = default_timeout - self._default_retries = default_retries - if fastbooter: - self.fastboot = fastbooter - else: - self.fastboot = fastboot.Fastboot(self._serial) - - @decorators.WithTimeoutAndRetriesFromInstance() - def WaitForFastbootMode(self, timeout=None, retries=None): - """Wait for device to boot into fastboot mode. - - This waits for the device serial to show up in fastboot devices output. - """ - def fastboot_mode(): - return self._serial in self.fastboot.Devices() - - timeout_retry.WaitFor(fastboot_mode, wait_period=self._FASTBOOT_WAIT_TIME) - - @decorators.WithTimeoutAndRetriesFromInstance( - min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT) - def EnableFastbootMode(self, timeout=None, retries=None): - """Reboots phone into fastboot mode. - - Roots phone if needed, then reboots phone into fastboot mode and waits. - """ - self._device.EnableRoot() - self._device.adb.Reboot(to_bootloader=True) - self.WaitForFastbootMode() - - @decorators.WithTimeoutAndRetriesFromInstance( - min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT) - def Reboot(self, bootloader=False, timeout=None, retries=None): - """Reboots out of fastboot mode. - - It reboots the phone either back into fastboot, or to a regular boot. It - then blocks until the device is ready. - - Args: - bootloader: If set to True, reboots back into bootloader. - """ - if bootloader: - self.fastboot.RebootBootloader() - self.WaitForFastbootMode() - else: - self.fastboot.Reboot() - self._device.WaitUntilFullyBooted(timeout=_FASTBOOT_REBOOT_TIMEOUT) - - def _VerifyBoard(self, directory): - """Validate as best as possible that the android build matches the device. - - Goes through build files and checks if the board name is mentioned in the - |self._BOARD_VERIFICATION_FILE| or in the build archive. - - Args: - directory: directory where build files are located. - """ - files = os.listdir(directory) - board_regex = re.compile(r'require board=(\w+)') - if self._BOARD_VERIFICATION_FILE in files: - with open(os.path.join(directory, self._BOARD_VERIFICATION_FILE)) as f: - for line in f: - m = board_regex.match(line) - if m: - board_name = m.group(1) - if board_name == self._board: - return True - elif board_name: - return False - else: - logging.warning('No board type found in %s.', - self._BOARD_VERIFICATION_FILE) - else: - logging.warning('%s not found. Unable to use it to verify device.', - self._BOARD_VERIFICATION_FILE) - - zip_regex = re.compile(r'.*%s.*\.zip' % re.escape(self._board)) - for f in files: - if zip_regex.match(f): - return True - - return False - - def _FindAndVerifyPartitionsAndImages(self, partitions, directory): - """Validate partitions and images. - - Validate all partition names and partition directories. Cannot stop mid - flash so its important to validate everything first. - - Args: - Partitions: partitions to be tested. - directory: directory containing the images. - - Returns: - Dictionary with exact partition, image name mapping. - """ - files = os.listdir(directory) - - def find_file(pattern): - for filename in files: - if fnmatch.fnmatch(filename, pattern): - return os.path.join(directory, filename) - raise device_errors.FastbootCommandFailedError( - 'Failed to flash device. Counld not find image for %s.', pattern) - - return {name: find_file(self._FLASH_IMAGE_FILES[name]) - for name in partitions} - - def _FlashPartitions(self, partitions, directory, wipe=False, force=False): - """Flashes all given partiitons with all given images. - - Args: - partitions: List of partitions to flash. - directory: Directory where all partitions can be found. - wipe: If set to true, will automatically detect if cache and userdata - partitions are sent, and if so ignore them. - force: boolean to decide to ignore board name safety checks. - - Raises: - device_errors.CommandFailedError(): If image cannot be found or if bad - partition name is give. - """ - if not self._VerifyBoard(directory): - if force: - logging.warning('Could not verify build is meant to be installed on ' - 'the current device type, but force flag is set. ' - 'Flashing device. Possibly dangerous operation.') - else: - raise device_errors.CommandFailedError( - 'Could not verify build is meant to be installed on the current ' - 'device type. Run again with force=True to force flashing with an ' - 'unverified board.') - - flash_image_files = self._FindAndVerifyPartitionsAndImages(partitions, - directory) - for partition in partitions: - if partition in ['cache', 'userdata'] and not wipe: - logging.info( - 'Not flashing in wipe mode. Skipping partition %s.', partition) - else: - logging.info( - 'Flashing %s with %s', partition, flash_image_files[partition]) - self.fastboot.Flash(partition, flash_image_files[partition]) - if partition in self._RESTART_WHEN_FLASHING: - self.Reboot(bootloader=True) - - @contextlib.contextmanager - def FastbootMode(self, timeout=None, retries=None): - """Context manager that enables fastboot mode, and reboots after. - - Example usage: - with FastbootMode(): - Flash Device - # Anything that runs after flashing. - """ - self.EnableFastbootMode() - self.fastboot.SetOemOffModeCharge(False) - try: - yield self - finally: - self.fastboot.SetOemOffModeCharge(True) - self.Reboot() - - def FlashDevice(self, directory, partitions=None, wipe=False): - """Flash device with build in |directory|. - - Directory must contain bootloader, radio, boot, recovery, system, userdata, - and cache .img files from an android build. This is a dangerous operation so - use with care. - - Args: - fastboot: A FastbootUtils instance. - directory: Directory with build files. - wipe: Wipes cache and userdata if set to true. - partitions: List of partitions to flash. Defaults to all. - """ - if partitions is None: - partitions = ALL_PARTITIONS - with self.FastbootMode(): - self._FlashPartitions(partitions, directory, wipe=wipe)
diff --git a/build/android/devil/android/fastboot_utils_test.py b/build/android/devil/android/fastboot_utils_test.py deleted file mode 100755 index d82e1551..0000000 --- a/build/android/devil/android/fastboot_utils_test.py +++ /dev/null
@@ -1,278 +0,0 @@ -#!/usr/bin/env python -# 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. - -""" -Unit tests for the contents of fastboot_utils.py -""" - -# pylint: disable=protected-access,unused-argument - -import io -import logging -import unittest - -from devil import devil_env -from devil.android import device_errors -from devil.android import device_utils -from devil.android import fastboot_utils -from devil.android.sdk import fastboot -from devil.utils import mock_calls - -with devil_env.SysPath(devil_env.PYMOCK_PATH): - import mock # pylint: disable=import-error - -_BOARD = 'board_type' -_SERIAL = '0123456789abcdef' -_PARTITIONS = ['cache', 'userdata', 'system', 'bootloader', 'radio'] -_IMAGES = { - 'cache': 'cache.img', - 'userdata': 'userdata.img', - 'system': 'system.img', - 'bootloader': 'bootloader.img', - 'radio': 'radio.img', -} -_VALID_FILES = [_BOARD + '.zip', 'android-info.txt'] -_INVALID_FILES = ['test.zip', 'android-info.txt'] - - -class MockFile(object): - - def __init__(self, name='/tmp/some/file'): - self.file = mock.MagicMock(spec=file) - self.file.name = name - - def __enter__(self): - return self.file - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - @property - def name(self): - return self.file.name - - -def _FastbootWrapperMock(test_serial): - fastbooter = mock.Mock(spec=fastboot.Fastboot) - fastbooter.__str__ = mock.Mock(return_value=test_serial) - fastbooter.Devices.return_value = [test_serial] - return fastbooter - -def _DeviceUtilsMock(test_serial): - device = mock.Mock(spec=device_utils.DeviceUtils) - device.__str__ = mock.Mock(return_value=test_serial) - device.product_board = mock.Mock(return_value=_BOARD) - device.adb = mock.Mock() - return device - - -class FastbootUtilsTest(mock_calls.TestCase): - - def setUp(self): - self.device_utils_mock = _DeviceUtilsMock(_SERIAL) - self.fastboot_wrapper = _FastbootWrapperMock(_SERIAL) - self.fastboot = fastboot_utils.FastbootUtils( - self.device_utils_mock, fastbooter=self.fastboot_wrapper, - default_timeout=2, default_retries=0) - self.fastboot._board = _BOARD - - -class FastbootUtilsInitTest(FastbootUtilsTest): - - def testInitWithDeviceUtil(self): - f = fastboot_utils.FastbootUtils(self.device_utils_mock) - self.assertEqual(str(self.device_utils_mock), str(f._device)) - - def testInitWithMissing_fails(self): - with self.assertRaises(AttributeError): - fastboot_utils.FastbootUtils(None) - with self.assertRaises(AttributeError): - fastboot_utils.FastbootUtils('') - - -class FastbootUtilsWaitForFastbootMode(FastbootUtilsTest): - - # If this test fails by timing out after 1 second. - @mock.patch('time.sleep', mock.Mock()) - def testWaitForFastbootMode(self): - self.fastboot.WaitForFastbootMode() - - -class FastbootUtilsEnableFastbootMode(FastbootUtilsTest): - - def testEnableFastbootMode(self): - with self.assertCalls( - self.call.fastboot._device.EnableRoot(), - self.call.fastboot._device.adb.Reboot(to_bootloader=True), - self.call.fastboot.WaitForFastbootMode()): - self.fastboot.EnableFastbootMode() - - -class FastbootUtilsReboot(FastbootUtilsTest): - - def testReboot_bootloader(self): - with self.assertCalls( - self.call.fastboot.fastboot.RebootBootloader(), - self.call.fastboot.WaitForFastbootMode()): - self.fastboot.Reboot(bootloader=True) - - def testReboot_normal(self): - with self.assertCalls( - self.call.fastboot.fastboot.Reboot(), - self.call.fastboot._device.WaitUntilFullyBooted(timeout=mock.ANY)): - self.fastboot.Reboot() - - -class FastbootUtilsFlashPartitions(FastbootUtilsTest): - - def testFlashPartitions_wipe(self): - with self.assertCalls( - (self.call.fastboot._VerifyBoard('test'), True), - (self.call.fastboot._FindAndVerifyPartitionsAndImages( - _PARTITIONS, 'test'), _IMAGES), - (self.call.fastboot.fastboot.Flash('cache', 'cache.img')), - (self.call.fastboot.fastboot.Flash('userdata', 'userdata.img')), - (self.call.fastboot.fastboot.Flash('system', 'system.img')), - (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')), - (self.call.fastboot.Reboot(bootloader=True)), - (self.call.fastboot.fastboot.Flash('radio', 'radio.img')), - (self.call.fastboot.Reboot(bootloader=True))): - self.fastboot._FlashPartitions(_PARTITIONS, 'test', wipe=True) - - def testFlashPartitions_noWipe(self): - with self.assertCalls( - (self.call.fastboot._VerifyBoard('test'), True), - (self.call.fastboot._FindAndVerifyPartitionsAndImages( - _PARTITIONS, 'test'), _IMAGES), - (self.call.fastboot.fastboot.Flash('system', 'system.img')), - (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')), - (self.call.fastboot.Reboot(bootloader=True)), - (self.call.fastboot.fastboot.Flash('radio', 'radio.img')), - (self.call.fastboot.Reboot(bootloader=True))): - self.fastboot._FlashPartitions(_PARTITIONS, 'test') - - -class FastbootUtilsFastbootMode(FastbootUtilsTest): - - def testFastbootMode_good(self): - with self.assertCalls( - self.call.fastboot.EnableFastbootMode(), - self.call.fastboot.fastboot.SetOemOffModeCharge(False), - self.call.fastboot.fastboot.SetOemOffModeCharge(True), - self.call.fastboot.Reboot()): - with self.fastboot.FastbootMode() as fbm: - self.assertEqual(self.fastboot, fbm) - - def testFastbootMode_exception(self): - with self.assertCalls( - self.call.fastboot.EnableFastbootMode(), - self.call.fastboot.fastboot.SetOemOffModeCharge(False), - self.call.fastboot.fastboot.SetOemOffModeCharge(True), - self.call.fastboot.Reboot()): - with self.assertRaises(NotImplementedError): - with self.fastboot.FastbootMode() as fbm: - self.assertEqual(self.fastboot, fbm) - raise NotImplementedError - - def testFastbootMode_exceptionInEnableFastboot(self): - self.fastboot.EnableFastbootMode = mock.Mock() - self.fastboot.EnableFastbootMode.side_effect = NotImplementedError - with self.assertRaises(NotImplementedError): - with self.fastboot.FastbootMode(): - pass - - -class FastbootUtilsVerifyBoard(FastbootUtilsTest): - - def testVerifyBoard_bothValid(self): - mock_file = io.StringIO(u'require board=%s\n' % _BOARD) - with mock.patch('__builtin__.open', return_value=mock_file, create=True): - with mock.patch('os.listdir', return_value=_VALID_FILES): - self.assertTrue(self.fastboot._VerifyBoard('test')) - - def testVerifyBoard_BothNotValid(self): - mock_file = io.StringIO(u'abc') - with mock.patch('__builtin__.open', return_value=mock_file, create=True): - with mock.patch('os.listdir', return_value=_INVALID_FILES): - self.assertFalse(self.assertFalse(self.fastboot._VerifyBoard('test'))) - - def testVerifyBoard_FileNotFoundZipValid(self): - with mock.patch('os.listdir', return_value=[_BOARD + '.zip']): - self.assertTrue(self.fastboot._VerifyBoard('test')) - - def testVerifyBoard_ZipNotFoundFileValid(self): - mock_file = io.StringIO(u'require board=%s\n' % _BOARD) - with mock.patch('__builtin__.open', return_value=mock_file, create=True): - with mock.patch('os.listdir', return_value=['android-info.txt']): - self.assertTrue(self.fastboot._VerifyBoard('test')) - - def testVerifyBoard_zipNotValidFileIs(self): - mock_file = io.StringIO(u'require board=%s\n' % _BOARD) - with mock.patch('__builtin__.open', return_value=mock_file, create=True): - with mock.patch('os.listdir', return_value=_INVALID_FILES): - self.assertTrue(self.fastboot._VerifyBoard('test')) - - def testVerifyBoard_fileNotValidZipIs(self): - mock_file = io.StringIO(u'require board=WrongBoard') - with mock.patch('__builtin__.open', return_value=mock_file, create=True): - with mock.patch('os.listdir', return_value=_VALID_FILES): - self.assertFalse(self.fastboot._VerifyBoard('test')) - - def testVerifyBoard_noBoardInFileValidZip(self): - mock_file = io.StringIO(u'Regex wont match') - with mock.patch('__builtin__.open', return_value=mock_file, create=True): - with mock.patch('os.listdir', return_value=_VALID_FILES): - self.assertTrue(self.fastboot._VerifyBoard('test')) - - def testVerifyBoard_noBoardInFileInvalidZip(self): - mock_file = io.StringIO(u'Regex wont match') - with mock.patch('__builtin__.open', return_value=mock_file, create=True): - with mock.patch('os.listdir', return_value=_INVALID_FILES): - self.assertFalse(self.fastboot._VerifyBoard('test')) - -class FastbootUtilsFindAndVerifyPartitionsAndImages(FastbootUtilsTest): - - def testFindAndVerifyPartitionsAndImages_valid(self): - PARTITIONS = [ - 'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata', 'cache' - ] - files = [ - 'bootloader-test-.img', - 'radio123.img', - 'boot.img', - 'recovery.img', - 'system.img', - 'userdata.img', - 'cache.img' - ] - return_check = { - 'bootloader': 'test/bootloader-test-.img', - 'radio': 'test/radio123.img', - 'boot': 'test/boot.img', - 'recovery': 'test/recovery.img', - 'system': 'test/system.img', - 'userdata': 'test/userdata.img', - 'cache': 'test/cache.img', - } - - with mock.patch('os.listdir', return_value=files): - return_value = self.fastboot._FindAndVerifyPartitionsAndImages( - PARTITIONS, 'test') - self.assertDictEqual(return_value, return_check) - - def testFindAndVerifyPartitionsAndImages_badPartition(self): - with mock.patch('os.listdir', return_value=['test']): - with self.assertRaises(KeyError): - self.fastboot._FindAndVerifyPartitionsAndImages(['test'], 'test') - - def testFindAndVerifyPartitionsAndImages_noFile(self): - with mock.patch('os.listdir', return_value=['test']): - with self.assertRaises(device_errors.FastbootCommandFailedError): - self.fastboot._FindAndVerifyPartitionsAndImages(['cache'], 'test') - - -if __name__ == '__main__': - logging.getLogger().setLevel(logging.DEBUG) - unittest.main(verbosity=2)
diff --git a/build/android/devil/android/flag_changer.py b/build/android/devil/android/flag_changer.py deleted file mode 100644 index 4267f11..0000000 --- a/build/android/devil/android/flag_changer.py +++ /dev/null
@@ -1,182 +0,0 @@ -# Copyright (c) 2012 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import logging - -from devil.android import device_errors - - -class FlagChanger(object): - """Changes the flags Chrome runs with. - - Flags can be temporarily set for a particular set of unit tests. These - tests should call Restore() to revert the flags to their original state - once the tests have completed. - """ - - def __init__(self, device, cmdline_file): - """Initializes the FlagChanger and records the original arguments. - - Args: - device: A DeviceUtils instance. - cmdline_file: Path to the command line file on the device. - """ - self._device = device - - # Unrooted devices have limited access to the file system. - # Place files in /data/local/tmp/ rather than /data/local/ - if not device.HasRoot() and not '/data/local/tmp/' in cmdline_file: - self._cmdline_file = cmdline_file.replace('/data/local/', - '/data/local/tmp/') - else: - self._cmdline_file = cmdline_file - - stored_flags = '' - if self._device.PathExists(self._cmdline_file): - try: - stored_flags = self._device.ReadFile(self._cmdline_file).strip() - except device_errors.CommandFailedError: - pass - # Store the flags as a set to facilitate adding and removing flags. - self._state_stack = [set(self._TokenizeFlags(stored_flags))] - - def ReplaceFlags(self, flags): - """Replaces the flags in the command line with the ones provided. - Saves the current flags state on the stack, so a call to Restore will - change the state back to the one preceeding the call to ReplaceFlags. - - Args: - flags: A sequence of command line flags to set, eg. ['--single-process']. - Note: this should include flags only, not the name of a command - to run (ie. there is no need to start the sequence with 'chrome'). - """ - new_flags = set(flags) - self._state_stack.append(new_flags) - self._UpdateCommandLineFile() - - def AddFlags(self, flags): - """Appends flags to the command line if they aren't already there. - Saves the current flags state on the stack, so a call to Restore will - change the state back to the one preceeding the call to AddFlags. - - Args: - flags: A sequence of flags to add on, eg. ['--single-process']. - """ - self.PushFlags(add=flags) - - def RemoveFlags(self, flags): - """Removes flags from the command line, if they exist. - Saves the current flags state on the stack, so a call to Restore will - change the state back to the one preceeding the call to RemoveFlags. - - Note that calling RemoveFlags after AddFlags will result in having - two nested states. - - Args: - flags: A sequence of flags to remove, eg. ['--single-process']. Note - that we expect a complete match when removing flags; if you want - to remove a switch with a value, you must use the exact string - used to add it in the first place. - """ - self.PushFlags(remove=flags) - - def PushFlags(self, add=None, remove=None): - """Appends and removes flags to/from the command line if they aren't already - there. Saves the current flags state on the stack, so a call to Restore - will change the state back to the one preceeding the call to PushFlags. - - Args: - add: A list of flags to add on, eg. ['--single-process']. - remove: A list of flags to remove, eg. ['--single-process']. Note that we - expect a complete match when removing flags; if you want to remove - a switch with a value, you must use the exact string used to add - it in the first place. - """ - new_flags = self._state_stack[-1].copy() - if add: - new_flags.update(add) - if remove: - new_flags.difference_update(remove) - self.ReplaceFlags(new_flags) - - def Restore(self): - """Restores the flags to their state prior to the last AddFlags or - RemoveFlags call. - """ - # The initial state must always remain on the stack. - assert len(self._state_stack) > 1, ( - "Mismatch between calls to Add/RemoveFlags and Restore") - self._state_stack.pop() - self._UpdateCommandLineFile() - - def _UpdateCommandLineFile(self): - """Writes out the command line to the file, or removes it if empty.""" - current_flags = list(self._state_stack[-1]) - logging.info('Current flags: %s', current_flags) - # Root is not required to write to /data/local/tmp/. - use_root = '/data/local/tmp/' not in self._cmdline_file - if current_flags: - # The first command line argument doesn't matter as we are not actually - # launching the chrome executable using this command line. - cmd_line = ' '.join(['_'] + current_flags) - self._device.WriteFile( - self._cmdline_file, cmd_line, as_root=use_root) - file_contents = self._device.ReadFile( - self._cmdline_file, as_root=use_root).rstrip() - assert file_contents == cmd_line, ( - 'Failed to set the command line file at %s' % self._cmdline_file) - else: - self._device.RunShellCommand('rm ' + self._cmdline_file, - as_root=use_root) - assert not self._device.FileExists(self._cmdline_file), ( - 'Failed to remove the command line file at %s' % self._cmdline_file) - - @staticmethod - def _TokenizeFlags(line): - """Changes the string containing the command line into a list of flags. - - Follows similar logic to CommandLine.java::tokenizeQuotedArguments: - * Flags are split using whitespace, unless the whitespace is within a - pair of quotation marks. - * Unlike the Java version, we keep the quotation marks around switch - values since we need them to re-create the file when new flags are - appended. - - Args: - line: A string containing the entire command line. The first token is - assumed to be the program name. - """ - if not line: - return [] - - tokenized_flags = [] - current_flag = "" - within_quotations = False - - # Move through the string character by character and build up each flag - # along the way. - for c in line.strip(): - if c is '"': - if len(current_flag) > 0 and current_flag[-1] == '\\': - # Last char was a backslash; pop it, and treat this " as a literal. - current_flag = current_flag[0:-1] + '"' - else: - within_quotations = not within_quotations - current_flag += c - elif not within_quotations and (c is ' ' or c is '\t'): - if current_flag is not "": - tokenized_flags.append(current_flag) - current_flag = "" - else: - current_flag += c - - # Tack on the last flag. - if not current_flag: - if within_quotations: - logging.warn('Unterminated quoted argument: ' + line) - else: - tokenized_flags.append(current_flag) - - # Return everything but the program name. - return tokenized_flags[1:]
diff --git a/build/android/devil/android/forwarder.py b/build/android/devil/android/forwarder.py deleted file mode 100644 index d3c2949..0000000 --- a/build/android/devil/android/forwarder.py +++ /dev/null
@@ -1,343 +0,0 @@ -# Copyright (c) 2012 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# pylint: disable=W0212 - -import fcntl -import logging -import os -import psutil - -from devil import base_error -from devil import devil_env -from devil.android.constants import file_system -from devil.android.valgrind_tools import base_tool -from devil.utils import cmd_helper - - -def _GetProcessStartTime(pid): - return psutil.Process(pid).create_time - - -class _FileLock(object): - """With statement-aware implementation of a file lock. - - File locks are needed for cross-process synchronization when the - multiprocessing Python module is used. - """ - def __init__(self, path): - self._fd = -1 - self._path = path - - def __enter__(self): - self._fd = os.open(self._path, os.O_RDONLY | os.O_CREAT) - if self._fd < 0: - raise Exception('Could not open file %s for reading' % self._path) - fcntl.flock(self._fd, fcntl.LOCK_EX) - - def __exit__(self, _exception_type, _exception_value, traceback): - fcntl.flock(self._fd, fcntl.LOCK_UN) - os.close(self._fd) - - -class HostForwarderError(base_error.BaseError): - """Exception for failures involving host_forwarder.""" - - def __init__(self, message): - super(HostForwarderError, self).__init__(message) - - -class Forwarder(object): - """Thread-safe class to manage port forwards from the device to the host.""" - - _DEVICE_FORWARDER_FOLDER = (file_system.TEST_EXECUTABLE_DIR + - '/forwarder/') - _DEVICE_FORWARDER_PATH = (file_system.TEST_EXECUTABLE_DIR + - '/forwarder/device_forwarder') - _LOCK_PATH = '/tmp/chrome.forwarder.lock' - # Defined in host_forwarder_main.cc - _HOST_FORWARDER_LOG = '/tmp/host_forwarder_log' - - _instance = None - - @staticmethod - def Map(port_pairs, device, tool=None): - """Runs the forwarder. - - Args: - port_pairs: A list of tuples (device_port, host_port) to forward. Note - that you can specify 0 as a device_port, in which case a - port will by dynamically assigned on the device. You can - get the number of the assigned port using the - DevicePortForHostPort method. - device: A DeviceUtils instance. - tool: Tool class to use to get wrapper, if necessary, for executing the - forwarder (see valgrind_tools.py). - - Raises: - Exception on failure to forward the port. - """ - if not tool: - tool = base_tool.BaseTool() - with _FileLock(Forwarder._LOCK_PATH): - instance = Forwarder._GetInstanceLocked(tool) - instance._InitDeviceLocked(device, tool) - - device_serial = str(device) - redirection_commands = [ - ['--adb=' + devil_env.config.FetchPath('adb'), - '--serial-id=' + device_serial, - '--map', str(device_port), str(host_port)] - for device_port, host_port in port_pairs] - logging.info('Forwarding using commands: %s', redirection_commands) - - for redirection_command in redirection_commands: - try: - (exit_code, output) = cmd_helper.GetCmdStatusAndOutput( - [instance._host_forwarder_path] + redirection_command) - except OSError as e: - if e.errno == 2: - raise HostForwarderError( - 'Unable to start host forwarder. ' - 'Make sure you have built host_forwarder.') - else: raise - if exit_code != 0: - Forwarder._KillDeviceLocked(device, tool) - # Log alive forwarders - ps_out = device.RunShellCommand(['ps']) - logging.info('Currently running device_forwarders:') - for line in ps_out: - if 'device_forwarder' in line: - logging.info(' %s', line) - raise HostForwarderError( - '%s exited with %d:\n%s' % (instance._host_forwarder_path, - exit_code, '\n'.join(output))) - tokens = output.split(':') - if len(tokens) != 2: - raise HostForwarderError( - 'Unexpected host forwarder output "%s", ' - 'expected "device_port:host_port"' % output) - device_port = int(tokens[0]) - host_port = int(tokens[1]) - serial_with_port = (device_serial, device_port) - instance._device_to_host_port_map[serial_with_port] = host_port - instance._host_to_device_port_map[host_port] = serial_with_port - logging.info('Forwarding device port: %d to host port: %d.', - device_port, host_port) - - @staticmethod - def UnmapDevicePort(device_port, device): - """Unmaps a previously forwarded device port. - - Args: - device: A DeviceUtils instance. - device_port: A previously forwarded port (through Map()). - """ - with _FileLock(Forwarder._LOCK_PATH): - Forwarder._UnmapDevicePortLocked(device_port, device) - - @staticmethod - def UnmapAllDevicePorts(device): - """Unmaps all the previously forwarded ports for the provided device. - - Args: - device: A DeviceUtils instance. - port_pairs: A list of tuples (device_port, host_port) to unmap. - """ - with _FileLock(Forwarder._LOCK_PATH): - if not Forwarder._instance: - return - adb_serial = str(device) - if adb_serial not in Forwarder._instance._initialized_devices: - return - port_map = Forwarder._GetInstanceLocked( - None)._device_to_host_port_map - for (device_serial, device_port) in port_map.keys(): - if adb_serial == device_serial: - Forwarder._UnmapDevicePortLocked(device_port, device) - # There are no more ports mapped, kill the device_forwarder. - tool = base_tool.BaseTool() - Forwarder._KillDeviceLocked(device, tool) - - @staticmethod - def DevicePortForHostPort(host_port): - """Returns the device port that corresponds to a given host port.""" - with _FileLock(Forwarder._LOCK_PATH): - _, device_port = Forwarder._GetInstanceLocked( - None)._host_to_device_port_map.get(host_port) - return device_port - - @staticmethod - def RemoveHostLog(): - if os.path.exists(Forwarder._HOST_FORWARDER_LOG): - os.unlink(Forwarder._HOST_FORWARDER_LOG) - - @staticmethod - def GetHostLog(): - if not os.path.exists(Forwarder._HOST_FORWARDER_LOG): - return '' - with file(Forwarder._HOST_FORWARDER_LOG, 'r') as f: - return f.read() - - @staticmethod - def _GetInstanceLocked(tool): - """Returns the singleton instance. - - Note that the global lock must be acquired before calling this method. - - Args: - tool: Tool class to use to get wrapper, if necessary, for executing the - forwarder (see valgrind_tools.py). - """ - if not Forwarder._instance: - Forwarder._instance = Forwarder(tool) - return Forwarder._instance - - def __init__(self, tool): - """Constructs a new instance of Forwarder. - - Note that Forwarder is a singleton therefore this constructor should be - called only once. - - Args: - tool: Tool class to use to get wrapper, if necessary, for executing the - forwarder (see valgrind_tools.py). - """ - assert not Forwarder._instance - self._tool = tool - self._initialized_devices = set() - self._device_to_host_port_map = dict() - self._host_to_device_port_map = dict() - self._host_forwarder_path = devil_env.config.FetchPath('forwarder_host') - assert os.path.exists(self._host_forwarder_path), 'Please build forwarder2' - self._InitHostLocked() - - @staticmethod - def _UnmapDevicePortLocked(device_port, device): - """Internal method used by UnmapDevicePort(). - - Note that the global lock must be acquired before calling this method. - """ - instance = Forwarder._GetInstanceLocked(None) - serial = str(device) - serial_with_port = (serial, device_port) - if not serial_with_port in instance._device_to_host_port_map: - logging.error('Trying to unmap non-forwarded port %d', device_port) - return - redirection_command = ['--adb=' + devil_env.config.FetchPath('adb'), - '--serial-id=' + serial, - '--unmap', str(device_port)] - logging.info('Undo forwarding using command: %s', redirection_command) - (exit_code, output) = cmd_helper.GetCmdStatusAndOutput( - [instance._host_forwarder_path] + redirection_command) - if exit_code != 0: - logging.error( - '%s exited with %d:\n%s', - instance._host_forwarder_path, exit_code, '\n'.join(output)) - host_port = instance._device_to_host_port_map[serial_with_port] - del instance._device_to_host_port_map[serial_with_port] - del instance._host_to_device_port_map[host_port] - - @staticmethod - def _GetPidForLock(): - """Returns the PID used for host_forwarder initialization. - - The PID of the "sharder" is used to handle multiprocessing. The "sharder" - is the initial process that forks that is the parent process. - """ - return os.getpgrp() - - def _InitHostLocked(self): - """Initializes the host forwarder daemon. - - Note that the global lock must be acquired before calling this method. This - method kills any existing host_forwarder process that could be stale. - """ - # See if the host_forwarder daemon was already initialized by a concurrent - # process or thread (in case multi-process sharding is not used). - pid_for_lock = Forwarder._GetPidForLock() - fd = os.open(Forwarder._LOCK_PATH, os.O_RDWR | os.O_CREAT) - with os.fdopen(fd, 'r+') as pid_file: - pid_with_start_time = pid_file.readline() - if pid_with_start_time: - (pid, process_start_time) = pid_with_start_time.split(':') - if pid == str(pid_for_lock): - if process_start_time == str(_GetProcessStartTime(pid_for_lock)): - return - self._KillHostLocked() - pid_file.seek(0) - pid_file.write( - '%s:%s' % (pid_for_lock, str(_GetProcessStartTime(pid_for_lock)))) - pid_file.truncate() - - def _InitDeviceLocked(self, device, tool): - """Initializes the device_forwarder daemon for a specific device (once). - - Note that the global lock must be acquired before calling this method. This - method kills any existing device_forwarder daemon on the device that could - be stale, pushes the latest version of the daemon (to the device) and starts - it. - - Args: - device: A DeviceUtils instance. - tool: Tool class to use to get wrapper, if necessary, for executing the - forwarder (see valgrind_tools.py). - """ - device_serial = str(device) - if device_serial in self._initialized_devices: - return - Forwarder._KillDeviceLocked(device, tool) - forwarder_device_path_on_host = devil_env.config.FetchPath( - 'forwarder_device', device=device) - forwarder_device_path_on_device = ( - Forwarder._DEVICE_FORWARDER_FOLDER - if os.path.isdir(forwarder_device_path_on_host) - else Forwarder._DEVICE_FORWARDER_PATH) - device.PushChangedFiles([( - forwarder_device_path_on_host, - forwarder_device_path_on_device)]) - - cmd = '%s %s' % (tool.GetUtilWrapper(), Forwarder._DEVICE_FORWARDER_PATH) - device.RunShellCommand( - cmd, env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER}, - check_return=True) - self._initialized_devices.add(device_serial) - - def _KillHostLocked(self): - """Kills the forwarder process running on the host. - - Note that the global lock must be acquired before calling this method. - """ - logging.info('Killing host_forwarder.') - (exit_code, output) = cmd_helper.GetCmdStatusAndOutput( - [self._host_forwarder_path, '--kill-server']) - if exit_code != 0: - (exit_code, output) = cmd_helper.GetCmdStatusAndOutput( - ['pkill', '-9', 'host_forwarder']) - if exit_code != 0: - raise HostForwarderError( - '%s exited with %d:\n%s' % (self._host_forwarder_path, exit_code, - '\n'.join(output))) - - @staticmethod - def _KillDeviceLocked(device, tool): - """Kills the forwarder process running on the device. - - Note that the global lock must be acquired before calling this method. - - Args: - device: Instance of DeviceUtils for talking to the device. - tool: Wrapper tool (e.g. valgrind) that can be used to execute the device - forwarder (see valgrind_tools.py). - """ - logging.info('Killing device_forwarder.') - Forwarder._instance._initialized_devices.discard(str(device)) - if not device.FileExists(Forwarder._DEVICE_FORWARDER_PATH): - return - - cmd = '%s %s --kill-server' % (tool.GetUtilWrapper(), - Forwarder._DEVICE_FORWARDER_PATH) - device.RunShellCommand( - cmd, env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER}, - check_return=True)
diff --git a/build/android/devil/android/install_commands.py b/build/android/devil/android/install_commands.py deleted file mode 100644 index 5a06bf3..0000000 --- a/build/android/devil/android/install_commands.py +++ /dev/null
@@ -1,57 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import os -import posixpath - -from devil import devil_env -from devil.android import device_errors -from devil.android.constants import file_system - -BIN_DIR = '%s/bin' % file_system.TEST_EXECUTABLE_DIR -_FRAMEWORK_DIR = '%s/framework' % file_system.TEST_EXECUTABLE_DIR - -_COMMANDS = { - 'unzip': 'org.chromium.android.commands.unzip.Unzip', -} - -_SHELL_COMMAND_FORMAT = ( -"""#!/system/bin/sh -base=%s -export CLASSPATH=$base/framework/chromium_commands.jar -exec app_process $base/bin %s $@ -""") - - -def Installed(device): - paths = [posixpath.join(BIN_DIR, c) for c in _COMMANDS] - paths.append(posixpath.join(_FRAMEWORK_DIR, 'chromium_commands.jar')) - return device.PathExists(paths) - - -def InstallCommands(device): - if device.IsUserBuild(): - raise device_errors.CommandFailedError( - 'chromium_commands currently requires a userdebug build.', - device_serial=device.adb.GetDeviceSerial()) - - chromium_commands_jar_path = devil_env.config.FetchPath('chromium_commands') - if not os.path.exists(chromium_commands_jar_path): - raise device_errors.CommandFailedError( - '%s not found. Please build chromium_commands.' - % chromium_commands_jar_path) - - device.RunShellCommand(['mkdir', BIN_DIR, _FRAMEWORK_DIR]) - for command, main_class in _COMMANDS.iteritems(): - shell_command = _SHELL_COMMAND_FORMAT % ( - file_system.TEST_EXECUTABLE_DIR, main_class) - shell_file = '%s/%s' % (BIN_DIR, command) - device.WriteFile(shell_file, shell_command) - device.RunShellCommand( - ['chmod', '755', shell_file], check_return=True) - - device.adb.Push( - chromium_commands_jar_path, - '%s/chromium_commands.jar' % _FRAMEWORK_DIR) -
diff --git a/build/android/devil/android/logcat_monitor.py b/build/android/devil/android/logcat_monitor.py deleted file mode 100644 index 9ec94125..0000000 --- a/build/android/devil/android/logcat_monitor.py +++ /dev/null
@@ -1,242 +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. - -# pylint: disable=unused-argument - -import errno -import logging -import os -import re -import shutil -import tempfile -import threading -import time - -from devil.android import decorators -from devil.android import device_errors -from devil.android.sdk import adb_wrapper -from devil.utils import reraiser_thread - - -class LogcatMonitor(object): - - _RECORD_THREAD_JOIN_WAIT = 2.0 - _WAIT_TIME = 0.2 - _THREADTIME_RE_FORMAT = ( - r'(?P<date>\S*) +(?P<time>\S*) +(?P<proc_id>%s) +(?P<thread_id>%s) +' - r'(?P<log_level>%s) +(?P<component>%s) *: +(?P<message>%s)$') - - def __init__(self, adb, clear=True, filter_specs=None, output_file=None): - """Create a LogcatMonitor instance. - - Args: - adb: An instance of adb_wrapper.AdbWrapper. - clear: If True, clear the logcat when monitoring starts. - filter_specs: An optional list of '<tag>[:priority]' strings. - output_file: File path to save recorded logcat. - """ - if isinstance(adb, adb_wrapper.AdbWrapper): - self._adb = adb - else: - raise ValueError('Unsupported type passed for argument "device"') - self._clear = clear - self._filter_specs = filter_specs - self._output_file = output_file - self._record_file = None - self._record_file_lock = threading.Lock() - self._record_thread = None - self._stop_recording_event = threading.Event() - - @property - def output_file(self): - return self._output_file - - @decorators.WithTimeoutAndRetriesDefaults(10, 0) - def WaitFor(self, success_regex, failure_regex=None, timeout=None, - retries=None): - """Wait for a matching logcat line or until a timeout occurs. - - This will attempt to match lines in the logcat against both |success_regex| - and |failure_regex| (if provided). Note that this calls re.search on each - logcat line, not re.match, so the provided regular expressions don't have - to match an entire line. - - Args: - success_regex: The regular expression to search for. - failure_regex: An optional regular expression that, if hit, causes this - to stop looking for a match. Can be None. - timeout: timeout in seconds - retries: number of retries - - Returns: - A match object if |success_regex| matches a part of a logcat line, or - None if |failure_regex| matches a part of a logcat line. - Raises: - CommandFailedError on logcat failure (NOT on a |failure_regex| match). - CommandTimeoutError if no logcat line matching either |success_regex| or - |failure_regex| is found in |timeout| seconds. - DeviceUnreachableError if the device becomes unreachable. - LogcatMonitorCommandError when calling |WaitFor| while not recording - logcat. - """ - if self._record_thread is None: - raise LogcatMonitorCommandError( - 'Must be recording logcat when calling |WaitFor|', - device_serial=str(self._adb)) - if isinstance(success_regex, basestring): - success_regex = re.compile(success_regex) - if isinstance(failure_regex, basestring): - failure_regex = re.compile(failure_regex) - - logging.debug('Waiting %d seconds for "%s"', timeout, success_regex.pattern) - - # NOTE This will continue looping until: - # - success_regex matches a line, in which case the match object is - # returned. - # - failure_regex matches a line, in which case None is returned - # - the timeout is hit, in which case a CommandTimeoutError is raised. - with open(self._record_file.name, 'r') as f: - while True: - line = f.readline() - if line: - m = success_regex.search(line) - if m: - return m - if failure_regex and failure_regex.search(line): - return None - else: - time.sleep(self._WAIT_TIME) - - def FindAll(self, message_regex, proc_id=None, thread_id=None, log_level=None, - component=None): - """Finds all lines in the logcat that match the provided constraints. - - Args: - message_regex: The regular expression that the <message> section must - match. - proc_id: The process ID to match. If None, matches any process ID. - thread_id: The thread ID to match. If None, matches any thread ID. - log_level: The log level to match. If None, matches any log level. - component: The component to match. If None, matches any component. - - Raises: - LogcatMonitorCommandError when calling |FindAll| before recording logcat. - - Yields: - A match object for each matching line in the logcat. The match object - will always contain, in addition to groups defined in |message_regex|, - the following named groups: 'date', 'time', 'proc_id', 'thread_id', - 'log_level', 'component', and 'message'. - """ - if self._record_file is None: - raise LogcatMonitorCommandError( - 'Must have recorded or be recording a logcat to call |FindAll|', - device_serial=str(self._adb)) - if proc_id is None: - proc_id = r'\d+' - if thread_id is None: - thread_id = r'\d+' - if log_level is None: - log_level = r'[VDIWEF]' - if component is None: - component = r'[^\s:]+' - # pylint: disable=protected-access - threadtime_re = re.compile( - type(self)._THREADTIME_RE_FORMAT % ( - proc_id, thread_id, log_level, component, message_regex)) - - with open(self._record_file.name, 'r') as f: - for line in f: - m = re.match(threadtime_re, line) - if m: - yield m - - def _StartRecording(self): - """Starts recording logcat to file. - - Function spawns a thread that records logcat to file and will not die - until |StopRecording| is called. - """ - def record_to_file(): - # Write the log with line buffering so the consumer sees each individual - # line. - for data in self._adb.Logcat(filter_specs=self._filter_specs, - logcat_format='threadtime'): - with self._record_file_lock: - if self._stop_recording_event.isSet(): - return - if self._record_file and not self._record_file.closed: - self._record_file.write(data + '\n') - - self._stop_recording_event.clear() - if not self._record_thread: - self._record_thread = reraiser_thread.ReraiserThread(record_to_file) - self._record_thread.start() - - def _StopRecording(self): - """Finish recording logcat.""" - if self._record_thread: - self._stop_recording_event.set() - self._record_thread.join(timeout=self._RECORD_THREAD_JOIN_WAIT) - self._record_thread.ReraiseIfException() - self._record_thread = None - - def Start(self): - """Starts the logcat monitor. - - Clears the logcat if |clear| was set in |__init__|. - """ - if self._clear: - self._adb.Logcat(clear=True) - if not self._record_file: - self._record_file = tempfile.NamedTemporaryFile(mode='a', bufsize=1) - self._StartRecording() - - def Stop(self): - """Stops the logcat monitor. - - Stops recording the logcat. Copies currently recorded logcat to - |self._output_file|. - """ - self._StopRecording() - with self._record_file_lock: - if self._record_file and self._output_file: - try: - os.makedirs(os.path.dirname(self._output_file)) - except OSError as e: - if e.errno != errno.EEXIST: - raise - shutil.copy(self._record_file.name, self._output_file) - - def Close(self): - """Closes logcat recording file. - - Should be called when finished using the logcat monitor. - """ - with self._record_file_lock: - if self._record_file: - self._record_file.close() - self._record_file = None - - def __enter__(self): - """Starts the logcat monitor.""" - self.Start() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """Stops the logcat monitor.""" - self.Stop() - - def __del__(self): - """Closes logcat recording file in case |Close| was never called.""" - with self._record_file_lock: - if self._record_file: - logging.warning( - 'Need to call |Close| on the logcat monitor when done!') - self._record_file.close() - - -class LogcatMonitorCommandError(device_errors.CommandFailedError): - """Exception for errors with logcat monitor commands.""" - pass
diff --git a/build/android/devil/android/logcat_monitor_test.py b/build/android/devil/android/logcat_monitor_test.py deleted file mode 100755 index b096ef8d..0000000 --- a/build/android/devil/android/logcat_monitor_test.py +++ /dev/null
@@ -1,226 +0,0 @@ -#!/usr/bin/env python -# 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. - -# pylint: disable=protected-access - -import itertools -import threading -import unittest - -from devil import devil_env -from devil.android import logcat_monitor -from devil.android.sdk import adb_wrapper - -with devil_env.SysPath(devil_env.PYMOCK_PATH): - import mock # pylint: disable=import-error - - -def _CreateTestLog(raw_logcat=None): - test_adb = adb_wrapper.AdbWrapper('0123456789abcdef') - test_adb.Logcat = mock.Mock(return_value=(l for l in raw_logcat)) - test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False) - return test_log - -class LogcatMonitorTest(unittest.TestCase): - - _TEST_THREADTIME_LOGCAT_DATA = [ - '01-01 01:02:03.456 7890 0987 V LogcatMonitorTest: ' - 'verbose logcat monitor test message 1', - '01-01 01:02:03.457 8901 1098 D LogcatMonitorTest: ' - 'debug logcat monitor test message 2', - '01-01 01:02:03.458 9012 2109 I LogcatMonitorTest: ' - 'info logcat monitor test message 3', - '01-01 01:02:03.459 0123 3210 W LogcatMonitorTest: ' - 'warning logcat monitor test message 4', - '01-01 01:02:03.460 1234 4321 E LogcatMonitorTest: ' - 'error logcat monitor test message 5', - '01-01 01:02:03.461 2345 5432 F LogcatMonitorTest: ' - 'fatal logcat monitor test message 6', - '01-01 01:02:03.462 3456 6543 D LogcatMonitorTest: ' - 'last line',] - - def assertIterEqual(self, expected_iter, actual_iter): - for expected, actual in itertools.izip_longest(expected_iter, actual_iter): - self.assertIsNotNone( - expected, - msg='actual has unexpected elements starting with %s' % str(actual)) - self.assertIsNotNone( - actual, - msg='actual is missing elements starting with %s' % str(expected)) - self.assertEqual(actual.group('proc_id'), expected[0]) - self.assertEqual(actual.group('thread_id'), expected[1]) - self.assertEqual(actual.group('log_level'), expected[2]) - self.assertEqual(actual.group('component'), expected[3]) - self.assertEqual(actual.group('message'), expected[4]) - - with self.assertRaises(StopIteration): - next(actual_iter) - with self.assertRaises(StopIteration): - next(expected_iter) - - @mock.patch('time.sleep', mock.Mock()) - def testWaitFor_success(self): - test_log = _CreateTestLog( - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) - test_log.Start() - actual_match = test_log.WaitFor(r'.*(fatal|error) logcat monitor.*', None) - self.assertTrue(actual_match) - self.assertEqual( - '01-01 01:02:03.460 1234 4321 E LogcatMonitorTest: ' - 'error logcat monitor test message 5', - actual_match.group(0)) - self.assertEqual('error', actual_match.group(1)) - test_log.Stop() - test_log.Close() - - @mock.patch('time.sleep', mock.Mock()) - def testWaitFor_failure(self): - test_log = _CreateTestLog( - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) - test_log.Start() - actual_match = test_log.WaitFor( - r'.*My Success Regex.*', r'.*(fatal|error) logcat monitor.*') - self.assertIsNone(actual_match) - test_log.Stop() - test_log.Close() - - @mock.patch('time.sleep', mock.Mock()) - def testWaitFor_buffering(self): - # Simulate an adb log stream which does not complete until the test tells it - # to. This checks that the log matcher can receive individual lines from the - # log reader thread even if adb is not producing enough output to fill an - # entire file io buffer. - finished_lock = threading.Lock() - finished_lock.acquire() - - def LogGenerator(): - for line in type(self)._TEST_THREADTIME_LOGCAT_DATA: - yield line - finished_lock.acquire() - - test_adb = adb_wrapper.AdbWrapper('0123456789abcdef') - test_adb.Logcat = mock.Mock(return_value=LogGenerator()) - test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False) - test_log.Start() - - actual_match = test_log.WaitFor(r'.*last line.*', None) - finished_lock.release() - self.assertTrue(actual_match) - test_log.Stop() - test_log.Close() - - @mock.patch('time.sleep', mock.Mock()) - def testFindAll_defaults(self): - test_log = _CreateTestLog( - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) - test_log.Start() - test_log.WaitFor(r'.*last line.*', None) - test_log.Stop() - expected_results = [ - ('7890', '0987', 'V', 'LogcatMonitorTest', - 'verbose logcat monitor test message 1'), - ('8901', '1098', 'D', 'LogcatMonitorTest', - 'debug logcat monitor test message 2'), - ('9012', '2109', 'I', 'LogcatMonitorTest', - 'info logcat monitor test message 3'), - ('0123', '3210', 'W', 'LogcatMonitorTest', - 'warning logcat monitor test message 4'), - ('1234', '4321', 'E', 'LogcatMonitorTest', - 'error logcat monitor test message 5'), - ('2345', '5432', 'F', 'LogcatMonitorTest', - 'fatal logcat monitor test message 6')] - actual_results = test_log.FindAll(r'\S* logcat monitor test message \d') - self.assertIterEqual(iter(expected_results), actual_results) - test_log.Close() - - @mock.patch('time.sleep', mock.Mock()) - def testFindAll_defaults_miss(self): - test_log = _CreateTestLog( - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) - test_log.Start() - test_log.WaitFor(r'.*last line.*', None) - test_log.Stop() - expected_results = [] - actual_results = test_log.FindAll(r'\S* nothing should match this \d') - self.assertIterEqual(iter(expected_results), actual_results) - test_log.Close() - - @mock.patch('time.sleep', mock.Mock()) - def testFindAll_filterProcId(self): - test_log = _CreateTestLog( - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) - test_log.Start() - test_log.WaitFor(r'.*last line.*', None) - test_log.Stop() - actual_results = test_log.FindAll( - r'\S* logcat monitor test message \d', proc_id=1234) - expected_results = [ - ('1234', '4321', 'E', 'LogcatMonitorTest', - 'error logcat monitor test message 5')] - self.assertIterEqual(iter(expected_results), actual_results) - test_log.Close() - - @mock.patch('time.sleep', mock.Mock()) - def testFindAll_filterThreadId(self): - test_log = _CreateTestLog( - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) - test_log.Start() - test_log.WaitFor(r'.*last line.*', None) - test_log.Stop() - actual_results = test_log.FindAll( - r'\S* logcat monitor test message \d', thread_id=2109) - expected_results = [ - ('9012', '2109', 'I', 'LogcatMonitorTest', - 'info logcat monitor test message 3')] - self.assertIterEqual(iter(expected_results), actual_results) - test_log.Close() - - @mock.patch('time.sleep', mock.Mock()) - def testFindAll_filterLogLevel(self): - test_log = _CreateTestLog( - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) - test_log.Start() - test_log.WaitFor(r'.*last line.*', None) - test_log.Stop() - actual_results = test_log.FindAll( - r'\S* logcat monitor test message \d', log_level=r'[DW]') - expected_results = [ - ('8901', '1098', 'D', 'LogcatMonitorTest', - 'debug logcat monitor test message 2'), - ('0123', '3210', 'W', 'LogcatMonitorTest', - 'warning logcat monitor test message 4'),] - self.assertIterEqual(iter(expected_results), actual_results) - test_log.Close() - - @mock.patch('time.sleep', mock.Mock()) - def testFindAll_filterComponent(self): - test_log = _CreateTestLog( - raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA) - test_log.Start() - test_log.WaitFor(r'.*last line.*', None) - test_log.Stop() - actual_results = test_log.FindAll(r'.*', component='LogcatMonitorTest') - expected_results = [ - ('7890', '0987', 'V', 'LogcatMonitorTest', - 'verbose logcat monitor test message 1'), - ('8901', '1098', 'D', 'LogcatMonitorTest', - 'debug logcat monitor test message 2'), - ('9012', '2109', 'I', 'LogcatMonitorTest', - 'info logcat monitor test message 3'), - ('0123', '3210', 'W', 'LogcatMonitorTest', - 'warning logcat monitor test message 4'), - ('1234', '4321', 'E', 'LogcatMonitorTest', - 'error logcat monitor test message 5'), - ('2345', '5432', 'F', 'LogcatMonitorTest', - 'fatal logcat monitor test message 6'), - ('3456', '6543', 'D', 'LogcatMonitorTest', - 'last line'),] - self.assertIterEqual(iter(expected_results), actual_results) - test_log.Close() - - -if __name__ == '__main__': - unittest.main(verbosity=2) -
diff --git a/build/android/devil/android/md5sum.py b/build/android/devil/android/md5sum.py deleted file mode 100644 index 52706461..0000000 --- a/build/android/devil/android/md5sum.py +++ /dev/null
@@ -1,120 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import os -import posixpath -import re - -from devil import devil_env -from devil.android import device_errors -from devil.utils import cmd_helper - -MD5SUM_DEVICE_LIB_PATH = '/data/local/tmp/md5sum' -MD5SUM_DEVICE_BIN_PATH = MD5SUM_DEVICE_LIB_PATH + '/md5sum_bin' - -_STARTS_WITH_CHECKSUM_RE = re.compile(r'^\s*[0-9a-fA-F]{32}\s+') - - -def CalculateHostMd5Sums(paths): - """Calculates the MD5 sum value for all items in |paths|. - - Directories are traversed recursively and the MD5 sum of each file found is - reported in the result. - - Args: - paths: A list of host paths to md5sum. - Returns: - A dict mapping file paths to their respective md5sum checksums. - """ - if isinstance(paths, basestring): - paths = [paths] - - md5sum_bin_host_path = devil_env.config.FetchPath('md5sum_host') - if not os.path.exists(md5sum_bin_host_path): - raise IOError('File not built: %s' % md5sum_bin_host_path) - out = cmd_helper.GetCmdOutput( - [md5sum_bin_host_path] + [os.path.realpath(p) for p in paths]) - - return _ParseMd5SumOutput(out.splitlines()) - - -def CalculateDeviceMd5Sums(paths, device): - """Calculates the MD5 sum value for all items in |paths|. - - Directories are traversed recursively and the MD5 sum of each file found is - reported in the result. - - Args: - paths: A list of device paths to md5sum. - Returns: - A dict mapping file paths to their respective md5sum checksums. - """ - if not paths: - return {} - - if isinstance(paths, basestring): - paths = [paths] - # Allow generators - paths = list(paths) - - md5sum_dist_path = devil_env.config.FetchPath('md5sum_device', device=device) - - if os.path.isdir(md5sum_dist_path): - md5sum_dist_bin_path = os.path.join(md5sum_dist_path, 'md5sum_bin') - else: - md5sum_dist_bin_path = md5sum_dist_path - - if not os.path.exists(md5sum_dist_path): - raise IOError('File not built: %s' % md5sum_dist_path) - md5sum_file_size = os.path.getsize(md5sum_dist_bin_path) - - # For better performance, make the script as small as possible to try and - # avoid needing to write to an intermediary file (which RunShellCommand will - # do if necessary). - md5sum_script = 'a=%s;' % MD5SUM_DEVICE_BIN_PATH - # Check if the binary is missing or has changed (using its file size as an - # indicator), and trigger a (re-)push via the exit code. - md5sum_script += '! [[ $(ls -l $a) = *%d* ]]&&exit 2;' % md5sum_file_size - # Make sure it can find libbase.so - md5sum_script += 'export LD_LIBRARY_PATH=%s;' % MD5SUM_DEVICE_LIB_PATH - if len(paths) > 1: - prefix = posixpath.commonprefix(paths) - if len(prefix) > 4: - md5sum_script += 'p="%s";' % prefix - paths = ['$p"%s"' % p[len(prefix):] for p in paths] - - md5sum_script += ';'.join('$a %s' % p for p in paths) - # Don't fail the script if the last md5sum fails (due to file not found) - # Note: ":" is equivalent to "true". - md5sum_script += ';:' - try: - out = device.RunShellCommand(md5sum_script, check_return=True) - except device_errors.AdbShellCommandFailedError as e: - # Push the binary only if it is found to not exist - # (faster than checking up-front). - if e.status == 2: - # If files were previously pushed as root (adbd running as root), trying - # to re-push as non-root causes the push command to report success, but - # actually fail. So, wipe the directory first. - device.RunShellCommand(['rm', '-rf', MD5SUM_DEVICE_LIB_PATH], - as_root=True, check_return=True) - if os.path.isdir(md5sum_dist_path): - device.adb.Push(md5sum_dist_path, MD5SUM_DEVICE_LIB_PATH) - else: - mkdir_cmd = 'a=%s;[[ -e $a ]] || mkdir $a' % MD5SUM_DEVICE_LIB_PATH - device.RunShellCommand(mkdir_cmd, check_return=True) - device.adb.Push(md5sum_dist_bin_path, MD5SUM_DEVICE_BIN_PATH) - - out = device.RunShellCommand(md5sum_script, check_return=True) - else: - raise - - return _ParseMd5SumOutput(out) - - -def _ParseMd5SumOutput(out): - hash_and_path = (l.split(None, 1) for l in out - if l and _STARTS_WITH_CHECKSUM_RE.match(l)) - return dict((p, h) for h, p in hash_and_path) -
diff --git a/build/android/devil/android/md5sum_test.py b/build/android/devil/android/md5sum_test.py deleted file mode 100755 index c1e8bbb..0000000 --- a/build/android/devil/android/md5sum_test.py +++ /dev/null
@@ -1,237 +0,0 @@ -#!/usr/bin/env python -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import os -import unittest - -from devil import devil_env -from devil.android import device_errors -from devil.android import md5sum - -with devil_env.SysPath(devil_env.PYMOCK_PATH): - import mock # pylint: disable=import-error - -TEST_OUT_DIR = os.path.join('test', 'out', 'directory') -HOST_MD5_EXECUTABLE = os.path.join(TEST_OUT_DIR, 'md5sum_bin_host') -MD5_DIST = os.path.join(TEST_OUT_DIR, 'md5sum_dist') - -class Md5SumTest(unittest.TestCase): - - def setUp(self): - mocked_attrs = { - 'md5sum_host': HOST_MD5_EXECUTABLE, - 'md5sum_device': MD5_DIST, - } - self._patchers = [ - mock.patch('devil.devil_env._Environment.FetchPath', - mock.Mock(side_effect=lambda a, device=None: mocked_attrs[a])), - mock.patch('os.path.exists', - new=mock.Mock(return_value=True)), - ] - for p in self._patchers: - p.start() - - def tearDown(self): - for p in self._patchers: - p.stop() - - def testCalculateHostMd5Sums_singlePath(self): - test_path = '/test/host/file.dat' - mock_get_cmd_output = mock.Mock( - return_value='0123456789abcdeffedcba9876543210 /test/host/file.dat') - with mock.patch('devil.utils.cmd_helper.GetCmdOutput', - new=mock_get_cmd_output): - out = md5sum.CalculateHostMd5Sums(test_path) - self.assertEquals(1, len(out)) - self.assertTrue('/test/host/file.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/test/host/file.dat']) - mock_get_cmd_output.assert_called_once_with( - [HOST_MD5_EXECUTABLE, '/test/host/file.dat']) - - def testCalculateHostMd5Sums_list(self): - test_paths = ['/test/host/file0.dat', '/test/host/file1.dat'] - mock_get_cmd_output = mock.Mock( - return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n' - '123456789abcdef00fedcba987654321 /test/host/file1.dat\n') - with mock.patch('devil.utils.cmd_helper.GetCmdOutput', - new=mock_get_cmd_output): - out = md5sum.CalculateHostMd5Sums(test_paths) - self.assertEquals(2, len(out)) - self.assertTrue('/test/host/file0.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/test/host/file0.dat']) - self.assertTrue('/test/host/file1.dat' in out) - self.assertEquals('123456789abcdef00fedcba987654321', - out['/test/host/file1.dat']) - mock_get_cmd_output.assert_called_once_with( - [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', - '/test/host/file1.dat']) - - def testCalculateHostMd5Sums_generator(self): - test_paths = ('/test/host/' + p for p in ['file0.dat', 'file1.dat']) - mock_get_cmd_output = mock.Mock( - return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n' - '123456789abcdef00fedcba987654321 /test/host/file1.dat\n') - with mock.patch('devil.utils.cmd_helper.GetCmdOutput', - new=mock_get_cmd_output): - out = md5sum.CalculateHostMd5Sums(test_paths) - self.assertEquals(2, len(out)) - self.assertTrue('/test/host/file0.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/test/host/file0.dat']) - self.assertTrue('/test/host/file1.dat' in out) - self.assertEquals('123456789abcdef00fedcba987654321', - out['/test/host/file1.dat']) - mock_get_cmd_output.assert_called_once_with( - [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', '/test/host/file1.dat']) - - def testCalculateDeviceMd5Sums_noPaths(self): - device = mock.NonCallableMock() - device.RunShellCommand = mock.Mock(side_effect=Exception()) - - out = md5sum.CalculateDeviceMd5Sums([], device) - self.assertEquals(0, len(out)) - - def testCalculateDeviceMd5Sums_singlePath(self): - test_path = '/storage/emulated/legacy/test/file.dat' - - device = mock.NonCallableMock() - device_md5sum_output = [ - '0123456789abcdeffedcba9876543210 ' - '/storage/emulated/legacy/test/file.dat', - ] - device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) - - with mock.patch('os.path.getsize', return_value=1337): - out = md5sum.CalculateDeviceMd5Sums(test_path, device) - self.assertEquals(1, len(out)) - self.assertTrue('/storage/emulated/legacy/test/file.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/storage/emulated/legacy/test/file.dat']) - self.assertEquals(1, len(device.RunShellCommand.call_args_list)) - - def testCalculateDeviceMd5Sums_list(self): - test_path = ['/storage/emulated/legacy/test/file0.dat', - '/storage/emulated/legacy/test/file1.dat'] - device = mock.NonCallableMock() - device_md5sum_output = [ - '0123456789abcdeffedcba9876543210 ' - '/storage/emulated/legacy/test/file0.dat', - '123456789abcdef00fedcba987654321 ' - '/storage/emulated/legacy/test/file1.dat', - ] - device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) - - with mock.patch('os.path.getsize', return_value=1337): - out = md5sum.CalculateDeviceMd5Sums(test_path, device) - self.assertEquals(2, len(out)) - self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/storage/emulated/legacy/test/file0.dat']) - self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out) - self.assertEquals('123456789abcdef00fedcba987654321', - out['/storage/emulated/legacy/test/file1.dat']) - self.assertEquals(1, len(device.RunShellCommand.call_args_list)) - - def testCalculateDeviceMd5Sums_generator(self): - test_path = ('/storage/emulated/legacy/test/file%d.dat' % n - for n in xrange(0, 2)) - - device = mock.NonCallableMock() - device_md5sum_output = [ - '0123456789abcdeffedcba9876543210 ' - '/storage/emulated/legacy/test/file0.dat', - '123456789abcdef00fedcba987654321 ' - '/storage/emulated/legacy/test/file1.dat', - ] - device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) - - with mock.patch('os.path.getsize', return_value=1337): - out = md5sum.CalculateDeviceMd5Sums(test_path, device) - self.assertEquals(2, len(out)) - self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/storage/emulated/legacy/test/file0.dat']) - self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out) - self.assertEquals('123456789abcdef00fedcba987654321', - out['/storage/emulated/legacy/test/file1.dat']) - self.assertEquals(1, len(device.RunShellCommand.call_args_list)) - - def testCalculateDeviceMd5Sums_singlePath_linkerWarning(self): - # See crbug/479966 - test_path = '/storage/emulated/legacy/test/file.dat' - - device = mock.NonCallableMock() - device_md5sum_output = [ - 'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: ' - 'unused DT entry: type 0x1d arg 0x15db', - 'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text', - '0123456789abcdeffedcba9876543210 ' - '/storage/emulated/legacy/test/file.dat', - ] - device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) - - with mock.patch('os.path.getsize', return_value=1337): - out = md5sum.CalculateDeviceMd5Sums(test_path, device) - self.assertEquals(1, len(out)) - self.assertTrue('/storage/emulated/legacy/test/file.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/storage/emulated/legacy/test/file.dat']) - self.assertEquals(1, len(device.RunShellCommand.call_args_list)) - - def testCalculateDeviceMd5Sums_list_fileMissing(self): - test_path = ['/storage/emulated/legacy/test/file0.dat', - '/storage/emulated/legacy/test/file1.dat'] - device = mock.NonCallableMock() - device_md5sum_output = [ - '0123456789abcdeffedcba9876543210 ' - '/storage/emulated/legacy/test/file0.dat', - '[0819/203513:ERROR:md5sum.cc(25)] Could not open file asdf', - '', - ] - device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) - - with mock.patch('os.path.getsize', return_value=1337): - out = md5sum.CalculateDeviceMd5Sums(test_path, device) - self.assertEquals(1, len(out)) - self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/storage/emulated/legacy/test/file0.dat']) - self.assertEquals(1, len(device.RunShellCommand.call_args_list)) - - - def testCalculateDeviceMd5Sums_requiresBinary(self): - test_path = '/storage/emulated/legacy/test/file.dat' - - device = mock.NonCallableMock() - device.adb = mock.NonCallableMock() - device.adb.Push = mock.Mock() - device_md5sum_output = [ - 'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: ' - 'unused DT entry: type 0x1d arg 0x15db', - 'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text', - '0123456789abcdeffedcba9876543210 ' - '/storage/emulated/legacy/test/file.dat', - ] - error = device_errors.AdbShellCommandFailedError('cmd', 'out', 2) - device.RunShellCommand = mock.Mock( - side_effect=(error, '', device_md5sum_output)) - - with mock.patch('os.path.isdir', return_value=True), ( - mock.patch('os.path.getsize', return_value=1337)): - out = md5sum.CalculateDeviceMd5Sums(test_path, device) - self.assertEquals(1, len(out)) - self.assertTrue('/storage/emulated/legacy/test/file.dat' in out) - self.assertEquals('0123456789abcdeffedcba9876543210', - out['/storage/emulated/legacy/test/file.dat']) - self.assertEquals(3, len(device.RunShellCommand.call_args_list)) - device.adb.Push.assert_called_once_with( - 'test/out/directory/md5sum_dist', '/data/local/tmp/md5sum') - - -if __name__ == '__main__': - unittest.main(verbosity=2) -
diff --git a/build/android/devil/android/perf/__init__.py b/build/android/devil/android/perf/__init__.py deleted file mode 100644 index 50b23df..0000000 --- a/build/android/devil/android/perf/__init__.py +++ /dev/null
@@ -1,3 +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.
diff --git a/build/android/devil/android/perf/cache_control.py b/build/android/devil/android/perf/cache_control.py deleted file mode 100644 index 7bd0a4e7f..0000000 --- a/build/android/devil/android/perf/cache_control.py +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -class CacheControl(object): - _DROP_CACHES = '/proc/sys/vm/drop_caches' - - def __init__(self, device): - self._device = device - - def DropRamCaches(self): - """Drops the filesystem ram caches for performance testing.""" - self._device.RunShellCommand('sync', as_root=True) - self._device.WriteFile(CacheControl._DROP_CACHES, '3', as_root=True) -
diff --git a/build/android/devil/android/perf/perf_control.py b/build/android/devil/android/perf/perf_control.py deleted file mode 100644 index af1d52c..0000000 --- a/build/android/devil/android/perf/perf_control.py +++ /dev/null
@@ -1,156 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import atexit -import logging - -from devil.android import device_errors - - -class PerfControl(object): - """Provides methods for setting the performance mode of a device.""" - _CPU_PATH = '/sys/devices/system/cpu' - _KERNEL_MAX = '/sys/devices/system/cpu/kernel_max' - - def __init__(self, device): - self._device = device - # this will raise an AdbCommandFailedError if no CPU files are found - self._cpu_files = self._device.RunShellCommand( - 'ls -d cpu[0-9]*', cwd=self._CPU_PATH, check_return=True, as_root=True) - assert self._cpu_files, 'Failed to detect CPUs.' - self._cpu_file_list = ' '.join(self._cpu_files) - logging.info('CPUs found: %s', self._cpu_file_list) - self._have_mpdecision = self._device.FileExists('/system/bin/mpdecision') - - def SetHighPerfMode(self): - """Sets the highest stable performance mode for the device.""" - try: - self._device.EnableRoot() - except device_errors.CommandFailedError: - message = 'Need root for performance mode. Results may be NOISY!!' - logging.warning(message) - # Add an additional warning at exit, such that it's clear that any results - # may be different/noisy (due to the lack of intended performance mode). - atexit.register(logging.warning, message) - return - - product_model = self._device.product_model - # TODO(epenner): Enable on all devices (http://crbug.com/383566) - if 'Nexus 4' == product_model: - self._ForceAllCpusOnline(True) - if not self._AllCpusAreOnline(): - logging.warning('Failed to force CPUs online. Results may be NOISY!') - self._SetScalingGovernorInternal('performance') - elif 'Nexus 5' == product_model: - self._ForceAllCpusOnline(True) - if not self._AllCpusAreOnline(): - logging.warning('Failed to force CPUs online. Results may be NOISY!') - self._SetScalingGovernorInternal('performance') - self._SetScalingMaxFreq(1190400) - self._SetMaxGpuClock(200000000) - else: - self._SetScalingGovernorInternal('performance') - - def SetPerfProfilingMode(self): - """Enables all cores for reliable perf profiling.""" - self._ForceAllCpusOnline(True) - self._SetScalingGovernorInternal('performance') - if not self._AllCpusAreOnline(): - if not self._device.HasRoot(): - raise RuntimeError('Need root to force CPUs online.') - raise RuntimeError('Failed to force CPUs online.') - - def SetDefaultPerfMode(self): - """Sets the performance mode for the device to its default mode.""" - if not self._device.HasRoot(): - return - product_model = self._device.product_model - if 'Nexus 5' == product_model: - if self._AllCpusAreOnline(): - self._SetScalingMaxFreq(2265600) - self._SetMaxGpuClock(450000000) - - governor_mode = { - 'GT-I9300': 'pegasusq', - 'Galaxy Nexus': 'interactive', - 'Nexus 4': 'ondemand', - 'Nexus 5': 'ondemand', - 'Nexus 7': 'interactive', - 'Nexus 10': 'interactive' - }.get(product_model, 'ondemand') - self._SetScalingGovernorInternal(governor_mode) - self._ForceAllCpusOnline(False) - - def GetCpuInfo(self): - online = (output.rstrip() == '1' and status == 0 - for (_, output, status) in self._ForEachCpu('cat "$CPU/online"')) - governor = (output.rstrip() if status == 0 else None - for (_, output, status) - in self._ForEachCpu('cat "$CPU/cpufreq/scaling_governor"')) - return zip(self._cpu_files, online, governor) - - def _ForEachCpu(self, cmd): - script = '; '.join([ - 'for CPU in %s' % self._cpu_file_list, - 'do %s' % cmd, - 'echo -n "%~%$?%~%"', - 'done' - ]) - output = self._device.RunShellCommand( - script, cwd=self._CPU_PATH, check_return=True, as_root=True) - output = '\n'.join(output).split('%~%') - return zip(self._cpu_files, output[0::2], (int(c) for c in output[1::2])) - - def _WriteEachCpuFile(self, path, value): - results = self._ForEachCpu( - 'test -e "$CPU/{path}" && echo {value} > "$CPU/{path}"'.format( - path=path, value=value)) - cpus = ' '.join(cpu for (cpu, _, status) in results if status == 0) - if cpus: - logging.info('Successfully set %s to %r on: %s', path, value, cpus) - else: - logging.warning('Failed to set %s to %r on any cpus', path, value) - - def _SetScalingGovernorInternal(self, value): - self._WriteEachCpuFile('cpufreq/scaling_governor', value) - - def _SetScalingMaxFreq(self, value): - self._WriteEachCpuFile('cpufreq/scaling_max_freq', '%d' % value) - - def _SetMaxGpuClock(self, value): - self._device.WriteFile('/sys/class/kgsl/kgsl-3d0/max_gpuclk', - str(value), - as_root=True) - - def _AllCpusAreOnline(self): - results = self._ForEachCpu('cat "$CPU/online"') - # TODO(epenner): Investigate why file may be missing - # (http://crbug.com/397118) - return all(output.rstrip() == '1' and status == 0 - for (cpu, output, status) in results - if cpu != 'cpu0') - - def _ForceAllCpusOnline(self, force_online): - """Enable all CPUs on a device. - - Some vendors (or only Qualcomm?) hot-plug their CPUs, which can add noise - to measurements: - - In perf, samples are only taken for the CPUs that are online when the - measurement is started. - - The scaling governor can't be set for an offline CPU and frequency scaling - on newly enabled CPUs adds noise to both perf and tracing measurements. - - It appears Qualcomm is the only vendor that hot-plugs CPUs, and on Qualcomm - this is done by "mpdecision". - - """ - if self._have_mpdecision: - script = 'stop mpdecision' if force_online else 'start mpdecision' - self._device.RunShellCommand(script, check_return=True, as_root=True) - - if not self._have_mpdecision and not self._AllCpusAreOnline(): - logging.warning('Unexpected cpu hot plugging detected.') - - if force_online: - self._ForEachCpu('echo 1 > "$CPU/online"')
diff --git a/build/android/devil/android/perf/perf_control_unittest.py b/build/android/devil/android/perf/perf_control_unittest.py deleted file mode 100644 index 90907bd..0000000 --- a/build/android/devil/android/perf/perf_control_unittest.py +++ /dev/null
@@ -1,37 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -# pylint: disable=W0212 - -import os -import sys -import unittest - -sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) - -from devil.android import device_utils -from devil.android.perf import perf_control - -class TestPerfControl(unittest.TestCase): - def setUp(self): - if not os.getenv('BUILDTYPE'): - os.environ['BUILDTYPE'] = 'Debug' - - devices = device_utils.DeviceUtils.HealthyDevices(blacklist=None) - self.assertGreater(len(devices), 0, 'No device attached!') - self._device = devices[0] - - def testHighPerfMode(self): - perf = perf_control.PerfControl(self._device) - try: - perf.SetPerfProfilingMode() - cpu_info = perf.GetCpuInfo() - self.assertEquals(len(perf._cpu_files), len(cpu_info)) - for _, online, governor in cpu_info: - self.assertTrue(online) - self.assertEquals('performance', governor) - finally: - perf.SetDefaultPerfMode() - -if __name__ == '__main__': - unittest.main()
diff --git a/build/android/devil/android/perf/surface_stats_collector.py b/build/android/devil/android/perf/surface_stats_collector.py deleted file mode 100644 index 49372ad..0000000 --- a/build/android/devil/android/perf/surface_stats_collector.py +++ /dev/null
@@ -1,183 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import Queue -import threading - - -# Log marker containing SurfaceTexture timestamps. -_SURFACE_TEXTURE_TIMESTAMPS_MESSAGE = 'SurfaceTexture update timestamps' -_SURFACE_TEXTURE_TIMESTAMP_RE = r'\d+' - - -class SurfaceStatsCollector(object): - """Collects surface stats for a SurfaceView from the output of SurfaceFlinger. - - Args: - device: A DeviceUtils instance. - """ - - def __init__(self, device): - self._device = device - self._collector_thread = None - self._surface_before = None - self._get_data_event = None - self._data_queue = None - self._stop_event = None - self._warn_about_empty_data = True - - def DisableWarningAboutEmptyData(self): - self._warn_about_empty_data = False - - def Start(self): - assert not self._collector_thread - - if self._ClearSurfaceFlingerLatencyData(): - self._get_data_event = threading.Event() - self._stop_event = threading.Event() - self._data_queue = Queue.Queue() - self._collector_thread = threading.Thread(target=self._CollectorThread) - self._collector_thread.start() - else: - raise Exception('SurfaceFlinger not supported on this device.') - - def Stop(self): - assert self._collector_thread - (refresh_period, timestamps) = self._GetDataFromThread() - if self._collector_thread: - self._stop_event.set() - self._collector_thread.join() - self._collector_thread = None - return (refresh_period, timestamps) - - def _CollectorThread(self): - last_timestamp = 0 - timestamps = [] - retries = 0 - - while not self._stop_event.is_set(): - self._get_data_event.wait(1) - try: - refresh_period, new_timestamps = self._GetSurfaceFlingerFrameData() - if refresh_period is None or timestamps is None: - retries += 1 - if retries < 3: - continue - if last_timestamp: - # Some data has already been collected, but either the app - # was closed or there's no new data. Signal the main thread and - # wait. - self._data_queue.put((None, None)) - self._stop_event.wait() - break - raise Exception('Unable to get surface flinger latency data') - - timestamps += [timestamp for timestamp in new_timestamps - if timestamp > last_timestamp] - if len(timestamps): - last_timestamp = timestamps[-1] - - if self._get_data_event.is_set(): - self._get_data_event.clear() - self._data_queue.put((refresh_period, timestamps)) - timestamps = [] - except Exception as e: - # On any error, before aborting, put the exception into _data_queue to - # prevent the main thread from waiting at _data_queue.get() infinitely. - self._data_queue.put(e) - raise - - def _GetDataFromThread(self): - self._get_data_event.set() - ret = self._data_queue.get() - if isinstance(ret, Exception): - raise ret - return ret - - def _ClearSurfaceFlingerLatencyData(self): - """Clears the SurfaceFlinger latency data. - - Returns: - True if SurfaceFlinger latency is supported by the device, otherwise - False. - """ - # The command returns nothing if it is supported, otherwise returns many - # lines of result just like 'dumpsys SurfaceFlinger'. - results = self._device.RunShellCommand( - 'dumpsys SurfaceFlinger --latency-clear SurfaceView') - return not len(results) - - def GetSurfaceFlingerPid(self): - results = self._device.RunShellCommand('ps | grep surfaceflinger') - if not results: - raise Exception('Unable to get surface flinger process id') - pid = results[0].split()[1] - return pid - - def _GetSurfaceFlingerFrameData(self): - """Returns collected SurfaceFlinger frame timing data. - - Returns: - A tuple containing: - - The display's nominal refresh period in milliseconds. - - A list of timestamps signifying frame presentation times in - milliseconds. - The return value may be (None, None) if there was no data collected (for - example, if the app was closed before the collector thread has finished). - """ - # adb shell dumpsys SurfaceFlinger --latency <window name> - # prints some information about the last 128 frames displayed in - # that window. - # The data returned looks like this: - # 16954612 - # 7657467895508 7657482691352 7657493499756 - # 7657484466553 7657499645964 7657511077881 - # 7657500793457 7657516600576 7657527404785 - # (...) - # - # The first line is the refresh period (here 16.95 ms), it is followed - # by 128 lines w/ 3 timestamps in nanosecond each: - # A) when the app started to draw - # B) the vsync immediately preceding SF submitting the frame to the h/w - # C) timestamp immediately after SF submitted that frame to the h/w - # - # The difference between the 1st and 3rd timestamp is the frame-latency. - # An interesting data is when the frame latency crosses a refresh period - # boundary, this can be calculated this way: - # - # ceil((C - A) / refresh-period) - # - # (each time the number above changes, we have a "jank"). - # If this happens a lot during an animation, the animation appears - # janky, even if it runs at 60 fps in average. - # - # We use the special "SurfaceView" window name because the statistics for - # the activity's main window are not updated when the main web content is - # composited into a SurfaceView. - results = self._device.RunShellCommand( - 'dumpsys SurfaceFlinger --latency SurfaceView') - if not len(results): - return (None, None) - - timestamps = [] - nanoseconds_per_millisecond = 1e6 - refresh_period = long(results[0]) / nanoseconds_per_millisecond - - # If a fence associated with a frame is still pending when we query the - # latency data, SurfaceFlinger gives the frame a timestamp of INT64_MAX. - # Since we only care about completed frames, we will ignore any timestamps - # with this value. - pending_fence_timestamp = (1 << 63) - 1 - - for line in results[1:]: - fields = line.split() - if len(fields) != 3: - continue - timestamp = long(fields[1]) - if timestamp == pending_fence_timestamp: - continue - timestamp /= nanoseconds_per_millisecond - timestamps.append(timestamp) - - return (refresh_period, timestamps)
diff --git a/build/android/devil/android/perf/thermal_throttle.py b/build/android/devil/android/perf/thermal_throttle.py deleted file mode 100644 index 9aad4bb..0000000 --- a/build/android/devil/android/perf/thermal_throttle.py +++ /dev/null
@@ -1,132 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import logging - - -class OmapThrottlingDetector(object): - """Class to detect and track thermal throttling on an OMAP 4.""" - OMAP_TEMP_FILE = ('/sys/devices/platform/omap/omap_temp_sensor.0/' - 'temperature') - - @staticmethod - def IsSupported(device): - return device.FileExists(OmapThrottlingDetector.OMAP_TEMP_FILE) - - def __init__(self, device): - self._device = device - - @staticmethod - def BecameThrottled(log_line): - return 'omap_thermal_throttle' in log_line - - @staticmethod - def BecameUnthrottled(log_line): - return 'omap_thermal_unthrottle' in log_line - - @staticmethod - def GetThrottlingTemperature(log_line): - if 'throttle_delayed_work_fn' in log_line: - return float([s for s in log_line.split() if s.isdigit()][0]) / 1000.0 - - def GetCurrentTemperature(self): - tempdata = self._device.ReadFile(OmapThrottlingDetector.OMAP_TEMP_FILE) - return float(tempdata) / 1000.0 - - -class ExynosThrottlingDetector(object): - """Class to detect and track thermal throttling on an Exynos 5.""" - @staticmethod - def IsSupported(device): - return device.FileExists('/sys/bus/exynos5-core') - - def __init__(self, device): - pass - - @staticmethod - def BecameThrottled(log_line): - return 'exynos_tmu: Throttling interrupt' in log_line - - @staticmethod - def BecameUnthrottled(log_line): - return 'exynos_thermal_unthrottle: not throttling' in log_line - - @staticmethod - def GetThrottlingTemperature(_log_line): - return None - - @staticmethod - def GetCurrentTemperature(): - return None - - -class ThermalThrottle(object): - """Class to detect and track thermal throttling. - - Usage: - Wait for IsThrottled() to be False before running test - After running test call HasBeenThrottled() to find out if the - test run was affected by thermal throttling. - """ - - def __init__(self, device): - self._device = device - self._throttled = False - self._detector = None - if OmapThrottlingDetector.IsSupported(device): - self._detector = OmapThrottlingDetector(device) - elif ExynosThrottlingDetector.IsSupported(device): - self._detector = ExynosThrottlingDetector(device) - - def HasBeenThrottled(self): - """True if there has been any throttling since the last call to - HasBeenThrottled or IsThrottled. - """ - return self._ReadLog() - - def IsThrottled(self): - """True if currently throttled.""" - self._ReadLog() - return self._throttled - - def _ReadLog(self): - if not self._detector: - return False - has_been_throttled = False - serial_number = str(self._device) - log = self._device.RunShellCommand('dmesg -c') - degree_symbol = unichr(0x00B0) - for line in log: - if self._detector.BecameThrottled(line): - if not self._throttled: - logging.warning('>>> Device %s thermally throttled', serial_number) - self._throttled = True - has_been_throttled = True - elif self._detector.BecameUnthrottled(line): - if self._throttled: - logging.warning('>>> Device %s thermally unthrottled', serial_number) - self._throttled = False - has_been_throttled = True - temperature = self._detector.GetThrottlingTemperature(line) - if temperature is not None: - logging.info(u'Device %s thermally throttled at %3.1f%sC', - serial_number, temperature, degree_symbol) - - if logging.getLogger().isEnabledFor(logging.DEBUG): - # Print current temperature of CPU SoC. - temperature = self._detector.GetCurrentTemperature() - if temperature is not None: - logging.debug(u'Current SoC temperature of %s = %3.1f%sC', - serial_number, temperature, degree_symbol) - - # Print temperature of battery, to give a system temperature - dumpsys_log = self._device.RunShellCommand('dumpsys battery') - for line in dumpsys_log: - if 'temperature' in line: - btemp = float([s for s in line.split() if s.isdigit()][0]) / 10.0 - logging.debug(u'Current battery temperature of %s = %3.1f%sC', - serial_number, btemp, degree_symbol) - - return has_been_throttled -
diff --git a/build/android/devil/android/ports.py b/build/android/devil/android/ports.py deleted file mode 100644 index eff30ce..0000000 --- a/build/android/devil/android/ports.py +++ /dev/null
@@ -1,178 +0,0 @@ -# Copyright (c) 2012 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Functions that deal with local and device ports.""" - -import contextlib -import fcntl -import httplib -import logging -import os -import socket -import traceback - -# The net test server is started from port 10201. -_TEST_SERVER_PORT_FIRST = 10201 -_TEST_SERVER_PORT_LAST = 30000 -# A file to record next valid port of test server. -_TEST_SERVER_PORT_FILE = '/tmp/test_server_port' -_TEST_SERVER_PORT_LOCKFILE = '/tmp/test_server_port.lock' - - -# The following two methods are used to allocate the port source for various -# types of test servers. Because some net-related tests can be run on shards at -# same time, it's important to have a mechanism to allocate the port -# process-safe. In here, we implement the safe port allocation by leveraging -# flock. -def ResetTestServerPortAllocation(): - """Resets the port allocation to start from TEST_SERVER_PORT_FIRST. - - Returns: - Returns True if reset successes. Otherwise returns False. - """ - try: - with open(_TEST_SERVER_PORT_FILE, 'w') as fp: - fp.write('%d' % _TEST_SERVER_PORT_FIRST) - if os.path.exists(_TEST_SERVER_PORT_LOCKFILE): - os.unlink(_TEST_SERVER_PORT_LOCKFILE) - return True - except Exception: # pylint: disable=broad-except - logging.exception('Error while resetting port allocation') - return False - - -def AllocateTestServerPort(): - """Allocates a port incrementally. - - Returns: - Returns a valid port which should be in between TEST_SERVER_PORT_FIRST and - TEST_SERVER_PORT_LAST. Returning 0 means no more valid port can be used. - """ - port = 0 - ports_tried = [] - try: - fp_lock = open(_TEST_SERVER_PORT_LOCKFILE, 'w') - fcntl.flock(fp_lock, fcntl.LOCK_EX) - # Get current valid port and calculate next valid port. - if not os.path.exists(_TEST_SERVER_PORT_FILE): - ResetTestServerPortAllocation() - with open(_TEST_SERVER_PORT_FILE, 'r+') as fp: - port = int(fp.read()) - ports_tried.append(port) - while not IsHostPortAvailable(port): - port += 1 - ports_tried.append(port) - if (port > _TEST_SERVER_PORT_LAST or - port < _TEST_SERVER_PORT_FIRST): - port = 0 - else: - fp.seek(0, os.SEEK_SET) - fp.write('%d' % (port + 1)) - except Exception: # pylint: disable=broad-except - logging.exception('ERror while allocating port') - finally: - if fp_lock: - fcntl.flock(fp_lock, fcntl.LOCK_UN) - fp_lock.close() - if port: - logging.info('Allocate port %d for test server.', port) - else: - logging.error('Could not allocate port for test server. ' - 'List of ports tried: %s', str(ports_tried)) - return port - - -def IsHostPortAvailable(host_port): - """Checks whether the specified host port is available. - - Args: - host_port: Port on host to check. - - Returns: - True if the port on host is available, otherwise returns False. - """ - s = socket.socket() - try: - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - s.bind(('', host_port)) - s.close() - return True - except socket.error: - return False - - -def IsDevicePortUsed(device, device_port, state=''): - """Checks whether the specified device port is used or not. - - Args: - device: A DeviceUtils instance. - device_port: Port on device we want to check. - state: String of the specified state. Default is empty string, which - means any state. - - Returns: - True if the port on device is already used, otherwise returns False. - """ - base_urls = ('127.0.0.1:%d' % device_port, 'localhost:%d' % device_port) - netstat_results = device.RunShellCommand( - ['netstat', '-a'], check_return=True, large_output=True) - for single_connect in netstat_results: - # Column 3 is the local address which we want to check with. - connect_results = single_connect.split() - if connect_results[0] != 'tcp': - continue - if len(connect_results) < 6: - raise Exception('Unexpected format while parsing netstat line: ' + - single_connect) - is_state_match = connect_results[5] == state if state else True - if connect_results[3] in base_urls and is_state_match: - return True - return False - - -def IsHttpServerConnectable(host, port, tries=3, command='GET', path='/', - expected_read='', timeout=2): - """Checks whether the specified http server is ready to serve request or not. - - Args: - host: Host name of the HTTP server. - port: Port number of the HTTP server. - tries: How many times we want to test the connection. The default value is - 3. - command: The http command we use to connect to HTTP server. The default - command is 'GET'. - path: The path we use when connecting to HTTP server. The default path is - '/'. - expected_read: The content we expect to read from the response. The default - value is ''. - timeout: Timeout (in seconds) for each http connection. The default is 2s. - - Returns: - Tuple of (connect status, client error). connect status is a boolean value - to indicate whether the server is connectable. client_error is the error - message the server returns when connect status is false. - """ - assert tries >= 1 - for i in xrange(0, tries): - client_error = None - try: - with contextlib.closing(httplib.HTTPConnection( - host, port, timeout=timeout)) as http: - # Output some debug information when we have tried more than 2 times. - http.set_debuglevel(i >= 2) - http.request(command, path) - r = http.getresponse() - content = r.read() - if r.status == 200 and r.reason == 'OK' and content == expected_read: - return (True, '') - client_error = ('Bad response: %s %s version %s\n ' % - (r.status, r.reason, r.version) + - '\n '.join([': '.join(h) for h in r.getheaders()])) - except (httplib.HTTPException, socket.error) as e: - # Probably too quick connecting: try again. - exception_error_msgs = traceback.format_exception_only(type(e), e) - if exception_error_msgs: - client_error = ''.join(exception_error_msgs) - # Only returns last client_error. - return (False, client_error or 'Timeout')
diff --git a/build/android/devil/android/sdk/__init__.py b/build/android/devil/android/sdk/__init__.py deleted file mode 100644 index f95d3b2..0000000 --- a/build/android/devil/android/sdk/__init__.py +++ /dev/null
@@ -1,6 +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. - -# This package is intended for modules that are very tightly coupled to -# tools or APIs from the Android SDK.
diff --git a/build/android/devil/android/sdk/aapt.py b/build/android/devil/android/sdk/aapt.py deleted file mode 100644 index 7ae3a93..0000000 --- a/build/android/devil/android/sdk/aapt.py +++ /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. - -"""This module wraps the Android Asset Packaging Tool.""" - -from devil.android.sdk import build_tools -from devil.utils import cmd_helper -from devil.utils import lazy - - -_aapt_path = lazy.WeakConstant(lambda: build_tools.GetPath('aapt')) - - -def _RunAaptCmd(args): - """Runs an aapt command. - - Args: - args: A list of arguments for aapt. - - Returns: - The output of the command. - """ - cmd = [_aapt_path.read()] + args - status, output = cmd_helper.GetCmdStatusAndOutput(cmd) - if status != 0: - raise Exception('Failed running aapt command: "%s" with output "%s".' % - (' '.join(cmd), output)) - return output - - -def Dump(what, apk, assets=None): - """Returns the output of the aapt dump command. - - Args: - what: What you want to dump. - apk: Path to apk you want to dump information for. - assets: List of assets in apk you want to dump information for. - """ - assets = assets or [] - if isinstance(assets, basestring): - assets = [assets] - return _RunAaptCmd(['dump', what, apk] + assets).splitlines()
diff --git a/build/android/devil/android/sdk/adb_wrapper.py b/build/android/devil/android/sdk/adb_wrapper.py deleted file mode 100644 index 30a8feed..0000000 --- a/build/android/devil/android/sdk/adb_wrapper.py +++ /dev/null
@@ -1,705 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""This module wraps Android's adb tool. - -This is a thin wrapper around the adb interface. Any additional complexity -should be delegated to a higher level (ex. DeviceUtils). -""" - -import collections -import errno -import logging -import os -import re - -from devil import devil_env -from devil.android import decorators -from devil.android import device_errors -from devil.utils import cmd_helper -from devil.utils import lazy -from devil.utils import timeout_retry - -with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH): - import dependency_manager # pylint: disable=import-error - - -_DEFAULT_TIMEOUT = 30 -_DEFAULT_RETRIES = 2 - -_EMULATOR_RE = re.compile(r'^emulator-[0-9]+$') - -_READY_STATE = 'device' - - -def VerifyLocalFileExists(path): - """Verifies a local file exists. - - Args: - path: Path to the local file. - - Raises: - IOError: If the file doesn't exist. - """ - if not os.path.exists(path): - raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path) - - -def _FindAdb(): - try: - return devil_env.config.LocalPath('adb') - except dependency_manager.NoPathFoundError: - pass - - try: - return os.path.join(devil_env.config.LocalPath('android_sdk'), - 'platform-tools', 'adb') - except dependency_manager.NoPathFoundError: - pass - - try: - return devil_env.config.FetchPath('adb') - except dependency_manager.NoPathFoundError: - raise device_errors.NoAdbError() - - -def _ShouldRetryAdbCmd(exc): - return not isinstance(exc, device_errors.NoAdbError) - - -DeviceStat = collections.namedtuple('DeviceStat', - ['st_mode', 'st_size', 'st_time']) - - -class AdbWrapper(object): - """A wrapper around a local Android Debug Bridge executable.""" - - _adb_path = lazy.WeakConstant(_FindAdb) - - def __init__(self, device_serial): - """Initializes the AdbWrapper. - - Args: - device_serial: The device serial number as a string. - """ - if not device_serial: - raise ValueError('A device serial must be specified') - self._device_serial = str(device_serial) - - @classmethod - def GetAdbPath(cls): - return cls._adb_path.read() - - @classmethod - def _BuildAdbCmd(cls, args, device_serial, cpu_affinity=None): - if cpu_affinity is not None: - cmd = ['taskset', '-c', str(cpu_affinity)] - else: - cmd = [] - cmd.append(cls.GetAdbPath()) - if device_serial is not None: - cmd.extend(['-s', device_serial]) - cmd.extend(args) - return cmd - - #pylint: disable=unused-argument - @classmethod - @decorators.WithTimeoutAndConditionalRetries(_ShouldRetryAdbCmd) - def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None, - check_error=True, cpu_affinity=None): - # pylint: disable=no-member - try: - status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout( - cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity), - timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime()) - except OSError as e: - if e.errno in (errno.ENOENT, errno.ENOEXEC): - raise device_errors.NoAdbError(msg=str(e)) - else: - raise - - if status != 0: - raise device_errors.AdbCommandFailedError( - args, output, status, device_serial) - # This catches some errors, including when the device drops offline; - # unfortunately adb is very inconsistent with error reporting so many - # command failures present differently. - if check_error and output.startswith('error:'): - raise device_errors.AdbCommandFailedError(args, output) - return output - # pylint: enable=unused-argument - - def _RunDeviceAdbCmd(self, args, timeout, retries, check_error=True): - """Runs an adb command on the device associated with this object. - - Args: - args: A list of arguments to adb. - timeout: Timeout in seconds. - retries: Number of retries. - check_error: Check that the command doesn't return an error message. This - does NOT check the exit status of shell commands. - - Returns: - The output of the command. - """ - return self._RunAdbCmd(args, timeout=timeout, retries=retries, - device_serial=self._device_serial, - check_error=check_error) - - def _IterRunDeviceAdbCmd(self, args, timeout): - """Runs an adb command and returns an iterator over its output lines. - - Args: - args: A list of arguments to adb. - timeout: Timeout in seconds. - - Yields: - The output of the command line by line. - """ - return cmd_helper.IterCmdOutputLines( - self._BuildAdbCmd(args, self._device_serial), timeout=timeout) - - def __eq__(self, other): - """Consider instances equal if they refer to the same device. - - Args: - other: The instance to compare equality with. - - Returns: - True if the instances are considered equal, false otherwise. - """ - return self._device_serial == str(other) - - def __str__(self): - """The string representation of an instance. - - Returns: - The device serial number as a string. - """ - return self._device_serial - - def __repr__(self): - return '%s(\'%s\')' % (self.__class__.__name__, self) - - # pylint: disable=unused-argument - @classmethod - def IsServerOnline(cls): - status, output = cmd_helper.GetCmdStatusAndOutput(['pgrep', 'adb']) - output = [int(x) for x in output.split()] - logging.info('PIDs for adb found: %r', output) - return status == 0 - # pylint: enable=unused-argument - - @classmethod - def KillServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries) - - @classmethod - def StartServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - # CPU affinity is used to reduce adb instability http://crbug.com/268450 - cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries, - cpu_affinity=0) - - @classmethod - def GetDevices(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """DEPRECATED. Refer to Devices(...) below.""" - # TODO(jbudorick): Remove this function once no more clients are using it. - return cls.Devices(timeout=timeout, retries=retries) - - @classmethod - def Devices(cls, desired_state=_READY_STATE, long_list=False, - timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """Get the list of active attached devices. - - Args: - desired_state: If not None, limit the devices returned to only those - in the given state. - long_list: Whether to use the long listing format. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - - Yields: - AdbWrapper instances. - """ - lines = cls._RawDevices(long_list=long_list, timeout=timeout, - retries=retries) - if long_list: - return [ - [AdbWrapper(line[0])] + line[1:] - for line in lines - if (len(line) >= 2 and (not desired_state or line[1] == desired_state)) - ] - else: - return [ - AdbWrapper(line[0]) - for line in lines - if (len(line) == 2 and (not desired_state or line[1] == desired_state)) - ] - - @classmethod - def _RawDevices(cls, long_list=False, timeout=_DEFAULT_TIMEOUT, - retries=_DEFAULT_RETRIES): - cmd = ['devices'] - if long_list: - cmd.append('-l') - output = cls._RunAdbCmd(cmd, timeout=timeout, retries=retries) - return [line.split() for line in output.splitlines()[1:]] - - def GetDeviceSerial(self): - """Gets the device serial number associated with this object. - - Returns: - Device serial number as a string. - """ - return self._device_serial - - def Push(self, local, remote, timeout=60*5, retries=_DEFAULT_RETRIES): - """Pushes a file from the host to the device. - - Args: - local: Path on the host filesystem. - remote: Path on the device filesystem. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - VerifyLocalFileExists(local) - self._RunDeviceAdbCmd(['push', local, remote], timeout, retries) - - def Pull(self, remote, local, timeout=60*5, retries=_DEFAULT_RETRIES): - """Pulls a file from the device to the host. - - Args: - remote: Path on the device filesystem. - local: Path on the host filesystem. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - cmd = ['pull', remote, local] - self._RunDeviceAdbCmd(cmd, timeout, retries) - try: - VerifyLocalFileExists(local) - except IOError: - raise device_errors.AdbCommandFailedError( - cmd, 'File not found on host: %s' % local, device_serial=str(self)) - - def Shell(self, command, expect_status=0, timeout=_DEFAULT_TIMEOUT, - retries=_DEFAULT_RETRIES): - """Runs a shell command on the device. - - Args: - command: A string with the shell command to run. - expect_status: (optional) Check that the command's exit status matches - this value. Default is 0. If set to None the test is skipped. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - - Returns: - The output of the shell command as a string. - - Raises: - device_errors.AdbCommandFailedError: If the exit status doesn't match - |expect_status|. - """ - if expect_status is None: - args = ['shell', command] - else: - args = ['shell', '( %s );echo %%$?' % command.rstrip()] - output = self._RunDeviceAdbCmd(args, timeout, retries, check_error=False) - if expect_status is not None: - output_end = output.rfind('%') - if output_end < 0: - # causes the status string to become empty and raise a ValueError - output_end = len(output) - - try: - status = int(output[output_end+1:]) - except ValueError: - logging.warning('exit status of shell command %r missing.', command) - raise device_errors.AdbShellCommandFailedError( - command, output, status=None, device_serial=self._device_serial) - output = output[:output_end] - if status != expect_status: - raise device_errors.AdbShellCommandFailedError( - command, output, status=status, device_serial=self._device_serial) - return output - - def IterShell(self, command, timeout): - """Runs a shell command and returns an iterator over its output lines. - - Args: - command: A string with the shell command to run. - timeout: Timeout in seconds. - - Yields: - The output of the command line by line. - """ - args = ['shell', command] - return cmd_helper.IterCmdOutputLines( - self._BuildAdbCmd(args, self._device_serial), timeout=timeout) - - def Ls(self, path, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """List the contents of a directory on the device. - - Args: - path: Path on the device filesystem. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - - Returns: - A list of pairs (filename, stat) for each file found in the directory, - where the stat object has the properties: st_mode, st_size, and st_time. - - Raises: - AdbCommandFailedError if |path| does not specify a valid and accessible - directory in the device, or the output of "adb ls" command is less - than four columns - """ - def ParseLine(line, cmd): - cols = line.split(None, 3) - if len(cols) < 4: - raise device_errors.AdbCommandFailedError( - cmd, line, "the output should be 4 columns, but is only %d columns" - % len(cols), device_serial=self._device_serial) - filename = cols.pop() - stat = DeviceStat(*[int(num, base=16) for num in cols]) - return (filename, stat) - - cmd = ['ls', path] - lines = self._RunDeviceAdbCmd( - cmd, timeout=timeout, retries=retries).splitlines() - if lines: - return [ParseLine(line, cmd) for line in lines] - else: - raise device_errors.AdbCommandFailedError( - cmd, 'path does not specify an accessible directory in the device', - device_serial=self._device_serial) - - def Logcat(self, clear=False, dump=False, filter_specs=None, - logcat_format=None, ring_buffer=None, timeout=None, - retries=_DEFAULT_RETRIES): - """Get an iterable over the logcat output. - - Args: - clear: If true, clear the logcat. - dump: If true, dump the current logcat contents. - filter_specs: If set, a list of specs to filter the logcat. - logcat_format: If set, the format in which the logcat should be output. - Options include "brief", "process", "tag", "thread", "raw", "time", - "threadtime", and "long" - ring_buffer: If set, a list of alternate ring buffers to request. - Options include "main", "system", "radio", "events", "crash" or "all". - The default is equivalent to ["main", "system", "crash"]. - timeout: (optional) If set, timeout per try in seconds. If clear or dump - is set, defaults to _DEFAULT_TIMEOUT. - retries: (optional) If clear or dump is set, the number of retries to - attempt. Otherwise, does nothing. - - Yields: - logcat output line by line. - """ - cmd = ['logcat'] - use_iter = True - if clear: - cmd.append('-c') - use_iter = False - if dump: - cmd.append('-d') - use_iter = False - if logcat_format: - cmd.extend(['-v', logcat_format]) - if ring_buffer: - for buffer_name in ring_buffer: - cmd.extend(['-b', buffer_name]) - if filter_specs: - cmd.extend(filter_specs) - - if use_iter: - return self._IterRunDeviceAdbCmd(cmd, timeout) - else: - timeout = timeout if timeout is not None else _DEFAULT_TIMEOUT - return self._RunDeviceAdbCmd(cmd, timeout, retries).splitlines() - - def Forward(self, local, remote, timeout=_DEFAULT_TIMEOUT, - retries=_DEFAULT_RETRIES): - """Forward socket connections from the local socket to the remote socket. - - Sockets are specified by one of: - tcp:<port> - localabstract:<unix domain socket name> - localreserved:<unix domain socket name> - localfilesystem:<unix domain socket name> - dev:<character device name> - jdwp:<process pid> (remote only) - - Args: - local: The host socket. - remote: The device socket. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - self._RunDeviceAdbCmd(['forward', str(local), str(remote)], timeout, - retries) - - def ForwardRemove(self, local, timeout=_DEFAULT_TIMEOUT, - retries=_DEFAULT_RETRIES): - """Remove a forward socket connection. - - Args: - local: The host socket. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - self._RunDeviceAdbCmd(['forward', '--remove', str(local)], timeout, - retries) - - def ForwardList(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """List all currently forwarded socket connections. - - Args: - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - return self._RunDeviceAdbCmd(['forward', '--list'], timeout, retries) - - def JDWP(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """List of PIDs of processes hosting a JDWP transport. - - Args: - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - - Returns: - A list of PIDs as strings. - """ - return [a.strip() for a in - self._RunDeviceAdbCmd(['jdwp'], timeout, retries).split('\n')] - - def Install(self, apk_path, forward_lock=False, allow_downgrade=False, - reinstall=False, sd_card=False, timeout=60*2, - retries=_DEFAULT_RETRIES): - """Install an apk on the device. - - Args: - apk_path: Host path to the APK file. - forward_lock: (optional) If set forward-locks the app. - allow_downgrade: (optional) If set, allows for downgrades. - reinstall: (optional) If set reinstalls the app, keeping its data. - sd_card: (optional) If set installs on the SD card. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - VerifyLocalFileExists(apk_path) - cmd = ['install'] - if forward_lock: - cmd.append('-l') - if reinstall: - cmd.append('-r') - if sd_card: - cmd.append('-s') - if allow_downgrade: - cmd.append('-d') - cmd.append(apk_path) - output = self._RunDeviceAdbCmd(cmd, timeout, retries) - if 'Success' not in output: - raise device_errors.AdbCommandFailedError( - cmd, output, device_serial=self._device_serial) - - def InstallMultiple(self, apk_paths, forward_lock=False, reinstall=False, - sd_card=False, allow_downgrade=False, partial=False, - timeout=60*2, retries=_DEFAULT_RETRIES): - """Install an apk with splits on the device. - - Args: - apk_paths: Host path to the APK file. - forward_lock: (optional) If set forward-locks the app. - reinstall: (optional) If set reinstalls the app, keeping its data. - sd_card: (optional) If set installs on the SD card. - allow_downgrade: (optional) Allow versionCode downgrade. - partial: (optional) Package ID if apk_paths doesn't include all .apks. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - for path in apk_paths: - VerifyLocalFileExists(path) - cmd = ['install-multiple'] - if forward_lock: - cmd.append('-l') - if reinstall: - cmd.append('-r') - if sd_card: - cmd.append('-s') - if allow_downgrade: - cmd.append('-d') - if partial: - cmd.extend(('-p', partial)) - cmd.extend(apk_paths) - output = self._RunDeviceAdbCmd(cmd, timeout, retries) - if 'Success' not in output: - raise device_errors.AdbCommandFailedError( - cmd, output, device_serial=self._device_serial) - - def Uninstall(self, package, keep_data=False, timeout=_DEFAULT_TIMEOUT, - retries=_DEFAULT_RETRIES): - """Remove the app |package| from the device. - - Args: - package: The package to uninstall. - keep_data: (optional) If set keep the data and cache directories. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - cmd = ['uninstall'] - if keep_data: - cmd.append('-k') - cmd.append(package) - output = self._RunDeviceAdbCmd(cmd, timeout, retries) - if 'Failure' in output: - raise device_errors.AdbCommandFailedError( - cmd, output, device_serial=self._device_serial) - - def Backup(self, path, packages=None, apk=False, shared=False, - nosystem=True, include_all=False, timeout=_DEFAULT_TIMEOUT, - retries=_DEFAULT_RETRIES): - """Write an archive of the device's data to |path|. - - Args: - path: Local path to store the backup file. - packages: List of to packages to be backed up. - apk: (optional) If set include the .apk files in the archive. - shared: (optional) If set buckup the device's SD card. - nosystem: (optional) If set exclude system applications. - include_all: (optional) If set back up all installed applications and - |packages| is optional. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - cmd = ['backup', '-f', path] - if apk: - cmd.append('-apk') - if shared: - cmd.append('-shared') - if nosystem: - cmd.append('-nosystem') - if include_all: - cmd.append('-all') - if packages: - cmd.extend(packages) - assert bool(packages) ^ bool(include_all), ( - 'Provide \'packages\' or set \'include_all\' but not both.') - ret = self._RunDeviceAdbCmd(cmd, timeout, retries) - VerifyLocalFileExists(path) - return ret - - def Restore(self, path, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """Restore device contents from the backup archive. - - Args: - path: Host path to the backup archive. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - VerifyLocalFileExists(path) - self._RunDeviceAdbCmd(['restore'] + [path], timeout, retries) - - def WaitForDevice(self, timeout=60*5, retries=_DEFAULT_RETRIES): - """Block until the device is online. - - Args: - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - self._RunDeviceAdbCmd(['wait-for-device'], timeout, retries) - - def GetState(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """Get device state. - - Args: - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - - Returns: - One of 'offline', 'bootloader', or 'device'. - """ - # TODO(jbudorick): Revert to using get-state once it doesn't cause a - # a protocol fault. - # return self._RunDeviceAdbCmd(['get-state'], timeout, retries).strip() - - lines = self._RawDevices(timeout=timeout, retries=retries) - for line in lines: - if len(line) >= 2 and line[0] == self._device_serial: - return line[1] - return 'offline' - - - def GetDevPath(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """Gets the device path. - - Args: - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - - Returns: - The device path (e.g. usb:3-4) - """ - return self._RunDeviceAdbCmd(['get-devpath'], timeout, retries) - - def Remount(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """Remounts the /system partition on the device read-write.""" - self._RunDeviceAdbCmd(['remount'], timeout, retries) - - def Reboot(self, to_bootloader=False, timeout=60*5, - retries=_DEFAULT_RETRIES): - """Reboots the device. - - Args: - to_bootloader: (optional) If set reboots to the bootloader. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - if to_bootloader: - cmd = ['reboot-bootloader'] - else: - cmd = ['reboot'] - self._RunDeviceAdbCmd(cmd, timeout, retries) - - def Root(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): - """Restarts the adbd daemon with root permissions, if possible. - - Args: - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - """ - output = self._RunDeviceAdbCmd(['root'], timeout, retries) - if 'cannot' in output: - raise device_errors.AdbCommandFailedError( - ['root'], output, device_serial=self._device_serial) - - def Emu(self, cmd, timeout=_DEFAULT_TIMEOUT, - retries=_DEFAULT_RETRIES): - """Runs an emulator console command. - - See http://developer.android.com/tools/devices/emulator.html#console - - Args: - cmd: The command to run on the emulator console. - timeout: (optional) Timeout per try in seconds. - retries: (optional) Number of retries to attempt. - - Returns: - The output of the emulator console command. - """ - if isinstance(cmd, basestring): - cmd = [cmd] - return self._RunDeviceAdbCmd(['emu'] + cmd, timeout, retries) - - @property - def is_emulator(self): - return _EMULATOR_RE.match(self._device_serial) - - @property - def is_ready(self): - try: - return self.GetState() == _READY_STATE - except device_errors.CommandFailedError: - return False
diff --git a/build/android/devil/android/sdk/adb_wrapper_test.py b/build/android/devil/android/sdk/adb_wrapper_test.py deleted file mode 100644 index 7c098a905..0000000 --- a/build/android/devil/android/sdk/adb_wrapper_test.py +++ /dev/null
@@ -1,96 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests for the AdbWrapper class.""" - -import os -import tempfile -import time -import unittest - -from devil.android import device_errors -from devil.android.sdk import adb_wrapper - - -class TestAdbWrapper(unittest.TestCase): - - def setUp(self): - devices = adb_wrapper.AdbWrapper.Devices() - assert devices, 'A device must be attached' - self._adb = devices[0] - self._adb.WaitForDevice() - - @staticmethod - def _MakeTempFile(contents): - """Make a temporary file with the given contents. - - Args: - contents: string to write to the temporary file. - - Returns: - The absolute path to the file. - """ - fi, path = tempfile.mkstemp() - with os.fdopen(fi, 'wb') as f: - f.write(contents) - return path - - def testShell(self): - output = self._adb.Shell('echo test', expect_status=0) - self.assertEqual(output.strip(), 'test') - output = self._adb.Shell('echo test') - self.assertEqual(output.strip(), 'test') - with self.assertRaises(device_errors.AdbCommandFailedError): - self._adb.Shell('echo test', expect_status=1) - - def testPushLsPull(self): - path = self._MakeTempFile('foo') - device_path = '/data/local/tmp/testfile.txt' - local_tmpdir = os.path.dirname(path) - self._adb.Push(path, device_path) - files = dict(self._adb.Ls('/data/local/tmp')) - self.assertTrue('testfile.txt' in files) - self.assertEquals(3, files['testfile.txt'].st_size) - self.assertEqual(self._adb.Shell('cat %s' % device_path), 'foo') - self._adb.Pull(device_path, local_tmpdir) - with open(os.path.join(local_tmpdir, 'testfile.txt'), 'r') as f: - self.assertEqual(f.read(), 'foo') - - def testInstall(self): - path = self._MakeTempFile('foo') - with self.assertRaises(device_errors.AdbCommandFailedError): - self._adb.Install(path) - - def testForward(self): - with self.assertRaises(device_errors.AdbCommandFailedError): - self._adb.Forward(0, 0) - - def testUninstall(self): - with self.assertRaises(device_errors.AdbCommandFailedError): - self._adb.Uninstall('some.nonexistant.package') - - def testRebootWaitForDevice(self): - self._adb.Reboot() - print 'waiting for device to reboot...' - while self._adb.GetState() == 'device': - time.sleep(1) - self._adb.WaitForDevice() - self.assertEqual(self._adb.GetState(), 'device') - print 'waiting for package manager...' - while 'package:' not in self._adb.Shell('pm path android'): - time.sleep(1) - - def testRootRemount(self): - self._adb.Root() - while True: - try: - self._adb.Shell('start') - break - except device_errors.AdbCommandFailedError: - time.sleep(1) - self._adb.Remount() - - -if __name__ == '__main__': - unittest.main()
diff --git a/build/android/devil/android/sdk/build_tools.py b/build/android/devil/android/sdk/build_tools.py deleted file mode 100644 index 36aafce..0000000 --- a/build/android/devil/android/sdk/build_tools.py +++ /dev/null
@@ -1,51 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import os - -from devil import devil_env -from devil.utils import lazy - -with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH): - import dependency_manager # pylint: disable=import-error - - -def GetPath(build_tool): - try: - return devil_env.config.LocalPath(build_tool) - except dependency_manager.NoPathFoundError: - pass - - try: - return _PathInLocalSdk(build_tool) - except dependency_manager.NoPathFoundError: - pass - - return devil_env.config.FetchPath(build_tool) - - -def _PathInLocalSdk(build_tool): - build_tools_path = _build_tools_path.read() - return (os.path.join(build_tools_path, build_tool) if build_tools_path - else None) - - -def _FindBuildTools(): - android_sdk_path = devil_env.config.LocalPath('android_sdk') - if not android_sdk_path: - return None - - build_tools_contents = os.listdir( - os.path.join(android_sdk_path, 'build-tools')) - - if not build_tools_contents: - return None - else: - if len(build_tools_contents) > 1: - build_tools_contents.sort() - return os.path.join(android_sdk_path, 'build-tools', - build_tools_contents[-1]) - - -_build_tools_path = lazy.WeakConstant(_FindBuildTools)
diff --git a/build/android/devil/android/sdk/dexdump.py b/build/android/devil/android/sdk/dexdump.py deleted file mode 100644 index 992366e8..0000000 --- a/build/android/devil/android/sdk/dexdump.py +++ /dev/null
@@ -1,31 +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. - -from devil.android.sdk import build_tools -from devil.utils import cmd_helper -from devil.utils import lazy - - -_dexdump_path = lazy.WeakConstant(lambda: build_tools.GetPath('dexdump')) - - -def DexDump(dexfiles, file_summary=False): - """A wrapper around the Android SDK's dexdump tool. - - Args: - dexfiles: The dexfile or list of dex files to dump. - file_summary: Display summary information from the file header. (-f) - - Returns: - An iterable over the output lines. - """ - # TODO(jbudorick): Add support for more options as necessary. - if isinstance(dexfiles, basestring): - dexfiles = [dexfiles] - args = [_dexdump_path.read()] + dexfiles - if file_summary: - args.append('-f') - - return cmd_helper.IterCmdOutputLines(args) -
diff --git a/build/android/devil/android/sdk/fastboot.py b/build/android/devil/android/sdk/fastboot.py deleted file mode 100644 index aebff203..0000000 --- a/build/android/devil/android/sdk/fastboot.py +++ /dev/null
@@ -1,100 +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. - -"""This module wraps Android's fastboot tool. - -This is a thin wrapper around the fastboot interface. Any additional complexity -should be delegated to a higher level (ex. FastbootUtils). -""" -# pylint: disable=unused-argument - -import os - -from devil import devil_env -from devil.android import decorators -from devil.android import device_errors -from devil.utils import cmd_helper -from devil.utils import lazy - -_DEFAULT_TIMEOUT = 30 -_DEFAULT_RETRIES = 3 -_FLASH_TIMEOUT = _DEFAULT_TIMEOUT * 10 - -class Fastboot(object): - - _fastboot_path = lazy.WeakConstant(lambda: os.path.join( - devil_env.config.LocalPath('android_sdk'), 'platform-tools', 'adb')) - - def __init__(self, device_serial, default_timeout=_DEFAULT_TIMEOUT, - default_retries=_DEFAULT_RETRIES): - """Initializes the FastbootWrapper. - - Args: - device_serial: The device serial number as a string. - """ - if not device_serial: - raise ValueError('A device serial must be specified') - self._device_serial = str(device_serial) - self._default_timeout = default_timeout - self._default_retries = default_retries - - @decorators.WithTimeoutAndRetriesFromInstance() - def _RunFastbootCommand(self, cmd, timeout=None, retries=None): - """Run a command line command using the fastboot android tool. - - Args: - cmd: Command to run. Must be list of args, the first one being the command - - Returns: - output of command. - - Raises: - TypeError: If cmd is not of type list. - """ - if type(cmd) == list: - cmd = [self._fastboot_path.read(), '-s', self._device_serial] + cmd - else: - raise TypeError( - 'Command for _RunFastbootCommand must be a list.') - status, output = cmd_helper.GetCmdStatusAndOutput(cmd) - if int(status) != 0: - raise device_errors.FastbootCommandFailedError( - cmd, output, status, self._device_serial) - return output - - @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0) - def Flash(self, partition, image, timeout=None, retries=None): - """Flash partition with img. - - Args: - partition: Partition to be flashed. - image: location of image to flash with. - """ - self._RunFastbootCommand(['flash', partition, image]) - - @decorators.WithTimeoutAndRetriesFromInstance() - def Devices(self, timeout=None, retries=None): - """Outputs list of devices in fastboot mode.""" - output = self._RunFastbootCommand(['devices']) - return [line.split()[0] for line in output.splitlines()] - - @decorators.WithTimeoutAndRetriesFromInstance() - def RebootBootloader(self, timeout=None, retries=None): - """Reboot from fastboot, into fastboot.""" - self._RunFastbootCommand(['reboot-bootloader']) - - @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0) - def Reboot(self, timeout=None, retries=None): - """Reboot from fastboot to normal usage""" - self._RunFastbootCommand(['reboot']) - - @decorators.WithTimeoutAndRetriesFromInstance() - def SetOemOffModeCharge(self, value, timeout=None, retries=None): - """Sets off mode charging - - Args: - value: boolean value to set off-mode-charging on or off. - """ - self._RunFastbootCommand( - ['oem', 'off-mode-charge', str(int(value))])
diff --git a/build/android/devil/android/sdk/gce_adb_wrapper.py b/build/android/devil/android/sdk/gce_adb_wrapper.py deleted file mode 100644 index 60ec364..0000000 --- a/build/android/devil/android/sdk/gce_adb_wrapper.py +++ /dev/null
@@ -1,145 +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. - -"""Provides a work around for various adb commands on android gce instances. - -Some adb commands don't work well when the device is a cloud vm, namely -'push' and 'pull'. With gce instances, moving files through adb can be -painfully slow and hit timeouts, so the methods here just use scp instead. -""" -# pylint: disable=unused-argument - -import logging -import os -import subprocess - -from devil.android import device_errors -from devil.android.sdk import adb_wrapper -from devil.utils import cmd_helper - - -# SSH key file for accessing the instances. The keys are created at -# startup and removed & revoked at teardown. -_SSH_KEY_FILE = '/tmp/ssh_android_gce_instance' - - -class GceAdbWrapper(adb_wrapper.AdbWrapper): - def __init__(self, device_serial): - super(GceAdbWrapper, self).__init__(device_serial) - self._instance_ip = self.Shell('getprop net.gce.ip_address').strip() - - #override - def Push(self, local, remote, **kwargs): - """Pushes an object from the host to the gce instance. - - Args: - local: Path on the host filesystem. - remote: Path on the instance filesystem. - """ - adb_wrapper.VerifyLocalFileExists(_SSH_KEY_FILE) - adb_wrapper.VerifyLocalFileExists(local) - if os.path.isdir(local): - self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(remote)) - - # When the object to be pushed is a directory, adb merges the source dir - # with the destination dir. So if local is a dir, just scp its contents. - for f in os.listdir(local): - self._PushObject(os.path.join(local, f), os.path.join(remote, f)) - self.Shell('chmod 777 %s' % - cmd_helper.SingleQuote(os.path.join(remote, f))) - else: - parent_dir = remote[0:remote.rfind('/')] - if parent_dir: - self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(parent_dir)) - self._PushObject(local, remote) - self.Shell('chmod 777 %s' % cmd_helper.SingleQuote(remote)) - - def _PushObject(self, local, remote): - """Copies an object from the host to the gce instance using scp. - - Args: - local: Path on the host filesystem. - remote: Path on the instance filesystem. - """ - cmd = [ - 'scp', - '-r', - '-i', _SSH_KEY_FILE, - '-o', 'UserKnownHostsFile=/dev/null', - '-o', 'StrictHostKeyChecking=no', - local, - 'root@%s:%s' % (self._instance_ip, remote) - ] - status, _ = cmd_helper.GetCmdStatusAndOutput(cmd) - if status: - raise device_errors.AdbCommandFailedError( - cmd, 'File not reachable on host: %s' % local, - device_serial=str(self)) - - #override - def Pull(self, remote, local, **kwargs): - """Pulls a file from the gce instance to the host. - - Args: - remote: Path on the instance filesystem. - local: Path on the host filesystem. - """ - adb_wrapper.VerifyLocalFileExists(_SSH_KEY_FILE) - cmd = [ - 'scp', - '-p', - '-r', - '-i', _SSH_KEY_FILE, - '-o', 'UserKnownHostsFile=/dev/null', - '-o', 'StrictHostKeyChecking=no', - 'root@%s:%s' % (self._instance_ip, remote), - local, - ] - status, _ = cmd_helper.GetCmdStatusAndOutput(cmd) - if status: - raise device_errors.AdbCommandFailedError( - cmd, 'File not reachable on host: %s' % local, - device_serial=str(self)) - - try: - adb_wrapper.VerifyLocalFileExists(local) - except (subprocess.CalledProcessError, IOError): - logging.exception('Error when pulling files from android instance.') - raise device_errors.AdbCommandFailedError( - cmd, 'File not reachable on host: %s' % local, - device_serial=str(self)) - - #override - def Install(self, apk_path, forward_lock=False, reinstall=False, - sd_card=False, **kwargs): - """Installs an apk on the gce instance - - Args: - apk_path: Host path to the APK file. - forward_lock: (optional) If set forward-locks the app. - reinstall: (optional) If set reinstalls the app, keeping its data. - sd_card: (optional) If set installs on the SD card. - """ - adb_wrapper.VerifyLocalFileExists(_SSH_KEY_FILE) - adb_wrapper.VerifyLocalFileExists(apk_path) - cmd = ['install'] - if forward_lock: - cmd.append('-l') - if reinstall: - cmd.append('-r') - if sd_card: - cmd.append('-s') - self.Push(apk_path, '/data/local/tmp/tmp.apk') - cmd = ['pm'] + cmd - cmd.append('/data/local/tmp/tmp.apk') - output = self.Shell(' '.join(cmd)) - self.Shell('rm /data/local/tmp/tmp.apk') - if 'Success' not in output: - raise device_errors.AdbCommandFailedError( - cmd, output, device_serial=self._device_serial) - - #override - @property - def is_emulator(self): - return True
diff --git a/build/android/devil/android/sdk/intent.py b/build/android/devil/android/sdk/intent.py deleted file mode 100644 index 333b9f1..0000000 --- a/build/android/devil/android/sdk/intent.py +++ /dev/null
@@ -1,113 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Manages intents and associated information. - -This is generally intended to be used with functions that calls Android's -Am command. -""" - -class Intent(object): - - def __init__(self, action='android.intent.action.VIEW', activity=None, - category=None, component=None, data=None, extras=None, - flags=None, package=None): - """Creates an Intent. - - Args: - action: A string containing the action. - activity: A string that, with |package|, can be used to specify the - component. - category: A string or list containing any categories. - component: A string that specifies the component to send the intent to. - data: A string containing a data URI. - extras: A dict containing extra parameters to be passed along with the - intent. - flags: A string containing flags to pass. - package: A string that, with activity, can be used to specify the - component. - """ - self._action = action - self._activity = activity - if isinstance(category, list) or category is None: - self._category = category - else: - self._category = [category] - self._component = component - self._data = data - self._extras = extras - self._flags = flags - self._package = package - - if self._component and '/' in component: - self._package, self._activity = component.split('/', 1) - elif self._package and self._activity: - self._component = '%s/%s' % (package, activity) - - @property - def action(self): - return self._action - - @property - def activity(self): - return self._activity - - @property - def category(self): - return self._category - - @property - def component(self): - return self._component - - @property - def data(self): - return self._data - - @property - def extras(self): - return self._extras - - @property - def flags(self): - return self._flags - - @property - def package(self): - return self._package - - @property - def am_args(self): - """Returns the intent as a list of arguments for the activity manager. - - For details refer to the specification at: - - http://developer.android.com/tools/help/adb.html#IntentSpec - """ - args = [] - if self.action: - args.extend(['-a', self.action]) - if self.data: - args.extend(['-d', self.data]) - if self.category: - args.extend(arg for cat in self.category for arg in ('-c', cat)) - if self.component: - args.extend(['-n', self.component]) - if self.flags: - args.extend(['-f', self.flags]) - if self.extras: - for key, value in self.extras.iteritems(): - if value is None: - args.extend(['--esn', key]) - elif isinstance(value, str): - args.extend(['--es', key, value]) - elif isinstance(value, bool): - args.extend(['--ez', key, str(value)]) - elif isinstance(value, int): - args.extend(['--ei', key, str(value)]) - elif isinstance(value, float): - args.extend(['--ef', key, str(value)]) - else: - raise NotImplementedError( - 'Intent does not know how to pass %s extras' % type(value)) - return args
diff --git a/build/android/devil/android/sdk/keyevent.py b/build/android/devil/android/sdk/keyevent.py deleted file mode 100644 index 06736b3d..0000000 --- a/build/android/devil/android/sdk/keyevent.py +++ /dev/null
@@ -1,14 +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. - -"""Android KeyEvent constants. - -http://developer.android.com/reference/android/view/KeyEvent.html -""" - -KEYCODE_BACK = 4 -KEYCODE_DPAD_RIGHT = 22 -KEYCODE_ENTER = 66 -KEYCODE_MENU = 82 -
diff --git a/build/android/devil/android/sdk/shared_prefs.py b/build/android/devil/android/sdk/shared_prefs.py deleted file mode 100644 index 2b430d5..0000000 --- a/build/android/devil/android/sdk/shared_prefs.py +++ /dev/null
@@ -1,390 +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. - -"""Helper object to read and modify Shared Preferences from Android apps. - -See e.g.: - http://developer.android.com/reference/android/content/SharedPreferences.html -""" - -import logging -import posixpath - -from xml.etree import ElementTree - - -_XML_DECLARATION = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" - - -class BasePref(object): - """Base class for getting/setting the value of a specific preference type. - - Should not be instantiated directly. The SharedPrefs collection will - instantiate the appropriate subclasses, which directly manipulate the - underlying xml document, to parse and serialize values according to their - type. - - Args: - elem: An xml ElementTree object holding the preference data. - - Properties: - tag_name: A string with the tag that must be used for this preference type. - """ - tag_name = None - - def __init__(self, elem): - if elem.tag != type(self).tag_name: - raise TypeError('Property %r has type %r, but trying to access as %r' % - (elem.get('name'), elem.tag, type(self).tag_name)) - self._elem = elem - - def __str__(self): - """Get the underlying xml element as a string.""" - return ElementTree.tostring(self._elem) - - def get(self): - """Get the value of this preference.""" - return self._elem.get('value') - - def set(self, value): - """Set from a value casted as a string.""" - self._elem.set('value', str(value)) - - @property - def has_value(self): - """Check whether the element has a value.""" - return self._elem.get('value') is not None - - -class BooleanPref(BasePref): - """Class for getting/setting a preference with a boolean value. - - The underlying xml element has the form, e.g.: - <boolean name="featureEnabled" value="false" /> - """ - tag_name = 'boolean' - VALUES = {'true': True, 'false': False} - - def get(self): - """Get the value as a Python bool.""" - return type(self).VALUES[super(BooleanPref, self).get()] - - def set(self, value): - """Set from a value casted as a bool.""" - super(BooleanPref, self).set('true' if value else 'false') - - -class FloatPref(BasePref): - """Class for getting/setting a preference with a float value. - - The underlying xml element has the form, e.g.: - <float name="someMetric" value="4.7" /> - """ - tag_name = 'float' - - def get(self): - """Get the value as a Python float.""" - return float(super(FloatPref, self).get()) - - -class IntPref(BasePref): - """Class for getting/setting a preference with an int value. - - The underlying xml element has the form, e.g.: - <int name="aCounter" value="1234" /> - """ - tag_name = 'int' - - def get(self): - """Get the value as a Python int.""" - return int(super(IntPref, self).get()) - - -class LongPref(IntPref): - """Class for getting/setting a preference with a long value. - - The underlying xml element has the form, e.g.: - <long name="aLongCounter" value="1234" /> - - We use the same implementation from IntPref. - """ - tag_name = 'long' - - -class StringPref(BasePref): - """Class for getting/setting a preference with a string value. - - The underlying xml element has the form, e.g.: - <string name="someHashValue">249b3e5af13d4db2</string> - """ - tag_name = 'string' - - def get(self): - """Get the value as a Python string.""" - return self._elem.text - - def set(self, value): - """Set from a value casted as a string.""" - self._elem.text = str(value) - - -class StringSetPref(StringPref): - """Class for getting/setting a preference with a set of string values. - - The underlying xml element has the form, e.g.: - <set name="managed_apps"> - <string>com.mine.app1</string> - <string>com.mine.app2</string> - <string>com.mine.app3</string> - </set> - """ - tag_name = 'set' - - def get(self): - """Get a list with the string values contained.""" - value = [] - for child in self._elem: - assert child.tag == 'string' - value.append(child.text) - return value - - def set(self, value): - """Set from a sequence of values, each casted as a string.""" - for child in list(self._elem): - self._elem.remove(child) - for item in value: - ElementTree.SubElement(self._elem, 'string').text = str(item) - - -_PREF_TYPES = {c.tag_name: c for c in [BooleanPref, FloatPref, IntPref, - LongPref, StringPref, StringSetPref]} - - -class SharedPrefs(object): - def __init__(self, device, package, filename): - """Helper object to read and update "Shared Prefs" of Android apps. - - Such files typically look like, e.g.: - - <?xml version='1.0' encoding='utf-8' standalone='yes' ?> - <map> - <int name="databaseVersion" value="107" /> - <boolean name="featureEnabled" value="false" /> - <string name="someHashValue">249b3e5af13d4db2</string> - </map> - - Example usage: - - prefs = shared_prefs.SharedPrefs(device, 'com.my.app', 'my_prefs.xml') - prefs.Load() - prefs.GetString('someHashValue') # => '249b3e5af13d4db2' - prefs.SetInt('databaseVersion', 42) - prefs.Remove('featureEnabled') - prefs.Commit() - - The object may also be used as a context manager to automatically load and - commit, respectively, upon entering and leaving the context. - - Args: - device: A DeviceUtils object. - package: A string with the package name of the app that owns the shared - preferences file. - filename: A string with the name of the preferences file to read/write. - """ - self._device = device - self._xml = None - self._package = package - self._filename = filename - self._path = '/data/data/%s/shared_prefs/%s' % (package, filename) - self._changed = False - - def __repr__(self): - """Get a useful printable representation of the object.""" - return '<{cls} file {filename} for {package} on {device}>'.format( - cls=type(self).__name__, filename=self.filename, package=self.package, - device=str(self._device)) - - def __str__(self): - """Get the underlying xml document as a string.""" - return _XML_DECLARATION + ElementTree.tostring(self.xml) - - @property - def package(self): - """Get the package name of the app that owns the shared preferences.""" - return self._package - - @property - def filename(self): - """Get the filename of the shared preferences file.""" - return self._filename - - @property - def path(self): - """Get the full path to the shared preferences file on the device.""" - return self._path - - @property - def changed(self): - """True if properties have changed and a commit would be needed.""" - return self._changed - - @property - def xml(self): - """Get the underlying xml document as an ElementTree object.""" - if self._xml is None: - self._xml = ElementTree.Element('map') - return self._xml - - def Load(self): - """Load the shared preferences file from the device. - - A empty xml document, which may be modified and saved on |commit|, is - created if the file does not already exist. - """ - if self._device.FileExists(self.path): - self._xml = ElementTree.fromstring( - self._device.ReadFile(self.path, as_root=True)) - assert self._xml.tag == 'map' - else: - self._xml = None - self._changed = False - - def Clear(self): - """Clear all of the preferences contained in this object.""" - if self._xml is not None and len(self): # only clear if not already empty - self._xml = None - self._changed = True - - def Commit(self): - """Save the current set of preferences to the device. - - Only actually saves if some preferences have been modified. - """ - if not self.changed: - return - self._device.RunShellCommand( - ['mkdir', '-p', posixpath.dirname(self.path)], - as_root=True, check_return=True) - self._device.WriteFile(self.path, str(self), as_root=True) - self._device.KillAll(self.package, exact=True, as_root=True, quiet=True) - self._changed = False - - def __len__(self): - """Get the number of preferences in this collection.""" - return len(self.xml) - - def PropertyType(self, key): - """Get the type (i.e. tag name) of a property in the collection.""" - return self._GetChild(key).tag - - def HasProperty(self, key): - try: - self._GetChild(key) - return True - except KeyError: - return False - - def GetBoolean(self, key): - """Get a boolean property.""" - return BooleanPref(self._GetChild(key)).get() - - def SetBoolean(self, key, value): - """Set a boolean property.""" - self._SetPrefValue(key, value, BooleanPref) - - def GetFloat(self, key): - """Get a float property.""" - return FloatPref(self._GetChild(key)).get() - - def SetFloat(self, key, value): - """Set a float property.""" - self._SetPrefValue(key, value, FloatPref) - - def GetInt(self, key): - """Get an int property.""" - return IntPref(self._GetChild(key)).get() - - def SetInt(self, key, value): - """Set an int property.""" - self._SetPrefValue(key, value, IntPref) - - def GetLong(self, key): - """Get a long property.""" - return LongPref(self._GetChild(key)).get() - - def SetLong(self, key, value): - """Set a long property.""" - self._SetPrefValue(key, value, LongPref) - - def GetString(self, key): - """Get a string property.""" - return StringPref(self._GetChild(key)).get() - - def SetString(self, key, value): - """Set a string property.""" - self._SetPrefValue(key, value, StringPref) - - def GetStringSet(self, key): - """Get a string set property.""" - return StringSetPref(self._GetChild(key)).get() - - def SetStringSet(self, key, value): - """Set a string set property.""" - self._SetPrefValue(key, value, StringSetPref) - - def Remove(self, key): - """Remove a preference from the collection.""" - self.xml.remove(self._GetChild(key)) - - def AsDict(self): - """Return the properties and their values as a dictionary.""" - d = {} - for child in self.xml: - pref = _PREF_TYPES[child.tag](child) - d[child.get('name')] = pref.get() - return d - - def __enter__(self): - """Load preferences file from the device when entering a context.""" - self.Load() - return self - - def __exit__(self, exc_type, _exc_value, _traceback): - """Save preferences file to the device when leaving a context.""" - if not exc_type: - self.Commit() - - def _GetChild(self, key): - """Get the underlying xml node that holds the property of a given key. - - Raises: - KeyError when the key is not found in the collection. - """ - for child in self.xml: - if child.get('name') == key: - return child - raise KeyError(key) - - def _SetPrefValue(self, key, value, pref_cls): - """Set the value of a property. - - Args: - key: The key of the property to set. - value: The new value of the property. - pref_cls: A subclass of BasePref used to access the property. - - Raises: - TypeError when the key already exists but with a different type. - """ - try: - pref = pref_cls(self._GetChild(key)) - old_value = pref.get() - except KeyError: - pref = pref_cls(ElementTree.SubElement( - self.xml, pref_cls.tag_name, {'name': key})) - old_value = None - if old_value != value: - pref.set(value) - self._changed = True - logging.info('Setting property: %s', pref)
diff --git a/build/android/devil/android/sdk/shared_prefs_test.py b/build/android/devil/android/sdk/shared_prefs_test.py deleted file mode 100755 index 15a348ae..0000000 --- a/build/android/devil/android/sdk/shared_prefs_test.py +++ /dev/null
@@ -1,166 +0,0 @@ -#!/usr/bin/env python -# 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. - -""" -Unit tests for the contents of shared_prefs.py (mostly SharedPrefs). -""" - -import logging -import unittest - -from devil import devil_env -from devil.android import device_utils -from devil.android.sdk import shared_prefs - -with devil_env.SysPath(devil_env.config.LocalPath('pymock')): - import mock # pylint: disable=import-error - - -def MockDeviceWithFiles(files=None): - if files is None: - files = {} - - def file_exists(path): - return path in files - - def write_file(path, contents, **_kwargs): - files[path] = contents - - def read_file(path, **_kwargs): - return files[path] - - device = mock.MagicMock(spec=device_utils.DeviceUtils) - device.FileExists = mock.Mock(side_effect=file_exists) - device.WriteFile = mock.Mock(side_effect=write_file) - device.ReadFile = mock.Mock(side_effect=read_file) - return device - - -class SharedPrefsTest(unittest.TestCase): - - def setUp(self): - self.device = MockDeviceWithFiles({ - '/data/data/com.some.package/shared_prefs/prefs.xml': - "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" - '<map>\n' - ' <int name="databaseVersion" value="107" />\n' - ' <boolean name="featureEnabled" value="false" />\n' - ' <string name="someHashValue">249b3e5af13d4db2</string>\n' - '</map>'}) - self.expected_data = {'databaseVersion': 107, - 'featureEnabled': False, - 'someHashValue': '249b3e5af13d4db2'} - - def testPropertyLifetime(self): - prefs = shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') - self.assertEquals(len(prefs), 0) # collection is empty before loading - prefs.SetInt('myValue', 444) - self.assertEquals(len(prefs), 1) - self.assertEquals(prefs.GetInt('myValue'), 444) - self.assertTrue(prefs.HasProperty('myValue')) - prefs.Remove('myValue') - self.assertEquals(len(prefs), 0) - self.assertFalse(prefs.HasProperty('myValue')) - with self.assertRaises(KeyError): - prefs.GetInt('myValue') - - def testPropertyType(self): - prefs = shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') - prefs.SetInt('myValue', 444) - self.assertEquals(prefs.PropertyType('myValue'), 'int') - with self.assertRaises(TypeError): - prefs.GetString('myValue') - with self.assertRaises(TypeError): - prefs.SetString('myValue', 'hello') - - def testLoad(self): - prefs = shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') - self.assertEquals(len(prefs), 0) # collection is empty before loading - prefs.Load() - self.assertEquals(len(prefs), len(self.expected_data)) - self.assertEquals(prefs.AsDict(), self.expected_data) - self.assertFalse(prefs.changed) - - def testClear(self): - prefs = shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') - prefs.Load() - self.assertEquals(prefs.AsDict(), self.expected_data) - self.assertFalse(prefs.changed) - prefs.Clear() - self.assertEquals(len(prefs), 0) # collection is empty now - self.assertTrue(prefs.changed) - - def testCommit(self): - prefs = shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'other_prefs.xml') - self.assertFalse(self.device.FileExists(prefs.path)) # file does not exist - prefs.Load() - self.assertEquals(len(prefs), 0) # file did not exist, collection is empty - prefs.SetInt('magicNumber', 42) - prefs.SetFloat('myMetric', 3.14) - prefs.SetLong('bigNumner', 6000000000) - prefs.SetStringSet('apps', ['gmail', 'chrome', 'music']) - self.assertFalse(self.device.FileExists(prefs.path)) # still does not exist - self.assertTrue(prefs.changed) - prefs.Commit() - self.assertTrue(self.device.FileExists(prefs.path)) # should exist now - self.device.KillAll.assert_called_once_with(prefs.package, exact=True, - as_root=True, quiet=True) - self.assertFalse(prefs.changed) - - prefs = shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'other_prefs.xml') - self.assertEquals(len(prefs), 0) # collection is empty before loading - prefs.Load() - self.assertEquals(prefs.AsDict(), { - 'magicNumber': 42, - 'myMetric': 3.14, - 'bigNumner': 6000000000, - 'apps': ['gmail', 'chrome', 'music']}) # data survived roundtrip - - def testAsContextManager_onlyReads(self): - with shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') as prefs: - self.assertEquals(prefs.AsDict(), self.expected_data) # loaded and ready - self.assertEquals(self.device.WriteFile.call_args_list, []) # did not write - - def testAsContextManager_readAndWrite(self): - with shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') as prefs: - prefs.SetBoolean('featureEnabled', True) - prefs.Remove('someHashValue') - prefs.SetString('newString', 'hello') - - self.assertTrue(self.device.WriteFile.called) # did write - with shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') as prefs: - # changes persisted - self.assertTrue(prefs.GetBoolean('featureEnabled')) - self.assertFalse(prefs.HasProperty('someHashValue')) - self.assertEquals(prefs.GetString('newString'), 'hello') - self.assertTrue(prefs.HasProperty('databaseVersion')) # still there - - def testAsContextManager_commitAborted(self): - with self.assertRaises(TypeError): - with shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') as prefs: - prefs.SetBoolean('featureEnabled', True) - prefs.Remove('someHashValue') - prefs.SetString('newString', 'hello') - prefs.SetInt('newString', 123) # oops! - - self.assertEquals(self.device.WriteFile.call_args_list, []) # did not write - with shared_prefs.SharedPrefs( - self.device, 'com.some.package', 'prefs.xml') as prefs: - # contents were not modified - self.assertEquals(prefs.AsDict(), self.expected_data) - -if __name__ == '__main__': - logging.getLogger().setLevel(logging.DEBUG) - unittest.main(verbosity=2)
diff --git a/build/android/devil/android/sdk/split_select.py b/build/android/devil/android/sdk/split_select.py deleted file mode 100644 index b47a21f..0000000 --- a/build/android/devil/android/sdk/split_select.py +++ /dev/null
@@ -1,61 +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. - -"""This module wraps Android's split-select tool.""" - -from devil.android.sdk import build_tools -from devil.utils import cmd_helper -from devil.utils import lazy - - -_split_select_path = lazy.WeakConstant( - lambda: build_tools.GetPath('split-select')) - - -def _RunSplitSelectCmd(args): - """Runs a split-select command. - - Args: - args: A list of arguments for split-select. - - Returns: - The output of the command. - """ - cmd = [_split_select_path.read()] + args - status, output = cmd_helper.GetCmdStatusAndOutput(cmd) - if status != 0: - raise Exception('Failed running command "%s" with output "%s".' % - (' '.join(cmd), output)) - return output - -def _SplitConfig(device, allow_cached_props=False): - """Returns a config specifying which APK splits are required by the device. - - Args: - device: A DeviceUtils object. - allow_cached_props: Whether to use cached values for device properties. - """ - return ('%s-r%s-%s:%s' % - (device.GetLanguage(cache=allow_cached_props), - device.GetCountry(cache=allow_cached_props), - device.screen_density, - device.product_cpu_abi)) - -def SelectSplits(device, base_apk, split_apks, allow_cached_props=False): - """Determines which APK splits the device requires. - - Args: - device: A DeviceUtils object. - base_apk: The path of the base APK. - split_apks: A list of paths of APK splits. - allow_cached_props: Whether to use cached values for device properties. - - Returns: - The list of APK splits that the device requires. - """ - config = _SplitConfig(device, allow_cached_props=allow_cached_props) - args = ['--target', config, '--base', base_apk] - for split in split_apks: - args.extend(['--split', split]) - return _RunSplitSelectCmd(args).splitlines()
diff --git a/build/android/devil/android/sdk/version_codes.py b/build/android/devil/android/sdk/version_codes.py deleted file mode 100644 index 410379b9..0000000 --- a/build/android/devil/android/sdk/version_codes.py +++ /dev/null
@@ -1,18 +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. - -"""Android SDK version codes. - -http://developer.android.com/reference/android/os/Build.VERSION_CODES.html -""" - -JELLY_BEAN = 16 -JELLY_BEAN_MR1 = 17 -JELLY_BEAN_MR2 = 18 -KITKAT = 19 -KITKAT_WATCH = 20 -LOLLIPOP = 21 -LOLLIPOP_MR1 = 22 -MARSHMALLOW = 23 -
diff --git a/build/android/devil/android/tools/__init__.py b/build/android/devil/android/tools/__init__.py deleted file mode 100644 index 50b23df..0000000 --- a/build/android/devil/android/tools/__init__.py +++ /dev/null
@@ -1,3 +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.
diff --git a/build/android/devil/android/tools/adb_run_shell_cmd.py b/build/android/devil/android/tools/adb_run_shell_cmd.py deleted file mode 100755 index 2f00b070..0000000 --- a/build/android/devil/android/tools/adb_run_shell_cmd.py +++ /dev/null
@@ -1,70 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import argparse -import json -import logging -import sys - -from devil.android import device_blacklist -from devil.android import device_errors -from devil.android import device_utils -from devil.utils import run_tests_helper - - -def main(): - parser = argparse.ArgumentParser( - 'Run an adb shell command on selected devices') - parser.add_argument('cmd', help='Adb shell command to run.', nargs="+") - parser.add_argument('-d', '--device', action='append', dest='devices', - help='Device to run cmd on. Runs on all devices if not ' - 'specified. Set multiple times for multiple devices') - parser.add_argument('-v', '--verbose', default=0, action='count', - help='Verbose level (multiple times for more)') - parser.add_argument('--blacklist-file', help='Device blacklist file.') - parser.add_argument('--as-root', action='store_true', help='Run as root.') - parser.add_argument('--json-output', - help='File to dump json output to.') - args = parser.parse_args() - run_tests_helper.SetLogLevel(args.verbose) - - args.blacklist_file = device_blacklist.Blacklist( - args.blacklist_file) if args.blacklist_file else None - attached_devices = device_utils.DeviceUtils.HealthyDevices( - blacklist=args.blacklist_file) - - if args.devices: - selected_devices = [] - attached_devices = {str(d): d for d in attached_devices} - for serial in args.devices: - if serial in attached_devices: - selected_devices.append(attached_devices[serial]) - else: - logging.warning('Specified device %s not found.', serial) - else: - selected_devices = attached_devices - - if not selected_devices: - raise device_errors.NoDevicesError - - p_out = (device_utils.DeviceUtils.parallel(selected_devices).RunShellCommand( - args.cmd, large_output=True, as_root=args.as_root, check_return=True) - .pGet(None)) - - data = {} - for device, output in zip(selected_devices, p_out): - for line in output: - print '%s: %s' %(device, line) - data[str(device)] = output - - if args.json_output: - with open(args.json_output, 'w') as f: - json.dump(data, f) - - return 0 - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/build/android/devil/android/tools/flash_device.py b/build/android/devil/android/tools/flash_device.py deleted file mode 100755 index 75dce2b..0000000 --- a/build/android/devil/android/tools/flash_device.py +++ /dev/null
@@ -1,85 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import argparse -import logging -import os -import sys - -if __name__ == '__main__': - sys.path.append(os.path.abspath(os.path.join( - os.path.dirname(__file__), os.pardir, os.pardir, os.pardir))) -from devil.android import device_blacklist -from devil.android import device_errors -from devil.android import device_utils -from devil.android import fastboot_utils -from devil.android.sdk import adb_wrapper -from devil.constants import exit_codes -from devil.utils import run_tests_helper - - -def GetDeviceList(device=None): - """Returns a list of devices. - - If device is passed to it, returns only that device. - """ - available_devices = [device_utils.DeviceUtils(d) - for d in adb_wrapper.AdbWrapper.GetDevices()] - if not available_devices: - raise device_errors.NoDevicesError - if not device: - return available_devices - for d in available_devices: - if str(d) == device: - return [d] - raise device_errors.NoDevicesError - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('build_path', help='Path to android build.') - parser.add_argument('-d', '--device', help='Device to flash.') - parser.add_argument('-v', '--verbose', default=0, action='count', - help='Verbose level (multiple times for more)') - parser.add_argument('-w', '--wipe', action='store_true', - help='If set, wipes user data') - parser.add_argument('--blacklist-file', help='Device blacklist file.') - args = parser.parse_args() - run_tests_helper.SetLogLevel(args.verbose) - - if args.blacklist_file: - blacklist = device_blacklist.Blacklist(args.blacklist_file).Read() - if blacklist: - logging.critical('Device(s) in blacklist, not flashing devices:') - for key in blacklist: - logging.critical(' %s', key) - return exit_codes.INFRA - - flashed_devices = [] - failed_devices = [] - - def flash(device): - fastboot = fastboot_utils.FastbootUtils(device) - try: - fastboot.FlashDevice(args.build_path, wipe=args.wipe) - flashed_devices.append(device) - except Exception: # pylint: disable=broad-except - logging.exception('Device %s failed to flash.', str(device)) - failed_devices.append(device) - - devices = GetDeviceList(device=args.device) - device_utils.DeviceUtils.parallel(devices).pMap(flash) - - if flashed_devices: - logging.info('The following devices were flashed:') - logging.info(' %s', ' '.join(str(d) for d in flashed_devices)) - if failed_devices: - logging.critical('The following devices failed to flash:') - logging.critical(' %s', ' '.join(str(d) for d in failed_devices)) - return exit_codes.INFRA - return 0 - -if __name__ == '__main__': - sys.exit(main())
diff --git a/build/android/devil/android/tools/screenshot.py b/build/android/devil/android/tools/screenshot.py deleted file mode 100755 index 45a855b..0000000 --- a/build/android/devil/android/tools/screenshot.py +++ /dev/null
@@ -1,57 +0,0 @@ -#!/usr/bin/env python -# 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. - -"""Takes a screenshot from an Android device.""" - -import argparse -import logging -import os -import sys - -if __name__ == '__main__': - sys.path.append(os.path.abspath(os.path.join( - os.path.dirname(__file__), os.pardir, os.pardir, os.pardir))) -from devil.android import device_utils -from devil.android.tools import script_common - - -def main(): - # Parse options. - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument('-d', '--device', dest='devices', action='append', - help='Serial number of Android device to use.') - parser.add_argument('--blacklist-file', help='Device blacklist JSON file.') - parser.add_argument('-f', '--file', metavar='FILE', - help='Save result to file instead of generating a ' - 'timestamped file name.') - parser.add_argument('-v', '--verbose', action='store_true', - help='Verbose logging.') - parser.add_argument('host_file', nargs='?', - help='File to which the screenshot will be saved.') - - args = parser.parse_args() - - host_file = args.host_file or args.file - - if args.verbose: - logging.getLogger().setLevel(logging.DEBUG) - - devices = script_common.GetDevices(args.devices, args.blacklist_file) - - def screenshot(device): - f = None - if host_file: - root, ext = os.path.splitext(host_file) - f = '%s_%s%s' % (root, str(device), ext) - f = device.TakeScreenshot(f) - print 'Screenshot for device %s written to %s' % ( - str(device), os.path.abspath(f)) - - device_utils.DeviceUtils.parallel(devices).pMap(screenshot) - return 0 - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/build/android/devil/android/tools/script_common.py b/build/android/devil/android/tools/script_common.py deleted file mode 100644 index eb91cdc..0000000 --- a/build/android/devil/android/tools/script_common.py +++ /dev/null
@@ -1,28 +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. - -from devil.android import device_blacklist -from devil.android import device_errors -from devil.android import device_utils - - -def GetDevices(requested_devices, blacklist_file): - blacklist = (device_blacklist.Blacklist(blacklist_file) - if blacklist_file - else None) - - devices = device_utils.DeviceUtils.HealthyDevices(blacklist) - if not devices: - raise device_errors.NoDevicesError() - elif requested_devices: - requested = set(requested_devices) - available = set(str(d) for d in devices) - missing = requested.difference(available) - if missing: - raise device_errors.DeviceUnreachableError(next(iter(missing))) - return sorted(device_utils.DeviceUtils(d) - for d in available.intersection(requested)) - else: - return devices -
diff --git a/build/android/devil/android/tools/script_common_test.py b/build/android/devil/android/tools/script_common_test.py deleted file mode 100755 index bb5e29e..0000000 --- a/build/android/devil/android/tools/script_common_test.py +++ /dev/null
@@ -1,58 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -import sys -import unittest - -from devil import devil_env -from devil.android import device_errors -from devil.android import device_utils -from devil.android.tools import script_common - -with devil_env.SysPath(devil_env.PYMOCK_PATH): - import mock # pylint: disable=import-error - - -class ScriptCommonTest(unittest.TestCase): - - def testGetDevices_noSpecs(self): - devices = [ - device_utils.DeviceUtils('123'), - device_utils.DeviceUtils('456'), - ] - with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices', - return_value=devices): - self.assertEquals( - devices, - script_common.GetDevices(None, None)) - - def testGetDevices_withDevices(self): - devices = [ - device_utils.DeviceUtils('123'), - device_utils.DeviceUtils('456'), - ] - with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices', - return_value=devices): - self.assertEquals( - [device_utils.DeviceUtils('456')], - script_common.GetDevices(['456'], None)) - - def testGetDevices_missingDevice(self): - with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices', - return_value=[device_utils.DeviceUtils('123')]): - with self.assertRaises(device_errors.DeviceUnreachableError): - script_common.GetDevices(['456'], None) - - def testGetDevices_noDevices(self): - with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices', - return_value=[]): - with self.assertRaises(device_errors.NoDevicesError): - script_common.GetDevices(None, None) - - -if __name__ == '__main__': - sys.exit(unittest.main()) -
diff --git a/build/android/devil/android/tools/video_recorder.py b/build/android/devil/android/tools/video_recorder.py deleted file mode 100755 index 685b682..0000000 --- a/build/android/devil/android/tools/video_recorder.py +++ /dev/null
@@ -1,173 +0,0 @@ -#!/usr/bin/env python -# 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. - -"""Captures a video from an Android device.""" - -import argparse -import logging -import os -import threading -import time -import sys - -if __name__ == '__main__': - sys.path.append(os.path.abspath(os.path.join( - os.path.dirname(__file__), os.pardir, os.pardir, os.pardir))) -from devil.android import device_signal -from devil.android import device_utils -from devil.android.tools import script_common -from devil.utils import cmd_helper -from devil.utils import reraiser_thread -from devil.utils import timeout_retry - - -class VideoRecorder(object): - """Records a screen capture video from an Android Device (KitKat or newer).""" - - def __init__(self, device, megabits_per_second=4, size=None, - rotate=False): - """Creates a VideoRecorder instance. - - Args: - device: DeviceUtils instance. - host_file: Path to the video file to store on the host. - megabits_per_second: Video bitrate in megabits per second. Allowed range - from 0.1 to 100 mbps. - size: Video frame size tuple (width, height) or None to use the device - default. - rotate: If True, the video will be rotated 90 degrees. - """ - self._bit_rate = megabits_per_second * 1000 * 1000 - self._device = device - self._device_file = ( - '%s/screen-recording.mp4' % device.GetExternalStoragePath()) - self._recorder_thread = None - self._rotate = rotate - self._size = size - self._started = threading.Event() - - def __enter__(self): - self.Start() - - def Start(self, timeout=None): - """Start recording video.""" - def screenrecord_started(): - return bool(self._device.GetPids('screenrecord')) - - if screenrecord_started(): - raise Exception("Can't run multiple concurrent video captures.") - - self._started.clear() - self._recorder_thread = reraiser_thread.ReraiserThread(self._Record) - self._recorder_thread.start() - timeout_retry.WaitFor( - screenrecord_started, wait_period=1, max_tries=timeout) - self._started.wait(timeout) - - def _Record(self): - cmd = ['screenrecord', '--verbose', '--bit-rate', str(self._bit_rate)] - if self._rotate: - cmd += ['--rotate'] - if self._size: - cmd += ['--size', '%dx%d' % self._size] - cmd += [self._device_file] - for line in self._device.adb.IterShell( - ' '.join(cmd_helper.SingleQuote(i) for i in cmd), None): - if line.startswith('Content area is '): - self._started.set() - - def __exit__(self, _exc_type, _exc_value, _traceback): - self.Stop() - - def Stop(self): - """Stop recording video.""" - if not self._device.KillAll('screenrecord', signum=device_signal.SIGINT, - quiet=True): - logging.warning('Nothing to kill: screenrecord was not running') - self._recorder_thread.join() - - def Pull(self, host_file=None): - """Pull resulting video file from the device. - - Args: - host_file: Path to the video file to store on the host. - Returns: - Output video file name on the host. - """ - # TODO(jbudorick): Merge filename generation with the logic for doing so in - # DeviceUtils. - host_file_name = ( - host_file - or 'screen-recording-%s-%s.mp4' % ( - str(self._device), - time.strftime('%Y%m%dT%H%M%S', time.localtime()))) - host_file_name = os.path.abspath(host_file_name) - self._device.PullFile(self._device_file, host_file_name) - self._device.RunShellCommand('rm -f "%s"' % self._device_file) - return host_file_name - - -def main(): - # Parse options. - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument('-d', '--device', dest='devices', action='append', - help='Serial number of Android device to use.') - parser.add_argument('--blacklist-file', help='Device blacklist JSON file.') - parser.add_argument('-f', '--file', metavar='FILE', - help='Save result to file instead of generating a ' - 'timestamped file name.') - parser.add_argument('-v', '--verbose', action='store_true', - help='Verbose logging.') - parser.add_argument('-b', '--bitrate', default=4, type=float, - help='Bitrate in megabits/s, from 0.1 to 100 mbps, ' - '%default mbps by default.') - parser.add_argument('-r', '--rotate', action='store_true', - help='Rotate video by 90 degrees.') - parser.add_argument('-s', '--size', metavar='WIDTHxHEIGHT', - help='Frame size to use instead of the device ' - 'screen size.') - parser.add_argument('host_file', nargs='?', - help='File to which the video capture will be written.') - - args = parser.parse_args() - - host_file = args.host_file or args.file - - if args.verbose: - logging.getLogger().setLevel(logging.DEBUG) - - size = (tuple(int(i) for i in args.size.split('x')) - if args.size - else None) - - def record_video(device, stop_recording): - recorder = VideoRecorder( - device, megabits_per_second=args.bitrate, size=size, rotate=args.rotate) - with recorder: - stop_recording.wait() - - f = None - if host_file: - root, ext = os.path.splitext(host_file) - f = '%s_%s%s' % (root, str(device), ext) - f = recorder.Pull(f) - print 'Video written to %s' % os.path.abspath(f) - - parallel_devices = device_utils.DeviceUtils.parallel( - script_common.GetDevices(args.devices, args.blacklist_file), - async=True) - stop_recording = threading.Event() - running_recording = parallel_devices.pMap(record_video, stop_recording) - print 'Recording. Press Enter to stop.', - sys.stdout.flush() - raw_input() - stop_recording.set() - - running_recording.pGet(None) - return 0 - - -if __name__ == '__main__': - sys.exit(main())
diff --git a/build/android/devil/android/valgrind_tools/__init__.py b/build/android/devil/android/valgrind_tools/__init__.py deleted file mode 100644 index 0182d4c1..0000000 --- a/build/android/devil/android/valgrind_tools/__init__.py +++ /dev/null
@@ -1,21 +0,0 @@ -# Copyright (c) 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. -""" -Classes in this package define additional actions that need to be taken to run a -test under some kind of runtime error detection tool. - -The interface is intended to be used as follows. - -1. For tests that simply run a native process (i.e. no activity is spawned): - -Call tool.CopyFiles(device). -Prepend test command line with tool.GetTestWrapper(). - -2. For tests that spawn an activity: - -Call tool.CopyFiles(device). -Call tool.SetupEnvironment(). -Run the test as usual. -Call tool.CleanUpEnvironment(). -"""
diff --git a/build/android/devil/android/valgrind_tools/base_tool.py b/build/android/devil/android/valgrind_tools/base_tool.py deleted file mode 100644 index 2e6e9af..0000000 --- a/build/android/devil/android/valgrind_tools/base_tool.py +++ /dev/null
@@ -1,53 +0,0 @@ -# Copyright (c) 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. - - -class BaseTool(object): - """A tool that does nothing.""" - # pylint: disable=R0201 - - def __init__(self): - """Does nothing.""" - pass - - def GetTestWrapper(self): - """Returns a string that is to be prepended to the test command line.""" - return '' - - def GetUtilWrapper(self): - """Returns the wrapper name for the utilities. - - Returns: - A string that is to be prepended to the command line of utility - processes (forwarder, etc.). - """ - return '' - - @classmethod - def CopyFiles(cls, device): - """Copies tool-specific files to the device, create directories, etc.""" - pass - - def SetupEnvironment(self): - """Sets up the system environment for a test. - - This is a good place to set system properties. - """ - pass - - def CleanUpEnvironment(self): - """Cleans up environment.""" - pass - - def GetTimeoutScale(self): - """Returns a multiplier that should be applied to timeout values.""" - return 1.0 - - def NeedsDebugInfo(self): - """Whether this tool requires debug info. - - Returns: - True if this tool can not work with stripped binaries. - """ - return False
diff --git a/build/android/devil/base_error.py b/build/android/devil/base_error.py deleted file mode 100644 index dadf4da..0000000 --- a/build/android/devil/base_error.py +++ /dev/null
@@ -1,17 +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. - - -class BaseError(Exception): - """Base error for all test runner errors.""" - - def __init__(self, message, is_infra_error=False): - super(BaseError, self).__init__(message) - self._is_infra_error = is_infra_error - - @property - def is_infra_error(self): - """Property to indicate if error was caused by an infrastructure issue.""" - return self._is_infra_error -
diff --git a/build/android/devil/constants/__init__.py b/build/android/devil/constants/__init__.py deleted file mode 100644 index 50b23df..0000000 --- a/build/android/devil/constants/__init__.py +++ /dev/null
@@ -1,3 +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.
diff --git a/build/android/devil/constants/exit_codes.py b/build/android/devil/constants/exit_codes.py deleted file mode 100644 index aaeca4a8..0000000 --- a/build/android/devil/constants/exit_codes.py +++ /dev/null
@@ -1,9 +0,0 @@ -# Copyright (c) 2012 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Common exit codes used by devil.""" - -ERROR = 1 -INFRA = 87 -WARNING = 88
diff --git a/build/android/devil/devil_dependencies.json b/build/android/devil/devil_dependencies.json deleted file mode 100644 index d131c17..0000000 --- a/build/android/devil/devil_dependencies.json +++ /dev/null
@@ -1,141 +0,0 @@ -{ - "config_type": "BaseConfig", - "dependencies": { - "aapt": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "linux2_x86_64": { - "cloud_storage_hash": "7448de3cb5e834afdedeaad8b40ba63ac53f3dc4", - "download_path": "../bin/aapt" - } - } - }, - "adb": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "linux2_x86_64": { - "cloud_storage_hash": "0c2043552619c8ec8bb5d986ba75703a598611fc", - "download_path": "../bin/adb" - } - } - }, - "android_build_tools_libc++": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "linux2_x86_64": { - "cloud_storage_hash": "52d150a7ccde835f38b4337392152f3013d5f303", - "download_path": "../bin/lib/libc++.so" - } - } - }, - "chromium_commands": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "linux2_x86_64": { - "cloud_storage_hash": "049f482f29bc34e2ed844e2e47b7609f8ffbeb4f", - "download_path": "../bin/lib.java/chromium_commands.dex.jar" - } - } - }, - "dexdump": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "linux2_x86_64": { - "cloud_storage_hash": "38765b5b358c29003e56b1d214606ea13467b6fe", - "download_path": "../bin/dexdump" - } - } - }, - "forwarder_device": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "android_armeabi-v7a": { - "cloud_storage_hash": "4858c9e41da72ad8ff24414731feae2137229361", - "download_path": "../bin/armeabi-v7a/forwarder_device" - }, - "android_arm64-v8a": { - "cloud_storage_hash": "8cbd1ac2079ee82ce5f1cf4d3e85fc1e53a8f018", - "download_path": "../bin/arm64-v8a/forwarder_device" - } - } - }, - "forwarder_host": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "linux2_x86_64": { - "cloud_storage_hash": "b3dda9fbdd4a3fb933b64111c11070aa809c7ed4", - "download_path": "../bin/forwarder_host" - } - } - }, - "md5sum_device": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "android_armeabi-v7a": { - "cloud_storage_hash": "c8894480be71d5e49118483d83ba7a6e0097cba6", - "download_path": "../bin/armeabi-v7a/md5sum_device" - }, - "android_arm64-v8a": { - "cloud_storage_hash": "bbe410e2ffb48367ac4ca0874598d4f85fd16d9d", - "download_path": "../bin/arm64-v8a/md5sum_device" - }, - "android_x86": { - "cloud_storage_hash": "b578a5c2c400ce39761e2558cdf2237567a57257", - "download_path": "../bin/x86/md5sum_device" - } - } - }, - "md5sum_host": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "linux2_x86_64": { - "cloud_storage_hash": "49e36c9c4246cfebef26cbd07436c1a8343254aa", - "download_path": "../bin/md5sum_host" - } - } - }, - "pymock": { - "file_info": { - "darwin_x86_64": { - "local_paths": [ - "../../../tools/telemetry/third_party/mock" - ] - }, - "linux2_x86_64": { - "local_paths": [ - "../../../tools/telemetry/third_party/mock" - ] - }, - "win32_AMD64": { - "local_paths": [ - "../../../tools/telemetry/third_party/mock" - ] - }, - "win32_x86": { - "local_paths": [ - "../../../tools/telemetry/third_party/mock" - ] - } - } - }, - "split-select": { - "cloud_storage_bucket": "chromium-telemetry", - "cloud_storage_base_folder": "binary_dependencies", - "file_info": { - "linux2_x86_64": { - "cloud_storage_hash": "3327881fa3951a503b9467425ea8e781cdffeb9f", - "download_path": "../bin/split-select" - } - } - } - } -}
diff --git a/build/android/devil/devil_env.py b/build/android/devil/devil_env.py deleted file mode 100644 index 0b1ddc9..0000000 --- a/build/android/devil/devil_env.py +++ /dev/null
@@ -1,146 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import contextlib -import json -import os -import platform -import sys -import tempfile -import threading - -CATAPULT_ROOT_PATH = os.path.abspath(os.path.join( - os.path.dirname(__file__), '..', '..', '..', 'third_party', 'catapult')) -DEPENDENCY_MANAGER_PATH = os.path.join( - CATAPULT_ROOT_PATH, 'dependency_manager') -PYMOCK_PATH = os.path.join( - CATAPULT_ROOT_PATH, 'third_party', 'mock') - - -@contextlib.contextmanager -def SysPath(path): - sys.path.append(path) - yield - if sys.path[-1] != path: - sys.path.remove(path) - else: - sys.path.pop() - -with SysPath(DEPENDENCY_MANAGER_PATH): - import dependency_manager # pylint: disable=import-error - -_ANDROID_BUILD_TOOLS = {'aapt', 'dexdump', 'split-select'} - -_DEVIL_DEFAULT_CONFIG = os.path.abspath(os.path.join( - os.path.dirname(__file__), 'devil_dependencies.json')) - -_LEGACY_ENVIRONMENT_VARIABLES = { - 'ADB_PATH': { - 'dependency_name': 'adb', - 'platform': 'linux2_x86_64', - }, - 'ANDROID_SDK_ROOT': { - 'dependency_name': 'android_sdk', - 'platform': 'linux2_x86_64', - }, -} - - -def _GetEnvironmentVariableConfig(): - path_config = ( - (os.environ.get(k), v) - for k, v in _LEGACY_ENVIRONMENT_VARIABLES.iteritems()) - return { - 'config_type': 'BaseConfig', - 'dependencies': { - c['dependency_name']: { - 'file_info': { - c['platform']: { - 'local_paths': [p], - }, - }, - } for p, c in path_config if p - }, - } - - -class _Environment(object): - - def __init__(self): - self._dm_init_lock = threading.Lock() - self._dm = None - - def Initialize(self, configs=None, config_files=None): - """Initialize devil's environment from configuration files. - - This uses all configurations provided via |configs| and |config_files| - to determine the locations of devil's dependencies. Configurations should - all take the form described by catapult_base.dependency_manager.BaseConfig. - If no configurations are provided, a default one will be used if available. - - Args: - configs: An optional list of dict configurations. - config_files: An optional list of files to load - """ - - # Make sure we only initialize self._dm once. - with self._dm_init_lock: - if self._dm is None: - if configs is None: - configs = [] - - env_config = _GetEnvironmentVariableConfig() - if env_config: - configs.insert(0, env_config) - self._InitializeRecursive( - configs=configs, - config_files=config_files) - assert self._dm is not None, 'Failed to create dependency manager.' - - def _InitializeRecursive(self, configs=None, config_files=None): - # This recurses through configs to create temporary files for each and - # take advantage of context managers to appropriately close those files. - # TODO(jbudorick): Remove this recursion if/when dependency_manager - # supports loading configurations directly from a dict. - if configs: - with tempfile.NamedTemporaryFile(delete=False) as next_config_file: - try: - next_config_file.write(json.dumps(configs[0])) - next_config_file.close() - self._InitializeRecursive( - configs=configs[1:], - config_files=[next_config_file.name] + (config_files or [])) - finally: - if os.path.exists(next_config_file.name): - os.remove(next_config_file.name) - else: - config_files = config_files or [] - if 'DEVIL_ENV_CONFIG' in os.environ: - config_files.append(os.environ.get('DEVIL_ENV_CONFIG')) - config_files.append(_DEVIL_DEFAULT_CONFIG) - - self._dm = dependency_manager.DependencyManager( - [dependency_manager.BaseConfig(c) for c in config_files]) - - def FetchPath(self, dependency, arch=None, device=None): - if self._dm is None: - self.Initialize() - if dependency in _ANDROID_BUILD_TOOLS: - self.FetchPath('android_build_tools_libc++', arch=arch, device=device) - return self._dm.FetchPath(dependency, GetPlatform(arch, device)) - - def LocalPath(self, dependency, arch=None, device=None): - if self._dm is None: - self.Initialize() - return self._dm.LocalPath(dependency, GetPlatform(arch, device)) - - -def GetPlatform(arch=None, device=None): - if device: - return 'android_%s' % (arch or device.product_cpu_abi) - return '%s_%s' % (sys.platform, platform.machine()) - - -config = _Environment() -
diff --git a/build/android/devil/devil_env_test.py b/build/android/devil/devil_env_test.py deleted file mode 100755 index fcb5b3d..0000000 --- a/build/android/devil/devil_env_test.py +++ /dev/null
@@ -1,62 +0,0 @@ -#!/usr/bin/env python -# 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. - -# pylint: disable=protected-access - -import logging -import sys -import unittest - -from devil import devil_env - -_sys_path_before = list(sys.path) -with devil_env.SysPath(devil_env.PYMOCK_PATH): - _sys_path_with_pymock = list(sys.path) - import mock # pylint: disable=import-error -_sys_path_after = list(sys.path) - -class DevilEnvTest(unittest.TestCase): - - def testSysPath(self): - self.assertEquals(_sys_path_before, _sys_path_after) - self.assertEquals( - _sys_path_before + [devil_env.PYMOCK_PATH], - _sys_path_with_pymock) - - def testGetEnvironmentVariableConfig_configType(self): - with mock.patch('os.environ.get', - mock.Mock(side_effect=lambda _env_var: None)): - env_config = devil_env._GetEnvironmentVariableConfig() - self.assertEquals('BaseConfig', env_config.get('config_type')) - - def testGetEnvironmentVariableConfig_noEnv(self): - with mock.patch('os.environ.get', - mock.Mock(side_effect=lambda _env_var: None)): - env_config = devil_env._GetEnvironmentVariableConfig() - self.assertEquals({}, env_config.get('dependencies')) - - def testGetEnvironmentVariableConfig_adbPath(self): - def mock_environment(env_var): - return '/my/fake/adb/path' if env_var == 'ADB_PATH' else None - - with mock.patch('os.environ.get', - mock.Mock(side_effect=mock_environment)): - env_config = devil_env._GetEnvironmentVariableConfig() - self.assertEquals( - { - 'adb': { - 'file_info': { - 'linux2_x86_64': { - 'local_paths': ['/my/fake/adb/path'], - }, - }, - }, - }, - env_config.get('dependencies')) - - -if __name__ == '__main__': - logging.getLogger().setLevel(logging.DEBUG) - unittest.main(verbosity=2)
diff --git a/build/android/devil/pylintrc b/build/android/devil/pylintrc deleted file mode 100644 index 8005a5d..0000000 --- a/build/android/devil/pylintrc +++ /dev/null
@@ -1,15 +0,0 @@ -[FORMAT] - -max-line-length=80 - -[MESSAGES CONTROL] - -disable=abstract-class-not-used,bad-continuation,bad-indentation,duplicate-code,fixme,invalid-name,locally-disabled,locally-enabled,missing-docstring,star-args,too-few-public-methods,too-many-arguments,too-many-branches,too-many-instance-attributes,too-many-lines,too-many-locals,too-many-public-methods,too-many-statements, - -[REPORTS] - -reports=no - -[VARIABLES] - -dummy-variables-rgx=^_.*$|dummy
diff --git a/build/android/devil/utils/__init__.py b/build/android/devil/utils/__init__.py deleted file mode 100644 index 50b23df..0000000 --- a/build/android/devil/utils/__init__.py +++ /dev/null
@@ -1,3 +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.
diff --git a/build/android/devil/utils/cmd_helper.py b/build/android/devil/utils/cmd_helper.py deleted file mode 100644 index 57e8987..0000000 --- a/build/android/devil/utils/cmd_helper.py +++ /dev/null
@@ -1,311 +0,0 @@ -# Copyright (c) 2012 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""A wrapper for subprocess to make calling shell commands easier.""" - -import logging -import os -import pipes -import select -import signal -import string -import StringIO -import subprocess -import time - -# fcntl is not available on Windows. -try: - import fcntl -except ImportError: - fcntl = None - -_SafeShellChars = frozenset(string.ascii_letters + string.digits + '@%_-+=:,./') - -def SingleQuote(s): - """Return an shell-escaped version of the string using single quotes. - - Reliably quote a string which may contain unsafe characters (e.g. space, - quote, or other special characters such as '$'). - - The returned value can be used in a shell command line as one token that gets - to be interpreted literally. - - Args: - s: The string to quote. - - Return: - The string quoted using single quotes. - """ - return pipes.quote(s) - -def DoubleQuote(s): - """Return an shell-escaped version of the string using double quotes. - - Reliably quote a string which may contain unsafe characters (e.g. space - or quote characters), while retaining some shell features such as variable - interpolation. - - The returned value can be used in a shell command line as one token that gets - to be further interpreted by the shell. - - The set of characters that retain their special meaning may depend on the - shell implementation. This set usually includes: '$', '`', '\', '!', '*', - and '@'. - - Args: - s: The string to quote. - - Return: - The string quoted using double quotes. - """ - if not s: - return '""' - elif all(c in _SafeShellChars for c in s): - return s - else: - return '"' + s.replace('"', '\\"') + '"' - - -def ShrinkToSnippet(cmd_parts, var_name, var_value): - """Constructs a shell snippet for a command using a variable to shrink it. - - Takes into account all quoting that needs to happen. - - Args: - cmd_parts: A list of command arguments. - var_name: The variable that holds var_value. - var_value: The string to replace in cmd_parts with $var_name - - Returns: - A shell snippet that does not include setting the variable. - """ - def shrink(value): - parts = (x and SingleQuote(x) for x in value.split(var_value)) - with_substitutions = ('"$%s"' % var_name).join(parts) - return with_substitutions or "''" - - return ' '.join(shrink(part) for part in cmd_parts) - - -def Popen(args, stdout=None, stderr=None, shell=None, cwd=None, env=None): - return subprocess.Popen( - args=args, cwd=cwd, stdout=stdout, stderr=stderr, - shell=shell, close_fds=True, env=env, - preexec_fn=lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)) - - -def Call(args, stdout=None, stderr=None, shell=None, cwd=None, env=None): - pipe = Popen(args, stdout=stdout, stderr=stderr, shell=shell, cwd=cwd, - env=env) - pipe.communicate() - return pipe.wait() - - -def RunCmd(args, cwd=None): - """Opens a subprocess to execute a program and returns its return value. - - Args: - args: A string or a sequence of program arguments. The program to execute is - the string or the first item in the args sequence. - cwd: If not None, the subprocess's current directory will be changed to - |cwd| before it's executed. - - Returns: - Return code from the command execution. - """ - logging.info(str(args) + ' ' + (cwd or '')) - return Call(args, cwd=cwd) - - -def GetCmdOutput(args, cwd=None, shell=False): - """Open a subprocess to execute a program and returns its output. - - Args: - args: A string or a sequence of program arguments. The program to execute is - the string or the first item in the args sequence. - cwd: If not None, the subprocess's current directory will be changed to - |cwd| before it's executed. - shell: Whether to execute args as a shell command. - - Returns: - Captures and returns the command's stdout. - Prints the command's stderr to logger (which defaults to stdout). - """ - (_, output) = GetCmdStatusAndOutput(args, cwd, shell) - return output - - -def _ValidateAndLogCommand(args, cwd, shell): - if isinstance(args, basestring): - if not shell: - raise Exception('string args must be run with shell=True') - else: - if shell: - raise Exception('array args must be run with shell=False') - args = ' '.join(SingleQuote(c) for c in args) - if cwd is None: - cwd = '' - else: - cwd = ':' + cwd - logging.info('[host]%s> %s', cwd, args) - return args - - -def GetCmdStatusAndOutput(args, cwd=None, shell=False): - """Executes a subprocess and returns its exit code and output. - - Args: - args: A string or a sequence of program arguments. The program to execute is - the string or the first item in the args sequence. - cwd: If not None, the subprocess's current directory will be changed to - |cwd| before it's executed. - shell: Whether to execute args as a shell command. Must be True if args - is a string and False if args is a sequence. - - Returns: - The 2-tuple (exit code, output). - """ - status, stdout, stderr = GetCmdStatusOutputAndError( - args, cwd=cwd, shell=shell) - - if stderr: - logging.critical(stderr) - if len(stdout) > 4096: - logging.debug('Truncated output:') - logging.debug(stdout[:4096]) - return (status, stdout) - -def GetCmdStatusOutputAndError(args, cwd=None, shell=False): - """Executes a subprocess and returns its exit code, output, and errors. - - Args: - args: A string or a sequence of program arguments. The program to execute is - the string or the first item in the args sequence. - cwd: If not None, the subprocess's current directory will be changed to - |cwd| before it's executed. - shell: Whether to execute args as a shell command. Must be True if args - is a string and False if args is a sequence. - - Returns: - The 2-tuple (exit code, output). - """ - _ValidateAndLogCommand(args, cwd, shell) - pipe = Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - shell=shell, cwd=cwd) - stdout, stderr = pipe.communicate() - return (pipe.returncode, stdout, stderr) - - -class TimeoutError(Exception): - """Module-specific timeout exception.""" - - def __init__(self, output=None): - super(TimeoutError, self).__init__() - self._output = output - - @property - def output(self): - return self._output - - -def _IterProcessStdout(process, timeout=None, buffer_size=4096, - poll_interval=1): - assert fcntl, 'fcntl module is required' - try: - # Enable non-blocking reads from the child's stdout. - child_fd = process.stdout.fileno() - fl = fcntl.fcntl(child_fd, fcntl.F_GETFL) - fcntl.fcntl(child_fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) - - end_time = (time.time() + timeout) if timeout else None - while True: - if end_time and time.time() > end_time: - raise TimeoutError() - read_fds, _, _ = select.select([child_fd], [], [], poll_interval) - if child_fd in read_fds: - data = os.read(child_fd, buffer_size) - if not data: - break - yield data - if process.poll() is not None: - break - finally: - try: - # Make sure the process doesn't stick around if we fail with an - # exception. - process.kill() - except OSError: - pass - process.wait() - - -def GetCmdStatusAndOutputWithTimeout(args, timeout, cwd=None, shell=False, - logfile=None): - """Executes a subprocess with a timeout. - - Args: - args: List of arguments to the program, the program to execute is the first - element. - timeout: the timeout in seconds or None to wait forever. - cwd: If not None, the subprocess's current directory will be changed to - |cwd| before it's executed. - shell: Whether to execute args as a shell command. Must be True if args - is a string and False if args is a sequence. - logfile: Optional file-like object that will receive output from the - command as it is running. - - Returns: - The 2-tuple (exit code, output). - """ - _ValidateAndLogCommand(args, cwd, shell) - output = StringIO.StringIO() - process = Popen(args, cwd=cwd, shell=shell, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - try: - for data in _IterProcessStdout(process, timeout=timeout): - if logfile: - logfile.write(data) - output.write(data) - except TimeoutError: - raise TimeoutError(output.getvalue()) - - return process.returncode, output.getvalue() - - -def IterCmdOutputLines(args, timeout=None, cwd=None, shell=False, - check_status=True): - """Executes a subprocess and continuously yields lines from its output. - - Args: - args: List of arguments to the program, the program to execute is the first - element. - cwd: If not None, the subprocess's current directory will be changed to - |cwd| before it's executed. - shell: Whether to execute args as a shell command. Must be True if args - is a string and False if args is a sequence. - check_status: A boolean indicating whether to check the exit status of the - process after all output has been read. - - Yields: - The output of the subprocess, line by line. - - Raises: - CalledProcessError if check_status is True and the process exited with a - non-zero exit status. - """ - cmd = _ValidateAndLogCommand(args, cwd, shell) - process = Popen(args, cwd=cwd, shell=shell, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - buffer_output = '' - for data in _IterProcessStdout(process, timeout=timeout): - buffer_output += data - has_incomplete_line = buffer_output[-1] not in '\r\n' - lines = buffer_output.splitlines() - buffer_output = lines.pop() if has_incomplete_line else '' - for line in lines: - yield line - if buffer_output: - yield buffer_output - if check_status and process.returncode: - raise subprocess.CalledProcessError(process.returncode, cmd)
diff --git a/build/android/devil/utils/cmd_helper_test.py b/build/android/devil/utils/cmd_helper_test.py deleted file mode 100755 index c01c319..0000000 --- a/build/android/devil/utils/cmd_helper_test.py +++ /dev/null
@@ -1,118 +0,0 @@ -#!/usr/bin/env python -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests for the cmd_helper module.""" - -import unittest -import subprocess - -from devil.utils import cmd_helper - - -class CmdHelperSingleQuoteTest(unittest.TestCase): - - def testSingleQuote_basic(self): - self.assertEquals('hello', - cmd_helper.SingleQuote('hello')) - - def testSingleQuote_withSpaces(self): - self.assertEquals("'hello world'", - cmd_helper.SingleQuote('hello world')) - - def testSingleQuote_withUnsafeChars(self): - self.assertEquals("""'hello'"'"'; rm -rf /'""", - cmd_helper.SingleQuote("hello'; rm -rf /")) - - def testSingleQuote_dontExpand(self): - test_string = 'hello $TEST_VAR' - cmd = 'TEST_VAR=world; echo %s' % cmd_helper.SingleQuote(test_string) - self.assertEquals(test_string, - cmd_helper.GetCmdOutput(cmd, shell=True).rstrip()) - - -class CmdHelperDoubleQuoteTest(unittest.TestCase): - - def testDoubleQuote_basic(self): - self.assertEquals('hello', - cmd_helper.DoubleQuote('hello')) - - def testDoubleQuote_withSpaces(self): - self.assertEquals('"hello world"', - cmd_helper.DoubleQuote('hello world')) - - def testDoubleQuote_withUnsafeChars(self): - self.assertEquals('''"hello\\"; rm -rf /"''', - cmd_helper.DoubleQuote('hello"; rm -rf /')) - - def testSingleQuote_doExpand(self): - test_string = 'hello $TEST_VAR' - cmd = 'TEST_VAR=world; echo %s' % cmd_helper.DoubleQuote(test_string) - self.assertEquals('hello world', - cmd_helper.GetCmdOutput(cmd, shell=True).rstrip()) - - -class CmdHelperShinkToSnippetTest(unittest.TestCase): - - def testShrinkToSnippet_noArgs(self): - self.assertEquals('foo', - cmd_helper.ShrinkToSnippet(['foo'], 'a', 'bar')) - self.assertEquals("'foo foo'", - cmd_helper.ShrinkToSnippet(['foo foo'], 'a', 'bar')) - self.assertEquals('"$a"\' bar\'', - cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'foo')) - self.assertEquals('\'foo \'"$a"', - cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'bar')) - self.assertEquals('foo"$a"', - cmd_helper.ShrinkToSnippet(['foobar'], 'a', 'bar')) - - def testShrinkToSnippet_singleArg(self): - self.assertEquals("foo ''", - cmd_helper.ShrinkToSnippet(['foo', ''], 'a', 'bar')) - self.assertEquals("foo foo", - cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'bar')) - self.assertEquals('"$a" "$a"', - cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'foo')) - self.assertEquals('foo "$a""$a"', - cmd_helper.ShrinkToSnippet(['foo', 'barbar'], 'a', 'bar')) - self.assertEquals('foo "$a"\' \'"$a"', - cmd_helper.ShrinkToSnippet(['foo', 'bar bar'], 'a', 'bar')) - self.assertEquals('foo "$a""$a"\' \'', - cmd_helper.ShrinkToSnippet(['foo', 'barbar '], 'a', 'bar')) - self.assertEquals('foo \' \'"$a""$a"\' \'', - cmd_helper.ShrinkToSnippet(['foo', ' barbar '], 'a', 'bar')) - -class CmdHelperIterCmdOutputLinesTest(unittest.TestCase): - """Test IterCmdOutputLines with some calls to the unix 'seq' command.""" - - def testIterCmdOutputLines_success(self): - for num, line in enumerate( - cmd_helper.IterCmdOutputLines(['seq', '10']), 1): - self.assertEquals(num, int(line)) - - def testIterCmdOutputLines_exitStatusFail(self): - with self.assertRaises(subprocess.CalledProcessError): - for num, line in enumerate( - cmd_helper.IterCmdOutputLines('seq 10 && false', shell=True), 1): - self.assertEquals(num, int(line)) - # after reading all the output we get an exit status of 1 - - def testIterCmdOutputLines_exitStatusIgnored(self): - for num, line in enumerate( - cmd_helper.IterCmdOutputLines('seq 10 && false', shell=True, - check_status=False), 1): - self.assertEquals(num, int(line)) - - def testIterCmdOutputLines_exitStatusSkipped(self): - for num, line in enumerate( - cmd_helper.IterCmdOutputLines('seq 10 && false', shell=True), 1): - self.assertEquals(num, int(line)) - # no exception will be raised because we don't attempt to read past - # the end of the output and, thus, the status never gets checked - if num == 10: - break - - -if __name__ == '__main__': - unittest.main()
diff --git a/build/android/devil/utils/file_utils.py b/build/android/devil/utils/file_utils.py deleted file mode 100644 index dc5a9ef..0000000 --- a/build/android/devil/utils/file_utils.py +++ /dev/null
@@ -1,31 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import os - - -def MergeFiles(dest_file, source_files): - """Merge list of files into single destination file. - - Args: - dest_file: File to be written to. - source_files: List of files to be merged. Will be merged in the order they - appear in the list. - """ - if not os.path.exists(os.path.dirname(dest_file)): - os.makedirs(os.path.dirname(dest_file)) - try: - with open(dest_file, 'w') as dest_f: - for source_file in source_files: - with open(source_file, 'r') as source_f: - dest_f.write(source_f.read()) - except Exception as e: # pylint: disable=broad-except - # Something went wrong when creating dest_file. Cleaning up. - try: - os.remove(dest_file) - except OSError: - pass - raise e - -
diff --git a/build/android/devil/utils/geometry.py b/build/android/devil/utils/geometry.py deleted file mode 100644 index da21770..0000000 --- a/build/android/devil/utils/geometry.py +++ /dev/null
@@ -1,75 +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. - -"""Objects for convenient manipulation of points and other surface areas.""" - -import collections - - -class Point(collections.namedtuple('Point', ['x', 'y'])): - """Object to represent an (x, y) point on a surface. - - Args: - x, y: Two numeric coordinates that define the point. - """ - __slots__ = () - - def __str__(self): - """Get a useful string representation of the object.""" - return '(%s, %s)' % (self.x, self.y) - - def __add__(self, other): - """Sum of two points, e.g. p + q.""" - if isinstance(other, Point): - return Point(self.x + other.x, self.y + other.y) - else: - return NotImplemented - - def __mul__(self, factor): - """Multiplication on the right is not implemented.""" - # This overrides the default behaviour of a tuple multiplied by a constant - # on the right, which does not make sense for a Point. - return NotImplemented - - def __rmul__(self, factor): - """Multiply a point by a scalar factor on the left, e.g. 2 * p.""" - return Point(factor * self.x, factor * self.y) - - -class Rectangle( - collections.namedtuple('Rectangle', ['top_left', 'bottom_right'])): - """Object to represent a rectangle on a surface. - - Args: - top_left: A pair of (left, top) coordinates. Might be given as a Point - or as a two-element sequence (list, tuple, etc.). - bottom_right: A pair (right, bottom) coordinates. - """ - __slots__ = () - - def __new__(cls, top_left, bottom_right): - if not isinstance(top_left, Point): - top_left = Point(*top_left) - if not isinstance(bottom_right, Point): - bottom_right = Point(*bottom_right) - return super(Rectangle, cls).__new__(cls, top_left, bottom_right) - - def __str__(self): - """Get a useful string representation of the object.""" - return '[%s, %s]' % (self.top_left, self.bottom_right) - - @property - def center(self): - """Get the point at the center of the rectangle.""" - return 0.5 * (self.top_left + self.bottom_right) - - @classmethod - def FromDict(cls, d): - """Create a rectangle object from a dictionary. - - Args: - d: A dictionary (or mapping) of the form, e.g., {'top': 0, 'left': 0, - 'bottom': 1, 'right': 1}. - """ - return cls(Point(d['left'], d['top']), Point(d['right'], d['bottom']))
diff --git a/build/android/devil/utils/geometry_test.py b/build/android/devil/utils/geometry_test.py deleted file mode 100644 index f6ee76c4..0000000 --- a/build/android/devil/utils/geometry_test.py +++ /dev/null
@@ -1,58 +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. - -"""Tests for the geometry module.""" - -import unittest - -from devil.utils import geometry as g - - -class PointTest(unittest.TestCase): - def testStr(self): - p = g.Point(1, 2) - self.assertEquals(str(p), '(1, 2)') - - def testAdd(self): - p = g.Point(1, 2) - q = g.Point(3, 4) - r = g.Point(4, 6) - self.assertEquals(p + q, r) - - def testAdd_TypeErrorWithInvalidOperands(self): - # pylint: disable=pointless-statement - p = g.Point(1, 2) - with self.assertRaises(TypeError): - p + 4 # Can't add point and scalar. - with self.assertRaises(TypeError): - 4 + p # Can't add scalar and point. - - def testMult(self): - p = g.Point(1, 2) - r = g.Point(2, 4) - self.assertEquals(2 * p, r) # Multiply by scalar on the left. - - def testMult_TypeErrorWithInvalidOperands(self): - # pylint: disable=pointless-statement - p = g.Point(1, 2) - q = g.Point(2, 4) - with self.assertRaises(TypeError): - p * q # Can't multiply points. - with self.assertRaises(TypeError): - p * 4 # Can't multiply by a scalar on the right. - -class RectangleTest(unittest.TestCase): - def testStr(self): - r = g.Rectangle(g.Point(0, 1), g.Point(2, 3)) - self.assertEquals(str(r), '[(0, 1), (2, 3)]') - - def testCenter(self): - r = g.Rectangle(g.Point(0, 1), g.Point(2, 3)) - c = g.Point(1, 2) - self.assertEquals(r.center, c) - - def testFromJson(self): - r1 = g.Rectangle(g.Point(0, 1), g.Point(2, 3)) - r2 = g.Rectangle.FromDict({'top': 1, 'left': 0, 'bottom': 3, 'right': 2}) - self.assertEquals(r1, r2)
diff --git a/build/android/devil/utils/host_utils.py b/build/android/devil/utils/host_utils.py deleted file mode 100644 index 580721f..0000000 --- a/build/android/devil/utils/host_utils.py +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import os - - -def GetRecursiveDiskUsage(path): - """Returns the disk usage in bytes of |path|. Similar to `du -sb |path|`.""" - running_size = os.path.getsize(path) - if os.path.isdir(path): - for root, dirs, files in os.walk(path): - running_size += sum([os.path.getsize(os.path.join(root, f)) - for f in files + dirs]) - return running_size -
diff --git a/build/android/devil/utils/lazy/__init__.py b/build/android/devil/utils/lazy/__init__.py deleted file mode 100644 index 3cc56c0a..0000000 --- a/build/android/devil/utils/lazy/__init__.py +++ /dev/null
@@ -1,5 +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. - -from devil.utils.lazy.weak_constant import WeakConstant
diff --git a/build/android/devil/utils/lazy/weak_constant.py b/build/android/devil/utils/lazy/weak_constant.py deleted file mode 100644 index 3558f29..0000000 --- a/build/android/devil/utils/lazy/weak_constant.py +++ /dev/null
@@ -1,29 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import threading - - -class WeakConstant(object): - """A thread-safe, lazily initialized object. - - This does not support modification after initialization. The intended - constant nature of the object is not enforced, though, hence the "weak". - """ - - def __init__(self, initializer): - self._initialized = False - self._initializer = initializer - self._lock = threading.Lock() - self._val = None - - def read(self): - """Get the object, creating it if necessary.""" - if self._initialized: - return self._val - with self._lock: - if not self._initialized: - self._val = self._initializer() - self._initialized = True - return self._val
diff --git a/build/android/devil/utils/lsusb.py b/build/android/devil/utils/lsusb.py deleted file mode 100644 index 6a6213e..0000000 --- a/build/android/devil/utils/lsusb.py +++ /dev/null
@@ -1,106 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import logging -import re - -from devil.utils import cmd_helper - -_COULDNT_OPEN_ERROR_RE = re.compile(r'Couldn\'t open device.*') -_INDENTATION_RE = re.compile(r'^( *)') -_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}):') -_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$') -_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$') - - -def _lsusbv_on_device(bus_id, dev_id): - """Calls lsusb -v on device.""" - _, raw_output = cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb', '-v', '-s', '%s:%s' % (bus_id, dev_id)], timeout=10) - - device = {'bus': bus_id, 'device': dev_id} - depth_stack = [device] - - # TODO(jbudorick): Add documentation for parsing. - for line in raw_output.splitlines(): - # Ignore blank lines. - if not line: - continue - # Filter out error mesage about opening device. - if _COULDNT_OPEN_ERROR_RE.match(line): - continue - # Find start of device information. - m = _LSUSB_BUS_DEVICE_RE.match(line) - if m: - if m.group(1) != bus_id: - logging.warning( - 'Expected bus_id value: %r, seen %r', bus_id, m.group(1)) - if m.group(2) != dev_id: - logging.warning( - 'Expected dev_id value: %r, seen %r', dev_id, m.group(2)) - continue - - indent_match = _INDENTATION_RE.match(line) - if not indent_match: - continue - - depth = 1 + len(indent_match.group(1)) / 2 - if depth > len(depth_stack): - logging.error( - 'lsusb parsing error: unexpected indentation: "%s"', line) - continue - - while depth < len(depth_stack): - depth_stack.pop() - - cur = depth_stack[-1] - - m = _LSUSB_GROUP_RE.match(line) - if m: - new_group = {} - cur[m.group(1)] = new_group - depth_stack.append(new_group) - continue - - m = _LSUSB_ENTRY_RE.match(line) - if m: - new_entry = { - '_value': m.group(2), - '_desc': m.group(3), - } - cur[m.group(1)] = new_entry - depth_stack.append(new_entry) - continue - - logging.error('lsusb parsing error: unrecognized line: "%s"', line) - - return device - -def lsusb(): - """Call lsusb and return the parsed output.""" - _, lsusb_list_output = cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb'], timeout=10) - devices = [] - for line in lsusb_list_output.splitlines(): - m = _LSUSB_BUS_DEVICE_RE.match(line) - if m: - bus_num = m.group(1) - dev_num = m.group(2) - try: - devices.append(_lsusbv_on_device(bus_num, dev_num)) - except cmd_helper.TimeoutError: - # Will be blacklisted if it is in expected device file, but times out. - logging.info('lsusb -v %s:%s timed out.', bus_num, dev_num) - - return devices - -def get_lsusb_serial(device): - try: - return device['Device Descriptor']['iSerial']['_desc'] - except KeyError: - return None - -def get_android_devices(): - return [serial for serial in (get_lsusb_serial(d) for d in lsusb()) - if serial]
diff --git a/build/android/devil/utils/lsusb_test.py b/build/android/devil/utils/lsusb_test.py deleted file mode 100755 index 529a4b0..0000000 --- a/build/android/devil/utils/lsusb_test.py +++ /dev/null
@@ -1,249 +0,0 @@ -#!/usr/bin/env python -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests for the cmd_helper module.""" - -import unittest - -from devil import devil_env -from devil.utils import lsusb -from devil.utils import mock_calls - -with devil_env.SysPath(devil_env.PYMOCK_PATH): - import mock # pylint: disable=import-error - -RAW_OUTPUT = """ -Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug) -Device Descriptor: - bLength 18 - bDescriptorType 1 - bcdUSB 2.00 - bDeviceClass 0 (Defined at Interface level) - bDeviceSubClass 0 - bDeviceProtocol 0 - bMaxPacketSize0 64 - idVendor 0x18d1 Google Inc. - idProduct 0x4ee2 Nexus 4 (debug) - bcdDevice 2.28 - iManufacturer 1 LGE - iProduct 2 Nexus 4 - iSerial 3 01d2450ea194a93b - bNumConfigurations 1 - Configuration Descriptor: - bLength 9 - bDescriptorType 2 - wTotalLength 62 - bNumInterfaces 2 - bConfigurationValue 1 - iConfiguration 0 - bmAttributes 0x80 - (Bus Powered) - MaxPower 500mA - Interface Descriptor: - bLength 9 - bDescriptorType 4 - bInterfaceNumber 0 - bAlternateSetting 0 - bNumEndpoints 3 - bInterfaceClass 255 Vendor Specific Class - bInterfaceSubClass 255 Vendor Specific Subclass - bInterfaceProtocol 0 - iInterface 4 MTP - Endpoint Descriptor: - bLength 7 - bDescriptorType 5 - bEndpointAddress 0x81 EP 1 IN - bmAttributes 2 - Transfer Type Bulk - Synch Type None - Usage Type Data - wMaxPacketSize 0x0040 1x 64 bytes - bInterval 0 - Endpoint Descriptor: - bLength 7 - bDescriptorType 5 - bEndpointAddress 0x01 EP 1 OUT - bmAttributes 2 - Transfer Type Bulk - Synch Type None - Usage Type Data - wMaxPacketSize 0x0040 1x 64 bytes - bInterval 0 - Endpoint Descriptor: - bLength 7 - bDescriptorType 5 - bEndpointAddress 0x82 EP 2 IN - bmAttributes 3 - Transfer Type Interrupt - Synch Type None - Usage Type Data - wMaxPacketSize 0x001c 1x 28 bytes - bInterval 6 - Interface Descriptor: - bLength 9 - bDescriptorType 4 - bInterfaceNumber 1 - bAlternateSetting 0 - bNumEndpoints 2 - bInterfaceClass 255 Vendor Specific Class - bInterfaceSubClass 66 - bInterfaceProtocol 1 - iInterface 0 - Endpoint Descriptor: - bLength 7 - bDescriptorType 5 - bEndpointAddress 0x83 EP 3 IN - bmAttributes 2 - Transfer Type Bulk - Synch Type None - Usage Type Data - wMaxPacketSize 0x0040 1x 64 bytes - bInterval 0 - Endpoint Descriptor: - bLength 7 - bDescriptorType 5 - bEndpointAddress 0x02 EP 2 OUT - bmAttributes 2 - Transfer Type Bulk - Synch Type None - Usage Type Data - wMaxPacketSize 0x0040 1x 64 bytes - bInterval 0 -Device Qualifier (for other device speed): - bLength 10 - bDescriptorType 6 - bcdUSB 2.00 - bDeviceClass 0 (Defined at Interface level) - bDeviceSubClass 0 - bDeviceProtocol 0 - bMaxPacketSize0 64 - bNumConfigurations 1 -Device Status: 0x0000 - (Bus Powered) -""" -DEVICE_LIST = 'Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)' - -EXPECTED_RESULT = { - 'device': '007', - 'bus': '003', - 'Device': { - '_value': 'Status:', - '_desc': '0x0000', - '(Bus': { - '_value': 'Powered)', - '_desc': None - } - }, - 'Device Descriptor': { - 'bLength': {'_value': '18', '_desc': None}, - 'bcdDevice': {'_value': '2.28', '_desc': None}, - 'bDeviceSubClass': {'_value': '0', '_desc': None}, - 'idVendor': {'_value': '0x18d1', '_desc': 'Google Inc.'}, - 'bcdUSB': {'_value': '2.00', '_desc': None}, - 'bDeviceProtocol': {'_value': '0', '_desc': None}, - 'bDescriptorType': {'_value': '1', '_desc': None}, - 'Configuration Descriptor': { - 'bLength': {'_value': '9', '_desc': None}, - 'wTotalLength': {'_value': '62', '_desc': None}, - 'bConfigurationValue': {'_value': '1', '_desc': None}, - 'Interface Descriptor': { - 'bLength': {'_value': '9', '_desc': None}, - 'bAlternateSetting': {'_value': '0', '_desc': None}, - 'bInterfaceNumber': {'_value': '1', '_desc': None}, - 'bNumEndpoints': {'_value': '2', '_desc': None}, - 'bDescriptorType': {'_value': '4', '_desc': None}, - 'bInterfaceSubClass': {'_value': '66', '_desc': None}, - 'bInterfaceClass': { - '_value': '255', - '_desc': 'Vendor Specific Class' - }, - 'bInterfaceProtocol': {'_value': '1', '_desc': None}, - 'Endpoint Descriptor': { - 'bLength': {'_value': '7', '_desc': None}, - 'bEndpointAddress': {'_value': '0x02', '_desc': 'EP 2 OUT'}, - 'bInterval': {'_value': '0', '_desc': None}, - 'bDescriptorType': {'_value': '5', '_desc': None}, - 'bmAttributes': { - '_value': '2', - 'Transfer': {'_value': 'Type', '_desc': 'Bulk'}, - 'Usage': {'_value': 'Type', '_desc': 'Data'}, - '_desc': None, - 'Synch': {'_value': 'Type', '_desc': 'None'} - }, - 'wMaxPacketSize': { - '_value': '0x0040', - '_desc': '1x 64 bytes' - } - }, - 'iInterface': {'_value': '0', '_desc': None} - }, - 'bDescriptorType': {'_value': '2', '_desc': None}, - 'iConfiguration': {'_value': '0', '_desc': None}, - 'bmAttributes': { - '_value': '0x80', - '_desc': None, - '(Bus': {'_value': 'Powered)', '_desc': None} - }, - 'bNumInterfaces': {'_value': '2', '_desc': None}, - 'MaxPower': {'_value': '500mA', '_desc': None} - }, - 'iSerial': {'_value': '3', '_desc': '01d2450ea194a93b'}, - 'idProduct': {'_value': '0x4ee2', '_desc': 'Nexus 4 (debug)'}, - 'iManufacturer': {'_value': '1', '_desc': 'LGE'}, - 'bDeviceClass': { - '_value': '0', - '_desc': '(Defined at Interface level)' - }, - 'iProduct': {'_value': '2', '_desc': 'Nexus 4'}, - 'bMaxPacketSize0': {'_value': '64', '_desc': None}, - 'bNumConfigurations': {'_value': '1', '_desc': None} - }, - 'Device Qualifier (for other device speed)': { - 'bLength': {'_value': '10', '_desc': None}, - 'bNumConfigurations': {'_value': '1', '_desc': None}, - 'bDeviceSubClass': {'_value': '0', '_desc': None}, - 'bcdUSB': {'_value': '2.00', '_desc': None}, - 'bDeviceProtocol': {'_value': '0', '_desc': None}, - 'bDescriptorType': {'_value': '6', '_desc': None}, - 'bDeviceClass': { - '_value': '0', - '_desc': '(Defined at Interface level)' - }, - 'bMaxPacketSize0': {'_value': '64', '_desc': None} - } -} - - -class LsusbTest(mock_calls.TestCase): - """Test Lsusb parsing.""" - - def testLsusb(self): - with self.assertCalls( - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb'], timeout=10), (None, DEVICE_LIST)), - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))): - self.assertDictEqual(lsusb.lsusb().pop(), EXPECTED_RESULT) - - def testGetSerial(self): - with self.assertCalls( - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb'], timeout=10), (None, DEVICE_LIST)), - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))): - self.assertEqual(lsusb.get_android_devices(), ['01d2450ea194a93b']) - - def testGetLsusbSerial(self): - with self.assertCalls( - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb'], timeout=10), (None, DEVICE_LIST)), - (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout( - ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))): - out = lsusb.lsusb().pop() - self.assertEqual(lsusb.get_lsusb_serial(out), '01d2450ea194a93b') - - -if __name__ == '__main__': - unittest.main()
diff --git a/build/android/devil/utils/mock_calls.py b/build/android/devil/utils/mock_calls.py deleted file mode 100644 index 61ebb186..0000000 --- a/build/android/devil/utils/mock_calls.py +++ /dev/null
@@ -1,179 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -A test facility to assert call sequences while mocking their behavior. -""" - -import unittest - -from devil import devil_env - -with devil_env.SysPath(devil_env.PYMOCK_PATH): - import mock # pylint: disable=import-error - - -class TestCase(unittest.TestCase): - """Adds assertCalls to TestCase objects.""" - class _AssertCalls(object): - def __init__(self, test_case, expected_calls, watched): - def call_action(pair): - if isinstance(pair, type(mock.call)): - return (pair, None) - else: - return pair - - def do_check(call): - def side_effect(*args, **kwargs): - received_call = call(*args, **kwargs) - self._test_case.assertTrue( - self._expected_calls, - msg=('Unexpected call: %s' % str(received_call))) - expected_call, action = self._expected_calls.pop(0) - self._test_case.assertTrue( - received_call == expected_call, - msg=('Expected call mismatch:\n' - ' expected: %s\n' - ' received: %s\n' - % (str(expected_call), str(received_call)))) - if callable(action): - return action(*args, **kwargs) - else: - return action - return side_effect - - self._test_case = test_case - self._expected_calls = [call_action(pair) for pair in expected_calls] - watched = watched.copy() # do not pollute the caller's dict - watched.update((call.parent.name, call.parent) - for call, _ in self._expected_calls) - self._patched = [test_case.patch_call(call, side_effect=do_check(call)) - for call in watched.itervalues()] - - def __enter__(self): - for patch in self._patched: - patch.__enter__() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - for patch in self._patched: - patch.__exit__(exc_type, exc_val, exc_tb) - if exc_type is None: - missing = ''.join(' expected: %s\n' % str(call) - for call, _ in self._expected_calls) - self._test_case.assertFalse( - missing, - msg='Expected calls not found:\n' + missing) - - def __init__(self, *args, **kwargs): - super(TestCase, self).__init__(*args, **kwargs) - self.call = mock.call.self - self._watched = {} - - def call_target(self, call): - """Resolve a self.call instance to the target it represents. - - Args: - call: a self.call instance, e.g. self.call.adb.Shell - - Returns: - The target object represented by the call, e.g. self.adb.Shell - - Raises: - ValueError if the path of the call does not start with "self", i.e. the - target of the call is external to the self object. - AttributeError if the path of the call does not specify a valid - chain of attributes (without any calls) starting from "self". - """ - path = call.name.split('.') - if path.pop(0) != 'self': - raise ValueError("Target %r outside of 'self' object" % call.name) - target = self - for attr in path: - target = getattr(target, attr) - return target - - def patch_call(self, call, **kwargs): - """Patch the target of a mock.call instance. - - Args: - call: a mock.call instance identifying a target to patch - Extra keyword arguments are processed by mock.patch - - Returns: - A context manager to mock/unmock the target of the call - """ - if call.name.startswith('self.'): - target = self.call_target(call.parent) - _, attribute = call.name.rsplit('.', 1) - if (hasattr(type(target), attribute) - and isinstance(getattr(type(target), attribute), property)): - return mock.patch.object( - type(target), attribute, new_callable=mock.PropertyMock, **kwargs) - else: - return mock.patch.object(target, attribute, **kwargs) - else: - return mock.patch(call.name, **kwargs) - - def watchCalls(self, calls): - """Add calls to the set of watched calls. - - Args: - calls: a sequence of mock.call instances identifying targets to watch - """ - self._watched.update((call.name, call) for call in calls) - - def watchMethodCalls(self, call, ignore=None): - """Watch all public methods of the target identified by a self.call. - - Args: - call: a self.call instance indetifying an object - ignore: a list of public methods to ignore when watching for calls - """ - target = self.call_target(call) - if ignore is None: - ignore = [] - self.watchCalls(getattr(call, method) - for method in dir(target.__class__) - if not method.startswith('_') and not method in ignore) - - def clearWatched(self): - """Clear the set of watched calls.""" - self._watched = {} - - def assertCalls(self, *calls): - """A context manager to assert that a sequence of calls is made. - - During the assertion, a number of functions and methods will be "watched", - and any calls made to them is expected to appear---in the exact same order, - and with the exact same arguments---as specified by the argument |calls|. - - By default, the targets of all expected calls are watched. Further targets - to watch may be added using watchCalls and watchMethodCalls. - - Optionaly, each call may be accompanied by an action. If the action is a - (non-callable) value, this value will be used as the return value given to - the caller when the matching call is found. Alternatively, if the action is - a callable, the action will be then called with the same arguments as the - intercepted call, so that it can provide a return value or perform other - side effects. If the action is missing, a return value of None is assumed. - - Note that mock.Mock objects are often convenient to use as a callable - action, e.g. to raise exceptions or return other objects which are - themselves callable. - - Args: - calls: each argument is either a pair (expected_call, action) or just an - expected_call, where expected_call is a mock.call instance. - - Raises: - AssertionError if the watched targets do not receive the exact sequence - of calls specified. Missing calls, extra calls, and calls with - mismatching arguments, all cause the assertion to fail. - """ - return self._AssertCalls(self, calls, self._watched) - - def assertCall(self, call, action=None): - return self.assertCalls((call, action)) -
diff --git a/build/android/devil/utils/mock_calls_test.py b/build/android/devil/utils/mock_calls_test.py deleted file mode 100755 index b04fb58..0000000 --- a/build/android/devil/utils/mock_calls_test.py +++ /dev/null
@@ -1,171 +0,0 @@ -#!/usr/bin/env python -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -Unit tests for the contents of mock_calls.py. -""" - -import logging -import os -import unittest - -from devil import devil_env -from devil.android.sdk import version_codes -from devil.utils import mock_calls - -with devil_env.SysPath(devil_env.config.LocalPath('pymock')): - import mock # pylint: disable=import-error - - -class _DummyAdb(object): - def __str__(self): - return '0123456789abcdef' - - def Push(self, host_path, device_path): - logging.debug('(device %s) pushing %r to %r', self, host_path, device_path) - - def IsOnline(self): - logging.debug('(device %s) checking device online', self) - return True - - def Shell(self, cmd): - logging.debug('(device %s) running command %r', self, cmd) - return "nice output\n" - - def Reboot(self): - logging.debug('(device %s) rebooted!', self) - - @property - def build_version_sdk(self): - logging.debug('(device %s) getting build_version_sdk', self) - return version_codes.LOLLIPOP - - -class TestCaseWithAssertCallsTest(mock_calls.TestCase): - def setUp(self): - self.adb = _DummyAdb() - - def ShellError(self): - def action(cmd): - raise ValueError('(device %s) command %r is not nice' % (self.adb, cmd)) - return action - - def get_answer(self): - logging.debug("called 'get_answer' of %r object", self) - return 42 - - def echo(self, thing): - logging.debug("called 'echo' of %r object", self) - return thing - - def testCallTarget_succeds(self): - self.assertEquals(self.adb.Shell, - self.call_target(self.call.adb.Shell)) - - def testCallTarget_failsExternal(self): - with self.assertRaises(ValueError): - self.call_target(mock.call.sys.getcwd) - - def testCallTarget_failsUnknownAttribute(self): - with self.assertRaises(AttributeError): - self.call_target(self.call.adb.Run) - - def testCallTarget_failsIntermediateCalls(self): - with self.assertRaises(AttributeError): - self.call_target(self.call.adb.RunShell('cmd').append) - - def testPatchCall_method(self): - self.assertEquals(42, self.get_answer()) - with self.patch_call(self.call.get_answer, return_value=123): - self.assertEquals(123, self.get_answer()) - self.assertEquals(42, self.get_answer()) - - def testPatchCall_attribute_method(self): - with self.patch_call(self.call.adb.Shell, return_value='hello'): - self.assertEquals('hello', self.adb.Shell('echo hello')) - - def testPatchCall_global(self): - with self.patch_call(mock.call.os.getcwd, return_value='/some/path'): - self.assertEquals('/some/path', os.getcwd()) - - def testPatchCall_withSideEffect(self): - with self.patch_call(self.call.adb.Shell, side_effect=ValueError): - with self.assertRaises(ValueError): - self.adb.Shell('echo hello') - - def testPatchCall_property(self): - self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk) - with self.patch_call( - self.call.adb.build_version_sdk, - return_value=version_codes.KITKAT): - self.assertEquals(version_codes.KITKAT, self.adb.build_version_sdk) - self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk) - - def testAssertCalls_succeeds_simple(self): - self.assertEquals(42, self.get_answer()) - with self.assertCall(self.call.get_answer(), 123): - self.assertEquals(123, self.get_answer()) - self.assertEquals(42, self.get_answer()) - - def testAssertCalls_succeeds_multiple(self): - with self.assertCalls( - (mock.call.os.getcwd(), '/some/path'), - (self.call.echo('hello'), 'hello'), - (self.call.get_answer(), 11), - self.call.adb.Push('this_file', 'that_file'), - (self.call.get_answer(), 12)): - self.assertEquals(os.getcwd(), '/some/path') - self.assertEquals('hello', self.echo('hello')) - self.assertEquals(11, self.get_answer()) - self.adb.Push('this_file', 'that_file') - self.assertEquals(12, self.get_answer()) - - def testAsserCalls_succeeds_withAction(self): - with self.assertCall( - self.call.adb.Shell('echo hello'), self.ShellError()): - with self.assertRaises(ValueError): - self.adb.Shell('echo hello') - - def testAssertCalls_fails_tooManyCalls(self): - with self.assertRaises(AssertionError): - with self.assertCalls(self.call.adb.IsOnline()): - self.adb.IsOnline() - self.adb.IsOnline() - - def testAssertCalls_fails_tooFewCalls(self): - with self.assertRaises(AssertionError): - with self.assertCalls(self.call.adb.IsOnline()): - pass - - def testAssertCalls_succeeds_extraCalls(self): - # we are not watching Reboot, so the assertion succeeds - with self.assertCalls(self.call.adb.IsOnline()): - self.adb.IsOnline() - self.adb.Reboot() - - def testAssertCalls_fails_extraCalls(self): - self.watchCalls([self.call.adb.Reboot]) - # this time we are also watching Reboot, so the assertion fails - with self.assertRaises(AssertionError): - with self.assertCalls(self.call.adb.IsOnline()): - self.adb.IsOnline() - self.adb.Reboot() - - def testAssertCalls_succeeds_NoCalls(self): - self.watchMethodCalls(self.call.adb) # we are watching all adb methods - with self.assertCalls(): - pass - - def testAssertCalls_fails_NoCalls(self): - self.watchMethodCalls(self.call.adb) - with self.assertRaises(AssertionError): - with self.assertCalls(): - self.adb.IsOnline() - - -if __name__ == '__main__': - logging.getLogger().setLevel(logging.DEBUG) - unittest.main(verbosity=2) -
diff --git a/build/android/devil/utils/parallelizer.py b/build/android/devil/utils/parallelizer.py deleted file mode 100644 index bac5b245..0000000 --- a/build/android/devil/utils/parallelizer.py +++ /dev/null
@@ -1,242 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" Wrapper that allows method execution in parallel. - -This class wraps a list of objects of the same type, emulates their -interface, and executes any functions called on the objects in parallel -in ReraiserThreads. - -This means that, given a list of objects: - - class Foo: - def __init__(self): - self.baz = Baz() - - def bar(self, my_param): - // do something - - list_of_foos = [Foo(1), Foo(2), Foo(3)] - -we can take a sequential operation on that list of objects: - - for f in list_of_foos: - f.bar('Hello') - -and run it in parallel across all of the objects: - - Parallelizer(list_of_foos).bar('Hello') - -It can also handle (non-method) attributes of objects, so that this: - - for f in list_of_foos: - f.baz.myBazMethod() - -can be run in parallel with: - - Parallelizer(list_of_foos).baz.myBazMethod() - -Because it emulates the interface of the wrapped objects, a Parallelizer -can be passed to a method or function that takes objects of that type: - - def DoesSomethingWithFoo(the_foo): - the_foo.bar('Hello') - the_foo.bar('world') - the_foo.baz.myBazMethod - - DoesSomethingWithFoo(Parallelizer(list_of_foos)) - -Note that this class spins up a thread for each object. Using this class -to parallelize operations that are already fast will incur a net performance -penalty. - -""" -# pylint: disable=protected-access - -from devil.utils import reraiser_thread -from devil.utils import watchdog_timer - -_DEFAULT_TIMEOUT = 30 -_DEFAULT_RETRIES = 3 - - -class Parallelizer(object): - """Allows parallel execution of method calls across a group of objects.""" - - def __init__(self, objs): - assert (objs is not None and len(objs) > 0), ( - "Passed empty list to 'Parallelizer'") - self._orig_objs = objs - self._objs = objs - - def __getattr__(self, name): - """Emulate getting the |name| attribute of |self|. - - Args: - name: The name of the attribute to retrieve. - Returns: - A Parallelizer emulating the |name| attribute of |self|. - """ - self.pGet(None) - - r = type(self)(self._orig_objs) - r._objs = [getattr(o, name) for o in self._objs] - return r - - def __getitem__(self, index): - """Emulate getting the value of |self| at |index|. - - Returns: - A Parallelizer emulating the value of |self| at |index|. - """ - self.pGet(None) - - r = type(self)(self._orig_objs) - r._objs = [o[index] for o in self._objs] - return r - - def __call__(self, *args, **kwargs): - """Emulate calling |self| with |args| and |kwargs|. - - Note that this call is asynchronous. Call pFinish on the return value to - block until the call finishes. - - Returns: - A Parallelizer wrapping the ReraiserThreadGroup running the call in - parallel. - Raises: - AttributeError if the wrapped objects aren't callable. - """ - self.pGet(None) - - if not self._objs: - raise AttributeError('Nothing to call.') - for o in self._objs: - if not callable(o): - raise AttributeError("'%s' is not callable" % o.__name__) - - r = type(self)(self._orig_objs) - r._objs = reraiser_thread.ReraiserThreadGroup( - [reraiser_thread.ReraiserThread( - o, args=args, kwargs=kwargs, - name='%s.%s' % (str(d), o.__name__)) - for d, o in zip(self._orig_objs, self._objs)]) - r._objs.StartAll() # pylint: disable=W0212 - return r - - def pFinish(self, timeout): - """Finish any outstanding asynchronous operations. - - Args: - timeout: The maximum number of seconds to wait for an individual - result to return, or None to wait forever. - Returns: - self, now emulating the return values. - """ - self._assertNoShadow('pFinish') - if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup): - self._objs.JoinAll() - self._objs = self._objs.GetAllReturnValues( - watchdog_timer.WatchdogTimer(timeout)) - return self - - def pGet(self, timeout): - """Get the current wrapped objects. - - Args: - timeout: Same as |pFinish|. - Returns: - A list of the results, in order of the provided devices. - Raises: - Any exception raised by any of the called functions. - """ - self._assertNoShadow('pGet') - self.pFinish(timeout) - return self._objs - - def pMap(self, f, *args, **kwargs): - """Map a function across the current wrapped objects in parallel. - - This calls f(o, *args, **kwargs) for each o in the set of wrapped objects. - - Note that this call is asynchronous. Call pFinish on the return value to - block until the call finishes. - - Args: - f: The function to call. - args: The positional args to pass to f. - kwargs: The keyword args to pass to f. - Returns: - A Parallelizer wrapping the ReraiserThreadGroup running the map in - parallel. - """ - self._assertNoShadow('pMap') - r = type(self)(self._orig_objs) - r._objs = reraiser_thread.ReraiserThreadGroup( - [reraiser_thread.ReraiserThread( - f, args=tuple([o] + list(args)), kwargs=kwargs, - name='%s(%s)' % (f.__name__, d)) - for d, o in zip(self._orig_objs, self._objs)]) - r._objs.StartAll() # pylint: disable=W0212 - return r - - def _assertNoShadow(self, attr_name): - """Ensures that |attr_name| isn't shadowing part of the wrapped obejcts. - - If the wrapped objects _do_ have an |attr_name| attribute, it will be - inaccessible to clients. - - Args: - attr_name: The attribute to check. - Raises: - AssertionError if the wrapped objects have an attribute named 'attr_name' - or '_assertNoShadow'. - """ - if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup): - assert not hasattr(self._objs, '_assertNoShadow') - assert not hasattr(self._objs, attr_name) - else: - assert not any(hasattr(o, '_assertNoShadow') for o in self._objs) - assert not any(hasattr(o, attr_name) for o in self._objs) - - -class SyncParallelizer(Parallelizer): - """A Parallelizer that blocks on function calls.""" - - #override - def __call__(self, *args, **kwargs): - """Emulate calling |self| with |args| and |kwargs|. - - Note that this call is synchronous. - - Returns: - A Parallelizer emulating the value returned from calling |self| with - |args| and |kwargs|. - Raises: - AttributeError if the wrapped objects aren't callable. - """ - r = super(SyncParallelizer, self).__call__(*args, **kwargs) - r.pFinish(None) - return r - - #override - def pMap(self, f, *args, **kwargs): - """Map a function across the current wrapped objects in parallel. - - This calls f(o, *args, **kwargs) for each o in the set of wrapped objects. - - Note that this call is synchronous. - - Args: - f: The function to call. - args: The positional args to pass to f. - kwargs: The keyword args to pass to f. - Returns: - A Parallelizer wrapping the ReraiserThreadGroup running the map in - parallel. - """ - r = super(SyncParallelizer, self).pMap(f, *args, **kwargs) - r.pFinish(None) - return r -
diff --git a/build/android/devil/utils/parallelizer_test.py b/build/android/devil/utils/parallelizer_test.py deleted file mode 100644 index 0589a04..0000000 --- a/build/android/devil/utils/parallelizer_test.py +++ /dev/null
@@ -1,166 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unit tests for the contents of parallelizer.py.""" - -# pylint: disable=W0212 -# pylint: disable=W0613 - -import os -import tempfile -import time -import unittest - -from devil.utils import parallelizer - - -class ParallelizerTestObject(object): - """Class used to test parallelizer.Parallelizer.""" - - parallel = parallelizer.Parallelizer - - def __init__(self, thing, completion_file_name=None): - self._thing = thing - self._completion_file_name = completion_file_name - self.helper = ParallelizerTestObjectHelper(thing) - - @staticmethod - def doReturn(what): - return what - - @classmethod - def doRaise(cls, what): - raise what - - def doSetTheThing(self, new_thing): - self._thing = new_thing - - def doReturnTheThing(self): - return self._thing - - def doRaiseTheThing(self): - raise self._thing - - def doRaiseIfExceptionElseSleepFor(self, sleep_duration): - if isinstance(self._thing, Exception): - raise self._thing - time.sleep(sleep_duration) - self._write_completion_file() - return self._thing - - def _write_completion_file(self): - if self._completion_file_name and len(self._completion_file_name): - with open(self._completion_file_name, 'w+b') as completion_file: - completion_file.write('complete') - - def __getitem__(self, index): - return self._thing[index] - - def __str__(self): - return type(self).__name__ - - -class ParallelizerTestObjectHelper(object): - - def __init__(self, thing): - self._thing = thing - - def doReturnStringThing(self): - return str(self._thing) - - -class ParallelizerTest(unittest.TestCase): - - def testInitWithNone(self): - with self.assertRaises(AssertionError): - parallelizer.Parallelizer(None) - - def testInitEmptyList(self): - with self.assertRaises(AssertionError): - parallelizer.Parallelizer([]) - - def testMethodCall(self): - test_data = ['abc_foo', 'def_foo', 'ghi_foo'] - expected = ['abc_bar', 'def_bar', 'ghi_bar'] - r = parallelizer.Parallelizer(test_data).replace('_foo', '_bar').pGet(0.1) - self.assertEquals(expected, r) - - def testMutate(self): - devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)] - self.assertTrue(all(d.doReturnTheThing() for d in devices)) - ParallelizerTestObject.parallel(devices).doSetTheThing(False).pFinish(1) - self.assertTrue(not any(d.doReturnTheThing() for d in devices)) - - def testAllReturn(self): - devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)] - results = ParallelizerTestObject.parallel( - devices).doReturnTheThing().pGet(1) - self.assertTrue(isinstance(results, list)) - self.assertEquals(10, len(results)) - self.assertTrue(all(results)) - - def testAllRaise(self): - devices = [ParallelizerTestObject(Exception('thing %d' % i)) - for i in xrange(0, 10)] - p = ParallelizerTestObject.parallel(devices).doRaiseTheThing() - with self.assertRaises(Exception): - p.pGet(1) - - def testOneFailOthersComplete(self): - parallel_device_count = 10 - exception_index = 7 - exception_msg = 'thing %d' % exception_index - - try: - completion_files = [tempfile.NamedTemporaryFile(delete=False) - for _ in xrange(0, parallel_device_count)] - devices = [ - ParallelizerTestObject( - i if i != exception_index else Exception(exception_msg), - completion_files[i].name) - for i in xrange(0, parallel_device_count)] - for f in completion_files: - f.close() - p = ParallelizerTestObject.parallel(devices) - with self.assertRaises(Exception) as e: - p.doRaiseIfExceptionElseSleepFor(2).pGet(3) - self.assertTrue(exception_msg in str(e.exception)) - for i in xrange(0, parallel_device_count): - with open(completion_files[i].name) as f: - if i == exception_index: - self.assertEquals('', f.read()) - else: - self.assertEquals('complete', f.read()) - finally: - for f in completion_files: - os.remove(f.name) - - def testReusable(self): - devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)] - p = ParallelizerTestObject.parallel(devices) - results = p.doReturn(True).pGet(1) - self.assertTrue(all(results)) - results = p.doReturn(True).pGet(1) - self.assertTrue(all(results)) - with self.assertRaises(Exception): - results = p.doRaise(Exception('reusableTest')).pGet(1) - - def testContained(self): - devices = [ParallelizerTestObject(i) for i in xrange(0, 10)] - results = (ParallelizerTestObject.parallel(devices).helper - .doReturnStringThing().pGet(1)) - self.assertTrue(isinstance(results, list)) - self.assertEquals(10, len(results)) - for i in xrange(0, 10): - self.assertEquals(str(i), results[i]) - - def testGetItem(self): - devices = [ParallelizerTestObject(range(i, i+10)) for i in xrange(0, 10)] - results = ParallelizerTestObject.parallel(devices)[9].pGet(1) - self.assertEquals(range(9, 19), results) - - -if __name__ == '__main__': - unittest.main(verbosity=2) -
diff --git a/build/android/devil/utils/reraiser_thread.py b/build/android/devil/utils/reraiser_thread.py deleted file mode 100644 index e108fc75..0000000 --- a/build/android/devil/utils/reraiser_thread.py +++ /dev/null
@@ -1,228 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Thread and ThreadGroup that reraise exceptions on the main thread.""" -# pylint: disable=W0212 - -import logging -import sys -import threading -import time -import traceback - -from devil.utils import watchdog_timer - - -class TimeoutError(Exception): - """Module-specific timeout exception.""" - pass - - -def LogThreadStack(thread, error_log_func=logging.critical): - """Log the stack for the given thread. - - Args: - thread: a threading.Thread instance. - error_log_func: Logging function when logging errors. - """ - stack = sys._current_frames()[thread.ident] - error_log_func('*' * 80) - error_log_func('Stack dump for thread %r', thread.name) - error_log_func('*' * 80) - for filename, lineno, name, line in traceback.extract_stack(stack): - error_log_func('File: "%s", line %d, in %s', filename, lineno, name) - if line: - error_log_func(' %s', line.strip()) - error_log_func('*' * 80) - - -class ReraiserThread(threading.Thread): - """Thread class that can reraise exceptions.""" - - def __init__(self, func, args=None, kwargs=None, name=None): - """Initialize thread. - - Args: - func: callable to call on a new thread. - args: list of positional arguments for callable, defaults to empty. - kwargs: dictionary of keyword arguments for callable, defaults to empty. - name: thread name, defaults to Thread-N. - """ - if not name and func.__name__ != '<lambda>': - name = func.__name__ - super(ReraiserThread, self).__init__(name=name) - if not args: - args = [] - if not kwargs: - kwargs = {} - self.daemon = True - self._func = func - self._args = args - self._kwargs = kwargs - self._ret = None - self._exc_info = None - self._thread_group = None - - def ReraiseIfException(self): - """Reraise exception if an exception was raised in the thread.""" - if self._exc_info: - raise self._exc_info[0], self._exc_info[1], self._exc_info[2] - - def GetReturnValue(self): - """Reraise exception if present, otherwise get the return value.""" - self.ReraiseIfException() - return self._ret - - #override - def run(self): - """Overrides Thread.run() to add support for reraising exceptions.""" - try: - self._ret = self._func(*self._args, **self._kwargs) - except: # pylint: disable=W0702 - self._exc_info = sys.exc_info() - - -class ReraiserThreadGroup(object): - """A group of ReraiserThread objects.""" - - def __init__(self, threads=None): - """Initialize thread group. - - Args: - threads: a list of ReraiserThread objects; defaults to empty. - """ - self._threads = [] - # Set when a thread from one group has called JoinAll on another. It is used - # to detect when a there is a TimeoutRetryThread active that links to the - # current thread. - self.blocked_parent_thread_group = None - if threads: - for thread in threads: - self.Add(thread) - - def Add(self, thread): - """Add a thread to the group. - - Args: - thread: a ReraiserThread object. - """ - assert thread._thread_group is None - thread._thread_group = self - self._threads.append(thread) - - def StartAll(self, will_block=False): - """Start all threads. - - Args: - will_block: Whether the calling thread will subsequently block on this - thread group. Causes the active ReraiserThreadGroup (if there is one) - to be marked as blocking on this thread group. - """ - if will_block: - # Multiple threads blocking on the same outer thread should not happen in - # practice. - assert not self.blocked_parent_thread_group - self.blocked_parent_thread_group = CurrentThreadGroup() - for thread in self._threads: - thread.start() - - def _JoinAll(self, watcher=None, timeout=None): - """Join all threads without stack dumps. - - Reraises exceptions raised by the child threads and supports breaking - immediately on exceptions raised on the main thread. - - Args: - watcher: Watchdog object providing the thread timeout. If none is - provided, the thread will never be timed out. - timeout: An optional number of seconds to wait before timing out the join - operation. This will not time out the threads. - """ - if watcher is None: - watcher = watchdog_timer.WatchdogTimer(None) - alive_threads = self._threads[:] - end_time = (time.time() + timeout) if timeout else None - try: - while alive_threads and (end_time is None or end_time > time.time()): - for thread in alive_threads[:]: - if watcher.IsTimedOut(): - raise TimeoutError('Timed out waiting for %d of %d threads.' % - (len(alive_threads), len(self._threads))) - # Allow the main thread to periodically check for interrupts. - thread.join(0.1) - if not thread.isAlive(): - alive_threads.remove(thread) - # All threads are allowed to complete before reraising exceptions. - for thread in self._threads: - thread.ReraiseIfException() - finally: - self.blocked_parent_thread_group = None - - def IsAlive(self): - """Check whether any of the threads are still alive. - - Returns: - Whether any of the threads are still alive. - """ - return any(t.isAlive() for t in self._threads) - - def JoinAll(self, watcher=None, timeout=None, - error_log_func=logging.critical): - """Join all threads. - - Reraises exceptions raised by the child threads and supports breaking - immediately on exceptions raised on the main thread. Unfinished threads' - stacks will be logged on watchdog timeout. - - Args: - watcher: Watchdog object providing the thread timeout. If none is - provided, the thread will never be timed out. - timeout: An optional number of seconds to wait before timing out the join - operation. This will not time out the threads. - error_log_func: Logging function when logging errors. - """ - try: - self._JoinAll(watcher, timeout) - except TimeoutError: - error_log_func('Timed out. Dumping threads.') - for thread in (t for t in self._threads if t.isAlive()): - LogThreadStack(thread, error_log_func=error_log_func) - raise - - def GetAllReturnValues(self, watcher=None): - """Get all return values, joining all threads if necessary. - - Args: - watcher: same as in |JoinAll|. Only used if threads are alive. - """ - if any([t.isAlive() for t in self._threads]): - self.JoinAll(watcher) - return [t.GetReturnValue() for t in self._threads] - - -def CurrentThreadGroup(): - """Returns the ReraiserThreadGroup that owns the running thread. - - Returns: - The current thread group, otherwise None. - """ - current_thread = threading.current_thread() - if isinstance(current_thread, ReraiserThread): - return current_thread._thread_group # pylint: disable=no-member - return None - - -def RunAsync(funcs, watcher=None): - """Executes the given functions in parallel and returns their results. - - Args: - funcs: List of functions to perform on their own threads. - watcher: Watchdog object providing timeout, by default waits forever. - - Returns: - A list of return values in the order of the given functions. - """ - thread_group = ReraiserThreadGroup(ReraiserThread(f) for f in funcs) - thread_group.StartAll(will_block=True) - return thread_group.GetAllReturnValues(watcher=watcher)
diff --git a/build/android/devil/utils/reraiser_thread_unittest.py b/build/android/devil/utils/reraiser_thread_unittest.py deleted file mode 100644 index dcd243b..0000000 --- a/build/android/devil/utils/reraiser_thread_unittest.py +++ /dev/null
@@ -1,111 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unittests for reraiser_thread.py.""" - -import threading -import unittest - -from devil.utils import reraiser_thread -from devil.utils import watchdog_timer - - -class TestException(Exception): - pass - - -class TestReraiserThread(unittest.TestCase): - """Tests for reraiser_thread.ReraiserThread.""" - def testNominal(self): - result = [None, None] - - def f(a, b=None): - result[0] = a - result[1] = b - - thread = reraiser_thread.ReraiserThread(f, [1], {'b': 2}) - thread.start() - thread.join() - self.assertEqual(result[0], 1) - self.assertEqual(result[1], 2) - - def testRaise(self): - def f(): - raise TestException - - thread = reraiser_thread.ReraiserThread(f) - thread.start() - thread.join() - with self.assertRaises(TestException): - thread.ReraiseIfException() - - -class TestReraiserThreadGroup(unittest.TestCase): - """Tests for reraiser_thread.ReraiserThreadGroup.""" - def testInit(self): - ran = [False] * 5 - def f(i): - ran[i] = True - - group = reraiser_thread.ReraiserThreadGroup( - [reraiser_thread.ReraiserThread(f, args=[i]) for i in range(5)]) - group.StartAll() - group.JoinAll() - for v in ran: - self.assertTrue(v) - - def testAdd(self): - ran = [False] * 5 - def f(i): - ran[i] = True - - group = reraiser_thread.ReraiserThreadGroup() - for i in xrange(5): - group.Add(reraiser_thread.ReraiserThread(f, args=[i])) - group.StartAll() - group.JoinAll() - for v in ran: - self.assertTrue(v) - - def testJoinRaise(self): - def f(): - raise TestException - group = reraiser_thread.ReraiserThreadGroup( - [reraiser_thread.ReraiserThread(f) for _ in xrange(5)]) - group.StartAll() - with self.assertRaises(TestException): - group.JoinAll() - - def testJoinTimeout(self): - def f(): - pass - event = threading.Event() - def g(): - event.wait() - group = reraiser_thread.ReraiserThreadGroup( - [reraiser_thread.ReraiserThread(g), - reraiser_thread.ReraiserThread(f)]) - group.StartAll() - with self.assertRaises(reraiser_thread.TimeoutError): - group.JoinAll(watchdog_timer.WatchdogTimer(0.01)) - event.set() - - -class TestRunAsync(unittest.TestCase): - """Tests for reraiser_thread.RunAsync.""" - def testNoArgs(self): - results = reraiser_thread.RunAsync([]) - self.assertEqual([], results) - - def testOneArg(self): - results = reraiser_thread.RunAsync([lambda: 1]) - self.assertEqual([1], results) - - def testTwoArgs(self): - a, b = reraiser_thread.RunAsync((lambda: 1, lambda: 2)) - self.assertEqual(1, a) - self.assertEqual(2, b) - -if __name__ == '__main__': - unittest.main()
diff --git a/build/android/devil/utils/reset_usb.py b/build/android/devil/utils/reset_usb.py deleted file mode 100755 index 3f3b30a..0000000 --- a/build/android/devil/utils/reset_usb.py +++ /dev/null
@@ -1,100 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import argparse -import fcntl -import logging -import re -import sys - -from devil.android import device_errors -from devil.utils import lsusb -from devil.utils import run_tests_helper - -_INDENTATION_RE = re.compile(r'^( *)') -_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}):') -_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$') -_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$') - -_USBDEVFS_RESET = ord('U') << 8 | 20 - - -def reset_usb(bus, device): - """Reset the USB device with the given bus and device.""" - usb_file_path = '/dev/bus/usb/%03d/%03d' % (bus, device) - with open(usb_file_path, 'w') as usb_file: - logging.debug('fcntl.ioctl(%s, %d)', usb_file_path, _USBDEVFS_RESET) - fcntl.ioctl(usb_file, _USBDEVFS_RESET) - - -def reset_android_usb(serial): - """Reset the USB device for the given Android device.""" - lsusb_info = lsusb.lsusb() - - bus = None - device = None - for device_info in lsusb_info: - device_serial = lsusb.get_lsusb_serial(device_info) - if device_serial == serial: - bus = int(device_info.get('bus')) - device = int(device_info.get('device')) - - if bus and device: - reset_usb(bus, device) - else: - raise device_errors.DeviceUnreachableError( - 'Unable to determine bus or device for device %s' % serial) - - -def reset_all_android_devices(): - """Reset all USB devices that look like an Android device.""" - _reset_all_matching(lambda i: bool(lsusb.get_lsusb_serial(i))) - - -def _reset_all_matching(condition): - lsusb_info = lsusb.lsusb() - for device_info in lsusb_info: - if int(device_info.get('device')) != 1 and condition(device_info): - bus = int(device_info.get('bus')) - device = int(device_info.get('device')) - try: - reset_usb(bus, device) - serial = lsusb.get_lsusb_serial(device_info) - if serial: - logging.info('Reset USB device (bus: %03d, device: %03d, serial: %s)', - bus, device, serial) - else: - logging.info('Reset USB device (bus: %03d, device: %03d)', - bus, device) - except IOError: - logging.error( - 'Failed to reset USB device (bus: %03d, device: %03d)', - bus, device) - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('-v', '--verbose', action='count') - parser.add_argument('-s', '--serial') - parser.add_argument('--bus', type=int) - parser.add_argument('--device', type=int) - args = parser.parse_args() - - run_tests_helper.SetLogLevel(args.verbose) - - if args.serial: - reset_android_usb(args.serial) - elif args.bus and args.device: - reset_usb(args.bus, args.device) - else: - parser.error('Unable to determine target. ' - 'Specify --serial or BOTH --bus and --device.') - - return 0 - - -if __name__ == '__main__': - sys.exit(main()) -
diff --git a/build/android/devil/utils/run_tests_helper.py b/build/android/devil/utils/run_tests_helper.py deleted file mode 100644 index 43f654d..0000000 --- a/build/android/devil/utils/run_tests_helper.py +++ /dev/null
@@ -1,44 +0,0 @@ -# Copyright (c) 2012 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Helper functions common to native, java and host-driven test runners.""" - -import logging -import sys -import time - - -class CustomFormatter(logging.Formatter): - """Custom log formatter.""" - - #override - def __init__(self, fmt='%(threadName)-4s %(message)s'): - # Can't use super() because in older Python versions logging.Formatter does - # not inherit from object. - logging.Formatter.__init__(self, fmt=fmt) - self._creation_time = time.time() - - #override - def format(self, record): - # Can't use super() because in older Python versions logging.Formatter does - # not inherit from object. - msg = logging.Formatter.format(self, record) - if 'MainThread' in msg[:19]: - msg = msg.replace('MainThread', 'Main', 1) - timediff = time.time() - self._creation_time - return '%s %8.3fs %s' % (record.levelname[0], timediff, msg) - - -def SetLogLevel(verbose_count): - """Sets log level as |verbose_count|.""" - log_level = logging.WARNING # Default. - if verbose_count == 1: - log_level = logging.INFO - elif verbose_count >= 2: - log_level = logging.DEBUG - logger = logging.getLogger() - logger.setLevel(log_level) - custom_handler = logging.StreamHandler(sys.stdout) - custom_handler.setFormatter(CustomFormatter()) - logging.getLogger().addHandler(custom_handler)
diff --git a/build/android/devil/utils/timeout_retry.py b/build/android/devil/utils/timeout_retry.py deleted file mode 100644 index e950e11..0000000 --- a/build/android/devil/utils/timeout_retry.py +++ /dev/null
@@ -1,181 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""A utility to run functions with timeouts and retries.""" -# pylint: disable=W0702 - -import logging -import threading -import time -import traceback - -from devil.utils import reraiser_thread -from devil.utils import watchdog_timer - - - -class TimeoutRetryThreadGroup(reraiser_thread.ReraiserThreadGroup): - def __init__(self, timeout, threads=None): - super(TimeoutRetryThreadGroup, self).__init__(threads) - self._watcher = watchdog_timer.WatchdogTimer(timeout) - - def GetWatcher(self): - """Returns the watchdog keeping track of this thread's time.""" - return self._watcher - - def GetElapsedTime(self): - return self._watcher.GetElapsed() - - def GetRemainingTime(self, required=0, msg=None): - """Get the remaining time before the thread times out. - - Useful to send as the |timeout| parameter of async IO operations. - - Args: - required: minimum amount of time that will be required to complete, e.g., - some sleep or IO operation. - msg: error message to show if timing out. - - Returns: - The number of seconds remaining before the thread times out, or None - if the thread never times out. - - Raises: - reraiser_thread.TimeoutError if the remaining time is less than the - required time. - """ - remaining = self._watcher.GetRemaining() - if remaining is not None and remaining < required: - if msg is None: - msg = 'Timeout expired' - if remaining > 0: - msg += (', wait of %.1f secs required but only %.1f secs left' - % (required, remaining)) - raise reraiser_thread.TimeoutError(msg) - return remaining - - -def CurrentTimeoutThreadGroup(): - """Returns the thread group that owns or is blocked on the active thread. - - Returns: - Returns None if no TimeoutRetryThreadGroup is tracking the current thread. - """ - thread_group = reraiser_thread.CurrentThreadGroup() - while thread_group: - if isinstance(thread_group, TimeoutRetryThreadGroup): - return thread_group - thread_group = thread_group.blocked_parent_thread_group - return None - - -def WaitFor(condition, wait_period=5, max_tries=None): - """Wait for a condition to become true. - - Repeatedly call the function condition(), with no arguments, until it returns - a true value. - - If called within a TimeoutRetryThreadGroup, it cooperates nicely with it. - - Args: - condition: function with the condition to check - wait_period: number of seconds to wait before retrying to check the - condition - max_tries: maximum number of checks to make, the default tries forever - or until the TimeoutRetryThreadGroup expires. - - Returns: - The true value returned by the condition, or None if the condition was - not met after max_tries. - - Raises: - reraiser_thread.TimeoutError: if the current thread is a - TimeoutRetryThreadGroup and the timeout expires. - """ - condition_name = condition.__name__ - timeout_thread_group = CurrentTimeoutThreadGroup() - while max_tries is None or max_tries > 0: - result = condition() - if max_tries is not None: - max_tries -= 1 - msg = ['condition', repr(condition_name), 'met' if result else 'not met'] - if timeout_thread_group: - # pylint: disable=no-member - msg.append('(%.1fs)' % timeout_thread_group.GetElapsedTime()) - logging.info(' '.join(msg)) - if result: - return result - if timeout_thread_group: - # pylint: disable=no-member - timeout_thread_group.GetRemainingTime(wait_period, - msg='Timed out waiting for %r' % condition_name) - time.sleep(wait_period) - return None - - -def _LogLastException(thread_name, attempt, max_attempts, log_func): - log_func('*' * 80) - log_func('Exception on thread %s (attempt %d of %d)', thread_name, - attempt, max_attempts) - log_func('*' * 80) - fmt_exc = ''.join(traceback.format_exc()) - for line in fmt_exc.splitlines(): - log_func(line.rstrip()) - log_func('*' * 80) - - -def AlwaysRetry(_exception): - return True - - -def Run(func, timeout, retries, args=None, kwargs=None, desc=None, - error_log_func=logging.critical, retry_if_func=AlwaysRetry): - """Runs the passed function in a separate thread with timeouts and retries. - - Args: - func: the function to be wrapped. - timeout: the timeout in seconds for each try. - retries: the number of retries. - args: list of positional args to pass to |func|. - kwargs: dictionary of keyword args to pass to |func|. - desc: An optional description of |func| used in logging. If omitted, - |func.__name__| will be used. - error_log_func: Logging function when logging errors. - retry_if_func: Unary callable that takes an exception and returns - whether |func| should be retried. Defaults to always retrying. - - Returns: - The return value of func(*args, **kwargs). - """ - if not args: - args = [] - if not kwargs: - kwargs = {} - - num_try = 1 - while True: - thread_name = 'TimeoutThread-%d-for-%s' % (num_try, - threading.current_thread().name) - child_thread = reraiser_thread.ReraiserThread(lambda: func(*args, **kwargs), - name=thread_name) - try: - thread_group = TimeoutRetryThreadGroup(timeout, threads=[child_thread]) - thread_group.StartAll(will_block=True) - while True: - thread_group.JoinAll(watcher=thread_group.GetWatcher(), timeout=60, - error_log_func=error_log_func) - if thread_group.IsAlive(): - logging.info('Still working on %s', desc if desc else func.__name__) - else: - return thread_group.GetAllReturnValues()[0] - except reraiser_thread.TimeoutError as e: - # Timeouts already get their stacks logged. - if num_try > retries or not retry_if_func(e): - raise - # Do not catch KeyboardInterrupt. - except Exception as e: # pylint: disable=broad-except - if num_try > retries or not retry_if_func(e): - raise - _LogLastException(thread_name, num_try, retries + 1, error_log_func) - num_try += 1
diff --git a/build/android/devil/utils/timeout_retry_unittest.py b/build/android/devil/utils/timeout_retry_unittest.py deleted file mode 100755 index f2ceef7d..0000000 --- a/build/android/devil/utils/timeout_retry_unittest.py +++ /dev/null
@@ -1,77 +0,0 @@ -#!/usr/bin/python -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unittests for timeout_and_retry.py.""" - -import logging -import time -import unittest - -from devil.utils import reraiser_thread -from devil.utils import timeout_retry - - -_DEFAULT_TIMEOUT = .1 - - -class TestException(Exception): - pass - - -def _CountTries(tries): - tries[0] += 1 - raise TestException - - -class TestRun(unittest.TestCase): - """Tests for timeout_retry.Run.""" - - def testRun(self): - self.assertTrue(timeout_retry.Run( - lambda x: x, 30, 3, [True], {})) - - def testTimeout(self): - tries = [0] - def _sleep(): - tries[0] += 1 - time.sleep(1) - - self.assertRaises( - reraiser_thread.TimeoutError, timeout_retry.Run, _sleep, .0001, 1, - error_log_func=logging.debug) - self.assertEqual(tries[0], 2) - - def testRetries(self): - tries = [0] - self.assertRaises( - TestException, timeout_retry.Run, lambda: _CountTries(tries), - _DEFAULT_TIMEOUT, 3, error_log_func=logging.debug) - self.assertEqual(tries[0], 4) - - def testNoRetries(self): - tries = [0] - self.assertRaises( - TestException, timeout_retry.Run, lambda: _CountTries(tries), - _DEFAULT_TIMEOUT, 0, error_log_func=logging.debug) - self.assertEqual(tries[0], 1) - - def testReturnValue(self): - self.assertTrue(timeout_retry.Run(lambda: True, _DEFAULT_TIMEOUT, 3)) - - def testCurrentTimeoutThreadGroup(self): - def InnerFunc(): - current_thread_group = timeout_retry.CurrentTimeoutThreadGroup() - self.assertIsNotNone(current_thread_group) - def InnerInnerFunc(): - self.assertEqual(current_thread_group, - timeout_retry.CurrentTimeoutThreadGroup()) - return True - return reraiser_thread.RunAsync((InnerInnerFunc,))[0] - - self.assertTrue(timeout_retry.Run(InnerFunc, _DEFAULT_TIMEOUT, 3)) - - -if __name__ == '__main__': - unittest.main()
diff --git a/build/android/devil/utils/watchdog_timer.py b/build/android/devil/utils/watchdog_timer.py deleted file mode 100644 index 2f4c464..0000000 --- a/build/android/devil/utils/watchdog_timer.py +++ /dev/null
@@ -1,47 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""WatchdogTimer timeout objects.""" - -import time - - -class WatchdogTimer(object): - """A resetable timeout-based watchdog. - - This object is threadsafe. - """ - - def __init__(self, timeout): - """Initializes the watchdog. - - Args: - timeout: The timeout in seconds. If timeout is None it will never timeout. - """ - self._start_time = time.time() - self._timeout = timeout - - def Reset(self): - """Resets the timeout countdown.""" - self._start_time = time.time() - - def GetElapsed(self): - """Returns the elapsed time of the watchdog.""" - return time.time() - self._start_time - - def GetRemaining(self): - """Returns the remaining time of the watchdog.""" - if self._timeout: - return self._timeout - self.GetElapsed() - else: - return None - - def IsTimedOut(self): - """Whether the watchdog has timed out. - - Returns: - True if the watchdog has timed out, False otherwise. - """ - remaining = self.GetRemaining() - return remaining is not None and remaining < 0
diff --git a/build/android/devil/utils/zip_utils.py b/build/android/devil/utils/zip_utils.py deleted file mode 100644 index d799463..0000000 --- a/build/android/devil/utils/zip_utils.py +++ /dev/null
@@ -1,31 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import logging -import os -import zipfile - - -def WriteToZipFile(zip_file, path, arc_path): - """Recursively write |path| to |zip_file| as |arc_path|. - - zip_file: An open instance of zipfile.ZipFile. - path: An absolute path to the file or directory to be zipped. - arc_path: A relative path within the zip file to which the file or directory - located at |path| should be written. - """ - if os.path.isdir(path): - for dir_path, _, file_names in os.walk(path): - dir_arc_path = os.path.join(arc_path, os.path.relpath(dir_path, path)) - logging.debug('dir: %s -> %s', dir_path, dir_arc_path) - zip_file.write(dir_path, dir_arc_path, zipfile.ZIP_STORED) - for f in file_names: - file_path = os.path.join(dir_path, f) - file_arc_path = os.path.join(dir_arc_path, f) - logging.debug('file: %s -> %s', file_path, file_arc_path) - zip_file.write(file_path, file_arc_path, zipfile.ZIP_DEFLATED) - else: - logging.debug('file: %s -> %s', path, arc_path) - zip_file.write(path, arc_path, zipfile.ZIP_DEFLATED) -
diff --git a/build/android/pylib/base/test_dispatcher_unittest.py b/build/android/pylib/base/test_dispatcher_unittest.py index 9b8633e..186a0721 100755 --- a/build/android/pylib/base/test_dispatcher_unittest.py +++ b/build/android/pylib/base/test_dispatcher_unittest.py
@@ -10,15 +10,17 @@ import unittest -from devil.android import device_utils -from devil.android.sdk import adb_wrapper -from devil.constants import exit_codes -from devil.utils import watchdog_timer from pylib.base import base_test_result from pylib.base import test_collection from pylib.base import test_dispatcher from pylib.constants import host_paths +with host_paths.SysPath(host_paths.DEVIL_PATH): + from devil.android import device_utils + from devil.android.sdk import adb_wrapper + from devil.constants import exit_codes + from devil.utils import watchdog_timer + with host_paths.SysPath(host_paths.PYMOCK_PATH): import mock # pylint: disable=import-error
diff --git a/build/common.gypi b/build/common.gypi index e8042fe..32022960d 100644 --- a/build/common.gypi +++ b/build/common.gypi
@@ -1339,6 +1339,11 @@ # to ~/.gyp/include.gypi, gclient runhooks --force, and do a release build. 'win_use_allocator_shim%': 1, # 1 = shim allocator via libcmt; 0 = msvcrt + # Enables the unified allocator shim (experimental) which routes all the + # alloc calls to base/. Right now is supported on Linux Desktop only. + # http://crbug.com/550886 . + 'use_experimental_allocator_shim%': 0, + # TODO(bradnelson): eliminate this when possible. # To allow local gyp files to prevent release.vsprops from being included. # Yes(1) means include release.vsprops. @@ -5711,6 +5716,11 @@ # TODO(brucedawson): http://crbug.com/554200 4312 is a VS # 2015 64-bit warning for integer to larger pointer 4312, + + # TODO(brucedawson): http://crbug.com/593448 4334 is a 'suspicious + # shift' warning and 4595 is an 'illegal inline operator new' warning + # Both are new in VS 2015 Update 2 and can safely be deferred for now. + 4334, 4595, ], 'msvs_settings': { 'VCCLCompilerTool': {
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 52e38512..732c98b 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -813,6 +813,9 @@ depfile, invoker.output_apk_path, ] + data = [ + invoker.output_apk_path, + ] args = [ "--depfile",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 898b25ff2..3b125c2 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -783,6 +783,12 @@ # C4312 is a VS 2015 64-bit warning for integer to larger pointer. # TODO(brucedawson): fix warnings, crbug.com/554200 "/wd4312", + + # TODO(brucedawson): http://crbug.com/593448 4334 is a 'suspicious + # shift' warning and 4595 is an 'illegal inline operator new' warning + # Both are new in VS 2015 Update 2 and can safely be deferred for now. + "/wd4334", + "/wd4595", ] }
diff --git a/build/config/ui.gni b/build/config/ui.gni index 926dabc..1df101f1 100644 --- a/build/config/ui.gni +++ b/build/config/ui.gni
@@ -53,6 +53,9 @@ # Indicates if Wayland display server support is enabled. enable_wayland_server = is_chromeos + + # Enable experimental vulkan backend. + enable_vulkan = false } # Additional dependent variables -----------------------------------------------
diff --git a/build/experimental/install-build-deps.py b/build/experimental/install-build-deps.py index 25da84e..52c04f80 100755 --- a/build/experimental/install-build-deps.py +++ b/build/experimental/install-build-deps.py
@@ -59,7 +59,6 @@ 'libcurl4-gnutls-dev', 'libdrm-dev', 'libelf-dev', - 'libexif-dev', 'libgconf2-dev', 'libglib2.0-dev', 'libglu1-mesa-dev', @@ -122,7 +121,6 @@ 'libcairo2', 'libcap2', 'libcups2', - 'libexif12', 'libexpat1', 'libfontconfig1', 'libfreetype6', @@ -218,7 +216,6 @@ 'libasound2:i386', 'libcap2:i386', 'libelf-dev:i386', - 'libexif12:i386', 'libfontconfig1:i386', 'libgconf-2-4:i386', 'libglib2.0-0:i386',
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh index 04f6e59..2b825d71 100755 --- a/build/install-build-deps.sh +++ b/build/install-build-deps.sh
@@ -102,16 +102,15 @@ language-pack-fr language-pack-he language-pack-zh-hant libapache2-mod-php5 libasound2-dev libbrlapi-dev libav-tools libbz2-dev libcairo2-dev libcap-dev libcups2-dev libcurl4-gnutls-dev - libdrm-dev libelf-dev libexif-dev libffi-dev libgconf2-dev - libglib2.0-dev libglu1-mesa-dev libgnome-keyring-dev libgtk2.0-dev - libkrb5-dev libnspr4-dev libnss3-dev libpam0g-dev libpci-dev - libpulse-dev libsctp-dev libspeechd-dev libsqlite3-dev libssl-dev - libudev-dev libwww-perl libxslt1-dev libxss-dev libxt-dev libxtst-dev - openbox patch perl php5-cgi pkg-config python python-cherrypy3 - python-crypto python-dev python-numpy python-opencv python-openssl - python-psutil python-yaml rpm ruby subversion ttf-dejavu-core - ttf-indic-fonts ttf-kochi-gothic ttf-kochi-mincho wdiff - zip $chromeos_dev_list" + libdrm-dev libelf-dev libffi-dev libgconf2-dev libglib2.0-dev + libglu1-mesa-dev libgnome-keyring-dev libgtk2.0-dev libkrb5-dev + libnspr4-dev libnss3-dev libpam0g-dev libpci-dev libpulse-dev + libsctp-dev libspeechd-dev libsqlite3-dev libssl-dev libudev-dev + libwww-perl libxslt1-dev libxss-dev libxt-dev libxtst-dev openbox + patch perl php5-cgi pkg-config python python-cherrypy3 python-crypto + python-dev python-numpy python-opencv python-openssl python-psutil + python-yaml rpm ruby subversion ttf-dejavu-core ttf-indic-fonts + ttf-kochi-gothic ttf-kochi-mincho wdiff zip $chromeos_dev_list" # 64-bit systems need a minimum set of 32-bit compat packages for the pre-built # NaCl binaries. @@ -124,12 +123,12 @@ # Full list of required run-time libraries lib_list="libatk1.0-0 libc6 libasound2 libcairo2 libcap2 libcups2 libexpat1 - libexif12 libffi6 libfontconfig1 libfreetype6 libglib2.0-0 - libgnome-keyring0 libgtk2.0-0 libpam0g libpango1.0-0 libpci3 libpcre3 - libpixman-1-0 libpng12-0 libspeechd2 libstdc++6 libsqlite3-0 libx11-6 - libxau6 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 - libxext6 libxfixes3 libxi6 libxinerama1 libxrandr2 libxrender1 - libxtst6 zlib1g $chromeos_lib_list" + libffi6 libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0 + libgtk2.0-0 libpam0g libpango1.0-0 libpci3 libpcre3 libpixman-1-0 + libpng12-0 libspeechd2 libstdc++6 libsqlite3-0 libx11-6 libxau6 + libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 libxext6 + libxfixes3 libxi6 libxinerama1 libxrandr2 libxrender1 libxtst6 + zlib1g $chromeos_lib_list" # Debugging symbols for all of the run-time libraries dbg_list="libatk1.0-dbg libc6-dbg libcairo2-dbg libffi6-dbg libfontconfig1-dbg @@ -165,10 +164,9 @@ # Packages to build NaCl, its toolchains, and its ports. naclports_list="ant autoconf bison cmake gawk intltool xutils-dev xsltproc" nacl_list="g++-mingw-w64-i686 lib32z1-dev - libasound2:i386 libcap2:i386 libelf-dev:i386 libexif12:i386 - libfontconfig1:i386 libgconf-2-4:i386 libglib2.0-0:i386 libgpm2:i386 - libgtk2.0-0:i386 libncurses5:i386 lib32ncurses5-dev - libnss3:i386 libpango1.0-0:i386 + libasound2:i386 libcap2:i386 libelf-dev:i386 libfontconfig1:i386 + libgconf-2-4:i386 libglib2.0-0:i386 libgpm2:i386 libgtk2.0-0:i386 + libncurses5:i386 lib32ncurses5-dev libnss3:i386 libpango1.0-0:i386 libssl1.0.0:i386 libtinfo-dev libtinfo-dev:i386 libtool libxcomposite1:i386 libxcursor1:i386 libxdamage1:i386 libxi6:i386 libxrandr2:i386 libxss1:i386 libxtst6:i386 texinfo xvfb
diff --git a/build/linux/sysroot_scripts/packagelist.jessie.amd64 b/build/linux/sysroot_scripts/packagelist.jessie.amd64 index 928f5de..06ba64b 100644 --- a/build/linux/sysroot_scripts/packagelist.jessie.amd64 +++ b/build/linux/sysroot_scripts/packagelist.jessie.amd64
@@ -76,8 +76,6 @@ main/libd/libdrm/libdrm-intel1_2.4.58-2_amd64.deb main/libd/libdrm/libdrm-nouveau2_2.4.58-2_amd64.deb main/libd/libdrm/libdrm-radeon1_2.4.58-2_amd64.deb -main/libe/libexif/libexif12_0.6.21-2_amd64.deb -main/libe/libexif/libexif-dev_0.6.21-2_amd64.deb main/libf/libffi/libffi6_3.1-2+b2_amd64.deb main/libf/libffi/libffi-dev_3.1-2+b2_amd64.deb main/libg/libgcrypt20/libgcrypt20_1.6.3-2_amd64.deb
diff --git a/build/linux/sysroot_scripts/packagelist.jessie.arm b/build/linux/sysroot_scripts/packagelist.jessie.arm index 1f21a06..c7daed4 100644 --- a/build/linux/sysroot_scripts/packagelist.jessie.arm +++ b/build/linux/sysroot_scripts/packagelist.jessie.arm
@@ -73,8 +73,6 @@ main/libd/libdrm/libdrm-nouveau2_2.4.58-2_armhf.deb main/libd/libdrm/libdrm-omap1_2.4.58-2_armhf.deb main/libd/libdrm/libdrm-radeon1_2.4.58-2_armhf.deb -main/libe/libexif/libexif12_0.6.21-2_armhf.deb -main/libe/libexif/libexif-dev_0.6.21-2_armhf.deb main/libf/libffi/libffi6_3.1-2+b2_armhf.deb main/libf/libffi/libffi-dev_3.1-2+b2_armhf.deb main/libg/libgcrypt20/libgcrypt20_1.6.3-2_armhf.deb
diff --git a/build/linux/sysroot_scripts/packagelist.jessie.i386 b/build/linux/sysroot_scripts/packagelist.jessie.i386 index 0bf51e7..c826a853 100644 --- a/build/linux/sysroot_scripts/packagelist.jessie.i386 +++ b/build/linux/sysroot_scripts/packagelist.jessie.i386
@@ -74,8 +74,6 @@ main/libd/libdrm/libdrm-intel1_2.4.58-2_i386.deb main/libd/libdrm/libdrm-nouveau2_2.4.58-2_i386.deb main/libd/libdrm/libdrm-radeon1_2.4.58-2_i386.deb -main/libe/libexif/libexif12_0.6.21-2_i386.deb -main/libe/libexif/libexif-dev_0.6.21-2_i386.deb main/libf/libffi/libffi6_3.1-2+b2_i386.deb main/libf/libffi/libffi-dev_3.1-2+b2_i386.deb main/libg/libgcrypt20/libgcrypt20_1.6.3-2_i386.deb
diff --git a/build/linux/sysroot_scripts/packagelist.jessie.mipsel b/build/linux/sysroot_scripts/packagelist.jessie.mipsel index 62203d5..76585af 100644 --- a/build/linux/sysroot_scripts/packagelist.jessie.mipsel +++ b/build/linux/sysroot_scripts/packagelist.jessie.mipsel
@@ -68,8 +68,6 @@ main/libd/libdrm/libdrm-dev_2.4.58-2_mipsel.deb main/libd/libdrm/libdrm-nouveau2_2.4.58-2_mipsel.deb main/libd/libdrm/libdrm-radeon1_2.4.58-2_mipsel.deb -main/libe/libexif/libexif12_0.6.21-2_mipsel.deb -main/libe/libexif/libexif-dev_0.6.21-2_mipsel.deb main/libf/libffi/libffi6_3.1-2+b2_mipsel.deb main/libf/libffi/libffi-dev_3.1-2+b2_mipsel.deb main/libg/libgcrypt20/libgcrypt20_1.6.3-2_mipsel.deb
diff --git a/build/linux/sysroot_scripts/packagelist.trusty.arm b/build/linux/sysroot_scripts/packagelist.trusty.arm index cd4b671..9ae07dae 100644 --- a/build/linux/sysroot_scripts/packagelist.trusty.arm +++ b/build/linux/sysroot_scripts/packagelist.trusty.arm
@@ -57,8 +57,6 @@ main/libc/libcap2/libcap2_2.24-0ubuntu2_armhf.deb main/libc/libcap2/libcap-dev_2.24-0ubuntu2_armhf.deb main/libd/libdrm/libdrm2_2.4.52-1_armhf.deb -main/libe/libexif/libexif12_0.6.21-1ubuntu1_armhf.deb -main/libe/libexif/libexif-dev_0.6.21-1ubuntu1_armhf.deb main/libf/libffi/libffi6_3.1~rc1+r3.0.13-12_armhf.deb main/libg/libgcrypt11/libgcrypt11_1.5.3-2ubuntu4_armhf.deb main/libg/libgcrypt11/libgcrypt11-dev_1.5.3-2ubuntu4_armhf.deb
diff --git a/build/linux/sysroot_scripts/packagelist.wheezy.amd64 b/build/linux/sysroot_scripts/packagelist.wheezy.amd64 index e6a0f53..9504e1cf 100644 --- a/build/linux/sysroot_scripts/packagelist.wheezy.amd64 +++ b/build/linux/sysroot_scripts/packagelist.wheezy.amd64
@@ -66,8 +66,6 @@ main/libd/libdrm/libdrm-nouveau1a_2.4.40-1~deb7u2_amd64.deb main/libd/libdrm/libdrm-radeon1_2.4.40-1~deb7u2_amd64.deb main/libd/libdrm/libkms1_2.4.40-1~deb7u2_amd64.deb -main/libe/libexif/libexif12_0.6.20-3_amd64.deb -main/libe/libexif/libexif-dev_0.6.20-3_amd64.deb main/libf/libffi/libffi5_3.0.10-3_amd64.deb main/libf/libffi/libffi-dev_3.0.10-3_amd64.deb main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u3_amd64.deb
diff --git a/build/linux/sysroot_scripts/packagelist.wheezy.arm b/build/linux/sysroot_scripts/packagelist.wheezy.arm index 12de0ea3..41a4ba1d 100644 --- a/build/linux/sysroot_scripts/packagelist.wheezy.arm +++ b/build/linux/sysroot_scripts/packagelist.wheezy.arm
@@ -65,8 +65,6 @@ main/libd/libdrm/libdrm-omap1_2.4.40-1~deb7u2_armhf.deb main/libd/libdrm/libdrm-radeon1_2.4.40-1~deb7u2_armhf.deb main/libd/libdrm/libkms1_2.4.40-1~deb7u2_armhf.deb -main/libe/libexif/libexif12_0.6.20-3_armhf.deb -main/libe/libexif/libexif-dev_0.6.20-3_armhf.deb main/libf/libffi/libffi5_3.0.10-3+b1_armhf.deb main/libf/libffi/libffi-dev_3.0.10-3+b1_armhf.deb main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u3_armhf.deb
diff --git a/build/linux/sysroot_scripts/packagelist.wheezy.i386 b/build/linux/sysroot_scripts/packagelist.wheezy.i386 index 49791348..66cae99 100644 --- a/build/linux/sysroot_scripts/packagelist.wheezy.i386 +++ b/build/linux/sysroot_scripts/packagelist.wheezy.i386
@@ -66,8 +66,6 @@ main/libd/libdrm/libdrm-nouveau1a_2.4.40-1~deb7u2_i386.deb main/libd/libdrm/libdrm-radeon1_2.4.40-1~deb7u2_i386.deb main/libd/libdrm/libkms1_2.4.40-1~deb7u2_i386.deb -main/libe/libexif/libexif12_0.6.20-3_i386.deb -main/libe/libexif/libexif-dev_0.6.20-3_i386.deb main/libf/libffi/libffi5_3.0.10-3_i386.deb main/libf/libffi/libffi-dev_3.0.10-3_i386.deb main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u3_i386.deb
diff --git a/build/linux/sysroot_scripts/packagelist.wheezy.mipsel b/build/linux/sysroot_scripts/packagelist.wheezy.mipsel index 2d1a274..85c57da7 100644 --- a/build/linux/sysroot_scripts/packagelist.wheezy.mipsel +++ b/build/linux/sysroot_scripts/packagelist.wheezy.mipsel
@@ -64,8 +64,6 @@ main/libd/libdrm/libdrm-nouveau1a_2.4.40-1~deb7u2_mipsel.deb main/libd/libdrm/libdrm-radeon1_2.4.40-1~deb7u2_mipsel.deb main/libd/libdrm/libkms1_2.4.40-1~deb7u2_mipsel.deb -main/libe/libexif/libexif12_0.6.20-3_mipsel.deb -main/libe/libexif/libexif-dev_0.6.20-3_mipsel.deb main/libf/libffi/libffi5_3.0.10-3_mipsel.deb main/libf/libffi/libffi-dev_3.0.10-3_mipsel.deb main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u3_mipsel.deb
diff --git a/build/linux/sysroot_scripts/sysroot-creator-jessie.sh b/build/linux/sysroot_scripts/sysroot-creator-jessie.sh index a684fb06..0c6bdb7f 100755 --- a/build/linux/sysroot_scripts/sysroot-creator-jessie.sh +++ b/build/linux/sysroot_scripts/sysroot-creator-jessie.sh
@@ -51,8 +51,6 @@ libdrm-radeon1 libelf1 libelf-dev - libexif12 - libexif-dev libexpat1 libexpat1-dev libffi6
diff --git a/build/linux/sysroot_scripts/sysroot-creator-trusty.sh b/build/linux/sysroot_scripts/sysroot-creator-trusty.sh index 7c5e346..5230e40c 100755 --- a/build/linux/sysroot_scripts/sysroot-creator-trusty.sh +++ b/build/linux/sysroot_scripts/sysroot-creator-trusty.sh
@@ -44,8 +44,6 @@ libdrm2 libelf1 libelf-dev - libexif12 - libexif-dev libexpat1 libexpat1-dev libffi6
diff --git a/build/linux/sysroot_scripts/sysroot-creator-wheezy.sh b/build/linux/sysroot_scripts/sysroot-creator-wheezy.sh index 5006b954..59c0b72d 100755 --- a/build/linux/sysroot_scripts/sysroot-creator-wheezy.sh +++ b/build/linux/sysroot_scripts/sysroot-creator-wheezy.sh
@@ -48,8 +48,6 @@ libdrm-radeon1 libelf1 libelf-dev - libexif12 - libexif-dev libexpat1 libexpat1-dev libffi5
diff --git a/cc/layers/layer.h b/cc/layers/layer.h index 20637642..edd0eaaae9 100644 --- a/cc/layers/layer.h +++ b/cc/layers/layer.h
@@ -306,7 +306,6 @@ void SetForceRenderSurface(bool force_render_surface); bool force_render_surface() const { return force_render_surface_; } - gfx::Vector2dF ScrollDelta() const { return gfx::Vector2dF(); } gfx::ScrollOffset CurrentScrollOffset() const { return scroll_offset_; } void SetDoubleSided(bool double_sided);
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index 8acc5378..b10ab7e 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -1452,43 +1452,6 @@ return synced_scroll_offset()->Current(IsActive()); } -gfx::Vector2dF LayerImpl::ScrollDelta() const { - if (IsActive()) - return gfx::Vector2dF(synced_scroll_offset()->Delta().x(), - synced_scroll_offset()->Delta().y()); - else - return gfx::Vector2dF(synced_scroll_offset()->PendingDelta().get().x(), - synced_scroll_offset()->PendingDelta().get().y()); -} - -void LayerImpl::SetScrollDelta(const gfx::Vector2dF& delta) { - DCHECK(IsActive()); - DCHECK(scrollable() || delta.IsZero()); - SetCurrentScrollOffset(synced_scroll_offset()->ActiveBase() + - gfx::ScrollOffset(delta)); -} - -gfx::ScrollOffset LayerImpl::BaseScrollOffset() const { - if (IsActive()) - return synced_scroll_offset()->ActiveBase(); - else - return synced_scroll_offset()->PendingBase(); -} - -void LayerImpl::PushScrollOffsetFromMainThread( - const gfx::ScrollOffset& scroll_offset) { - bool changed = false; - DCHECK(!IsActive() || !layer_tree_impl_->FindPendingTreeLayerById(id())); - changed |= synced_scroll_offset()->PushFromMainThread(scroll_offset); - - if (IsActive()) { - changed |= synced_scroll_offset()->PushPendingToActive(); - } - - if (changed) - DidUpdateScrollOffset(); -} - void LayerImpl::UpdatePropertyTreeScrollOffset() { // TODO(enne): in the future, scrolling should update the scroll tree // directly instead of going through layers.
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h index a7cfc87..7cb5a41 100644 --- a/cc/layers/layer_impl.h +++ b/cc/layers/layer_impl.h
@@ -449,16 +449,7 @@ gfx::Vector2dF bounds_delta() const { return bounds_delta_; } void SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset); - // must only be called by tests when updating scroll offset of a single layer, - // the standard process to update scroll offsets is to call - // ScrollTree::UpdateScrollOffsetMap() which updates scroll offsets of all - // layers. - void PushScrollOffsetFromMainThread(const gfx::ScrollOffset& scroll_offset); - gfx::ScrollOffset CurrentScrollOffset() const; - gfx::ScrollOffset BaseScrollOffset() const; - gfx::Vector2dF ScrollDelta() const; - void SetScrollDelta(const gfx::Vector2dF& delta); gfx::ScrollOffset MaxScrollOffset() const; gfx::ScrollOffset ClampScrollOffsetToLimits(gfx::ScrollOffset offset) const;
diff --git a/cc/layers/layer_impl_unittest.cc b/cc/layers/layer_impl_unittest.cc index bd221ce..11c372452 100644 --- a/cc/layers/layer_impl_unittest.cc +++ b/cc/layers/layer_impl_unittest.cc
@@ -100,6 +100,16 @@ code_to_test; \ EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); +static gfx::Vector2dF ScrollDelta(LayerImpl* layer_impl) { + if (layer_impl->IsActive()) + return gfx::Vector2dF(layer_impl->synced_scroll_offset()->Delta().x(), + layer_impl->synced_scroll_offset()->Delta().y()); + else + return gfx::Vector2dF( + layer_impl->synced_scroll_offset()->PendingDelta().get().x(), + layer_impl->synced_scroll_offset()->PendingDelta().get().y()); +} + TEST(LayerImplTest, VerifyLayerChangesAreTrackedProperly) { // // This test checks that layerPropertyChanged() has the correct behavior. @@ -181,9 +191,6 @@ EXECUTE_AND_VERIFY_SUBTREE_CHANGED( root->OnFilterAnimated(FilterOperations())); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->ScrollBy(arbitrary_vector2d)); - EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetScrollDelta(gfx::Vector2d())); - EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->PushScrollOffsetFromMainThread( - gfx::ScrollOffset(arbitrary_vector2d))); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->OnOpacityAnimated(arbitrary_number)); EXECUTE_AND_VERIFY_SUBTREE_CHANGED( root->OnTransformAnimated(arbitrary_transform)); @@ -245,11 +252,6 @@ root->SetTransform(arbitrary_transform)); EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( root->SetDoubleSided(false)); // constructor initializes it to "true". - EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( - root->SetScrollDelta(gfx::Vector2d())); - EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( - root->PushScrollOffsetFromMainThread( - gfx::ScrollOffset(arbitrary_vector2d))); EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetContentsOpaque(true)); EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetOpacity(arbitrary_number)); EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( @@ -341,15 +343,13 @@ VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(large_size)); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->ScrollBy(arbitrary_vector2d)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->ScrollBy(gfx::Vector2d())); - layer->SetScrollDelta(gfx::Vector2d(0, 0)); - host_impl.ForcePrepareToDraw(); - VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( - layer->SetScrollDelta(arbitrary_vector2d)); - VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( - layer->SetScrollDelta(arbitrary_vector2d)); - VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->PushScrollOffsetFromMainThread( - gfx::ScrollOffset(arbitrary_vector2d))); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->DidUpdateScrollOffset()); + layer->SetCurrentScrollOffset(layer->synced_scroll_offset()->ActiveBase() + + gfx::ScrollOffset()); + VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetCurrentScrollOffset( + gfx::ScrollOffset(arbitrary_vector2d.x(), arbitrary_vector2d.y()))); + VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetCurrentScrollOffset( + gfx::ScrollOffset(arbitrary_vector2d.x(), arbitrary_vector2d.y()))); // Unrelated functions, always set to new values, always set needs update. VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( @@ -511,6 +511,10 @@ return host_impl_.active_tree()->root_layer()->children()[0].get(); } + ScrollTree* scroll_tree(LayerImpl* layer_impl) { + return &layer_impl->layer_tree_impl()->property_trees()->scroll_tree; + } + LayerTreeHostImpl& host_impl() { return host_impl_; } LayerTreeImpl* tree() { return host_impl_.active_tree(); } @@ -533,45 +537,58 @@ // offset is bounded by the range [0, max scroll offset]. EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->BaseScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta()); + EXPECT_VECTOR_EQ( + gfx::Vector2dF(), + scroll_tree(layer())->GetScrollOffsetBaseForTesting(layer()->id())); + EXPECT_VECTOR_EQ(gfx::Vector2dF(), ScrollDelta(layer())); layer()->ScrollBy(gfx::Vector2dF(-100, 100)); EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(layer()->ScrollDelta(), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->BaseScrollOffset()); + EXPECT_VECTOR_EQ(ScrollDelta(layer()), layer()->CurrentScrollOffset()); + EXPECT_VECTOR_EQ( + gfx::Vector2dF(), + scroll_tree(layer())->GetScrollOffsetBaseForTesting(layer()->id())); layer()->ScrollBy(gfx::Vector2dF(100, -100)); EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 0), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(layer()->ScrollDelta(), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->BaseScrollOffset()); + EXPECT_VECTOR_EQ(ScrollDelta(layer()), layer()->CurrentScrollOffset()); + EXPECT_VECTOR_EQ( + gfx::Vector2dF(), + scroll_tree(layer())->GetScrollOffsetBaseForTesting(layer()->id())); } TEST_F(LayerImplScrollTest, ScrollByWithNonZeroOffset) { gfx::ScrollOffset scroll_offset(10, 5); - layer()->PushScrollOffsetFromMainThread(scroll_offset); + scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->id(), + scroll_offset); EXPECT_VECTOR_EQ(scroll_offset, layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(scroll_offset, layer()->BaseScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta()); + EXPECT_VECTOR_EQ( + scroll_offset, + scroll_tree(layer())->GetScrollOffsetBaseForTesting(layer()->id())); + EXPECT_VECTOR_EQ(gfx::Vector2dF(), ScrollDelta(layer())); layer()->ScrollBy(gfx::Vector2dF(-100, 100)); EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->CurrentScrollOffset()); EXPECT_VECTOR_EQ( - gfx::ScrollOffsetWithDelta(scroll_offset, layer()->ScrollDelta()), + gfx::ScrollOffsetWithDelta(scroll_offset, ScrollDelta(layer())), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(scroll_offset, layer()->BaseScrollOffset()); + EXPECT_VECTOR_EQ( + scroll_offset, + scroll_tree(layer())->GetScrollOffsetBaseForTesting(layer()->id())); layer()->ScrollBy(gfx::Vector2dF(100, -100)); EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 0), layer()->CurrentScrollOffset()); EXPECT_VECTOR_EQ( - gfx::ScrollOffsetWithDelta(scroll_offset, layer()->ScrollDelta()), + gfx::ScrollOffsetWithDelta(scroll_offset, ScrollDelta(layer())), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(scroll_offset, layer()->BaseScrollOffset()); + EXPECT_VECTOR_EQ( + scroll_offset, + scroll_tree(layer())->GetScrollOffsetBaseForTesting(layer()->id())); } TEST_F(LayerImplScrollTest, ApplySentScrollsNoListener) { @@ -579,7 +596,8 @@ gfx::Vector2dF scroll_delta(20.5f, 8.5f); gfx::Vector2d sent_scroll_delta(12, -3); - layer()->PushScrollOffsetFromMainThread(scroll_offset); + scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->id(), + scroll_offset); layer()->ScrollBy(sent_scroll_delta); layer()->synced_scroll_offset()->PullDeltaForMainThread(); layer()->SetCurrentScrollOffset(scroll_offset + @@ -587,16 +605,19 @@ EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(scroll_offset, scroll_delta), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(scroll_delta, layer()->ScrollDelta()); - EXPECT_VECTOR_EQ(scroll_offset, layer()->BaseScrollOffset()); + EXPECT_VECTOR_EQ(scroll_delta, ScrollDelta(layer())); + EXPECT_VECTOR_EQ( + scroll_offset, + scroll_tree(layer())->GetScrollOffsetBaseForTesting(layer()->id())); layer()->synced_scroll_offset()->AbortCommit(); EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(scroll_offset, scroll_delta), layer()->CurrentScrollOffset()); - EXPECT_VECTOR_EQ(scroll_delta - sent_scroll_delta, layer()->ScrollDelta()); - EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(scroll_offset, sent_scroll_delta), - layer()->BaseScrollOffset()); + EXPECT_VECTOR_EQ(scroll_delta - sent_scroll_delta, ScrollDelta(layer())); + EXPECT_VECTOR_EQ( + gfx::ScrollOffsetWithDelta(scroll_offset, sent_scroll_delta), + scroll_tree(layer())->GetScrollOffsetBaseForTesting(layer()->id())); } TEST_F(LayerImplScrollTest, ScrollUserUnscrollableLayer) { @@ -604,7 +625,8 @@ gfx::Vector2dF scroll_delta(20.5f, 8.5f); layer()->set_user_scrollable_vertical(false); - layer()->PushScrollOffsetFromMainThread(scroll_offset); + scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->id(), + scroll_offset); gfx::Vector2dF unscrolled = layer()->ScrollBy(scroll_delta); EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 8.5f), unscrolled); @@ -617,7 +639,8 @@ host_impl().CreatePendingTree(); - layer()->PushScrollOffsetFromMainThread(scroll_offset); + scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->id(), + scroll_offset); gfx::Vector2dF unscrolled = layer()->ScrollBy(scroll_delta); EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 0), unscrolled); @@ -627,7 +650,9 @@ scoped_ptr<LayerImpl> pending_layer = LayerImpl::Create(host_impl().sync_tree(), layer()->id()); - pending_layer->PushScrollOffsetFromMainThread(layer()->CurrentScrollOffset()); + scroll_tree(pending_layer.get()) + ->UpdateScrollOffsetBaseForTesting(pending_layer->id(), + layer()->CurrentScrollOffset()); pending_layer->PushPropertiesTo(layer());
diff --git a/cc/layers/layer_position_constraint_unittest.cc b/cc/layers/layer_position_constraint_unittest.cc index 490ce8e2..b2cc0df 100644 --- a/cc/layers/layer_position_constraint_unittest.cc +++ b/cc/layers/layer_position_constraint_unittest.cc
@@ -154,9 +154,9 @@ // Since scroll deltas aren't sent back to the main thread in this test // setup, clear them to maintain consistent state. if (root_impl_) { - scroll_layer_impl_->SetScrollDelta(gfx::Vector2dF()); - child_impl_->SetScrollDelta(gfx::Vector2dF()); - grand_child_impl_->SetScrollDelta(gfx::Vector2dF()); + SetScrollOffsetDelta(scroll_layer_impl_, gfx::Vector2dF()); + SetScrollOffsetDelta(child_impl_, gfx::Vector2dF()); + SetScrollOffsetDelta(grand_child_impl_, gfx::Vector2dF()); } root_impl_ = layer_tree_host_->CommitAndCreateLayerImplTree(); inner_viewport_container_layer_impl_ = root_impl_->children()[0].get(); @@ -195,6 +195,15 @@ LayerPositionConstraint fixed_to_top_left_; LayerPositionConstraint fixed_to_bottom_right_; + + // LayerImpl should not be aware of synced property logics, this function is + // a hack for the test to arbitrarily set the scroll delta for setting up. + static void SetScrollOffsetDelta(LayerImpl* layer_impl, + const gfx::Vector2dF& delta) { + layer_impl->SetCurrentScrollOffset( + layer_impl->synced_scroll_offset()->ActiveBase() + + gfx::ScrollOffset(delta)); + } }; namespace { @@ -219,7 +228,7 @@ CommitAndUpdateImplPointers(); // Case 1: scroll delta of 0, 0 - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); ExecuteCalculateDrawProperties(root_impl_); gfx::Transform expected_child_transform; @@ -231,7 +240,7 @@ grand_child_impl_->DrawTransform()); // Case 2: scroll delta of 10, 10 - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); child_impl_->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -259,7 +268,7 @@ grand_child_->SetPositionConstraint(fixed_to_bottom_right_); CommitAndUpdateImplPointers(); - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); SetFixedContainerSizeDelta(child_impl_, gfx::Vector2d(20, 20)); ExecuteCalculateDrawProperties(root_impl_); @@ -285,7 +294,7 @@ CommitAndUpdateImplPointers(); // Case 1: scroll delta of 0, 0 - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); child_impl_->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -304,7 +313,7 @@ great_grand_child_impl_->DrawTransform()); // Case 2: scroll delta of 10, 10 - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); ExecuteCalculateDrawProperties(root_impl_); // Here the child and grand_child are affected by scroll delta, but the fixed @@ -335,7 +344,7 @@ // Case 4: Bottom-right fixed-position layer. great_grand_child_->SetPositionConstraint(fixed_to_bottom_right_); CommitAndUpdateImplPointers(); - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); SetFixedContainerSizeDelta(child_impl_, gfx::Vector2d(20, 20)); ExecuteCalculateDrawProperties(root_impl_); @@ -370,7 +379,7 @@ CommitAndUpdateImplPointers(); // Case 1: scroll delta of 0, 0 - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); child_impl_->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -394,8 +403,8 @@ great_grand_child_impl_->DrawTransform()); // Case 2: scroll delta of 10, 20 - child_impl_->SetScrollDelta(gfx::Vector2d(10, 0)); - grand_child_impl_->SetScrollDelta(gfx::Vector2d(5, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 0)); + SetScrollOffsetDelta(grand_child_impl_, gfx::Vector2d(5, 0)); ExecuteCalculateDrawProperties(root_impl_); // Here the child and grand_child are affected by scroll delta, but the fixed @@ -440,7 +449,7 @@ CommitAndUpdateImplPointers(); // Case 1: scroll delta of 0, 0 - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); ExecuteCalculateDrawProperties(root_impl_); gfx::Transform expected_child_transform; @@ -461,7 +470,7 @@ great_grand_child_impl_->DrawTransform()); // Case 2: scroll delta of 10, 30 - child_impl_->SetScrollDelta(gfx::Vector2d(10, 30)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 30)); child_impl_->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -513,7 +522,7 @@ great_grand_child_->SetPositionConstraint(fixed_to_bottom_right_); CommitAndUpdateImplPointers(); - child_impl_->SetScrollDelta(gfx::Vector2d(10, 30)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 30)); SetFixedContainerSizeDelta(child_impl_, gfx::Vector2d(20, 20)); ExecuteCalculateDrawProperties(root_impl_); @@ -574,7 +583,7 @@ great_grand_child_impl_->children()[0].get(); // Case 1: scroll delta of 0, 0 - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); child_impl_->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -611,7 +620,7 @@ fixed_position_child_impl->DrawTransform()); // Case 2: scroll delta of 10, 30 - child_impl_->SetScrollDelta(gfx::Vector2d(10, 30)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 30)); ExecuteCalculateDrawProperties(root_impl_); expected_child_transform.MakeIdentity(); @@ -668,7 +677,7 @@ fixed_position_child->SetPositionConstraint(fixed_to_bottom_right_); CommitAndUpdateImplPointers(); fixed_position_child_impl = great_grand_child_impl_->children()[0].get(); - child_impl_->SetScrollDelta(gfx::Vector2d(10, 30)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 30)); SetFixedContainerSizeDelta(child_impl_, gfx::Vector2d(20, 20)); ExecuteCalculateDrawProperties(root_impl_); @@ -732,7 +741,7 @@ great_grand_child_impl_->children()[0].get(); // Case 1: scroll delta of 0, 0 - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); child_impl_->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -772,7 +781,7 @@ fixed_position_child_impl->DrawTransform()); // Case 2: scroll delta of 10, 30 - child_impl_->SetScrollDelta(gfx::Vector2d(10, 30)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 30)); ExecuteCalculateDrawProperties(root_impl_); expected_child_transform.MakeIdentity(); @@ -831,7 +840,7 @@ CommitAndUpdateImplPointers(); // Case 1: scroll delta of 0, 0 - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); ExecuteCalculateDrawProperties(root_impl_); gfx::Transform expected_surface_draw_transform; @@ -847,7 +856,7 @@ grand_child_impl_->DrawTransform()); // Case 2: scroll delta of 10, 10 - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); ExecuteCalculateDrawProperties(root_impl_); // The surface is translated by scroll delta, the child transform doesn't @@ -880,7 +889,7 @@ // Case 4: Bottom-right fixed-position layer. grand_child_->SetPositionConstraint(fixed_to_bottom_right_); CommitAndUpdateImplPointers(); - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); SetFixedContainerSizeDelta(child_impl_, gfx::Vector2d(20, 20)); ExecuteCalculateDrawProperties(root_impl_); @@ -914,7 +923,7 @@ CommitAndUpdateImplPointers(); // Case 1: scroll delta of 0, 0 - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); child_impl_->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -926,7 +935,7 @@ grand_child_impl_->DrawTransform()); // Case 2: scroll delta of 10, 10 - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); ExecuteCalculateDrawProperties(root_impl_); // Here the child is affected by scroll delta, but the fixed position @@ -951,7 +960,7 @@ // Case 4: Bottom-right fixed-position layer. grand_child_->SetPositionConstraint(fixed_to_bottom_right_); CommitAndUpdateImplPointers(); - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); SetFixedContainerSizeDelta(child_impl_, gfx::Vector2d(20, 20)); ExecuteCalculateDrawProperties(root_impl_); @@ -985,7 +994,7 @@ CommitAndUpdateImplPointers(); // Case 1: scrollDelta - child_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(10, 10)); child_impl_->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -1005,7 +1014,7 @@ great_grand_child_impl_->DrawTransform()); // Case 2: sizeDelta - child_impl_->SetScrollDelta(gfx::Vector2d(0, 0)); + SetScrollOffsetDelta(child_impl_, gfx::Vector2d(0, 0)); SetFixedContainerSizeDelta(child_impl_, gfx::Vector2d(20, 20)); ExecuteCalculateDrawProperties(root_impl_); @@ -1050,9 +1059,9 @@ LayerImpl* container2 = great_grand_child_impl_; LayerImpl* fixed_to_container2 = container2->children()[0].get(); - container1->SetScrollDelta(gfx::Vector2d(0, 15)); + SetScrollOffsetDelta(container1, gfx::Vector2d(0, 15)); container1->SetDrawsContent(true); - container2->SetScrollDelta(gfx::Vector2d(30, 0)); + SetScrollOffsetDelta(container2, gfx::Vector2d(30, 0)); container2->SetDrawsContent(true); ExecuteCalculateDrawProperties(root_impl_); @@ -1098,7 +1107,7 @@ root_impl_->layer_tree_impl()->FindActiveTreeLayerById(fixed_child->id()); // Case 1: fixed-container size delta of 20, 20 - scroll_layer_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(scroll_layer_impl_, gfx::Vector2d(10, 10)); scroll_layer_impl_->SetDrawsContent(true); SetFixedContainerSizeDelta(scroll_layer_impl_, gfx::Vector2d(20, 20)); gfx::Transform expected_scroll_layer_transform; @@ -1119,7 +1128,7 @@ fixed_child_impl = root_impl_->layer_tree_impl()->FindActiveTreeLayerById(fixed_child->id()); - scroll_layer_impl_->SetScrollDelta(gfx::Vector2d(10, 10)); + SetScrollOffsetDelta(scroll_layer_impl_, gfx::Vector2d(10, 10)); SetFixedContainerSizeDelta(scroll_layer_impl_, gfx::Vector2d(20, 20)); ExecuteCalculateDrawProperties(root_impl_);
diff --git a/cc/layers/picture_layer_impl_perftest.cc b/cc/layers/picture_layer_impl_perftest.cc index c38dd3ea..feeb28f9 100644 --- a/cc/layers/picture_layer_impl_perftest.cc +++ b/cc/layers/picture_layer_impl_perftest.cc
@@ -102,8 +102,11 @@ void RunRasterQueueConstructTest(const std::string& test_name, const gfx::Rect& viewport) { host_impl_.SetViewportSize(viewport.size()); - pending_layer_->PushScrollOffsetFromMainThread( - gfx::ScrollOffset(viewport.x(), viewport.y())); + host_impl_.pending_tree() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + pending_layer_->id(), + gfx::ScrollOffset(viewport.x(), viewport.y())); bool update_lcd_text = false; host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text); @@ -147,8 +150,11 @@ void RunEvictionQueueConstructTest(const std::string& test_name, const gfx::Rect& viewport) { host_impl_.SetViewportSize(viewport.size()); - pending_layer_->PushScrollOffsetFromMainThread( - gfx::ScrollOffset(viewport.x(), viewport.y())); + host_impl_.pending_tree() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + pending_layer_->id(), + gfx::ScrollOffset(viewport.x(), viewport.y())); bool update_lcd_text = false; host_impl_.pending_tree()->UpdateDrawProperties(update_lcd_text);
diff --git a/cc/playback/discardable_image_map.cc b/cc/playback/discardable_image_map.cc index cb69bdf..5588a69 100644 --- a/cc/playback/discardable_image_map.cc +++ b/cc/playback/discardable_image_map.cc
@@ -24,17 +24,6 @@ return dst; } -bool ExtractScale(const SkMatrix& matrix, SkSize* scale) { - *scale = SkSize::Make(matrix.getScaleX(), matrix.getScaleY()); - if (matrix.getType() & SkMatrix::kAffine_Mask) { - if (!matrix.decomposeScale(scale)) { - scale->set(1, 1); - return false; - } - } - return true; -} - namespace { // We're using an NWay canvas with no added canvases, so in effect @@ -155,11 +144,8 @@ SkIRect src_irect; src_rect.roundOut(&src_irect); - SkSize scale; - bool is_decomposable = ExtractScale(matrix, &scale); image_set_->push_back( - std::make_pair(DrawImage(image, src_irect, scale, filter_quality, - matrix.hasPerspective(), is_decomposable), + std::make_pair(DrawImage(image, src_irect, filter_quality, matrix), gfx::ToEnclosingRect(gfx::SkRectToRectF(paint_rect)))); }
diff --git a/cc/playback/discardable_image_map.h b/cc/playback/discardable_image_map.h index 90c9da2..3b29da20 100644 --- a/cc/playback/discardable_image_map.h +++ b/cc/playback/discardable_image_map.h
@@ -24,10 +24,6 @@ // Helper function to apply the matrix to the rect and return the result. SkRect MapRect(const SkMatrix& matrix, const SkRect& src); -// Helper funciton to extract a scale from the matrix. Returns true on success -// and false on failure. -bool ExtractScale(const SkMatrix& matrix, SkSize* scale); - // This class is used for generating discardable images data (see DrawImage // for the type of data it stores). It allows the client to query a particular // rect and get back a list of DrawImages in that rect.
diff --git a/cc/playback/draw_image.cc b/cc/playback/draw_image.cc index a9c965a..17aef315a 100644 --- a/cc/playback/draw_image.cc +++ b/cc/playback/draw_image.cc
@@ -5,32 +5,48 @@ #include "cc/playback/draw_image.h" namespace cc { +namespace { + +// Helper funciton to extract a scale from the matrix. Returns true on success +// and false on failure. +bool ExtractScale(const SkMatrix& matrix, SkSize* scale) { + *scale = SkSize::Make(matrix.getScaleX(), matrix.getScaleY()); + if (matrix.getType() & SkMatrix::kAffine_Mask) { + if (!matrix.decomposeScale(scale)) { + scale->set(1, 1); + return false; + } + } + return true; +} + +} // namespace DrawImage::DrawImage() : image_(nullptr), src_rect_(SkIRect::MakeXYWH(0, 0, 0, 0)), + filter_quality_(kNone_SkFilterQuality), + matrix_(SkMatrix::I()), scale_(SkSize::Make(1.f, 1.f)), - filter_quality_(kNone_SkFilterQuality) {} + matrix_is_decomposable_(true) {} DrawImage::DrawImage(const SkImage* image, const SkIRect& src_rect, - const SkSize& scale, SkFilterQuality filter_quality, - bool matrix_has_perspective, - bool matrix_is_decomposable) + const SkMatrix& matrix) : image_(image), src_rect_(src_rect), - scale_(scale), filter_quality_(filter_quality), - matrix_has_perspective_(matrix_has_perspective), - matrix_is_decomposable_(matrix_is_decomposable) {} + matrix_(matrix) { + matrix_is_decomposable_ = ExtractScale(matrix_, &scale_); +} DrawImage::DrawImage(const DrawImage& other) : image_(other.image_), src_rect_(other.src_rect_), - scale_(other.scale_), filter_quality_(other.filter_quality_), - matrix_has_perspective_(other.matrix_has_perspective_), + matrix_(other.matrix_), + scale_(other.scale_), matrix_is_decomposable_(other.matrix_is_decomposable_) {} } // namespace cc
diff --git a/cc/playback/draw_image.h b/cc/playback/draw_image.h index 88ecfdf..83b10ba3 100644 --- a/cc/playback/draw_image.h +++ b/cc/playback/draw_image.h
@@ -19,32 +19,29 @@ DrawImage(); DrawImage(const SkImage* image, const SkIRect& src_rect, - const SkSize& scale, SkFilterQuality filter_quality, - bool matrix_has_perspective, - bool matrix_is_decomposable); + const SkMatrix& matrix); DrawImage(const DrawImage& other); const SkImage* image() const { return image_; } const SkSize& scale() const { return scale_; } const SkIRect src_rect() const { return src_rect_; } SkFilterQuality filter_quality() const { return filter_quality_; } - bool matrix_has_perspective() const { return matrix_has_perspective_; } bool matrix_is_decomposable() const { return matrix_is_decomposable_; } + const SkMatrix& matrix() { return matrix_; } DrawImage ApplyScale(float scale) const { - return DrawImage( - image_, src_rect_, - SkSize::Make(scale_.width() * scale, scale_.height() * scale), - filter_quality_, matrix_has_perspective_, matrix_is_decomposable_); + SkMatrix scaled_matrix = matrix_; + scaled_matrix.postScale(scale, scale); + return DrawImage(image_, src_rect_, filter_quality_, scaled_matrix); } private: const SkImage* image_; SkIRect src_rect_; - SkSize scale_; SkFilterQuality filter_quality_; - bool matrix_has_perspective_; + SkMatrix matrix_; + SkSize scale_; bool matrix_is_decomposable_; };
diff --git a/cc/playback/image_hijack_canvas.cc b/cc/playback/image_hijack_canvas.cc index aef2ac8a..d0c5c5c7 100644 --- a/cc/playback/image_hijack_canvas.cc +++ b/cc/playback/image_hijack_canvas.cc
@@ -22,17 +22,13 @@ ScopedDecodedImageLock(ImageDecodeController* image_decode_controller, const SkImage* image, const SkRect& src_rect, - const SkSize& scale, - bool is_decomposable, - bool has_perspective, + const SkMatrix& matrix, const SkPaint* paint) : image_decode_controller_(image_decode_controller), draw_image_(image, RoundOutRect(src_rect), - scale, paint ? paint->getFilterQuality() : kNone_SkFilterQuality, - has_perspective, - is_decomposable), + matrix), decoded_draw_image_( image_decode_controller_->GetDecodedImageForDraw(draw_image_)) { DCHECK(image->isLazyGenerated()); @@ -85,12 +81,9 @@ SkMatrix ctm = getTotalMatrix(); - SkSize scale; - bool is_decomposable = ExtractScale(ctm, &scale); ScopedDecodedImageLock scoped_lock( image_decode_controller_, image, - SkRect::MakeIWH(image->width(), image->height()), scale, is_decomposable, - ctm.hasPerspective(), paint); + SkRect::MakeIWH(image->width(), image->height()), ctm, paint); const DecodedDrawImage& decoded_image = scoped_lock.decoded_image(); if (!decoded_image.image()) return; @@ -129,11 +122,8 @@ matrix.setRectToRect(*src, dst, SkMatrix::kFill_ScaleToFit); matrix.postConcat(getTotalMatrix()); - SkSize scale; - bool is_decomposable = ExtractScale(matrix, &scale); ScopedDecodedImageLock scoped_lock(image_decode_controller_, image, *src, - scale, is_decomposable, - matrix.hasPerspective(), paint); + matrix, paint); const DecodedDrawImage& decoded_image = scoped_lock.decoded_image(); if (!decoded_image.image()) return;
diff --git a/cc/test/layer_tree_host_common_test.h b/cc/test/layer_tree_host_common_test.h index 2a66715f..1717d13 100644 --- a/cc/test/layer_tree_host_common_test.h +++ b/cc/test/layer_tree_host_common_test.h
@@ -159,6 +159,14 @@ public: LayerTreeHostCommonTest(); explicit LayerTreeHostCommonTest(const LayerTreeSettings& settings); + + protected: + static void SetScrollOffsetDelta(LayerImpl* layer_impl, + const gfx::Vector2dF& delta) { + layer_impl->SetCurrentScrollOffset( + layer_impl->synced_scroll_offset()->ActiveBase() + + gfx::ScrollOffset(delta)); + } }; } // namespace cc
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h index 5a7f111..2b9a91a 100644 --- a/cc/test/layer_tree_test.h +++ b/cc/test/layer_tree_test.h
@@ -191,6 +191,16 @@ bool IsRemoteTest() const; + static gfx::Vector2dF ScrollDelta(LayerImpl* layer_impl) { + if (layer_impl->IsActive()) + return gfx::Vector2dF(layer_impl->synced_scroll_offset()->Delta().x(), + layer_impl->synced_scroll_offset()->Delta().y()); + else + return gfx::Vector2dF( + layer_impl->synced_scroll_offset()->PendingDelta().get().x(), + layer_impl->synced_scroll_offset()->PendingDelta().get().y()); + } + private: LayerTreeSettings settings_; LayerSettings layer_settings_;
diff --git a/cc/tiles/software_image_decode_controller.cc b/cc/tiles/software_image_decode_controller.cc index 565e8e4a..f47213af0 100644 --- a/cc/tiles/software_image_decode_controller.cc +++ b/cc/tiles/software_image_decode_controller.cc
@@ -262,6 +262,15 @@ base::AutoLock lock(lock_); + // We could have finished all of the raster tasks (cancelled) while the task + // was just starting to run. Since this task already started running, it + // wasn't cancelled. So, if the ref count for the image is 0 then we can just + // abort. + if (decoded_images_ref_counts_.find(key) == + decoded_images_ref_counts_.end()) { + return; + } + auto image_it = decoded_images_.Peek(key); if (image_it != decoded_images_.end()) { if (image_it->second->is_locked() || image_it->second->Lock()) { @@ -366,13 +375,9 @@ // GetDecodedImageForDrawInternal() would decode the image, and unreffing it // later ensures that we will store the discardable memory unlocked in the // cache to be used by future requests. - SkSize identity_scale = SkSize::Make(1.f, 1.f); - bool matrix_has_perspective = false; - bool matrix_is_decomposable = true; gfx::Rect full_image_rect(image->width(), image->height()); - DrawImage original_size_draw_image( - image, gfx::RectToSkIRect(full_image_rect), identity_scale, - kNone_SkFilterQuality, matrix_has_perspective, matrix_is_decomposable); + DrawImage original_size_draw_image(image, gfx::RectToSkIRect(full_image_rect), + kNone_SkFilterQuality, SkMatrix::I()); ImageKey original_size_key = ImageKey::FromDrawImage(original_size_draw_image); // Sanity checks. @@ -698,10 +703,10 @@ quality = std::min(quality, kLow_SkFilterQuality); } - // Drop from high to medium if the image has perspective applied, the matrix - // we applied wasn't decomposable, or if the scaled image will be too large. + // Drop from high to medium if the the matrix we applied wasn't decomposable, + // or if the scaled image will be too large. if (quality == kHigh_SkFilterQuality) { - if (image.matrix_has_perspective() || !image.matrix_is_decomposable()) { + if (!image.matrix_is_decomposable()) { quality = kMedium_SkFilterQuality; } else { base::CheckedNumeric<size_t> size = 4u;
diff --git a/cc/tiles/software_image_decode_controller_unittest.cc b/cc/tiles/software_image_decode_controller_unittest.cc index 33e4181..38246b38 100644 --- a/cc/tiles/software_image_decode_controller_unittest.cc +++ b/cc/tiles/software_image_decode_controller_unittest.cc
@@ -17,15 +17,26 @@ return skia::AdoptRef(SkImage::NewFromBitmap(bitmap)); } +SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) { + SkMatrix matrix; + matrix.setScale(scale.width(), scale.height()); + + if (!is_decomposable) { + // Perspective is not decomposable, add it. + matrix[SkMatrix::kMPersp0] = 0.1f; + } + + return matrix; +} + TEST(SoftwareImageDecodeControllerTest, ImageKeyLowQuality) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality qualities[] = {kNone_SkFilterQuality, kLow_SkFilterQuality}; for (auto quality : qualities) { DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -41,33 +52,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQuality) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kMedium_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable); - - auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); - EXPECT_EQ(image->uniqueID(), key.image_id()); - EXPECT_EQ(quality, key.filter_quality()); - EXPECT_EQ(50, key.target_size().width()); - EXPECT_EQ(150, key.target_size().height()); - EXPECT_FALSE(key.can_use_original_decode()); - EXPECT_EQ(50u * 150u * 4u, key.locked_bytes()); -} - -TEST(SoftwareImageDecodeControllerTest, - ImageKeyMediumQualityEvenWithPerspective) { - skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = true; - bool is_decomposable = true; - SkFilterQuality quality = kMedium_SkFilterQuality; - - DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -81,13 +71,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfEnlarging) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kMedium_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(1.5f, 1.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -101,13 +90,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfIdentity) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kMedium_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -121,13 +109,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfNearlyIdentity) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kMedium_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(1.001f, 1.001f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(1.001f, 1.001f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -141,13 +128,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfNearlyIdentity2) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kMedium_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.999f, 0.999f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.999f, 0.999f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -161,13 +147,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfNotDecomposable) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = false; SkFilterQuality quality = kMedium_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -180,13 +165,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQuality) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -198,38 +182,17 @@ } TEST(SoftwareImageDecodeControllerTest, - ImageKeyHighQualityDropToMediumWithPerspective) { - skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = true; - bool is_decomposable = true; - SkFilterQuality quality = kHigh_SkFilterQuality; - - DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable); - - auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); - EXPECT_EQ(image->uniqueID(), key.image_id()); - EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality()); - EXPECT_EQ(50, key.target_size().width()); - EXPECT_EQ(150, key.target_size().height()); - EXPECT_FALSE(key.can_use_original_decode()); - EXPECT_EQ(50u * 150u * 4u, key.locked_bytes()); -} - -TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQualityDropToMediumIfTooLarge) { // Just over 64MB when scaled. skia::RefPtr<SkImage> image = CreateImage(4555, 2048); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; // At least one dimension should scale down, so that medium quality doesn't // become low. DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.9f, 2.f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.9f, 2.f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -243,13 +206,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNotDecomposable) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = false; SkFilterQuality quality = kHigh_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -263,13 +225,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfIdentity) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -283,13 +244,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNearlyIdentity) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(1.001f, 1.001f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(1.001f, 1.001f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -303,13 +263,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNearlyIdentity2) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.999f, 0.999f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.999f, 0.999f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -322,13 +281,12 @@ TEST(SoftwareImageDecodeControllerTest, OriginalDecodesAreEqual) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kLow_SkFilterQuality; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -339,8 +297,8 @@ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes()); DrawImage another_draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(1.5f, 1.5), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(1.5f, 1.5), is_decomposable)); auto another_key = ImageDecodeControllerKey::FromDrawImage(another_draw_image); @@ -356,13 +314,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageRectDoesNotContainSrcRect) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; DrawImage draw_image( image.get(), SkIRect::MakeXYWH(25, 35, image->width(), image->height()), - SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable); + quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -376,13 +333,12 @@ TEST(SoftwareImageDecodeControllerTest, ImageRectDoesNotContainSrcRectWithScale) { skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; DrawImage draw_image( image.get(), SkIRect::MakeXYWH(20, 30, image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); EXPECT_EQ(image->uniqueID(), key.image_id()); @@ -396,14 +352,13 @@ TEST(SoftwareImageDecodeControllerTest, GetTaskForImageSameImage) { SoftwareImageDecodeController controller; skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; uint64_t prepare_tiles_id = 1; DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); @@ -411,8 +366,8 @@ EXPECT_TRUE(task); DrawImage another_draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> another_task; need_unref = controller.GetTaskForImageAndRef( another_draw_image, prepare_tiles_id, &another_task); @@ -427,14 +382,13 @@ GetTaskForImageSameImageDifferentQuality) { SoftwareImageDecodeController controller; skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; DrawImage high_quality_draw_image( image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), kHigh_SkFilterQuality, has_perspective, - is_decomposable); + kHigh_SkFilterQuality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> high_quality_task; bool need_unref = controller.GetTaskForImageAndRef( high_quality_draw_image, prepare_tiles_id, &high_quality_task); @@ -443,8 +397,8 @@ DrawImage medium_quality_draw_image( image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), kMedium_SkFilterQuality, has_perspective, - is_decomposable); + kMedium_SkFilterQuality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> medium_quality_task; need_unref = controller.GetTaskForImageAndRef( medium_quality_draw_image, prepare_tiles_id, &medium_quality_task); @@ -457,8 +411,8 @@ DrawImage low_quality_draw_image( image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), kLow_SkFilterQuality, has_perspective, - is_decomposable); + kLow_SkFilterQuality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> low_quality_task; need_unref = controller.GetTaskForImageAndRef( low_quality_draw_image, prepare_tiles_id, &low_quality_task); @@ -474,14 +428,13 @@ TEST(SoftwareImageDecodeControllerTest, GetTaskForImageSameImageDifferentSize) { SoftwareImageDecodeController controller; skia::RefPtr<SkImage> image = CreateImage(100, 100); - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; DrawImage half_size_draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> half_size_task; bool need_unref = controller.GetTaskForImageAndRef( half_size_draw_image, prepare_tiles_id, &half_size_task); @@ -489,8 +442,8 @@ EXPECT_TRUE(half_size_task); DrawImage quarter_size_draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.25f, 0.25f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable)); scoped_refptr<ImageDecodeTask> quarter_size_task; need_unref = controller.GetTaskForImageAndRef( quarter_size_draw_image, prepare_tiles_id, &quarter_size_task); @@ -504,7 +457,6 @@ TEST(SoftwareImageDecodeControllerTest, GetTaskForImageDifferentImage) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; @@ -512,8 +464,8 @@ skia::RefPtr<SkImage> first_image = CreateImage(100, 100); DrawImage first_draw_image( first_image.get(), - SkIRect::MakeWH(first_image->width(), first_image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + SkIRect::MakeWH(first_image->width(), first_image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> first_task; bool need_unref = controller.GetTaskForImageAndRef( first_draw_image, prepare_tiles_id, &first_task); @@ -523,8 +475,8 @@ skia::RefPtr<SkImage> second_image = CreateImage(100, 100); DrawImage second_draw_image( second_image.get(), - SkIRect::MakeWH(second_image->width(), second_image->height()), - SkSize::Make(0.25f, 0.25f), quality, has_perspective, is_decomposable); + SkIRect::MakeWH(second_image->width(), second_image->height()), quality, + CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable)); scoped_refptr<ImageDecodeTask> second_task; need_unref = controller.GetTaskForImageAndRef(second_draw_image, prepare_tiles_id, &second_task); @@ -538,15 +490,14 @@ TEST(SoftwareImageDecodeControllerTest, GetTaskForImageAlreadyDecoded) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); @@ -574,15 +525,14 @@ TEST(SoftwareImageDecodeControllerTest, GetTaskForImageAlreadyPrerolled) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kLow_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); @@ -617,15 +567,14 @@ TEST(SoftwareImageDecodeControllerTest, GetTaskForImageCanceledGetsNewTask) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); @@ -665,15 +614,14 @@ TEST(SoftwareImageDecodeControllerTest, GetTaskForImageCanceledWhileReffedGetsNewTask) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); @@ -712,15 +660,14 @@ TEST(SoftwareImageDecodeControllerTest, GetDecodedImageForDraw) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); @@ -755,7 +702,6 @@ TEST(SoftwareImageDecodeControllerTest, GetDecodedImageForDrawWithNonContainedSrcRect) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; @@ -763,7 +709,7 @@ skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( image.get(), SkIRect::MakeXYWH(20, 30, image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); @@ -797,14 +743,13 @@ TEST(SoftwareImageDecodeControllerTest, GetDecodedImageForDrawAtRasterDecode) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); DecodedDrawImage decoded_draw_image = controller.GetDecodedImageForDraw(draw_image); @@ -823,14 +768,13 @@ TEST(SoftwareImageDecodeControllerTest, GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); DecodedDrawImage decoded_draw_image = controller.GetDecodedImageForDraw(draw_image); @@ -855,15 +799,14 @@ TEST(SoftwareImageDecodeControllerTest, GetDecodedImageForDrawAtRasterDecodeDoesNotPreventTasks) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); DecodedDrawImage decoded_draw_image = controller.GetDecodedImageForDraw(draw_image); @@ -910,15 +853,14 @@ TEST(SoftwareImageDecodeControllerTest, GetDecodedImageForDrawAtRasterDecodeIsUsedForLockedCache) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); DecodedDrawImage decoded_draw_image = controller.GetDecodedImageForDraw(draw_image); @@ -965,15 +907,14 @@ TEST(SoftwareImageDecodeControllerTest, ZeroSizedImagesAreSkipped) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(0.f, 0.f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = @@ -990,7 +931,6 @@ TEST(SoftwareImageDecodeControllerTest, NonOverlappingSrcRectImagesAreSkipped) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kHigh_SkFilterQuality; @@ -998,7 +938,7 @@ skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( image.get(), SkIRect::MakeXYWH(150, 150, image->width(), image->height()), - SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable); + quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = @@ -1015,15 +955,14 @@ TEST(SoftwareImageDecodeControllerTest, LowQualityFilterIsHandled) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kLow_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); DrawImage draw_image( - image.get(), SkIRect::MakeWH(image->width(), image->height()), - SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable); + image.get(), SkIRect::MakeWH(image->width(), image->height()), quality, + CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = @@ -1044,15 +983,13 @@ TEST(SoftwareImageDecodeControllerTest, LowQualityScaledSubrectIsHandled) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kLow_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); - DrawImage draw_image(image.get(), SkIRect::MakeXYWH(10, 10, 80, 80), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, - is_decomposable); + DrawImage draw_image(image.get(), SkIRect::MakeXYWH(10, 10, 80, 80), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref = @@ -1075,15 +1012,13 @@ TEST(SoftwareImageDecodeControllerTest, NoneQualityScaledSubrectIsHandled) { SoftwareImageDecodeController controller; - bool has_perspective = false; bool is_decomposable = true; uint64_t prepare_tiles_id = 1; SkFilterQuality quality = kNone_SkFilterQuality; skia::RefPtr<SkImage> image = CreateImage(100, 100); - DrawImage draw_image(image.get(), SkIRect::MakeXYWH(10, 10, 80, 80), - SkSize::Make(0.5f, 0.5f), quality, has_perspective, - is_decomposable); + DrawImage draw_image(image.get(), SkIRect::MakeXYWH(10, 10, 80, 80), quality, + CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); scoped_refptr<ImageDecodeTask> task; bool need_unref =
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index cb78047..c0786df 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -345,12 +345,15 @@ gfx::Size(scroll_layer->bounds().width() + kMaxScrollOffset.x(), scroll_layer->bounds().height() + kMaxScrollOffset.y())); scroll_layer->SetScrollClipLayer(clip_layer->id()); - scroll_layer->SetScrollDelta(kScrollDelta); + SetScrollOffsetDelta(scroll_layer, kScrollDelta); gfx::Transform impl_transform; scroll_layer->AddChild(std::move(sublayer_scoped_ptr)); LayerImpl* scroll_layer_raw_ptr = scroll_layer_scoped_ptr.get(); clip_layer->AddChild(std::move(scroll_layer_scoped_ptr)); - scroll_layer_raw_ptr->PushScrollOffsetFromMainThread(kScrollOffset); + scroll_layer_raw_ptr->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer_raw_ptr->id(), + kScrollOffset); scoped_ptr<LayerImpl> root(LayerImpl::Create(host_impl.active_tree(), 3)); SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(), @@ -7113,7 +7116,9 @@ FakeLayerTreeHostImpl host_impl(&task_runner_provider, &shared_bitmap_manager, &task_graph_runner); host_impl.CreatePendingTree(); - scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1); + scoped_ptr<LayerImpl> root_ptr = + LayerImpl::Create(host_impl.active_tree(), 1); + LayerImpl* root = root_ptr.get(); scoped_ptr<LayerImpl> container = LayerImpl::Create(host_impl.active_tree(), 2); LayerImpl* container_layer = container.get(); @@ -7136,7 +7141,7 @@ container_transform.Translate3d(10.0, 20.0, 0.0); gfx::Vector2dF container_offset = container_transform.To2dTranslation(); - SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(), + SetLayerPropertiesForTesting(root, identity_transform, gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50), true, false, true); SetLayerPropertiesForTesting(container.get(), container_transform, @@ -7159,14 +7164,20 @@ // Rounded to integers already. { + root->layer_tree_impl()->SetRootLayer(std::move(root_ptr)); + root->layer_tree_impl()->BuildPropertyTreesForTesting(); + gfx::Vector2dF scroll_delta(3.0, 5.0); - scroll_layer->SetScrollDelta(scroll_delta); + SetScrollOffsetDelta(scroll_layer, scroll_delta); LayerImplList render_surface_layer_list; root->layer_tree_impl()->IncrementRenderSurfaceListIdForTesting(); LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( - root.get(), root->bounds(), &render_surface_layer_list, + root, root->bounds(), &render_surface_layer_list, root->layer_tree_impl()->current_render_surface_list_id()); + root->layer_tree_impl() + ->property_trees() + ->transform_tree.set_source_to_parent_updates_allowed(false); LayerTreeHostCommon::CalculateDrawProperties(&inputs); EXPECT_TRANSFORMATION_MATRIX_EQ( @@ -7182,15 +7193,17 @@ // Scroll delta requiring rounding. { + root->layer_tree_impl()->BuildPropertyTreesForTesting(); + gfx::Vector2dF scroll_delta(4.1f, 8.1f); - scroll_layer->SetScrollDelta(scroll_delta); + SetScrollOffsetDelta(scroll_layer, scroll_delta); gfx::Vector2dF rounded_scroll_delta(4.f, 8.f); LayerImplList render_surface_layer_list; root->layer_tree_impl()->IncrementRenderSurfaceListIdForTesting(); LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( - root.get(), root->bounds(), &render_surface_layer_list, + root, root->bounds(), &render_surface_layer_list, root->layer_tree_impl()->current_render_surface_list_id()); LayerTreeHostCommon::CalculateDrawProperties(&inputs); @@ -7207,21 +7220,20 @@ // Scale is applied earlier in the tree. { + SetScrollOffsetDelta(scroll_layer, gfx::Vector2dF()); gfx::Transform scaled_container_transform = container_transform; scaled_container_transform.Scale3d(2.0, 2.0, 1.0); container_layer->SetTransform(scaled_container_transform); root->layer_tree_impl()->property_trees()->needs_rebuild = true; - root->layer_tree_impl() - ->property_trees() - ->transform_tree.set_source_to_parent_updates_allowed(true); + root->layer_tree_impl()->BuildPropertyTreesForTesting(); gfx::Vector2dF scroll_delta(4.5f, 8.5f); - scroll_layer->SetScrollDelta(scroll_delta); + SetScrollOffsetDelta(scroll_layer, scroll_delta); LayerImplList render_surface_layer_list; root->layer_tree_impl()->IncrementRenderSurfaceListIdForTesting(); LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( - root.get(), root->bounds(), &render_surface_layer_list, + root, root->bounds(), &render_surface_layer_list, root->layer_tree_impl()->current_render_surface_list_id()); LayerTreeHostCommon::CalculateDrawProperties(&inputs); @@ -7252,7 +7264,9 @@ FakeLayerTreeHostImpl host_impl(&task_runner_provider, &shared_bitmap_manager, &task_graph_runner); host_impl.CreatePendingTree(); - scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1); + scoped_ptr<LayerImpl> root_ptr = + LayerImpl::Create(host_impl.active_tree(), 1); + LayerImpl* root = root_ptr.get(); scoped_ptr<LayerImpl> container = LayerImpl::Create(host_impl.active_tree(), 2); LayerImpl* container_layer = container.get(); @@ -7278,7 +7292,7 @@ container_transform.Translate3d(10.0, 20.0, 0.0); gfx::Vector2dF container_offset = container_transform.To2dTranslation(); - SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(), + SetLayerPropertiesForTesting(root, identity_transform, gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50), true, false, true); SetLayerPropertiesForTesting(container.get(), container_transform, @@ -7296,18 +7310,26 @@ SetLayerPropertiesForTesting(fixed.get(), identity_transform, gfx::Point3F(), gfx::PointF(3.0f, 4.0f), gfx::Size(50, 50), true, false, false); - scroll_layer->PushScrollOffsetFromMainThread(scroll_offset); - scroll_layer->SetScrollDelta(scroll_delta); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer->id(), + scroll_offset); + scroll_layer->SetScrollCompensationAdjustment(main_scroll_fractional_part); scroller->AddChild(std::move(fixed)); container->AddChild(std::move(scroller)); root->AddChild(std::move(container)); + root->layer_tree_impl()->SetRootLayer(std::move(root_ptr)); + root->layer_tree_impl()->BuildPropertyTreesForTesting(); + + SetScrollOffsetDelta(scroll_layer, scroll_delta); + LayerImplList render_surface_layer_list; root->layer_tree_impl()->IncrementRenderSurfaceListIdForTesting(); LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( - root.get(), root->bounds(), &render_surface_layer_list, + root, root->bounds(), &render_surface_layer_list, root->layer_tree_impl()->current_render_surface_list_id()); LayerTreeHostCommon::CalculateDrawProperties(&inputs); @@ -7380,7 +7402,7 @@ end_operations); } gfx::Vector2dF scroll_delta(5.f, 9.f); - scroller->SetScrollDelta(scroll_delta); + SetScrollOffsetDelta(scroller, scroll_delta); ExecuteCalculateDrawProperties(root);
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index adf570b5..19febba 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -255,6 +255,7 @@ active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), new SyncedTopControls, new SyncedElasticOverscroll); + active_tree_->property_trees()->is_active = true; viewport_ = Viewport::Create(this); @@ -1209,6 +1210,7 @@ LayerTreeImpl::create(this, active_tree()->page_scale_factor(), active_tree()->top_controls_shown_ratio(), active_tree()->elastic_overscroll()); + active_tree_->property_trees()->is_active = true; if (pending_tree_) pending_tree_->DetachLayerTree(); pending_tree_ = nullptr;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 8ecfcdf8..46b98cf 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -227,8 +227,18 @@ host_impl_->active_tree()->SetRootLayer(std::move(root)); } + static gfx::Vector2dF ScrollDelta(LayerImpl* layer_impl) { + if (layer_impl->IsActive()) + return gfx::Vector2dF(layer_impl->synced_scroll_offset()->Delta().x(), + layer_impl->synced_scroll_offset()->Delta().y()); + else + return gfx::Vector2dF( + layer_impl->synced_scroll_offset()->PendingDelta().get().x(), + layer_impl->synced_scroll_offset()->PendingDelta().get().y()); + } + static void ExpectClearedScrollDeltasRecursive(LayerImpl* layer) { - ASSERT_EQ(layer->ScrollDelta(), gfx::Vector2d()); + ASSERT_EQ(ScrollDelta(layer), gfx::Vector2d()); for (size_t i = 0; i < layer->children().size(); ++i) ExpectClearedScrollDeltasRecursive(layer->children()[i].get()); } @@ -289,7 +299,10 @@ scoped_ptr<LayerImpl> inner_scroll = LayerImpl::Create(layer_tree_impl, kInnerViewportScrollLayerId); inner_scroll->SetIsContainerForFixedPositionLayers(true); - inner_scroll->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); + inner_scroll->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(inner_scroll->id(), + gfx::ScrollOffset()); scoped_ptr<LayerImpl> inner_clip = LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId); @@ -311,7 +324,10 @@ scoped_ptr<LayerImpl> outer_scroll = LayerImpl::Create(layer_tree_impl, kOuterViewportScrollLayerId); outer_scroll->SetScrollClipLayer(outer_clip->id()); - outer_scroll->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); + outer_scroll->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(outer_scroll->id(), + gfx::ScrollOffset()); outer_scroll->SetBounds(content_size); outer_scroll->SetPosition(gfx::PointF()); @@ -459,6 +475,13 @@ host_impl_->DidDrawAllLayers(frame_data); } + static void SetScrollOffsetDelta(LayerImpl* layer_impl, + const gfx::Vector2dF& delta) { + layer_impl->SetCurrentScrollOffset( + layer_impl->synced_scroll_offset()->ActiveBase() + + gfx::ScrollOffset(delta)); + } + FakeImplTaskRunnerProvider task_runner_provider_; DebugScopedSetMainThreadBlocked always_main_thread_blocked_; @@ -600,7 +623,10 @@ root_clip->AddChild(std::move(root)); root_layer->SetBounds(gfx::Size(110, 110)); root_layer->SetScrollClipLayer(root_clip->id()); - root_layer->PushScrollOffsetFromMainThread(scroll_offset); + root_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(root_layer->id(), + scroll_offset); host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); host_impl_->active_tree()->BuildPropertyTreesForTesting(); root_layer->ScrollBy(scroll_delta); @@ -1118,7 +1144,7 @@ EXPECT_TRUE(host_impl_->ScrollVerticallyByPage( gfx::Point(), SCROLL_FORWARD)); EXPECT_FLOAT_EQ(875.f, - host_impl_->InnerViewportScrollLayer()->ScrollDelta().y()); + ScrollDelta(host_impl_->InnerViewportScrollLayer()).y()); EXPECT_TRUE(host_impl_->ScrollVerticallyByPage( gfx::Point(), SCROLL_BACKWARD)); } @@ -1132,7 +1158,10 @@ LayerImpl* overflow = scroll_layer->children()[0].get(); overflow->SetBounds(overflow_size); overflow->SetScrollClipLayer(scroll_layer->parent()->parent()->id()); - overflow->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); + overflow->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(overflow->id(), + gfx::ScrollOffset()); overflow->SetPosition(gfx::PointF()); SetNeedsRebuildPropertyTrees(); @@ -1478,7 +1507,7 @@ host_impl_->active_tree()->PushPageScaleFromMainThread( page_scale_factor, min_page_scale, max_page_scale); host_impl_->active_tree()->SetPageScaleOnActiveTree(page_scale_factor); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); float page_scale_delta = 2.f; @@ -1507,7 +1536,7 @@ host_impl_->active_tree()->PushPageScaleFromMainThread( page_scale_factor, min_page_scale, max_page_scale); host_impl_->active_tree()->SetPageScaleOnActiveTree(page_scale_factor); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); float page_scale_delta = 2.f; host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), @@ -1746,8 +1775,8 @@ // Reset. host_impl_->active_tree()->SetPageScaleOnActiveTree(1.f); - host_impl_->InnerViewportScrollLayer()->SetScrollDelta(gfx::Vector2d()); - host_impl_->OuterViewportScrollLayer()->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(host_impl_->InnerViewportScrollLayer(), gfx::Vector2d()); + SetScrollOffsetDelta(host_impl_->OuterViewportScrollLayer(), gfx::Vector2d()); // Pinch in within the margins. The scroll should stay exactly locked to the // top and left. @@ -1764,8 +1793,8 @@ // Reset. host_impl_->active_tree()->SetPageScaleOnActiveTree(1.f); - host_impl_->InnerViewportScrollLayer()->SetScrollDelta(gfx::Vector2d()); - host_impl_->OuterViewportScrollLayer()->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(host_impl_->InnerViewportScrollLayer(), gfx::Vector2d()); + SetScrollOffsetDelta(host_impl_->OuterViewportScrollLayer(), gfx::Vector2d()); // Pinch in just outside the margin. There should be no snapping. offsetFromEdge = Viewport::kPinchZoomSnapMarginDips; @@ -1782,8 +1811,8 @@ // Reset. host_impl_->active_tree()->SetPageScaleOnActiveTree(1.f); - host_impl_->InnerViewportScrollLayer()->SetScrollDelta(gfx::Vector2d()); - host_impl_->OuterViewportScrollLayer()->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(host_impl_->InnerViewportScrollLayer(), gfx::Vector2d()); + SetScrollOffsetDelta(host_impl_->OuterViewportScrollLayer(), gfx::Vector2d()); // Pinch in just outside the margin. There should be no snapping. offsetFromEdge = Viewport::kPinchZoomSnapMarginDips; @@ -1991,7 +2020,7 @@ { host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, min_page_scale, max_page_scale); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); float page_scale_delta = 2.f; host_impl_->ScrollBegin(BeginState(gfx::Point(50, 50)).get(), @@ -2013,7 +2042,7 @@ { host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, min_page_scale, max_page_scale); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); float page_scale_delta = 10.f; host_impl_->ScrollBegin(BeginState(gfx::Point(50, 50)).get(), @@ -2032,9 +2061,12 @@ { host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, min_page_scale, max_page_scale); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); scroll_layer->synced_scroll_offset()->PullDeltaForMainThread(); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(50, 50)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + scroll_layer->id(), gfx::ScrollOffset(50, 50)); float page_scale_delta = 0.1f; host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), @@ -2055,9 +2087,12 @@ { host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, min_page_scale, max_page_scale); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); scroll_layer->synced_scroll_offset()->PullDeltaForMainThread(); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(20, 20)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + scroll_layer->id(), gfx::ScrollOffset(20, 20)); float page_scale_delta = 1.f; host_impl_->ScrollBegin(BeginState(gfx::Point(10, 10)).get(), @@ -2078,9 +2113,12 @@ { host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, min_page_scale, max_page_scale); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); scroll_layer->synced_scroll_offset()->PullDeltaForMainThread(); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(20, 20)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + scroll_layer->id(), gfx::ScrollOffset(20, 20)); float page_scale_delta = 1.f; host_impl_->ScrollBegin(BeginState(gfx::Point(10, 10)).get(), @@ -2103,9 +2141,12 @@ // Two-finger panning should work when starting fully zoomed out. { host_impl_->active_tree()->PushPageScaleFromMainThread(0.5f, 0.5f, 4.f); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); scroll_layer->synced_scroll_offset()->PullDeltaForMainThread(); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 0)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer->id(), + gfx::ScrollOffset(0, 0)); host_impl_->ScrollBegin(BeginState(gfx::Point(0, 0)).get(), InputHandler::GESTURE); @@ -2153,7 +2194,10 @@ { host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, min_page_scale, max_page_scale); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(50, 50)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + scroll_layer->id(), gfx::ScrollOffset(50, 50)); did_request_redraw_ = false; did_request_next_frame_ = false; @@ -2210,7 +2254,10 @@ { host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, min_page_scale, max_page_scale); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(50, 50)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + scroll_layer->id(), gfx::ScrollOffset(50, 50)); did_request_redraw_ = false; did_request_next_frame_ = false; @@ -2276,7 +2323,10 @@ { host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, min_page_scale, max_page_scale); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(50, 50)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + scroll_layer->id(), gfx::ScrollOffset(50, 50)); host_impl_->active_tree()->SetPendingPageScaleAnimation( scoped_ptr<PendingPageScaleAnimation>(new PendingPageScaleAnimation( @@ -2339,7 +2389,10 @@ BeginFrameArgs begin_frame_args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(50, 50)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer->id(), + gfx::ScrollOffset(50, 50)); // Make sure TakePageScaleAnimation works properly. @@ -2451,7 +2504,10 @@ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE); host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 0.5f, 4.f); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(50, 50)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer->id(), + gfx::ScrollOffset(50, 50)); did_complete_page_scale_animation_ = false; host_impl_->active_tree()->SetPendingPageScaleAnimation( @@ -2661,8 +2717,12 @@ // Setting the scroll offset outside a scroll should also cause the // scrollbar to appear and to schedule a scrollbar animation. - host_impl_->InnerViewportScrollLayer()->PushScrollOffsetFromMainThread( - gfx::ScrollOffset(5, 5)); + if (host_impl_->active_tree() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + host_impl_->InnerViewportScrollLayer()->id(), + gfx::ScrollOffset(5, 5))) + host_impl_->InnerViewportScrollLayer()->DidUpdateScrollOffset(); EXPECT_FALSE(did_request_next_frame_); EXPECT_FALSE(did_request_redraw_); EXPECT_EQ(base::TimeDelta::FromMilliseconds(20), @@ -3692,7 +3752,10 @@ host_impl_->active_tree()->OuterViewportScrollLayer(); LayerImpl* pending_outer_layer = host_impl_->pending_tree()->OuterViewportScrollLayer(); - pending_outer_layer->PushScrollOffsetFromMainThread(pending_scroll); + pending_outer_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(pending_outer_layer->id(), + pending_scroll); host_impl_->ActivateSyncTree(); // Scrolloffsets on the active tree will be clamped after activation. @@ -4073,7 +4136,7 @@ child->SetIsContainerForFixedPositionLayers(true); // scroll child to limit - child->SetScrollDelta(gfx::Vector2dF(0, 100.f)); + SetScrollOffsetDelta(child.get(), gfx::Vector2dF(0, 100.f)); child_clip->AddChild(std::move(child)); outer_viewport_scroll_layer->AddChild(std::move(child_clip)); @@ -4233,8 +4296,8 @@ LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer(); // Scroll the viewports to max scroll offset. - outer_scroll->SetScrollDelta(gfx::Vector2dF(0, 200.f)); - inner_scroll->SetScrollDelta(gfx::Vector2dF(100, 100.f)); + SetScrollOffsetDelta(outer_scroll, gfx::Vector2dF(0, 200.f)); + SetScrollOffsetDelta(inner_scroll, gfx::Vector2dF(100, 100.f)); gfx::ScrollOffset viewport_offset = host_impl_->active_tree()->TotalScrollOffset(); @@ -4282,8 +4345,8 @@ host_impl_->active_tree()->TotalScrollOffset()); // Scroll the viewports to max scroll offset. - outer_scroll->SetScrollDelta(gfx::Vector2dF(0, 200.f)); - inner_scroll->SetScrollDelta(gfx::Vector2dF(100, 100.f)); + SetScrollOffsetDelta(outer_scroll, gfx::Vector2dF(0, 200.f)); + SetScrollOffsetDelta(inner_scroll, gfx::Vector2dF(100, 100.f)); EXPECT_EQ(host_impl_->active_tree()->TotalMaxScrollOffset(), host_impl_->active_tree()->TotalScrollOffset()); } @@ -4371,8 +4434,10 @@ // Position the viewports such that the inner viewport will be scrolled. gfx::Vector2dF inner_viewport_offset(0.f, 25.f); - host_impl_->OuterViewportScrollLayer()->SetScrollDelta(gfx::Vector2dF()); - host_impl_->InnerViewportScrollLayer()->SetScrollDelta(inner_viewport_offset); + SetScrollOffsetDelta(host_impl_->OuterViewportScrollLayer(), + gfx::Vector2dF()); + SetScrollOffsetDelta(host_impl_->InnerViewportScrollLayer(), + inner_viewport_offset); scroll_delta = gfx::Vector2dF(0.f, -65.f); EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, @@ -4385,7 +4450,7 @@ host_impl_->top_controls_manager()->ContentTopOffset()); EXPECT_FLOAT_EQ( inner_viewport_offset.y() + (scroll_delta.y() + top_controls_height_), - host_impl_->InnerViewportScrollLayer()->ScrollDelta().y()); + ScrollDelta(host_impl_->InnerViewportScrollLayer()).y()); host_impl_->ScrollEnd(EndState().get()); } @@ -4810,8 +4875,14 @@ host_impl_->active_tree()->SetRootLayer(std::move(root)); host_impl_->active_tree()->DidBecomeActive(); host_impl_->SetViewportSize(surface_size); - grand_child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 5)); - child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(3, 0)); + grand_child_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(grand_child_layer->id(), + gfx::ScrollOffset(0, 5)); + child_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(child_layer->id(), + gfx::ScrollOffset(3, 0)); SetNeedsRebuildPropertyTrees(); DrawFrame(); @@ -4872,8 +4943,14 @@ host_impl_->active_tree()->DidBecomeActive(); host_impl_->SetViewportSize(viewport_size); - grand_child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 2)); - child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 3)); + grand_child_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(grand_child_layer->id(), + gfx::ScrollOffset(0, 2)); + child_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(child_layer->id(), + gfx::ScrollOffset(0, 3)); SetNeedsRebuildPropertyTrees(); DrawFrame(); @@ -5092,7 +5169,7 @@ gfx::Vector2d(0, gesture_scroll_delta.x()))); // Reset and scroll down with the wheel. - scroll_layer->SetScrollDelta(gfx::Vector2dF()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2dF()); gfx::Vector2d wheel_scroll_delta(0, 10); EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), @@ -5166,7 +5243,7 @@ } { // Now reset and scroll the same amount horizontally. - child_ptr->SetScrollDelta(gfx::Vector2dF()); + SetScrollOffsetDelta(child_ptr, gfx::Vector2dF()); gfx::Vector2d gesture_scroll_delta(10, 0); EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, host_impl_->ScrollBegin(BeginState(gfx::Point(1, 1)).get(), @@ -5247,7 +5324,7 @@ // where the previous scroll ended, but the scroll position is reset // for each scroll. for (int i = 0; i < 4; ++i) { - child_ptr->SetScrollDelta(gfx::Vector2dF()); + SetScrollOffsetDelta(child_ptr, gfx::Vector2dF()); DrawFrame(); EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, host_impl_->ScrollBegin(BeginState(viewport_point).get(), @@ -5299,7 +5376,7 @@ gfx::Vector2d(0, scroll_delta.y() / scale))); // Reset and scroll down with the wheel. - scroll_layer->SetScrollDelta(gfx::Vector2dF()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2dF()); gfx::Vector2d wheel_scroll_delta(0, 10); EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), @@ -5407,8 +5484,11 @@ host_impl_->BindToClient(&scroll_watcher); gfx::Vector2dF initial_scroll_delta(10.f, 10.f); - scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); - scroll_layer->SetScrollDelta(initial_scroll_delta); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer->id(), + gfx::ScrollOffset()); + SetScrollOffsetDelta(scroll_layer, initial_scroll_delta); EXPECT_EQ(gfx::ScrollOffset(), scroll_watcher.last_set_scroll_offset()); @@ -5679,8 +5759,14 @@ LayerImpl* child_layer = child.get(); root->AddChild(std::move(child)); root_clip->AddChild(std::move(root)); - child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 3)); - grand_child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 2)); + child_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(child_layer->id(), + gfx::ScrollOffset(0, 3)); + grand_child_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(grand_child_layer->id(), + gfx::ScrollOffset(0, 2)); host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); host_impl_->active_tree()->DidBecomeActive(); host_impl_->SetViewportSize(surface_size); @@ -7214,7 +7300,10 @@ gfx::ScrollOffset scroll_offset(100000, 0); scrolling_layer->SetScrollClipLayer(root->id()); - scrolling_layer->PushScrollOffsetFromMainThread(scroll_offset); + scrolling_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scrolling_layer->id(), + scroll_offset); host_impl_->pending_tree()->BuildPropertyTreesForTesting(); host_impl_->ActivateSyncTree(); @@ -7615,11 +7704,17 @@ scoped_ptr<LayerImpl> grand_child = CreateScrollableLayer(4, surface_size, root.get()); - grand_child->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 2)); + grand_child->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(grand_child->id(), + gfx::ScrollOffset(0, 2)); scoped_ptr<LayerImpl> child = CreateScrollableLayer(3, surface_size, root.get()); - child->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 4)); + child->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(child->id(), + gfx::ScrollOffset(0, 4)); child->AddChild(std::move(grand_child)); root_scrolling->AddChild(std::move(child)); @@ -8173,8 +8268,11 @@ const int LayerTreeHostImplWithTopControlsTest::top_controls_height_ = 50; TEST_F(LayerTreeHostImplWithTopControlsTest, NoIdleAnimations) { - SetupScrollAndContentsLayers(gfx::Size(100, 100)) - ->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 10)); + LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer->id(), + gfx::ScrollOffset(0, 10)); BeginFrameArgs begin_frame_args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE); host_impl_->WillBeginImplFrame(begin_frame_args); @@ -8209,8 +8307,11 @@ } TEST_F(LayerTreeHostImplWithTopControlsTest, TopControlsAnimationScheduling) { - SetupScrollAndContentsLayers(gfx::Size(100, 100)) - ->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 10)); + LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer->id(), + gfx::ScrollOffset(0, 10)); host_impl_->DidChangeTopControlsPosition(); EXPECT_TRUE(did_request_next_frame_); EXPECT_TRUE(did_request_redraw_); @@ -8407,8 +8508,10 @@ host_impl_->top_controls_manager()->UpdateTopControlsState( BOTH, SHOWN, false); float initial_scroll_offset = 50; - scroll_layer->PushScrollOffsetFromMainThread( - gfx::ScrollOffset(0, initial_scroll_offset)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + scroll_layer->id(), gfx::ScrollOffset(0, initial_scroll_offset)); DrawFrame(); EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, @@ -8478,8 +8581,10 @@ host_impl_->top_controls_manager()->UpdateTopControlsState(BOTH, SHOWN, false); float initial_scroll_offset = 50; - scroll_layer->PushScrollOffsetFromMainThread( - gfx::ScrollOffset(0, initial_scroll_offset)); + scroll_layer->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting( + scroll_layer->id(), gfx::ScrollOffset(0, initial_scroll_offset)); DrawFrame(); EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, @@ -8631,7 +8736,10 @@ scoped_ptr<LayerImpl> inner_scroll = LayerImpl::Create(layer_tree_impl, kInnerViewportScrollLayerId); inner_scroll->SetIsContainerForFixedPositionLayers(true); - inner_scroll->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); + inner_scroll->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(inner_scroll->id(), + gfx::ScrollOffset()); scoped_ptr<LayerImpl> inner_clip = LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId); @@ -8652,7 +8760,10 @@ scoped_ptr<LayerImpl> outer_scroll = LayerImpl::Create(layer_tree_impl, kOuterViewportScrollLayerId); outer_scroll->SetScrollClipLayer(outer_clip->id()); - outer_scroll->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); + outer_scroll->layer_tree_impl() + ->property_trees() + ->scroll_tree.UpdateScrollOffsetBaseForTesting(outer_scroll->id(), + gfx::ScrollOffset()); outer_scroll->SetBounds(content_size); outer_scroll->SetPosition(gfx::PointF()); @@ -9752,7 +9863,7 @@ host_impl_->active_tree()->PushPageScaleFromMainThread( page_scale_factor, min_page_scale, max_page_scale); host_impl_->active_tree()->SetPageScaleOnActiveTree(page_scale_factor); - scroll_layer->SetScrollDelta(gfx::Vector2d()); + SetScrollOffsetDelta(scroll_layer, gfx::Vector2d()); float page_scale_delta = 2.f; host_impl_->ScrollBegin(BeginState(gfx::Point()).get(),
diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc index 5d9bcbf..0503aa3 100644 --- a/cc/trees/layer_tree_host_unittest_animation.cc +++ b/cc/trees/layer_tree_host_unittest_animation.cc
@@ -772,7 +772,7 @@ // Block activation until the running animation has a chance to produce a // scroll delta. - gfx::Vector2dF scroll_delta = scroll_layer_impl->ScrollDelta(); + gfx::Vector2dF scroll_delta = ScrollDelta(scroll_layer_impl); if (scroll_delta.x() < 1.f || scroll_delta.y() < 1.f) return;
diff --git a/cc/trees/layer_tree_host_unittest_animation_timelines.cc b/cc/trees/layer_tree_host_unittest_animation_timelines.cc index b5593b1e..1bd2696 100644 --- a/cc/trees/layer_tree_host_unittest_animation_timelines.cc +++ b/cc/trees/layer_tree_host_unittest_animation_timelines.cc
@@ -677,7 +677,7 @@ // Block activation until the running animation has a chance to produce a // scroll delta. - gfx::Vector2dF scroll_delta = scroll_layer_impl->ScrollDelta(); + gfx::Vector2dF scroll_delta = ScrollDelta(scroll_layer_impl); if (scroll_delta.x() < 1.f || scroll_delta.y() < 1.f) return;
diff --git a/cc/trees/layer_tree_host_unittest_scroll.cc b/cc/trees/layer_tree_host_unittest_scroll.cc index c3dc75275..4df2e0b4 100644 --- a/cc/trees/layer_tree_host_unittest_scroll.cc +++ b/cc/trees/layer_tree_host_unittest_scroll.cc
@@ -56,6 +56,10 @@ return scroll_state; } +static ScrollTree* ScrollTreeForLayer(LayerImpl* layer_impl) { + return &layer_impl->layer_tree_impl()->property_trees()->scroll_tree; +} + class LayerTreeHostScrollTest : public LayerTreeTest { protected: void SetupTree() override { @@ -106,7 +110,7 @@ void DrawLayersOnThread(LayerTreeHostImpl* impl) override { LayerImpl* root = impl->active_tree()->root_layer(); LayerImpl* scroll_layer = impl->OuterViewportScrollLayer(); - EXPECT_VECTOR_EQ(gfx::Vector2d(), scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer)); scroll_layer->SetScrollClipLayer(root->children()[0]->id()); scroll_layer->SetBounds( @@ -115,13 +119,17 @@ switch (impl->active_tree()->source_frame_number()) { case 0: - EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(scroll_amount_, scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); + EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); PostSetNeedsCommitToMainThread(); break; case 1: - EXPECT_VECTOR_EQ(second_scroll_, scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(scroll_amount_, scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(second_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); + EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); EndTest(); break; } @@ -183,26 +191,27 @@ if (impl->active_tree()->source_frame_number() == 0 && impl->SourceAnimationFrameNumberForTesting() == 1) { // First draw after first commit. - EXPECT_VECTOR_EQ(gfx::Vector2d(), scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer)); scroll_layer->ScrollBy(scroll_amount_); - EXPECT_VECTOR_EQ(scroll_amount_, scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); - EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->BaseScrollOffset()); + EXPECT_VECTOR_EQ(initial_scroll_, + ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting(scroll_layer->id())); PostSetNeedsRedrawToMainThread(); } else if (impl->active_tree()->source_frame_number() == 0 && impl->SourceAnimationFrameNumberForTesting() == 2) { // Second draw after first commit. - EXPECT_EQ(scroll_layer->ScrollDelta(), scroll_amount_); + EXPECT_EQ(ScrollDelta(scroll_layer), scroll_amount_); scroll_layer->ScrollBy(scroll_amount_); EXPECT_VECTOR_EQ(scroll_amount_ + scroll_amount_, - scroll_layer->ScrollDelta()); + ScrollDelta(scroll_layer)); EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer_->scroll_offset()); PostSetNeedsCommitToMainThread(); } else if (impl->active_tree()->source_frame_number() == 1) { // Third or later draw after second commit. EXPECT_GE(impl->SourceAnimationFrameNumberForTesting(), 3u); - EXPECT_VECTOR_EQ(gfx::Vector2d(), scroll_layer_->ScrollDelta()); EXPECT_VECTOR_EQ( gfx::ScrollOffsetWithDelta(initial_scroll_, scroll_amount_ + scroll_amount_), @@ -328,10 +337,12 @@ if (impl->active_tree()->source_frame_number() == 0 && impl->SourceAnimationFrameNumberForTesting() == 1) { // First draw - EXPECT_VECTOR_EQ(gfx::Vector2d(), root_scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(root_scroll_layer)); root_scroll_layer->ScrollBy(impl_scroll_); - EXPECT_VECTOR_EQ(impl_scroll_, root_scroll_layer->ScrollDelta()); - EXPECT_VECTOR_EQ(initial_scroll_, root_scroll_layer->BaseScrollOffset()); + EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); + EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(root_scroll_layer) + ->GetScrollOffsetBaseForTesting( + root_scroll_layer->id())); EXPECT_EQ(1.f, impl->active_tree()->page_scale_delta()); EXPECT_EQ(1.f, impl->active_tree()->current_page_scale_factor()); @@ -346,12 +357,13 @@ // Test a second draw after an aborted commit. // The scroll/scale values should be baked into the offset/scale factor // since the main thread consumed but aborted the begin frame. - EXPECT_VECTOR_EQ(gfx::Vector2d(), root_scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(root_scroll_layer)); root_scroll_layer->ScrollBy(impl_scroll_); - EXPECT_VECTOR_EQ(impl_scroll_, root_scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); EXPECT_VECTOR_EQ( gfx::ScrollOffsetWithDelta(initial_scroll_, impl_scroll_), - root_scroll_layer->BaseScrollOffset()); + ScrollTreeForLayer(root_scroll_layer) + ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); EXPECT_EQ(1.f, impl->active_tree()->page_scale_delta()); EXPECT_EQ(impl_scale_, impl->active_tree()->current_page_scale_factor()); @@ -367,21 +379,25 @@ } else if (impl->active_tree()->source_frame_number() == 2 && impl->SourceAnimationFrameNumberForTesting() == 3) { // Third draw after the second full commit. - EXPECT_EQ(root_scroll_layer->ScrollDelta(), gfx::Vector2d()); + EXPECT_EQ(ScrollDelta(root_scroll_layer), gfx::Vector2d()); root_scroll_layer->ScrollBy(impl_scroll_); impl->SetNeedsCommit(); - EXPECT_VECTOR_EQ(impl_scroll_, root_scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); gfx::Vector2dF delta = impl_scroll_ + impl_scroll_ + second_main_scroll_; - EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(initial_scroll_, delta), - root_scroll_layer->BaseScrollOffset()); + EXPECT_VECTOR_EQ( + gfx::ScrollOffsetWithDelta(initial_scroll_, delta), + ScrollTreeForLayer(root_scroll_layer) + ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); } else if (impl->active_tree()->source_frame_number() == 2 && impl->SourceAnimationFrameNumberForTesting() == 4) { // Final draw after the second aborted commit. - EXPECT_VECTOR_EQ(gfx::Vector2d(), root_scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(root_scroll_layer)); gfx::Vector2dF delta = impl_scroll_ + impl_scroll_ + impl_scroll_ + second_main_scroll_; - EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(initial_scroll_, delta), - root_scroll_layer->BaseScrollOffset()); + EXPECT_VECTOR_EQ( + gfx::ScrollOffsetWithDelta(initial_scroll_, delta), + ScrollTreeForLayer(root_scroll_layer) + ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); EndTest(); } else { // Commit for source frame 3 is aborted. @@ -441,24 +457,30 @@ // multiple commits. switch (impl->active_tree()->source_frame_number()) { case 0: - EXPECT_VECTOR_EQ(gfx::Vector2d(0, 0), scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2d(0, 0), scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ( + gfx::Vector2d(0, 0), + ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting(scroll_layer->id())); + EXPECT_VECTOR_EQ(gfx::Vector2d(0, 0), ScrollDelta(scroll_layer)); PostSetNeedsCommitToMainThread(); break; case 1: - EXPECT_VECTOR_EQ(gfx::ToFlooredVector2d(scroll_amount_), - scroll_layer->BaseScrollOffset()); + EXPECT_VECTOR_EQ( + gfx::ToFlooredVector2d(scroll_amount_), + ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting(scroll_layer->id())); EXPECT_VECTOR_EQ(gfx::Vector2dF(fmod(scroll_amount_.x(), 1.0f), 0.0f), - scroll_layer->ScrollDelta()); + ScrollDelta(scroll_layer)); PostSetNeedsCommitToMainThread(); break; case 2: EXPECT_VECTOR_EQ( gfx::ToFlooredVector2d(scroll_amount_ + scroll_amount_), - scroll_layer->BaseScrollOffset()); + ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting(scroll_layer->id())); EXPECT_VECTOR_EQ( gfx::Vector2dF(fmod(2.0f * scroll_amount_.x(), 1.0f), 0.0f), - scroll_layer->ScrollDelta()); + ScrollDelta(scroll_layer)); EndTest(); break; } @@ -605,9 +627,9 @@ expected_no_scroll_layer_impl = child_layer_impl; } - EXPECT_VECTOR_EQ(gfx::Vector2d(), inner_scroll->ScrollDelta()); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(inner_scroll)); EXPECT_VECTOR_EQ(gfx::Vector2d(), - expected_no_scroll_layer_impl->ScrollDelta()); + ScrollDelta(expected_no_scroll_layer_impl)); // Ensure device scale factor matches the active tree. EXPECT_EQ(device_scale_factor_, impl->active_tree()->device_scale_factor()); @@ -631,9 +653,11 @@ // Check the scroll is applied as a delta. EXPECT_VECTOR_EQ(initial_offset_, - expected_scroll_layer_impl->BaseScrollOffset()); + ScrollTreeForLayer(expected_scroll_layer_impl) + ->GetScrollOffsetBaseForTesting( + expected_scroll_layer_impl->id())); EXPECT_VECTOR_EQ(scroll_amount_, - expected_scroll_layer_impl->ScrollDelta()); + ScrollDelta(expected_scroll_layer_impl)); break; } case 1: { @@ -649,18 +673,22 @@ // Check the scroll is applied as a delta. EXPECT_VECTOR_EQ(javascript_scroll_, - expected_scroll_layer_impl->BaseScrollOffset()); + ScrollTreeForLayer(expected_scroll_layer_impl) + ->GetScrollOffsetBaseForTesting( + expected_scroll_layer_impl->id())); EXPECT_VECTOR_EQ(scroll_amount_, - expected_scroll_layer_impl->ScrollDelta()); + ScrollDelta(expected_scroll_layer_impl)); break; } case 2: EXPECT_VECTOR_EQ( gfx::ScrollOffsetWithDelta(javascript_scroll_, scroll_amount_), - expected_scroll_layer_impl->BaseScrollOffset()); + ScrollTreeForLayer(expected_scroll_layer_impl) + ->GetScrollOffsetBaseForTesting( + expected_scroll_layer_impl->id())); EXPECT_VECTOR_EQ(gfx::Vector2d(), - expected_scroll_layer_impl->ScrollDelta()); + ScrollDelta(expected_scroll_layer_impl)); EndTest(); break; @@ -838,11 +866,13 @@ case 0: if (!impl->pending_tree()) { impl->BlockNotifyReadyToActivateForTesting(true); - EXPECT_VECTOR_EQ(gfx::Vector2d(), scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer)); scroll_layer->ScrollBy(impl_thread_scroll1_); - EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(impl_thread_scroll1_, scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); + EXPECT_VECTOR_EQ(impl_thread_scroll1_, ScrollDelta(scroll_layer)); PostSetNeedsCommitToMainThread(); // CommitCompleteOnThread will trigger this function again @@ -853,18 +883,21 @@ EXPECT_EQ(impl->pending_tree()->source_frame_number(), 1); scroll_layer->ScrollBy(impl_thread_scroll2_); - EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->BaseScrollOffset()); + EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); EXPECT_VECTOR_EQ(impl_thread_scroll1_ + impl_thread_scroll2_, - scroll_layer->ScrollDelta()); + ScrollDelta(scroll_layer)); LayerImpl* pending_scroll_layer = impl->pending_tree()->OuterViewportScrollLayer(); EXPECT_VECTOR_EQ( gfx::ScrollOffsetWithDelta( initial_scroll_, main_thread_scroll_ + impl_thread_scroll1_), - pending_scroll_layer->BaseScrollOffset()); + ScrollTreeForLayer(pending_scroll_layer) + ->GetScrollOffsetBaseForTesting(pending_scroll_layer->id())); EXPECT_VECTOR_EQ(impl_thread_scroll2_, - pending_scroll_layer->ScrollDelta()); + ScrollDelta(pending_scroll_layer)); } break; case 1: @@ -872,8 +905,9 @@ EXPECT_VECTOR_EQ( gfx::ScrollOffsetWithDelta( initial_scroll_, main_thread_scroll_ + impl_thread_scroll1_), - scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(impl_thread_scroll2_, scroll_layer->ScrollDelta()); + ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting(scroll_layer->id())); + EXPECT_VECTOR_EQ(impl_thread_scroll2_, ScrollDelta(scroll_layer)); EndTest(); break; } @@ -961,30 +995,36 @@ ASSERT_TRUE(pending_scroll_layer); switch (impl->pending_tree()->source_frame_number()) { case 0: - EXPECT_VECTOR_EQ(initial_scroll_, - pending_scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2d(), pending_scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ( + initial_scroll_, + ScrollTreeForLayer(pending_scroll_layer) + ->GetScrollOffsetBaseForTesting(pending_scroll_layer->id())); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(pending_scroll_layer)); EXPECT_FALSE(active_root); break; case 1: // Even though the scroll happened during the commit, both layers // should have the appropriate scroll delta. - EXPECT_VECTOR_EQ(initial_scroll_, - pending_scroll_layer->BaseScrollOffset()); + EXPECT_VECTOR_EQ( + initial_scroll_, + ScrollTreeForLayer(pending_scroll_layer) + ->GetScrollOffsetBaseForTesting(pending_scroll_layer->id())); EXPECT_VECTOR_EQ(impl_thread_scroll_, - pending_scroll_layer->ScrollDelta()); + ScrollDelta(pending_scroll_layer)); ASSERT_TRUE(active_root); - EXPECT_VECTOR_EQ(initial_scroll_, - active_scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(impl_thread_scroll_, - active_scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ( + initial_scroll_, + ScrollTreeForLayer(active_scroll_layer) + ->GetScrollOffsetBaseForTesting(active_scroll_layer->id())); + EXPECT_VECTOR_EQ(impl_thread_scroll_, ScrollDelta(active_scroll_layer)); break; case 2: // On the next commit, this delta should have been sent and applied. EXPECT_VECTOR_EQ( gfx::ScrollOffsetWithDelta(initial_scroll_, impl_thread_scroll_), - pending_scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2d(), pending_scroll_layer->ScrollDelta()); + ScrollTreeForLayer(pending_scroll_layer) + ->GetScrollOffsetBaseForTesting(pending_scroll_layer->id())); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(pending_scroll_layer)); break; } } @@ -997,15 +1037,19 @@ switch (impl->active_tree()->source_frame_number()) { case 0: - EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(gfx::Vector2d(), scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer)); EXPECT_EQ(1.f, impl->active_tree()->page_scale_delta()); EXPECT_EQ(1.f, impl->active_tree()->current_page_scale_factor()); PostSetNeedsCommitToMainThread(); break; case 1: - EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->BaseScrollOffset()); - EXPECT_VECTOR_EQ(impl_thread_scroll_, scroll_layer->ScrollDelta()); + EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); + EXPECT_VECTOR_EQ(impl_thread_scroll_, ScrollDelta(scroll_layer)); EXPECT_EQ(impl_scale_, impl->active_tree()->page_scale_delta()); EXPECT_EQ(impl_scale_, impl->active_tree()->current_page_scale_factor()); @@ -1313,9 +1357,10 @@ LayerImpl* root = impl->OuterViewportScrollLayer(); switch (impl->active_tree()->source_frame_number()) { case 0: - root->child_at(0)->SetScrollDelta(gfx::Vector2dF(5, 5)); - root->child_at(0)->child_at(0)->SetScrollDelta(gfx::Vector2dF(5, 5)); - root->child_at(1)->SetScrollDelta(gfx::Vector2dF(5, 5)); + SetScrollOffsetDelta(root->child_at(0), gfx::Vector2dF(5, 5)); + SetScrollOffsetDelta(root->child_at(0)->child_at(0), + gfx::Vector2dF(5, 5)); + SetScrollOffsetDelta(root->child_at(1), gfx::Vector2dF(5, 5)); PostSetNeedsCommitToMainThread(); break; case 1: @@ -1363,6 +1408,13 @@ return scroll_layer.get(); } + static void SetScrollOffsetDelta(LayerImpl* layer_impl, + const gfx::Vector2dF& delta) { + layer_impl->SetCurrentScrollOffset( + layer_impl->synced_scroll_offset()->ActiveBase() + + gfx::ScrollOffset(delta)); + } + FakeLayerScrollClient root_scroll_layer_client_; FakeLayerScrollClient sibling_scroll_layer_client_; FakeLayerScrollClient child_scroll_layer_client_;
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 87fe6cf6..e9f11da9 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -81,7 +81,9 @@ event_listener_properties_(), top_controls_shrink_blink_size_(false), top_controls_height_(0), - top_controls_shown_ratio_(top_controls_shown_ratio) {} + top_controls_shown_ratio_(top_controls_shown_ratio) { + property_trees()->is_main_thread = false; +} LayerTreeImpl::~LayerTreeImpl() { BreakSwapPromises(IsActiveTree() ? SwapPromise::SWAP_FAILS @@ -909,6 +911,7 @@ void LayerTreeImpl::BuildPropertyTreesForTesting() { LayerTreeHostCommon::PreCalculateMetaInformationForTesting(root_layer_.get()); + property_trees_.transform_tree.set_source_to_parent_updates_allowed(true); PropertyTreeBuilder::BuildPropertyTrees( root_layer_.get(), PageScaleLayer(), InnerViewportScrollLayer(), OuterViewportScrollLayer(), OverscrollElasticityLayer(), @@ -916,6 +919,7 @@ current_page_scale_factor(), device_scale_factor(), gfx::Rect(DrawViewportSize()), layer_tree_host_impl_->DrawTransform(), &property_trees_); + property_trees_.transform_tree.set_source_to_parent_updates_allowed(false); } void LayerTreeImpl::IncrementRenderSurfaceListIdForTesting() {
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index 4738e01..34f8c49 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc
@@ -1487,6 +1487,14 @@ return layer_id_to_scroll_offset_map_[layer_id].get(); } +const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const { + if (layer_id_to_scroll_offset_map_.find(layer_id) == + layer_id_to_scroll_offset_map_.end()) { + return nullptr; + } + return layer_id_to_scroll_offset_map_.at(layer_id).get(); +} + gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( SyncedScrollOffset* scroll_offset) { // TODO(miletus): Remove all this temporary flooring machinery when @@ -1593,6 +1601,27 @@ return false; } +bool ScrollTree::UpdateScrollOffsetBaseForTesting( + int layer_id, + const gfx::ScrollOffset& offset) { + DCHECK(!property_trees()->is_main_thread); + bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset); + if (property_trees()->is_active) + changed |= synced_scroll_offset(layer_id)->PushPendingToActive(); + return changed; +} + +const gfx::ScrollOffset ScrollTree::GetScrollOffsetBaseForTesting( + int layer_id) const { + DCHECK(!property_trees()->is_main_thread); + if (synced_scroll_offset(layer_id)) + return property_trees()->is_active + ? synced_scroll_offset(layer_id)->ActiveBase() + : synced_scroll_offset(layer_id)->PendingBase(); + else + return gfx::ScrollOffset(); +} + PropertyTrees::PropertyTrees() : needs_rebuild(true), non_root_surfaces_enabled(true),
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h index c57ad75..64226fd 100644 --- a/cc/trees/property_tree.h +++ b/cc/trees/property_tree.h
@@ -576,8 +576,8 @@ void set_currently_scrolling_node(int scroll_node_id); gfx::Transform ScreenSpaceTransform(int scroll_node_id) const; - // synced_scroll_offset is supposed to be called by Layer/LayerImpl only SyncedScrollOffset* synced_scroll_offset(int layer_id); + const SyncedScrollOffset* synced_scroll_offset(int layer_id) const; void CollectScrollDeltas(ScrollAndScaleSet* scroll_info); void UpdateScrollOffsetMap(ScrollOffsetMap* new_scroll_offset_map, LayerTreeImpl* layer_tree_impl); @@ -585,6 +585,9 @@ const ScrollOffsetMap& scroll_offset_map() const; void ApplySentScrollDeltasFromAbortedCommit(); bool SetScrollOffset(int layer_id, const gfx::ScrollOffset& scroll_offset); + bool UpdateScrollOffsetBaseForTesting(int layer_id, + const gfx::ScrollOffset& offset); + const gfx::ScrollOffset GetScrollOffsetBaseForTesting(int layer_id) const; private: int currently_scrolling_node_id_;
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc index 14338a4..a4e8bbb8 100644 --- a/cc/trees/property_tree_builder.cc +++ b/cc/trees/property_tree_builder.cc
@@ -447,8 +447,7 @@ layer->set_should_flatten_transform_from_property_tree(false); data_for_children->scroll_compensation_adjustment += - layer->ScrollDelta() + layer->ScrollCompensationAdjustment() - - node->data.scroll_snap; + layer->ScrollCompensationAdjustment() - node->data.scroll_snap; node->owner_id = layer->id();
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index c5bbebb9..10e4134d 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -273,7 +273,9 @@ "junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterRouteTest.java", "junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterSinkObservationTest.java", "junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterTestBase.java", + "junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java", "junit/src/org/chromium/chrome/browser/media/router/cast/DiscoveryCallbackTest.java", + "junit/src/org/chromium/chrome/browser/media/router/cast/JSONTestUtils.java", "junit/src/org/chromium/chrome/browser/media/router/cast/TestUtils.java", "junit/src/org/chromium/chrome/browser/notifications/NotificationUIManagerUnitTest.java", "junit/src/org/chromium/chrome/browser/ntp/NativePageFactoryTest.java",
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index 369ba35..45f88f82 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -262,6 +262,9 @@ android:windowSoftInputMode="stateHidden|adjustPan" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc"> </activity> + <activity android:name="org.chromium.chrome.browser.signin.AccountSigninActivity" + android:theme="@style/MainTheme"> + </activity> <activity android:name="org.chromium.chrome.browser.preferences.Preferences" android:theme="@style/PreferencesTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc" @@ -497,6 +500,7 @@ </intent-filter> </receiver> + <!-- Bookmarks widget --> <receiver android:name="com.google.android.apps.chrome.appwidget.bookmarks.BookmarkThumbnailWidgetProvider" android:label="@string/bookmarks"> <intent-filter> @@ -512,7 +516,7 @@ android:exported="false" /> <receiver android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProxy" android:exported="false" /> - + <!-- Receiver for GCM messages. --> <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true"
diff --git a/chrome/android/java/res/layout/account_signin_view.xml b/chrome/android/java/res/layout/account_signin_view.xml new file mode 100644 index 0000000..41288f0 --- /dev/null +++ b/chrome/android/java/res/layout/account_signin_view.xml
@@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2015 The Chromium Authors. All rights reserved. + + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. +--> +<org.chromium.chrome.browser.signin.AccountSigninView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:chrome="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ScrollView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="72dp" + android:fillViewport="true"> + + <LinearLayout + android:id="@+id/fre_main_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:gravity="center_horizontal"> + + <TextView + android:id="@+id/title" + android:text="@string/signin_set_up_chrome" + style="@style/FreTitle"/> + + <!-- The orientation of this view is changed dynamically to give a nicer layout when in + landscape mode on devices with small screens. --> + <LinearLayout + android:id="@+id/fre_image_and_content" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:gravity="center_horizontal" + android:layout_marginTop="@dimen/fre_vertical_spacing"> + + <org.chromium.chrome.browser.firstrun.ImageCarousel + android:id="@+id/image" + android:layout_width="@dimen/signin_image_carousel_width" + android:layout_height="@dimen/fre_image_height" /> + + <LinearLayout + android:id="@+id/fre_content_wrapper" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:layout_marginTop="@dimen/fre_vertical_spacing" + android:layout_marginEnd="@dimen/fre_content_margin" + android:layout_marginStart="@dimen/fre_content_margin" + android:orientation="vertical" > + + <Spinner + style="@style/Widget.AppCompat.Spinner.Underlined" + android:id="@+id/google_accounts_spinner" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/fre_vertical_spacing" + android:layout_gravity="center_horizontal" + android:popupBackground="#ffffff" + android:textColor="@color/fre_text_color" /> + + <TextView + android:id="@+id/confirm_account_email" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginBottom="16dp" + android:paddingTop="12dp" + android:paddingBottom="8dp" + android:textColor="@color/fre_text_color" + android:visibility="gone" /> + + <org.chromium.ui.widget.TextViewWithClickableSpans + android:id="@+id/description" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:lineSpacingMultiplier="1.4" + android:text="@string/signin_account_choice_description" + android:textColor="@color/signin_light_text_color" + android:textSize="@dimen/fre_normal_text_size" /> + </LinearLayout> + + </LinearLayout> + </LinearLayout> + </ScrollView> + + <!-- layout_height = 72dp = fre_button_bar_height + paddingTop --> + <LinearLayout + android:id="@+id/button_bar" + android:layout_width="match_parent" + android:layout_height="72dp" + android:layout_gravity="bottom" + android:orientation="horizontal" + android:paddingTop="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp" > + + <!--suppress ButtonStyle --> + <Button + android:id="@+id/negative_button" + style="@style/ButtonCompatBorderless" + android:layout_width="wrap_content" + android:layout_height="36dp" + android:text="@string/fre_skip_text" + android:textAllCaps="true" + android:textColor="@color/light_active_color" + android:textSize="14sp" + android:layout_marginBottom="24dp" /> + + <View + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:visibility="invisible"/> + + <!--suppress ButtonStyle --> + <org.chromium.ui.widget.ButtonCompat + android:id="@+id/positive_button" + android:layout_width="wrap_content" + android:layout_height="36dp" + android:text="@string/choose_account_sign_in" + android:textAllCaps="true" + android:textColor="@android:color/white" + android:textSize="14sp" + chrome:buttonColor="@color/light_active_color" + android:layout_marginBottom="24dp" /> + + <View + android:id="@+id/positive_button_end_padding" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:visibility="gone"/> + </LinearLayout> + +</org.chromium.chrome.browser.signin.AccountSigninView>
diff --git a/chrome/android/java/res/layout/confirm_import_sync_data.xml b/chrome/android/java/res/layout/confirm_import_sync_data.xml new file mode 100644 index 0000000..5e6d1e9a --- /dev/null +++ b/chrome/android/java/res/layout/confirm_import_sync_data.xml
@@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:overScrollMode="ifContentScrolls" + android:paddingEnd="25dp" + android:paddingStart="25dp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingTop="8dp"> + + <TextView + android:id="@+id/sync_import_data_prompt" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="#de000000" + android:textSize="16sp" /> + + <org.chromium.chrome.browser.widget.RadioButtonWithDescription + android:id="@+id/sync_confirm_import_choice" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="16dp" + app:titleText="@string/sync_import_existing_data" /> + + <org.chromium.chrome.browser.widget.RadioButtonWithDescription + android:id="@+id/sync_keep_separate_choice" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="16dp" + app:titleText="@string/sync_keep_existing_data_separate" /> + + </LinearLayout> +</ScrollView> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/confirm_sync_account_change_account.xml b/chrome/android/java/res/layout/confirm_sync_account_change_account.xml deleted file mode 100644 index d4c7d91..0000000 --- a/chrome/android/java/res/layout/confirm_sync_account_change_account.xml +++ /dev/null
@@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2015 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. --> - -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:overScrollMode="ifContentScrolls" - android:paddingBottom="12dp" - android:paddingEnd="10dp" - android:paddingStart="14dp" - android:paddingTop="2dp" > - <org.chromium.ui.widget.TextViewWithClickableSpans - android:id="@+id/confirmMessage" - style="?android:attr/textAppearanceMedium" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:bufferType="spannable" - android:padding="5dp" /> -</ScrollView>
diff --git a/chrome/android/java/res/layout/fre_choose_account.xml b/chrome/android/java/res/layout/fre_choose_account.xml deleted file mode 100644 index b6bccdda..0000000 --- a/chrome/android/java/res/layout/fre_choose_account.xml +++ /dev/null
@@ -1,153 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2015 The Chromium Authors. All rights reserved. - - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. ---> -<org.chromium.chrome.browser.firstrun.AccountFirstRunView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:chrome="http://schemas.android.com/apk/res-auto" - android:id="@+id/fre_account_layout" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_marginBottom="76dp" - android:fillViewport="true" - android:scrollbarStyle="outsideOverlay" > - - <LinearLayout - android:id="@+id/fre_account_linear_layout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:orientation="vertical" > - - <TextView - android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/fre_margin" - android:gravity="center" - android:lineSpacingMultiplier="1.4" - android:text="@string/fre_set_up_chrome" - android:textColor="@color/fre_title_color" - android:textSize="@dimen/fre_title_text_size" /> - - <LinearLayout - android:id="@+id/fre_content" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/fre_margin" - android:gravity="center_horizontal" - android:orientation="vertical" > - - <org.chromium.chrome.browser.firstrun.ImageCarousel - android:id="@+id/image_slider" - android:layout_width="@dimen/fre_image_carousel_width" - android:layout_height="@dimen/fre_image_carousel_height" - android:layout_marginBottom="@dimen/fre_margin"/> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/fre_margin" - android:orientation="vertical" - android:gravity="center_horizontal" - android:paddingEnd="24dp" - android:paddingStart="24dp" > - - <Spinner - style="@style/Widget.AppCompat.Spinner.Underlined" - android:id="@+id/google_accounts_spinner" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/fre_margin" - android:padding="0dp" - android:textColor="@color/fre_text_color" /> - - - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content"> - - <org.chromium.ui.widget.TextViewWithClickableSpans - android:id="@+id/description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_horizontal" - android:lineSpacingMultiplier="1.4" - android:text="@string/fre_account_choice_description" - android:textColor="@color/fre_light_text_color" - android:textSize="@dimen/fre_normal_text_size" - android:visibility="visible"/> - - <!-- We use an invisible TextView overlapping with the visible one to keep - the layout constant between text changes. This TextView will have its - contents programmatically set to the longest string the above TextView can - contain. --> - - <org.chromium.ui.widget.TextViewWithClickableSpans - android:id="@+id/longest_description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:lineSpacingMultiplier="1.4" - android:textColor="@color/fre_light_text_color" - android:textSize="@dimen/fre_normal_text_size" - android:visibility="invisible"/> - - </FrameLayout> - - </LinearLayout> - </LinearLayout> - </LinearLayout> - </ScrollView> - - <LinearLayout - android:id="@+id/button_bar" - android:layout_width="match_parent" - android:layout_height="76dp" - android:layout_gravity="bottom" - android:orientation="horizontal" - android:padding="@dimen/fre_button_padding" > - - <!--suppress ButtonStyle --> - <Button - android:id="@+id/negative_button" - style="@style/ButtonCompatBorderless" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/fre_skip_text" - android:textAllCaps="true" - android:textColor="@color/light_normal_color" - android:textSize="15sp" /> - - <View - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_weight="1" - android:visibility="invisible"/> - - <!--suppress ButtonStyle --> - <org.chromium.ui.widget.ButtonCompat - android:id="@+id/positive_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/choose_account_sign_in" - android:textAllCaps="true" - android:textColor="@android:color/white" - android:textSize="15sp" - chrome:buttonColor="@color/light_active_color" /> - - <View - android:id="@+id/positive_button_end_padding" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_weight="1" - android:visibility="gone"/> - </LinearLayout> - -</org.chromium.chrome.browser.firstrun.AccountFirstRunView>
diff --git a/chrome/android/java/res/layout/fre_data_reduction_proxy.xml b/chrome/android/java/res/layout/fre_data_reduction_proxy.xml index f589125e..5aaaef5 100644 --- a/chrome/android/java/res/layout/fre_data_reduction_proxy.xml +++ b/chrome/android/java/res/layout/fre_data_reduction_proxy.xml
@@ -4,61 +4,60 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<org.chromium.chrome.browser.firstrun.DataReductionProxyView +<org.chromium.chrome.browser.firstrun.FirstRunView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent" > + android:layout_height="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="57dp" - android:fillViewport="true" - android:scrollbarStyle="outsideOverlay" > + android:layout_marginBottom="@dimen/fre_button_bar_height" + android:fillViewport="true"> <LinearLayout + android:id="@+id/fre_main_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center" - android:orientation="vertical" > + android:orientation="vertical" + android:gravity="center_horizontal"> <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/fre_margin" - android:gravity="center" - android:lineSpacingMultiplier="1.4" + android:id="@+id/title" android:text="@string/data_reduction_promo_title" - android:textColor="@color/fre_title_color" - android:textSize="@dimen/fre_title_text_size" /> - + style="@style/FreTitle"/> + + <!-- The orientation of this view is changed dynamically to give a nicer layout when in + landscape mode on devices with small screens. --> <LinearLayout - android:id="@+id/fre_content" + android:id="@+id/fre_image_and_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/fre_margin" - android:gravity="center_horizontal" > + android:orientation="vertical" + android:gravity="center_horizontal" + android:layout_marginTop="@dimen/fre_vertical_spacing"> <ImageView + android:id="@+id/image" android:layout_width="wrap_content" - android:layout_height="@dimen/fre_image_carousel_height" - android:layout_marginBottom="@dimen/fre_margin" + android:layout_height="@dimen/fre_image_height" android:contentDescription="@null" android:src="@drawable/data_reduction_illustration" /> <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/fre_margin" - android:orientation="vertical" - android:gravity="center_horizontal" - android:paddingEnd="24dp" - android:paddingStart="24dp" > + android:id="@+id/fre_content_wrapper" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:layout_marginTop="@dimen/fre_vertical_spacing" + android:layout_marginEnd="@dimen/fre_content_margin" + android:layout_marginStart="@dimen/fre_content_margin" + android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/fre_margin" + android:layout_marginBottom="@dimen/fre_vertical_spacing" android:gravity="start" android:lineSpacingMultiplier="1.4" android:text="@string/data_reduction_promo_summary" @@ -75,26 +74,32 @@ android:textColor="@color/fre_text_color" android:textSize="@dimen/fre_normal_text_size" android:fontFamily="sans-serif-medium" /> + </LinearLayout> </LinearLayout> </LinearLayout> </ScrollView> - <View - style="@style/ButtonBarTopDivider" - android:layout_gravity="bottom" - android:layout_marginBottom="56dp" /> - - <Button - android:id="@+id/next_button" + <LinearLayout + android:id="@+id/button_bar" android:layout_width="match_parent" - android:layout_height="56dp" + android:layout_height="@dimen/fre_button_bar_height" android:layout_gravity="bottom" - android:background="?attr/listChoiceBackgroundIndicator" - android:padding="16dp" - android:text="@string/next" - android:textAllCaps="true" - android:textColor="@color/light_active_color" - android:textSize="@dimen/fre_button_text_size" /> + android:orientation="vertical"> -</org.chromium.chrome.browser.firstrun.DataReductionProxyView> + <View style="@style/ButtonBarTopDivider" /> + + <Button + android:id="@+id/next_button" + android:layout_width="match_parent" + android:layout_height="@dimen/fre_button_bar_height" + android:layout_gravity="bottom" + android:background="?attr/listChoiceBackgroundIndicator" + android:padding="16dp" + android:text="@string/next" + android:textAllCaps="true" + android:textColor="@color/light_active_color" + android:textSize="@dimen/fre_button_text_size" + style="@style/ButtonCompatBorderless" /> + </LinearLayout> +</org.chromium.chrome.browser.firstrun.FirstRunView> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/fre_spinner_dropdown.xml b/chrome/android/java/res/layout/fre_spinner_dropdown.xml index ba06f4ee..8c039c9 100644 --- a/chrome/android/java/res/layout/fre_spinner_dropdown.xml +++ b/chrome/android/java/res/layout/fre_spinner_dropdown.xml
@@ -9,9 +9,12 @@ style="?android:attr/spinnerDropDownItemStyle" android:singleLine="true" android:ellipsize="end" - android:maxWidth="216dp" + android:maxWidth="300dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/fre_text_color" android:textSize="@dimen/fre_normal_text_size" - android:padding="12dp" /> \ No newline at end of file + android:paddingTop="12dp" + android:paddingBottom="12dp" + android:paddingEnd="14dp" + android:paddingStart="18dp" /> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/fre_spinner_text.xml b/chrome/android/java/res/layout/fre_spinner_text.xml index cb14ff1..fcdbd29e 100644 --- a/chrome/android/java/res/layout/fre_spinner_text.xml +++ b/chrome/android/java/res/layout/fre_spinner_text.xml
@@ -8,12 +8,12 @@ android:id="@+id/fre_spinner_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:maxWidth="216dp" + android:maxWidth="300dp" android:layoutDirection="locale" - android:paddingBottom="16dp" - android:paddingEnd="12dp" - android:paddingStart="12dp" - android:paddingTop="16dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingEnd="16dp" + android:paddingStart="0dp" android:textAlignment="viewStart" android:ellipsize="end" android:singleLine="true"
diff --git a/chrome/android/java/res/layout/fre_tosanduma.xml b/chrome/android/java/res/layout/fre_tosanduma.xml index 04700e9..76d558b 100644 --- a/chrome/android/java/res/layout/fre_tosanduma.xml +++ b/chrome/android/java/res/layout/fre_tosanduma.xml
@@ -4,63 +4,61 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<org.chromium.chrome.browser.firstrun.TosAndUmaView +<org.chromium.chrome.browser.firstrun.FirstRunView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent" > + android:layout_height="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="57dp" - android:fillViewport="true" - android:scrollbarStyle="outsideOverlay" > + android:layout_marginBottom="@dimen/fre_button_bar_height" + android:fillViewport="true"> <LinearLayout + android:id="@+id/fre_main_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center" - android:orientation="vertical" > + android:orientation="vertical" + android:gravity="center_horizontal"> <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/fre_margin" - android:gravity="center" - android:lineSpacingMultiplier="1.4" + android:id="@+id/title" android:text="@string/fre_welcome" - android:textColor="@color/fre_title_color" - android:textSize="@dimen/fre_title_text_size" /> - + style="@style/FreTitle" /> + + <!-- The orientation of this view is changed dynamically to give a nicer layout when in + landscape mode on devices with small screens. --> <LinearLayout - android:id="@+id/fre_content" + android:id="@+id/fre_image_and_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/fre_margin" - android:gravity="center_horizontal"> + android:orientation="vertical" + android:gravity="center_horizontal" + android:layout_marginTop="@dimen/fre_vertical_spacing"> <ImageView + android:id="@+id/image" android:layout_width="wrap_content" - android:layout_height="@dimen/fre_image_carousel_height" - android:layout_marginBottom="@dimen/fre_margin" + android:layout_height="@dimen/fre_image_height" android:contentDescription="@null" android:src="@drawable/fre_product_logo" /> <LinearLayout - android:id="@+id/text_wrapper" + android:id="@+id/fre_content_wrapper" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" - android:layout_marginBottom="@dimen/fre_margin" - android:orientation="vertical" - android:paddingEnd="@dimen/fre_margin" - android:paddingStart="@dimen/fre_margin" > - + android:layout_marginTop="@dimen/fre_vertical_spacing" + android:layout_marginEnd="@dimen/fre_content_margin" + android:layout_marginStart="@dimen/fre_content_margin" + android:orientation="vertical" > + <org.chromium.ui.widget.TextViewWithClickableSpans android:id="@+id/tos_and_privacy" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/fre_margin" + android:layout_marginBottom="@dimen/fre_vertical_spacing" android:gravity="center" android:lineSpacingMultiplier="1.4" android:textColor="@color/fre_text_color" @@ -74,26 +72,31 @@ android:text="@string/fre_send_report_check" android:textColor="@color/fre_text_color" android:textSize="@dimen/fre_normal_text_size" /> - </LinearLayout> + </LinearLayout> </LinearLayout> </LinearLayout> </ScrollView> - <View - style="@style/ButtonBarTopDivider" - android:layout_gravity="bottom" - android:layout_marginBottom="56dp" /> - - <Button - android:id="@+id/terms_accept" + <LinearLayout + android:id="@+id/button_bar" android:layout_width="match_parent" - android:layout_height="56dp" + android:layout_height="@dimen/fre_button_bar_height" android:layout_gravity="bottom" - android:background="?attr/listChoiceBackgroundIndicator" - android:padding="16dp" - android:text="@string/fre_accept_continue" - android:textAllCaps="true" - android:textColor="@color/light_active_color" - android:textSize="@dimen/fre_button_text_size" /> + android:orientation="vertical"> -</org.chromium.chrome.browser.firstrun.TosAndUmaView> + <View style="@style/ButtonBarTopDivider" /> + + <Button + android:id="@+id/terms_accept" + android:layout_width="match_parent" + android:layout_height="@dimen/fre_button_bar_height" + android:layout_gravity="bottom" + android:background="?attr/listChoiceBackgroundIndicator" + android:padding="16dp" + android:text="@string/fre_accept_continue" + android:textAllCaps="true" + android:textColor="@color/light_active_color" + android:textSize="@dimen/fre_button_text_size" + style="@style/ButtonCompatBorderless" /> + </LinearLayout> +</org.chromium.chrome.browser.firstrun.FirstRunView> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/radio_button_with_description.xml b/chrome/android/java/res/layout/radio_button_with_description.xml new file mode 100644 index 0000000..24823f4 --- /dev/null +++ b/chrome/android/java/res/layout/radio_button_with_description.xml
@@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<!-- RadioButtonWithDescription extends RelativeLayout --> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + android:paddingTop="10dp" > + + <RadioButton + android:id="@+id/radio_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingEnd="16dp" /> + + <TextView + android:id="@+id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toEndOf="@id/radio_button" + android:textColor="#de000000" + android:textSize="16sp" /> + + <TextView + android:id="@+id/description" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignStart="@id/title" + android:layout_below="@id/title" + android:textColor="#8a000000" + android:textSize="14sp" /> +</merge>
diff --git a/chrome/android/java/res/values-large/dimens.xml b/chrome/android/java/res/values-large/dimens.xml new file mode 100644 index 0000000..bfa99b4 --- /dev/null +++ b/chrome/android/java/res/values-large/dimens.xml
@@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<resources> + <dimen name="fre_content_margin">60dp</dimen> +</resources>
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml index fa3f480..f3fd898 100644 --- a/chrome/android/java/res/values-v17/styles.xml +++ b/chrome/android/java/res/values-v17/styles.xml
@@ -268,6 +268,16 @@ <item name="android:paddingEnd">0dp</item> <item name="externalRouteEnabledDrawable">@drawable/ic_cast_dark_chrome</item> </style> + + <!-- First Run Experience --> + <style name="FreTitle"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:gravity">center</item> + <item name="android:lineSpacingMultiplier">1.4</item> + <item name="android:textColor">@color/fre_title_color</item> + <item name="android:textSize">@dimen/fre_title_text_size</item> + </style> <!-- Web Notifications --> <style name="WebNotificationTitle"
diff --git a/chrome/android/java/res/values/attrs.xml b/chrome/android/java/res/values/attrs.xml index 63bd52b..acb3e8b 100644 --- a/chrome/android/java/res/values/attrs.xml +++ b/chrome/android/java/res/values/attrs.xml
@@ -57,4 +57,7 @@ <attr name="backgroundColor" format="reference|color" /> </declare-styleable> + <declare-styleable name="RadioButtonWithDescription"> + <attr name="titleText" format="string" /> + </declare-styleable> </resources>
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml index d7075bab..b69c03d7 100644 --- a/chrome/android/java/res/values/colors.xml +++ b/chrome/android/java/res/values/colors.xml
@@ -15,6 +15,7 @@ <color name="text_highlight_color">#C6DAFC</color> <color name="dark_action_bar_color">#263238</color> <color name="descriptive_text_color">#646464</color> + <color name="ui_link_text_color">#3367D6</color> <!-- Infobar colors --> <color name="infobar_accent_blue">#4285f4</color> @@ -79,8 +80,11 @@ <!-- First Run Experience Colors --> <color name="fre_text_color">#000000</color> - <color name="fre_light_text_color">#494949</color> <color name="fre_title_color">#161616</color> + + <!-- Account Signin Colors --> + <!-- As in dimens.xml, signin uses values from the First Run Experience --> + <color name="signin_light_text_color">#494949</color> <!-- Sad Tab colors --> <color name="sad_tab_header_text_color">#333333</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index e0e2379..34b9464 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -161,17 +161,24 @@ <dimen name="badge_radius">10dp</dimen> <dimen name="badge_border_size">1.3dp</dimen> - <!-- First Run Experience and Welcome Page dimensions --> + <!-- First Run Experience dimensions --> + <dimen name="fre_content_margin">24dp</dimen> + <dimen name="fre_vertical_spacing">32dp</dimen> + <dimen name="fre_button_bar_height">56dp</dimen> <dimen name="fre_button_padding">12dp</dimen> <dimen name="fre_margin">24dp</dimen> <dimen name="fre_title_text_size">24sp</dimen> <dimen name="fre_button_text_size">14sp</dimen> <dimen name="fre_normal_text_size">14sp</dimen> - <dimen name="fre_image_carousel_width">260dp</dimen> - <dimen name="fre_image_carousel_height">130dp</dimen> - <dimen name="fre_checkmark_size">38dp</dimen> + <dimen name="fre_image_height">120dp</dimen> <dimen name="fre_tos_checkbox_padding">12dp</dimen> + <!-- Account Signin dimensions --> + <!-- The Account Signin page appears in the First Run Experience (amongst other places), so uses + a lot of the fre_* dimensions for consistency. --> + <dimen name="signin_image_carousel_width">240dp</dimen> + <dimen name="signin_checkmark_size">38dp</dimen> + <!-- Sign-in promo dimensions --> <dimen name="sign_in_promo_padding_bottom">16dp</dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryBridge.java index 54674b1..2ac7c7a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryBridge.java
@@ -149,7 +149,8 @@ private static void addToAutofillSuggestionArray(AutofillSuggestion[] array, int index, String label, String sublabel, int iconId, int suggestionId, boolean deletable) { int drawableId = iconId == 0 ? DropdownItem.NO_ICON : ResourceId.mapToDrawableId(iconId); - array[index] = new AutofillSuggestion(label, sublabel, drawableId, suggestionId, deletable); + array[index] = + new AutofillSuggestion(label, sublabel, drawableId, suggestionId, deletable, false); } private native void nativeViewDismissed(long nativeAutofillKeyboardAccessoryView);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java index 195c421c..77b490b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
@@ -136,12 +136,15 @@ * @param iconId The resource ID for the icon associated with the suggestion, or 0 for no icon. * @param suggestionId Identifier for the suggestion type. * @param deletable Whether this item is deletable. + * @param isLabelMultiline Whether the label should be should over multiple lines. */ @CalledByNative private static void addToAutofillSuggestionArray(AutofillSuggestion[] array, int index, - String label, String sublabel, int iconId, int suggestionId, boolean deletable) { + String label, String sublabel, int iconId, int suggestionId, boolean deletable, + boolean isLabelMultiline) { int drawableId = iconId == 0 ? DropdownItem.NO_ICON : ResourceId.mapToDrawableId(iconId); - array[index] = new AutofillSuggestion(label, sublabel, drawableId, suggestionId, deletable); + array[index] = new AutofillSuggestion( + label, sublabel, drawableId, suggestionId, deletable, isLabelMultiline); } private native void nativeSuggestionSelected(long nativeAutofillPopupViewAndroid,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSigninActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSigninActivity.java index dedbb5c..e84fcd7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSigninActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSigninActivity.java
@@ -127,7 +127,6 @@ @Override public void onNewAccount() { RecordUserAction.record("Stars_SignInPromoActivity_NewAccount"); - RecordUserAction.record("Signin_AddAccountToDevice"); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkThumbnailWidgetService.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkThumbnailWidgetService.java index 10adf505..3e8dd59 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkThumbnailWidgetService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkThumbnailWidgetService.java
@@ -8,12 +8,10 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Bitmap.Config; -import android.graphics.BitmapFactory; -import android.graphics.BitmapFactory.Options; +import android.graphics.Bitmap; import android.net.Uri; -import android.os.AsyncTask; -import android.os.Binder; +import android.support.annotation.BinderThread; +import android.support.annotation.UiThread; import android.text.TextUtils; import android.util.Log; import android.widget.RemoteViews; @@ -26,23 +24,45 @@ import org.chromium.base.library_loader.ProcessInitException; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeApplication; +import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; +import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver; +import org.chromium.chrome.browser.bookmarks.BookmarkModel; +import org.chromium.chrome.browser.favicon.FaviconHelper; +import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; -import org.chromium.chrome.browser.provider.BookmarkColumns; -import org.chromium.chrome.browser.provider.ChromeBrowserProvider.BookmarkNode; -import org.chromium.chrome.browser.provider.ChromeBrowserProviderClient; +import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.IntentUtils; -import org.chromium.sync.AndroidSyncSettings; +import org.chromium.components.bookmarks.BookmarkId; +import org.chromium.components.bookmarks.BookmarkType; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.LinkedBlockingQueue; + +import javax.annotation.Nullable; /** - * Service to support bookmarks on the Android home screen + * Service to support the bookmarks widget. + * + * This provides the list of bookmarks to show in the widget via a RemoteViewsFactory (the + * RemoteViews equivalent of an Adapter), and updates the widget when the bookmark model changes. + * + * Threading note: Be careful! Android calls some methods in this class on the UI thread and others + * on (multiple) binder threads. Additionally, all interaction with the BookmarkModel must happen on + * the UI thread. To keep the situation clear, every non-static method is annotated with either + * {@link UiThread} or {@link BinderThread}. */ public class BookmarkThumbnailWidgetService extends RemoteViewsService { - static final String TAG = "BookmarkThumbnailWidgetService"; - static final String ACTION_CHANGE_FOLDER_SUFFIX = ".CHANGE_FOLDER"; - static final String STATE_CURRENT_FOLDER = "current_folder"; + private static final String TAG = "BookmarkThumbnailWidgetService"; + private static final String ACTION_CHANGE_FOLDER_SUFFIX = ".CHANGE_FOLDER"; + private static final String PREF_CURRENT_FOLDER = "current_folder"; + private static final String EXTRA_FOLDER_ID = "folderId"; + @UiThread @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { int widgetId = IntentUtils.safeGetIntExtra(intent, AppWidgetManager.EXTRA_APPWIDGET_ID, -1); @@ -50,58 +70,209 @@ Log.w(TAG, "Missing EXTRA_APPWIDGET_ID!"); return null; } - return new BookmarkFactory(this, widgetId); + return new BookmarkAdapter(this, widgetId); } static String getChangeFolderAction(Context context) { return context.getPackageName() + ACTION_CHANGE_FOLDER_SUFFIX; } - private static SharedPreferences getWidgetState(Context context, int widgetId) { + static SharedPreferences getWidgetState(Context context, int widgetId) { return context.getSharedPreferences( String.format("widgetState-%d", widgetId), Context.MODE_PRIVATE); } static void deleteWidgetState(Context context, int widgetId) { - // Android Browser's widget used private API methods to access the shared prefs - // files and deleted them. This is the best we can do with the public API. SharedPreferences preferences = getWidgetState(context, widgetId); if (preferences != null) preferences.edit().clear().apply(); } static void changeFolder(Context context, Intent intent) { int widgetId = IntentUtils.safeGetIntExtra(intent, AppWidgetManager.EXTRA_APPWIDGET_ID, -1); - long folderId = IntentUtils.safeGetLongExtra(intent, BookmarkColumns.ID, - ChromeBrowserProviderClient.INVALID_BOOKMARK_ID); + long folderId = IntentUtils.safeGetLongExtra(intent, EXTRA_FOLDER_ID, -1); if (widgetId >= 0 && folderId >= 0) { SharedPreferences prefs = getWidgetState(context, widgetId); - prefs.edit().putLong(STATE_CURRENT_FOLDER, folderId).apply(); + prefs.edit().putLong(PREF_CURRENT_FOLDER, folderId).apply(); AppWidgetManager.getInstance(context) .notifyAppWidgetViewDataChanged(widgetId, R.id.bookmarks_list); } } - static class BookmarkFactory implements RemoteViewsService.RemoteViewsFactory, - BookmarkWidgetUpdateListener.UpdateListener { + /** + * Holds data describing a bookmark or bookmark folder. + */ + private static class Bookmark { + public String title; + public String url; + public BookmarkId id; + public BookmarkId parentId; + public boolean isFolder; + public Bitmap favicon; - private final ChromeApplication mContext; + public static Bookmark fromBookmarkItem(BookmarkItem item) { + if (item == null) return null; + + // The bookmarks widget doesn't support showing partner bookmarks. The main hurdle is + // that the current folder ID is stored in shared prefs as a long, not a BookmarkId. + // This support could be added if there's a strong desire. + if (item.getId().getType() == BookmarkType.PARTNER) return null; + + Bookmark bookmark = new Bookmark(); + bookmark.title = item.getTitle(); + bookmark.url = item.getUrl(); + bookmark.id = item.getId(); + bookmark.parentId = item.getParentId(); + bookmark.isFolder = item.isFolder(); + return bookmark; + } + } + + /** + * Holds the list of bookmarks in a folder, as well as information about the folder itself and + * its parent folder, if any. + */ + private static class BookmarkFolder { + public Bookmark folder; + @Nullable public Bookmark parent; + public final List<Bookmark> children = new ArrayList<>(); + } + + /** + * Loads a BookmarkFolder synchronously on a binder thread. + */ + private static class BookmarkLoader { + /** Used to transfer the result from the UI thread to the binder thread. */ + private final LinkedBlockingQueue<BookmarkFolder> mResultQueue; + + private BookmarkFolder mFolder; + private BookmarkModel mBookmarkModel; + private Profile mProfile; + private FaviconHelper mFaviconHelper; + private int mFaviconSizePx; + private int mRemainingTaskCount; + + /** + * Loads the list of bookmarks is the given folder synchronously. This must not be called + * from the UI thread. + */ + @BinderThread + public static BookmarkFolder loadBookmarksOnBinderThread(final Context context, + final BookmarkId folderId) { + BookmarkLoader loader = ThreadUtils.runOnUiThreadBlockingNoException( + new Callable<BookmarkLoader>() { + @Override + public BookmarkLoader call() { + return new BookmarkLoader(context, folderId); + } + }); + try { + return loader.mResultQueue.take(); + } catch (InterruptedException e) { + return null; + } + } + + @UiThread + private BookmarkLoader(Context context, final BookmarkId folderId) { + mResultQueue = new LinkedBlockingQueue<>(1); + mProfile = Profile.getLastUsedProfile(); + mFaviconHelper = new FaviconHelper(); + mFaviconSizePx = context.getResources().getDimensionPixelSize( + R.dimen.default_favicon_size); + mRemainingTaskCount = 1; + mBookmarkModel = new BookmarkModel(); + mBookmarkModel.runAfterBookmarkModelLoaded(new Runnable() { + @Override + public void run() { + loadBookmarks(folderId); + } + }); + } + + @UiThread + private void loadBookmarks(BookmarkId folderId) { + mFolder = new BookmarkFolder(); + + // Load the requested folder if it exists. Otherwise, fall back to the default folder. + if (folderId != null) { + mFolder.folder = Bookmark.fromBookmarkItem(mBookmarkModel.getBookmarkById( + folderId)); + } + if (mFolder.folder == null) { + folderId = mBookmarkModel.getDefaultFolder(); + mFolder.folder = Bookmark.fromBookmarkItem(mBookmarkModel.getBookmarkById( + folderId)); + } + + mFolder.parent = Bookmark.fromBookmarkItem(mBookmarkModel.getBookmarkById( + mFolder.folder.parentId)); + + List<BookmarkItem> items = mBookmarkModel.getBookmarksForFolder(folderId); + for (BookmarkItem item : items) { + Bookmark bookmark = Bookmark.fromBookmarkItem(item); + loadFavicon(bookmark); + mFolder.children.add(bookmark); + } + + taskFinished(); + } + + @UiThread + private void loadFavicon(final Bookmark bookmark) { + if (!bookmark.isFolder) { + mRemainingTaskCount++; + mFaviconHelper.getLocalFaviconImageForURL(mProfile, bookmark.url, mFaviconSizePx, + new FaviconImageCallback() { + @Override + public void onFaviconAvailable(Bitmap image, String iconUrl) { + bookmark.favicon = image; + taskFinished(); + } + }); + } + } + + @UiThread + private void taskFinished() { + mRemainingTaskCount--; + if (mRemainingTaskCount == 0) { + mResultQueue.add(mFolder); + destroy(); + } + } + + @UiThread + private void destroy() { + mBookmarkModel.destroy(); + mFaviconHelper.destroy(); + } + } + + /** + * Provides the RemoteViews, one per bookmark, to be shown in the widget. + */ + private static class BookmarkAdapter implements RemoteViewsService.RemoteViewsFactory { + + // Can be accessed on any thread + private final Context mContext; private final int mWidgetId; private final SharedPreferences mPreferences; - private BookmarkWidgetUpdateListener mUpdateListener; - private BookmarkNode mCurrentFolder; - private final Object mLock = new Object(); - public BookmarkFactory(Context context, int widgetId) { - mContext = (ChromeApplication) context.getApplicationContext(); + // Accessed only on the UI thread + private BookmarkModel mBookmarkModel; + + // Accessed only on binder threads. + private BookmarkFolder mCurrentFolder; + + @UiThread + public BookmarkAdapter(Context context, int widgetId) { + mContext = context; mWidgetId = widgetId; mPreferences = getWidgetState(mContext, mWidgetId); } - private static long getFolderId(BookmarkNode folder) { - return folder != null ? folder.id() : ChromeBrowserProviderClient.INVALID_BOOKMARK_ID; - } - + @UiThread @SuppressFBWarnings("DM_EXIT") @Override public void onCreate() { @@ -118,207 +289,129 @@ if (isWidgetNewlyCreated()) { RecordUserAction.record("BookmarkNavigatorWidgetAdded"); } - mUpdateListener = new BookmarkWidgetUpdateListener(mContext, this); - } - @Override - public void onDestroy() { - if (mUpdateListener != null) mUpdateListener.destroy(); - deleteWidgetState(mContext, mWidgetId); - } + // Partner bookmarks need to be loaded explicitly. + PartnerBookmarksShim.kickOffReading(mContext); - @Override - public void onBookmarkModelUpdated() { - refreshWidget(); - } - - @Override - public void onSyncEnabledStatusUpdated(boolean enabled) { - synchronized (mLock) { - // Need to operate in a separate thread as it involves queries to our provider. - new SyncEnabledStatusUpdatedTask(enabled, getFolderId(mCurrentFolder)).execute(); - } - } - - @Override - public void onThumbnailUpdated(String url) { - synchronized (mLock) { - if (mCurrentFolder == null) return; - - for (BookmarkNode child : mCurrentFolder.children()) { - if (child.isUrl() && url.equals(child.url())) { - refreshWidget(); - break; - } + mBookmarkModel = new BookmarkModel(); + mBookmarkModel.addObserver(new BookmarkModelObserver() { + @Override + public void bookmarkModelLoaded() { + // Do nothing. No need to refresh. } - } + + @Override + public void bookmarkModelChanged() { + refreshWidget(); + } + }); } - void refreshWidget() { + @UiThread + private boolean isWidgetNewlyCreated() { + // This method relies on the fact that PREF_CURRENT_FOLDER is not yet + // set when onCreate is called for a newly created widget. + long currentFolder = mPreferences.getLong(PREF_CURRENT_FOLDER, Tab.INVALID_BOOKMARK_ID); + return currentFolder == Tab.INVALID_BOOKMARK_ID; + } + + @UiThread + private void refreshWidget() { mContext.sendBroadcast(new Intent( BookmarkThumbnailWidgetProviderBase.getBookmarkAppWidgetUpdateAction(mContext), null, mContext, BookmarkThumbnailWidgetProvider.class) .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId)); } - void requestFolderChange(long folderId) { - mContext.sendBroadcast(new Intent(getChangeFolderAction(mContext)) - .setClass(mContext, BookmarkWidgetProxy.class) - .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId) - .putExtra(BookmarkColumns.ID, folderId)); - } - - /** - * This method relies on the fact that STATE_CURRENT_FOLDER pref is not yet - * set when onCreate is called for a newly created widget. - */ - private boolean isWidgetNewlyCreated() { - long currentFolder = mPreferences.getLong(STATE_CURRENT_FOLDER, - ChromeBrowserProviderClient.INVALID_BOOKMARK_ID); - return currentFolder == ChromeBrowserProviderClient.INVALID_BOOKMARK_ID; - } - - // Performs the required checks to trigger an update of the widget after changing the sync - // enable settings. The required provider methods cannot be accessed in the UI thread. - private class SyncEnabledStatusUpdatedTask extends AsyncTask<Void, Void, Void> { - private final boolean mEnabled; - private final long mCurrentFolderId; - - public SyncEnabledStatusUpdatedTask(boolean enabled, long currentFolderId) { - mEnabled = enabled; - mCurrentFolderId = currentFolderId; - } - - @Override - protected Void doInBackground(Void... params) { - // If we're in the Mobile Bookmarks folder the icon to go up the hierarchy - // will either appear or disappear. Need to refresh. - long mobileBookmarksFolderId = - ChromeBrowserProviderClient.getMobileBookmarksFolderId(mContext); - if (mCurrentFolderId == mobileBookmarksFolderId) { - refreshWidget(); - return null; - } - - // If disabling sync, we need to move to the Mobile Bookmarks folder if we're - // not inside that branch of the bookmark hierarchy (will become not accessible). - if (!mEnabled && !ChromeBrowserProviderClient.isBookmarkInMobileBookmarksBranch( - mContext, mCurrentFolderId)) { - requestFolderChange(mobileBookmarksFolderId); - } - - return null; - } - } - // ---------------------------------------------------------------- // - // ------- Methods below this line run in different thread -------- // + // Methods below this line are called on binder threads. // + // ---------------------------------------------------------------- // + // Different methods may be called on *different* binder threads, // + // but the system ensures that the effects of each method call will // + // be visible before the next method is called. Thus, additional // + // synchronization is not needed when accessing mCurrentFolder. // // ---------------------------------------------------------------- // - private void syncState() { - long currentFolderId = mPreferences.getLong(STATE_CURRENT_FOLDER, - ChromeBrowserProviderClient.INVALID_BOOKMARK_ID); + @BinderThread + @Override + public void onDestroy() { + ThreadUtils.runOnUiThread(new Runnable() { + @Override + public void run() { + if (mBookmarkModel != null) mBookmarkModel.destroy(); + } + }); + deleteWidgetState(mContext, mWidgetId); + } - // Keep outside the synchronized block to avoid deadlocks in case loading the folder - // triggers an update that locks when trying to read mCurrentFolder. - BookmarkNode newFolder = loadBookmarkFolder(currentFolderId); + @BinderThread + @Override + public void onDataSetChanged() { + updateBookmarkList(); + } - synchronized (mLock) { - mCurrentFolder = - getFolderId(newFolder) != ChromeBrowserProviderClient.INVALID_BOOKMARK_ID - ? newFolder : null; - } + @BinderThread + private void updateBookmarkList() { + long folderIdLong = mPreferences.getLong(PREF_CURRENT_FOLDER, Tab.INVALID_BOOKMARK_ID); + BookmarkId folderId = folderIdLong != Tab.INVALID_BOOKMARK_ID + ? new BookmarkId(folderIdLong, BookmarkType.NORMAL) + : null; + + mCurrentFolder = BookmarkLoader.loadBookmarksOnBinderThread(mContext, folderId); mPreferences.edit() - .putLong(STATE_CURRENT_FOLDER, getFolderId(mCurrentFolder)) + .putLong(PREF_CURRENT_FOLDER, mCurrentFolder != null + ? mCurrentFolder.folder.id.getId() + : Tab.INVALID_BOOKMARK_ID) .apply(); } - private BookmarkNode loadBookmarkFolder(long folderId) { - if (ThreadUtils.runningOnUiThread()) { - Log.e(TAG, "Trying to load bookmark folder from the UI thread."); - return null; - } - - // If the current folder id doesn't exist (it was deleted) try the current parent. - // If this fails too then fallback to Mobile Bookmarks. - if (!ChromeBrowserProviderClient.bookmarkNodeExists(mContext, folderId)) { - folderId = mCurrentFolder != null ? getFolderId(mCurrentFolder.parent()) - : ChromeBrowserProviderClient.INVALID_BOOKMARK_ID; - if (!ChromeBrowserProviderClient.bookmarkNodeExists(mContext, folderId)) { - folderId = ChromeBrowserProviderClient.INVALID_BOOKMARK_ID; - } - } - - // Need to verify this always because the package data might be cleared while the - // widget is in the Mobile Bookmarks folder with sync enabled. In that case the - // hierarchy up folder would still work (we can't update the widget) but the parent - // folders should not be accessible because sync has been reset when clearing data. - if (folderId != ChromeBrowserProviderClient.INVALID_BOOKMARK_ID - && !AndroidSyncSettings.isSyncEnabled(mContext) - && !ChromeBrowserProviderClient.isBookmarkInMobileBookmarksBranch( - mContext, folderId)) { - folderId = ChromeBrowserProviderClient.INVALID_BOOKMARK_ID; - } - - // Use the Mobile Bookmarks folder by default. - if (folderId < 0) { - folderId = ChromeBrowserProviderClient.getMobileBookmarksFolderId(mContext); - if (folderId == ChromeBrowserProviderClient.INVALID_BOOKMARK_ID) return null; - } - - return ChromeBrowserProviderClient.getBookmarkNode(mContext, folderId, - ChromeBrowserProviderClient.GET_PARENT - | ChromeBrowserProviderClient.GET_CHILDREN - | ChromeBrowserProviderClient.GET_FAVICONS - | ChromeBrowserProviderClient.GET_THUMBNAILS); - } - - private BookmarkNode getBookmarkForPosition(int position) { + @BinderThread + private Bookmark getBookmarkForPosition(int position) { if (mCurrentFolder == null) return null; // The position 0 is saved for an entry of the current folder used to go up. // This is not the case when the current node has no parent (it's the root node). - return (mCurrentFolder.parent() == null) - ? mCurrentFolder.children().get(position) - : (position == 0 - ? mCurrentFolder : mCurrentFolder.children().get(position - 1)); + if (mCurrentFolder.parent != null) { + if (position == 0) return mCurrentFolder.folder; + position--; + } + return mCurrentFolder.children.get(position); } - @Override - public void onDataSetChanged() { - long token = Binder.clearCallingIdentity(); - syncState(); - Binder.restoreCallingIdentity(token); - } - + @BinderThread @Override public int getViewTypeCount() { return 2; } + @BinderThread @Override public boolean hasStableIds() { return false; } + @BinderThread @Override public int getCount() { if (mCurrentFolder == null) return 0; - return mCurrentFolder.children().size() + (mCurrentFolder.parent() != null ? 1 : 0); + return mCurrentFolder.children.size() + (mCurrentFolder.parent != null ? 1 : 0); } + @BinderThread @Override public long getItemId(int position) { - return getFolderId(getBookmarkForPosition(position)); + return getBookmarkForPosition(position).id.getId(); } + @BinderThread @Override public RemoteViews getLoadingView() { return new RemoteViews(mContext.getPackageName(), R.layout.bookmark_thumbnail_widget_item); } + @BinderThread @Override public RemoteViews getViewAt(int position) { if (mCurrentFolder == null) { @@ -326,24 +419,21 @@ return null; } - BookmarkNode bookmark = getBookmarkForPosition(position); + Bookmark bookmark = getBookmarkForPosition(position); if (bookmark == null) { Log.w(TAG, "Couldn't get bookmark for position " + position); return null; } - if (bookmark == mCurrentFolder && bookmark.parent() == null) { - Log.w(TAG, "Invalid bookmark data: loop detected."); - return null; - } - - String title = bookmark.name(); - String url = bookmark.url(); - long id = (bookmark == mCurrentFolder) ? bookmark.parent().id() : bookmark.id(); + String title = bookmark.title; + String url = bookmark.url; + long id = (bookmark == mCurrentFolder.folder) + ? mCurrentFolder.parent.id.getId() + : bookmark.id.getId(); // Two layouts are needed because RemoteView does not supporting changing the scale type // of an ImageView: boomarks crop their thumbnails, while folders stretch their icon. - RemoteViews views = !bookmark.isUrl() + RemoteViews views = bookmark.isFolder ? new RemoteViews(mContext.getPackageName(), R.layout.bookmark_thumbnail_widget_item_folder) : new RemoteViews(mContext.getPackageName(), @@ -352,41 +442,29 @@ // Set the title of the bookmark. Use the url as a backup. views.setTextViewText(R.id.label, TextUtils.isEmpty(title) ? url : title); - if (!bookmark.isUrl()) { - int thumbId = (bookmark == mCurrentFolder) + if (bookmark.isFolder) { + int thumbId = (bookmark == mCurrentFolder.folder) ? R.drawable.thumb_bookmark_widget_folder_back_holo : R.drawable.thumb_bookmark_widget_folder_holo; views.setImageViewResource(R.id.thumb, thumbId); views.setImageViewResource(R.id.favicon, R.drawable.ic_bookmark_widget_bookmark_holo_dark); } else { - // RemoteViews require a valid bitmap config. - Options options = new Options(); - options.inPreferredConfig = Config.ARGB_8888; - - byte[] favicon = bookmark.favicon(); - if (favicon != null && favicon.length > 0) { - views.setImageViewBitmap(R.id.favicon, - BitmapFactory.decodeByteArray(favicon, 0, favicon.length, options)); + if (bookmark.favicon != null) { + views.setImageViewBitmap(R.id.favicon, bookmark.favicon); } else { - views.setImageViewResource(R.id.favicon, - org.chromium.chrome.R.drawable.globe_favicon); + views.setImageViewResource(R.id.favicon, R.drawable.globe_favicon); } - byte[] thumbnail = bookmark.thumbnail(); - if (thumbnail != null && thumbnail.length > 0) { - views.setImageViewBitmap(R.id.thumb, - BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length, options)); - } else { - views.setImageViewResource(R.id.thumb, R.drawable.browser_thumbnail); - } + // TODO(newt): update the view and get rid of the thumbnail, which is always empty. + views.setImageViewResource(R.id.thumb, R.drawable.browser_thumbnail); } Intent fillIn; - if (!bookmark.isUrl()) { + if (bookmark.isFolder) { fillIn = new Intent(getChangeFolderAction(mContext)) .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId) - .putExtra(BookmarkColumns.ID, id); + .putExtra(EXTRA_FOLDER_ID, id); } else { fillIn = new Intent(Intent.ACTION_VIEW); if (!TextUtils.isEmpty(url)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetUpdateListener.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetUpdateListener.java deleted file mode 100644 index f4c3875..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetUpdateListener.java +++ /dev/null
@@ -1,108 +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.bookmarkswidget; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.ContentObserver; -import android.os.Handler; - -import org.chromium.chrome.browser.provider.ChromeBrowserProvider; -import org.chromium.sync.AndroidSyncSettings; - -/** - * Encapsulates the different observers that can cause a widget update. - */ -public class BookmarkWidgetUpdateListener { - private static final String TAG = "BookmarkWidgetUpdateListener"; - - /** - * Notifies about the different kinds of updates that affect the bookmarks widget. - */ - public interface UpdateListener { - /** - * Called when the was a change in the bookmark model. - */ - public void onBookmarkModelUpdated(); - - /** - * Called when the app sync enabled status has changed. - * - * @param enabled New state of the sync setting after the change. - */ - public void onSyncEnabledStatusUpdated(boolean enabled); - - /** - * Called when a page thumbnail has been updated or created. - */ - public void onThumbnailUpdated(String url); - } - - /** - * Handles changes in the bookmarks. - */ - private class BookmarkUpdateObserver extends ContentObserver { - public BookmarkUpdateObserver() { - super(new Handler()); - } - - @Override - public void onChange(boolean selfChange) { - if (mListener != null) mListener.onBookmarkModelUpdated(); - } - } - - /** - * Handles changes in the sync settings. - */ - private class SyncUpdateObserver implements AndroidSyncSettings.AndroidSyncSettingsObserver { - private boolean mIsSyncEnabled; - - public SyncUpdateObserver() { - AndroidSyncSettings.registerObserver(mContext, this); - mIsSyncEnabled = AndroidSyncSettings.isSyncEnabled(mContext); - } - - @Override - public void androidSyncSettingsChanged() { - boolean newSyncStatus = AndroidSyncSettings.isSyncEnabled(mContext); - if (mIsSyncEnabled != newSyncStatus) { - mIsSyncEnabled = newSyncStatus; - if (mListener != null) mListener.onSyncEnabledStatusUpdated(newSyncStatus); - } - } - } - - private final Context mContext; - private UpdateListener mListener; - private BookmarkUpdateObserver mBookmarkUpdateObserver; - private AndroidSyncSettings.AndroidSyncSettingsObserver mSyncObserver; - - public BookmarkWidgetUpdateListener(Context context, UpdateListener listener) { - mContext = context; - - if (listener == null) return; - mListener = listener; - - // Register observers for bookmark and sync state updates. - ContentResolver contentResolver = mContext.getContentResolver(); - mBookmarkUpdateObserver = new BookmarkUpdateObserver(); - contentResolver.registerContentObserver( - ChromeBrowserProvider.getBookmarksApiUri(mContext), true, - mBookmarkUpdateObserver); - - mSyncObserver = new SyncUpdateObserver(); - } - - public void destroy() { - if (mListener == null) return; - - // Unregister observers. - ContentResolver contentResolver = mContext.getContentResolver(); - contentResolver.unregisterContentObserver(mBookmarkUpdateObserver); - AndroidSyncSettings.unregisterObserver(mContext, mSyncObserver); - mListener = null; - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunFragment.java index be16f4c3..e6f60edf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunFragment.java
@@ -12,23 +12,24 @@ import android.view.ViewGroup; import org.chromium.chrome.R; +import org.chromium.chrome.browser.signin.AccountSigninView; /** * A {@link Fragment} meant to handle sync setup for the first run experience. */ -public class AccountFirstRunFragment extends FirstRunPage { +public class AccountFirstRunFragment extends FirstRunPage implements AccountSigninView.Delegate { // Per-page parameters: public static final String FORCE_SIGNIN_ACCOUNT_TO = "ForceSigninAccountTo"; public static final String PRESELECT_BUT_ALLOW_TO_CHANGE = "PreselectButAllowToChange"; public static final String IS_CHILD_ACCOUNT = "IsChildAccount"; - private AccountFirstRunView mView; + private AccountSigninView mView; @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - mView = (AccountFirstRunView) inflater.inflate( - R.layout.fre_choose_account, container, false); + mView = (AccountSigninView) inflater.inflate( + R.layout.account_signin_view, container, false); return mView; } @@ -36,7 +37,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mView.setListener(new AccountFirstRunView.Listener() { + mView.setListener(new AccountSigninView.Listener() { @Override public void onAccountSelectionCanceled() { getPageDelegate().refuseSignIn(); @@ -49,18 +50,11 @@ } @Override - public void onAccountSelected(String accountName) { + public void onAccountSelected(String accountName, boolean settingsClicked) { getPageDelegate().acceptSignIn(accountName); - } - - @Override - public void onDoneClicked() { - advanceToNextPage(); - } - - @Override - public void onSettingsClicked() { - getPageDelegate().askToOpenSyncSettings(); + if (settingsClicked) { + getPageDelegate().askToOpenSyncSettings(); + } advanceToNextPage(); } @@ -70,8 +64,8 @@ // The user would have to go through the FRE again. getPageDelegate().abortFirstRunExperience(); } - }); + mView.setDelegate(this); mView.init(getPageDelegate().getProfileDataCache());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyView.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyView.java deleted file mode 100644 index 52890aaf..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyView.java +++ /dev/null
@@ -1,47 +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.firstrun; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View.MeasureSpec; -import android.widget.FrameLayout; -import android.widget.LinearLayout; - -import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.R; - -/** - * View that handles orientation changes for the Data Saver first run page. - */ -public class DataReductionProxyView extends FrameLayout { - - public DataReductionProxyView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // This assumes that view's layout_width is set to match_parent. - assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - LinearLayout content = (LinearLayout) findViewById(R.id.fre_content); - int paddingStart = 0; - if (width >= 2 * getResources().getDimension(R.dimen.fre_image_carousel_width) - && width > height) { - content.setOrientation(LinearLayout.HORIZONTAL); - paddingStart = getResources().getDimensionPixelSize(R.dimen.fre_margin); - } else { - content.setOrientation(LinearLayout.VERTICAL); - } - ApiCompatibilityUtils.setPaddingRelative(content, - paddingStart, - content.getPaddingTop(), - ApiCompatibilityUtils.getPaddingEnd(content), - content.getPaddingBottom()); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } -} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunView.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunView.java new file mode 100644 index 0000000..d360389 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunView.java
@@ -0,0 +1,118 @@ +// 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. + +package org.chromium.chrome.browser.firstrun; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.R; + +/** + * A page shown during the First Run Experience. It modifies the layout for a better appearance + * for certain screen dimensions. + */ +public class FirstRunView extends FrameLayout { + private static final String TAG = "FirstRunView"; + + private View mMainLayout; + private LinearLayout mImageAndContent; + private LinearLayout mContentWrapper; + + /** + * Constructor for inflating via XML. + */ + public FirstRunView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + // TODO(peconn): Unify the common parts of the FirstRunView layouts. + // TODO(peconn): Use different layout files for the landscape and horizontal parts + + mMainLayout = findViewById(R.id.fre_main_layout); + mImageAndContent = (LinearLayout) findViewById(R.id.fre_image_and_content); + mContentWrapper = (LinearLayout) findViewById(R.id.fre_content_wrapper); + + + } + + protected boolean isHorizontalModeEnabled() { + return true; + } + + protected boolean isDynamicPaddingEnabled() { + return true; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // This assumes that view's layout_width is set to match_parent. + assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; + + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + + MarginLayoutParams contentWrapperLayout = + (MarginLayoutParams) mContentWrapper.getLayoutParams(); + + int imageAndContentPaddingStart = 0; + int halfContentHeight = 0; + // The AccountSigninView is part of the First Run Experience, and it's image carousel is + // the widest of the 'image's to be displayed in the FRE. + if (isHorizontalModeEnabled() + && width >= 2 * getResources().getDimension(R.dimen.signin_image_carousel_width) + && width > height) { + mImageAndContent.setOrientation(LinearLayout.HORIZONTAL); + imageAndContentPaddingStart = getResources().getDimensionPixelSize(R.dimen.fre_margin); + + contentWrapperLayout.width = 0; + contentWrapperLayout.height = LayoutParams.WRAP_CONTENT; + contentWrapperLayout.topMargin = 0; + + halfContentHeight = getResources().getDimensionPixelSize(R.dimen.fre_title_text_size) + + getResources().getDimensionPixelSize(R.dimen.fre_vertical_spacing) + + getResources().getDimensionPixelSize(R.dimen.fre_image_height) / 2; + + } else { + mImageAndContent.setOrientation(LinearLayout.VERTICAL); + + contentWrapperLayout.width = LayoutParams.WRAP_CONTENT; + contentWrapperLayout.height = 0; + contentWrapperLayout.topMargin = + getResources().getDimensionPixelSize(R.dimen.fre_vertical_spacing); + + halfContentHeight = getResources().getDimensionPixelSize(R.dimen.fre_title_text_size) + + getResources().getDimensionPixelSize(R.dimen.fre_vertical_spacing) + + getResources().getDimensionPixelSize(R.dimen.fre_image_height) + + getResources().getDimensionPixelSize(R.dimen.fre_vertical_spacing); + } + + // Add padding to get it roughly centered. + if (isDynamicPaddingEnabled()) { + int topPadding = Math.max(0, (height / 2) - halfContentHeight); + + mMainLayout.setPadding(mMainLayout.getPaddingLeft(), topPadding, + mMainLayout.getPaddingRight(), mMainLayout.getPaddingBottom()); + } + + ApiCompatibilityUtils.setPaddingRelative(mImageAndContent, + imageAndContentPaddingStart, + mImageAndContent.getPaddingTop(), + ApiCompatibilityUtils.getPaddingEnd(mImageAndContent), + mImageAndContent.getPaddingBottom()); + + mContentWrapper.setLayoutParams(contentWrapperLayout); + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + +} +
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ImageCarousel.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ImageCarousel.java index 499bac2..c4d17b25 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ImageCarousel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ImageCarousel.java
@@ -258,7 +258,7 @@ public void onFinishInflate() { super.onFinishInflate(); - mImageWidth = getResources().getDimensionPixelSize(R.dimen.fre_image_carousel_height); + mImageWidth = getResources().getDimensionPixelSize(R.dimen.fre_image_height); for (int i = 0; i < VIEW_COUNT; ++i) { ImageView view = new ImageView(getContext()); FrameLayout.LayoutParams params = @@ -269,7 +269,7 @@ addView(view); } - mCarouselWidth = getResources().getDimensionPixelSize(R.dimen.fre_image_carousel_width); + mCarouselWidth = getResources().getDimensionPixelSize(R.dimen.signin_image_carousel_width); mScrollScalingFactor = SCROLL_FACTOR * mCarouselWidth; mFlingScalingFactor = FLING_FACTOR * mCarouselWidth; mTranslationFactor = TRANSLATION_FACTOR * mImageWidth; @@ -426,7 +426,7 @@ } private void setLayoutParamsForCheckmark(View view) { - int size = getResources().getDimensionPixelSize(R.dimen.fre_checkmark_size); + int size = getResources().getDimensionPixelSize(R.dimen.signin_checkmark_size); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(size, size); params.gravity = Gravity.CENTER;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java index 61c2d506..14aa3c6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java
@@ -6,6 +6,7 @@ import android.content.Context; import android.os.Bundle; +import android.text.TextPaint; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.LayoutInflater; @@ -64,7 +65,8 @@ mTosAndPrivacy.setMovementMethod(LinkMovementMethod.getInstance()); - ClickableSpan clickableTermsSpan = new ClickableSpan() { + int linkColor = getResources().getColor(R.color.ui_link_text_color); + ClickableSpan clickableTermsSpan = new FreClickableSpan(linkColor) { @Override public void onClick(View widget) { if (!isAdded()) return; @@ -73,7 +75,7 @@ } }; - ClickableSpan clickablePrivacySpan = new ClickableSpan() { + ClickableSpan clickablePrivacySpan = new FreClickableSpan(linkColor) { @Override public void onClick(View widget) { if (!isAdded()) return; @@ -86,6 +88,24 @@ new SpanInfo("<LINK2>", "</LINK2>", clickablePrivacySpan))); } + // TODO(peconn): Move this out into a more general class. + private abstract static class FreClickableSpan extends ClickableSpan { + private final int mColor; + + /** + * Creates a clickable span that styles without an underline and uses the given color. + */ + public FreClickableSpan(int color) { + mColor = color; + } + + @Override + public void updateDrawState(TextPaint textPaint) { + textPaint.setColor(mColor); + textPaint.setUnderlineText(false); + } + } + @Override public boolean shouldSkipPageOnCreate(Context appContext) { return PrefServiceBridge.getInstance().isFirstRunEulaAccepted();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/TosAndUmaView.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/TosAndUmaView.java deleted file mode 100644 index 3c8ec64..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/TosAndUmaView.java +++ /dev/null
@@ -1,53 +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.firstrun; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.FrameLayout; -import android.widget.LinearLayout; - -import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.R; - -/** - * View that handles orientation changes for Terms of Service and UMA first run page. - */ -public class TosAndUmaView extends FrameLayout { - - public TosAndUmaView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // This assumes that view's layout_width is set to match_parent. - assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - LinearLayout content = (LinearLayout) findViewById(R.id.fre_content); - LinearLayout wrapper = (LinearLayout) findViewById(R.id.text_wrapper); - MarginLayoutParams params = (MarginLayoutParams) wrapper.getLayoutParams(); - int paddingStart = 0; - if (width >= 2 * getResources().getDimension(R.dimen.fre_image_carousel_width) - && width > height) { - content.setOrientation(LinearLayout.HORIZONTAL); - paddingStart = getResources().getDimensionPixelSize(R.dimen.fre_margin); - params.width = 0; - params.height = LayoutParams.WRAP_CONTENT; - } else { - content.setOrientation(LinearLayout.VERTICAL); - params.width = LayoutParams.WRAP_CONTENT; - params.height = 0; - } - ApiCompatibilityUtils.setPaddingRelative(content, - paddingStart, - content.getPaddingTop(), - ApiCompatibilityUtils.getPaddingEnd(content), - content.getPaddingBottom()); - wrapper.setLayoutParams(params); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java index 5a74252..5fc4b6d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProvider.java
@@ -11,6 +11,7 @@ import android.support.v7.media.MediaRouter.RouteInfo; import org.chromium.base.Log; +import org.chromium.base.VisibleForTesting; import org.chromium.chrome.browser.media.router.ChromeMediaRouter; import org.chromium.chrome.browser.media.router.DiscoveryDelegate; import org.chromium.chrome.browser.media.router.MediaRoute; @@ -41,6 +42,7 @@ private final Context mApplicationContext; private final MediaRouter mAndroidMediaRouter; private final MediaRouteManager mManager; + private final CastMessageHandler mMessageHandler; private final Map<String, DiscoveryCallback> mDiscoveryCallbacks = new HashMap<String, DiscoveryCallback>(); private final Map<String, MediaRoute> mRoutes = new HashMap<String, MediaRoute>(); @@ -101,12 +103,7 @@ public void onSessionCreated(CastSession session) { mSession = session; - - for (ClientRecord client : mClientRecords.values()) { - if (!client.isConnected) continue; - - mSession.onClientConnected(client.clientId); - } + mMessageHandler.onSessionCreated(mSession); } public void onSessionClosed() { @@ -152,10 +149,18 @@ mManager.onMessage(clientRecord.routeId, message); } + public CastMessageHandler getMessageHandler() { + return mMessageHandler; + } + public Set<String> getClients() { return mClientRecords.keySet(); } + public Map<String, ClientRecord> getClientRecords() { + return mClientRecords; + } + @Override public void onSinksReceived(String sourceId, List<MediaSink> sinks) { mHandler.post(new OnSinksReceivedRunnable(mManager, this, sourceId, sinks)); @@ -340,14 +345,17 @@ JSONObject jsonMessage = new JSONObject(message); String messageType = jsonMessage.getString("type"); + // TODO(zqzhang): Move the handling of "client_connect", "client_disconnect" and + // "leave_session" from CastMRP to CastMessageHandler. Also, need to have a + // ClientManager for client managing. if ("client_connect".equals(messageType)) { success = handleClientConnectMessage(jsonMessage); } else if ("client_disconnect".equals(messageType)) { success = handleClientDisconnectMessage(jsonMessage); } else if ("leave_session".equals(messageType)) { success = handleLeaveSessionMessage(jsonMessage); - } else if (mSession != null) { - success = mSession.handleSessionMessage(jsonMessage, messageType); + } else if (mSession != null) { + success = mMessageHandler.handleSessionMessage(jsonMessage); } } catch (JSONException e) { Log.e(TAG, "JSONException while handling internal message: " + e); @@ -441,11 +449,18 @@ return jsonMessage.toString(); } + @VisibleForTesting + static CastMediaRouteProvider createCastMediaRouteProviderForTest( + Context applicationContext, MediaRouter androidMediaRouter, MediaRouteManager manager) { + return new CastMediaRouteProvider(applicationContext, androidMediaRouter, manager); + } + private CastMediaRouteProvider( Context applicationContext, MediaRouter androidMediaRouter, MediaRouteManager manager) { mApplicationContext = applicationContext; mAndroidMediaRouter = androidMediaRouter; mManager = manager; + mMessageHandler = new CastMessageHandler(this); } @Nullable @@ -516,13 +531,14 @@ tabId)); } + // TODO(zqzhang): Move this method to CastMessageHandler. private void sendReceiverAction( String routeId, MediaSink sink, String clientId, String action) { try { JSONObject jsonReceiver = new JSONObject(); jsonReceiver.put("label", sink.getId()); jsonReceiver.put("friendlyName", sink.getName()); - jsonReceiver.put("capabilities", CastSession.getCapabilities(sink.getDevice())); + jsonReceiver.put("capabilities", CastSessionImpl.getCapabilities(sink.getDevice())); jsonReceiver.put("volume", null); jsonReceiver.put("isActiveInput", null); jsonReceiver.put("displayStatus", null);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandler.java new file mode 100644 index 0000000..5f99933 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandler.java
@@ -0,0 +1,624 @@ +// 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. + +package org.chromium.chrome.browser.media.router.cast; + +import android.os.Handler; +import android.support.v4.util.ArrayMap; +import android.util.SparseArray; + +import org.chromium.base.Log; +import org.chromium.base.VisibleForTesting; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Queue; + +/** + * The handler for cast messages. It receives events between the Cast SDK and the page, process and + * dispatch the messages accordingly. The handler talks to the Cast SDK via CastSession, and + * talks to the pages via the media router. + */ +public class CastMessageHandler { + private static final String TAG = "MediaRouter"; + + // Sequence number used when no sequence number is required or was initially passed. + static final int INVALID_SEQUENCE_NUMBER = -1; + static final String MEDIA_NAMESPACE = "urn:x-cast:com.google.cast.media"; + static final String GAMES_NAMESPACE = "urn:x-cast:com.google.cast.games"; + + private static final String MEDIA_MESSAGE_TYPES[] = { + "PLAY", + "LOAD", + "PAUSE", + "SEEK", + "STOP_MEDIA", + "MEDIA_SET_VOLUME", + "MEDIA_GET_STATUS", + "EDIT_TRACKS_INFO", + "QUEUE_LOAD", + "QUEUE_INSERT", + "QUEUE_UPDATE", + "QUEUE_REMOVE", + "QUEUE_REORDER", + }; + + private static final String MEDIA_SUPPORTED_COMMANDS[] = { + "pause", + "seek", + "stream_volume", + "stream_mute", + }; + + // Lock used to lazy initialize sMediaOverloadedMessageTypes. + private static final Object INIT_LOCK = new Object(); + + // Map associating types that have a different names outside of the media namespace and inside. + // In other words, some types are sent as MEDIA_FOO or FOO_MEDIA by the client by the Cast + // expect them to be named FOO. The reason being that FOO might exist in multiple namespaces + // but the client isn't aware of namespacing. + private static Map<String, String> sMediaOverloadedMessageTypes; + + private SparseArray<RequestRecord> mRequests; + private ArrayMap<String, Queue<Integer>> mStopRequests; + private Queue<RequestRecord> mVolumeRequests; + + // The reference to CastSession, only valid after calling {@link onSessionCreated}, and will be + // reset to null when calling {@link onApplicationStopped}. + private CastSession mSession = null; + private final CastMediaRouteProvider mRouteProvider; + private Handler mHandler; + + /** + * The record for client requests. {@link CastMessageHandler} uses this class to manage the + * client requests and match responses to the requests. + */ + static class RequestRecord { + public final String clientId; + public final int sequenceNumber; + + public RequestRecord(String clientId, int sequenceNumber) { + this.clientId = clientId; + this.sequenceNumber = sequenceNumber; + } + } + + /** + * Initializes a new {@link CastMessageHandler} instance. + * @param session The {@link CastSession} for communicating with the Cast SDK. + * @param provider The {@link CastMediaRouteProvider} for communicating with the page. + */ + public CastMessageHandler(CastMediaRouteProvider provider) { + mRouteProvider = provider; + mRequests = new SparseArray<RequestRecord>(); + mStopRequests = new ArrayMap<String, Queue<Integer>>(); + mVolumeRequests = new ArrayDeque<RequestRecord>(); + mHandler = new Handler(); + + synchronized (INIT_LOCK) { + if (sMediaOverloadedMessageTypes == null) { + sMediaOverloadedMessageTypes = new HashMap<String, String>(); + sMediaOverloadedMessageTypes.put("STOP_MEDIA", "STOP"); + sMediaOverloadedMessageTypes.put("MEDIA_SET_VOLUME", "SET_VOLUME"); + sMediaOverloadedMessageTypes.put("MEDIA_GET_STATUS", "GET_STATUS"); + } + } + } + + @VisibleForTesting + static String[] getMediaMessageTypesForTest() { + return MEDIA_MESSAGE_TYPES; + } + + @VisibleForTesting + static Map<String, String> getMediaOverloadedMessageTypesForTest() { + return sMediaOverloadedMessageTypes; + } + + @VisibleForTesting + SparseArray<RequestRecord> getRequestsForTest() { + return mRequests; + } + + @VisibleForTesting + Queue<RequestRecord> getVolumeRequestsForTest() { + return mVolumeRequests; + } + + @VisibleForTesting + Map<String, Queue<Integer>> getStopRequestsForTest() { + return mStopRequests; + } + + /** + * Set the session when a session is created, and notify all clients that are not connected. + * @param session The newly created session. + */ + public void onSessionCreated(CastSession session) { + mSession = session; + for (ClientRecord client : mRouteProvider.getClientRecords().values()) { + if (!client.isConnected) continue; + + mSession.onClientConnected(client.clientId); + } + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Functions for handling messages from the page to the Cast device. + + /** + * Handles messages related to the cast session, i.e. messages happening on a established + * connection. All these messages are sent from the page to the Cast SDK. + * @param message The JSONObject message to be handled. + */ + public boolean handleSessionMessage(JSONObject message) throws JSONException { + String messageType = message.getString("type"); + if ("v2_message".equals(messageType)) { + return handleCastV2Message(message); + } else if ("app_message".equals(messageType)) { + return handleAppMessage(message); + } else { + Log.e(TAG, "Unsupported message: %s", message); + return false; + } + } + + // An example of the Cast V2 message: + // { + // "type": "v2_message", + // "message": { + // "type": "...", + // ... + // }, + // "sequenceNumber": 0, + // "timeoutMillis": 0, + // "clientId": "144042901280235697" + // } + @VisibleForTesting + boolean handleCastV2Message(JSONObject jsonMessage) + throws JSONException { + assert "v2_message".equals(jsonMessage.getString("type")); + + final String clientId = jsonMessage.getString("clientId"); + if (clientId == null || !mRouteProvider.getClients().contains(clientId)) return false; + + JSONObject jsonCastMessage = jsonMessage.getJSONObject("message"); + String messageType = jsonCastMessage.getString("type"); + final int sequenceNumber = jsonMessage.optInt("sequenceNumber", INVALID_SEQUENCE_NUMBER); + + if ("STOP".equals(messageType)) { + handleStopMessage(clientId, sequenceNumber); + return true; + } + + if ("SET_VOLUME".equals(messageType)) { + CastSession.HandleVolumeMessageResult result = + mSession.handleVolumeMessage( + jsonCastMessage.getJSONObject("volume"), clientId, sequenceNumber); + if (!result.mSucceeded) return false; + + // For each successful volume message we need to respond with an empty "v2_message" so + // the Cast Web SDK can call the success callback of the page. If we expect the volume + // to change as the result of the command, we're relying on {@link + // Cast.CastListener#onVolumeChanged} to get called by the Android Cast SDK when the + // receiver status is updated. We keep the sequence number until then. If the volume + // doesn't change as the result of the command, we won't get notified by the Android SDK + // when the status update is received so we respond to the volume message immediately. + if (result.mShouldWaitForVolumeChange) { + mVolumeRequests.add(new RequestRecord(clientId, sequenceNumber)); + } else { + // It's usually bad to have request and response on the same call stack so post the + // response to the Android message loop. + mHandler.post(new Runnable() { + @Override + public void run() { + onVolumeChanged(clientId, sequenceNumber); + } + }); + } + return true; + } + + if (Arrays.asList(MEDIA_MESSAGE_TYPES).contains(messageType)) { + if (sMediaOverloadedMessageTypes.containsKey(messageType)) { + messageType = sMediaOverloadedMessageTypes.get(messageType); + jsonCastMessage.put("type", messageType); + } + return sendJsonCastMessage(jsonCastMessage, MEDIA_NAMESPACE, clientId, sequenceNumber); + } + + return true; + } + + @VisibleForTesting + void handleStopMessage(String clientId, int sequenceNumber) { + Queue<Integer> sequenceNumbersForClient = mStopRequests.get(clientId); + if (sequenceNumbersForClient == null) { + sequenceNumbersForClient = new ArrayDeque<Integer>(); + mStopRequests.put(clientId, sequenceNumbersForClient); + } + sequenceNumbersForClient.add(sequenceNumber); + + mSession.stopApplication(); + } + + // An example of the Cast application message: + // { + // "type":"app_message", + // "message": { + // "sessionId":"...", + // "namespaceName":"...", + // "message": ... + // }, + // "sequenceNumber":0, + // "timeoutMillis":3000, + // "clientId":"14417311915272175" + // } + @VisibleForTesting + boolean handleAppMessage(JSONObject jsonMessage) throws JSONException { + assert "app_message".equals(jsonMessage.getString("type")); + + String clientId = jsonMessage.getString("clientId"); + if (clientId == null || !mRouteProvider.getClients().contains(clientId)) return false; + + JSONObject jsonAppMessageWrapper = jsonMessage.getJSONObject("message"); + + if (!mSession.getSessionId().equals(jsonAppMessageWrapper.getString("sessionId"))) { + return false; + } + + String namespaceName = jsonAppMessageWrapper.getString("namespaceName"); + if (namespaceName == null || namespaceName.isEmpty()) return false; + + if (!mSession.getNamespaces().contains(namespaceName)) return false; + + int sequenceNumber = jsonMessage.optInt("sequenceNumber", INVALID_SEQUENCE_NUMBER); + + Object actualMessageObject = jsonAppMessageWrapper.get("message"); + if (actualMessageObject == null) return false; + + if (actualMessageObject instanceof String) { + String actualMessage = jsonAppMessageWrapper.getString("message"); + return mSession.sendStringCastMessage( + actualMessage, namespaceName, clientId, sequenceNumber); + } + + JSONObject actualMessage = jsonAppMessageWrapper.getJSONObject("message"); + return sendJsonCastMessage(actualMessage, namespaceName, clientId, sequenceNumber); + } + + @VisibleForTesting + boolean sendJsonCastMessage( + JSONObject message, + final String namespace, + final String clientId, + final int sequenceNumber) throws JSONException { + if (mSession.isApiClientInvalid()) return false; + + removeNullFields(message); + + // Map the request id to a valid sequence number only. + if (sequenceNumber != INVALID_SEQUENCE_NUMBER) { + // If for some reason, there is already a requestId other than 0, it + // is kept. Otherwise, one is generated. In all cases it's associated with the + // sequenceNumber passed by the client. + int requestId = message.optInt("requestId", 0); + if (requestId == 0) { + requestId = CastRequestIdGenerator.getNextRequestId(); + message.put("requestId", requestId); + } + mRequests.append(requestId, new RequestRecord(clientId, sequenceNumber)); + } + + return mSession.sendStringCastMessage( + message.toString(), namespace, clientId, sequenceNumber); + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Functions for handling messages from the Cast device to the pages. + + /** + * Forwards the messages from the Cast device to the clients, and perform proper actions if it + * is media message. + * @param namespace The application specific namespace this message belongs to. + * @param message The message within the namespace that's being sent by the receiver + */ + public void onMessageReceived(String namespace, String message) { + RequestRecord request = null; + try { + JSONObject jsonMessage = new JSONObject(message); + int requestId = jsonMessage.getInt("requestId"); + if (mRequests.indexOfKey(requestId) >= 0) { + request = mRequests.get(requestId); + mRequests.delete(requestId); + } + } catch (JSONException e) { + } + + if (MEDIA_NAMESPACE.equals(namespace)) { + onMediaMessage(message, request); + return; + } + + onAppMessage(message, namespace, request); + } + + /** + * Forwards the media message to the page via the media router. + * The MEDIA_STATUS message needs to be sent to all the clients. + * @param message The media that's being send by the receiver. + * @param request The information about the client and the sequence number to respond with. + */ + @VisibleForTesting + void onMediaMessage(String message, RequestRecord request) { + mSession.onMediaMessage(message); + + if (isMediaStatusMessage(message)) { + // MEDIA_STATUS needs to be sent to all the clients. + for (String clientId : mRouteProvider.getClients()) { + if (request != null && clientId.equals(request.clientId)) continue; + + sendClientMessageTo( + clientId, "v2_message", message, INVALID_SEQUENCE_NUMBER); + } + } + if (request != null) { + sendClientMessageTo( + request.clientId, "v2_message", message, request.sequenceNumber); + } + } + + /** + * Forwards the application specific message to the page via the media router. + * @param message The message within the namespace that's being sent by the receiver. + * @param namespace The application specific namespace this message belongs to. + * @param request The information about the client and the sequence number to respond with. + */ + @VisibleForTesting + void onAppMessage(String message, String namespace, RequestRecord request) { + try { + JSONObject jsonMessage = new JSONObject(); + jsonMessage.put("sessionId", mSession.getSessionId()); + jsonMessage.put("namespaceName", namespace); + jsonMessage.put("message", message); + if (request != null) { + sendClientMessageTo(request.clientId, "app_message", + jsonMessage.toString(), request.sequenceNumber); + } else { + broadcastClientMessage("app_message", jsonMessage.toString()); + } + } catch (JSONException e) { + Log.e(TAG, "Failed to create the message wrapper", e); + } + } + + /** + * Notifies the application has stopped to all requesting clients. + */ + public void onApplicationStopped() { + for (String clientId : mRouteProvider.getClients()) { + Queue<Integer> sequenceNumbersForClient = mStopRequests.get(clientId); + if (sequenceNumbersForClient == null) { + sendClientMessageTo( + clientId, "remove_session", mSession.getSessionId(), + INVALID_SEQUENCE_NUMBER); + continue; + } + + for (int sequenceNumber : sequenceNumbersForClient) { + sendClientMessageTo( + clientId, "remove_session", mSession.getSessionId(), sequenceNumber); + } + mStopRequests.remove(clientId); + mSession = null; + } + } + + /** + * When the Cast device volume really changed, updates the session status and notify all + * requesting clients. + */ + public void onVolumeChanged() { + mSession.updateSessionStatus(); + + if (mVolumeRequests.isEmpty()) return; + + for (RequestRecord r : mVolumeRequests) onVolumeChanged(r.clientId, r.sequenceNumber); + mVolumeRequests.clear(); + } + + @VisibleForTesting + void onVolumeChanged(String clientId, int sequenceNumber) { + sendClientMessageTo(clientId, "v2_message", null, sequenceNumber); + } + + /** + * Notifies a client that an app message has been sent. + * @param clientId The client id the message is sent from. + * @param sequenceNumber The sequence number of the message. + */ + public void onAppMessageSent(String clientId, int sequenceNumber) { + sendClientMessageTo(clientId, "app_message", null, sequenceNumber); + } + + /** + * Broadcasts the message to all clients. + * @param type The type of the message. + * @param message The message to broadcast. + */ + public void broadcastClientMessage(String type, String message) { + for (String clientId : mRouteProvider.getClients()) { + sendClientMessageTo(clientId, type, message, INVALID_SEQUENCE_NUMBER); + } + } + + /** + * Sends a message to a specific client. + * @param clientId The id of the receiving client. + * @param type The type of the message. + * @param message The message to be sent. + * @param sequenceNumber The sequence number for matching requesting and responding messages. + */ + public void sendClientMessageTo( + String clientId, String type, String message, int sequenceNumber) { + mRouteProvider.onMessage(clientId, + buildInternalMessage(type, message, clientId, sequenceNumber)); + } + + @VisibleForTesting + String buildInternalMessage( + String type, String message, String clientId, int sequenceNumber) { + JSONObject json = new JSONObject(); + try { + json.put("type", type); + json.put("sequenceNumber", sequenceNumber); + json.put("timeoutMillis", 0); + json.put("clientId", clientId); + + // TODO(mlamouri): we should have a more reliable way to handle string, null and Object + // messages. + if (message == null + || "remove_session".equals(type) + || "disconnect_session".equals(type)) { + json.put("message", message); + } else { + JSONObject jsonMessage = new JSONObject(message); + if ("v2_message".equals(type) + && "MEDIA_STATUS".equals(jsonMessage.getString("type"))) { + sanitizeMediaStatusMessage(jsonMessage); + } + json.put("message", jsonMessage); + } + } catch (JSONException e) { + Log.e(TAG, "Failed to build the reply: " + e); + } + + return json.toString(); + } + + /** + * @return A message containing the information of the {@link CastSession}. + */ + public String buildSessionMessage() { + if (mSession == null) return "{}"; + + CastSessionInfo sessionInfo = mSession.getSessionInfo(); + if (sessionInfo == null) return "{}"; + + try { + // "volume" is a part of "receiver" initialized below. + JSONObject jsonVolume = new JSONObject(); + jsonVolume.put("level", sessionInfo.receiver.volume.level); + jsonVolume.put("muted", sessionInfo.receiver.volume.muted); + + // "receiver" is a part of "message" initialized below. + JSONObject jsonReceiver = new JSONObject(); + jsonReceiver.put("label", sessionInfo.receiver.label); + jsonReceiver.put("friendlyName", sessionInfo.receiver.friendlyName); + jsonReceiver.put("capabilities", toJSONArray(sessionInfo.receiver.capabilities)); + jsonReceiver.put("volume", jsonVolume); + jsonReceiver.put("isActiveInput", sessionInfo.receiver.isActiveInput); + jsonReceiver.put("displayStatus", sessionInfo.receiver.displayStatus); + jsonReceiver.put("receiverType", sessionInfo.receiver.receiverType); + + JSONArray jsonNamespaces = new JSONArray(); + for (String namespace : sessionInfo.namespaces) { + JSONObject jsonNamespace = new JSONObject(); + jsonNamespace.put("name", namespace); + jsonNamespaces.put(jsonNamespace); + } + + JSONObject jsonMessage = new JSONObject(); + jsonMessage.put("sessionId", sessionInfo.sessionId); + jsonMessage.put("statusText", sessionInfo.statusText); + jsonMessage.put("receiver", jsonReceiver); + jsonMessage.put("namespaces", jsonNamespaces); + jsonMessage.put("media", toJSONArray(sessionInfo.media)); + jsonMessage.put("status", sessionInfo.status); + jsonMessage.put("transportId", sessionInfo.transportId); + jsonMessage.put("appId", sessionInfo.appId); + jsonMessage.put("displayName", sessionInfo.displayName); + + return jsonMessage.toString(); + } catch (JSONException e) { + Log.w(TAG, "Building session message failed", e); + return "{}"; + } + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Utility functions + + /** + * Modifies the received MediaStatus message to match the format expected by the client. + */ + private void sanitizeMediaStatusMessage(JSONObject object) throws JSONException { + object.put("sessionId", mSession.getSessionId()); + + JSONArray mediaStatus = object.getJSONArray("status"); + for (int i = 0; i < mediaStatus.length(); ++i) { + JSONObject status = mediaStatus.getJSONObject(i); + status.put("sessionId", mSession.getSessionId()); + if (!status.has("supportedMediaCommands")) continue; + + JSONArray commands = new JSONArray(); + int bitfieldCommands = status.getInt("supportedMediaCommands"); + for (int j = 0; j < 4; ++j) { + if ((bitfieldCommands & (1 << j)) != 0) { + commands.put(MEDIA_SUPPORTED_COMMANDS[j]); + } + } + + status.put("supportedMediaCommands", commands); // Removes current entry. + } + } + + /** + * Remove 'null' fields from a JSONObject. This method calls itself recursively until all the + * fields have been looked at. + * TODO(mlamouri): move to some util class? + */ + private static void removeNullFields(Object object) throws JSONException { + if (object instanceof JSONArray) { + JSONArray array = (JSONArray) object; + for (int i = 0; i < array.length(); ++i) removeNullFields(array.get(i)); + } else if (object instanceof JSONObject) { + JSONObject json = (JSONObject) object; + JSONArray names = json.names(); + if (names == null) return; + for (int i = 0; i < names.length(); ++i) { + String key = names.getString(i); + if (json.isNull(key)) { + json.remove(key); + } else { + removeNullFields(json.get(key)); + } + } + } + } + + @VisibleForTesting + boolean isMediaStatusMessage(String message) { + try { + JSONObject jsonMessage = new JSONObject(message); + return "MEDIA_STATUS".equals(jsonMessage.getString("type")); + } catch (JSONException e) { + return false; + } + } + + private JSONArray toJSONArray(List<String> from) throws JSONException { + JSONArray result = new JSONArray(); + for (String entry : from) { + result.put(entry); + } + return result; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSession.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSession.java index 1f61a73..860b5056 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSession.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSession.java
@@ -1,848 +1,127 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// 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. package org.chromium.chrome.browser.media.router.cast; -import android.content.Context; -import android.os.Handler; -import android.support.v4.util.ArrayMap; -import android.util.SparseArray; - -import com.google.android.gms.cast.ApplicationMetadata; -import com.google.android.gms.cast.Cast; -import com.google.android.gms.cast.CastDevice; -import com.google.android.gms.cast.MediaStatus; -import com.google.android.gms.cast.RemoteMediaPlayer; -import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.common.api.ResultCallback; -import com.google.android.gms.common.api.Status; - -import org.chromium.base.ApplicationStatus; -import org.chromium.base.Log; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.media.ui.MediaNotificationInfo; -import org.chromium.chrome.browser.media.ui.MediaNotificationListener; -import org.chromium.chrome.browser.media.ui.MediaNotificationManager; -import org.chromium.chrome.browser.tab.Tab; -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.IOException; -import java.util.ArrayDeque; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Queue; import java.util.Set; /** - * A wrapper around the established Cast application session. + * The interface for talking to the GMS core. We need to isolate this + * interface from its implementation so that we can mock it with out + * dependencies on the GMS core. Otherwise junit tests will fail on + * the bots since they don't support GMS core for junit tests. For + * example, see: https://crbug.com/588758 */ -public class CastSession implements MediaNotificationListener { - private static final String TAG = "MediaRouter"; +public interface CastSession { + /** + * The return type for {@link handleVolumeMessage}. + */ + static class HandleVolumeMessageResult { + public final boolean mSucceeded; + public final boolean mShouldWaitForVolumeChange; - private static final String MEDIA_NAMESPACE = "urn:x-cast:com.google.cast.media"; - private static final String GAMES_NAMESPACE = "urn:x-cast:com.google.cast.games"; - - private static final String MEDIA_MESSAGE_TYPES[] = { - "PLAY", - "LOAD", - "PAUSE", - "SEEK", - "STOP_MEDIA", - "MEDIA_SET_VOLUME", - "MEDIA_GET_STATUS", - "EDIT_TRACKS_INFO", - "QUEUE_LOAD", - "QUEUE_INSERT", - "QUEUE_UPDATE", - "QUEUE_REMOVE", - "QUEUE_REORDER", - }; - - private static final String MEDIA_SUPPORTED_COMMANDS[] = { - "pause", - "seek", - "stream_volume", - "stream_mute", - }; - - // Sequence number used when no sequence number is required or was initially passed. - private static final int INVALID_SEQUENCE_NUMBER = -1; - - // Map associating types that have a different names outside of the media namespace and inside. - // In other words, some types are sent as MEDIA_FOO or FOO_MEDIA by the client by the Cast - // expect them to be named FOO. The reason being that FOO might exist in multiple namespaces - // but the client isn't aware of namespacing. - private static Map<String, String> sMediaOverloadedMessageTypes; - - // Lock used to lazy initialize sMediaOverloadedMessageTypes. - private static final Object INIT_LOCK = new Object(); - - // The value is borrowed from the Android Cast SDK code to match their behavior. - private static final double MIN_VOLUME_LEVEL_DELTA = 1e-7; - - private static class RequestRecord { - public final String clientId; - public final int sequenceNumber; - - public RequestRecord(String clientId, int sequenceNumber) { - this.clientId = clientId; - this.sequenceNumber = sequenceNumber; - } - } - - private static class CastMessagingChannel implements Cast.MessageReceivedCallback { - private final CastSession mSession; - - public CastMessagingChannel(CastSession session) { - mSession = session; - } - - @Override - public void onMessageReceived(CastDevice castDevice, String namespace, String message) { - Log.d(TAG, "Received message from Cast device: namespace=\"" + namespace - + "\" message=\"" + message + "\""); - - RequestRecord request = null; - try { - JSONObject jsonMessage = new JSONObject(message); - int requestId = jsonMessage.getInt("requestId"); - if (mSession.mRequests.indexOfKey(requestId) >= 0) { - request = mSession.mRequests.get(requestId); - mSession.mRequests.delete(requestId); - } - } catch (JSONException e) { - } - - if (MEDIA_NAMESPACE.equals(namespace)) { - mSession.onMediaMessage(message, request); - return; - } - - mSession.onAppMessage(message, namespace, request); + /** + * Initializes a {@link HandleVolumeMessageResult}. + */ + public HandleVolumeMessageResult(boolean succeeded, boolean shouldWaitForVolumeChange) { + mSucceeded = succeeded; + mShouldWaitForVolumeChange = shouldWaitForVolumeChange; } } /** - * Remove 'null' fields from a JSONObject. This method calls itself recursively until all the - * fields have been looked at. - * TODO(mlamouri): move to some util class? + * @return If the gms core api client is invalid. */ - private static void removeNullFields(Object object) throws JSONException { - if (object instanceof JSONArray) { - JSONArray array = (JSONArray) object; - for (int i = 0; i < array.length(); ++i) removeNullFields(array.get(i)); - } else if (object instanceof JSONObject) { - JSONObject json = (JSONObject) object; - JSONArray names = json.names(); - if (names == null) return; - for (int i = 0; i < names.length(); ++i) { - String key = names.getString(i); - if (json.isNull(key)) { - json.remove(key); - } else { - removeNullFields(json.get(key)); - } - } - } - } - - private final CastMessagingChannel mMessageChannel; - private final CastMediaRouteProvider mRouteProvider; - private final CastDevice mCastDevice; - private final MediaSource mSource; - - private Set<String> mNamespaces = new HashSet<String>(); - private GoogleApiClient mApiClient; - private String mSessionId; - private String mApplicationStatus; - private ApplicationMetadata mApplicationMetadata; - private boolean mStoppingApplication; - private MediaNotificationInfo.Builder mNotificationBuilder; - private RemoteMediaPlayer mMediaPlayer; - - private SparseArray<RequestRecord> mRequests; - private Queue<RequestRecord> mVolumeRequests; - private ArrayMap<String, Queue<Integer>> mStopRequests; - - private Handler mHandler; + boolean isApiClientInvalid(); /** - * Initializes a new {@link CastSession} instance. - * @param apiClient The Google Play Services client used to create the session. - * @param sessionId The session identifier to use with the Cast SDK. - * @param origin The origin of the frame requesting the route. - * @param tabId the id of the tab containing the frame requesting the route. - * @param source The {@link MediaSource} corresponding to this session. - * @param routeProvider The {@link CastMediaRouteProvider} instance managing this session. + * @return The sink id of the CastSession. */ - public CastSession( - GoogleApiClient apiClient, - String sessionId, - ApplicationMetadata metadata, - String applicationStatus, - CastDevice castDevice, - String origin, - int tabId, - MediaSource source, - CastMediaRouteProvider routeProvider) { - mApiClient = apiClient; - mSessionId = sessionId; - mSource = source; - mRouteProvider = routeProvider; - mApplicationMetadata = metadata; - mApplicationStatus = applicationStatus; - mCastDevice = castDevice; - mRequests = new SparseArray<RequestRecord>(); - mVolumeRequests = new ArrayDeque<RequestRecord>(); - mStopRequests = new ArrayMap<String, Queue<Integer>>(); - mHandler = new Handler(); - - mMessageChannel = new CastMessagingChannel(this); - updateNamespaces(); - - final Context context = ApplicationStatus.getApplicationContext(); - - if (mNamespaces.contains(MEDIA_NAMESPACE)) { - mMediaPlayer = new RemoteMediaPlayer(); - mMediaPlayer.setOnStatusUpdatedListener( - new RemoteMediaPlayer.OnStatusUpdatedListener() { - @Override - public void onStatusUpdated() { - MediaStatus mediaStatus = mMediaPlayer.getMediaStatus(); - if (mediaStatus == null) return; - - int playerState = mediaStatus.getPlayerState(); - if (playerState == MediaStatus.PLAYER_STATE_PAUSED - || playerState == MediaStatus.PLAYER_STATE_PLAYING) { - mNotificationBuilder.setPaused( - playerState != MediaStatus.PLAYER_STATE_PLAYING); - mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP - | MediaNotificationInfo.ACTION_PLAY_PAUSE); - } else { - mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP); - } - MediaNotificationManager.show(context, mNotificationBuilder.build()); - } - }); - } - - mNotificationBuilder = new MediaNotificationInfo.Builder() - .setTitle(mCastDevice.getFriendlyName()) - .setPaused(false) - .setOrigin(origin) - // TODO(avayvod): the same session might have more than one tab id. Should we track - // the last foreground alive tab and update the notification with it? - .setTabId(tabId) - // TODO(avayvod): pass true here if initiated from the incognito mode. - // MediaRouter is disabled for Incognito mode for now, see https://crbug.com/525215 - .setPrivate(false) - .setIcon(R.drawable.ic_notification_media_route) - .setActions(MediaNotificationInfo.ACTION_STOP) - .setContentIntent(Tab.createBringTabToFrontIntent(tabId)) - .setId(R.id.presentation_notification) - .setListener(this); - MediaNotificationManager.show(context, mNotificationBuilder.build()); - - synchronized (INIT_LOCK) { - if (sMediaOverloadedMessageTypes == null) { - sMediaOverloadedMessageTypes = new HashMap<String, String>(); - sMediaOverloadedMessageTypes.put("STOP_MEDIA", "STOP"); - sMediaOverloadedMessageTypes.put("MEDIA_SET_VOLUME", "SET_VOLUME"); - sMediaOverloadedMessageTypes.put("MEDIA_GET_STATUS", "GET_STATUS"); - } - } - } + String getSinkId(); /** - * @return the id of the Cast session controlled by the route. + * @return The source id of the CastSession. */ - public String getSessionId() { - return mSessionId; - } - - public void stopApplication() { - if (mStoppingApplication) return; - - if (isApiClientInvalid()) return; - - mStoppingApplication = true; - Cast.CastApi.stopApplication(mApiClient, mSessionId) - .setResultCallback(new ResultCallback<Status>() { - @Override - public void onResult(Status status) { - for (String clientId : mRouteProvider.getClients()) { - Queue<Integer> sequenceNumbersForClient = mStopRequests.get(clientId); - if (sequenceNumbersForClient == null) { - sendClientMessageTo(clientId, "remove_session", mSessionId, - INVALID_SEQUENCE_NUMBER); - continue; - } - - for (int sequenceNumber : sequenceNumbersForClient) { - sendClientMessageTo( - clientId, "remove_session", mSessionId, sequenceNumber); - } - mStopRequests.remove(clientId); - } - - // TODO(avayvod): handle a failure to stop the application. - // https://crbug.com/535577 - - for (String namespace : mNamespaces) unregisterNamespace(namespace); - mNamespaces.clear(); - - mSessionId = null; - mApiClient = null; - - mRouteProvider.onSessionClosed(); - mStoppingApplication = false; - - MediaNotificationManager.clear(R.id.presentation_notification); - } - }); - } - - public String getSourceId() { - return mSource.getUrn(); - } - - public String getSinkId() { - return mCastDevice.getDeviceId(); - } - - public void onClientConnected(String clientId) { - sendClientMessageTo( - clientId, "new_session", buildSessionMessage(), INVALID_SEQUENCE_NUMBER); - - if (mMediaPlayer != null && !isApiClientInvalid()) mMediaPlayer.requestStatus(mApiClient); - } - - ///////////////////////////////////////////////////////////////////////////////////////////// - // MediaNotificationListener implementation. - - @Override - public void onPlay(int actionSource) { - if (mMediaPlayer == null || isApiClientInvalid()) return; - - mMediaPlayer.play(mApiClient); - } - - @Override - public void onPause(int actionSource) { - if (mMediaPlayer == null || isApiClientInvalid()) return; - - mMediaPlayer.pause(mApiClient); - } - - @Override - public void onStop(int actionSource) { - stopApplication(); - mRouteProvider.onSessionStopAction(); - } - + String getSourceId(); /** - * Forwards the media message to the page via the media router. - * The MEDIA_STATUS message needs to be sent to all the clients. - * @param message The media that's being send by the receiver. - * @param request The information about the client and the sequence number to respond with. + * @return The id of the CastSession. */ - private void onMediaMessage(String message, RequestRecord request) { - if (mMediaPlayer != null) { - mMediaPlayer.onMessageReceived(mCastDevice, MEDIA_NAMESPACE, message); - } - - if (isMediaStatusMessage(message)) { - // MEDIA_STATUS needs to be sent to all the clients. - for (String clientId : mRouteProvider.getClients()) { - if (request != null && clientId.equals(request.clientId)) continue; - - sendClientMessageTo( - clientId, "v2_message", message, INVALID_SEQUENCE_NUMBER); - } - } - if (request != null) { - sendClientMessageTo(request.clientId, "v2_message", message, request.sequenceNumber); - } - } + String getSessionId(); /** - * Forwards the application specific message to the page via the media router. - * @param message The message within the namespace that's being send by the receiver. - * @param namespace The application specific namespace this message belongs to. - * @param request The information about the client and the sequence number to respond with. + * @return The namespaces supported by the CastSession. */ - private void onAppMessage(String message, String namespace, RequestRecord request) { - try { - JSONObject jsonMessage = new JSONObject(); - jsonMessage.put("sessionId", mSessionId); - jsonMessage.put("namespaceName", namespace); - jsonMessage.put("message", message); - if (request != null) { - sendClientMessageTo(request.clientId, "app_message", - jsonMessage.toString(), request.sequenceNumber); - } else { - broadcastClientMessage("app_message", jsonMessage.toString()); - } - } catch (JSONException e) { - Log.e(TAG, "Failed to create the message wrapper", e); - } - } - - private boolean isMediaStatusMessage(String message) { - try { - JSONObject jsonMessage = new JSONObject(message); - return "MEDIA_STATUS".equals(jsonMessage.getString("type")); - } catch (JSONException e) { - return false; - } - } - - private void addNamespace(String namespace) { - assert !mNamespaces.contains(namespace); - - if (isApiClientInvalid()) return; - - // If application metadata is null, register the callback anyway. - if (mApplicationMetadata != null && !mApplicationMetadata.isNamespaceSupported(namespace)) { - return; - } - - try { - Cast.CastApi.setMessageReceivedCallbacks(mApiClient, namespace, mMessageChannel); - mNamespaces.add(namespace); - } catch (IOException e) { - Log.e(TAG, "Failed to register namespace listener for %s", namespace, e); - } - } - - private void unregisterNamespace(String namespace) { - assert mNamespaces.contains(namespace); - - if (isApiClientInvalid()) return; - - try { - Cast.CastApi.removeMessageReceivedCallbacks(mApiClient, namespace); - } catch (IOException e) { - Log.e(TAG, "Failed to remove the namespace listener for %s", namespace, e); - } - } - - public boolean handleSessionMessage( - JSONObject message, String messageType) throws JSONException { - if ("v2_message".equals(messageType)) { - return handleCastV2Message(message); - } else if ("app_message".equals(messageType)) { - return handleAppMessage(message); - } else { - Log.e(TAG, "Unsupported message: %s", message); - return false; - } - } - - // An example of the Cast V2 message: - // { - // "type": "v2_message", - // "message": { - // "type": "...", - // ... - // }, - // "sequenceNumber": 0, - // "timeoutMillis": 0, - // "clientId": "144042901280235697" - // } - private boolean handleCastV2Message(JSONObject jsonMessage) - throws JSONException { - assert "v2_message".equals(jsonMessage.getString("type")); - - String clientId = jsonMessage.getString("clientId"); - if (clientId == null || !mRouteProvider.getClients().contains(clientId)) return false; - - JSONObject jsonCastMessage = jsonMessage.getJSONObject("message"); - String messageType = jsonCastMessage.getString("type"); - int sequenceNumber = jsonMessage.optInt("sequenceNumber", INVALID_SEQUENCE_NUMBER); - - if ("STOP".equals(messageType)) { - handleStopMessage(clientId, sequenceNumber); - return true; - } - - if ("SET_VOLUME".equals(messageType)) { - return handleVolumeMessage( - jsonCastMessage.getJSONObject("volume"), clientId, sequenceNumber); - } - - if (Arrays.asList(MEDIA_MESSAGE_TYPES).contains(messageType)) { - if (sMediaOverloadedMessageTypes.containsKey(messageType)) { - messageType = sMediaOverloadedMessageTypes.get(messageType); - jsonCastMessage.put("type", messageType); - } - return sendJsonCastMessage(jsonCastMessage, MEDIA_NAMESPACE, clientId, sequenceNumber); - } - - return true; - } - - private void handleStopMessage(String clientId, int sequenceNumber) { - Queue<Integer> sequenceNumbersForClient = mStopRequests.get(clientId); - if (sequenceNumbersForClient == null) { - sequenceNumbersForClient = new ArrayDeque<Integer>(); - mStopRequests.put(clientId, sequenceNumbersForClient); - } - sequenceNumbersForClient.add(sequenceNumber); - - stopApplication(); - } - - // SET_VOLUME messages have a |level| and |muted| properties. One of them is - // |null| and the other one isn't. |muted| is expected to be a boolean while - // |level| is a float from 0.0 to 1.0. - // Example: - // { - // "volume" { - // "level": 0.9, - // "muted": null - // } - // } - private boolean handleVolumeMessage( - JSONObject volume, final String clientId, final int sequenceNumber) - throws JSONException { - if (volume == null) return false; - - if (isApiClientInvalid()) return false; - - boolean waitForVolumeChange = false; - try { - if (!volume.isNull("muted")) { - boolean newMuted = volume.getBoolean("muted"); - if (Cast.CastApi.isMute(mApiClient) != newMuted) { - Cast.CastApi.setMute(mApiClient, newMuted); - waitForVolumeChange = true; - } - } - if (!volume.isNull("level")) { - double newLevel = volume.getDouble("level"); - double currentLevel = Cast.CastApi.getVolume(mApiClient); - if (!Double.isNaN(currentLevel) - && Math.abs(currentLevel - newLevel) > MIN_VOLUME_LEVEL_DELTA) { - Cast.CastApi.setVolume(mApiClient, newLevel); - waitForVolumeChange = true; - } - } - } catch (IOException e) { - Log.e(TAG, "Failed to send volume command: " + e); - return false; - } - - // For each successful volume message we need to respond with an empty "v2_message" so the - // Cast Web SDK can call the success callback of the page. - // If we expect the volume to change as the result of the command, we're relying on - // {@link Cast.CastListener#onVolumeChanged} to get called by the Android Cast SDK when the - // receiver status is updated. We keep the sequence number until then. - // If the volume doesn't change as the result of the command, we won't get notified by the - // Android SDK when the status update is received so we respond to the volume message - // immediately. - if (waitForVolumeChange) { - mVolumeRequests.add(new RequestRecord(clientId, sequenceNumber)); - } else { - // It's usually bad to have request and response on the same call stack so post the - // response to the Android message loop. - mHandler.post(new Runnable() { - @Override - public void run() { - sendClientMessageTo(clientId, "v2_message", null, sequenceNumber); - } - }); - } - - return true; - } - - // An example of the Cast application message: - // { - // "type":"app_message", - // "message": { - // "sessionId":"...", - // "namespaceName":"...", - // "message": ... - // }, - // "sequenceNumber":0, - // "timeoutMillis":3000, - // "clientId":"14417311915272175" - // } - private boolean handleAppMessage(JSONObject jsonMessage) throws JSONException { - assert "app_message".equals(jsonMessage.getString("type")); - - String clientId = jsonMessage.getString("clientId"); - if (clientId == null || !mRouteProvider.getClients().contains(clientId)) return false; - - JSONObject jsonAppMessageWrapper = jsonMessage.getJSONObject("message"); - - if (!mSessionId.equals(jsonAppMessageWrapper.getString("sessionId"))) return false; - - String namespaceName = jsonAppMessageWrapper.getString("namespaceName"); - if (namespaceName == null || namespaceName.isEmpty()) return false; - - if (!mNamespaces.contains(namespaceName)) return false; - - int sequenceNumber = jsonMessage.optInt("sequenceNumber", INVALID_SEQUENCE_NUMBER); - - Object actualMessageObject = jsonAppMessageWrapper.get("message"); - if (actualMessageObject == null) return false; - - if (actualMessageObject instanceof String) { - String actualMessage = jsonAppMessageWrapper.getString("message"); - return sendStringCastMessage(actualMessage, namespaceName, clientId, sequenceNumber); - } - - JSONObject actualMessage = jsonAppMessageWrapper.getJSONObject("message"); - return sendJsonCastMessage(actualMessage, namespaceName, clientId, sequenceNumber); - } - - private boolean sendJsonCastMessage( - JSONObject message, - final String namespace, - final String clientId, - final int sequenceNumber) throws JSONException { - if (isApiClientInvalid()) return false; - - removeNullFields(message); - - // Map the request id to a valid sequence number only. - if (sequenceNumber != INVALID_SEQUENCE_NUMBER) { - // If for some reason, there is already a requestId other than 0, it - // is kept. Otherwise, one is generated. In all cases it's associated with the - // sequenceNumber passed by the client. - int requestId = message.optInt("requestId", 0); - if (requestId == 0) { - requestId = CastRequestIdGenerator.getNextRequestId(); - message.put("requestId", requestId); - } - mRequests.append(requestId, new RequestRecord(clientId, sequenceNumber)); - } - - return sendStringCastMessage(message.toString(), namespace, clientId, sequenceNumber); - } - - private boolean sendStringCastMessage( - final String message, - final String namespace, - final String clientId, - final int sequenceNumber) { - Log.d(TAG, "Sending message to Cast device in namespace %s: %s", namespace, message); - - try { - Cast.CastApi.sendMessage(mApiClient, namespace, message) - .setResultCallback( - new ResultCallback<Status>() { - @Override - public void onResult(Status result) { - if (!result.isSuccess()) { - // TODO(avayvod): should actually report back to the page. - // See https://crbug.com/550445. - Log.e(TAG, "Failed to send the message: " + result); - return; - } - - // Media commands wait for the media status update as a result. - if (MEDIA_NAMESPACE.equals(namespace)) return; - - // App messages wait for the empty message with the sequence - // number. - sendClientMessageTo( - clientId, "app_message", null, sequenceNumber); - } - }); - } catch (Exception e) { - Log.e(TAG, "Exception while sending message", e); - return false; - } - return true; - } + Set<String> getNamespaces(); /** - * Modifies the received MediaStatus message to match the format expected by the client. + * @return The message handler of the CastSession. */ - private void sanitizeMediaStatusMessage(JSONObject object) throws JSONException { - object.put("sessionId", mSessionId); + CastMessageHandler getMessageHandler(); - JSONArray mediaStatus = object.getJSONArray("status"); - for (int i = 0; i < mediaStatus.length(); ++i) { - JSONObject status = mediaStatus.getJSONObject(i); - status.put("sessionId", mSessionId); - if (!status.has("supportedMediaCommands")) continue; + /** + * @return The session information. + */ + CastSessionInfo getSessionInfo(); - JSONArray commands = new JSONArray(); - int bitfieldCommands = status.getInt("supportedMediaCommands"); - for (int j = 0; j < 4; ++j) { - if ((bitfieldCommands & (1 << j)) != 0) { - commands.put(MEDIA_SUPPORTED_COMMANDS[j]); - } - } + /** + * Sends the string message to the Cast device through the Cast SDK. + * @param message The message to send. + * @param namespace The namespace of the message. + * @param clientId The id of the client sending the message. + * @param sequenceNumber The sequence number of the message, which is used for matching + * responses to requests. + */ + boolean sendStringCastMessage( + String message, String namespace, String clientId, int sequenceNumber); - status.put("supportedMediaCommands", commands); // Removes current entry. - } - } + /** + * Handles SET_VOLUME messages, and sets the volume of the Cast device through the Cast SDK. + * @param volume A JSONObject containing the volume information. + * Example: + * { + * "volume" { + * "level": 0.9, + * "muted": null + * } + * } + * @param clientId The id of the client sending the message. + * @param sequenceNumber The sequence number of the message, which is used for matching + * responses to requests. + */ + HandleVolumeMessageResult handleVolumeMessage( + JSONObject volume, String clientId, int sequenceNumber) + throws JSONException; - private String buildInternalMessage( - String type, String message, String clientId, int sequenceNumber) { - JSONObject json = new JSONObject(); - try { - json.put("type", type); - json.put("sequenceNumber", sequenceNumber); - json.put("timeoutMillis", 0); - json.put("clientId", clientId); + /** + * Stops the application. The methods tells the Cast SDK to stop the application and on + * response, it will notify all the clients through the message ahndler. + */ + void stopApplication(); - // TODO(mlamouri): we should have a more reliable way to handle string, null and Object - // messages. - if (message == null - || "remove_session".equals(type) - || "disconnect_session".equals(type)) { - json.put("message", message); - } else { - JSONObject jsonMessage = new JSONObject(message); - if ("v2_message".equals(type) - && "MEDIA_STATUS".equals(jsonMessage.getString("type"))) { - sanitizeMediaStatusMessage(jsonMessage); - } - json.put("message", jsonMessage); - } - } catch (JSONException e) { - Log.e(TAG, "Failed to build the reply: " + e); - } + /** + * Perform proper actions when a client is connected to the session. + */ + void onClientConnected(String clientId); - return json.toString(); - } + /** + * When a media message is received from the Cast device, forwards the message to the + * MediaPlayer. + * @param message The media message received from the Cast device. + */ + void onMediaMessage(String message); - public void updateSessionStatus() { - if (isApiClientInvalid()) return; + /** + * Perform proper actions when the Cast device volume has changed. + */ + void onVolumeChanged(); - try { - mApplicationStatus = Cast.CastApi.getApplicationStatus(mApiClient); - mApplicationMetadata = Cast.CastApi.getApplicationMetadata(mApiClient); - - updateNamespaces(); - - broadcastClientMessage("update_session", buildSessionMessage()); - } catch (IllegalStateException e) { - Log.e(TAG, "Can't get application status", e); - } - } - - public void onVolumeChanged() { - updateSessionStatus(); - - if (mVolumeRequests.isEmpty()) return; - - for (RequestRecord r : mVolumeRequests) { - sendClientMessageTo(r.clientId, "v2_message", null, r.sequenceNumber); - } - mVolumeRequests.clear(); - } - - private String buildSessionMessage() { - if (isApiClientInvalid()) return "{}"; - - try { - // "volume" is a part of "receiver" initialized below. - JSONObject jsonVolume = new JSONObject(); - jsonVolume.put("level", Cast.CastApi.getVolume(mApiClient)); - jsonVolume.put("muted", Cast.CastApi.isMute(mApiClient)); - - // "receiver" is a part of "message" initialized below. - JSONObject jsonReceiver = new JSONObject(); - jsonReceiver.put("label", mCastDevice.getDeviceId()); - jsonReceiver.put("friendlyName", mCastDevice.getFriendlyName()); - jsonReceiver.put("capabilities", getCapabilities(mCastDevice)); - jsonReceiver.put("volume", jsonVolume); - jsonReceiver.put("isActiveInput", Cast.CastApi.getActiveInputState(mApiClient)); - jsonReceiver.put("displayStatus", null); - jsonReceiver.put("receiverType", "cast"); - - JSONObject jsonMessage = new JSONObject(); - jsonMessage.put("sessionId", mSessionId); - jsonMessage.put("statusText", mApplicationStatus); - jsonMessage.put("receiver", jsonReceiver); - jsonMessage.put("namespaces", extractNamespaces()); - jsonMessage.put("media", new JSONArray()); - jsonMessage.put("status", "connected"); - jsonMessage.put("transportId", "web-4"); - - if (mApplicationMetadata != null) { - jsonMessage.put("appId", mApplicationMetadata.getApplicationId()); - jsonMessage.put("displayName", mApplicationMetadata.getName()); - } else { - jsonMessage.put("appId", mSource.getApplicationId()); - jsonMessage.put("displayName", mCastDevice.getFriendlyName()); - } - - return jsonMessage.toString(); - } catch (JSONException e) { - Log.w(TAG, "Building session message failed", e); - return "{}"; - } - } - - private void broadcastClientMessage(String type, String message) { - for (String clientId : mRouteProvider.getClients()) { - sendClientMessageTo(clientId, type, message, INVALID_SEQUENCE_NUMBER); - } - } - - private void sendClientMessageTo( - String clientId, String type, String message, int sequenceNumber) { - mRouteProvider.onMessage(clientId, - buildInternalMessage(type, message, clientId, sequenceNumber)); - } - - static JSONArray getCapabilities(CastDevice device) { - JSONArray jsonCapabilities = new JSONArray(); - if (device.hasCapability(CastDevice.CAPABILITY_AUDIO_IN)) { - jsonCapabilities.put("audio_in"); - } - if (device.hasCapability(CastDevice.CAPABILITY_AUDIO_OUT)) { - jsonCapabilities.put("audio_out"); - } - if (device.hasCapability(CastDevice.CAPABILITY_VIDEO_IN)) { - jsonCapabilities.put("video_in"); - } - if (device.hasCapability(CastDevice.CAPABILITY_VIDEO_OUT)) { - jsonCapabilities.put("video_out"); - } - return jsonCapabilities; - } - - private JSONArray extractNamespaces() throws JSONException { - JSONArray jsonNamespaces = new JSONArray(); - for (String namespace : mNamespaces) { - JSONObject jsonNamespace = new JSONObject(); - jsonNamespace.put("name", namespace); - jsonNamespaces.put(jsonNamespace); - } - return jsonNamespaces; - } - - private void updateNamespaces() { - if (mApplicationMetadata == null) return; - - List<String> newNamespaces = mApplicationMetadata.getSupportedNamespaces(); - - Set<String> toRemove = new HashSet<String>(mNamespaces); - toRemove.removeAll(newNamespaces); - for (String namespaceToRemove : toRemove) unregisterNamespace(namespaceToRemove); - - for (String newNamespace : newNamespaces) { - if (!mNamespaces.contains(newNamespace)) addNamespace(newNamespace); - } - } - - private boolean isApiClientInvalid() { - return mApiClient == null || (!mApiClient.isConnected() && !mApiClient.isConnecting()); - } + /** + * Updates the session info when it changes and broadcast the change. + */ + void updateSessionStatus(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSessionImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSessionImpl.java new file mode 100644 index 0000000..47cdc4d --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSessionImpl.java
@@ -0,0 +1,467 @@ +// 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.media.router.cast; + +import android.content.Context; + +import com.google.android.gms.cast.ApplicationMetadata; +import com.google.android.gms.cast.Cast; +import com.google.android.gms.cast.CastDevice; +import com.google.android.gms.cast.MediaStatus; +import com.google.android.gms.cast.RemoteMediaPlayer; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.ResultCallback; +import com.google.android.gms.common.api.Status; + +import org.chromium.base.ApplicationStatus; +import org.chromium.base.Log; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.media.ui.MediaNotificationInfo; +import org.chromium.chrome.browser.media.ui.MediaNotificationListener; +import org.chromium.chrome.browser.media.ui.MediaNotificationManager; +import org.chromium.chrome.browser.tab.Tab; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * A wrapper around the established Cast application session. + */ +public class CastSessionImpl implements MediaNotificationListener, CastSession { + private static final String TAG = "MediaRouter"; + + // The value is borrowed from the Android Cast SDK code to match their behavior. + private static final double MIN_VOLUME_LEVEL_DELTA = 1e-7; + + private static class CastMessagingChannel implements Cast.MessageReceivedCallback { + private final CastSession mSession; + + public CastMessagingChannel(CastSessionImpl session) { + mSession = session; + } + + @Override + public void onMessageReceived(CastDevice castDevice, String namespace, String message) { + Log.d(TAG, "Received message from Cast device: namespace=\"" + namespace + + "\" message=\"" + message + "\""); + mSession.getMessageHandler().onMessageReceived(namespace, message); + } + } + + private final CastMessagingChannel mMessageChannel; + private final CastDevice mCastDevice; + private final MediaSource mSource; + private final CastMessageHandler mMessageHandler; + private final CastMediaRouteProvider mRouteProvider; + + private GoogleApiClient mApiClient; + private String mSessionId; + private String mApplicationStatus; + private ApplicationMetadata mApplicationMetadata; + private boolean mStoppingApplication; + private MediaNotificationInfo.Builder mNotificationBuilder; + private RemoteMediaPlayer mMediaPlayer; + + private Set<String> mNamespaces = new HashSet<String>(); + + /** + * Initializes a new {@link CastSessionImpl} instance. + * @param apiClient The Google Play Services client used to create the session. + * @param sessionId The session identifier to use with the Cast SDK. + * @param origin The origin of the frame requesting the route. + * @param tabId the id of the tab containing the frame requesting the route. + * @param source The {@link MediaSource} corresponding to this session. + * @param routeProvider The {@link CastMediaRouteProvider} instance managing this session. + */ + public CastSessionImpl( + GoogleApiClient apiClient, + String sessionId, + ApplicationMetadata metadata, + String applicationStatus, + CastDevice castDevice, + String origin, + int tabId, + MediaSource source, + CastMediaRouteProvider routeProvider) { + mSessionId = sessionId; + mRouteProvider = routeProvider; + mApiClient = apiClient; + mSource = source; + mApplicationMetadata = metadata; + mApplicationStatus = applicationStatus; + mCastDevice = castDevice; + mMessageHandler = mRouteProvider.getMessageHandler(); + mMessageChannel = new CastMessagingChannel(this); + updateNamespaces(); + + final Context context = ApplicationStatus.getApplicationContext(); + + if (mNamespaces.contains(CastMessageHandler.MEDIA_NAMESPACE)) { + mMediaPlayer = new RemoteMediaPlayer(); + mMediaPlayer.setOnStatusUpdatedListener( + new RemoteMediaPlayer.OnStatusUpdatedListener() { + @Override + public void onStatusUpdated() { + MediaStatus mediaStatus = mMediaPlayer.getMediaStatus(); + if (mediaStatus == null) return; + + int playerState = mediaStatus.getPlayerState(); + if (playerState == MediaStatus.PLAYER_STATE_PAUSED + || playerState == MediaStatus.PLAYER_STATE_PLAYING) { + mNotificationBuilder.setPaused( + playerState != MediaStatus.PLAYER_STATE_PLAYING); + mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP + | MediaNotificationInfo.ACTION_PLAY_PAUSE); + } else { + mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP); + } + MediaNotificationManager.show(context, mNotificationBuilder.build()); + } + }); + } + + mNotificationBuilder = new MediaNotificationInfo.Builder() + .setTitle(mCastDevice.getFriendlyName()) + .setPaused(false) + .setOrigin(origin) + // TODO(avayvod): the same session might have more than one tab id. Should we track + // the last foreground alive tab and update the notification with it? + .setTabId(tabId) + // TODO(avayvod): pass true here if initiated from the incognito mode. + // MediaRouter is disabled for Incognito mode for now, see https://crbug.com/525215 + .setPrivate(false) + .setIcon(R.drawable.ic_notification_media_route) + .setActions(MediaNotificationInfo.ACTION_STOP) + .setContentIntent(Tab.createBringTabToFrontIntent(tabId)) + .setId(R.id.presentation_notification) + .setListener(this); + MediaNotificationManager.show(context, mNotificationBuilder.build()); + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + // MediaNotificationListener implementation. + + @Override + public void onPlay(int actionSource) { + if (mMediaPlayer == null || isApiClientInvalid()) return; + + mMediaPlayer.play(mApiClient); + } + + @Override + public void onPause(int actionSource) { + if (mMediaPlayer == null || isApiClientInvalid()) return; + + mMediaPlayer.pause(mApiClient); + } + + @Override + public void onStop(int actionSource) { + stopApplication(); + mRouteProvider.onSessionStopAction(); + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Utility functions. + + /** + * @param device The {@link CastDevice} queried for it's capabilities. + * @return The capabilities of the Cast device. + * TODO(zqzhang): move to a CastUtils class? + */ + protected static List<String> getCapabilities(CastDevice device) { + List<String> capabilities = new ArrayList<String>(); + if (device.hasCapability(CastDevice.CAPABILITY_AUDIO_IN)) { + capabilities.add("audio_in"); + } + if (device.hasCapability(CastDevice.CAPABILITY_AUDIO_OUT)) { + capabilities.add("audio_out"); + } + if (device.hasCapability(CastDevice.CAPABILITY_VIDEO_IN)) { + capabilities.add("video_in"); + } + if (device.hasCapability(CastDevice.CAPABILITY_VIDEO_OUT)) { + capabilities.add("video_out"); + } + return capabilities; + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Namespace handling. + + private void updateNamespaces() { + if (mApplicationMetadata == null) return; + + List<String> newNamespaces = mApplicationMetadata.getSupportedNamespaces(); + + Set<String> toRemove = new HashSet<String>(mNamespaces); + toRemove.removeAll(newNamespaces); + for (String namespaceToRemove : toRemove) unregisterNamespace(namespaceToRemove); + + for (String newNamespace : newNamespaces) { + if (!mNamespaces.contains(newNamespace)) addNamespace(newNamespace); + } + } + + private void addNamespace(String namespace) { + assert !mNamespaces.contains(namespace); + + if (isApiClientInvalid()) return; + + // If application metadata is null, register the callback anyway. + if (mApplicationMetadata != null && !mApplicationMetadata.isNamespaceSupported(namespace)) { + return; + } + + try { + Cast.CastApi.setMessageReceivedCallbacks(mApiClient, namespace, mMessageChannel); + mNamespaces.add(namespace); + } catch (IOException e) { + Log.e(TAG, "Failed to register namespace listener for %s", namespace, e); + } + } + + private void unregisterNamespace(String namespace) { + assert mNamespaces.contains(namespace); + + if (isApiClientInvalid()) return; + + try { + Cast.CastApi.removeMessageReceivedCallbacks(mApiClient, namespace); + mNamespaces.remove(namespace); + } catch (IOException e) { + Log.e(TAG, "Failed to remove the namespace listener for %s", namespace, e); + } + } + + ///////////////////////////////////////////////////////////////////////////////////////////// + // CastSession implementations. + + @Override + public boolean isApiClientInvalid() { + return mApiClient == null || (!mApiClient.isConnected() && !mApiClient.isConnecting()); + } + + @Override + public String getSourceId() { + return mSource.getUrn(); + } + + @Override + public String getSinkId() { + return mCastDevice.getDeviceId(); + } + + @Override + public String getSessionId() { + return mSessionId; + } + + @Override + public Set<String> getNamespaces() { + return mNamespaces; + } + + @Override + public CastMessageHandler getMessageHandler() { + return mMessageHandler; + } + + @Override + public CastSessionInfo getSessionInfo() { + if (isApiClientInvalid()) return null; + + CastSessionInfo.VolumeInfo.Builder volumeBuilder = + new CastSessionInfo.VolumeInfo.Builder() + .setLevel(Cast.CastApi.getVolume(mApiClient)) + .setMuted(Cast.CastApi.isMute(mApiClient)); + + CastSessionInfo.ReceiverInfo.Builder receiverBuilder = + new CastSessionInfo.ReceiverInfo.Builder() + .setLabel(mCastDevice.getDeviceId()) + .setFriendlyName(mCastDevice.getFriendlyName()) + .setVolume(volumeBuilder.build()) + .setIsActiveInput(Cast.CastApi.getActiveInputState(mApiClient)) + .setDisplayStatus(null) + .setReceiverType("cast") + .addCapabilities(getCapabilities(mCastDevice)); + + CastSessionInfo.Builder sessionInfoBuilder = + new CastSessionInfo.Builder() + .setSessionId(mSessionId) + .setStatusText(mApplicationStatus) + .setReceiver(receiverBuilder.build()) + .setStatus("connected") + .setTransportId("web-4") + .addNamespaces(mNamespaces); + + if (mApplicationMetadata != null) { + sessionInfoBuilder.setAppId(mApplicationMetadata.getApplicationId()) + .setDisplayName(mApplicationMetadata.getName()); + } else { + sessionInfoBuilder.setAppId(mSource.getApplicationId()) + .setDisplayName(mCastDevice.getFriendlyName()); + } + + return sessionInfoBuilder.build(); + } + + @Override + public boolean sendStringCastMessage( + final String message, + final String namespace, + final String clientId, + final int sequenceNumber) { + if (isApiClientInvalid()) return false; + Log.d(TAG, "Sending message to Cast device in namespace %s: %s", namespace, message); + + try { + Cast.CastApi.sendMessage(mApiClient, namespace, message) + .setResultCallback( + new ResultCallback<Status>() { + @Override + public void onResult(Status result) { + if (!result.isSuccess()) { + // TODO(avayvod): should actually report back to the page. + // See https://crbug.com/550445. + Log.e(TAG, "Failed to send the message: " + result); + return; + } + + // Media commands wait for the media status update as a result. + if (CastMessageHandler.MEDIA_NAMESPACE + .equals(namespace)) return; + + // App messages wait for the empty message with the sequence + // number. + mMessageHandler.onAppMessageSent(clientId, sequenceNumber); + } + }); + } catch (Exception e) { + Log.e(TAG, "Exception while sending message", e); + return false; + } + return true; + } + + // SET_VOLUME messages have a |level| and |muted| properties. One of them is + // |null| and the other one isn't. |muted| is expected to be a boolean while + // |level| is a float from 0.0 to 1.0. + // Example: + // { + // "volume" { + // "level": 0.9, + // "muted": null + // } + // } + @Override + public HandleVolumeMessageResult handleVolumeMessage( + JSONObject volume, final String clientId, final int sequenceNumber) + throws JSONException { + if (volume == null) return new HandleVolumeMessageResult(false, false); + + if (isApiClientInvalid()) return new HandleVolumeMessageResult(false, false); + + boolean waitForVolumeChange = false; + try { + if (!volume.isNull("muted")) { + boolean newMuted = volume.getBoolean("muted"); + if (Cast.CastApi.isMute(mApiClient) != newMuted) { + Cast.CastApi.setMute(mApiClient, newMuted); + waitForVolumeChange = true; + } + } + if (!volume.isNull("level")) { + double newLevel = volume.getDouble("level"); + double currentLevel = Cast.CastApi.getVolume(mApiClient); + if (!Double.isNaN(currentLevel) + && Math.abs(currentLevel - newLevel) > MIN_VOLUME_LEVEL_DELTA) { + Cast.CastApi.setVolume(mApiClient, newLevel); + waitForVolumeChange = true; + } + } + } catch (IOException e) { + Log.e(TAG, "Failed to send volume command: " + e); + return new HandleVolumeMessageResult(false, false); + } + + return new HandleVolumeMessageResult(true, waitForVolumeChange); + } + + @Override + public void stopApplication() { + if (mStoppingApplication) return; + + if (isApiClientInvalid()) return; + + mStoppingApplication = true; + Cast.CastApi.stopApplication(mApiClient, mSessionId) + .setResultCallback(new ResultCallback<Status>() { + @Override + public void onResult(Status status) { + mMessageHandler.onApplicationStopped(); + // TODO(avayvod): handle a failure to stop the application. + // https://crbug.com/535577 + + Set<String> namespaces = new HashSet<String>(mNamespaces); + for (String namespace : namespaces) unregisterNamespace(namespace); + mNamespaces.clear(); + + mSessionId = null; + mApiClient = null; + + mRouteProvider.onSessionClosed(); + mStoppingApplication = false; + + MediaNotificationManager.clear(R.id.presentation_notification); + } + }); + } + + @Override + public void onMediaMessage(String message) { + if (mMediaPlayer != null) { + mMediaPlayer.onMessageReceived( + mCastDevice, CastMessageHandler.MEDIA_NAMESPACE, message); + } + } + + @Override + public void onVolumeChanged() { + mMessageHandler.onVolumeChanged(); + } + + @Override + public void updateSessionStatus() { + if (isApiClientInvalid()) return; + + try { + mApplicationStatus = Cast.CastApi.getApplicationStatus(mApiClient); + mApplicationMetadata = Cast.CastApi.getApplicationMetadata(mApiClient); + + updateNamespaces(); + + mMessageHandler.broadcastClientMessage( + "update_session", mMessageHandler.buildSessionMessage()); + } catch (IllegalStateException e) { + Log.e(TAG, "Can't get application status", e); + } + } + + @Override + public void onClientConnected(String clientId) { + mMessageHandler.sendClientMessageTo( + clientId, "new_session", mMessageHandler.buildSessionMessage(), + CastMessageHandler.INVALID_SEQUENCE_NUMBER); + + if (mMediaPlayer != null && !isApiClientInvalid()) mMediaPlayer.requestStatus(mApiClient); + } + +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSessionInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSessionInfo.java new file mode 100644 index 0000000..1093caa4 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CastSessionInfo.java
@@ -0,0 +1,324 @@ +// 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. + +package org.chromium.chrome.browser.media.router.cast; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * The metadata information of {@link CastSession}. + */ +public class CastSessionInfo { + /** + * The volume information of receivers. + */ + public static class VolumeInfo { + /** + * The receiver volume. + */ + public final double level; + /** + * Whether the receiver is muted. + */ + public final boolean muted; + + /** + * Use this class to construct an instance of {@link VolumeInfo}. + */ + public static class Builder { + private double mLevel = 0; + private boolean mMuted = false; + + public Builder setLevel(double level) { + mLevel = level; + return this; + } + + public Builder setMuted(boolean muted) { + mMuted = muted; + return this; + } + + /** + * Initializes the builder with the default values. + */ + public Builder() { + } + + public VolumeInfo build() { + return new VolumeInfo(mLevel, mMuted); + } + } + + private VolumeInfo(double level, boolean muted) { + this.level = level; + this.muted = muted; + } + } + + /** + * The receiver information. + */ + public static class ReceiverInfo { + /** + * Label of the receiver. + */ + public final String label; + /** + * The friendly name of the receiver. + */ + public final String friendlyName; + /** + * Receiver capabilities. + */ + public final List<String> capabilities; + /** + * Receiver volume information. + */ + public final VolumeInfo volume; + /** + * The receiver device's active-input state. + */ + public final int isActiveInput; + /** + * The display status of the receiver. + */ + public final String displayStatus; + /** + * The type of the receiver. + */ + public final String receiverType; + + /** + * Use this class to create an instance of {@link ReceiverInfo}. + */ + public static class Builder { + private String mLabel = ""; + private String mFriendlyName = ""; + private List<String> mCapabilities = new ArrayList<String>(); + private VolumeInfo mVolume = null; + private int mIsActiveInput = 0; + private String mDisplayStatus = ""; + private String mReceiverType = ""; + + public Builder setLabel(String label) { + mLabel = label; + return this; + } + + public Builder setFriendlyName(String friendlyName) { + mFriendlyName = friendlyName; + return this; + } + + public Builder addCapability(String capability) { + mCapabilities.add(capability); + return this; + } + + public Builder addCapabilities(Collection<String> capabilities) { + mCapabilities.addAll(capabilities); + return this; + } + + public Builder setVolume(VolumeInfo volume) { + mVolume = volume; + return this; + } + + public Builder setIsActiveInput(int isActiveInput) { + mIsActiveInput = isActiveInput; + return this; + } + + public Builder setDisplayStatus(String displayStatus) { + mDisplayStatus = displayStatus; + return this; + } + + public Builder setReceiverType(String receiverType) { + mReceiverType = receiverType; + return this; + } + + /** + * Initializes the builder with the default values. + */ + public Builder() { + } + + public ReceiverInfo build() { + return new ReceiverInfo( + mLabel, + mFriendlyName, + mCapabilities, + mVolume, + mIsActiveInput, + mDisplayStatus, + mReceiverType); + } + } + + private ReceiverInfo( + String label, + String friendlyName, + List<String> capabilities, + VolumeInfo volume, + int isActiveInput, + String displayStatus, + String receiverType) { + this.label = label; + this.friendlyName = friendlyName; + this.capabilities = capabilities; + this.volume = volume; + this.isActiveInput = isActiveInput; + this.displayStatus = displayStatus; + this.receiverType = receiverType; + } + } + + /** + * The id of the {@link CastSession}. + */ + public final String sessionId; + /** + * The application status (in Cast SDK) of the {@link CastSession}. + */ + public final String statusText; + /** + * The receiver information of the {@link CastSession}. + */ + public final ReceiverInfo receiver; + /** + * The namespaces registered in the {@link CastSession}. + */ + public final List<String> namespaces; + /** + * The media in the {@link CastSession}. + */ + public final List<String> media; + /** + * The status of the {@link CastSession}. + */ + public final String status; + /** + * The tranport id of the {@link CastSession}. + */ + public final String transportId; + /** + * The app id of the {@link CastSession}. + */ + public final String appId; + /** + * The display name of the {@link CastSession}. + */ + public final String displayName; + + /** + * Use this class to create an instance of {@link CastSessionInfo}. + */ + public static class Builder { + private String mSessionId = ""; + private String mStatusText = ""; + private ReceiverInfo mReceiver = null; + private List<String> mNamespaces = new ArrayList<String>(); + private List<String> mMedia = new ArrayList<String>(); + private String mStatus = ""; + private String mTransportId = ""; + private String mAppId = ""; + private String mDisplayName = ""; + + public Builder setSessionId(String sessionId) { + mSessionId = sessionId; + return this; + } + + public Builder setStatusText(String statusText) { + mStatusText = statusText; + return this; + } + + public Builder setReceiver(ReceiverInfo receiver) { + mReceiver = receiver; + return this; + } + + public Builder addNamespace(String namespace) { + mNamespaces.add(namespace); + return this; + } + + public Builder addNamespaces(Collection<String> namespaces) { + mNamespaces.addAll(namespaces); + return this; + } + + public Builder addMedia(String namespace) { + mMedia.add(namespace); + return this; + } + + public Builder setStatus(String status) { + mStatus = status; + return this; + } + + public Builder setTransportId(String transportId) { + mTransportId = transportId; + return this; + } + + public Builder setAppId(String appId) { + mAppId = appId; + return this; + } + + public Builder setDisplayName(String displayName) { + mDisplayName = displayName; + return this; + } + + /** + * Initializes the builder with the default values. + */ + public Builder() { + } + + public CastSessionInfo build() { + return new CastSessionInfo( + mSessionId, + mStatusText, + mReceiver, + mNamespaces, + mMedia, + mStatus, + mTransportId, + mAppId, + mDisplayName); + } + } + + private CastSessionInfo( + String sessionId, + String statusText, + ReceiverInfo receiver, + List<String> namespaces, + List<String> media, + String status, + String transportId, + String appId, + String displayName) { + this.sessionId = sessionId; + this.statusText = statusText; + this.receiver = receiver; + this.namespaces = namespaces; + this.media = media; + this.status = status; + this.transportId = transportId; + this.appId = appId; + this.displayName = displayName; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java index 4a201340..b901604 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java
@@ -258,7 +258,7 @@ private void reportSuccess(Cast.ApplicationConnectionResult result) { if (mState != STATE_LAUNCH_SUCCEEDED) throwInvalidState(); - CastSession session = new CastSession( + CastSession session = new CastSessionImpl( mApiClient, result.getSessionId(), result.getApplicationMetadata(),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationInfo.java index ad1a7b2..4269336e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationInfo.java
@@ -64,7 +64,6 @@ assert mTitle != null; assert mOrigin != null; assert mListener != null; - assert mContentIntent != null; return new MediaNotificationInfo( mTitle,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/ActivityStopMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/ActivityStopMetrics.java index 5a3c2df..cb6cdff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/ActivityStopMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/ActivityStopMetrics.java
@@ -69,7 +69,8 @@ */ public void onStopWithNative(Activity parent) { if (mStopReason == STOP_REASON_COUNT) { - if (parent != ApplicationStatus.getLastTrackedFocusedActivity()) { + if (parent != ApplicationStatus.getLastTrackedFocusedActivity() + && ApplicationStatus.hasVisibleActivities()) { mStopReason = STOP_REASON_OTHER_CHROME_ACTIVITY_IN_FOREGROUND; } else { mStopReason = STOP_REASON_UNKNOWN;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPromoView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPromoView.java index f84cdee..6e1c5a8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPromoView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPromoView.java
@@ -8,6 +8,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.app.Activity; +import android.app.FragmentManager; import android.graphics.Color; import android.view.Gravity; import android.view.LayoutInflater; @@ -16,9 +17,9 @@ import android.widget.TextView; import org.chromium.chrome.R; -import org.chromium.chrome.browser.firstrun.AccountFirstRunView; import org.chromium.chrome.browser.firstrun.ProfileDataCache; import org.chromium.chrome.browser.signin.AccountAdder; +import org.chromium.chrome.browser.signin.AccountSigninView; import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.sync.AndroidSyncSettings.AndroidSyncSettingsObserver; @@ -176,7 +177,7 @@ } if (animate && mPromoType == PROMO_TYPE_SIGN_IN) { - ((AccountFirstRunView) mPromo).switchToSignedMode(); + ((AccountSigninView) mPromo).switchToSignedMode(); } final View oldPromo = mPromo; @@ -249,15 +250,13 @@ } private View createSignInPromoView() { - AccountFirstRunView signInPromoView = (AccountFirstRunView) - LayoutInflater.from(getContext()).inflate(R.layout.fre_choose_account, this, false); + AccountSigninView signInPromoView = (AccountSigninView) LayoutInflater.from(getContext()) + .inflate(R.layout.account_signin_view, this, false); signInPromoView.init(mModel.getProfileDataCache()); signInPromoView.getLayoutParams().height = LayoutParams.WRAP_CONTENT; ((FrameLayout.LayoutParams) signInPromoView.getLayoutParams()).gravity = Gravity.CENTER; signInPromoView.configureForRecentTabsOrBookmarksPage(); - signInPromoView.setListener(new AccountFirstRunView.Listener() { - private String mAccountName; - + signInPromoView.setListener(new AccountSigninView.Listener() { @Override public void onAccountSelectionCanceled() { assert mUserActionListener != null; @@ -272,19 +271,11 @@ } @Override - public void onAccountSelected(String accountName) { - mAccountName = accountName; - } + public void onAccountSelected(String accountName, boolean settingsClicked) { + assert !settingsClicked : "Settings should be hidden in RecentTabsPromoView."; - @Override - public void onDoneClicked() { if (mUserActionListener != null) mUserActionListener.onAccountSelectionConfirmed(); - SigninManager.get(mActivity).signIn(mAccountName, mActivity, null); - } - - @Override - public void onSettingsClicked() { - assert false : "Button should be hidden"; + SigninManager.get(mActivity).signIn(accountName, mActivity, null); } @Override @@ -293,6 +284,12 @@ assert false : "No forced accounts in SignInPromoView"; } }); + signInPromoView.setDelegate(new AccountSigninView.Delegate() { + @Override + public FragmentManager getFragmentManager() { + return mActivity.getFragmentManager(); + } + }); SigninManager.logSigninStartAccessPoint(mModel.getAccessPoint()); return signInPromoView; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java index 6afa1e0..a301e552 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java
@@ -600,9 +600,7 @@ RecordUserAction.record("Signin_Signin_FromRecentTabs"); } @Override - public void onNewAccount() { - RecordUserAction.record("Signin_AddAccountToDevice"); - } + public void onNewAccount() {} @Override public void onAccountSelectionCancelled() { mRecentTabsManager.setSigninPromoDeclined();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java index c9017d3..2e655d14 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
@@ -4,37 +4,26 @@ package org.chromium.chrome.browser.preferences; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; -import org.chromium.base.Callback; -import org.chromium.base.VisibleForTesting; -import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.PasswordUIView; import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.partnercustomizations.HomepageManager; import org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferences; -import org.chromium.chrome.browser.signin.AccountAdder; -import org.chromium.chrome.browser.signin.AddGoogleAccountDialogFragment; -import org.chromium.chrome.browser.signin.AddGoogleAccountDialogFragment.AddGoogleAccountListener; +import org.chromium.chrome.browser.signin.AccountSigninActivity; import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver; -import org.chromium.chrome.browser.sync.ui.ChooseAccountFragment; import org.chromium.chrome.browser.util.FeatureUtilities; -import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.sync.signin.ChromeSigninController; -import java.util.List; - /** * The main settings screen, shown when the user first opens Settings. */ @@ -98,13 +87,21 @@ mSignInPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - if (!ChromeSigninController.get(getActivity()).isSignedIn()) { - displayAccountPicker(); - return true; + if (ChromeSigninController.get(getActivity()).isSignedIn()) return false; + if (!SigninManager.get(getActivity()).isSignInAllowed()) { + if (SigninManager.get(getActivity()).isSigninDisabledByPolicy()) { + ManagedPreferencesUtils.showManagedByAdministratorToast(getActivity()); + } + return false; } - return false; + + mSignInPreference.setEnabled(false); + SigninManager.logSigninStartAccessPoint(SigninAccessPoint.SETTINGS); + startActivity(new Intent(getActivity(), AccountSigninActivity.class)); + return true; } }); + mSignInPreference.setEnabled(true); Preference documentMode = findPreference(PREF_DOCUMENT_MODE); if (FeatureUtilities.isDocumentModeEligible(getActivity())) { @@ -165,80 +162,6 @@ } } - private void displayAccountPicker() { - displayAccountPicker(new Callback<DialogFragment>() { - @Override - public void onResult(DialogFragment fragment) {} - }); - } - - /** - * Displays the account picker or the add account dialog and signs the user in. - * - * @param callback Called with the fragment that was shown, or null. Used for testing. - */ - @VisibleForTesting - public void displayAccountPicker(final Callback<DialogFragment> callback) { - Context context = getActivity(); - if (context == null) { - postCallback(callback, null); - return; - } - - if (!SigninManager.get(context).isSignInAllowed()) { - if (SigninManager.get(context).isSigninDisabledByPolicy()) { - ManagedPreferencesUtils.showManagedByAdministratorToast(context); - } - postCallback(callback, null); - return; - } - - AccountManagerHelper.get(context).getGoogleAccountNames(new Callback<List<String>>() { - @Override - public void onResult(List<String> accountNames) { - FragmentManager fragmentManager = getFragmentManager(); - if (fragmentManager == null) { - // Preferences were closed since the click happened; abort. - callback.onResult(null); - return; - } - - if (!accountNames.isEmpty()) { - if (fragmentManager.findFragmentByTag(ACCOUNT_PICKER_DIALOG_TAG) != null) { - callback.onResult(null); - } else { - ChooseAccountFragment chooserFragment = - new ChooseAccountFragment(accountNames); - chooserFragment.show(fragmentManager, ACCOUNT_PICKER_DIALOG_TAG); - callback.onResult(chooserFragment); - SigninManager.logSigninStartAccessPoint(SigninAccessPoint.SETTINGS); - } - } else { - AddGoogleAccountDialogFragment dialog = new AddGoogleAccountDialogFragment(); - dialog.setListener(new AddGoogleAccountListener() { - @Override - public void onAddAccountClicked() { - RecordUserAction.record("Signin_AddAccountToDevice"); - AccountAdder.getInstance().addAccount( - MainPreferences.this, AccountAdder.ADD_ACCOUNT_RESULT); - } - }); - dialog.show(fragmentManager, null); - callback.onResult(dialog); - } - } - }); - } - - private <V> void postCallback(final Callback<V> callback, final V result) { - new Handler().post(new Runnable() { - @Override - public void run() { - callback.onResult(result); - } - }); - } - // SignInStateObserver @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncedAccountPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncedAccountPreference.java index 7e00a93..b68db57 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncedAccountPreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncedAccountPreference.java
@@ -17,9 +17,10 @@ /** * A preference that displays the account currently being synced and allows the user to choose a new - * account to use for syncing + * account to use for syncing. The values used are the account names. */ public class SyncedAccountPreference extends ListPreference { + private static final String TAG = "SyncedAccountPreference"; /** * Constructor for inflating from XML @@ -30,6 +31,14 @@ updateAccountsList(); } + /** + * Updates the list of accounts to those currently signed in and sets the display to the + * current sync account. + */ + public void update() { + updateAccountsList(); + } + private void updateAccountsList() { boolean syncEnabled = AndroidSyncSettings.isSyncEnabled(getContext()); if (!syncEnabled) { @@ -58,13 +67,12 @@ setEntries(accountNames); setEntryValues(accountValues); - setDefaultValue(signedInSettingsKey); + setValue(signedInSettingsKey); setSummary(signedInAccountName); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); - // TODO(crbug/557786): Add switching sync accounts } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java index 2c7b83e..2dff6db44 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java
@@ -640,6 +640,7 @@ return buildContentUri(getInternalAuthority(context), BOOKMARK_FOLDER_PATH); } + @VisibleForTesting public static Uri getBookmarksApiUri(Context context) { return buildContentUri(getApiAuthority(context), BOOKMARKS_PATH); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninActivity.java new file mode 100644 index 0000000..f2239dcf --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninActivity.java
@@ -0,0 +1,107 @@ +// 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. + +package org.chromium.chrome.browser.signin; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.LayoutInflater; + +import org.chromium.base.Log; +import org.chromium.base.annotations.SuppressFBWarnings; +import org.chromium.base.library_loader.ProcessInitException; +import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.firstrun.ProfileDataCache; +import org.chromium.chrome.browser.init.ChromeBrowserInitializer; +import org.chromium.chrome.browser.preferences.Preferences; +import org.chromium.chrome.browser.preferences.PreferencesLauncher; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.sync.ui.SyncCustomizationFragment; + +/** + * An Activity displayed from the MainPreferences to allow the user to pick an account to + * sign in to. The AccountSigninView.Delegate interface is fulfilled by the AppCompatActivity. + */ +public class AccountSigninActivity extends AppCompatActivity + implements AccountSigninView.Listener, AccountSigninView.Delegate, + SigninManager.SignInCallback{ + private static final String TAG = "SigninActivity"; + + private static final String CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG = + "signin_import_data_tag"; + + private AccountSigninView mView; + private String mAccountName; + private boolean mShowSyncSettings = false; + + @Override + @SuppressFBWarnings("DM_EXIT") + protected void onCreate(Bundle savedInstanceState) { + // The browser process must be started here because this activity may be started from the + // recent apps list and it relies on other activities and the native library to be loaded. + try { + ChromeBrowserInitializer.getInstance(this).handleSynchronousStartup(); + } catch (ProcessInitException e) { + Log.e(TAG, "Failed to start browser process.", e); + // Since the library failed to initialize nothing in the application + // can work, so kill the whole application not just the activity + System.exit(-1); + } + + super.onCreate(savedInstanceState); + + mView = (AccountSigninView) LayoutInflater.from(this).inflate( + R.layout.account_signin_view, null); + mView.init(new ProfileDataCache(this, Profile.getLastUsedProfile())); + mView.setListener(this); + mView.setDelegate(this); + + setContentView(mView); + } + + @Override + public void onAccountSelectionCanceled() { + finish(); + } + + @Override + public void onNewAccount() { + AccountAdder.getInstance().addAccount(this, AccountAdder.ADD_ACCOUNT_RESULT); + } + + @Override + public void onAccountSelected(String accountName, boolean settingsClicked) { + mShowSyncSettings = settingsClicked; + mAccountName = accountName; + RecordUserAction.record("Signin_Signin_FromSettings"); + SigninManager.get(this).signIn(accountName, this, this); + } + + @Override + public void onFailedToSetForcedAccount(String forcedAccountName) { + assert false : "No forced accounts in account switching preferences."; + + } + + @Override + public void onSignInComplete() { + if (mShowSyncSettings) { + Intent intent = PreferencesLauncher.createIntentForSettingsPage(this, + SyncCustomizationFragment.class.getName()); + Bundle args = new Bundle(); + args.putString(SyncCustomizationFragment.ARGUMENT_ACCOUNT, mAccountName); + intent.putExtra(Preferences.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); + startActivity(intent); + } + + finish(); + } + + @Override + public void onSignInAborted() { + assert false : "Signin cannot be aborted when forced."; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunView.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java similarity index 74% rename from chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunView.java rename to chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java index 5b83dff..46f2b13 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java
@@ -2,8 +2,9 @@ // 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.firstrun; +package org.chromium.chrome.browser.signin; +import android.app.FragmentManager; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; @@ -17,17 +18,24 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; +import org.chromium.chrome.browser.firstrun.FirstRunView; +import org.chromium.chrome.browser.firstrun.ImageCarousel; import org.chromium.chrome.browser.firstrun.ImageCarousel.ImageCarouselPositionChangeListener; +import org.chromium.chrome.browser.firstrun.ProfileDataCache; +import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.profiles.ProfileDownloader; -import org.chromium.chrome.browser.signin.SigninManager; +import org.chromium.chrome.browser.signin.AccountTrackerService.OnSystemAccountsSeededListener; +import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataDialog; +import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataDialog.ImportSyncType; +import org.chromium.signin.InvestigatedScenario; import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.ui.text.SpanApplier; import org.chromium.ui.text.SpanApplier.SpanInfo; @@ -37,10 +45,11 @@ /** * This view allows the user to select an account to log in to, add an account, * cancel account selection, etc. Users of this class should - * {@link AccountFirstRunView#setListener(Listener)} after the view has been - * inflated. + * {@link AccountSigninView#setListener(Listener)} and + * {@link AccountSigninView#setDelegate(Delegate)} after the view has been inflated. */ -public class AccountFirstRunView extends FrameLayout + +public class AccountSigninView extends FirstRunView implements ImageCarouselPositionChangeListener, ProfileDownloader.Observer { /** @@ -58,24 +67,12 @@ public void onNewAccount(); /** - * The user selected an account. - * This call will be followed by either {@link #onSettingsClicked} or - * {@link #onDoneClicked}. + * The user completed the View and selected an account. * @param accountName The name of the account + * @param settingsClicked If true, user requested to see their sync settings, if false + * they just clicked Done. */ - public void onAccountSelected(String accountName); - - /** - * The user has completed the dialog flow. - * This will only be called after {@link #onAccountSelected} and should exit the View. - */ - public void onDoneClicked(); - - /** - * The user has selected to view sync settings. - * This will only be called after {@link #onAccountSelected} and should exit the View. - */ - public void onSettingsClicked(); + public void onAccountSelected(String accountName, boolean settingsClicked); /** * Failed to set the forced account because it wasn't found. @@ -84,6 +81,18 @@ public void onFailedToSetForcedAccount(String forcedAccountName); } + // TODO(peconn): Investigate expanding the Delegate to simplify the Listener implementations. + + /** + * Provides UI objects for new UI component creation. + */ + public interface Delegate { + /** + * Provides a FragmentManager for the view to create dialogs. + */ + public FragmentManager getFragmentManager(); + } + private class SpinnerOnItemSelectedListener implements AdapterView.OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { @@ -95,6 +104,7 @@ mSpinner.setSelection(oldPosition, false); mListener.onNewAccount(); + RecordUserAction.record("Signin_AddAccountToDevice"); } else { mAccountName = accountName; if (!mPositionSetProgrammatically) mImageCarousel.scrollTo(pos, false, false); @@ -126,7 +136,9 @@ private TextView mTitle; private TextView mDescriptionText; private Listener mListener; + private Delegate mDelegate; private Spinner mSpinner; + private TextView mConfirmAccountEmail; private Drawable mSpinnerBackground; private String mForcedAccountName; private String mAccountName; @@ -138,9 +150,10 @@ private int mCancelButtonTextId; private boolean mIsChildAccount; private boolean mHorizontalModeEnabled = true; + private boolean mDynamicPaddingEnabled = true; private boolean mShowSettingsSpan = true; - public AccountFirstRunView(Context context, AttributeSet attrs) { + public AccountSigninView(Context context, AttributeSet attrs) { super(context, attrs); mAccountManagerHelper = AccountManagerHelper.get(getContext().getApplicationContext()); } @@ -167,7 +180,7 @@ protected void onFinishInflate() { super.onFinishInflate(); - mImageCarousel = (ImageCarousel) findViewById(R.id.image_slider); + mImageCarousel = (ImageCarousel) findViewById(R.id.image); mImageCarousel.setListener(this); mPositiveButton = (Button) findViewById(R.id.positive_button); @@ -182,21 +195,18 @@ mDescriptionText = (TextView) findViewById(R.id.description); // For the spans to be clickable. mDescriptionText.setMovementMethod(LinkMovementMethod.getInstance()); - mDescriptionTextId = R.string.fre_account_choice_description; + mDescriptionTextId = R.string.signin_account_choice_description; // TODO(peconn): Ensure this is changed to R.string.cancel when used in Settings > Sign In. - mCancelButtonTextId = R.string.fre_skip_text; + mCancelButtonTextId = R.string.no_thanks; - // Set the invisible TextView to contain the longest text the visible TextView can hold. - // It assumes that the signed in description for child accounts is the longest text. - ((TextView) findViewById(R.id.longest_description)).setText(getSignedInDescription(true)); + mAddAnotherAccount = getResources().getString(R.string.signin_add_account); - mAddAnotherAccount = getResources().getString(R.string.fre_add_account); - + mConfirmAccountEmail = (TextView) findViewById(R.id.confirm_account_email); mSpinner = (Spinner) findViewById(R.id.google_accounts_spinner); mSpinnerBackground = mSpinner.getBackground(); - mArrayAdapter = new ArrayAdapter<CharSequence>( - getContext().getApplicationContext(), R.layout.fre_spinner_text); + mArrayAdapter = new ArrayAdapter<CharSequence>(getContext().getApplicationContext(), + R.layout.fre_spinner_text); mArrayAdapter.setDropDownViewResource(R.layout.fre_spinner_dropdown); mSpinner.setAdapter(mArrayAdapter); @@ -213,13 +223,13 @@ public boolean performAccessibilityAction(View host, int action, Bundle args) { if (mSpinner.getContentDescription() == null) { mSpinner.setContentDescription(getResources().getString( - R.string.accessibility_fre_account_spinner)); + R.string.accessibility_signin_account_spinner)); } return super.performAccessibilityAction(host, action, args); } }); - showSignInPage(); + showSigninPage(); } @Override @@ -236,33 +246,19 @@ // A new account has been added and the visibility has returned to us. // The updateAccounts function will have selected the new account. // Shortcut to confirm sign in page. - showConfirmSignInPage(); + showConfirmSigninPageAccountTrackerServiceCheck(); } } } @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // This assumes that view's layout_width is set to match_parent. - assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - LinearLayout content = (LinearLayout) findViewById(R.id.fre_content); - int paddingStart = 0; - if (mHorizontalModeEnabled - && width >= 2 * getResources().getDimension(R.dimen.fre_image_carousel_width) - && width > height) { - content.setOrientation(LinearLayout.HORIZONTAL); - paddingStart = getResources().getDimensionPixelSize(R.dimen.fre_margin); - } else { - content.setOrientation(LinearLayout.VERTICAL); - } - ApiCompatibilityUtils.setPaddingRelative(content, - paddingStart, - content.getPaddingTop(), - ApiCompatibilityUtils.getPaddingEnd(content), - content.getPaddingBottom()); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); + protected boolean isHorizontalModeEnabled() { + return mHorizontalModeEnabled; + } + + @Override + protected boolean isDynamicPaddingEnabled() { + return mDynamicPaddingEnabled; } /** @@ -272,6 +268,7 @@ */ public void configureForRecentTabsOrBookmarksPage() { mHorizontalModeEnabled = false; + mDynamicPaddingEnabled = false; mShowSettingsSpan = false; setBackgroundResource(R.color.ntp_bg); @@ -297,7 +294,8 @@ } mDescriptionTextId = (experimentGroup & EXPERIMENT_SUMMARY_VARIANT_MASK) != 0 - ? R.string.sign_in_to_chrome_summary_variant : R.string.sign_in_to_chrome_summary; + ? R.string.signin_sign_in_to_chrome_summary_variant + : R.string.sign_in_to_chrome_summary; if ((experimentGroup & EXPERIMENT_LAYOUT_VARIANT_MASK) != 0) { mImageCarousel.setVisibility(GONE); @@ -307,7 +305,7 @@ illustrationView.setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(), R.color.illustration_background_color)); - LinearLayout linearLayout = (LinearLayout) findViewById(R.id.fre_account_linear_layout); + LinearLayout linearLayout = (LinearLayout) findViewById(R.id.fre_main_layout); linearLayout.addView(illustrationView, 0); } } @@ -332,6 +330,14 @@ } /** + * Set the UI object creation delegate. See {@link Delegate} + * @param delegate The delegate. + */ + public void setDelegate(Delegate delegate) { + mDelegate = delegate; + } + + /** * Refresh the list of available system account. * @return Whether any new accounts were added (the first newly added account will now be * selected). @@ -359,14 +365,14 @@ mArrayAdapter.addAll(mAccountNames); mArrayAdapter.add(mAddAnotherAccount); - setUpSignInButton(true); + setUpSigninButton(true); mDescriptionText.setText(mDescriptionTextId); } else { mSpinner.setVisibility(View.GONE); mArrayAdapter.add(mAddAnotherAccount); - setUpSignInButton(false); - mDescriptionText.setText(R.string.fre_no_account_choice_description); + setUpSigninButton(false); + mDescriptionText.setText(R.string.signin_no_account_choice_description); } if (mProfileData != null) mProfileData.update(); @@ -438,23 +444,32 @@ if (name == null) name = mProfileData.getFullName(mAccountName); } if (name == null) name = mAccountName; - String text = String.format(getResources().getString(R.string.fre_hi_name), name); + String text = String.format(getResources().getString(R.string.signin_hi_name), name); mTitle.setText(text); } /** * Updates the view to show that sign in has completed. + * This should only be used if the user is not currently signed in (eg on the First + * Run Experience). */ public void switchToSignedMode() { - showConfirmSignInPage(); + // TODO(peconn): Add a warning here + showConfirmSigninPage(); } - private void showSignInPage() { + private void configureSpinner(boolean signinPage) { + mSpinner.setEnabled(signinPage); + mSpinner.setVisibility(signinPage ? View.VISIBLE : View.GONE); + mConfirmAccountEmail.setVisibility(signinPage ? View.GONE : View.VISIBLE); + mConfirmAccountEmail.setText(mAccountName); + } + + private void showSigninPage() { mSignedIn = false; mTitle.setText(R.string.sign_in_to_chrome); - mSpinner.setEnabled(true); - mSpinner.setBackground(mSpinnerBackground); + configureSpinner(true); mImageCarousel.setVisibility(VISIBLE); setUpCancelButton(); @@ -463,12 +478,11 @@ mImageCarousel.setSignedInMode(false); } - private void showConfirmSignInPage() { + private void showConfirmSigninPage() { mSignedIn = true; updateProfileName(); - mSpinner.setEnabled(false); - mSpinner.setBackground(null); + configureSpinner(false); setUpConfirmButton(); setUpUndoButton(); @@ -476,13 +490,12 @@ ClickableSpan settingsSpan = new ClickableSpan() { @Override public void onClick(View widget) { - mListener.onAccountSelected(mAccountName); - mListener.onSettingsClicked(); + mListener.onAccountSelected(mAccountName, true); } @Override public void updateDrawState(TextPaint textPaint) { - textPaint.setColor(textPaint.linkColor); + textPaint.setColor(getResources().getColor(R.color.ui_link_text_color)); textPaint.setUnderlineText(false); } }; @@ -499,6 +512,47 @@ mImageCarousel.setSignedInMode(true); } + private void showConfirmSigninPageAccountTrackerServiceCheck() { + // Ensure that the AccountTrackerService has a fully up to date GAIA id <-> email mapping, + // as this is needed for the previous account check. + if (AccountTrackerService.get(getContext()).checkAndSeedSystemAccounts()) { + showConfirmSigninPagePreviousAccountCheck(); + } else { + AccountTrackerService.get(getContext()).addSystemAccountsSeededListener( + new OnSystemAccountsSeededListener() { + @Override + public void onSystemAccountsSeedingComplete() { + AccountTrackerService.get(getContext()) + .removeSystemAccountsSeededListener(this); + showConfirmSigninPagePreviousAccountCheck(); + } + + @Override + public void onSystemAccountsChanged() {} + }); + } + } + + private void showConfirmSigninPagePreviousAccountCheck() { + if (SigninInvestigator.investigate(mAccountName) + == InvestigatedScenario.DIFFERENT_ACCOUNT) { + + ConfirmImportSyncDataDialog.showNewInstance( + PrefServiceBridge.getInstance().getSyncLastAccountName(), + mAccountName, + ImportSyncType.PREVIOUS_DATA_FOUND, + mDelegate.getFragmentManager(), + new ConfirmImportSyncDataDialog.Listener() { + @Override + public void onConfirm() { + showConfirmSigninPage(); + } + }); + } else { + showConfirmSigninPage(); + } + } + private void setUpCancelButton() { setNegativeButtonVisible(true); @@ -512,20 +566,20 @@ }); } - private void setUpSignInButton(boolean hasAccounts) { + private void setUpSigninButton(boolean hasAccounts) { + mPositiveButton.setText(R.string.choose_account_sign_in); if (hasAccounts) { - mPositiveButton.setText(R.string.choose_account_sign_in); mPositiveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - showConfirmSignInPage(); + showConfirmSigninPageAccountTrackerServiceCheck(); } }); } else { - mPositiveButton.setText(R.string.fre_no_accounts); mPositiveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { + RecordUserAction.record("Signin_AddAccountToDevice"); mListener.onNewAccount(); } }); @@ -540,18 +594,18 @@ mNegativeButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - showSignInPage(); + RecordUserAction.record("Signin_Undo_Signin"); + showSigninPage(); } }); } private void setUpConfirmButton() { - mPositiveButton.setText(getResources().getText(R.string.fre_accept)); + mPositiveButton.setText(getResources().getText(R.string.signin_accept)); mPositiveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - mListener.onAccountSelected(mAccountName); - mListener.onDoneClicked(); + mListener.onAccountSelected(mAccountName, false); } }); } @@ -568,10 +622,10 @@ private String getSignedInDescription(boolean childAccount) { if (childAccount) { - return getResources().getString(R.string.fre_signed_in_description) + '\n' - + getResources().getString(R.string.fre_signed_in_description_uca_addendum); + return getResources().getString(R.string.signin_signed_in_description) + '\n' + + getResources().getString(R.string.signin_signed_in_description_uca_addendum); } else { - return getResources().getString(R.string.fre_signed_in_description); + return getResources().getString(R.string.signin_signed_in_description); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java index dbc87e2..ea0f7fc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java
@@ -94,6 +94,14 @@ } } + /** + * Remove an |observer| from the list of observers. + */ + public void removeSystemAccountsSeededListener(OnSystemAccountsSeededListener observer) { + ThreadUtils.assertOnUiThread(); + mSystemAccountsSeedingObservers.removeObserver(observer); + } + private void seedSystemAccounts() { ThreadUtils.assertOnUiThread(); mSystemAccountsChanged = false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmAccountChangeFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmAccountChangeFragment.java deleted file mode 100644 index 48a70f6..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmAccountChangeFragment.java +++ /dev/null
@@ -1,114 +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.signin; - -import android.app.Activity; -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.text.SpannableString; -import android.text.method.LinkMovementMethod; -import android.text.style.ClickableSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.TextView; - -import org.chromium.base.metrics.RecordUserAction; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.preferences.PrefServiceBridge; -import org.chromium.chrome.browser.preferences.PreferencesLauncher; -import org.chromium.chrome.browser.sync.ui.ClearSyncDataPreferences; -import org.chromium.ui.text.SpanApplier; -import org.chromium.ui.text.SpanApplier.SpanInfo; - -/** - * The fragment shown when the user was previously signed in, then disconnected their account, - * and is now attempting to sign in to a new account. This dialog warns the user that they should - * clear their browser data, or else their bookmarks etc from their old account will be merged with - * the new account when they sign in. This dialog assumes it is being created in the middle of the - * signin flow, and as such is purposefully package private. - */ -class ConfirmAccountChangeFragment - extends DialogFragment implements DialogInterface.OnClickListener { - private static final String KEY_OLD_ACCOUNT_NAME = "lastAccountName"; - private static final String KEY_NEW_ACCOUNT_NAME = "newAccountName"; - - // Tracks whether to abort signin in onDismiss. - private boolean mAbortSignin = true; - - public static ConfirmAccountChangeFragment newInstance(String accountName) { - ConfirmAccountChangeFragment dialogFragment = new ConfirmAccountChangeFragment(); - Bundle args = new Bundle(); - args.putString( - KEY_OLD_ACCOUNT_NAME, PrefServiceBridge.getInstance().getSyncLastAccountName()); - args.putString(KEY_NEW_ACCOUNT_NAME, accountName); - dialogFragment.setArguments(args); - return dialogFragment; - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final Activity activity = getActivity(); - String lastSyncAccountName = getArguments().getString(KEY_OLD_ACCOUNT_NAME); - String currentAccountName = getArguments().getString(KEY_NEW_ACCOUNT_NAME); - - LayoutInflater inflater = activity.getLayoutInflater(); - View v = inflater.inflate(R.layout.confirm_sync_account_change_account, null); - final TextView textView = (TextView) v.findViewById(R.id.confirmMessage); - String message = activity.getString(R.string.confirm_account_change_dialog_message, - lastSyncAccountName, currentAccountName); - - // Show clear sync data dialog when the user clicks the "settings" link. - SpannableString messageWithLink = SpanApplier.applySpans( - message, new SpanInfo("<link>", "</link>", new ClickableSpan() { - @Override - public void onClick(View widget) { - showClearSyncDataPreferences(); - } - })); - - RecordUserAction.record("Signin_Show_ImportDataPrompt"); - textView.setText(messageWithLink); - textView.setMovementMethod(LinkMovementMethod.getInstance()); - return new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) - .setTitle(R.string.confirm_account_change_dialog_title) - .setPositiveButton(R.string.confirm_account_change_dialog_signin, this) - .setNegativeButton(R.string.cancel, this) - .setView(v) - .create(); - } - - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == AlertDialog.BUTTON_POSITIVE) { - RecordUserAction.record("Signin_ImportDataPrompt_ImportData"); - SigninManager.get(getActivity()).progressInteractiveSignInFlowAccountConfirmed(); - mAbortSignin = false; - } else if (which == AlertDialog.BUTTON_NEGATIVE) { - RecordUserAction.record("Signin_ImportDataPrompt_Cancel"); - } - } - - @Override - public void onDismiss(DialogInterface dialogInterface) { - super.onDismiss(dialogInterface); - if (mAbortSignin) { - // Something other than BUTTON_POSITIVE is dismissing this fragment; abort signin. - SigninManager.get(getActivity()).abortSignIn(); - } - } - - private void showClearSyncDataPreferences() { - Intent intent = PreferencesLauncher.createIntentForSettingsPage(getActivity(), - ClearSyncDataPreferences.class.getName()); - startActivity(intent); - - RecordUserAction.record("Signin_ImportDataPrompt_DontImport"); - dismiss(); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java index 8d619ca0..995a0e5e7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
@@ -23,7 +23,6 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.externalauth.ExternalAuthUtils; import org.chromium.chrome.browser.externalauth.UserRecoverableErrorHandler; -import org.chromium.signin.InvestigatedScenario; import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.sync.signin.ChromeSigninController; @@ -292,7 +291,7 @@ public void onSystemAccountsSeedingComplete() { if (mSignInState != null && mSignInState.blockedOnAccountSeeding) { mSignInState.blockedOnAccountSeeding = false; - progressSignInFlowInvestigateScenario(); + progressSignInFlowCheckPolicy(); } } @@ -366,7 +365,7 @@ private void progressSignInFlowSeedSystemAccounts() { if (AccountTrackerService.get(mContext).checkAndSeedSystemAccounts()) { - progressSignInFlowInvestigateScenario(); + progressSignInFlowCheckPolicy(); } else if (AccountIdProvider.getInstance().canBeUsed(mContext)) { mSignInState.blockedOnAccountSeeding = true; } else { @@ -381,11 +380,11 @@ } /** - * If sign-in is interactive and the user is changing accounts, display a confirmation dialog. + * Continues the signin flow by checking if there is a policy that the account is subject to. */ - private void progressSignInFlowInvestigateScenario() { - if (!mSignInState.isInteractive()) { - progressSignInFlowCheckPolicy(); + private void progressSignInFlowCheckPolicy() { + if (mSignInState == null) { + Log.w(TAG, "Ignoring sign in progress request as no pending sign in."); return; } @@ -394,38 +393,6 @@ return; } - // TODO(skym): Warn for high risk upgrade scenario, crbug.com/572754. - if (SigninInvestigator.investigate(mSignInState.account.name) - == InvestigatedScenario.DIFFERENT_ACCOUNT) { - mSignInState.displayedDialog = - ConfirmAccountChangeFragment.newInstance(mSignInState.account.name); - mSignInState.displayedDialog.show( - mSignInState.activity.getFragmentManager(), CONFIRM_ACCOUNT_CHANGED_DIALOG_TAG); - } else { - // Do not display dialog, just sign-in. - progressSignInFlowCheckPolicy(); - } - } - - /** - * Called from ConfirmAccountChangeFragment if the new account name was confirmed. - */ - void progressInteractiveSignInFlowAccountConfirmed() { - if (mSignInState == null || mSignInState.displayedDialog == null) { - // Stop if sign-in was cancelled or this is a duplicate click event. - return; - } - mSignInState.displayedDialog = null; - - progressSignInFlowCheckPolicy(); - } - - /** - * Continues the signin flow by checking if there is a policy that the account is subject to. - */ - private void progressSignInFlowCheckPolicy() { - assert mSignInState != null; - if (!nativeShouldLoadPolicyForUser(mSignInState.account.name)) { // Proceed with the sign-in flow without checking for policy if it can be determined // that this account can't have management enabled based on the username. @@ -460,6 +427,7 @@ return; } + // TODO(peconn): Move this and other UI interactions into AccountSigninView. Log.d(TAG, "Account has policy management"); mSignInState.displayedDialog = ConfirmManagedSigninFragment.newInstance(managementDomain); mSignInState.displayedDialog.show(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoScreen.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoScreen.java index b72e672..020516e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoScreen.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoScreen.java
@@ -5,16 +5,15 @@ package org.chromium.chrome.browser.signin; import android.app.Activity; +import android.app.FragmentManager; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; -import android.view.View; import android.widget.LinearLayout; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; -import org.chromium.chrome.browser.firstrun.AccountFirstRunView; import org.chromium.chrome.browser.firstrun.ProfileDataCache; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; @@ -31,11 +30,10 @@ /** * This class implements the dialog UI for the signin promo. */ -public class SigninPromoScreen - extends AlwaysDismissedDialog implements AccountFirstRunView.Listener { - private AccountFirstRunView mAccountFirstRunView; +public class SigninPromoScreen extends AlwaysDismissedDialog + implements AccountSigninView.Listener, AccountSigninView.Delegate { + private AccountSigninView mAccountFirstRunView; private ProfileDataCache mProfileDataCache; - private String mAccountName; /** * Launches the signin promo if it needs to be displayed. @@ -75,14 +73,15 @@ setOwnerActivity(activity); LayoutInflater inflater = LayoutInflater.from(activity); - View view = inflater.inflate(R.layout.fre_choose_account, null); + mAccountFirstRunView = (AccountSigninView) + inflater.inflate(R.layout.account_signin_view, null); mProfileDataCache = new ProfileDataCache(activity, Profile.getLastUsedProfile()); - mAccountFirstRunView = (AccountFirstRunView) view.findViewById(R.id.fre_account_layout); mAccountFirstRunView.init(mProfileDataCache); mAccountFirstRunView.configureForAddAccountPromo(); mAccountFirstRunView.setListener(this); + mAccountFirstRunView.setDelegate(this); - setContentView(view, new LinearLayout.LayoutParams( + setContentView(mAccountFirstRunView, new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); } @@ -111,46 +110,45 @@ } @Override - public void onAccountSelected(String accountName) { - mAccountName = accountName; - } - - @Override - public void onDoneClicked() { - Activity activity = getOwnerActivity(); - RecordUserAction.record("Signin_Signin_FromSigninPromo"); - SigninManager.get(activity).signIn(mAccountName, activity, new SignInCallback() { - @Override - public void onSignInComplete() { - SigninManager.get(getOwnerActivity()).logInSignedInUser(); - SigninPromoUma.recordAction(SigninPromoUma.SIGNIN_PROMO_ACCEPTED); + public void onAccountSelected(String accountName, boolean settingsClicked) { + if (settingsClicked) { + if (ProfileSyncService.get() != null) { + Intent intent = PreferencesLauncher.createIntentForSettingsPage(getContext(), + SyncCustomizationFragment.class.getName()); + Bundle args = new Bundle(); + args.putString(SyncCustomizationFragment.ARGUMENT_ACCOUNT, accountName); + intent.putExtra(Preferences.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); + getContext().startActivity(intent); } - @Override - public void onSignInAborted() { - SigninPromoUma.recordAction(SigninPromoUma.SIGNIN_PROMO_DECLINED); - dismiss(); - } - }); - } + SigninPromoUma.recordAction(SigninPromoUma.SIGNIN_PROMO_ACCEPTED_WITH_ADVANCED); + dismiss(); + } else { + Activity activity = getOwnerActivity(); + RecordUserAction.record("Signin_Signin_FromSigninPromo"); + SigninManager.get(activity).signIn(accountName, activity, new SignInCallback() { + @Override + public void onSignInComplete() { + SigninManager.get(getOwnerActivity()).logInSignedInUser(); + SigninPromoUma.recordAction(SigninPromoUma.SIGNIN_PROMO_ACCEPTED); + } - @Override - public void onSettingsClicked() { - if (ProfileSyncService.get() != null) { - Intent intent = PreferencesLauncher.createIntentForSettingsPage(getContext(), - SyncCustomizationFragment.class.getName()); - Bundle args = new Bundle(); - args.putString(SyncCustomizationFragment.ARGUMENT_ACCOUNT, mAccountName); - intent.putExtra(Preferences.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); - getContext().startActivity(intent); + @Override + public void onSignInAborted() { + SigninPromoUma.recordAction(SigninPromoUma.SIGNIN_PROMO_DECLINED); + dismiss(); + } + }); } - - SigninPromoUma.recordAction(SigninPromoUma.SIGNIN_PROMO_ACCEPTED_WITH_ADVANCED); - dismiss(); } @Override public void onFailedToSetForcedAccount(String forcedAccountName) { assert false : "No forced accounts in SigninPromoScreen"; } + + @Override + public FragmentManager getFragmentManager() { + return getOwnerActivity().getFragmentManager(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java new file mode 100644 index 0000000..bb70a3f2 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java
@@ -0,0 +1,81 @@ +// 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. + +package org.chromium.chrome.browser.sync; + +import android.app.Activity; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.text.TextUtils; + +import org.chromium.chrome.browser.preferences.SyncedAccountPreference; +import org.chromium.chrome.browser.signin.SigninManager; +import org.chromium.chrome.browser.signin.SigninManager.SignInCallback; +import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataDialog; +import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataDialog.ImportSyncType; + +/** + * A class that encapsulates the control flow of listeners and callbacks when switching sync + * accounts. + * + * Control flows through the method in this order: + * {@link OnPreferenceChangeListener#onPreferenceChange} + * {@link ConfirmImportSyncDataDialog.Listener#onConfirm} + * {@link SignInCallback#onSignInComplete} + */ +public class SyncAccountSwitcher + implements OnPreferenceChangeListener, ConfirmImportSyncDataDialog.Listener, + SignInCallback { + private static final String TAG = "SyncAccountSwitcher"; + + private final SyncedAccountPreference mSyncedAccountPreference; + private final Activity mActivity; + + private String mNewAccountName; + + /** + * Sets up a SyncAccountSwitcher to be ready to accept callbacks. + * @param activity Activity used to get the context for signin and get the fragmentManager + * for the data sync fragment. + * @param syncedAccountPreference The preference to update once signin has been completed. + */ + public SyncAccountSwitcher(Activity activity, SyncedAccountPreference syncedAccountPreference) { + mActivity = activity; + mSyncedAccountPreference = syncedAccountPreference; + } + + @Override + public boolean onPreferenceChange(Preference p, Object newValue) { + if (newValue == null) return false; + + mNewAccountName = (String) newValue; + String currentAccount = mSyncedAccountPreference.getValue(); + + if (TextUtils.equals(mNewAccountName, currentAccount)) return false; + + ConfirmImportSyncDataDialog.showNewInstance(currentAccount, mNewAccountName, + ImportSyncType.SWITCHING_SYNC_ACCOUNTS, mActivity.getFragmentManager(), this); + + // Don't update the selected account in the preference. It will be updated by + // the call to mSyncAccountListPreference.update() if everything succeeds. + return false; + } + + @Override + public void onConfirm() { + assert mNewAccountName != null; + SigninManager.get(mActivity).signIn(mNewAccountName, mActivity, this); + } + + @Override + public void onSignInComplete() { + // Update the Preference so it displays the correct account name. + mSyncedAccountPreference.update(); + } + + @Override + public void onSignInAborted() { + // If the user aborted signin, there is nothing to do. + } +} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ChooseAccountFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ChooseAccountFragment.java deleted file mode 100644 index ade00ae..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ChooseAccountFragment.java +++ /dev/null
@@ -1,63 +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.sync.ui; - -import android.app.Activity; -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; - -import org.chromium.base.metrics.RecordUserAction; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.signin.SigninManager; - -import java.util.List; - -/** - * A dialog that lets the user choose which Google account to use when signing in to Chrome. - */ -public class ChooseAccountFragment extends DialogFragment implements OnClickListener { - - protected String[] mAccounts; - - protected int mSelectedAccount; - - // TODO(skym): Fragments should have empty constructors, crbug.com/580093. - public ChooseAccountFragment(List<String> accountNames) { - mAccounts = accountNames.toArray(new String[accountNames.size()]); - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - return new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) - .setSingleChoiceItems(mAccounts, mSelectedAccount, this) - .setPositiveButton(R.string.choose_account_sign_in, this) - .setNegativeButton(R.string.cancel, this) - .setTitle(R.string.sign_in_google_account) - .create(); - } - - private static void signIn(final Activity activity, String accountName) { - RecordUserAction.record("Signin_Signin_FromSettings"); - SigninManager.get(activity).signIn(accountName, activity, null); - } - - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case AlertDialog.BUTTON_POSITIVE: { - signIn(getActivity(), mAccounts[mSelectedAccount]); - break; - } - default: { - mSelectedAccount = which; - break; - } - } - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ConfirmImportSyncDataDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ConfirmImportSyncDataDialog.java new file mode 100644 index 0000000..83f4bb3 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ConfirmImportSyncDataDialog.java
@@ -0,0 +1,208 @@ +// 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. + +package org.chromium.chrome.browser.sync.ui; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.FragmentManager; +import android.content.Context; +import android.content.DialogInterface; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.BrowsingDataType; +import org.chromium.chrome.browser.preferences.PrefServiceBridge; +import org.chromium.chrome.browser.preferences.PrefServiceBridge.OnClearBrowsingDataListener; +import org.chromium.chrome.browser.provider.ChromeBrowserProviderClient; +import org.chromium.chrome.browser.signin.SigninManager; +import org.chromium.chrome.browser.widget.RadioButtonWithDescription; + +import java.util.Arrays; +import java.util.List; + +/** + * A dialog that is displayed when the user switches the account they are syncing to. It gives the + * option to merge the data of the two accounts or to keep them separate. + */ +public class ConfirmImportSyncDataDialog extends DialogFragment + implements DialogInterface.OnClickListener, OnClearBrowsingDataListener { + + /** + * Callback for completion of the dialog. + */ + public interface Listener { + /** + * The user has completed the dialog using the positive button. If requested, the previous + * sync data has been cleared. + */ + public void onConfirm(); + } + + /** + * The situation ConfirmImportSyncDataDialog is created for - whether the user had previously + * been signed into another account, had signed out then signed into a different one, or + * if they directly switched accounts. This changes the strings displayed. + */ + public enum ImportSyncType { SWITCHING_SYNC_ACCOUNTS, PREVIOUS_DATA_FOUND } + + private static final String CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG = + "sync_account_switch_import_data_tag"; + + private static final int[] SYNC_DATA_TYPES = { + BrowsingDataType.HISTORY, + BrowsingDataType.CACHE, + BrowsingDataType.COOKIES, + BrowsingDataType.PASSWORDS, + BrowsingDataType.FORM_DATA + }; + + private static final String KEY_OLD_ACCOUNT_NAME = "lastAccountName"; + private static final String KEY_NEW_ACCOUNT_NAME = "newAccountName"; + private static final String KEY_IMPORT_SYNC_TYPE = "importSyncType"; + + private RadioButtonWithDescription mConfirmImportOption; + private RadioButtonWithDescription mKeepSeparateOption; + + private Listener mListener; + + private static ConfirmImportSyncDataDialog newInstance( + String oldAccountName, String newAccountName, ImportSyncType importSyncType) { + + ConfirmImportSyncDataDialog fragment = new ConfirmImportSyncDataDialog(); + Bundle args = new Bundle(); + args.putString(KEY_OLD_ACCOUNT_NAME, oldAccountName); + args.putString(KEY_NEW_ACCOUNT_NAME, newAccountName); + args.putSerializable(KEY_IMPORT_SYNC_TYPE, importSyncType); + fragment.setArguments(args); + return fragment; + } + + /** + * Creates and shows a new instance of ConfirmImportSyncDataFragment, a dialog that gives the + * user the option to merge data between the account they are attempting to sign in to and the + * account they were previously signed into, or to keep the data separate. + * @param oldAccountName The previous sync account name. + * @param newAccountName The potential next sync account name. + * @param importSyncType The situation the dialog is created in - either when directly changing + * the sync account or signing in after being signed out (this changes + * displayed strings). + * @param fragmentManager FragmentManager to attach the dialog to. + * @param callback Callback to be called if the user completes the dialog (as opposed to + * hitting cancel). + */ + public static void showNewInstance(String oldAccountName, String newAccountName, + ImportSyncType importSyncType, FragmentManager fragmentManager, Listener callback) { + ConfirmImportSyncDataDialog confirmSync = + newInstance(oldAccountName, newAccountName, importSyncType); + + confirmSync.setListener(callback); + confirmSync.show(fragmentManager, CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + String oldAccountName = getArguments().getString(KEY_OLD_ACCOUNT_NAME); + String newAccountName = getArguments().getString(KEY_NEW_ACCOUNT_NAME); + ImportSyncType importSyncType = + (ImportSyncType) getArguments().getSerializable(KEY_IMPORT_SYNC_TYPE); + + LayoutInflater inflater = getActivity().getLayoutInflater(); + View v = inflater.inflate(R.layout.confirm_import_sync_data, null); + + TextView prompt = (TextView) v.findViewById(R.id.sync_import_data_prompt); + + if (importSyncType == ImportSyncType.SWITCHING_SYNC_ACCOUNTS) { + prompt.setText(getActivity().getString( + R.string.sync_import_data_prompt_switching_accounts, + newAccountName, oldAccountName)); + } else { + prompt.setText(getActivity().getString( + R.string.sync_import_data_prompt_existing_data, + newAccountName, oldAccountName)); + } + + mConfirmImportOption = (RadioButtonWithDescription) + v.findViewById(R.id.sync_confirm_import_choice); + mKeepSeparateOption = (RadioButtonWithDescription) + v.findViewById(R.id.sync_keep_separate_choice); + + mConfirmImportOption.setDescriptionText(getActivity().getString( + R.string.sync_import_existing_data_subtext, newAccountName)); + mKeepSeparateOption.setDescriptionText(getActivity().getString( + R.string.sync_keep_existing_data_separate_subtext, newAccountName, oldAccountName)); + + List<RadioButtonWithDescription> radioGroup = + Arrays.asList(mConfirmImportOption, mKeepSeparateOption); + mConfirmImportOption.setRadioButtonGroup(radioGroup); + mKeepSeparateOption.setRadioButtonGroup(radioGroup); + + if (importSyncType == ImportSyncType.SWITCHING_SYNC_ACCOUNTS) { + mKeepSeparateOption.setChecked(true); + } else { + mConfirmImportOption.setChecked(true); + } + + return new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) + .setTitle(R.string.sync_import_data_title) + .setPositiveButton(R.string.continue_button, this) + .setNegativeButton(R.string.cancel, this) + .setView(v) + .create(); + } + + private void setListener(Listener listener) { + assert mListener == null; + mListener = listener; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which != AlertDialog.BUTTON_POSITIVE) { + RecordUserAction.record("Signin_ImportDataPrompt_Cancel"); + return; + } + if (mListener == null) return; + + assert mConfirmImportOption.isChecked() ^ mKeepSeparateOption.isChecked(); + + if (mConfirmImportOption.isChecked()) { + RecordUserAction.record("Signin_ImportDataPrompt_ImportData"); + mListener.onConfirm(); + } else { + RecordUserAction.record("Signin_ImportDataPrompt_DontImport"); + + final Context context = getActivity(); + final PrefServiceBridge.OnClearBrowsingDataListener listener = this; + + // The ChromeBrowserProvider API currently enforces calls to not be on the UI thread. + // This is being reviewed in http://crbug.com/225050 and this code could be simplified. + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... arg0) { + ChromeBrowserProviderClient.removeAllUserBookmarks(context); + return null; + } + + @Override + protected void onPostExecute(Void result) { + PrefServiceBridge.getInstance().clearBrowsingData(listener, SYNC_DATA_TYPES); + } + }.execute(); + } + } + + @Override + public void onBrowsingDataCleared() { + SigninManager.get(getActivity()).clearLastSignedInUser(); + if (mListener != null) mListener.onConfirm(); + } +} +
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java index 4118505..19532c2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
@@ -36,6 +36,7 @@ import org.chromium.chrome.browser.preferences.ChromeSwitchPreference; import org.chromium.chrome.browser.preferences.SyncedAccountPreference; import org.chromium.chrome.browser.sync.ProfileSyncService; +import org.chromium.chrome.browser.sync.SyncAccountSwitcher; import org.chromium.sync.AndroidSyncSettings; import org.chromium.sync.ModelType; import org.chromium.sync.PassphraseType; @@ -116,12 +117,13 @@ private Preference mSyncEncryption; private Preference mManageSyncData; private CheckBoxPreference[] mAllTypes; + private SyncedAccountPreference mSyncedAccountPreference; private ProfileSyncService mProfileSyncService; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView( + LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mProfileSyncService = ProfileSyncService.get(); assert mProfileSyncService != null; mIsBackendInitialized = mProfileSyncService.isBackendInitialized(); @@ -178,6 +180,11 @@ } }); + mSyncedAccountPreference = + (SyncedAccountPreference) findPreference(PREFERENCE_SYNC_ACCOUNT_LIST); + mSyncedAccountPreference.setOnPreferenceChangeListener( + new SyncAccountSwitcher(getActivity(), mSyncedAccountPreference)); + return view; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index f5555ba0..5ea4962 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -2901,6 +2901,7 @@ for (WeakReference<Activity> ref : list) { Activity activity = ref.get(); if (activity instanceof CustomTabActivity + && ((CustomTabActivity) activity).getActivityTab() != null && tabId == ((CustomTabActivity) activity).getActivityTab().getId()) { return null; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java new file mode 100644 index 0000000..c51f15d --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java
@@ -0,0 +1,107 @@ +// 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. + +package org.chromium.chrome.browser.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.RadioButton; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import org.chromium.chrome.R; + +import java.util.List; + +/** + * A RadioButton with a title and descriptive text to the right. + */ +public class RadioButtonWithDescription extends RelativeLayout implements OnClickListener { + private RadioButton mRadioButton; + private TextView mTitle; + private TextView mDescription; + + private List<RadioButtonWithDescription> mGroup; + + /** + * Constructor for inflating via XML. + */ + public RadioButtonWithDescription(Context context, AttributeSet attrs) { + super(context, attrs); + LayoutInflater.from(context).inflate(R.layout.radio_button_with_description, this, true); + + mRadioButton = (RadioButton) findViewById(R.id.radio_button); + mTitle = (TextView) findViewById(R.id.title); + mDescription = (TextView) findViewById(R.id.description); + + if (attrs != null) applyAttributes(attrs); + + // We want RadioButtonWithDescription to handle the clicks itself. + mRadioButton.setClickable(false); + setOnClickListener(this); + } + + private void applyAttributes(AttributeSet attrs) { + TypedArray a = getContext().getTheme().obtainStyledAttributes(attrs, + R.styleable.RadioButtonWithDescription, 0, 0); + + String titleText = a.getString(R.styleable.RadioButtonWithDescription_titleText); + if (titleText != null) mTitle.setText(titleText); + + a.recycle(); + } + + @Override + public void onClick(View v) { + if (mGroup != null) { + for (RadioButtonWithDescription button : mGroup) { + button.setChecked(false); + } + } + + setChecked(true); + } + + /** + * Sets the text shown in the title section. + */ + public void setTitleText(CharSequence text) { + mTitle.setText(text); + } + + /** + * Sets the text shown in the description section. + */ + public void setDescriptionText(CharSequence text) { + mDescription.setText(text); + } + + /** + * Returns true if checked. + */ + public boolean isChecked() { + return mRadioButton.isChecked(); + } + + /** + * Sets the checked status. + */ + public void setChecked(boolean checked) { + mRadioButton.setChecked(checked); + } + + /** + * Sets the group of RadioButtonWithDescriptions that should be unchecked when this button is + * checked. + * @param group A list containing all elements of the group. + */ + public void setRadioButtonGroup(List<RadioButtonWithDescription> group) { + mGroup = group; + } +} +
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 161bc8b..eb6d92d 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -170,6 +170,9 @@ <message name="IDS_NEXT" desc="Generic label for a button to advance to the next item. [CHAR-LIMIT=20]"> Next </message> + <message name="IDS_CONTINUE_BUTTON" desc="Generic label for a button to continue to the next screen. Used in multiple contexts. [CHAR-LIMIT=20]"> + Continue + </message> <message name="IDS_SUBMIT" desc="Generic label for a button to submit data. Used in multiple contexts. [CHAR-LIMIT=20]"> Submit </message> @@ -1063,14 +1066,26 @@ <message name="IDS_SYNC_LOADING" desc="Preference title to let the user change their encryption password. [CHAR-LIMIT=20]"> Loading… </message> + <message name="IDS_SYNC_IMPORT_DATA_TITLE" desc="Preference title of screen to let user choose to switch sync accounts. [CHAR-LIMIT=24]"> + Import data? + </message> + <message name="IDS_SYNC_IMPORT_DATA_PROMPT_SWITCHING_ACCOUNTS" desc="Prompt for the user to choose how they want to handle their existing sync data"> + You’re switching sync accounts from <ph name="FROM_ACCOUNT">%2$s<ex>johndoe@old.com</ex></ph> to <ph name="TO_ACCOUNT">%1$s<ex>johndoe@new.com</ex></ph>. What do you want to do with your existing bookmarks, history, passwords and other settings? + </message> + <message name="IDS_SYNC_IMPORT_DATA_PROMPT_EXISTING_DATA" desc="Prompt for the user to choose how they want to handle their existing sync data"> + You’re signing in to <ph name="TO_ACCOUNT">%1$s<ex>johndoe@new.com</ex></ph>. Some of your existing bookmarks, history, passwords, and other settings were previously synced to <ph name="FROM_ACCOUNT">%2$s<ex>johndoe@old.com</ex></ph>. What do you want to do with your existing data? + </message> + <message name="IDS_SYNC_IMPORT_EXISTING_DATA" desc="Option to import existing data to the newly selected sync account"> + Import existing data + </message> + <message name="IDS_SYNC_IMPORT_EXISTING_DATA_SUBTEXT" desc="Subtext describing what happens if the user elects to import existing data to the newly selected sync account"> + Keep existing data on your device and permanently import the data to <ph name="TO_ACCOUNT">%1$s<ex>johndoe@new.com</ex></ph>. + </message> <message name="IDS_SYNC_KEEP_EXISTING_DATA_SEPARATE" desc="Option to keep the existing data separate from the newly selected sync account"> Keep existing data separate </message> <message name="IDS_SYNC_KEEP_EXISTING_DATA_SEPARATE_SUBTEXT" desc="Subtext describing what happens if the user elects to keep the existing data separate"> - Replace this device’s data with <ph name="ACCOUNT">%1$s<ex>john@doe.com</ex></ph>’s data. You can retrieve your existing data by switching back to <ph name="ACCOUNT">%1$s<ex>johndoe@gmail.com</ex></ph> - </message> - <message name="IDS_SYNC_KEEP_EXISTING_DATA_SEPARATE_VALUE" desc="Internal value for keep existing data preference" translateable="false"> - keep_existing_data + Replace this device’s data with <ph name="TO_ACCOUNT">%1$s<ex>johndoe@new.com</ex></ph>’s data. You can retrieve your existing data by switching back to <ph name="FROM_ACCOUNT">%2$s<ex>johndoe@old.com</ex></ph>, but data created since you signed out will be lost. </message> <!-- Bluetooth Picker UI strings --> @@ -1620,51 +1635,15 @@ </message> <!-- First Run strings --> - <message name="IDS_FRE_SET_UP_CHROME" desc="Header text shown when the user is first setting up Chrome"> - Set up Chrome - </message> - <message name="IDS_FRE_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page"> - Sign in to get your bookmarks, history, passwords, and other settings on all your devices. - </message> - <message name="IDS_FRE_ACCEPT" desc="Text for button to accept being signed in"> - OK, got it - </message> <message name="IDS_FRE_SKIP_TEXT" desc="Text for second page skip button"> No thanks </message> - <message name="IDS_CHOOSE_ACCOUNT_SIGN_IN" desc="Sign in button for choose google account dialog [CHAR-LIMIT=20]"> - Sign in - </message> <message name="IDS_FRE_DONE" desc="Button to dismiss the sign-in screen once the user is done"> Done </message> <message name="IDS_FRE_SETTINGS" desc="Button that opens Chrome settings"> Settings </message> - <message name="IDS_FRE_ADD_ACCOUNT" desc="Text for adding another Google Account"> - Add account - </message> - <message name="IDS_MAKE_CHROME_YOURS" desc="Title for the signin promo that prompts the user to sign in to Chrome to have a personalized experirence. [CHAR-LIMIT=24]"> - Make Chrome yours - </message> - <message name="IDS_FRE_NO_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page when there are no accounts on the device."> - Add an account to get your bookmarks, history, passwords, and other settings on all your devices. - </message> - <message name="IDS_SIGN_IN_TO_CHROME_SUMMARY_VARIANT" desc="A variant of summary for the signin promo; lists reasons to sign in to Chrome."> - Sign in to access all your web stuff from any device - </message> - <message name="IDS_FRE_NO_ACCOUNTS" desc="Text for spinner when there is no google accounts [CHAR-LIMIT=40]"> - Add an account - </message> - <message name="IDS_FRE_HI_NAME" desc="Title welcoming the user by their name after they have signed in."> - Hi, <ph name="FULL_NAME">%1$s<ex>John Smith</ex></ph> - </message> - <message name="IDS_FRE_SIGNED_IN_DESCRIPTION" desc="Explanation of what gets synced after the user signed in"> - Your bookmarks, history, passwords, and other settings will be synced to your Google Account so you can use them on all your devices. You can choose what to sync in <ph name="BEGIN_LINK1"><LINK1></ph>Settings<ph name="END_LINK1"></LINK1></ph>. - </message> - <message name="IDS_FRE_SIGNED_IN_DESCRIPTION_UCA_ADDENDUM" desc="Additional explanation for child accounts that synced settings are managed by parents."> - Your parents help manage these settings. - </message> <message name="IDS_FRE_TOS_AND_PRIVACY" desc="Message explaining that use of Chrome is governed by Chrome's terms of service and privacy notice."> By using this application, you agree to Chrome’s <ph name="BEGIN_LINK1"><LINK1></ph>Terms of Service<ph name="END_LINK1"></LINK1></ph> and <ph name="BEGIN_LINK2"><LINK2></ph>Privacy Notice<ph name="END_LINK2"></LINK2></ph>. </message> @@ -1677,7 +1656,42 @@ <message name="IDS_FRE_WELCOME" desc="Text for greeting the user on Chrome First Run"> Welcome to Chrome </message> - <message name="IDS_ACCESSIBILITY_FRE_ACCOUNT_SPINNER" desc="Content description for the first run account drop down spinner."> + + <!-- Account Signin Strings --> + <message name="IDS_SIGNIN_SET_UP_CHROME" desc="Header text shown when the user is first setting up Chrome"> + Set up Chrome + </message> + <message name="IDS_CHOOSE_ACCOUNT_SIGN_IN" desc="Sign in button for choose google account dialog [CHAR-LIMIT=20]"> + Sign in + </message> + <message name="IDS_SIGNIN_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page"> + Sign in to get your bookmarks, history, passwords, and other settings on all your devices. + </message> + <message name="IDS_SIGNIN_ACCEPT" desc="Text for button to accept being signed in"> + OK, got it + </message> + <message name="IDS_SIGNIN_ADD_ACCOUNT" desc="Text for adding another Google Account"> + Add account + </message> + <message name="IDS_MAKE_CHROME_YOURS" desc="Title for the signin promo that prompts the user to sign in to Chrome to have a personalized experirence. [CHAR-LIMIT=24]"> + Make Chrome yours + </message> + <message name="IDS_SIGNIN_NO_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page when there are no accounts on the device."> + Add an account to get your bookmarks, history, passwords, and other settings on all your devices. + </message> + <message name="IDS_SIGNIN_SIGN_IN_TO_CHROME_SUMMARY_VARIANT" desc="A variant of summary for the signin promo; lists reasons to sign in to Chrome."> + Sign in to access all your web stuff from any device + </message> + <message name="IDS_SIGNIN_HI_NAME" desc="Title welcoming the user by their name after they have signed in."> + Hi, <ph name="FULL_NAME">%1$s<ex>John Smith</ex></ph> + </message> + <message name="IDS_SIGNIN_SIGNED_IN_DESCRIPTION" desc="Explanation of what gets synced after the user signed in"> + Your bookmarks, history, passwords, and other settings will be synced to your Google Account so you can use them on all your devices. You can choose what to sync in <ph name="BEGIN_LINK1"><LINK1></ph>Settings<ph name="END_LINK1"></LINK1></ph>. + </message> + <message name="IDS_SIGNIN_SIGNED_IN_DESCRIPTION_UCA_ADDENDUM" desc="Additional explanation for child accounts that synced settings are managed by parents."> + Your parents help manage these settings. + </message> + <message name="IDS_ACCESSIBILITY_SIGNIN_ACCOUNT_SPINNER" desc="Content description for the first run account drop down spinner."> Choose account </message>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb index f8d00276..c0d1b46 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Google doodle፦ <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">አቁም</translation> <translation id="1285320974508926690">ይህን ጣቢያ በጭራሽ አትተርጉም</translation> +<translation id="1291207594882862231">ታሪክ፣ ኩኪዎች፣ የጣቢያ ውሂብ፣ መሸጎጫን አጽዳ…</translation> <translation id="129553762522093515">በቅርብ ጊዜ የተዘጉ</translation> <translation id="1346090444609141578">እዚህ ምንም የተቀመጡ ገጾች የሉም</translation> <translation id="1369915414381695676"><ph name="SITE_NAME" /> ጣቢያ ተክሏል</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">ካሜራ</translation> <translation id="1623104350909869708">ይህ ገጽ ተጨማሪ መገናኛዎችን እንዳይፈጥር አግድ</translation> <translation id="1641113438599504367">የጥንቃቄ አሰሳ</translation> +<translation id="164269334534774161"><ph name="CREATION_TIME" /> ላይ የነበረ የዚህን ገጽ የመስመር ውጪ ቅጂ በመመልከት ላይ ነዎት</translation> <translation id="1643702317193804718">ገጹን ወደ <ph name="SOURCE_LANGUAGE" /> በመተርጎም ላይ…</translation> <translation id="1644574205037202324">ታሪክ</translation> <translation id="1647391597548383849">ካሜራዎን ይድረሱ</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">ገጹን አድስ</translation> <translation id="2709516037105925701">ራስ-ሙላ</translation> <translation id="271033894570825754">አዲስ</translation> +<translation id="2742271047622814453">በጣቢያዎች ላይ የተቀመጡ ምርጫዎች ሊሰረዙ ይችላሉ</translation> <translation id="2748463065602559597">ደህንነቱ የተጠበቀ የGoogle Chrome ገጽ እያዩ ነው።</translation> <translation id="2762000892062317888">አሁን</translation> <translation id="2770465223704140727">ከዝርዝር አስወግድ</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">ይዘቱን ማውረድ ይቀጥል?</translation> <translation id="3328801116991980348">የጣቢያ መረጃ</translation> <translation id="3350687908700087792">ሁሉንም ማንነት የማያሳውቅ ትሮችን ይዝጉ</translation> +<translation id="3351441609270267898">ነባር ውሂብ ከውጭ አስመጣ</translation> <translation id="3358663646935160692">ይህ መለያ የሚቀናበረው በ<ph name="DOMAIN_NAME" /> ነው። በሚቀናበር መለያ እየገቡ ነው፣ ይህም የChrome መገለጫዎ ቁጥጥር ለአስተዳዳሪው ይሰጠዋል። የእርስዎ Chrome ውሂብ እስከመጨረሻው ከዚህ መለያ ጋር የተሳሰረ ይሆናል። ከዚህ መለያ ማላቀቅ አካባቢያዊውን የChrome ውሂብ ይሰርዘዋል።</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">አዲስ ማንነት የማያሳውቅ ትር</translation> <translation id="3501331331116143684">ገጽ ከመስመር ውጭ <ph name="FOLDER_NAME" /> ላይ ተቀምጧል</translation> <translation id="3518985090088779359">ተቀበል እና ቀጥል</translation> +<translation id="3522247891732774234">ዝማኔ ይገኛል። ተጨማሪ አማራጮች</translation> <translation id="3527085408025491307">አቃፊ</translation> <translation id="3549644494707163724">ሁሉም የተመሳሰለ ውሂብ ከእራስዎ የተመሳሰለ ይለፍ ሐረግ ጋር ያመስጥሩ</translation> <translation id="360480449234699036">ገጹን ትተው ሳይሄዱ በድር ጣቢያዎች ላይ ስላሉ ርዕሶች ይወቁ። ለመፈለግ ይንኩ አንድ ቃል እና በዙሪያው ያለውን አውድ ወደ Google ፍለጋ ይልክና ትርጓሜዎችን፣ ስዕሎችን የፍለጋ ውጤቶችን እና ሌሎች ዝርዝሮችን ይመልሳል። @@ -221,7 +226,6 @@ <translation id="4195643157523330669">በአዲስ ትር ክፈት</translation> <translation id="4198229475320555619">የ<ph name="PAGE_SIZE_STRING" /> ዕልባት ከመስመር ውጭ ተቀምጧል</translation> <translation id="423410644998903704">Chrome እነሱን ለዚህ ጣቢያ ለማጋራት የፍቃዶች መዳረሻን ያስፈልገዋል።</translation> -<translation id="4247939399682707041">የዚህን መሣሪያ ውሂብ በ<ph name="ACCOUNT" /> ውሂብ ይተኩት። ወደ <ph name="ACCOUNT" /> መልሰው በመቀየር ነባሩን ውሂብዎን ሰርስረው ማውጣት ይችላሉ</translation> <translation id="424864128008805179">ከChrome ተዘግቶ ይወጣ?</translation> <translation id="4254813446494774748">የትርጉም ቋንቋ፦</translation> <translation id="4256782883801055595">የክፍት ምንጭ ፍቃዶች</translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">ጥበቃ የሚደረግለት ይዘት</translation> <translation id="6612856669344839356">ዕልባት አስቀምጥ</translation> <translation id="6627583120233659107">አቃፊ አርትዕ</translation> +<translation id="6647073004883890710"><ph name="PASSWORD_MANAGER_BRAND" /> የዚህ ጣቢያ የ<ph name="USERNAME" /> ይለፍ ቃልን እንዲያዘምን ይፈልጋሉ?</translation> <translation id="6656545060687952787">Chrome መሣሪያዎችን ለመቃኘት የአካባቢ መዳረሻ ያስፈልገዋል። <ph name="BEGIN_LINK" />ፍቃዶችን ያዘምኑ<ph name="END_LINK" /></translation> <translation id="666268767214822976">በአድራሻ አሞሌው ላይ እየተየቡ ሳለ ተዛማጅ መጠይቆችን ለማሳየት እና ታዋቂ ድር ጣቢያዎችን ለማሳየት የመገመቻ አገልግሎት ይጠቀሙ</translation> <translation id="666981079809192359">የChrome ግላዊነት ማስታወቂያ</translation> @@ -453,7 +458,6 @@ <translation id="6868088497967843822">የእርስዎን ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ መለያ ይግቡ</translation> <translation id="6945221475159498467">ይምረጡ</translation> <translation id="6963766334940102469">ዕልባቶችን ሰርዝ</translation> -<translation id="6964496835063002391">መለያ አክል</translation> <translation id="6965382102122355670">ይሁን</translation> <translation id="6973630695168034713">አቃፊዎች</translation> <translation id="6978479750597523876">የትርጉም ቅንብሮችን ዳግም ይጀመሩ</translation> @@ -485,6 +489,7 @@ <translation id="7324738665594301612">የኤችቲቲፒኤስ ገጾችን በGoogle አገልጋዮች ላይ ተኪ የማድረግ እንደ ሙከራ አንድ አካል እየፈተሽን ነው።</translation> <translation id="7346217184097589238">የተቀመጡ የጣቢያ ቅንብሮች አይሰረዙም፣ እና የእርስዎ የአሳሳ ልማዶችዎን ሊያንጸባርቁ ይችላሉ።</translation> <translation id="7346909386216857016">እሺ፣ ገባኝ</translation> +<translation id="7347770551817603360">የመስመር ውጭ ይዘት</translation> <translation id="7363354739009474003">«<ph name="VIDEO_TITLE" />»ን በመጫን ላይ</translation> <translation id="7366340029385295517">ወደ <ph name="SCREEN_NAME" /> በመውሰድ ላይ</translation> <translation id="7375125077091615385">ዓይነት፦</translation> @@ -543,6 +548,7 @@ <translation id="8050319187894766337">ገጽ ከመስመር ውጭ ተቀምጧል። ማከማቻ ሊሞላ ትንሽ ነው የቀረው።</translation> <translation id="8068648041423924542">የዕውቅና ማረጋገጫን መምረጥ አልተቻለም።</translation> <translation id="8069239273282989646">ከእመቃ በኋላ</translation> +<translation id="8073388330009372546">ምስሉን በአዲስ ትር ውስጥ ክፈት</translation> <translation id="8084156870963450514">ከማናቸውም መሣሪያ ላይ የእርስዎን የድር ነገሮች ለመድረስ በመለያ ይግቡ።</translation> <translation id="8106211421800660735">የብድር ካርድ ቁጥር</translation> <translation id="813082847718468539">የጣቢያ መረጃን ይመልከቱ</translation> @@ -565,6 +571,7 @@ <translation id="8413385045638830869">በመጀመሪያ ጠይቅ (የሚመከር)</translation> <translation id="8428213095426709021">ቅንብሮች</translation> <translation id="8429160401486700187">የተቀመጡ ገጾችን ሰርዝ</translation> +<translation id="8433057134996913067">ይህ ከአብዛኛዎቹ የድር ጣቢያዎች ዘግቶ ያስወጣዎታል።</translation> <translation id="8481940801237642152">ወደዚህ ጣቢያ ያልዎት ግንኙነት የግልዎ ብቻ ነው፣ ነገር ግን አንድ በአውታረ መረቡ ላይ ያለው ሰው የገጹን መልክ ሊለውጥ ይችላል።</translation> <translation id="8493948351860045254">ቦታ አስለቅቅ</translation> <translation id="8497726226069778601">እዚህ ምንም የሚታይ ነገር የለም... ገና</translation> @@ -609,6 +616,7 @@ <translation id="8987061207681586800">Chromeን የራስዎ ያድርጉት</translation> <translation id="9019902583201351841">በእርስዎ ወላጆች የሚቀናበር</translation> <translation id="9020607083536754075">የአሁኑን ትር ይዝጉና ወደ ቀዳሚው መተግበሪያ ይመለሱ</translation> +<translation id="9038649477754266430">ገጾችን ይበልጥ በፍጥነት ለመጫን የግመታ አገልግሎትን ይጠቀሙ</translation> <translation id="9050666287014529139">የይለፍ ሐረግ</translation> <translation id="9060538597317784206">መተግበሪያ <ph name="APP_NAME" />ን በPlay Store ላይ አሳይ። ደረጃ አሰጣጥ፦ <ph name="APP_RATING" />።</translation> <translation id="9063523880881406963">የዴስክቶፕ ጣቢያ ጠይቅን አጥፋ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb index 0169858a..09b062d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">رسم الشعار المبتكر من Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">إيقاف</translation> <translation id="1285320974508926690">عدم ترجمة هذا الموقع مطلقًا</translation> +<translation id="1291207594882862231">محو السجل وملفات تعريف الارتباط وبيانات المواقع وذاكرة التخزين المؤقت...</translation> <translation id="129553762522093515">المغلقة حديثًا</translation> <translation id="1346090444609141578">لا توجد صفحات محفوظة هنا</translation> <translation id="1369915414381695676">تمت إضافة الموقع <ph name="SITE_NAME" /></translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">الكاميرا</translation> <translation id="1623104350909869708">منع هذه الصفحة من إنشاء مربعات حوار إضافية.</translation> <translation id="1641113438599504367">التصفح الآمن</translation> +<translation id="164269334534774161">أنت تعرض نسخة بلا اتصال لهذه الصفحة من <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">جارٍ ترجمة الصفحة إلى <ph name="SOURCE_LANGUAGE" />...</translation> <translation id="1644574205037202324">السجل</translation> <translation id="1647391597548383849">الدخول إلى الكاميرا</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">تحديث الصفحة</translation> <translation id="2709516037105925701">الملء التلقائي</translation> <translation id="271033894570825754">جديدة</translation> +<translation id="2742271047622814453">قد يتم حذف التفضيلات المحفوظة على المواقع</translation> <translation id="2748463065602559597">أنت تعرض صفحة Google Chrome آمنة.</translation> <translation id="2762000892062317888">الآن</translation> <translation id="2770465223704140727">إزالة من القائمة</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">هل ترغب في الاستمرار في تنزيل المحتوى؟</translation> <translation id="3328801116991980348">معلومات موقع الويب</translation> <translation id="3350687908700087792">إغلاق كافة علامات تبويب التصفح المتخفي</translation> +<translation id="3351441609270267898">استيراد البيانات الحالية</translation> <translation id="3358663646935160692">تتم إدارة هذا الحساب من خلال <ph name="DOMAIN_NAME" />. لقد سجلت دخولك باستخدام حساب مُدار تمنح المشرف عليه إمكانية التحكم في ملفك الشخصي على Chrome. ستظل بياناتك على Chrome مرتبطة دائمًا بهذا الحساب. ويؤدي إلغاء الربط بهذا الحساب إلى حذف بيانات Chrome المحلية.</translation> <translation id="3384347053049321195">مشاركة صورة</translation> <translation id="3387650086002190359">أخفق تنزيل الملف <ph name="FILE_NAME" /> بسبب أخطاء في نظام الملف.</translation> @@ -177,6 +181,7 @@ <translation id="3492207499832628349">تابة جديدة للتصفح المتخفي</translation> <translation id="3501331331116143684">حُفظَت الصفحة بلا اتصال في <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">القبول والمتابعة</translation> +<translation id="3522247891732774234">التحديث متاح. مزيد من الخيارات</translation> <translation id="3527085408025491307">المجلد</translation> <translation id="3549644494707163724">تشفير جميع البيانات المتزامنة باستخدام عبارة مرور المزامنة</translation> <translation id="360480449234699036">اعرف موضوعات معنية بمواقع الويب بدون مغادرة الصفحة. تُرسل ميزة "المس للبحث" الكلمة والسياق المحيط بها إلى بحث Google، والتعريفات العائدة، والصور، ونتائج البحث، وتفاصيل أخرى. @@ -219,7 +224,6 @@ <translation id="4195643157523330669">فتح الإشارة في علامة تبويب جديدة</translation> <translation id="4198229475320555619">حُفظَت الإشارة المرجعية <ph name="PAGE_SIZE_STRING" /> بلا اتصال</translation> <translation id="423410644998903704">يحتاج Chrome إلى الحصول على حق الوصول إلى الأذونات لمشاركتها مع موقع الويب هذا.</translation> -<translation id="4247939399682707041">استبدال بيانات هذا الجهاز ببيانات <ph name="ACCOUNT" />. يمكنك استرداد بياناتك الحالية بالتبديل مرة ثانية إلى <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">هل تريد الخروج من Chrome؟</translation> <translation id="4254813446494774748">لغة الترجمة:</translation> <translation id="4256782883801055595">تراخيص البرامج مفتوحة المصدر</translation> @@ -424,6 +428,7 @@ <translation id="6612358246767739896">محتوى محمي</translation> <translation id="6612856669344839356">حفظ الإشارة المرجعية</translation> <translation id="6627583120233659107">تعديل مجلد</translation> +<translation id="6647073004883890710">هل تريد من <ph name="PASSWORD_MANAGER_BRAND" /> تحديث كلمة المرور لـ <ph name="USERNAME" /> لهذا الموقع؟</translation> <translation id="6656545060687952787">يحتاج Chrome للوصول إلى المواقع للبحث عن الأجهزة. <ph name="BEGIN_LINK" />تحديث الأذونات<ph name="END_LINK" />.</translation> <translation id="666268767214822976">يمكنك استخدام خدمة التوقعات لعرض طلبات البحث ذات الصلة ومواقع الويب الشائعة أثناء الكتابة في شريط العناوين</translation> <translation id="666981079809192359">إشعار خصوصية Chrome</translation> @@ -451,7 +456,6 @@ <translation id="6868088497967843822">سجّل الدخول للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على كل أجهزتك.</translation> <translation id="6945221475159498467">تحديد</translation> <translation id="6963766334940102469">حذف الإشارات المرجعية</translation> -<translation id="6964496835063002391">إضافة حساب</translation> <translation id="6965382102122355670">موافق</translation> <translation id="6973630695168034713">المجلدات</translation> <translation id="6978479750597523876">إعادة تعيين إعدادات الترجمة</translation> @@ -483,6 +487,7 @@ <translation id="7324738665594301612">نختبر إنشاء خادم وكيل لصفحات HTTPS عبر خوادم Google كجزء من التجربة.</translation> <translation id="7346217184097589238">لن يتم حذف إعدادات موقع الويب المحفوظة وقد تعكس عاداتك في التصفح.</translation> <translation id="7346909386216857016">موافق، حسنًا</translation> +<translation id="7347770551817603360">محتوى بلا اتصال</translation> <translation id="7363354739009474003">يتم الآن تحميل "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">جارٍ الإرسال إلى <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">النوع:</translation> @@ -543,6 +548,7 @@ <translation id="8050319187894766337">حفظت صفحة بلا اتصال. سعة ممتلئة.</translation> <translation id="8068648041423924542">يتعذر تحديد الشهادة.</translation> <translation id="8069239273282989646">بعد الضغط</translation> +<translation id="8073388330009372546">فتح الصورة بعلامة تبويب جديدة</translation> <translation id="8084156870963450514">سجّل الدخول للوصول إلى برامج الويب من أي جهاز.</translation> <translation id="8106211421800660735">رقم بطاقة الائتمان</translation> <translation id="813082847718468539">عرض معلومات الموقع</translation> @@ -565,6 +571,7 @@ <translation id="8413385045638830869">السؤال أولاً (موصى به)</translation> <translation id="8428213095426709021">إعدادات</translation> <translation id="8429160401486700187">حذف الصفحات المحفوظة</translation> +<translation id="8433057134996913067">سيؤدي هذا إلى خروجك من معظم مواقع الويب.</translation> <translation id="8481940801237642152">إن اتصالك بهذا الموقع له خصوصية، لكن قد يتمكن أحد الأشخاص على هذه الشبكة من تغيير مظهر الصفحة.</translation> <translation id="8493948351860045254">تفريغ بعض المساحة</translation> <translation id="8497726226069778601">لا يوجد شيء هنا... حتى الآن</translation> @@ -609,6 +616,7 @@ <translation id="8987061207681586800">تخصيص Chrome كما تريد</translation> <translation id="9019902583201351841">يديره والداك</translation> <translation id="9020607083536754075">إغلاق علامة التبويب الحالية والرجوع إلى التطبيق السابق</translation> +<translation id="9038649477754266430">استخدام إحدى خدمات التوقع لتحميل الصفحات بسرعة أكبر</translation> <translation id="9050666287014529139">عبارة المرور</translation> <translation id="9060538597317784206">عرض تطبيق <ph name="APP_NAME" /> في متجر Play. التقييم: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">إيقاف طلب موقع الويب لسطح المكتب</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb index e35606c..e4ff4ef 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bg"> +<translation id="1040144152982955218">Търсят се устройства… <ph name="BEGIN_LINK" />Получете помощ<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Предупреждение</translation> <translation id="10614374240317010">Незапазвани никога</translation> <translation id="1061441684050139317">Chrome се нуждае от достъп до микрофона, за да го сподели с този сайт.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Добавете профил, за да получите своите отметки, история, пароли и други настройки на всичките си устройства.</translation> <translation id="1098052486217676340">Завършено</translation> <translation id="1121094540300013208">Отчети за употребата и сигнали за сривове</translation> +<translation id="1137305377394488060">последния час</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1181037720776840403">Премахване</translation> <translation id="1197267115302279827">Преместване на отметки</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Драскулка на Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Стоп</translation> <translation id="1285320974508926690">Този сайт да не се превежда никога</translation> +<translation id="1291207594882862231">Изчистване на историята, „бисквитките“, данните за сайтове и кеша…</translation> <translation id="129553762522093515">Наскоро затворени</translation> <translation id="1346090444609141578">Тук няма запазени страници</translation> <translation id="1369915414381695676">Сайтът <ph name="SITE_NAME" /> е добавен</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1623104350909869708">Да не се създават допълнителни диалогови прозорци от тази страница</translation> <translation id="1641113438599504367">Безопасно сърфиране</translation> +<translation id="164269334534774161">Преглеждате офлайн копие на тази страница, създадено на <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Страницата се превежда на <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">История</translation> <translation id="1647391597548383849">Достъп до камерата</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Настройките ви за превод са нулирани.</translation> <translation id="2359808026110333948">Напред</translation> <translation id="2381756643783702095">Извеждане на запитване преди изпращане (препоръчително)</translation> +<translation id="2385560268894525395">последната седмица</translation> <translation id="2387895666653383613">Мащабиране на текста</translation> <translation id="238909021488141516">При изтеглянето на съдържанието възникна грешка.</translation> <translation id="2414886740292270097">Тъмно</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Опресняване на страницата</translation> <translation id="2709516037105925701">Автоматично попълване</translation> <translation id="271033894570825754">Създаване</translation> +<translation id="2742271047622814453">Запазените предпочитания за сайтове може да се изтрият</translation> <translation id="2748463065602559597">Преглеждате защитена страница в Google Chrome.</translation> <translation id="2762000892062317888">току-що</translation> <translation id="2770465223704140727">Премахване от списъка</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Този профил се управлява от <ph name="PARENT_NAME_1" /> и <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Авторски права <ph name="YEAR" /> Google Inc. Всички права запазени.</translation> <translation id="2968755619301702150">Визуализатор на сертификатите</translation> +<translation id="2996291259634659425">Създаване на пропуск</translation> <translation id="2996809686854298943">Изисква се URL адрес</translation> <translation id="3029704984691124060">Пропуските не са идентични</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Получете помощ<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Запазване на видеоклипа</translation> <translation id="306566828762083630">Хранилището на устройството ви е пълно. Моля, премахнете други мултимедийни файлове, за да освободите място.</translation> <translation id="307329814453917357">Извеждане на предложения за превод на страниците посредством Google Преводач</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Включете разрешенията за Chrome от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905">Съхранявани данни: <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">С отметка</translation> +<translation id="321773570071367578">Ако забравите пропуска си или искате да промените тази настройка, <ph name="BEGIN_LINK" />нулирайте синхронизирането<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Микрофон</translation> <translation id="3232754137068452469">Уеб приложение</translation> <translation id="3244271242291266297">ММ</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Искате ли да продължите с изтеглянето на съдържанието?</translation> <translation id="3328801116991980348">Информация за сайта</translation> <translation id="3350687908700087792">Затваряне на всички раздели в режим „инкогнито“</translation> +<translation id="3351441609270267898">Импортиране на съществуващите данни</translation> <translation id="3358663646935160692">Този профил се управлява от <ph name="DOMAIN_NAME" />. Влизате с управляван профил и давате на администратора му контрол над потребителския си профил в Chrome. Данните ви в браузъра ще бъдат свързани за постоянно с този профил. Прекъсването на връзката с него ще изтрие локалната информация в Chrome.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Нов раздел „инкогнито“</translation> <translation id="3501331331116143684">Стр. бе запазена офлайн във: „<ph name="FOLDER_NAME" />“</translation> <translation id="3518985090088779359">Приемам! Напред</translation> +<translation id="3522247891732774234">Налице е актуализация. Още опции</translation> <translation id="3527085408025491307">Папка</translation> <translation id="3549644494707163724">Всички синхронизирани данни да се шифроват със собствения ви пропуск за синхронизиране</translation> <translation id="360480449234699036">Научавайте за темите в уебсайтовете, без да напускате страницата. Функцията за търсене с докосване изпраща до Google Търсене определени думи и заобикалящия ги текст и така извежда определения, снимки, резултати и други подробности. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Принудително активиране на промяната на мащаба</translation> <translation id="3917783807003067648">Местоположението е блокирано</translation> <translation id="3927692899758076493">Безсерифен</translation> +<translation id="3931947361983910192">последните 4 седмици</translation> <translation id="393697183122708255">Не е налице активирано гласово търсене</translation> <translation id="3950820424414687140">Вход</translation> <translation id="3988213473815854515">Местоположението е разрешено</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Отваряне в нов раздел</translation> <translation id="4198229475320555619">Запазена е офлайн отметка с размер от <ph name="PAGE_SIZE_STRING" /></translation> <translation id="423410644998903704">Chrome се нуждае от достъп до разрешенията, за да ги сподели с този сайт.</translation> +<translation id="424864128008805179">Искате ли да излезете от Chrome?</translation> <translation id="4254813446494774748">Език за превод:</translation> <translation id="4256782883801055595">Лицензи за отворен код</translation> <translation id="4259722352634471385">Навигирането е блокирано: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">В бъдеще намиращите се в близост страници във Физическата мрежа ще се показват в списъка с известията ви</translation> <translation id="4498934959426056365">Генериране на ключ</translation> <translation id="4505554159887937799">Запазени офлайн</translation> +<translation id="4508440807153586353">Само някой с пропуска ви може да прочете шифрованите ви данни – той не се изпраща до Google, нито се съхранява от нас. Ако го забравите или искате да промените тази настройка, ще се наложи да нулирате синхронизирането. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{преди # ден}other{преди # дни}}</translation> <translation id="4522570452068850558">Подробности</translation> <translation id="4526249700380860531">Преглед и управление на запазените пароли на адрес <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Нов раздел</translation> <translation id="5271967389191913893">Устройството не може да отвори съдържанието за изтегляне.</translation> <translation id="5275558766013849309">Разделите и скорошните приложения ще са на едно място.</translation> +<translation id="5284584623296338184">Промените в отметките, историята, паролите и другите ви настройки вече няма да се синхронизират с профила ви в Google. Съществуващите ви данни обаче ще продължат да се съхраняват в него.</translation> <translation id="5301954838959518834">Добре, разбрах</translation> <translation id="5302048478445481009">Език</translation> <translation id="5304593522240415983">Това поле трябва да се попълни</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Редактиране на запазено име/парола или изключение</translation> <translation id="5442257541162692417">Редактиране на запаз. страница</translation> <translation id="544291274896356069">Ще напуснете режим „инкогнито“, ако тази връзка се отвори във външно приложение. Искате ли да продължите?</translation> +<translation id="5487521232677179737">Изчиств. на данните</translation> <translation id="5487729733663684359">Актуализациите на Chrome вече не се поддържат за тази версия на Android.</translation> <translation id="5511351932351731210">Да се изпращат винаги</translation> <translation id="5512137114520586844">Този профил се управлява от <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Преводач</translation> <translation id="5916664084637901428">Включено</translation> <translation id="5939518447894949180">Нулиране</translation> +<translation id="5965336165840183977">Така ще изчистите синхронизираните данни от всички устройства. Няма да излезете от профила си в Google. Запазените настройки за сайтове няма да се изтрият и може да отразяват навиците ви при сърфиране.</translation> <translation id="5968595432776860642">„<ph name="VIDEO_TITLE" />“ се възпроизвежда</translation> <translation id="6010869025736512584">Осъществява се достъп до видеовхода</translation> <translation id="6012342843556706400">Chrome се нуждае от достъп до местоположението, за да го сподели с този сайт.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Защитено съдържание</translation> <translation id="6612856669344839356">Запазване на отметката</translation> <translation id="6627583120233659107">Редактиране на папката</translation> +<translation id="6647073004883890710">Искате ли <ph name="PASSWORD_MANAGER_BRAND" /> да актуализира паролата за <ph name="USERNAME" /> за този сайт?</translation> <translation id="6656545060687952787">Chrome се нуждае от достъп до местоположението, за да сканира за устройства. <ph name="BEGIN_LINK" />Актуализиране на разрешенията<ph name="END_LINK" /></translation> <translation id="666268767214822976">Използване на услуга за предвиждания за показване на сродни заявки и популярни уебсайтове, докато пишете в адресната лента</translation> <translation id="666981079809192359">Съобщение за поверителност на Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Запазената страница не е налице офлайн</translation> <translation id="6722992508235227685">Вашите отметки, история, пароли и други настройки ще се синхронизират с профила ви в Google, за да можете да ги използвате на всичките си устройства. От <ph name="BEGIN_LINK1" />Настройки<ph name="END_LINK1" /> можете да изберете какво да се синхронизира.</translation> <translation id="6738867403308150051">Изтегля се…</translation> +<translation id="6762156594045689028">За да промените тази настройка, <ph name="BEGIN_LINK" />нулирайте синхронизирането<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Системата на Chrome за безопасно сърфиране ще се използва също за откриване на злонамерени страници и за да ви защитава от фишинг, злонамерен софтуер и опасни изтегляния.</translation> <translation id="6784675033504223784">Търсене на „<ph name="SEARCH_TERM" />“</translation> <translation id="6790428901817661496">Пускане</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Влезте в профила си, за да получите своите отметки, история, пароли и други настройки на всичките си устройства</translation> <translation id="6945221475159498467">Изберете</translation> <translation id="6963766334940102469">Изтриване на отметките</translation> -<translation id="6964496835063002391">Добавяне на профил</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Папки</translation> <translation id="6978479750597523876">Нулиране на настройките за превод</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Открита е бавна връзка</translation> <translation id="7057058088140140610">Кредитни карти и адреси посредством Google Payments</translation> <translation id="7063006564040364415">Не можа да се установи връзка със синхронизиращия сървър.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> иска да се сдвои със:</translation> +<translation id="7081639897063626814">Съхраняване на съществуващите данни отделно</translation> <translation id="7094922512924405309">Няма намиращи се в близост страници във Физическата мрежа</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> отворени раздела</translation> <translation id="7096034533295549981">Клип: Зарежда се</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Помощ<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Изтриване на отметката</translation> <translation id="7324738665594301612">Експериментално тестваме предаването на HTTPS страници през прокси сървърите на Google.</translation> +<translation id="7346217184097589238">Запазените настройки за сайтове няма да се изтрият и може да отразяват навиците ви при сърфиране.</translation> <translation id="7346909386216857016">Добре, разбрах</translation> +<translation id="7347770551817603360">Офлайн съдържание</translation> <translation id="7363354739009474003">„<ph name="VIDEO_TITLE" />“ се зарежда</translation> <translation id="7366340029385295517">Предава се към „<ph name="SCREEN_NAME" />“</translation> <translation id="7375125077091615385">Тип:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Потвърждаване на изтриването на идентификационните данни на устройството</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (Актуализирано: <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Моля, изчакайте...</translation> +<translation id="7499262814309712782">Профил за синхронизиране</translation> <translation id="7501135638693251872">Всички отметки</translation> <translation id="7521387064766892559">Javascript</translation> <translation id="7562080006725997899">Данните за сърфирането се изчистват</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Страницата е запазена. Мястото привършва.</translation> <translation id="8068648041423924542">Сертификатът не може да бъде избран.</translation> <translation id="8069239273282989646">След компресиране</translation> +<translation id="8073388330009372546">Отваряне в нов раздел</translation> <translation id="8084156870963450514">Влезте в профила си, за да имате достъп до всичките си неща в мрежата от всяко устройство</translation> <translation id="8106211421800660735">Номер на кредитната карта</translation> <translation id="813082847718468539">Преглед на информацията за сайта</translation> <translation id="8137558756159375272">При търсене с докосване избраната дума и текущата страница се изпращат като контекст до Google Търсене. Можете да изключите функцията от <ph name="BEGIN_LINK" />Настройки<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Не е запазена офлайн</translation> <translation id="8168435359814927499">Съдържание</translation> +<translation id="8173098127580644436">самото начало</translation> <translation id="8200772114523450471">Възобновяване</translation> <translation id="8209050860603202033">Отваряне на изображението</translation> <translation id="8218346974737627104">Потвърждаване на влизането в профила</translation> <translation id="8218934717680664417">Вече можете да търсите с едно докосване</translation> +<translation id="8223946939421658889">Изчистване на данните от</translation> <translation id="8261506727792406068">Изтриване</translation> <translation id="8275818695183729150">Разрешено (за търсения от адресната лента)</translation> +<translation id="8283853025636624853">Синхронизира се със: <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Стандартни раздели</translation> <translation id="8374821112118309944">Трябва да актуализирате TalkBack до по-нова версия.</translation> <translation id="8396312449826231789">Само одобрени сайтове</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Първо ще се извежда запитване (препоръчително)</translation> <translation id="8428213095426709021">Настройки</translation> <translation id="8429160401486700187">Изтриване на запазените страници</translation> +<translation id="8433057134996913067">Ще излезете от повечето уебсайтове.</translation> <translation id="8481940801237642152">Връзката ви с този сайт е частна, но някой в мрежата може да промени облика на страницата.</translation> <translation id="8493948351860045254">Освобождаване на място</translation> <translation id="8497726226069778601">Тук няма нищо… засега</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Връзката ви с този сайт е частна.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Навигирането не е възможно: <ph name="URL" /></translation> +<translation id="8979340629087822094">последния ден</translation> <translation id="8987061207681586800">Персонализирайте Chrome</translation> <translation id="9019902583201351841">Управлява се от родителите ви</translation> <translation id="9020607083536754075">Затваряне на текущия раздел и връщане към предишното приложение</translation> +<translation id="9038649477754266430">Използване на услуга за предвиждане с цел по-бързо зареждане на страниците</translation> <translation id="9050666287014529139">Парола</translation> <translation id="9060538597317784206">Преглед на приложението „<ph name="APP_NAME" />“ в Google Play Магазин. Оценка: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Изключване на функцията за заявяване на настолни сайтове</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb index 01ffd7e7..3775079 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ca"> +<translation id="1040144152982955218">S'estan cercant dispositius… <ph name="BEGIN_LINK" />Obteniu ajuda<ph name="END_LINK" />.</translation> <translation id="1056898198331236512">Advertiment</translation> <translation id="10614374240317010">Contrasenyes que no es desen mai</translation> <translation id="1061441684050139317">Chrome necessita accés al micròfon per compartir-lo amb aquest lloc web.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Afegiu un compte per tenir les adreces d'interès, l'historial, les contrasenyes i altres configuracions en tots els vostres dispositius.</translation> <translation id="1098052486217676340">Finalitzat</translation> <translation id="1121094540300013208">Informes d'ús i d'error</translation> +<translation id="1137305377394488060">de l'última hora</translation> <translation id="1178581264944972037">Pausa</translation> <translation id="1181037720776840403">Suprimeix</translation> <translation id="1197267115302279827">Mou les adreces d'interès</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Doodle de Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Atura</translation> <translation id="1285320974508926690">No tradueixis mai aquest lloc</translation> +<translation id="1291207594882862231">Esborra l'historial, les galetes, les dades del lloc, la memòria cau, etc.</translation> <translation id="129553762522093515">Tancades recentment</translation> <translation id="1346090444609141578">Aquí no hi ha pàgines desades</translation> <translation id="1369915414381695676">El lloc <ph name="SITE_NAME" /> s'ha afegit</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Càmera</translation> <translation id="1623104350909869708">Impedeix que aquesta pàgina creï diàlegs addicionals.</translation> <translation id="1641113438599504367">Navegació segura</translation> +<translation id="164269334534774161">Es mostra una còpia sense connexió d'aquesta pàgina creada el dia <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">La pàgina s'està traduint a <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Historial</translation> <translation id="1647391597548383849">Accés a la càmera</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">S'ha restablert la configuració de traducció.</translation> <translation id="2359808026110333948">Continua</translation> <translation id="2381756643783702095">Demana permís abans de fer cap enviament (recomanat)</translation> +<translation id="2385560268894525395">de l'última setmana</translation> <translation id="2387895666653383613">Canvia la mida del text</translation> <translation id="238909021488141516">S'ha produït un error en baixar el contingut.</translation> <translation id="2414886740292270097">Fosc</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Actualitza la pàgina</translation> <translation id="2709516037105925701">Emplenament autom.</translation> <translation id="271033894570825754">Nou</translation> +<translation id="2742271047622814453">És possible que se suprimeixin les preferències desades per als llocs web</translation> <translation id="2748463065602559597">Esteu visualitzant una pàgina segura de Google Chrome.</translation> <translation id="2762000892062317888">ara mateix</translation> <translation id="2770465223704140727">Suprimeix de la llista</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412"><ph name="PARENT_NAME_1" /> i <ph name="PARENT_NAME_2" /> gestionen aquest compte.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Tots els drets reservats.</translation> <translation id="2968755619301702150">Lector de certificats</translation> +<translation id="2996291259634659425">Creeu una frase de contrasenya</translation> <translation id="2996809686854298943">Es necessita un URL</translation> <translation id="3029704984691124060">Les frases de contrasenya no coincideixen</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obteniu ajuda<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Desa el vídeo</translation> <translation id="306566828762083630">L'emmagatzematge del dispositiu està ple. Traieu-ne altres fitxers multimèdia per alliberar espai.</translation> <translation id="307329814453917357">Proposa'm de traduir les pàgines amb el Traductor de Google</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Activeu els permisos per a Chrome a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de dades desades</translation> <translation id="3207960819495026254">S'ha afegit a les adreces d'interès.</translation> +<translation id="321773570071367578">Si oblideu la frase de contrasenya o voleu canviar aquesta configuració, <ph name="BEGIN_LINK" />restabliu la sincronització<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Micròfon</translation> <translation id="3232754137068452469">Aplicació web</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Voleu baixar el contingut?</translation> <translation id="3328801116991980348">Informació del lloc</translation> <translation id="3350687908700087792">Tanca totes les pestanyes d'incògnit</translation> +<translation id="3351441609270267898">Importa les dades actuals</translation> <translation id="3358663646935160692"><ph name="DOMAIN_NAME" /> s'encarrega de gestionar aquest compte. Inicieu la sessió amb un compte gestionat, de manera que concediu al seu administrador el control sobre el vostre perfil de Chrome. Les vostres dades de Chrome estaran vinculades a aquest compte de manera permanent. Si desconnecteu aquest compte se suprimiran les dades de Chrome locals.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Pestanya d'incògnit nova</translation> <translation id="3501331331116143684">La pàgina s'ha desat sense connexió a <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Accepta i continua</translation> +<translation id="3522247891732774234">Hi ha una actualització disponible. Més opcions</translation> <translation id="3527085408025491307">Carpeta</translation> <translation id="3549644494707163724">Encripta totes les dades sincronitzades amb la vostra frase de contrasenya de sincronització</translation> <translation id="360480449234699036">Consulteu més informació sobre els temes en altres llocs web sense sortir de la pàgina. La funció Toca per cercar envia una paraula i el seu context a la Cerca de Google i ofereix com a resultat definicions, imatges, resultats de la cerca i altres detalls. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Força l'activació del zoom</translation> <translation id="3917783807003067648">La ubicació està bloquejada</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">de les quatre últimes setmanes</translation> <translation id="393697183122708255">La cerca per veu no està disponible</translation> <translation id="3950820424414687140">Inici de sessió</translation> <translation id="3988213473815854515">La ubicació es permet</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Obre en una pestanya nova</translation> <translation id="4198229475320555619">L'adreça d'interès (<ph name="PAGE_SIZE_STRING" />) s'ha desat sense connexió</translation> <translation id="423410644998903704">Chrome necessita accés als permisos per compartir-los amb aquest lloc web.</translation> +<translation id="424864128008805179">Voleu tancar la sessió de Chrome?</translation> <translation id="4254813446494774748">Idioma de la traducció:</translation> <translation id="4256782883801055595">Llicències de programari lliure</translation> <translation id="4259722352634471385">S'ha bloquejat la navegació: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Les pàgines del Web físic que es detectin a prop es mostraran a la llista de notificacions</translation> <translation id="4498934959426056365">Generació de claus</translation> <translation id="4505554159887937799">Desades sense connexió</translation> +<translation id="4508440807153586353">Només els usuaris que sàpiguen la vostra frase de contrasenya poden llegir les dades que encripteu. La frase de contrasenya no s'envia a Google, i Google tampoc no l'emmagatzema. Si l'oblideu o voleu canviar aquesta configuració, heu de restablir la sincronització. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{fa # dia}other{fa # dies}}</translation> <translation id="4522570452068850558">Detalls</translation> <translation id="4526249700380860531">Consulteu i gestioneu les contrasenyes desades a <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Pestanya nova</translation> <translation id="5271967389191913893">El dispositiu no pot obrir el contingut que s'ha de baixar.</translation> <translation id="5275558766013849309">Les pestanyes conviuran amb les aplicacions recents.</translation> +<translation id="5284584623296338184">Els canvis fets a les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració es deixaran de sincronitzar amb el vostre compte de Google. No obstant això, les dades actuals hi continuaran emmagatzemades.</translation> <translation id="5301954838959518834">D'acord, entesos</translation> <translation id="5302048478445481009">Idioma</translation> <translation id="5304593522240415983">Aquest camp no pot estar en blanc</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Editar el nom, la contrasenya o l'excepció desats</translation> <translation id="5442257541162692417">Editeu la pàgina desada</translation> <translation id="544291274896356069">Si obriu aquest enllaç en una aplicació externa abandonareu el mode d'incògnit. Voleu continuar?</translation> +<translation id="5487521232677179737">Esborra les dades</translation> <translation id="5487729733663684359">Aquesta versió d'Android ja no admet les actualitzacions de Chrome.</translation> <translation id="5511351932351731210">Envia sempre</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" /> gestiona aquest compte.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Traductor de Google</translation> <translation id="5916664084637901428">Activat</translation> <translation id="5939518447894949180">Restableix</translation> +<translation id="5965336165840183977">S'esborraran les dades sincronitzades de tots els dispositius. No es tancarà la sessió del vostre compte de Google. La configuració desada del lloc no s'esborrarà i pot reflectir els vostres hàbits de navegació.</translation> <translation id="5968595432776860642">S'està reproduint "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">S'està accedint a l'entrada de vídeo</translation> <translation id="6012342843556706400">Chrome necessita accés a la ubicació per compartir-la amb aquest lloc web.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Contingut protegit</translation> <translation id="6612856669344839356">Desa l’adreça d'interès</translation> <translation id="6627583120233659107">Edita la carpeta</translation> +<translation id="6647073004883890710">Voleu que <ph name="PASSWORD_MANAGER_BRAND" /> actualitzi la contrasenya de l'usuari <ph name="USERNAME" /> per a aquest lloc?</translation> <translation id="6656545060687952787">Chrome necessita tenir accés a la ubicació per poder cercar dispositius. <ph name="BEGIN_LINK" />Actualitza els permisos<ph name="END_LINK" /></translation> <translation id="666268767214822976">Utilitza un servei de predicció per mostrar consultes relacionades i llocs web populars mentre escriviu a la barra d'adreces</translation> <translation id="666981079809192359">Avís de privadesa de Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">La pàgina desada no està disponible sense connexió</translation> <translation id="6722992508235227685">Les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració se sincronitzaran amb el vostre compte de Google, perquè els pugueu utilitzar en tots els dispositius. Per triar què voleu sincronitzar, aneu a <ph name="BEGIN_LINK1" />Configuració<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Baixada en curs...</translation> +<translation id="6762156594045689028">Per canviar aquesta configuració, <ph name="BEGIN_LINK" />restabliu la sincronització<ph name="END_LINK" /></translation> <translation id="6770414673596662518">El sistema de navegació segura de Chrome també s'utilitzarà per detectar pàgines malicioses i per protegir-vos de la pesca (suplantació d'identitat), de programari maliciós i de baixades perjudicials.</translation> <translation id="6784675033504223784">Cerqueu "<ph name="SEARCH_TERM" />"</translation> <translation id="6790428901817661496">Reprodueix</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Inicieu la sessió per tenir les adreces d'interès, l'historial, les contrasenyes i altres configuracions en tots els vostres dispositius</translation> <translation id="6945221475159498467">Selecciona</translation> <translation id="6963766334940102469">Suprimeix les adreces d'interès</translation> -<translation id="6964496835063002391">Afegeix un compte</translation> <translation id="6965382102122355670">D'acord</translation> <translation id="6973630695168034713">Carpetes</translation> <translation id="6978479750597523876">Restableix la configuració de traducció</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">S'ha detectat una connexió lenta</translation> <translation id="7057058088140140610">Targetes de crèdit i adreces que fan servir Google Payments</translation> <translation id="7063006564040364415">No s'ha pogut connectar amb el servidor de sincronització.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> es vol vincular amb:</translation> +<translation id="7081639897063626814">Mantén les dades actuals separades</translation> <translation id="7094922512924405309">No s'ha trobat cap pàgina del Web físic a prop</translation> <translation id="7095930899177687653">S'han obert <ph name="OPEN_TABS" /> pestanyes</translation> <translation id="7096034533295549981">Carregant vídeo</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ajuda<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Suprimeix l'adreça d'interès</translation> <translation id="7324738665594301612">Estem fent proves d'ús de servidors de Google com a servidors intermediaris per a pàgines HTTPS com a part d'un experiment.</translation> +<translation id="7346217184097589238">La configuració desada del lloc no s'esborrarà i pot reflectir els vostres hàbits de navegació.</translation> <translation id="7346909386216857016">D'acord</translation> +<translation id="7347770551817603360">Contingut sense connexió</translation> <translation id="7363354739009474003">S'està carregant "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">S'està emetent a <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Tipus:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Confirma la supressió de les credencials del dispositiu</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (última actualització: <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Espereu...</translation> +<translation id="7499262814309712782">Compte de sincronització</translation> <translation id="7501135638693251872">Totes adreces d'interès</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">S'estan esborrant les dades de navegació</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">La pàgina s'ha desat sense connexió; l'emmagatzematge està gairebé ple.</translation> <translation id="8068648041423924542">No es pot seleccionar el certificat.</translation> <translation id="8069239273282989646">Després de la compressió</translation> +<translation id="8073388330009372546">Obre en una pestanya nova</translation> <translation id="8084156870963450514">Inicieu la sessió per accedir a tots els vostres recursos d'Internet des de qualsevol dispositiu.</translation> <translation id="8106211421800660735">Número de targeta de crèdit</translation> <translation id="813082847718468539">Mostra la informació del lloc</translation> <translation id="8137558756159375272">La funció Toca per cercar envia la paraula seleccionada i la pàgina actual com a context a la Cerca de Google. La podeu desactivar a <ph name="BEGIN_LINK" />Configuració<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">No s'ha desat sense connexió</translation> <translation id="8168435359814927499">Contingut</translation> +<translation id="8173098127580644436">des de l'inici (totes)</translation> <translation id="8200772114523450471">Reempren</translation> <translation id="8209050860603202033">Obre la imatge</translation> <translation id="8218346974737627104">Confirmació de l'inici de sessió</translation> <translation id="8218934717680664417">Ara podeu fer cerques amb un sol toc</translation> +<translation id="8223946939421658889">Esborra les dades</translation> <translation id="8261506727792406068">Elimina</translation> <translation id="8275818695183729150">Permet (per a les cerques a la barra d'adreces)</translation> +<translation id="8283853025636624853">Se sincronitza amb <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Pestanyes estàndard</translation> <translation id="8374821112118309944">Heu de fer l'actualització de TalkBack a una versió més recent</translation> <translation id="8396312449826231789">Només els llocs aprovats</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Pregunta-m'ho abans (recomanat)</translation> <translation id="8428213095426709021">Configuració</translation> <translation id="8429160401486700187">Suprimeix les pàgines desades</translation> +<translation id="8433057134996913067">Amb aquesta acció es tancarà la sessió de la majoria de llocs web.</translation> <translation id="8481940801237642152">La vostra connexió amb aquest lloc és privada, però és possible que algun usuari de la xarxa pugui canviar l'aspecte de la pàgina.</translation> <translation id="8493948351860045254">Allibera espai</translation> <translation id="8497726226069778601">Aquí encara no hi ha contingut per mostrar</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">La vostra connexió amb aquest lloc és privada.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">No es pot accedir a la navegació: <ph name="URL" /></translation> +<translation id="8979340629087822094">d'ahir</translation> <translation id="8987061207681586800">Personalitzar Chrome</translation> <translation id="9019902583201351841">Gestionat pels pares</translation> <translation id="9020607083536754075">Tanca la pestanya actual i torna a l'aplicació anterior</translation> +<translation id="9038649477754266430">Utilitzeu un servei de predicció per poder carregar les pàgines més ràpidament</translation> <translation id="9050666287014529139">Frase de contrasenya</translation> <translation id="9060538597317784206">Mostra l'aplicació <ph name="APP_NAME" /> a Play Store. Puntuació: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Desactiva la sol·licitud del lloc per a ordinadors</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb index 59b3385..d939f18 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="cs"> +<translation id="1040144152982955218">Vyhledávání zařízení… <ph name="BEGIN_LINK" />Zobrazit nápovědu<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Upozornění</translation> <translation id="10614374240317010">Nikdy se neukládají</translation> <translation id="1061441684050139317">Aby Chrome mohl s těmito webovými stránkami sdílet mikrofon, musí k němu mít přístup.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Přidejte účet a synchronizujte záložky, historii, hesla a další nastavení do všech svých zařízení.</translation> <translation id="1098052486217676340">Dokončeno</translation> <translation id="1121094540300013208">Zprávy o využití a selhání</translation> +<translation id="1137305377394488060">z uplynulé hodiny</translation> <translation id="1178581264944972037">Pozastavit</translation> <translation id="1181037720776840403">Odebrat</translation> <translation id="1197267115302279827">Přesunutí záložek</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Sváteční logo Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Zastavit</translation> <translation id="1285320974508926690">Tento web nikdy nepřekládat</translation> +<translation id="1291207594882862231">Vymazat historii, soubory cookie, data webů, mezipaměť…</translation> <translation id="129553762522093515">Nedávno zavřené</translation> <translation id="1346090444609141578">Žádné uložené stránky tu nejsou</translation> <translation id="1369915414381695676">Byl přidán web <ph name="SITE_NAME" /></translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Bránit této stránce ve vytváření dalších dialogových oken</translation> <translation id="1641113438599504367">Bezpečné prohlížení</translation> +<translation id="164269334534774161">Prohlížíte si offline kopii této stránky z <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Překlad stránky do jazyka: <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Historie</translation> <translation id="1647391597548383849">Přístup k fotoaparátu</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Nastavení překladů bylo resetováno.</translation> <translation id="2359808026110333948">Pokračovat</translation> <translation id="2381756643783702095">Před odesláním se zeptat (doporučeno)</translation> +<translation id="2385560268894525395">z uplynulého týdne</translation> <translation id="2387895666653383613">Zvětšení/zmenšení textu</translation> <translation id="238909021488141516">Při stahování obsahu došlo k chybě.</translation> <translation id="2414886740292270097">Tmavé</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Obnovit stránku</translation> <translation id="2709516037105925701">Automatické vyplňování</translation> <translation id="271033894570825754">Nové</translation> +<translation id="2742271047622814453">Může dojít ke smazání uložených nastavení na webech</translation> <translation id="2748463065602559597">Zobrazujete zabezpečenou stránku Google Chrome.</translation> <translation id="2762000892062317888">právě teď</translation> <translation id="2770465223704140727">Odstranit ze seznamu</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Tento účet spravují uživatelé <ph name="PARENT_NAME_1" /> a <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Všechna práva vyhrazena.</translation> <translation id="2968755619301702150">Prohlížeč certifikátů</translation> +<translation id="2996291259634659425">Vytvoření heslové fráze</translation> <translation id="2996809686854298943">Je požadována adresa URL</translation> <translation id="3029704984691124060">Heslové fráze se neshodují</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Zobrazit nápovědu<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Uložit video</translation> <translation id="306566828762083630">Úložný prostor v zařízení je plný. Místo získáte odstraněním jiných mediálních souborů.</translation> <translation id="307329814453917357">Nabízet překlad stránek pomocí Překladače Google</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Oprávnění pro Chrome zapnete v <ph name="BEGIN_LINK" />Nastavení pro Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905">Uložená data: <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">Přidáno do záložek</translation> +<translation id="321773570071367578">Pokud jste heslovou frázi zapomněli nebo toto nastavení chcete změnit, <ph name="BEGIN_LINK" />resetujte synchronizaci<ph name="END_LINK" />.</translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Webová aplikace</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Chcete pokračovat ke stažení obsahu?</translation> <translation id="3328801116991980348">Informace o stránkách</translation> <translation id="3350687908700087792">Zavřít všechny anonymní karty</translation> +<translation id="3351441609270267898">Import existujících dat</translation> <translation id="3358663646935160692">Tento účet spravuje <ph name="DOMAIN_NAME" />. Přihlašujete se pomocí spravovaného účtu a poskytujete jeho správci kontrolu nad vaším profilem Chrome. Údaje Chrome budou trvale přidruženy k tomuto účtu. Odpojením od tohoto účtu budou místní údaje Chrome trvale smazány.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Nová anonymní karta</translation> <translation id="3501331331116143684">Stránka byla uložena offline do <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">PŘIJMOUT A POKRAČOVAT</translation> +<translation id="3522247891732774234">K dispozici je aktualizace. Další možnosti</translation> <translation id="3527085408025491307">Složka</translation> <translation id="3549644494707163724">Šifrovat synchronizovaná data pomocí vlastní heslové fráze pro synchronizaci.</translation> <translation id="360480449234699036">Vyhledávejte informace o tématech zmíněných na stránce, aniž byste stránku museli opustit. Klepnutím na Vyhledat odešlete slovo a okolní kontext do Vyhledávání Google, které vrátí definice, obrázky, výsledky vyhledávání a další podrobnosti. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Vynutit aktivaci přiblížení</translation> <translation id="3917783807003067648">Přístup k poloze je blokován</translation> <translation id="3927692899758076493">Bezpatková</translation> +<translation id="3931947361983910192">z posledních 4 týdnů</translation> <translation id="393697183122708255">Hlasové vyhledávání není k dispozici</translation> <translation id="3950820424414687140">Přihlaste se</translation> <translation id="3988213473815854515">Přístup k poloze je povolen</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Otevřít na nové kartě</translation> <translation id="4198229475320555619">Záložka uložená offline (<ph name="PAGE_SIZE_STRING" />)</translation> <translation id="423410644998903704">Aby Chrome mohl s těmito webovými stránkami sdílet oprávnění, musí k nim mít přístup.</translation> +<translation id="424864128008805179">Odhlásit se z Chromu?</translation> <translation id="4254813446494774748">Jazyk překladu:</translation> <translation id="4256782883801055595">Licence open source</translation> <translation id="4259722352634471385">Navigace je blokována: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Budoucí stránky fyzického webu v okolí se budou zobrazovat v seznamu oznámení</translation> <translation id="4498934959426056365">Generování klíče</translation> <translation id="4505554159887937799">Uloženo offline</translation> +<translation id="4508440807153586353">Vaše šifrovaná data mohou číst pouze uživatelé, kteří mají vaši heslovou frázi. Heslová fráze se neodesílá do Googlu a není na Googlu uložena. Pokud heslovou frázi zapomenete nebo toto nastavení budete chtít změnit, bude synchronizaci potřeba resetovat. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{před # dnem}few{před # dny}many{před # dne}other{před # dny}}</translation> <translation id="4522570452068850558">Podrobnosti</translation> <translation id="4526249700380860531">Uložená hesla můžete zobrazit a upravit na adrese <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Nová karta</translation> <translation id="5271967389191913893">Zařízení obsah ke stažení nemůže otevřít.</translation> <translation id="5275558766013849309">Karty se budou zobrazovat vedle nedávných aplikací.</translation> +<translation id="5284584623296338184">Změny záložek, historie, hesel a dalších nastavení se již nebudou synchronizovat do vašeho účtu Google. Vaše existující data však v účtu Google uložena zůstanou.</translation> <translation id="5301954838959518834">Ano, chápu</translation> <translation id="5302048478445481009">Jazyk</translation> <translation id="5304593522240415983">Toto pole nesmí být prázdné</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Úprava uloženého jména a hesla nebo výjimky</translation> <translation id="5442257541162692417">Upravte uloženou stránku</translation> <translation id="544291274896356069">Pokud tento odkaz otevřete v externí aplikaci, opustíte anonymní režim. Chcete pokračovat?</translation> +<translation id="5487521232677179737">Vymazat data</translation> <translation id="5487729733663684359">V této verzi platformy Android již aktualizace prohlížeče Chrome nejsou podporovány.</translation> <translation id="5511351932351731210">Vždy odesílat</translation> <translation id="5512137114520586844">Tento účet je spravován uživatelem <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Překladač Google</translation> <translation id="5916664084637901428">Zapnuto</translation> <translation id="5939518447894949180">Resetovat</translation> +<translation id="5965336165840183977">Tímto vymažete synchronizovaná data ze všech zařízení. Nebudete odhlášeni ze svého účtu Google. Uložená nastavení webů nebudou smazána a mohou vypovídat o vašich zvycích při prohlížení.</translation> <translation id="5968595432776860642">Přehrávání videa <ph name="VIDEO_TITLE" /></translation> <translation id="6010869025736512584">Přístup k vstupu videa</translation> <translation id="6012342843556706400">Aby Chrome mohl s těmito webovými stránkami sdílet polohu, musí k ní mít přístup.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Chráněný obsah</translation> <translation id="6612856669344839356">Uložit záložku</translation> <translation id="6627583120233659107">Upravit složku</translation> +<translation id="6647073004883890710">Chcete, aby aplikace <ph name="PASSWORD_MANAGER_BRAND" /> aktualizovala heslo uživatele <ph name="USERNAME" /> pro tento web?</translation> <translation id="6656545060687952787">K vyhledání zařízení Chrome potřebuje přístup k informacím o poloze. <ph name="BEGIN_LINK" />Aktualizovat oprávnění<ph name="END_LINK" /></translation> <translation id="666268767214822976">Používat službu předpovídání k zobrazení souvisejících dotazů a oblíbených webových stránek.</translation> <translation id="666981079809192359">Ochrana soukromí v Chromu</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Uložená stránka není k dispozici offline</translation> <translation id="6722992508235227685">Vaše záložky, historie, hesla a další nastavení budou synchronizována do účtu Google, abyste je mohli používat ve všech svých zařízeních. Položky, které chcete synchronizovat, můžete vybrat v <ph name="BEGIN_LINK1" />Nastavení<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Stahování…</translation> +<translation id="6762156594045689028">Chcete-li toto nastavení změnit, <ph name="BEGIN_LINK" />resetujte synchronizaci<ph name="END_LINK" />.</translation> <translation id="6770414673596662518">Chrome bude také používat systém Bezpečné prohlížení, který umožňuje zjistit škodlivé stránky a ochránit vás před phishingem, malwarem a škodlivými soubory ke stažení.</translation> <translation id="6784675033504223784">Vyhledat výraz „<ph name="SEARCH_TERM" />“</translation> <translation id="6790428901817661496">Přehrát</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Přihlaste se a synchronizujte záložky, historii, hesla a další nastavení do všech svých zařízení.</translation> <translation id="6945221475159498467">Vybrat</translation> <translation id="6963766334940102469">Smazat záložky</translation> -<translation id="6964496835063002391">Přidat účet</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Složky</translation> <translation id="6978479750597523876">Resetování nastavení překladů</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Bylo zjištěno pomalé připojení.</translation> <translation id="7057058088140140610">Platební karty a adresy pomocí služby Google Playments</translation> <translation id="7063006564040364415">K synchronizačnímu serveru se nelze připojit.</translation> +<translation id="7074853159844403180">Web <ph name="SITE" /> se chce spárovat s:</translation> +<translation id="7081639897063626814">Uchovat existující data odděleně</translation> <translation id="7094922512924405309">V okolí nebyly nalezeny žádné stránky fyzického webu</translation> <translation id="7095930899177687653">Otevřené karty: <ph name="OPEN_TABS" /></translation> <translation id="7096034533295549981">Načítání videa</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Nápověda<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Smazat záložku</translation> <translation id="7324738665594301612">Jako součást experimentu testujeme načítání stránek HTTPS prostřednictvím proxy serverů společnosti Google.</translation> +<translation id="7346217184097589238">Uložená nastavení webů nebudou smazána a mohou vypovídat o vašich zvycích při prohlížení.</translation> <translation id="7346909386216857016">OK, rozumím</translation> +<translation id="7347770551817603360">Offline obsah</translation> <translation id="7363354739009474003">Načítání videa <ph name="VIDEO_TITLE" /></translation> <translation id="7366340029385295517">Odesílání do zařízení <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Typ:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Potvrdit vymazání identifikačních údajů zařízení</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (aktualizováno <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Čekejte prosím…</translation> +<translation id="7499262814309712782">Účet používaný k synchronizaci</translation> <translation id="7501135638693251872">Všechny záložky</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Mazání údajů o prohlížení</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Stránka byla uložena offline. Úložiště je téměř plné.</translation> <translation id="8068648041423924542">Certifikát nelze vybrat.</translation> <translation id="8069239273282989646">Po kompresi</translation> +<translation id="8073388330009372546">Otevřít na nové kartě</translation> <translation id="8084156870963450514">Chcete-li mít přístup k webovému obsahu ve všech zařízeních, přihlaste se.</translation> <translation id="8106211421800660735">Číslo platební karty</translation> <translation id="813082847718468539">Zobrazit informace o stránkách</translation> <translation id="8137558756159375272">Vyhledání klepnutím odešle vybrané slovo a aktuální stránku jako kontext do Vyhledávání Google. Tuto funkci můžete vypnout v <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Není uloženo offline</translation> <translation id="8168435359814927499">Obsah</translation> +<translation id="8173098127580644436">od počátku věků</translation> <translation id="8200772114523450471">Pokračovat</translation> <translation id="8209050860603202033">Otevřít obrázek</translation> <translation id="8218346974737627104">Potvrzení přihlášení</translation> <translation id="8218934717680664417">Nyní můžete vyhledávat jedním klepnutím</translation> +<translation id="8223946939421658889">Vymazat data</translation> <translation id="8261506727792406068">Vymazat</translation> <translation id="8275818695183729150">Povolit (pro vyhledávání z adresního řádku)</translation> +<translation id="8283853025636624853">Data se synchronizují do účtu <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Standardní karty</translation> <translation id="8374821112118309944">Aplikaci TalkBack je potřeba aktualizovat na novější verzi.</translation> <translation id="8396312449826231789">Pouze schválené weby</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Nejprve se dotázat (doporučeno)</translation> <translation id="8428213095426709021">Nastavení</translation> <translation id="8429160401486700187">Smazat uložené stránky</translation> +<translation id="8433057134996913067">Budete odhlášeni z většiny webů.</translation> <translation id="8481940801237642152">Spojení s tímto webem je soukromé, avšak některý uživatel v síti může být schopen změnit vzhled stránky.</translation> <translation id="8493948351860045254">Uvolnit místo</translation> <translation id="8497726226069778601">Zatím tu nic není...</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Spojení s tímto webem je soukromé.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Navigace není dosažitelná: <ph name="URL" /></translation> +<translation id="8979340629087822094">z uplynulého dne</translation> <translation id="8987061207681586800">Přizpůsobte si Chrome</translation> <translation id="9019902583201351841">Spravováno vašimi rodiči</translation> <translation id="9020607083536754075">Zavřít aktuální kartu a vrátit se do předchozí aplikace</translation> +<translation id="9038649477754266430">Používat službu předpovídání k rychlejšímu načítání stránek</translation> <translation id="9050666287014529139">Heslová fráze</translation> <translation id="9060538597317784206">Zobrazit aplikaci <ph name="APP_NAME" /> v Obchodě Play. Hodnocení: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Vypnout funkci Verzi webu pro PC</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb index b682671..26f4346 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="da"> +<translation id="1040144152982955218">Søger efter enheder... <ph name="BEGIN_LINK" />få hjælp<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Advarsel</translation> <translation id="10614374240317010">Aldrig gemt</translation> <translation id="1061441684050139317">Chrome skal have adgang til mikrofonen for at kunne dele den med dette website.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Tilføj en konto for at få adgang til bogmærker, historik og andre indstillinger på alle dine enheder.</translation> <translation id="1098052486217676340">Afsluttet</translation> <translation id="1121094540300013208">Forbrugs- og nedbrudsrapporter</translation> +<translation id="1137305377394488060">den seneste time</translation> <translation id="1178581264944972037">Pause</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1197267115302279827">Flyt bogmærker</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google-doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Stop</translation> <translation id="1285320974508926690">Oversæt aldrig dette website</translation> +<translation id="1291207594882862231">Ryd historik, cookies, websitedata, cache...</translation> <translation id="129553762522093515">Senest lukkede</translation> <translation id="1346090444609141578">Der er ingen gemte sider her</translation> <translation id="1369915414381695676">Websitet <ph name="SITE_NAME" /> blev tilføjet</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Undgå, at denne side opretter yderligere dialogbokse</translation> <translation id="1641113438599504367">Sikker browsing</translation> +<translation id="164269334534774161">Du ser en offlinekopi af denne side fra <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Oversætter siden til <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Historik</translation> <translation id="1647391597548383849">Adgang til dit kamera</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Dine oversættelsesindstillinger er nulstillet.</translation> <translation id="2359808026110333948">Fortsæt</translation> <translation id="2381756643783702095">Spørg inden afsendelse (anbefales)</translation> +<translation id="2385560268894525395">den seneste uge</translation> <translation id="2387895666653383613">Skalering af tekst</translation> <translation id="238909021488141516">Der opstod en fejl under download af indholdet.</translation> <translation id="2414886740292270097">Mørk</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Opdater siden</translation> <translation id="2709516037105925701">AutoFyld</translation> <translation id="271033894570825754">Nyt</translation> +<translation id="2742271047622814453">Gemte indstillinger på website slettes muligvis</translation> <translation id="2748463065602559597">Du får vist en sikker Google Chrome-side.</translation> <translation id="2762000892062317888">lige nu</translation> <translation id="2770465223704140727">Fjern fra listen</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Denne konto administreres af <ph name="PARENT_NAME_1" /> og <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Alle rettigheder forbeholdes.</translation> <translation id="2968755619301702150">Certifikatfremviser</translation> +<translation id="2996291259634659425">Opret adgangssætning</translation> <translation id="2996809686854298943">En webadresse er påkrævet</translation> <translation id="3029704984691124060">Adgangssætningerne stemmer ikke overens</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjælp<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Gem video</translation> <translation id="306566828762083630">Enhedens lager er opbrugt. Fjern andre medier for at frigøre plads.</translation> <translation id="307329814453917357">Tilbyd at oversætte sider ved hjælp af Google Oversæt</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Aktivér tilladelse for Chrome i <ph name="BEGIN_LINK" />Indstillinger for Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> gemte data</translation> <translation id="3207960819495026254">Bogmærket</translation> +<translation id="321773570071367578">Hvis du har glemt din adgangssætning eller vil ændre denne indstilling, skal du <ph name="BEGIN_LINK" />nulstille synkroniseringen<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Webapp</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Vil du fortsætte og downloade indholdet?</translation> <translation id="3328801116991980348">Webstedoplysninger</translation> <translation id="3350687908700087792">Luk alle inkognitofaner</translation> +<translation id="3351441609270267898">Importér eksisterende data</translation> <translation id="3358663646935160692">Denne konto administreres af <ph name="DOMAIN_NAME" />. Du logger ind med en administreret konto, og du giver administratoren kontrol over din Chrome-profil. Dine Chrome-data vil blive knyttet permanent til denne konto. Hvis du logger ud af denne konto, slettes de lokale Chrome-data.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Ny inkognitofane</translation> <translation id="3501331331116143684">Siden blev gemt offline i <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Acceptér og fortsæt</translation> +<translation id="3522247891732774234">Tilgængelig opdatering. Flere muligheder</translation> <translation id="3527085408025491307">Mappe</translation> <translation id="3549644494707163724">Krypter alle synkroniserede data med din egen adgangssætning til synkronisering</translation> <translation id="360480449234699036">Få oplysninger om emner på websites uden at forlade siden. "Tryk for at søge" sender et ord og ordets kontekst til Google Søgning og giver dig definitioner, billeder, søgeresultater og andre oplysninger. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Tving aktivering af zoom</translation> <translation id="3917783807003067648">Placeringen er blokeret</translation> <translation id="3927692899758076493">Sans serif</translation> +<translation id="3931947361983910192">de seneste fire uger</translation> <translation id="393697183122708255">Aktiveret talesøgning ikke tilgængelig</translation> <translation id="3950820424414687140">Log ind</translation> <translation id="3988213473815854515">Placeringen er tilladt</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Åbn på ny fane</translation> <translation id="4198229475320555619">Et bogmærke på <ph name="PAGE_SIZE_STRING" /> er gemt offline</translation> <translation id="423410644998903704">Chrome skal have adgangstilladelse for at kunne dele dem med dette website.</translation> +<translation id="424864128008805179">Vil du logge ud af Chrome?</translation> <translation id="4254813446494774748">Sprog, der skal oversættes til:</translation> <translation id="4256782883801055595">Open source-licenser</translation> <translation id="4259722352634471385">Navigationen er blokeret: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Fremtidige Fysisk web-sider i nærheden vises i din underretningsliste.</translation> <translation id="4498934959426056365">Nøglegenerering</translation> <translation id="4505554159887937799">Gemt offline</translation> +<translation id="4508440807153586353">Det er kun personer med din adgangssætning, der kan læse dine krypterede data. Adgangssætningen sendes ikke til eller gemmes af Google. Hvis du glemmer din adgangssætning eller vil ændre denne indstilling, skal du nulstille synkroniseringen. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{For 1 dag siden}one{For # dag siden}other{For # dage siden}}</translation> <translation id="4522570452068850558">Detaljer</translation> <translation id="4526249700380860531">Se og administrer gemte adgangskoder på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Ny fane</translation> <translation id="5271967389191913893">Enheden kan ikke åbne det indhold, der skal downloades.</translation> <translation id="5275558766013849309">Faner findes sammen med de seneste apps.</translation> +<translation id="5284584623296338184">Ændringer i dine bogmærker, din historik, dine adgangskoder og andre indstillinger synkroniseres ikke længere til din Google-konto, men dine eksisterende data er stadig gemt på din Google-konto.</translation> <translation id="5301954838959518834">OK, det er forstået</translation> <translation id="5302048478445481009">Sprog</translation> <translation id="5304593522240415983">Dette felt må ikke være tomt</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Rediger gemt navn/adgangskode eller undtagelse</translation> <translation id="5442257541162692417">Rediger den gemte side</translation> <translation id="544291274896356069">Du forlader inkognitotilstand, hvis dette link åbnes i en ekstern applikation. Vil du fortsætte?</translation> +<translation id="5487521232677179737">Ryd data</translation> <translation id="5487729733663684359">Chrome understøtter ikke længere denne version af Android.</translation> <translation id="5511351932351731210">Send altid</translation> <translation id="5512137114520586844">Denne konto administreres af <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Oversæt</translation> <translation id="5916664084637901428">Til</translation> <translation id="5939518447894949180">Nulstil</translation> +<translation id="5965336165840183977">Dette rydder synkroniserede data fra alle enheder. Du logges ikke ud af din Google-konto. Gemte websiteindstillinger slettes ikke og kan afspejle dine søgevaner.</translation> <translation id="5968595432776860642">Afspiller "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Åbner videoinput</translation> <translation id="6012342843556706400">Chrome skal have adgang til din placering for at kunne dele den med dette website.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Beskyttet indhold</translation> <translation id="6612856669344839356">Gem bogmærke</translation> <translation id="6627583120233659107">Rediger mappen</translation> +<translation id="6647073004883890710">Skal <ph name="PASSWORD_MANAGER_BRAND" /> opdatere adgangskoden for <ph name="USERNAME" /> for dette website?</translation> <translation id="6656545060687952787">Chrome skal bruge placeringsadgang for at kunne scanne efter enheder. <ph name="BEGIN_LINK" />Opdater tilladelser<ph name="END_LINK" /></translation> <translation id="666268767214822976">Brug en forslagstjeneste til at få vist relaterede forespørgsler og populære websites, mens du skriver i adresselinjen</translation> <translation id="666981079809192359">Erklæring om privatliv for Google Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Den gemte side er ikke tilgængelig offline</translation> <translation id="6722992508235227685">Dine bogmærker, din historik, dine adgangskoder og andre indstillinger synkroniseres til din Google-konto, så du kan bruge dem på alle dine enheder. Du kan vælge, hvad der skal synkroniseres, under <ph name="BEGIN_LINK1" />Indstillinger<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Downloader…</translation> +<translation id="6762156594045689028">Hvis du vil ændre denne indstilling, skal du <ph name="BEGIN_LINK" />nulstille synkroniseringen<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Systemet Beskyttet browsing i Chrome anvendes også til at registrere skadelige sider og beskytte dig mod phishing, malware og skadelige downloads.</translation> <translation id="6784675033504223784">Søg efter "<ph name="SEARCH_TERM" />"</translation> <translation id="6790428901817661496">Afspil</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Log ind for at hente bogmærker, historik og andre indstillinger til alle dine enheder.</translation> <translation id="6945221475159498467">Vælg</translation> <translation id="6963766334940102469">Slet bogmærker</translation> -<translation id="6964496835063002391">Tilføj en konto</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Mapper</translation> <translation id="6978479750597523876">Nulstil oversættelsesindstillingerne</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Der er registreret en langsom forbindelse.</translation> <translation id="7057058088140140610">Kreditkort og adresser via Google Payments</translation> <translation id="7063006564040364415">Der kunne ikke oprettes forbindelse til synkroniseringsserveren.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> vil parre med:</translation> +<translation id="7081639897063626814">Hold eksisterende data adskilt</translation> <translation id="7094922512924405309">Der blev ikke fundet nogen Fysisk web-sider i nærheden</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> åbne faner</translation> <translation id="7096034533295549981">Videoen indlæses</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Hjælp<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Slet bogmærke</translation> <translation id="7324738665594301612">Vi tester oprettelsen af HTTPS-proxysider via Googles servere som en del af et eksperiment.</translation> +<translation id="7346217184097589238">Gemte websiteindstillinger slettes ikke og kan afspejle dine søgevaner.</translation> <translation id="7346909386216857016">OK</translation> +<translation id="7347770551817603360">Offlineindhold</translation> <translation id="7363354739009474003">Indlæser "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">Caster til <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Type:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Bekræft sletning af loginoplysningerne for enheden</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (Opdateret <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Vent…</translation> +<translation id="7499262814309712782">Synkroniseringskonto</translation> <translation id="7501135638693251872">Alle bogmærker</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Browserdata ryddes</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Siden blev gemt offline. Lagerpladsen er næsten opbrugt.</translation> <translation id="8068648041423924542">Certifikatet kunne ikke vælges.</translation> <translation id="8069239273282989646">Efter komprimering</translation> +<translation id="8073388330009372546">Åbn billede på ny fane</translation> <translation id="8084156870963450514">Log ind for at få adgang til alle dine webting fra en enhver enhed</translation> <translation id="8106211421800660735">Kreditkortnummer</translation> <translation id="813082847718468539">Se websiteoplysninger</translation> <translation id="8137558756159375272">Funktionen "Tryk for at søge" sender det markerede ord og den aktuelle side som kontekst til Google Søgning. Du kan slå den fra under <ph name="BEGIN_LINK" />Indstillinger<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Ikke gemt offline</translation> <translation id="8168435359814927499">Indhold</translation> +<translation id="8173098127580644436">altid</translation> <translation id="8200772114523450471">Genoptag</translation> <translation id="8209050860603202033">Åbn billede</translation> <translation id="8218346974737627104">Bekræft login</translation> <translation id="8218934717680664417">Nu kan du søge med et enkelt tryk</translation> +<translation id="8223946939421658889">Ryd data fra</translation> <translation id="8261506727792406068">Slet</translation> <translation id="8275818695183729150">Tillad (for søgninger i adresselinjen)</translation> +<translation id="8283853025636624853">Synkroniserer til <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Standardfaner</translation> <translation id="8374821112118309944">Du skal opdatere TalkBack til en nyere version.</translation> <translation id="8396312449826231789">Kun godkendte websites</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Spørg først (anbefales)</translation> <translation id="8428213095426709021">Indstillinger</translation> <translation id="8429160401486700187">Slet gemte sider</translation> +<translation id="8433057134996913067">Dette logger dig ud af de fleste websites.</translation> <translation id="8481940801237642152">Din forbindelse til dette website er privat, men andre på netværket vil muligvis kunne ændre sidens udseende.</translation> <translation id="8493948351860045254">Frigør plads</translation> <translation id="8497726226069778601">Her er ikke noget at se… endnu</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Din forbindelse til dette website er privat.</translation> <translation id="8941729603749328384">www.eksempel.com</translation> <translation id="8959122750345127698">Navigationen er ikke mulig: <ph name="URL" /></translation> +<translation id="8979340629087822094">det seneste døgn</translation> <translation id="8987061207681586800">Gør Chrome til dit eget</translation> <translation id="9019902583201351841">Administreret af dine forældre</translation> <translation id="9020607083536754075">Luk den aktuelle fane, og vend tilbage til forrige app</translation> +<translation id="9038649477754266430">Brug en forudsigelsestjeneste til hurtigere sideindlæsning</translation> <translation id="9050666287014529139">Adgangssætning</translation> <translation id="9060538597317784206">Se appen <ph name="APP_NAME" /> i Google Play Butik. Klassificering: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Slå anmodning om computerversionen af websitet fra</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb index bcd8007..31476c12 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="de"> +<translation id="1040144152982955218">Es wird nach Geräten gesucht… <ph name="BEGIN_LINK" />Hilfe aufrufen<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Warnung</translation> <translation id="10614374240317010">Nie speichern für...</translation> <translation id="1061441684050139317">Chrome benötigt Zugriff auf das Mikrofon, um es für diese Website freizugeben.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Fügen Sie ein Konto hinzu, um Ihre Lesezeichen, Ihren Verlauf, Ihre Passwörter und andere Einstellungen auf allen Ihren Geräten abzurufen.</translation> <translation id="1098052486217676340">Fertig</translation> <translation id="1121094540300013208">Nutzungs- und Absturzberichte</translation> +<translation id="1137305377394488060">für die letzte Stunde</translation> <translation id="1178581264944972037">Anhalten</translation> <translation id="1181037720776840403">Entfernen</translation> <translation id="1197267115302279827">Lesezeichen verschieben</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google-Doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Stopp</translation> <translation id="1285320974508926690">Diese Website nie übersetzen</translation> +<translation id="1291207594882862231">Verlauf, Cookies, Websitedaten, Cache leeren…</translation> <translation id="129553762522093515">Kürzlich geschlossen</translation> <translation id="1346090444609141578">Keine gespeicherten Seiten vorhanden</translation> <translation id="1369915414381695676">Website "<ph name="SITE_NAME" />" hinzugefügt</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Keine weiteren Dialogfelder auf dieser Seite zulassen</translation> <translation id="1641113438599504367">Safe Browsing</translation> +<translation id="164269334534774161">Sie sehen sich momentan eine Offlinekopie dieser Seite vom <ph name="CREATION_TIME" /> an</translation> <translation id="1643702317193804718">Seite wird in folgende Sprache übersetzt: <ph name="SOURCE_LANGUAGE" />...</translation> <translation id="1644574205037202324">Verlauf</translation> <translation id="1647391597548383849">Kamerazugriff</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Übersetzungseinstellungen zurückgesetzt</translation> <translation id="2359808026110333948">Weiter</translation> <translation id="2381756643783702095">Vor dem Senden nachfragen (empfohlen)</translation> +<translation id="2385560268894525395">für die letzte Woche</translation> <translation id="2387895666653383613">Text-Skalierung</translation> <translation id="238909021488141516">Beim Herunterladen des Inhalts ist ein Fehler aufgetreten.</translation> <translation id="2414886740292270097">Dunkel</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Seite aktualisieren</translation> <translation id="2709516037105925701">AutoFill</translation> <translation id="271033894570825754">Neu</translation> +<translation id="2742271047622814453">Auf Websites gespeicherte Einstellungen werden möglicherweise gelöscht</translation> <translation id="2748463065602559597">Dies ist eine sichere Google Chrome-Seite.</translation> <translation id="2762000892062317888">gerade eben</translation> <translation id="2770465223704140727">Aus Liste entfernen</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Dieses Konto wird von <ph name="PARENT_NAME_1" /> und <ph name="PARENT_NAME_2" /> verwaltet.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Alle Rechte vorbehalten.</translation> <translation id="2968755619301702150">Zertifikats-Viewer</translation> +<translation id="2996291259634659425">Passphrase erstellen</translation> <translation id="2996809686854298943">URL erforderlich</translation> <translation id="3029704984691124060">Passphrasen stimmen nicht überein.</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Hilfe aufrufen<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Video speichern</translation> <translation id="306566828762083630">Ihr Gerätespeicher ist voll. Bitte entfernen Sie Elemente, um Speicherplatz freizugeben.</translation> <translation id="307329814453917357">Übersetzung der Seiten mithilfe von Google Übersetzer anbieten</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Berechtigungen für Chrome in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> gespeicherte Daten</translation> <translation id="3207960819495026254">Mit einem Lesezeichen versehen</translation> +<translation id="321773570071367578">Wenn Sie Ihre Passphrase vergessen oder diese Einstellung ändern möchten, <ph name="BEGIN_LINK" />setzen Sie die Synchronisierung zurück<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Web-App</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Inhalt herunterladen?</translation> <translation id="3328801116991980348">Websiteinformationen</translation> <translation id="3350687908700087792">Alle Inkognitotabs schließen</translation> +<translation id="3351441609270267898">Vorhandene Daten importieren</translation> <translation id="3358663646935160692">Dieses Konto wird von <ph name="DOMAIN_NAME" /> verwaltet. Sie melden sich gerade mit einem verwalteten Konto an und geben dem Administrator des Kontos Kontrolle über Ihr Chrome-Profil. Ihre Chrome-Daten werden dauerhaft mit diesem Konto verknüpft. Wenn Sie sich aus diesem Konto abmelden, werden alle lokalen Chrome-Daten gelöscht.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Neuer Inkognito-Tab</translation> <translation id="3501331331116143684">Seite offline im Ordner "<ph name="FOLDER_NAME" />" gespeichert</translation> <translation id="3518985090088779359">Akzeptieren & weiter</translation> +<translation id="3522247891732774234">Update verfügbar. Weitere Optionen</translation> <translation id="3527085408025491307">Ordner</translation> <translation id="3549644494707163724">Alle synchronisierten Daten mit Ihrer eigenen Synchronisierungspassphrase verschlüsseln</translation> <translation id="360480449234699036">Erfahren Sie mehr über Themen auf einer Website, ohne die Seite verlassen zu müssen. Mit der Option "Zum Suchen tippen" werden ein Wort sowie dessen Kontext an die Google-Suche gesendet. Daraufhin erhalten Sie Definitionen, Bilder, Suchergebnisse und andere Details. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Zoom zwingend aktivieren</translation> <translation id="3917783807003067648">Standort blockiert</translation> <translation id="3927692899758076493">Serifenlose Schrift</translation> +<translation id="3931947361983910192">für die letzten 4 Wochen</translation> <translation id="393697183122708255">Keine aktivierte Sprachsuche verfügbar</translation> <translation id="3950820424414687140">Anmelden</translation> <translation id="3988213473815854515">Standort freigegeben</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">In neuem Tab öffnen</translation> <translation id="4198229475320555619">Lesezeichen mit einer Größe von <ph name="PAGE_SIZE_STRING" /> offline gespeichert</translation> <translation id="423410644998903704">Chrome benötigt Zugriff auf die Berechtigungen, um sie für diese Website freizugeben.</translation> +<translation id="424864128008805179">Von Chrome abmelden?</translation> <translation id="4254813446494774748">Zielsprache:</translation> <translation id="4256782883801055595">Open Source-Lizenzen</translation> <translation id="4259722352634471385">Die Navigation zu <ph name="URL" /> ist blockiert.</translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Zukünftige Physical Web-Seiten zu Objekten in der Nähe werden in Ihrer Benachrichtigungsliste angezeigt.</translation> <translation id="4498934959426056365">Schlüsselgenerierung</translation> <translation id="4505554159887937799">Offline gespeichert</translation> +<translation id="4508440807153586353">Nur Personen mit Ihrer Passphrase können Ihre verschlüsselten Daten lesen. Die Passphrase wird nicht an Google gesendet oder von Google gespeichert. Falls Sie sie vergessen oder diese Einstellung ändern möchten, müssen Sie die Synchronisierung zurücksetzen. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Vor # Tag}other{Vor # Tagen}}</translation> <translation id="4522570452068850558">Details</translation> <translation id="4526249700380860531">Unter <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> gespeicherte Passwörter aufrufen und verwalten</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Neuer Tab</translation> <translation id="5271967389191913893">Das Gerät kann den Inhalt, der heruntergeladen werden soll, nicht öffnen.</translation> <translation id="5275558766013849309">Tabs und letzte Apps werden zusammengefasst.</translation> +<translation id="5284584623296338184">Änderungen an Ihren Lesezeichen, Ihrem Verlauf, Ihren Passwörtern und anderen Einstellungen werden nicht mehr mit Ihrem Google-Konto synchronisiert. Ihre vorhandenen Daten bleiben aber in Ihrem Google-Konto gespeichert.</translation> <translation id="5301954838959518834">OK</translation> <translation id="5302048478445481009">Sprache</translation> <translation id="5304593522240415983">Dieses Feld darf nicht leer sein.</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Gespeicherten Eintrag oder Ausnahme bearbeiten</translation> <translation id="5442257541162692417">Gespeicherte Seite bearbeiten</translation> <translation id="544291274896356069">Der Inkognitomodus wird beendet, wenn dieser Link in einer externen App geöffnet wird. Vorgang fortsetzen?</translation> +<translation id="5487521232677179737">Daten löschen</translation> <translation id="5487729733663684359">Chrome-Updates werden für diese Version von Android nicht mehr unterstützt.</translation> <translation id="5511351932351731210">Immer senden</translation> <translation id="5512137114520586844">Dieses Konto wird von <ph name="PARENT_NAME" /> verwaltet.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Übersetzer</translation> <translation id="5916664084637901428">An</translation> <translation id="5939518447894949180">Zurücksetzen</translation> +<translation id="5965336165840183977">Dadurch werden synchronisierte Daten von allen Geräten gelöscht. Sie werden nicht von Ihrem Google-Konto abgemeldet. Gespeicherte Website-Einstellungen werden nicht gelöscht und können möglicherweise Ihre Surfgewohnheiten wiedergeben.</translation> <translation id="5968595432776860642">"<ph name="VIDEO_TITLE" />" wird abgespielt.</translation> <translation id="6010869025736512584">Zugriff auf Video-Eingang</translation> <translation id="6012342843556706400">Chrome benötigt Zugriff auf den Standort, um ihn für diese Website freizugeben.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Geschützte Inhalte</translation> <translation id="6612856669344839356">Lesezeichen speichern</translation> <translation id="6627583120233659107">Ordner bearbeiten</translation> +<translation id="6647073004883890710">Soll <ph name="PASSWORD_MANAGER_BRAND" /> das Passwort für <ph name="USERNAME" /> für diese Website aktualisieren?</translation> <translation id="6656545060687952787">Chrome benötigt Zugriff auf den Standort, um nach Geräten suchen zu können. <ph name="BEGIN_LINK" />Berechtigungen aktualisieren<ph name="END_LINK" /></translation> <translation id="666268767214822976">Während der Eingabe in die Adressleiste mithilfe einer Vervollständigungsfunktion verwandte Suchanfragen und beliebte Websites einblenden</translation> <translation id="666981079809192359">Chrome-Datenschutzhinweise</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Gespeicherte Seite nicht offline verfügbar</translation> <translation id="6722992508235227685">Lesezeichen, Verlauf, Passwörter und andere Einstellungen werden mit Ihrem Google-Konto synchronisiert, damit Sie diese auf allen Ihren Geräten nutzen können. Unter <ph name="BEGIN_LINK1" />Einstellungen<ph name="END_LINK1" /> können Sie festlegen, welche Daten synchronisiert werden sollen.</translation> <translation id="6738867403308150051">Wird heruntergeladen...</translation> +<translation id="6762156594045689028">Wenn Sie diese Einstellung ändern möchten, <ph name="BEGIN_LINK" />setzen Sie die Synchronisierung zurück<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Das Safe Browsing-System von Chrome erkennt außerdem schädliche Seiten und schützt Sie vor Phishing, Malware und schädlichen Downloads.</translation> <translation id="6784675033504223784">Nach "<ph name="SEARCH_TERM" />" suchen</translation> <translation id="6790428901817661496">Wiedergabe</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Melden Sie sich an, um Ihre Lesezeichen, Ihren Verlauf, Ihre Passwörter und andere Einstellungen auf allen Ihren Geräten aufzurufen.</translation> <translation id="6945221475159498467">Auswählen</translation> <translation id="6963766334940102469">Lesezeichen löschen</translation> -<translation id="6964496835063002391">Konto hinzufügen</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Ordner</translation> <translation id="6978479750597523876">Übersetzungseinstellungen zurücksetzen</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Langsame Verbindung gefunden</translation> <translation id="7057058088140140610">Kreditkarten und Adressen für Google Payments</translation> <translation id="7063006564040364415">Verbindung zum Synchronisierungsserver konnte nicht hergestellt werden.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> möchte ein Pairing durchführen mit:</translation> +<translation id="7081639897063626814">Bestehende Daten getrennt halten</translation> <translation id="7094922512924405309">Keine Physical Web-Seiten zu Objekten in der Nähe gefunden</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> geöffnete Tabs</translation> <translation id="7096034533295549981">Video wird geladen</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Hilfe<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Lesezeichen löschen</translation> <translation id="7324738665594301612">Wir testen die experimentelle Verwendung von Google-Proxy-Servern für HTTPS-Seiten.</translation> +<translation id="7346217184097589238">Gespeicherte Website-Einstellungen werden nicht gelöscht und können möglicherweise Ihre Surfgewohnheiten wiedergeben.</translation> <translation id="7346909386216857016">OK</translation> +<translation id="7347770551817603360">Offlineinhalt</translation> <translation id="7363354739009474003">"<ph name="VIDEO_TITLE" />" wird geladen.</translation> <translation id="7366340029385295517">Übertragung an <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Typ:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Löschen der Anmeldedaten des Geräts bestätigen</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (aktualisiert <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Bitte warten...</translation> +<translation id="7499262814309712782">Synchronisierungskonto</translation> <translation id="7501135638693251872">Alle Lesezeichen</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Browserdaten werden gelöscht</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Seite offline gespeichert. Speicher fast voll</translation> <translation id="8068648041423924542">Zertifikat kann nicht ausgewählt werden.</translation> <translation id="8069239273282989646">Nach Komprimierung</translation> +<translation id="8073388330009372546">Bild in neuem Tab öffnen</translation> <translation id="8084156870963450514">Melden Sie sich an, um von jedem beliebigen Gerät aus auf Ihre Webinhalte zuzugreifen.</translation> <translation id="8106211421800660735">Kreditkartennummer</translation> <translation id="813082847718468539">Website-Informationen anzeigen</translation> <translation id="8137558756159375272">Mit "Zum Suchen tippen" werden das ausgewählte Wort und die aktuelle Seite als Kontext an die Google-Suche gesendet. Sie können die Funktion in den <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> deaktivieren.</translation> <translation id="8146397137182589628">Nicht offline gespeichert</translation> <translation id="8168435359814927499">Inhalte</translation> +<translation id="8173098127580644436">für den gesamten Zeitraum</translation> <translation id="8200772114523450471">Fortsetzen</translation> <translation id="8209050860603202033">Bild öffnen</translation> <translation id="8218346974737627104">Anmeldung bestätigen</translation> <translation id="8218934717680664417">Jetzt durch einfaches Tippen suchen</translation> +<translation id="8223946939421658889">Daten löschen</translation> <translation id="8261506727792406068">Löschen</translation> <translation id="8275818695183729150">Zulassen (für Suchanfragen in der Adressleiste)</translation> +<translation id="8283853025636624853">Synchronisierung mit <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Standard-Tabs</translation> <translation id="8374821112118309944">TalkBack muss auf eine neuere Version aktualisiert werden.</translation> <translation id="8396312449826231789">Nur genehmigte Websites</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Zuerst fragen (empfohlen)</translation> <translation id="8428213095426709021">Einstellungen</translation> <translation id="8429160401486700187">Gespeicherte Seiten löschen</translation> +<translation id="8433057134996913067">Dadurch werden Sie von den meisten Websites abgemeldet.</translation> <translation id="8481940801237642152">Ihre Verbindung zu dieser Website ist privat, möglicherweise ist jedoch jemand im Netzwerk in der Lage, das Aussehen der Seite zu ändern.</translation> <translation id="8493948351860045254">Speicherplatz freigeben</translation> <translation id="8497726226069778601">Noch keine Seiten</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Ihre Verbindung zu dieser Website ist privat.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Navigation nicht möglich: <ph name="URL" /> ist nicht erreichbar.</translation> +<translation id="8979340629087822094">für den letzten Tag</translation> <translation id="8987061207681586800">Chrome personalisieren</translation> <translation id="9019902583201351841">Von deinen Eltern verwaltet</translation> <translation id="9020607083536754075">Aktuellen Tab schließen und zur zuvor genutzten App wechseln</translation> +<translation id="9038649477754266430">Vervollständigungsdienst zum schnelleren Laden von Seiten verwenden</translation> <translation id="9050666287014529139">Passphrase</translation> <translation id="9060538597317784206">App <ph name="APP_NAME" /> im Play Store anzeigen. Bewertung: <ph name="APP_RATING" /></translation> <translation id="9063523880881406963">"Desktop-Version anfordern" deaktivieren</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb index 747ea86..fef890c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Διακοπή</translation> <translation id="1285320974508926690">Να μην γίνεται ποτέ μετάφραση αυτού του ιστότοπου</translation> +<translation id="1291207594882862231">Εκκαθάριση ιστορικού, cookie, δεδομένων ιστότοπου, κρυφής μνήμης…</translation> <translation id="129553762522093515">Έκλεισαν πρόσφατα</translation> <translation id="1346090444609141578">Δεν υπάρχουν αποθηκευμένες σελίδες εδώ</translation> <translation id="1369915414381695676">Προστέθηκε ο ιστότοπος <ph name="SITE_NAME" /></translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Κάμερα</translation> <translation id="1623104350909869708">Αποτροπή δημιουργίας πρόσθετων παραθύρων διαλόγου από αυτήν τη σελίδα</translation> <translation id="1641113438599504367">Ασφαλής περιήγηση</translation> +<translation id="164269334534774161">Βλέπετε ένα αντίγραφο εκτός σύνδεσης αυτής της σελίδας από <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Μετάφραση σελίδας στα <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Ιστορικό</translation> <translation id="1647391597548383849">Πρόσβαση στην κάμερα</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Ανανέωση σελίδας</translation> <translation id="2709516037105925701">Αυτόματη συμπλήρωση</translation> <translation id="271033894570825754">Νέο</translation> +<translation id="2742271047622814453">Οι αποθηκευμένες προτιμήσεις στους ιστότοπους ενδέχεται να διαγραφούν</translation> <translation id="2748463065602559597">Βλέπετε μια ασφαλή σελίδα του Google Chrome.</translation> <translation id="2762000892062317888">μόλις τώρα</translation> <translation id="2770465223704140727">Κατάργηση από τη λίστα</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Συνέχεια για λήψη του περιεχομένου;</translation> <translation id="3328801116991980348">Πληροφορίες ιστοτόπου</translation> <translation id="3350687908700087792">Κλείσιμο όλων των καρτελών ανώνυμης περιήγησης</translation> +<translation id="3351441609270267898">Εισαγωγή υπαρχόντων δεδομένων</translation> <translation id="3358663646935160692">Αυτός ο λογαριασμός τελεί υπό διαχείριση του <ph name="DOMAIN_NAME" />. Έχετε συνδεθεί με έναν διαχειριζόμενο λογαριασμό και παραχωρείτε τον έλεχγο διαχείρισής του μέσω του προφίλ σας Chrome. Τα δεδομένα σας Chrome θα συσχετιστούν μόνιμα με αυτόν το λογαριασμό. Η αποσύνδεση από αυτόν το λογαριασμό θα διαγράψει τα τοπικά δεδομένα Chrome.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Νέα καρτέλα αν. περιήγησης</translation> <translation id="3501331331116143684">Η σελίδα αποθηκεύτηκε εκτός σύνδεσης στο φάκελο <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Αποδοχή και συνέχεια</translation> +<translation id="3522247891732774234">Διατίθεται μια ενημέρωση. Περισσότερες επιλογές</translation> <translation id="3527085408025491307">Φάκελος</translation> <translation id="3549644494707163724">Κρυπτογράφηση όλων των συγχρονισμένων δεδομένων με τη δική σας φράση πρόσβασης συγχρονισμού</translation> <translation id="360480449234699036">Ενημερωθείτε σχετικά με τα θέματα των ιστότοπων, χωρίς να αποχωρήσετε από τη σελίδα. Η λειτουργία "Αγγίξτε για αναζήτηση" στέλνει μια λέξη και τα συμφραζόμενά της στην Αναζήτηση Google και εμφανίζει ορισμούς, εικόνες, αποτελέσματα αναζήτησης και άλλες λεπτομέρειες. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Άνοιγμα σε νέα καρτέλα</translation> <translation id="4198229475320555619">Ο σελιδοδείκτης μεγέθους <ph name="PAGE_SIZE_STRING" /> αποθηκεύτηκε εκτός σύνδεσης</translation> <translation id="423410644998903704">Το Chrome θα πρέπει να έχει πρόσβαση στις άδειες προκειμένου να τις μοιραστεί με αυτόν τον ιστότοπο.</translation> -<translation id="4247939399682707041">Αντικατάσταση των δεδομένων αυτής της συσκευής με τα δεδομένα του λογαριασμού <ph name="ACCOUNT" />. Μπορείτε να ανακτήσετε τα υπάρχοντα δεδομένα επιστρέφοντας στο λογαριασμό <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Αποσύνδεση από το Chrome;</translation> <translation id="4254813446494774748">Γλώσσα μετάφρασης:</translation> <translation id="4256782883801055595">Άδειες λογισμικού ανοικτού κώδικα</translation> @@ -426,6 +430,7 @@ <translation id="6612358246767739896">Προστατευμένο περιεχόμενο</translation> <translation id="6612856669344839356">Αποθήκευση σελιδοδείκτη</translation> <translation id="6627583120233659107">Επεξεργασία φακέλου</translation> +<translation id="6647073004883890710">Θέλετε το <ph name="PASSWORD_MANAGER_BRAND" /> να ενημερώσει τον κωδικό πρόσβασης για το χρήστη <ph name="USERNAME" /> για αυτόν τον ιστότοπο;</translation> <translation id="6656545060687952787">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία, προκειμένου να κάνει σάρωση για συσκευές. <ph name="BEGIN_LINK" />Ενημέρωση δικαιωμάτων<ph name="END_LINK" /></translation> <translation id="666268767214822976">Χρήση υπηρεσίας προβλέψεων για την εμφάνιση σχετικών ερωτημάτων και δημοφιλών ιστότοπων, καθώς πληκτρολογείτε στη γραμμή διευθύνσεων</translation> <translation id="666981079809192359">Σημείωση Απορρήτου του Chrome</translation> @@ -453,7 +458,6 @@ <translation id="6868088497967843822">Συνδεθείτε προκειμένου οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και οι άλλες ρυθμίσεις σας να είναι διαθέσιμες σε όλες τις συσκευές σας.</translation> <translation id="6945221475159498467">Επιλογή</translation> <translation id="6963766334940102469">Διαγραφή σελιδοδεικτών</translation> -<translation id="6964496835063002391">Προσθέστε έναν λογαριασμό</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Φάκελοι</translation> <translation id="6978479750597523876">Επαναφορά ρυθμίσεων μετάφρασης</translation> @@ -485,6 +489,7 @@ <translation id="7324738665594301612">Δοκιμάζουμε τη μεσολάβηση σελίδων HTTPS μέσω διακομιστών της Google στο πλαίσιο ενός πειράματος.</translation> <translation id="7346217184097589238">Οι αποθηκευμένες ρυθμίσεις ιστότοπων δεν θα διαγραφούν και ενδέχεται να υποδεικνύουν τις συνήθειες περιήγησης.</translation> <translation id="7346909386216857016">Εντάξει, το κατάλαβα</translation> +<translation id="7347770551817603360">Περιεχόμενο εκτός σύνδεσης</translation> <translation id="7363354739009474003">Φόρτωση "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">Μετάδοση στη συσκευή <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Τύπος:</translation> @@ -545,6 +550,7 @@ <translation id="8050319187894766337">Η σελίδα αποθηκεύτηκε εκτός σύνδεσης. Ο αποθ.χώρος είναι σχεδόν πλήρης.</translation> <translation id="8068648041423924542">Δεν είναι δυνατή η επιλογή του πιστοποιητικού.</translation> <translation id="8069239273282989646">Μετά τη συμπίεση</translation> +<translation id="8073388330009372546">Άνοιγμα εικόνας σε νέα καρτέλα</translation> <translation id="8084156870963450514">Συνδεθείτε για να αποκτήσετε πρόσβαση σε όλο το περιεχόμενό σας στον Ιστό, από οποιαδήποτε συσκευή</translation> <translation id="8106211421800660735">Αριθμός πιστωτικής κάρτας</translation> <translation id="813082847718468539">Προβολή πληροφοριών τοποθεσίας</translation> @@ -567,6 +573,7 @@ <translation id="8413385045638830869">Να γίνεται ερώτηση πρώτα (συνιστάται)</translation> <translation id="8428213095426709021">Ρυθμίσεις</translation> <translation id="8429160401486700187">Διαγραφή αποθηκευμένων σελίδων</translation> +<translation id="8433057134996913067">Αυτή η ενέργεια θα σας αποσυνδέσει από τους περισσότερους ιστότοπους.</translation> <translation id="8481940801237642152">Η σύνδεσή σας σε αυτόν τον ιστότοπο είναι ιδιωτική, αλλά κάποιος χρήστης του δικτύου ενδέχεται να έχει τη δυνατότητα να αλλάξει την εμφάνιση της σελίδας.</translation> <translation id="8493948351860045254">Ελευθερώστε χώρο</translation> <translation id="8497726226069778601">Δεν υπάρχει τίποτα να δείτε εδώ…ακόμη</translation> @@ -611,6 +618,7 @@ <translation id="8987061207681586800">Εξατομικεύστε το Chrome</translation> <translation id="9019902583201351841">Διαχειρίζεται από τους γονείς σου</translation> <translation id="9020607083536754075">Κλείσιμο της τρέχουσας καρτέλας και επιστροφή στην προηγούμενη εφαρμογή</translation> +<translation id="9038649477754266430">Χρήση μιας υπηρεσίας πρόβλεψης για ταχύτερη φόρτωση σελίδων</translation> <translation id="9050666287014529139">Φράση πρόσβασής σας</translation> <translation id="9060538597317784206">Προβολή της εφαρμογής <ph name="APP_NAME" /> στο Play Store. Βαθμολογία: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Απενεργοποίηση αιτήματος ιστότοπου για υπολογιστές</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb index 8d1b972..8c399f1 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Stop</translation> <translation id="1285320974508926690">Never translate this site</translation> +<translation id="1291207594882862231">Clear history, cookies, site data, cache…</translation> <translation id="129553762522093515">Recently closed</translation> <translation id="1346090444609141578">No saved pages here</translation> <translation id="1369915414381695676">Site <ph name="SITE_NAME" /> added</translation> @@ -48,6 +49,7 @@ <translation id="1620510694547887537">Camera</translation> <translation id="1623104350909869708">Prevent this page from creating additional dialogues</translation> <translation id="1641113438599504367">Safe Browsing</translation> +<translation id="164269334534774161">You are viewing an offline copy of this page from <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Translating page to <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">History</translation> <translation id="1647391597548383849">Access your camera</translation> @@ -124,6 +126,7 @@ <translation id="2707726405694321444">Refresh page</translation> <translation id="2709516037105925701">Auto-fill</translation> <translation id="271033894570825754">New</translation> +<translation id="2742271047622814453">Saved preferences on sites might get deleted</translation> <translation id="2748463065602559597">You are viewing a secure Google Chrome page.</translation> <translation id="2762000892062317888">just now</translation> <translation id="2770465223704140727">Remove from list</translation> @@ -164,6 +167,7 @@ <translation id="3303414029551471755">Proceed to download the content?</translation> <translation id="3328801116991980348">Site information</translation> <translation id="3350687908700087792">Close all incognito tabs</translation> +<translation id="3351441609270267898">Import existing data</translation> <translation id="3358663646935160692">This account is managed by <ph name="DOMAIN_NAME" />. You are signing in with a managed account and giving its administrator control over your Chrome profile. Your Chrome data will become permanently tied to this account. Disconnecting from this account will delete the local Chrome data.</translation> @@ -175,6 +179,7 @@ <translation id="3492207499832628349">New incognito tab</translation> <translation id="3501331331116143684">Page saved offline to <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Accept & continue</translation> +<translation id="3522247891732774234">Update available. More options</translation> <translation id="3527085408025491307">Folder</translation> <translation id="3549644494707163724">Encrypt all synced data with your own sync passphrase</translation> <translation id="360480449234699036">Learn about topics on websites without leaving the page. Touch to Search sends a word and its surrounding context to Google Search, returning definitions, pictures, search results and other details. @@ -217,7 +222,6 @@ <translation id="4195643157523330669">Open in new tab</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> bookmark saved offline</translation> <translation id="423410644998903704">Chrome needs permissions access to share them with this site.</translation> -<translation id="4247939399682707041">Replace this device’s data with <ph name="ACCOUNT" />’s data. You can retrieve your existing data by switching back to <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Sign out of Chrome?</translation> <translation id="4254813446494774748">Translation language:</translation> <translation id="4256782883801055595">Open-source licences</translation> @@ -421,6 +425,7 @@ <translation id="6612358246767739896">Protected content</translation> <translation id="6612856669344839356">Save bookmark</translation> <translation id="6627583120233659107">Edit folder</translation> +<translation id="6647073004883890710">Do you want <ph name="PASSWORD_MANAGER_BRAND" /> to update the password for <ph name="USERNAME" /> for this site?</translation> <translation id="6656545060687952787">Chrome needs location access to scan for devices. <ph name="BEGIN_LINK" />Update permissions<ph name="END_LINK" /></translation> <translation id="666268767214822976">Use a prediction service to show related queries and popular websites as you type in the address bar</translation> <translation id="666981079809192359">Chrome Privacy Notice</translation> @@ -448,7 +453,6 @@ <translation id="6868088497967843822">Sign in to get your bookmarks, history, passwords and other settings on all your devices</translation> <translation id="6945221475159498467">Select</translation> <translation id="6963766334940102469">Delete bookmarks</translation> -<translation id="6964496835063002391">Add an account</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Folders</translation> <translation id="6978479750597523876">Reset translate settings</translation> @@ -480,6 +484,7 @@ <translation id="7324738665594301612">We are testing the proxying of HTTPS pages through Google servers as part of an experiment.</translation> <translation id="7346217184097589238">Saved site settings will not be deleted and may reflect your browsing habits.</translation> <translation id="7346909386216857016">OK, got it</translation> +<translation id="7347770551817603360">Offline content</translation> <translation id="7363354739009474003">Loading “<ph name="VIDEO_TITLE" />”</translation> <translation id="7366340029385295517">Casting to <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Type:</translation> @@ -540,6 +545,7 @@ <translation id="8050319187894766337">Page saved offline. Storage almost full.</translation> <translation id="8068648041423924542">Unable to select certificate.</translation> <translation id="8069239273282989646">After compression</translation> +<translation id="8073388330009372546">Open image in new tab</translation> <translation id="8084156870963450514">Sign in to access all your web stuff from any device</translation> <translation id="8106211421800660735">Credit card number</translation> <translation id="813082847718468539">View site information</translation> @@ -562,6 +568,7 @@ <translation id="8413385045638830869">Ask first (recommended)</translation> <translation id="8428213095426709021">Settings</translation> <translation id="8429160401486700187">Delete saved pages</translation> +<translation id="8433057134996913067">This will sign you out of most websites.</translation> <translation id="8481940801237642152">Your connection to this site is private, but someone on the network might be able to change the look of the page.</translation> <translation id="8493948351860045254">Free up space</translation> <translation id="8497726226069778601">Nothing to see here… yet</translation> @@ -604,6 +611,7 @@ <translation id="8987061207681586800">Make Chrome yours</translation> <translation id="9019902583201351841">Managed by your parents</translation> <translation id="9020607083536754075">Close the current tab and return to the previous app</translation> +<translation id="9038649477754266430">Use a prediction service to load pages more quickly</translation> <translation id="9050666287014529139">Passphrase</translation> <translation id="9060538597317784206">View app <ph name="APP_NAME" /> on the Play Store. Rating: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Turn off Request desktop site</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb index 0c82a347..89ac9e3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="es-419"> +<translation id="1040144152982955218">Buscando dispositivos… <ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Advertencia</translation> <translation id="10614374240317010">Nunca guardado</translation> <translation id="1061441684050139317">Chrome necesita acceso al micrófono para compartirlo con este sitio.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Permite agregar una cuenta para ver los marcadores, el historial, las contraseñas y otras opciones de configuración en todos los dispositivos.</translation> <translation id="1098052486217676340">Finalizado</translation> <translation id="1121094540300013208">Informes de uso y de fallos</translation> +<translation id="1137305377394488060">hace una hora</translation> <translation id="1178581264944972037">Detener</translation> <translation id="1181037720776840403">Eliminar</translation> <translation id="1197267115302279827">Mover marcadores</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Doodle de Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Interrumpir</translation> <translation id="1285320974508926690">Nunca traducir este sitio</translation> +<translation id="1291207594882862231">Borra el historial, cookies, datos del sitio, caché…</translation> <translation id="129553762522093515">Cerrado recientemente</translation> <translation id="1346090444609141578">No hay páginas guardadas aquí</translation> <translation id="1369915414381695676">Se agregó el sitio <ph name="SITE_NAME" />.</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Cámara</translation> <translation id="1623104350909869708">Evitar que esta página cree cuadros de diálogo adicionales</translation> <translation id="1641113438599504367">Navegación segura</translation> +<translation id="164269334534774161">Estás viendo una copia sin conexión de esta página del <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Traduciendo la página al <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Historial</translation> <translation id="1647391597548383849">Acceso a la cámara</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Se restableció la configuración de traducción.</translation> <translation id="2359808026110333948">Continuar</translation> <translation id="2381756643783702095">Preguntar antes de enviar (recomendado)</translation> +<translation id="2385560268894525395">la semana pasada</translation> <translation id="2387895666653383613">Ajuste de texto</translation> <translation id="238909021488141516">Se produjo un error al descargar el contenido.</translation> <translation id="2414886740292270097">Oscuro</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Actualizar página</translation> <translation id="2709516037105925701">Autocompletar</translation> <translation id="271033894570825754">Nuevo</translation> +<translation id="2742271047622814453">Es posible que se borren las preferencias guardadas en sitios</translation> <translation id="2748463065602559597">Estás viendo una página segura de Google Chrome.</translation> <translation id="2762000892062317888">recién</translation> <translation id="2770465223704140727">Eliminar de la lista</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412"><ph name="PARENT_NAME_1" /> y <ph name="PARENT_NAME_2" /> administran esta cuenta.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Todos los derechos reservados.</translation> <translation id="2968755619301702150">Visualizador de certificados</translation> +<translation id="2996291259634659425">Crear frase de contraseña</translation> <translation id="2996809686854298943">URL obligatoria</translation> <translation id="3029704984691124060">Las frases de contraseña no coinciden.</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Guardar video</translation> <translation id="306566828762083630">El almacenamiento del dispositivo está lleno. Quita otros medios para liberar espacio.</translation> <translation id="307329814453917357">Ofrecer la traducción de páginas con Google Traductor</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Activa los permisos para Chrome en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905">Datos almacenados: <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">Agregada a marcadores</translation> +<translation id="321773570071367578">Si olvidaste la frase de contraseña o quieres cambiar esta configuración, <ph name="BEGIN_LINK" />restablece la contraseña<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Micrófono</translation> <translation id="3232754137068452469">Aplicación web</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">¿Deseas descargar el contenido?</translation> <translation id="3328801116991980348">Información del sitio</translation> <translation id="3350687908700087792">Cerrar todas las pestañas de incógnito</translation> +<translation id="3351441609270267898">Importar datos existentes</translation> <translation id="3358663646935160692">Esta cuenta está administrada por <ph name="DOMAIN_NAME" />. Vas a acceder con una cuenta administrada, lo que significa que proporcionarás control sobre tu perfil de Chrome al administrador. Los datos de Chrome que tengas se vincularán de forma permanente a esta cuenta. Si la desconectas, se eliminarán los datos locales de Chrome.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Nueva pestaña de incógnito</translation> <translation id="3501331331116143684">La página se guardó sin conexión en <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Aceptar y continuar</translation> +<translation id="3522247891732774234">Actualización disponible. Mas opciones</translation> <translation id="3527085408025491307">Carpeta</translation> <translation id="3549644494707163724">Encriptar todos los datos sincronizados con tu propia frase de contraseña para sincronización</translation> <translation id="360480449234699036">Obtén información acerca de temas en sitios web sin salir de la página. Tocar para buscar envía una palabra y el contexto en el que se encuentra a la Búsqueda de Google, y muestra definiciones, fotos, resultados de la búsqueda y otros detalles. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Forzar habilitación de zoom</translation> <translation id="3917783807003067648">La ubicación está bloqueada.</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">hace cuatro semanas</translation> <translation id="393697183122708255">La búsqueda por voz no está habilitada</translation> <translation id="3950820424414687140">Acceder</translation> <translation id="3988213473815854515">Se admite la ubicación.</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Abrir en una pestaña nueva</translation> <translation id="4198229475320555619">El marcador de <ph name="PAGE_SIZE_STRING" /> se guardó sin conexión</translation> <translation id="423410644998903704">Chrome necesita acceso a los permisos para compartirlos con este sitio.</translation> +<translation id="424864128008805179">¿Quieres salir de Chrome?</translation> <translation id="4254813446494774748">Idioma de la traducción:</translation> <translation id="4256782883801055595">Licencias de código abierto</translation> <translation id="4259722352634471385">Navegación bloqueada: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Las próximas páginas de la Web física cercanas se mostrarán en la lista de notificaciones</translation> <translation id="4498934959426056365">Generación de claves</translation> <translation id="4505554159887937799">Se guardó sin conexión</translation> +<translation id="4508440807153586353">Solo las personas que tengan tu frase de contraseña pueden leer los datos encriptados. Google no envía ni almacena la frase de contraseña. Si la olvidas o quieres cambiar esta configuración, deberás restablecer la sincronización. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Hace # día}other{Hace # días}}</translation> <translation id="4522570452068850558">Detalles</translation> <translation id="4526249700380860531">Consulta y administra las contraseñas que guardaste en <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />.</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Nueva pestaña</translation> <translation id="5271967389191913893">El dispositivo no puede abrir el contenido que se descargará.</translation> <translation id="5275558766013849309">Las pestañas se encontrarán junto a las aplicaciones recientes.</translation> +<translation id="5284584623296338184">Los cambios que hagas en tus marcadores, historial, contraseñas y otras opciones de configuración se seguirán sincronizando con tu cuenta de Google. Sin embargo, tus datos existentes seguirán almacenados en tu cuenta de Google.</translation> <translation id="5301954838959518834">Entendido</translation> <translation id="5302048478445481009">Idioma</translation> <translation id="5304593522240415983">Este campo no puede quedar en blanco.</translation> @@ -316,6 +331,7 @@ </translation> <translation id="5442257541162692417">Editar la página que se guardó</translation> <translation id="544291274896356069">Saldrás del modo de navegación de incógnito si este vínculo se abre en una aplicación externa. ¿Quieres continuar?</translation> +<translation id="5487521232677179737">Borrar datos</translation> <translation id="5487729733663684359">Las actualizaciones de Chrome ya no son compatibles con esta versión de Android.</translation> <translation id="5511351932351731210">Enviar siempre</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" /> administra esta cuenta.</translation> @@ -361,6 +377,7 @@ <translation id="5911030830365207728">Google Traductor</translation> <translation id="5916664084637901428">Activada</translation> <translation id="5939518447894949180">Restablecer</translation> +<translation id="5965336165840183977">Si presionas este botón, se borrarán los datos sincronizados de todos tus dispositivos. No saldrás de tu cuenta de Google. La configuración guardada del sitio no se borrará y es posible que refleje tus hábitos de navegación.</translation> <translation id="5968595432776860642">Reproduciendo "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Accediendo a la entrada de video</translation> <translation id="6012342843556706400">Chrome necesita acceso a la ubicación para compartirla con este sitio.</translation> @@ -413,6 +430,7 @@ <translation id="6612358246767739896">Contenido protegido</translation> <translation id="6612856669344839356">Guardar marcador</translation> <translation id="6627583120233659107">Editar la carpeta</translation> +<translation id="6647073004883890710">¿Deseas que <ph name="PASSWORD_MANAGER_BRAND" /> actualice la contraseña para <ph name="USERNAME" /> en este sitio?</translation> <translation id="6656545060687952787">Chrome necesita acceder a la ubicación para buscar dispositivos. <ph name="BEGIN_LINK" />Actualizar permisos<ph name="END_LINK" /></translation> <translation id="666268767214822976">Usar un servicio de predicción para ver consultas relacionadas y sitios web populares a medida que escribes en la barra de direcciones.</translation> <translation id="666981079809192359">Aviso de privacidad de Chrome</translation> @@ -423,6 +441,7 @@ <translation id="6720988912937197322">La página guardada no está disponible sin conexión.</translation> <translation id="6722992508235227685">Tus marcadores, el historial, las contraseñas y otras opciones de configuración se sincronizarán con tu cuenta de Google para que puedas utilizarlos en todos tus dispositivos. Puedes elegir qué sincronizar en <ph name="BEGIN_LINK1" />Configuración<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Descargando…</translation> +<translation id="6762156594045689028">Para cambiar esta configuración, <ph name="BEGIN_LINK" />restablece la sincronización<ph name="END_LINK" /></translation> <translation id="6770414673596662518">El sistema de navegación segura de Chrome también se puede utilizar para detectar páginas maliciosas y protegerte de la suplantación de identidad (phishing), el software malicioso y las descargas peligrosas.</translation> <translation id="6784675033504223784">Buscar "<ph name="SEARCH_TERM" />"</translation> <translation id="6790428901817661496">Reproducir</translation> @@ -439,7 +458,6 @@ <translation id="6868088497967843822">Accede a tu cuenta para ver los marcadores, el historial, las contraseñas y otras opciones de configuración en todos los dispositivos.</translation> <translation id="6945221475159498467">Seleccionar</translation> <translation id="6963766334940102469">Borrar marcadores</translation> -<translation id="6964496835063002391">Agregar una cuenta</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="6973630695168034713">Carpetas</translation> <translation id="6978479750597523876">Restablecer la configuración de traducción</translation> @@ -456,6 +474,8 @@ <translation id="7056999826593229648">Se detectó una conexión lenta</translation> <translation id="7057058088140140610">Tarjetas de crédito y direcciones que utilizan Google Payments</translation> <translation id="7063006564040364415">No se pudo establecer conexión con el servidor de sincronización.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> quiere sincronizarse con:</translation> +<translation id="7081639897063626814">Mantener los datos existentes por separado</translation> <translation id="7094922512924405309">No se encontró ninguna página web física cercana</translation> <translation id="7095930899177687653">Pestañas abiertas: <ph name="OPEN_TABS" /></translation> <translation id="7096034533295549981">Cargando video</translation> @@ -467,7 +487,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ayuda<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Eliminar marcador</translation> <translation id="7324738665594301612">Estamos probando la transmisión de páginas HTTPS por proxy a través de los servidores de Google como parte de un experimento.</translation> +<translation id="7346217184097589238">La configuración guardada del sitio no se borrará y es posible que refleje tus hábitos de navegación.</translation> <translation id="7346909386216857016">Entendido</translation> +<translation id="7347770551817603360">Contenido sin conexión</translation> <translation id="7363354739009474003">Cargando "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">Transmitiendo a <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Tipo:</translation> @@ -482,6 +504,7 @@ <translation id="748127970106343339">Confirmar eliminación de credencial de dispositivo</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (actualización: <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Espera un momento…</translation> +<translation id="7499262814309712782">Cuenta para sincronización</translation> <translation id="7501135638693251872">Todos los marcadores</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Borrando datos de navegación</translation> @@ -527,18 +550,22 @@ <translation id="8050319187894766337">Guardada. Casi sin espacio.</translation> <translation id="8068648041423924542">No es posible seleccionar un certificado</translation> <translation id="8069239273282989646">Poscompresión</translation> +<translation id="8073388330009372546">Abrir imagen en pestaña nueva</translation> <translation id="8084156870963450514">Accede a tu cuenta para ver tu contenido web en cualquier dispositivo.</translation> <translation id="8106211421800660735">Número de tarjeta de crédito</translation> <translation id="813082847718468539">Consulta la información del sitio</translation> <translation id="8137558756159375272">La función Tocar para buscar envía la palabra seleccionada y la página actual como contexto a la Búsqueda de Google. Para desactivarla, accede a <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">No se guardó sin conexión</translation> <translation id="8168435359814927499">Contenido</translation> +<translation id="8173098127580644436">el principio</translation> <translation id="8200772114523450471">Reanudar</translation> <translation id="8209050860603202033">Abrir imagen</translation> <translation id="8218346974737627104">Confirmar acceso</translation> <translation id="8218934717680664417">Ahora puedes buscar con un toque</translation> +<translation id="8223946939421658889">Borrar datos desde</translation> <translation id="8261506727792406068">Eliminar</translation> <translation id="8275818695183729150">Permitir (en búsquedas de la barra de direcciones)</translation> +<translation id="8283853025636624853">Sincronizando con <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Pestañas estándar</translation> <translation id="8374821112118309944">Debes actualizar a una versión más reciente de TalkBack</translation> <translation id="8396312449826231789">Solo sitios aprobados</translation> @@ -546,6 +573,7 @@ <translation id="8413385045638830869">Preguntar primero (recomendado)</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8429160401486700187">Borrar las páginas guardadas</translation> +<translation id="8433057134996913067">Si realizas esta acción, saldrás de la mayoría de los sitios web.</translation> <translation id="8481940801237642152">Tu conexión con este sitio es privada, pero alguien en la red podría cambiar el aspecto de la página.</translation> <translation id="8493948351860045254">Liberar espacio</translation> <translation id="8497726226069778601">Aún no hay elementos para ver</translation> @@ -586,9 +614,11 @@ <translation id="8941248009481596111">Tu conexión con este sitio es privada.</translation> <translation id="8941729603749328384">www.ejemplo.com</translation> <translation id="8959122750345127698">Navegación inaccesible: <ph name="URL" /></translation> +<translation id="8979340629087822094">ayer</translation> <translation id="8987061207681586800">Personaliza Chrome</translation> <translation id="9019902583201351841">Administrado por tus padres</translation> <translation id="9020607083536754075">Cerrar la pestaña actual y volver a la app anterior</translation> +<translation id="9038649477754266430">Utilizar un servicio de predicción para cargar las páginas más rápido</translation> <translation id="9050666287014529139">Frase de contraseña</translation> <translation id="9060538597317784206">Ver aplicación <ph name="APP_NAME" /> en Play Store (calificación: <ph name="APP_RATING" />)</translation> <translation id="9063523880881406963">Desactivar la opción para solicitar versión de escritorio</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb index 9eb4fba..5e409a7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="es"> +<translation id="1040144152982955218">Buscando dispositivos… <ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Advertencia</translation> <translation id="10614374240317010">Contraseñas que nunca se guardan</translation> <translation id="1061441684050139317">Chrome necesita acceder al micrófono para compartirlo con este sitio web.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Añade una cuenta para ver tus marcadores, tu historial, tus contraseñas y otras opciones en todos tus dispositivos.</translation> <translation id="1098052486217676340">Finalizado</translation> <translation id="1121094540300013208">Informes de uso y sobre fallos</translation> +<translation id="1137305377394488060">última hora</translation> <translation id="1178581264944972037">Detener</translation> <translation id="1181037720776840403">Eliminar</translation> <translation id="1197267115302279827">Mover marcadores</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Doodle de Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Interrumpir</translation> <translation id="1285320974508926690">No traducir nunca este sitio</translation> +<translation id="1291207594882862231">Borrar el historial, las cookies, los datos del sitio web, la caché...</translation> <translation id="129553762522093515">Cerrado recientemente</translation> <translation id="1346090444609141578">No tienes páginas guardadas</translation> <translation id="1369915414381695676">Se ha añadido el sitio <ph name="SITE_NAME" /></translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Cámara</translation> <translation id="1623104350909869708">Evitar que esta página cree cuadros de diálogo adicionales</translation> <translation id="1641113438599504367">Navegación segura</translation> +<translation id="164269334534774161">Estás viendo una copia sin conexión de esta página del <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Traduciendo la página a <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Historial</translation> <translation id="1647391597548383849">Acceder a la cámara</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Se han restablecido tus ajustes de traducción.</translation> <translation id="2359808026110333948">Continuar</translation> <translation id="2381756643783702095">Preguntar antes de enviar (recomendado)</translation> +<translation id="2385560268894525395">semana pasada</translation> <translation id="2387895666653383613">Ajuste de texto</translation> <translation id="238909021488141516">Se ha producido un error al descargar el contenido.</translation> <translation id="2414886740292270097">Oscuro</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Actualizar página</translation> <translation id="2709516037105925701">Autocompletar</translation> <translation id="271033894570825754">Nuevo</translation> +<translation id="2742271047622814453">Es posible que se eliminen las preferencias guardadas en sitios web</translation> <translation id="2748463065602559597">Estás viendo una página de Google Chrome segura.</translation> <translation id="2762000892062317888">ahora mismo</translation> <translation id="2770465223704140727">Eliminar de la lista</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Esta cuenta está administrada por <ph name="PARENT_NAME_1" /> y <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Todos los derechos reservados.</translation> <translation id="2968755619301702150">Visor de certificados</translation> +<translation id="2996291259634659425">Crea una frase de contraseña</translation> <translation id="2996809686854298943">URL necesaria</translation> <translation id="3029704984691124060">Las frases de contraseña no coinciden</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Guardar vídeo</translation> <translation id="306566828762083630">El almacenamiento de tu dispositivo está lleno. Elimina algunos archivos para liberar espacio.</translation> <translation id="307329814453917357">Ofrece la traducción de páginas con el Traductor de Google</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Activa los permisos para Chrome en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de datos almacenados</translation> <translation id="3207960819495026254">Añadido a marcadores</translation> +<translation id="321773570071367578">Si has olvidado tu frase de contraseña o quieres cambiar esta opción, <ph name="BEGIN_LINK" />restablece la sincronización<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Micrófono</translation> <translation id="3232754137068452469">Aplicación web</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">¿Quieres continuar para descargar el contenido?</translation> <translation id="3328801116991980348">Información del sitio</translation> <translation id="3350687908700087792">Cerrar todas las pestañas de incógnito</translation> +<translation id="3351441609270267898">Importar los datos actuales</translation> <translation id="3358663646935160692">Esta cuenta está administrada por <ph name="DOMAIN_NAME" />. Vas a iniciar sesión con una cuenta administrada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Google Chrome. Tus datos de Chrome se vincularán de forma permanente a esta cuenta. Si desconectas esta cuenta, se eliminarán los datos locales de Chrome.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Nueva pestaña de incógnito</translation> <translation id="3501331331116143684">Página guardada sin conexión en <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Aceptar y continuar</translation> +<translation id="3522247891732774234">Actualización disponible. Más opciones</translation> <translation id="3527085408025491307">Carpeta</translation> <translation id="3549644494707163724">Encriptar todos los datos sincronizados con tu propia frase de contraseña de sincronización</translation> <translation id="360480449234699036">Obtén información sobre los temas que aparecen en los sitios web sin salir de la página. La función Tocar para buscar permite enviar una palabra y su contexto a la Búsqueda de Google para ver definiciones, imágenes, resultados de búsqueda y otra información. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Forzar zoom</translation> <translation id="3917783807003067648">La ubicación está bloqueada</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">últimas 4 semanas</translation> <translation id="393697183122708255">La búsqueda por voz no está disponible</translation> <translation id="3950820424414687140">Iniciar sesión</translation> <translation id="3988213473815854515">Se permite la ubicación</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Abrir en una pestaña nueva</translation> <translation id="4198229475320555619">Marcador de <ph name="PAGE_SIZE_STRING" /> guardado sin conexión</translation> <translation id="423410644998903704">Chrome necesita acceder a los permisos para compartirlos con este sitio web.</translation> +<translation id="424864128008805179">¿Cerrar sesión en Chrome?</translation> <translation id="4254813446494774748">Idioma de traducción:</translation> <translation id="4256782883801055595">Licencias de código abierto</translation> <translation id="4259722352634471385">Se ha bloqueado la navegación: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">En el futuro, las páginas de la Web física cercanas se mostrarán en tu lista de notificaciones</translation> <translation id="4498934959426056365">Generación de claves</translation> <translation id="4505554159887937799">Guardado sin conexión</translation> +<translation id="4508440807153586353">Solo alguien que tenga tu frase de contraseña puede leer tus datos cifrados. Google no envía ni almacena la frase de contraseña. Si la olvidas o quieres cambiar esta opción, debes restablecer la sincronización. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Hace # día}other{Hace # días}}</translation> <translation id="4522570452068850558">Detalles</translation> <translation id="4526249700380860531">Consulta y administra contraseñas guardadas en la página <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Nueva pestaña</translation> <translation id="5271967389191913893">El dispositivo no puede abrir el contenido para descargarlo.</translation> <translation id="5275558766013849309">Las pestañas aparecerán junto a aplicaciones recientes.</translation> +<translation id="5284584623296338184">Los cambios que realices en los marcadores, el historial, las contraseñas y otras opciones no se sincronizarán con tu cuenta de Google. Sin embargo, tus datos actuales seguirán almacenados en tu cuenta.</translation> <translation id="5301954838959518834">Entendido</translation> <translation id="5302048478445481009">Idioma</translation> <translation id="5304593522240415983">Este campo no puede estar vacío</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Editar nombre/contraseña o excepción guardados</translation> <translation id="5442257541162692417">Editar página guardada</translation> <translation id="544291274896356069">Saldrás del modo incógnito si este enlace se abre en una aplicación externa. ¿Quieres continuar?</translation> +<translation id="5487521232677179737">Borrar los datos</translation> <translation id="5487729733663684359">Ya no se admiten actualizaciones de Chrome para esta versión de Android.</translation> <translation id="5511351932351731210">Enviar siempre</translation> <translation id="5512137114520586844">Esta cuenta está administrada por <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Traductor de Google</translation> <translation id="5916664084637901428">Activar</translation> <translation id="5939518447894949180">Restablecer</translation> +<translation id="5965336165840183977">Se borrarán los datos sincronizados de todos los dispositivos. No se cerrará la sesión en tu cuenta de Google. No se eliminará la configuración guardada de los sitios web, lo cual puede reflejar tus hábitos de navegación.</translation> <translation id="5968595432776860642">Reproduciendo "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Accediendo a la entrada de vídeo</translation> <translation id="6012342843556706400">Chrome necesita acceder a la información de ubicación para compartirla con este sitio web.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Contenido protegido</translation> <translation id="6612856669344839356">Guardar marcador</translation> <translation id="6627583120233659107">Editar carpeta</translation> +<translation id="6647073004883890710">¿Quieres que <ph name="PASSWORD_MANAGER_BRAND" /> actualice la contraseña de <ph name="USERNAME" /> en este sitio web?</translation> <translation id="6656545060687952787">Chrome necesita acceder a la ubicación para buscar dispositivos. <ph name="BEGIN_LINK" />Actualizar los permisos<ph name="END_LINK" /></translation> <translation id="666268767214822976">Utiliza un servicio de predicciones para mostrar consultas relacionadas y sitios web populares a medida que escribes en la barra de direcciones</translation> <translation id="666981079809192359">Aviso de privacidad de Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">La página guardada no está disponible sin conexión</translation> <translation id="6722992508235227685">Tus marcadores, tu historial, tus contraseñas y otros ajustes se sincronizarán con tu cuenta de Google para que puedas utilizarlos en todos tus dispositivos. Puedes elegir lo que quieras que se sincronice en <ph name="BEGIN_LINK1" />Configuración<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Descargando…</translation> +<translation id="6762156594045689028">Para cambiar esta opción, <ph name="BEGIN_LINK" />restablece la sincronización<ph name="END_LINK" /></translation> <translation id="6770414673596662518">El sistema de navegación segura de Chrome también se utilizará para detectar páginas maliciosas y para proteger al usuario de la suplantación de identidad, del software malicioso y de las descargas peligrosas.</translation> <translation id="6784675033504223784">Busca "<ph name="SEARCH_TERM" />"</translation> <translation id="6790428901817661496">Reproducir</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Inicia sesión para ver tus marcadores, tu historial, tus contraseñas y otras opciones en todos tus dispositivos</translation> <translation id="6945221475159498467">Seleccionar</translation> <translation id="6963766334940102469">Eliminar marcadores</translation> -<translation id="6964496835063002391">Añadir una cuenta</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="6973630695168034713">Carpetas</translation> <translation id="6978479750597523876">Restablecer ajustes de traducción</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Conexión lenta detectada</translation> <translation id="7057058088140140610">Tarjetas de crédito y direcciones con Google Payments</translation> <translation id="7063006564040364415">No ha sido posible establecer conexión con el servidor de sincronización.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> quiere vincularse con:</translation> +<translation id="7081639897063626814">Mantener los datos actuales de forma independiente</translation> <translation id="7094922512924405309">No se han encontrado páginas de la Web física cercanas</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> pestañas abiertas</translation> <translation id="7096034533295549981">Cargando vídeo</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ayuda<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Eliminar marcador</translation> <translation id="7324738665594301612">Estamos probando el envío de páginas HTTPS a proxies a través de los servidores de Google como parte de un experimento.</translation> +<translation id="7346217184097589238">No se eliminará la configuración guardada de los sitios web, lo cual puede reflejar tus hábitos de navegación.</translation> <translation id="7346909386216857016">Entendido</translation> +<translation id="7347770551817603360">Contenido sin conexión</translation> <translation id="7363354739009474003">Cargando "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">Enviando contenido a <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Tipo:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Confirmar eliminación de credencial de dispositivo</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (actualizada el <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Espera…</translation> +<translation id="7499262814309712782">Cuenta que se sincronizará</translation> <translation id="7501135638693251872">Todos los marcadores</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Borrando datos de navegación</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Guard. sin conexión. Casi lleno.</translation> <translation id="8068648041423924542">No se puede seleccionar el certificado.</translation> <translation id="8069239273282989646">Después de comprimir</translation> +<translation id="8073388330009372546">Abrir en pestaña nueva</translation> <translation id="8084156870963450514">Inicia sesión para acceder a todo tu contenido web desde cualquier dispositivo</translation> <translation id="8106211421800660735">Número de la tarjeta de crédito</translation> <translation id="813082847718468539">Ver información del sitio</translation> <translation id="8137558756159375272">La función Tocar para buscar envía la palabra seleccionada y la página actual como contexto a la Búsqueda de Google. Puedes desactivarla en la <ph name="BEGIN_LINK" />configuración<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">No se ha guardado una copia sin conexión</translation> <translation id="8168435359814927499">Contenido</translation> +<translation id="8173098127580644436">el origen de los tiempos</translation> <translation id="8200772114523450471">Reanudar</translation> <translation id="8209050860603202033">Abrir imagen</translation> <translation id="8218346974737627104">Confirmar inicio de sesión</translation> <translation id="8218934717680664417">Ahora puedes realizar búsquedas con un toque</translation> +<translation id="8223946939421658889">Borrar datos de:</translation> <translation id="8261506727792406068">Eliminar</translation> <translation id="8275818695183729150">Permitir (para búsquedas en la barra de direcciones)</translation> +<translation id="8283853025636624853">Sincronizando con <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Pestañas estándar</translation> <translation id="8374821112118309944">Debes instalar una nueva versión de TalkBack.</translation> <translation id="8396312449826231789">Solo sitios aprobados</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Preguntar antes (recomendado)</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8429160401486700187">Eliminar páginas guardadas</translation> +<translation id="8433057134996913067">Con esta opción, tu sesión se cerrará en la mayoría de sitios web.</translation> <translation id="8481940801237642152">Tu conexión a este sitio es privada, pero alguien en la red podría cambiar la apariencia de la página.</translation> <translation id="8493948351860045254">Liberar espacio</translation> <translation id="8497726226069778601">Aún no tienes contenido</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Tu conexión con este sitio es privada.</translation> <translation id="8941729603749328384">www.ejemplo.com</translation> <translation id="8959122750345127698">No se puede realizar la navegación: <ph name="URL" /></translation> +<translation id="8979340629087822094">último día</translation> <translation id="8987061207681586800">Personaliza Chrome</translation> <translation id="9019902583201351841">Administrado por tus padres</translation> <translation id="9020607083536754075">Cerrar la pestaña actual y volver a la aplicación anterior</translation> +<translation id="9038649477754266430">Utilizar un servicio de predicciones para que las páginas se carguen más rápido</translation> <translation id="9050666287014529139">Frase de contraseña</translation> <translation id="9060538597317784206">Ver la aplicación <ph name="APP_NAME" /> en Play Store. Valoración: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Desactivar opción para solicitar sitio de escritorio</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb index f52d1cb..c1db9b5c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">توقف</translation> <translation id="1285320974508926690">این سایت هرگز ترجمه نشود</translation> +<translation id="1291207594882862231">پاک کردن سابقه، کوکیها، دادههای سایت، حافظه پنهان…</translation> <translation id="129553762522093515">اخیراً بسته شده</translation> <translation id="1346090444609141578">صفحه ذخیرهشدهای در اینجا موجود نیست</translation> <translation id="1369915414381695676">سایت <ph name="SITE_NAME" /> اضافه شد</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">دوربین</translation> <translation id="1623104350909869708">جلوگیری از ایجاد پنجرههای اضافی توسط این صفحه</translation> <translation id="1641113438599504367">مرور ایمن</translation> +<translation id="164269334534774161">شما در حال تماشای کپی آفلاین این صفحه از <ph name="CREATION_TIME" /> هستید</translation> <translation id="1643702317193804718">درحال ترجمه صفحه به <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">سابقه</translation> <translation id="1647391597548383849">دسترسی به دوربین</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">بازخوانی صفحه</translation> <translation id="2709516037105925701">تکمیل خودکار</translation> <translation id="271033894570825754">جدید</translation> +<translation id="2742271047622814453">تنظیمات برگزیده ذخیرهشده در سایتها ممکن است حذف شوند</translation> <translation id="2748463065602559597">شما در حال مشاهده یک صفحه امن Google Chrome هستید.</translation> <translation id="2762000892062317888">هماکنون</translation> <translation id="2770465223704140727">حذف از لیست</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">ادامه میدهید و محتوا را دانلود میکنید؟</translation> <translation id="3328801116991980348">اطلاعات سایت</translation> <translation id="3350687908700087792">بستن همه برگههای ناشناس</translation> +<translation id="3351441609270267898">وارد کردن دادههای موجود</translation> <translation id="3358663646935160692"><ph name="DOMAIN_NAME" /> این حساب را مدیریت میکند. شما با یک حساب مدیریت شده وارد سیستم میشوید و به سرپرست این حساب اجازه کنترل نمایه Chrome خود را میدهید. دادههای Chrome شما بهطور ثابت با این حساب مرتبط میشود. با قطع ارتباط از این حساب، کلیه دادههای Chrome شما در دستگاه حذف میشود.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">برگه ناشناس جدید</translation> <translation id="3501331331116143684">صفحه بهصورت آفلاین در <ph name="FOLDER_NAME" /> ذخیره شد</translation> <translation id="3518985090088779359">پذیرش و ادامه</translation> +<translation id="3522247891732774234">بهروزرسانی موجود است. گزینههای بیشتر</translation> <translation id="3527085408025491307">پوشه</translation> <translation id="3549644494707163724">رمزگذاری همه دادههای همگامسازیشده با رمزعبارتی همگامسازی خودتان</translation> <translation id="360480449234699036">بدون ترک صفحه با موضوعات موجود در وبسایتها آشنا شوید. لمس کردن برای جستجو، کلمه و نوشتار اطراف آن را به جستجوی Google ارسال میکند و معانی، تصاویر، نتایج جستجو و سایر جزئیات را برمیگرداند. @@ -221,8 +226,7 @@ <translation id="4195643157523330669">باز کردن در برگهٔ جدید</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> نشانک بهصورت آفلاین ذخیره شد</translation> <translation id="423410644998903704">Chrome باید به مجوزها دسترسی داشته باشد تا آنها را با این سایت به اشتراک بگذارد.</translation> -<translation id="4247939399682707041">دادههای این دستگاه با دادههای <ph name="ACCOUNT" /> جایگزین میشود. با جابهجایی به <ph name="ACCOUNT" />، میتوانید دادههای موجودتان را بازیابی کنید.</translation> -<translation id="424864128008805179">از Chrome ثبت خروج میکنید؟</translation> +<translation id="424864128008805179">از سیستم Chrome خارج می شوید؟</translation> <translation id="4254813446494774748">زبان ترجمه:</translation> <translation id="4256782883801055595">مجوزهای منبع آزاد</translation> <translation id="4259722352634471385">پیمایش مسدود است: <ph name="URL" /></translation> @@ -371,7 +375,7 @@ <translation id="5911030830365207728">Google Translate</translation> <translation id="5916664084637901428">روشن</translation> <translation id="5939518447894949180">بازنشانی</translation> -<translation id="5965336165840183977">با این کار دادههای همگامسازیشده پاک میشود. از سیستم حساب Google خود ثبت خروج نمیشوید. تنظیمات سایت ذخیرهشده حذف نخواهند شد و میتوانند منعکسکننده عادات مرور شما باشند.</translation> +<translation id="5965336165840183977">با این کار دادههای همگامسازیشده پاک میشود. از سیستم حساب Google خود خارج نمیشوید. تنظیمات سایت ذخیرهشده حذف نخواهند شد و میتوانند منعکسکننده عادات مرور شما باشند.</translation> <translation id="5968595432776860642">در حال پخش «<ph name="VIDEO_TITLE" />»</translation> <translation id="6010869025736512584">در حال دسترسی به ورودی ویدیویی</translation> <translation id="6012342843556706400">Chrome باید به موقعیت مکانی دسترسی داشته باشد تا آن را با این سایت به اشتراک بگذارد.</translation> @@ -424,6 +428,7 @@ <translation id="6612358246767739896">محتوای محافظتشده</translation> <translation id="6612856669344839356">ذخیره نشانک</translation> <translation id="6627583120233659107">ویرایش پوشه</translation> +<translation id="6647073004883890710">میخواهید <ph name="PASSWORD_MANAGER_BRAND" /> گذرواژه <ph name="USERNAME" /> را برای این سایت بهروزرسانی کند؟</translation> <translation id="6656545060687952787">Chrome برای جستجوی دستگاهها باید به مکان دسترسی داشته باشد. <ph name="BEGIN_LINK" />بهروزرسانی مجوزها<ph name="END_LINK" /></translation> <translation id="666268767214822976">از یک سرویس پیشبینی استفاده میشود تا همزمان با تایپ کردن شما در نوار آدرس، عبارتهای جستجوی مرتبط و وبسایتهای محبوب نشان داده شوند</translation> <translation id="666981079809192359">اخطار حریم خصوصی Chrome</translation> @@ -451,7 +456,6 @@ <translation id="6868088497967843822">برای دریافت نشانکها، سابقه، گذرواژهها و سایر تنظیماتتان در همه دستگاههایتان، به سیستم وارد شوید</translation> <translation id="6945221475159498467">انتخاب</translation> <translation id="6963766334940102469">حذف نشانکها</translation> -<translation id="6964496835063002391">افزودن حساب</translation> <translation id="6965382102122355670">تأیید</translation> <translation id="6973630695168034713">پوشهها</translation> <translation id="6978479750597523876">بازنشانی تنظیمات ترجمه</translation> @@ -483,6 +487,7 @@ <translation id="7324738665594301612">در حال آزمایش پروکسی کردن صفحات HTTPS از طریق سرورهای Google به عنوان بخشی از یک آزمایش هستیم.</translation> <translation id="7346217184097589238">تنظیمات سایت ذخیرهشده حذف نخواهند شد و میتوانند منعکسکننده عادات مرور شما باشند.</translation> <translation id="7346909386216857016">بله متوجه شدم.</translation> +<translation id="7347770551817603360">محتوای آفلاین</translation> <translation id="7363354739009474003">در حال بارگیری «<ph name="VIDEO_TITLE" />»</translation> <translation id="7366340029385295517">درحال فرستادن به <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">نوع:</translation> @@ -543,6 +548,7 @@ <translation id="8050319187894766337">صفحه بهصورت آفلاین ذخیره شد. حافظه پر است.</translation> <translation id="8068648041423924542">انتخاب گواهی ممکن نیست.</translation> <translation id="8069239273282989646">بعد از فشردهسازی</translation> +<translation id="8073388330009372546">باز کردن تصویر در برگه جدید</translation> <translation id="8084156870963450514">به سیستم وارد شوید تا از هر دستگاهی به محتوای وبیتان دسترسی داشته باشید</translation> <translation id="8106211421800660735">شماره کارت اعتباری</translation> <translation id="813082847718468539">مشاهدهٔ اطلاعات سایت</translation> @@ -565,6 +571,7 @@ <translation id="8413385045638830869">ابتدا سؤال شود (توصیه میشود)</translation> <translation id="8428213095426709021">تنظیمات</translation> <translation id="8429160401486700187">حذف صفحههای ذخیرهشده</translation> +<translation id="8433057134996913067">با این کار از سیستم بیشتر وبسایتها خارج میشوید.</translation> <translation id="8481940801237642152">اتصال شما به این سایت خصوصی است، اما ممکن است شخصی در شبکه بتواند ظاهر این صفحه را تغییر دهد.</translation> <translation id="8493948351860045254">آزاد کردن فضا</translation> <translation id="8497726226069778601">هنوز… چیزی برای دیدن وجود ندارد</translation> @@ -609,6 +616,7 @@ <translation id="8987061207681586800">Chrome را برای خود اختصاصی کنید</translation> <translation id="9019902583201351841">مدیریت شده توسط والدین شما</translation> <translation id="9020607083536754075">بستن برگه کنونی و برگشت و به برنامه قبلی</translation> +<translation id="9038649477754266430">استفاده از یک سرویس پیشبینی برای بار کردن سریعتر صفحهها</translation> <translation id="9050666287014529139">عبارت عبور</translation> <translation id="9060538597317784206">مشاهده برنامه <ph name="APP_NAME" /> در فروشگاه Play. رتبهبندی: <ph name="APP_RATING" /></translation> <translation id="9063523880881406963">خاموش کردن درخواست سایت رایانهای</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb index 9e52d58..18af71e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Google-piirros: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Pysäytä</translation> <translation id="1285320974508926690">Älä käännä tätä sivustoa</translation> +<translation id="1291207594882862231">Tyhjennä historia, evästeet, sivustojen tiedot, välimuisti ja niin edelleen.</translation> <translation id="129553762522093515">Hiljattain suljetut välilehdet</translation> <translation id="1346090444609141578">Ei tallennettuja sivuja</translation> <translation id="1369915414381695676">Sivusto <ph name="SITE_NAME" /> lisättiin.</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">kameraasi</translation> <translation id="1623104350909869708">Estä tätä sivua luomasta muita viestejä</translation> <translation id="1641113438599504367">Selaussuoja</translation> +<translation id="164269334534774161">Katselet sivun offline-kopiota, joka luotiin <ph name="CREATION_TIME" />.</translation> <translation id="1643702317193804718">Käännetään sivua kielelle <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Historia</translation> <translation id="1647391597548383849">Kameran käyttöoikeus</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Päivitä sivu</translation> <translation id="2709516037105925701">Automaattinen täyttö</translation> <translation id="271033894570825754">Uusi</translation> +<translation id="2742271047622814453">Sivustojen tallennetut asetukset saatetaan tyhjentää.</translation> <translation id="2748463065602559597">Katselet suojattua Google Chrome -sivua.</translation> <translation id="2762000892062317888">äsken</translation> <translation id="2770465223704140727">Poista luettelosta</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Jatketaanko sisällön lataamiseen?</translation> <translation id="3328801116991980348">Tietoja sivustosta</translation> <translation id="3350687908700087792">Sulje kaikki incognito-välilehdet.</translation> +<translation id="3351441609270267898">Tuo olemassa olevat tiedot</translation> <translation id="3358663646935160692">Tätä tiliä hallinnoi <ph name="DOMAIN_NAME" />. Olet kirjautumassa hallinnoituun tiliin, jonka hallinnoijalla on oikeus muokata Chrome-profiiliasi. Chrome-tietosi yhdistetään tähän tiliin pysyvästi. Jos irrotat Chrome-tiedot tilistä, paikalliset Chrome-tiedot poistetaan.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Uusi incognito-välilehti</translation> <translation id="3501331331116143684">Sivu talennettu kansioon <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Hyväksy ja jatka</translation> +<translation id="3522247891732774234">Päivitys on saatavilla. Näytä lisäasetukset.</translation> <translation id="3527085408025491307">Kansio</translation> <translation id="3549644494707163724">Salaa kaikki synkronoidut tiedot oman synkronoinnin tunnuslauseesi avulla</translation> <translation id="360480449234699036">Lue lisätietoja verkkosivujen aiheista poistumatta sivulta. Koskettamalla hakeminen lähettää sanan ja sen asiayhteyden Google-hakuun ja palauttaa määritelmiä, kuvia, hakutuloksia ja muita tietoja. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Avaa uudessa välilehdessä</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> kirjanmerkki tallennettu offline-tilassa</translation> <translation id="423410644998903704">Chrome tarvitsee käyttöoikeuksien käyttöoikeuden voidakseen jakaa sen tämän sivuston kanssa.</translation> -<translation id="4247939399682707041">Laitteen tiedot korvataan tilin <ph name="ACCOUNT" /> tiedoilla. Voit palauttaa nykyiset tiedot kirjautumalla takaisin tilille <ph name="ACCOUNT" />.</translation> <translation id="424864128008805179">Kirjaudutaanko ulos Chromesta?</translation> <translation id="4254813446494774748">Käännöksen kieli:</translation> <translation id="4256782883801055595">Avoimen lähdekoodin käyttöluvat</translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">Suojattu sisältö</translation> <translation id="6612856669344839356">Tallenna kirjanmerkki</translation> <translation id="6627583120233659107">Muokkaa kansiota</translation> +<translation id="6647073004883890710">Haluatko, että <ph name="PASSWORD_MANAGER_BRAND" /> päivittää tilin <ph name="USERNAME" /> salasanan tällä sivustolla?</translation> <translation id="6656545060687952787">Chrome tarvitsee sijaintitietojen käyttöoikeuden hakeakseen laitteita. <ph name="BEGIN_LINK" />Päivitä käyttöoikeudet<ph name="END_LINK" />.</translation> <translation id="666268767214822976">Käytä ennakointipalvelua, joka näyttää sinulle aiheeseen liittyviä kyselyitä sekä suosittuja verkkosivustoja kirjoittaessasi osoitepalkkiin.</translation> <translation id="666981079809192359">Chromen tietosuojailmoitus</translation> @@ -452,7 +457,6 @@ <translation id="6868088497967843822">Kirjaudu ja käytä kirjanmerkkejä, historiaa, salasanoja ja muita asetuksiasi kaikissa laitteissasi.</translation> <translation id="6945221475159498467">Valitse</translation> <translation id="6963766334940102469">Poista kirjanmerkkejä</translation> -<translation id="6964496835063002391">Lisää tili.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Kansiot</translation> <translation id="6978479750597523876">Nollaa käännösasetukset</translation> @@ -484,6 +488,7 @@ <translation id="7324738665594301612">Testaamme HTTPS-sivujen lähettämistä Googlen välityspalvelimien kautta osana kokeilua.</translation> <translation id="7346217184097589238">Tallennettuja sivustoasetuksia ei poisteta, ja ne saattavat liittyä selaustapoihisi.</translation> <translation id="7346909386216857016">OK!</translation> +<translation id="7347770551817603360">Offline-sisältö</translation> <translation id="7363354739009474003">Ladataan videota <ph name="VIDEO_TITLE" /></translation> <translation id="7366340029385295517">Suoratoistetaan näytöllä <ph name="SCREEN_NAME" />.</translation> <translation id="7375125077091615385">Tyyppi:</translation> @@ -544,6 +549,7 @@ <translation id="8050319187894766337">Offline-sivu tallennettu. Tall.tila lähes täynnä.</translation> <translation id="8068648041423924542">Varmenteen valinta epäonnistui</translation> <translation id="8069239273282989646">Pakkaamisen jälkeen</translation> +<translation id="8073388330009372546">Avaa kuva uudessa välilehdessä</translation> <translation id="8084156870963450514">Kirjaudu sisään, niin voit käyttää verkkosisältöäsi millä tahansa laitteella.</translation> <translation id="8106211421800660735">Luottokortin numero</translation> <translation id="813082847718468539">Näytä sivuston tiedot</translation> @@ -566,6 +572,7 @@ <translation id="8413385045638830869">Kysy ensin (suositus)</translation> <translation id="8428213095426709021">Asetukset</translation> <translation id="8429160401486700187">Poista tallennetut sivut</translation> +<translation id="8433057134996913067">Sinut kirjataan ulos useimmilta verkkosivustoilta.</translation> <translation id="8481940801237642152">Sivustoon on muodostettu salattu yhteys, mutta verkon käyttäjät voivat päästä muokkaamaan sivun ulkoasua.</translation> <translation id="8493948351860045254">Vapauta tilaa</translation> <translation id="8497726226069778601">Täällä ei ole mitään nähtävää… vielä</translation> @@ -610,6 +617,7 @@ <translation id="8987061207681586800">Muokkaa Chromea</translation> <translation id="9019902583201351841">Vanhempiesi hallinnoima</translation> <translation id="9020607083536754075">Sulje nykyinen välilehti ja palaa edelliseen sovellukseen</translation> +<translation id="9038649477754266430">Ennakointipalvelun avulla voit ladata sivuja nopeammin</translation> <translation id="9050666287014529139">Tunnuslause</translation> <translation id="9060538597317784206">Näytä sovellus <ph name="APP_NAME" /> Play Kaupassa. Luokitus: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Poista käytöstä Käytä tietokoneversiota</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb index bdba86b..2722d70 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fil"> +<translation id="1040144152982955218">Naghahanap ng mga device… <ph name="BEGIN_LINK" />humingi ng tulong<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Babala</translation> <translation id="10614374240317010">Hindi kailanman nag-save</translation> <translation id="1061441684050139317">Kailangan ng Chrome ng access sa mikropono upang maibahagi ito sa site na ito.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Magdagdag ng account upang makuha ang iyong mga bookmark, history, password at ibang mga setting sa lahat ng iyong device.</translation> <translation id="1098052486217676340">Tapos na</translation> <translation id="1121094540300013208">Mga ulat sa paggamit at pag-crash</translation> +<translation id="1137305377394488060">nakalipas na oras</translation> <translation id="1178581264944972037">I-pause</translation> <translation id="1181037720776840403">Alisin</translation> <translation id="1197267115302279827">Ilipat ang mga bookmark</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Stop</translation> <translation id="1285320974508926690">Huwag isalin kailanman ang site na ito</translation> +<translation id="1291207594882862231">I-clear ang history, cookies, site data, cache…</translation> <translation id="129553762522093515">Kamakailang isinara</translation> <translation id="1346090444609141578">Walang mga naka-save na page dito</translation> <translation id="1369915414381695676">Nadagdag na ang site ng <ph name="SITE_NAME" /></translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Camera</translation> <translation id="1623104350909869708">Pigilan ang pahinang ito sa paggawa ng mga karagdagang dialog</translation> <translation id="1641113438599504367">Ligtas na Pagba-browse</translation> +<translation id="164269334534774161">Tinitingnan mo ang offline na kopya ng page na ito mula sa <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Isinasalin ang page sa <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">History</translation> <translation id="1647391597548383849">I-access ang iyong camera</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Na-reset ang iyong mga setting sa pag-translate.</translation> <translation id="2359808026110333948">Magpatuloy</translation> <translation id="2381756643783702095">Magtanong bago magpadala (inirerekomenda)</translation> +<translation id="2385560268894525395">nakalipas na linggo</translation> <translation id="2387895666653383613">Pag-scale ng text</translation> <translation id="238909021488141516">Nagkaroon ng error habang dina-download ang content.</translation> <translation id="2414886740292270097">Madilim</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">I-refresh ang page</translation> <translation id="2709516037105925701">AutoFill</translation> <translation id="271033894570825754">Bago</translation> +<translation id="2742271047622814453">Maaaring ma-delete ang mga naka-save na kagustuhan sa mga site</translation> <translation id="2748463065602559597">Tumitingin ka sa isang secure na pahina ng Google Chrome.</translation> <translation id="2762000892062317888">ngayon lang</translation> <translation id="2770465223704140727">Alisin sa listahan</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Pinapamahalaan ang account na ito ng <ph name="PARENT_NAME_1" /> at <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Nakalaan ang lahat ng karapatan.</translation> <translation id="2968755619301702150">Viewer ng certificate</translation> +<translation id="2996291259634659425">Gumawa ng passphrase</translation> <translation id="2996809686854298943">Kinakailangan ang URL</translation> <translation id="3029704984691124060">Hindi nagtutugma ang mga passphrase</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Humingi ng tulong<ph name="END_LINK" /></translation> <translation id="3063601790762993062">I-save ang video</translation> <translation id="306566828762083630">Puno na ang storage ng iyong device. Mangyaring alisin ang iba pang media upang magkaroon ng espasyo.</translation> <translation id="307329814453917357">Mag-alok na magsalin ng mga page sa pamamagitan ng Google Translate</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">I-on ang mga pahintulot para sa Chrome sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> ang nakaimbak na data</translation> <translation id="3207960819495026254">Naka-bookmark</translation> +<translation id="321773570071367578">Kung nakalimutan mo ang iyong passphrase o gusto mong baguhin ang setting na ito, <ph name="BEGIN_LINK" />i-reset ang pag-sync<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikropono</translation> <translation id="3232754137068452469">Web App</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Magpatuloy na i-download ang content?</translation> <translation id="3328801116991980348">Impormasyon ng site</translation> <translation id="3350687908700087792">Isara ang lahat ng incognito na tab</translation> +<translation id="3351441609270267898">I-import ang kasalukuyang data</translation> <translation id="3358663646935160692">Pinamamahalaan ang account na ito ng <ph name="DOMAIN_NAME" />. Nagsa-sign in ka sa isang pinamamahalaang account at nagbibigay sa administrator nito ng kontrol sa iyong profile sa Chrome. Permanenteng mauugnay ang iyong data ng Chrome sa account na ito. Ang pagdiskonekta mula sa account na ito ay magtatanggal sa lokal na data ng Chrome.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Bagong tab na incognito</translation> <translation id="3501331331116143684">Na-save offline ang page sa <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Tanggapin, magpatuloy</translation> +<translation id="3522247891732774234">May available na update. Higit pang mga opsyon</translation> <translation id="3527085408025491307">Folder</translation> <translation id="3549644494707163724">I-encrypt ang lahat ng naka-sync na data gamit ang sarili mong passphrase sa pag-sync</translation> <translation id="360480449234699036">Matuto tungkol sa mga paksa sa mga website nang hindi umaalis sa page. Ipapadala ng Touch to Search ang isang salita at ang konteksto nito sa Google Search, at magbibigay ito ng mga pagpapakahulugan, larawan, resulta ng paghahanap at iba pang mga detalye. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Puwersahang i-enable ang zoom</translation> <translation id="3917783807003067648">Na-block ang lokasyon</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">nakalipas na 4 na linggo</translation> <translation id="393697183122708255">Walang available na naka-enable na paghahanap gamit ang boses</translation> <translation id="3950820424414687140">Mag-sign in</translation> <translation id="3988213473815854515">Pinapahintulutan ang lokasyon</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Buksan sa bagong tab</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> na bookmark ang na-save offline</translation> <translation id="423410644998903704">Kailangan ng Chrome ng access sa pahintulot upang maibahagi ang mga ito sa site na ito.</translation> +<translation id="424864128008805179">Mag-sign out sa Chrome?</translation> <translation id="4254813446494774748">Wika ng Pagsasalin:</translation> <translation id="4256782883801055595">Mga lisensya ng open source</translation> <translation id="4259722352634471385">Naka-block ang navigation: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Lalabas sa iyong listahan ng mga notification ang mga kalapit na page ng Pisikal na Web sa hinaharap</translation> <translation id="4498934959426056365">Pagbuo ng key</translation> <translation id="4505554159887937799">Na-save offline</translation> +<translation id="4508440807153586353">Ang taong may alam ng iyong passphrase lang ang makakabasa sa iyong naka-encrypt na data. Hindi ipinapadala sa o iniimbak ng Google ang passphrase. Kung makakalimutan mo ang iyong passphrase o gusto mong baguhin ang setting na ito, kakailanganin mong i-reset ang pag-sync. <ph name="BEGIN_LINK" />Matuto nang higit pa<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# araw ang nakalipas}one{# araw ang nakalipas}other{# na araw ang nakalipas}}</translation> <translation id="4522570452068850558">Mga Detalye</translation> <translation id="4526249700380860531">Tingnan at pamahalaan ang mga naka-save na password sa <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Bagong tab</translation> <translation id="5271967389191913893">Hindi mabuksan ng device ang content na ida-download.</translation> <translation id="5275558766013849309">Magsasama-sama ang mga tab at kamakailang app.</translation> +<translation id="5284584623296338184">Hindi na masi-sync sa iyong Google Account ang mga pagbabago sa iyong mga bookmark, history, password at iba pang mga setting. Gayunpaman, mananatiling nakaimbak sa iyong Google account ang iyong kasalukuyang data.</translation> <translation id="5301954838959518834">OK, nakuha ko na</translation> <translation id="5302048478445481009">Wika</translation> <translation id="5304593522240415983">Hindi maaaring maging blangko ang field na ito</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">I-edit ang naka-save na pangalan/password o pagbubukod</translation> <translation id="5442257541162692417">I-edit ang naka-save na page</translation> <translation id="544291274896356069">Aalis ka sa incognito mode kung bubuksan mo ang link na ito sa isang panlabas na application. Gusto mo bang magpatuloy?</translation> +<translation id="5487521232677179737">I-clear ang data</translation> <translation id="5487729733663684359">Hindi na sinusuportahan ang mga update sa Chrome para sa bersyong ito ng Android.</translation> <translation id="5511351932351731210">Palaging ipadala</translation> <translation id="5512137114520586844">Pinapamahalaan ang account na ito ng <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Translate</translation> <translation id="5916664084637901428">Naka-on</translation> <translation id="5939518447894949180">I-reset</translation> +<translation id="5965336165840183977">Kini-clear nito ang naka-sync na data sa lahat ng device. Hindi ka masa-sign out sa iyong Google account. Hindi made-delete ang mga naka-save na setting ng site at maaari nitong ipakita ang iyong mga gawi sa pagba-browse.</translation> <translation id="5968595432776860642">Pine-play ang “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Ina-access ang input ng video</translation> <translation id="6012342843556706400">Kailangan ng Chrome ng access sa lokasyon upang maibahagi ito sa site na ito.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Pinoprotektahang content</translation> <translation id="6612856669344839356">I-save ang bookmark</translation> <translation id="6627583120233659107">I-edit ang folder</translation> +<translation id="6647073004883890710">Gusto mo bang i-update ng <ph name="PASSWORD_MANAGER_BRAND" /> ang password para kay <ph name="USERNAME" /> para sa site na ito?</translation> <translation id="6656545060687952787">Kailangan ng Chrome ng access sa lokasyon upang makapag-scan at makakita ng mga device. <ph name="BEGIN_LINK" />I-update ang mga pahintulot<ph name="END_LINK" /></translation> <translation id="666268767214822976">Gumamit ng serbisyo sa paghula upang magpakita ng mga nauugnay na query at sikat na website habang nagta-type ka sa address bar</translation> <translation id="666981079809192359">Notification ng Privacy ng Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Hindi available offline ang na-save na page</translation> <translation id="6722992508235227685">Isi-sync ang iyong mga bookmark, history, password at iba pang mga setting sa iyong Google Account upang magamit mo ang mga ito sa lahat ng iyong device. Mapipili mo kung ano ang isi-sync sa <ph name="BEGIN_LINK1" />Mga Setting<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Nagda-download...</translation> +<translation id="6762156594045689028">Upang baguhin ang setting na ito, <ph name="BEGIN_LINK" />i-reset ang pag-sync<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Ang Chrome ay mayroong system na Ligtas na Pagba-browse para malaman kung aling mga page ang hindi ligtas gamitin. Mapoprotektahan ka nito mula sa phishing, malware at mga download na nakakasama.</translation> <translation id="6784675033504223784">Hanapin ang “<ph name="SEARCH_TERM" />”</translation> <translation id="6790428901817661496">I-play</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Mag-sign in upang makuha ang iyong mga bookmark, history, password at ibang mga setting sa lahat ng iyong device</translation> <translation id="6945221475159498467">Pumili</translation> <translation id="6963766334940102469">Mag-delete ng mga bookmark</translation> -<translation id="6964496835063002391">Magdagdag ng account</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Mga Folder</translation> <translation id="6978479750597523876">I-reset ang mga setting ng pag-translate</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Nakita na mabagal ang koneksyon</translation> <translation id="7057058088140140610">Mga credit card at address na gumagamit ng Google Payments</translation> <translation id="7063006564040364415">Hindi makakonekta sa server ng pag-sync.</translation> +<translation id="7074853159844403180">Gustong makipagpares ng <ph name="SITE" /> sa:</translation> +<translation id="7081639897063626814">Panatilihing hiwalay ang kasalukuyang data</translation> <translation id="7094922512924405309">Walang nakitang kalapit na mga page ng Pisikal na Web</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> (na) tab ang nakabukas</translation> <translation id="7096034533295549981">Naglo-load</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Tulong<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Tanggalin ang bookmark</translation> <translation id="7324738665594301612">Sinusubukan namin ang pagpo-proxy ng mga HTTPS page sa pamamagitan ng mga server ng Google bilang bahagi ng isang eksperimento.</translation> +<translation id="7346217184097589238">Hindi made-delete ang mga naka-save na setting ng site at maaari nitong ipakita ang iyong mga gawi sa pagba-browse.</translation> <translation id="7346909386216857016">Ok, nakuha ko</translation> +<translation id="7347770551817603360">Offline na content</translation> <translation id="7363354739009474003">Nilo-load ang “<ph name="VIDEO_TITLE" />”</translation> <translation id="7366340029385295517">Nagka-cast sa <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Uri:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Kumpirmahin ang pagde-delete ng kredensyal ng device</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (Na-update <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Mangyaring maghintay…</translation> +<translation id="7499262814309712782">Account sa pag-sync</translation> <translation id="7501135638693251872">Lahat ng bookmark</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Kini-clear ang data mula sa pagba-browse</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Na-save ang page offline. Halos puno na ang storage.</translation> <translation id="8068648041423924542">Hindi makapili ng certificate.</translation> <translation id="8069239273282989646">Pagkatapos ng compression</translation> +<translation id="8073388330009372546">Buksan ang larawan sa bagong tab</translation> <translation id="8084156870963450514">Mag-sign in upang i-access ang lahat ng iyong bagay sa web mula sa anumang device</translation> <translation id="8106211421800660735">Numero ng credit card</translation> <translation id="813082847718468539">Tingnan ang impormasyon ng site</translation> <translation id="8137558756159375272">Ipinadadala ng Pindutin upang Hanapin ang piniling salita at ang kasalukuyang page bilang konteksto sa Paghahanap sa Google. Maaari mo itong i-off sa <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Hindi na-save offline</translation> <translation id="8168435359814927499">Content</translation> +<translation id="8173098127580644436">mula sa umpisa</translation> <translation id="8200772114523450471">Resume</translation> <translation id="8209050860603202033">Buksan ang larawan</translation> <translation id="8218346974737627104">Kumpirmahin ang pag-sign in</translation> <translation id="8218934717680664417">Makakapaghanap ka na ngayon sa isang pagpindot lang</translation> +<translation id="8223946939421658889">I-clear ang data sa</translation> <translation id="8261506727792406068">Burahin</translation> <translation id="8275818695183729150">Payagan (para sa mga paghahanap sa address bar)</translation> +<translation id="8283853025636624853">Sini-sync sa <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Mga karaniwang tab</translation> <translation id="8374821112118309944">Kailangan mong i-update ang TalkBack sa isang mas bagong bersyon.</translation> <translation id="8396312449826231789">Mga naaprubahang site lang</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Magtanong muna (inirerekomenda)</translation> <translation id="8428213095426709021">Mga Setting</translation> <translation id="8429160401486700187">I-delete ang naka-save na page</translation> +<translation id="8433057134996913067">Masa-sign out ka sa karamihan ng mga website.</translation> <translation id="8481940801237642152">Pribado ang iyong koneksyon sa site na ito, ngunit maaaring mabago ng isang tao sa network ang hitsura ng page.</translation> <translation id="8493948351860045254">Magbakante ng espasyo</translation> <translation id="8497726226069778601">Walang makikita dito... sa ngayon</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Pribado ang iyong koneksyon sa site na ito.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Hindi gumagana ang navigation: <ph name="URL" /></translation> +<translation id="8979340629087822094">nakalipas na araw</translation> <translation id="8987061207681586800">I-personalize ang iyong Chrome</translation> <translation id="9019902583201351841">Pinamamahalaan ng iyong mga magulang</translation> <translation id="9020607083536754075">Isara ang kasalukuyang tab at bumalik sa nakaraang app</translation> +<translation id="9038649477754266430">Gumamit ng serbisyo sa paghula upang ma-load ang mga page nang mas mabilis</translation> <translation id="9050666287014529139">Passphrase</translation> <translation id="9060538597317784206">Tingnan ang app na <ph name="APP_NAME" /> sa Play Store. Rating: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">I-off ang Hilingin ang site sa desktop</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb index 47935660..24f2ee8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr"> +<translation id="1040144152982955218">Recherche d'appareils… <ph name="BEGIN_LINK" />Obtenir de l'aide<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Avertissement</translation> <translation id="10614374240317010">Jamais enregistrés</translation> <translation id="1061441684050139317">Chrome doit disposer de l'accès au micro pour le partager avec ce site.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Ajoutez un compte pour récupérer vos favoris, votre historique, vos mots de passe et d'autres paramètres sur tous vos appareils.</translation> <translation id="1098052486217676340">Terminé</translation> <translation id="1121094540300013208">Statistiques d'utilisation et rapports d'erreur</translation> +<translation id="1137305377394488060">de la dernière heure</translation> <translation id="1178581264944972037">Suspendre</translation> <translation id="1181037720776840403">Supprimer</translation> <translation id="1197267115302279827">Déplacer les favoris</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Doodle : <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Arrêter</translation> <translation id="1285320974508926690">Ne jamais traduire ce site</translation> +<translation id="1291207594882862231">Effacer l'historique, vider le cache, supprimer les cookies et les données du site…</translation> <translation id="129553762522093515">Récemment fermés</translation> <translation id="1346090444609141578">Aucune page enregistrée ici</translation> <translation id="1369915414381695676">Site "<ph name="SITE_NAME" />" ajouté</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Appareil photo</translation> <translation id="1623104350909869708">Empêcher cette page de générer des boîtes de dialogue supplémentaires</translation> <translation id="1641113438599504367">Navigation sécurisée</translation> +<translation id="164269334534774161">Vous regardez une copie hors connexion de cette page depuis le <ph name="CREATION_TIME" />.</translation> <translation id="1643702317193804718">Traduction de la page en <ph name="SOURCE_LANGUAGE" /> en cours…</translation> <translation id="1644574205037202324">Historique</translation> <translation id="1647391597548383849">Accéder à votre caméra</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Les paramètres de traduction ont été réinitialisés.</translation> <translation id="2359808026110333948">Continuer</translation> <translation id="2381756643783702095">Demander l'autorisation avant d'envoyer (recommandé)</translation> +<translation id="2385560268894525395">de la dernière semaine</translation> <translation id="2387895666653383613">Mise à l'échelle du texte</translation> <translation id="238909021488141516">Une erreur s'est produite lors du téléchargement du contenu.</translation> <translation id="2414886740292270097">Foncé</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Actualiser la page</translation> <translation id="2709516037105925701">Saisie automatique</translation> <translation id="271033894570825754">Nouveau</translation> +<translation id="2742271047622814453">Les préférences enregistrées sur les sites sont susceptibles d'être supprimées.</translation> <translation id="2748463065602559597">Cette page Google Chrome est sécurisée.</translation> <translation id="2762000892062317888">à l'instant</translation> <translation id="2770465223704140727">Retirer de la liste</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Ce compte est géré par <ph name="PARENT_NAME_1" /> et <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright Google Inc. <ph name="YEAR" />. Tous droits réservés.</translation> <translation id="2968755619301702150">Lecteur de certificat</translation> +<translation id="2996291259634659425">Créer une phrase secrète</translation> <translation id="2996809686854298943">Veuillez saisir une URL.</translation> <translation id="3029704984691124060">Les phrases secrètes ne correspondent pas.</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obtenir de l'aide<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Enregistrer la vidéo</translation> <translation id="306566828762083630">L'espace de stockage de votre appareil est saturé. Veuillez supprimer d'autres fichiers multimédias pour libérer de l'espace.</translation> <translation id="307329814453917357">Proposer de traduire des pages avec Google Traduction</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Activer les autorisations pour Chrome dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" /></translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de données stockées</translation> <translation id="3207960819495026254">Favori</translation> +<translation id="321773570071367578">Si vous avez oublié votre phrase secrète, ou si vous souhaitez modifier ce paramètre, <ph name="BEGIN_LINK" />réinitialisez la synchronisation<ph name="END_LINK" />.</translation> <translation id="3227137524299004712">Micro</translation> <translation id="3232754137068452469">Application Web</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Poursuivre et télécharger le contenu ?</translation> <translation id="3328801116991980348">Informations sur le site</translation> <translation id="3350687908700087792">Fermer tous les onglets de navigation privée</translation> +<translation id="3351441609270267898">Importer des données</translation> <translation id="3358663646935160692">Ce compte est géré par <ph name="DOMAIN_NAME" />. Vous vous connectez avec un compte géré, et vous donnez à l'administrateur le contrôle de votre profil Google Chrome. Vos données Chrome vont être associées à ce compte de manière définitive. Si vous vous en déconnectez, les données Chrome locales sont supprimées.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Nouvel onglet nav. privée</translation> <translation id="3501331331116143684">Page enreg. hors connex. dans "<ph name="FOLDER_NAME" />"</translation> <translation id="3518985090088779359">Accepter et continuer</translation> +<translation id="3522247891732774234">Mise à jour disponible. Plus d'options</translation> <translation id="3527085408025491307">Dossier</translation> <translation id="3549644494707163724">Chiffrer toutes les données synchronisées avec votre propre phrase secrète de synchronisation</translation> <translation id="360480449234699036">Découvrez les thèmes abordés sur les sites Web sans quitter la page. La fonctionnalité Appuyer pour rechercher envoie un mot et son contexte à la recherche Google, qui renvoie à son tour des définitions, des images, des résultats de recherche et d'autres informations. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Forcer l'activation du zoom</translation> <translation id="3917783807003067648">Position bloquée</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">des quatre dernières semaines</translation> <translation id="393697183122708255">Aucune recherche vocale activée dispo.</translation> <translation id="3950820424414687140">Ouvrir une session</translation> <translation id="3988213473815854515">Position autorisée</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Ouvrir dans un nouvel onglet</translation> <translation id="4198229475320555619">Une copie du favori accessible hors connexion (<ph name="PAGE_SIZE_STRING" />) a bien été enregistrée.</translation> <translation id="423410644998903704">Chrome doit disposer de l'accès à certaines autorisations pour les partager avec ce site.</translation> +<translation id="424864128008805179">Se déconnecter de Chrome ?</translation> <translation id="4254813446494774748">Langue de traduction :</translation> <translation id="4256782883801055595">Licences Open Source</translation> <translation id="4259722352634471385">La navigation sur <ph name="URL" /> est bloquée.</translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">À l'avenir, les pages Web physique à proximité s'afficheront dans votre liste de notifications.</translation> <translation id="4498934959426056365">Génération de clé</translation> <translation id="4505554159887937799">Enreg. accès hors conn.</translation> +<translation id="4508440807153586353">Seule une personne connaissant votre phrase secrète peut lire vos données chiffrées. La phrase secrète ne nous est pas envoyée et nous ne la stockons pas. Si vous l'oubliez, vous devrez réinitialiser la synchronisation. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}</translation> <translation id="4522570452068850558">Détails</translation> <translation id="4526249700380860531">Afficher et gérer les mots de passe enregistrés sur <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Nouvel onglet</translation> <translation id="5271967389191913893">Impossible d'ouvrir le contenu à télécharger sur l'appareil.</translation> <translation id="5275558766013849309">Les onglets figureront aux côtés des applications récentes.</translation> +<translation id="5284584623296338184">Les modifications apportées à vos favoris, votre historique, vos mots de passe et d'autres paramètres ne seront plus synchronisées avec votre compte Google. Vos données resteront cependant conservées dans votre compte Google.</translation> <translation id="5301954838959518834">OK</translation> <translation id="5302048478445481009">Langue</translation> <translation id="5304593522240415983">Champ obligatoire.</translation> @@ -316,6 +331,7 @@ </translation> <translation id="5442257541162692417">Modifier la page enregistrée</translation> <translation id="544291274896356069">En ouvrant ce lien dans une application externe, vous allez quitter le mode navigation privée. Voulez-vous continuer ?</translation> +<translation id="5487521232677179737">Effacer les données</translation> <translation id="5487729733663684359">Les mises à jour de Chrome ne sont plus disponibles avec cette version d'Android.</translation> <translation id="5511351932351731210">Toujours envoyer</translation> <translation id="5512137114520586844">Ce compte est géré par <ph name="PARENT_NAME" />.</translation> @@ -361,6 +377,7 @@ <translation id="5911030830365207728">Google Traduction</translation> <translation id="5916664084637901428">Activé</translation> <translation id="5939518447894949180">Réinitialiser</translation> +<translation id="5965336165840183977">Les données synchronisées seront effacées de tous les appareils. Vous ne serez pas déconnecté de votre compte Google. Les paramètres de site enregistrés ne seront pas supprimés et peuvent donner des indications sur vos habitudes de navigation.</translation> <translation id="5968595432776860642">Lecture de la vidéo "<ph name="VIDEO_TITLE" />" en cours…</translation> <translation id="6010869025736512584">Accès à l'entrée vidéo en cours…</translation> <translation id="6012342843556706400">Chrome doit disposer de l'accès à votre position pour la partager avec ce site.</translation> @@ -413,6 +430,7 @@ <translation id="6612358246767739896">Contenu protégé</translation> <translation id="6612856669344839356">Enregistrer le favori</translation> <translation id="6627583120233659107">Modifier le dossier</translation> +<translation id="6647073004883890710">Voulez-vous que <ph name="PASSWORD_MANAGER_BRAND" /> mette à jour le mot de passe de "<ph name="USERNAME" />" pour ce site ?</translation> <translation id="6656545060687952787">Chrome doit accéder aux données de localisation pour rechercher des appareils. <ph name="BEGIN_LINK" />Mettre à jour les autorisations<ph name="END_LINK" /></translation> <translation id="666268767214822976">Utiliser un service de prédiction pour suggérer des requêtes associées et des sites populaires lorsque vous saisissez des termes dans la barre d'adresse</translation> <translation id="666981079809192359">Avis de confidentialité de Chrome</translation> @@ -423,6 +441,7 @@ <translation id="6720988912937197322">La page enregistrée n'est pas disponible hors connexion.</translation> <translation id="6722992508235227685">Vos favoris, votre historique, vos mots de passe et d'autres paramètres sont synchronisés avec votre compte Google afin que vous puissiez les utiliser sur tous vos appareils. Vous pouvez sélectionner les éléments à synchroniser dans <ph name="BEGIN_LINK1" />Paramètres<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Téléchargement en cours…</translation> +<translation id="6762156594045689028">Pour modifier ce paramètre, <ph name="BEGIN_LINK" />réinitialisez la synchronisation<ph name="END_LINK" />.</translation> <translation id="6770414673596662518">Nous utilisons également le système de navigation sécurisée de Chrome pour détecter les pages nuisibles tout en vous protégeant de l'hameçonnage, des logiciels malveillants et des téléchargements dangereux.</translation> <translation id="6784675033504223784">Recherchez "<ph name="SEARCH_TERM" />".</translation> <translation id="6790428901817661496">Lire</translation> @@ -439,7 +458,6 @@ <translation id="6868088497967843822">Connectez-vous pour récupérer vos favoris, votre historique, vos mots de passe et d'autres paramètres sur tous vos appareils.</translation> <translation id="6945221475159498467">Sélectionner</translation> <translation id="6963766334940102469">Supprimer des favoris</translation> -<translation id="6964496835063002391">Ajouter un compte</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Dossiers</translation> <translation id="6978479750597523876">Réinitialiser les paramètres de Google Traduction</translation> @@ -456,6 +474,8 @@ <translation id="7056999826593229648">Connexion lente détectée</translation> <translation id="7057058088140140610">Cartes de paiement et adresses utilisant Google Payments</translation> <translation id="7063006564040364415">Impossible de se connecter au serveur de synchronisation.</translation> +<translation id="7074853159844403180">Le site <ph name="SITE" /> souhaite être associé à l'appareil suivant :</translation> +<translation id="7081639897063626814">Maintenir les données existantes à part</translation> <translation id="7094922512924405309">Aucune page Web physique n'a été trouvée.</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> onglets ouverts</translation> <translation id="7096034533295549981">Chargement vidéo…</translation> @@ -467,7 +487,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Aide<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Supprimer le favori</translation> <translation id="7324738665594301612">Dans le cadre d'une expérience, nous testons actuellement l'envoi par proxy de pages HTTPS via les serveurs Google.</translation> +<translation id="7346217184097589238">Les paramètres de site enregistrés ne seront pas supprimés et peuvent donner des indications sur vos habitudes de navigation.</translation> <translation id="7346909386216857016">OK</translation> +<translation id="7347770551817603360">Contenu hors connexion</translation> <translation id="7363354739009474003">Chargement de la vidéo "<ph name="VIDEO_TITLE" />" en cours…</translation> <translation id="7366340029385295517">Diffusion sur "<ph name="SCREEN_NAME" />" en cours…</translation> <translation id="7375125077091615385">Type :</translation> @@ -482,6 +504,7 @@ <translation id="748127970106343339">Confirmer la suppression de l'identifiant de l'appareil</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (Dernière mise à jour <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Veuillez patienter…</translation> +<translation id="7499262814309712782">Synchroniser le compte</translation> <translation id="7501135638693251872">Tous les favoris</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Effacement des données de navigation en cours</translation> @@ -527,18 +550,22 @@ <translation id="8050319187894766337">Page enreg. accès hors conn. Mém. presque pleine.</translation> <translation id="8068648041423924542">Impossible de sélectionner le certificat</translation> <translation id="8069239273282989646">Après compression</translation> +<translation id="8073388330009372546">Ouvrir image dans autre onglet</translation> <translation id="8084156870963450514">Connectez-vous pour accéder à tous vos contenus Web sur n'importe quel appareil.</translation> <translation id="8106211421800660735">N° de carte</translation> <translation id="813082847718468539">Afficher des informations à propos du site</translation> <translation id="8137558756159375272">La fonction "Appuyer pour rechercher" transmet le mot sélectionné et la page actuelle en tant que contexte vers la fonction de recherche Google. Vous pouvez la désactiver dans les <ph name="BEGIN_LINK" />paramètres<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Page non enregistrée pour accès hors connexion</translation> <translation id="8168435359814927499">Contenu</translation> +<translation id="8173098127580644436">depuis le début</translation> <translation id="8200772114523450471">Reprendre</translation> <translation id="8209050860603202033">Ouvrir l'image</translation> <translation id="8218346974737627104">Confirmer la connexion</translation> <translation id="8218934717680664417">Vous pouvez maintenant effectuer des recherches d'une seule pression.</translation> +<translation id="8223946939421658889">Effacer les données</translation> <translation id="8261506727792406068">Supprimer</translation> <translation id="8275818695183729150">Autoriser (pour les recherches dans la barre d'adresse)</translation> +<translation id="8283853025636624853">Synchronisation avec <ph name="SYNC_ACCOUNT_USER_NAME" />…</translation> <translation id="8310344678080805313">Onglets standards</translation> <translation id="8374821112118309944">Vous devez mettre à jour TalkBack vers une version plus récente</translation> <translation id="8396312449826231789">Uniquement les sites approuvés</translation> @@ -546,6 +573,7 @@ <translation id="8413385045638830869">Demander d'abord (recommandé)</translation> <translation id="8428213095426709021">Paramètres</translation> <translation id="8429160401486700187">Supprimer les pages enregistrées</translation> +<translation id="8433057134996913067">Vous serez déconnecté de la plupart des sites.</translation> <translation id="8481940801237642152">Votre connexion à ce site est privée, mais d'autres personnes connectées au réseau peuvent réussir à modifier l'apparence de la page.</translation> <translation id="8493948351860045254">Libérer de l'espace</translation> <translation id="8497726226069778601">Aucune page à afficher pour le moment</translation> @@ -586,9 +614,11 @@ <translation id="8941248009481596111">Votre connexion à ce site est privée.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Impossible d'accéder à <ph name="URL" />.</translation> +<translation id="8979340629087822094">des dernières 24 heures</translation> <translation id="8987061207681586800">Personnalisez Chrome</translation> <translation id="9019902583201351841">Géré par tes parents</translation> <translation id="9020607083536754075">Fermer l'onglet actif et revenir à l'application précédente</translation> +<translation id="9038649477754266430">Utiliser un service de prédiction pour charger les pages plus rapidement</translation> <translation id="9050666287014529139">Phrase secrète</translation> <translation id="9060538597317784206">Affichez l'application <ph name="APP_NAME" /> sur le Play Store. Note : <ph name="APP_RATING" /></translation> <translation id="9063523880881406963">Désactiver "Voir version ordinateur"</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb index be5e5bc4..326fd03 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hi"> +<translation id="1040144152982955218">डिवाइस खोजे जा रहे हैं… <ph name="BEGIN_LINK" />सहायता प्राप्त करें<ph name="END_LINK" /></translation> <translation id="1056898198331236512">चेतावनी</translation> <translation id="10614374240317010">कभी नहीं सहेजा गया</translation> <translation id="1061441684050139317">Chrome को माइक्रोफ़ोन ऐक्सेस की आवश्यकता है ताकि माइक्रोफ़ोन को इस साइट के साथ साझा किया जा सके.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">अपने सभी डिवाइस पर अपने बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग प्राप्त करने के लिए कोई खाता जोड़ें.</translation> <translation id="1098052486217676340">समाप्त</translation> <translation id="1121094540300013208">उपयोग और क्रैश रिपोर्ट</translation> +<translation id="1137305377394488060">पिछला घंटा</translation> <translation id="1178581264944972037">पॉज़ करें</translation> <translation id="1181037720776840403">निकालें</translation> <translation id="1197267115302279827">बुकमार्क ले जाएं</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">रोकें</translation> <translation id="1285320974508926690">कभी भी इस साइट का अनुवाद न करें</translation> +<translation id="1291207594882862231">इतिहास, कुकी, साइट डेटा, संचय साफ़ करें…</translation> <translation id="129553762522093515">हाल ही में बंद किए गए</translation> <translation id="1346090444609141578">यहां कोई सहेजा गया पृष्ठ नहीं</translation> <translation id="1369915414381695676"><ph name="SITE_NAME" /> साइट जोड़ी गई</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">कैमरा</translation> <translation id="1623104350909869708">इस पृष्ठ को अतिरिक्त डॉयलॉग बनाने से रोकें</translation> <translation id="1641113438599504367">सुरक्षित ब्राउज़िंग</translation> +<translation id="164269334534774161">आप <ph name="CREATION_TIME" /> से इस पृष्ठ की ऑफ़लाइन कॉपी देख रहे हैं</translation> <translation id="1643702317193804718">पृष्ठ का <ph name="SOURCE_LANGUAGE" /> में अनुवाद हो रहा है…</translation> <translation id="1644574205037202324">इतिहास</translation> <translation id="1647391597548383849">अपना कैमरा एक्सेस करें</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">आपकी अनुवाद सेटिंग रीसेट कर दी गई हैं.</translation> <translation id="2359808026110333948">जारी रखें</translation> <translation id="2381756643783702095">भेजने से पहले पूछें (अनुशंसित)</translation> +<translation id="2385560268894525395">पिछला सप्ताह</translation> <translation id="2387895666653383613">लेख स्केलिंग</translation> <translation id="238909021488141516">सामग्री डाउनलोड करते समय कोई त्रुटि हुई.</translation> <translation id="2414886740292270097">गहरा</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">पृष्ठ रीफ्रेश करें</translation> <translation id="2709516037105925701">स्वत: भरण</translation> <translation id="271033894570825754">नया</translation> +<translation id="2742271047622814453">साइट पर सहेजी गईं प्राथमिकताएं हटाई जा सकती हैं</translation> <translation id="2748463065602559597">आप एक सुरक्षित Google Chrome पृष्ठ देख रहे हैं.</translation> <translation id="2762000892062317888">अभी-अभी</translation> <translation id="2770465223704140727">सूची से निकालें</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">यह खाता <ph name="PARENT_NAME_1" /> और <ph name="PARENT_NAME_2" /> के द्वारा प्रबंधित है.</translation> <translation id="2960796085439532066">कॉपीराइट <ph name="YEAR" /> Google Inc. सर्वाधिकार सुरक्षित.</translation> <translation id="2968755619301702150">प्रमाणपत्र व्यूअर</translation> +<translation id="2996291259634659425">पासफ़्रेज़ बनाएं</translation> <translation id="2996809686854298943">URL आवश्यक है</translation> <translation id="3029704984691124060">पासफ़्रेज़ मिलान नहीं करते</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />सहायता प्राप्त करें<ph name="END_LINK" /></translation> <translation id="3063601790762993062">वीडियो सहेजें</translation> <translation id="306566828762083630">आपके डिवाइस की मेमोरी भर गई है. कृपया जगह बनाने के लिए अन्य मीडिया निकालें.</translation> <translation id="307329814453917357">Google अनुवाद का उपयोग करके पृष्ठों का अनुवाद ऑफ़र करें</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में Chrome के लिए अनुमतियां चालू करें.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> संग्रहीत डेटा</translation> <translation id="3207960819495026254">बुकमार्क किया गया</translation> +<translation id="321773570071367578">यदि आप अपना पासफ़्रेज़ भूल गए हैं या यह सेटिंग बदलना चाहते हैं, तो <ph name="BEGIN_LINK" />समन्वयन रीसेट करें<ph name="END_LINK" /></translation> <translation id="3227137524299004712">माइक्रोफ़ोन</translation> <translation id="3232754137068452469">वेब ऐप</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">सामग्री डाउनलोड करने के लिए आगे बढ़ें?</translation> <translation id="3328801116991980348">साइट जानकारी</translation> <translation id="3350687908700087792">सभी गुप्त टैब बंद करें</translation> +<translation id="3351441609270267898">मौजूदा डेटा आयात करें</translation> <translation id="3358663646935160692">यह खाता <ph name="DOMAIN_NAME" /> द्वारा प्रबंधित है. आप प्रबंधित खाते से प्रवेश कर रहे हैं और अपनी Chrome प्रोफ़ाइल को इसका व्यवस्थापक नियंत्रण दे रहे हैं. आपका Chrome डेटा इस खाते से स्थायी रूप से जुड़ जाएगा. इस खाते से डिस्कनेक्ट करने से स्थानीय Chrome डेटा हट जाएगा.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">नया गुप्त टैब</translation> <translation id="3501331331116143684">पृष्ठ <ph name="FOLDER_NAME" /> में ऑफ़लाइन सहेजा गया</translation> <translation id="3518985090088779359">स्वीकार करें और जारी रखें</translation> +<translation id="3522247891732774234">अपडेट उपलब्ध है. अधिक विकल्प</translation> <translation id="3527085408025491307">फ़ोल्डर</translation> <translation id="3549644494707163724">सभी समन्वयित डेटा को अपने स्वयं के समन्वयन पासफ़्रेज़ के साथ एन्क्रिप्ट करें</translation> <translation id="360480449234699036">पृष्ठ को छोड़े बिना वेबसाइटों पर मौजूद विषयों के बारे में जानें. स्पर्श करने के लिए खोजें, Google खोज को एक शब्द और उसके आस-पास का संदर्भ भेजता है, जिससे वह परिभाषाएं, चित्र, खोज परिणाम और अन्य विवरण लौटाता है. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">बलपूर्वक ज़ूम सक्षम करें</translation> <translation id="3917783807003067648">स्थान अवरोधित है</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">पिछले 4 सप्ताह</translation> <translation id="393697183122708255">कोई सक्षम बोलकर खोजें उपलब्ध नहीं</translation> <translation id="3950820424414687140">प्रवेश करें</translation> <translation id="3988213473815854515">स्थान अनुमत है</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">नए टैब में खोलें</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> बुकमार्क ऑफ़लाइन सहेजा गया</translation> <translation id="423410644998903704">Chrome को अनुमति ऐक्सेस की आवश्यकता है ताकि अनुमति को इस साइट के साथ साझा किया जा सके.</translation> +<translation id="424864128008805179">Chrome से प्रस्थान करें?</translation> <translation id="4254813446494774748">अनुवाद की भाषा:</translation> <translation id="4256782883801055595">ओपन सोर्स लाइसेंस</translation> <translation id="4259722352634471385">मार्गदर्शक अवरोधित है: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">भविष्य के आस-पास स्थित भौतिक वेब पृष्ठ आपकी नोटिफिकेशन सूची में दिखाई देंगे</translation> <translation id="4498934959426056365">कुंजी जेनरेशन</translation> <translation id="4505554159887937799">ऑफ़लाइन सहेजा गया</translation> +<translation id="4508440807153586353">आपके एन्क्रिप्ट किए गए डेटा को केवल वही व्यक्ति पढ़ सकता है जिसके पास आपका पासफ़्रेज़ है. Google द्वारा पासफ़्रेज़ भेजा या संग्रहीत नहीं किया जाता. यदि आप अपना पासफ़्रेज़ भूल जाते हैं या यह सेटिंग बदलना चाहते हैं, तो आपको समन्वयन को रीसेट करना होगा. <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# दिन पहले}one{# दिन पहले}other{# दिन पहले}}</translation> <translation id="4522570452068850558">विवरण</translation> <translation id="4526249700380860531">सहेजे गए पासवर्ड <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> पर देखें और प्रबंधित करें</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">नया टैब</translation> <translation id="5271967389191913893">डाउनलोड की जाने वाली सामग्री को डिवाइस नहीं खोल सकता.</translation> <translation id="5275558766013849309">टैब, हाल ही के ऐप्स के साथ रहेंगे.</translation> +<translation id="5284584623296338184">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग में किए गए बदलाव अब आपके Google खाते में समन्वयित नहीं किए जाएंगे. हालांकि, आपका मौजूदा डेटा आपके Google खाते में संग्रहीत रहेगा.</translation> <translation id="5301954838959518834">ठीक है, समझ गया/गई</translation> <translation id="5302048478445481009">भाषा</translation> <translation id="5304593522240415983">यह फ़ील्ड खाली नहीं छोड़ी जा सकती</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">सहेजे गए नाम/पासवर्ड या अपवाद को संपादित करना</translation> <translation id="5442257541162692417">सहेजा गया पृष्ठ संपादित करें</translation> <translation id="544291274896356069">इस लिंक के किसी बाहरी ऐप्स में खुले होने पर गुप्त मोड छोड़ा जा रहा है. जारी रखें?</translation> +<translation id="5487521232677179737">डेटा साफ़ करें</translation> <translation id="5487729733663684359">Chrome अपडेट अब Android के इस वर्शन के लिए समर्थित नहीं हैं.</translation> <translation id="5511351932351731210">हमेशा भेजें</translation> <translation id="5512137114520586844">यह खाता <ph name="PARENT_NAME" /> द्वारा प्रबंधित है.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google अनुवाद</translation> <translation id="5916664084637901428">चालू</translation> <translation id="5939518447894949180">रीसेट करें</translation> +<translation id="5965336165840183977">इससे आपके सभी डिवाइस का समन्वयित किया गया डेटा साफ़ हो जाएगा. आप अपने Google खाते से प्रस्थान किए हुए नहीं रहेंगे. सहेजी गईं साइट सेटिंग हटाई नहीं जाएंगी और वे आपकी ब्राउज़िंग की आदतों को प्रदर्शित कर सकती हैं.</translation> <translation id="5968595432776860642">“<ph name="VIDEO_TITLE" />” चल रहा है</translation> <translation id="6010869025736512584">वीडियो इनपुट ऐक्सेस हो रहा है</translation> <translation id="6012342843556706400">Chrome को स्थान ऐक्सेस की आवश्यकता है ताकि स्थान को इस साइट के साथ साझा किया जा सके.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">सुरक्षित सामग्री</translation> <translation id="6612856669344839356">बुकमार्क सहेजें</translation> <translation id="6627583120233659107">फ़ोल्डर संपादित करें</translation> +<translation id="6647073004883890710">क्या आप चाहते हैं कि <ph name="PASSWORD_MANAGER_BRAND" /> इस साइट के लिए <ph name="USERNAME" /> के पासवर्ड को अपडेट करे?</translation> <translation id="6656545060687952787">डिवाइस स्कैन करने के लिए Chrome को स्थान एक्सेस की आवश्यकता है. <ph name="BEGIN_LINK" />अनुमतियां अपडेट करें<ph name="END_LINK" /></translation> <translation id="666268767214822976">आपके द्वारा पता बार में लिखते ही संबंधित क्वेरी और लोकप्रिय वेबसाइटें दिखाने के लिए पूर्वानुमान सेवा का उपयोग करें</translation> <translation id="666981079809192359">Chrome गोपनीयता सूचना</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">सहेजा गया पृष्ठ ऑफ़लाइन उपलब्ध नहीं है</translation> <translation id="6722992508235227685">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग आपके Google खाते में समन्वयित की जाएंगी ताकि आप अपने सभी डिवाइस पर उनका उपयोग कर सकें. आप <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> में चुन सकते हैं कि क्या समन्वयित करना है.</translation> <translation id="6738867403308150051">डाउनलोड हो रहे हैं...</translation> +<translation id="6762156594045689028">यह सेटिंग बदलने के लिए, <ph name="BEGIN_LINK" />समन्वयन रीसेट करें<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Chrome के सुरक्षित ब्राउज़िंग सिस्टम का उपयोग दुर्भावनापूर्ण पृष्ठों का पता लगाने तथा फ़िशिंग, मैलवेयर और हानिकारक डाउनलोड से आपकी सुरक्षा करने के लिए भी किया जाएगा.</translation> <translation id="6784675033504223784">“<ph name="SEARCH_TERM" />” खोजें</translation> <translation id="6790428901817661496">चलाएं</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">अपने सभी डिवाइस पर अपने बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग प्राप्त करने के लिए प्रवेश करें</translation> <translation id="6945221475159498467">चुनें</translation> <translation id="6963766334940102469">बुकमार्क हटाएं</translation> -<translation id="6964496835063002391">कोई खाता जोड़ें</translation> <translation id="6965382102122355670">ठीक</translation> <translation id="6973630695168034713">फ़ोल्डर</translation> <translation id="6978479750597523876">अनुवाद सेटिंग रीसेट करें</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">धीमे कनेक्शन का पता चला</translation> <translation id="7057058088140140610">Google पेमेंट्स का उपयोग करने वाले क्रेडिट कार्ड और पते</translation> <translation id="7063006564040364415">समन्वयन सर्वर से कनेक्ट नहीं किया जा सका.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> इनके साथ युग्मन करना चाहती है:</translation> +<translation id="7081639897063626814">मौजूदा डेटा को अलग रखें</translation> <translation id="7094922512924405309">आस-पास कोई भी शारीरिक वेब पृष्ठ नहीं मिला</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> खुले टैब</translation> <translation id="7096034533295549981">वीडियो लोड हो रहा है</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />सहायता<ph name="END_LINK" /></translation> <translation id="7299721129597238157">बुकमार्क हटाएं</translation> <translation id="7324738665594301612">हम किसी प्रयोग के भाग के रूप में Google सर्वरों के द्वारा HTTPS पृष्ठों को प्रॉक्सी करने का परीक्षण कर रहे हैं.</translation> +<translation id="7346217184097589238">सहेजी गईं साइट सेटिंग हटाई नहीं जाएंगी और वे आपकी ब्राउज़िंग की आदतों को प्रदर्शित कर सकती हैं.</translation> <translation id="7346909386216857016">ठीक है, समझ लिया</translation> +<translation id="7347770551817603360">ऑफ़लाइन सामग्री</translation> <translation id="7363354739009474003">“<ph name="VIDEO_TITLE" />” लोड हो रहा है</translation> <translation id="7366340029385295517"><ph name="SCREEN_NAME" /> पर कास्ट किया जा रहा है</translation> <translation id="7375125077091615385">प्रकार:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">डिवाइस प्रमाणिकता हटाने की पुष्टि करें</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (<ph name="TIME_SINCE_UPDATE" /> अपडेट किया गया)</translation> <translation id="7498271377022651285">कृपया प्रतीक्षा करें...</translation> +<translation id="7499262814309712782">खाता समन्वयित करें</translation> <translation id="7501135638693251872">सभी बुकमार्क</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">ब्राउज़िंग डेटा साफ़ हो रहा है</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">पृष्ठ ऑफ़लाइन सहेजा. मेमोरी भर गई.</translation> <translation id="8068648041423924542">प्रमाणपत्र चुनने में असमर्थ.</translation> <translation id="8069239273282989646">संपीड़न के बाद</translation> +<translation id="8073388330009372546">चित्र नए टैब में खोलें</translation> <translation id="8084156870963450514">किसी भी डिवाइस से अपनी सभी वेब सामग्री एेक्सेस करने के लिए प्रवेश करें</translation> <translation id="8106211421800660735">क्रेडिट कार्ड संख्या</translation> <translation id="813082847718468539">साइट जानकारी देखें</translation> <translation id="8137558756159375272">खोजने के लिए स्पर्श करें चयनित शब्द और वर्तमान पृष्ठ को संदर्भ के रूप में Google खोज पर भेजती है. आप उसे <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में बंद कर सकते हैं.</translation> <translation id="8146397137182589628">ऑफ़लाइन नहीं सहेजा गया</translation> <translation id="8168435359814927499">सामग्री</translation> +<translation id="8173098127580644436">प्रारंभ समय</translation> <translation id="8200772114523450471">फिर से शुरू करें</translation> <translation id="8209050860603202033">चित्र खोलें</translation> <translation id="8218346974737627104">प्रवेश की दुबारा पूछें</translation> <translation id="8218934717680664417">अब आप एक स्पर्श से खोज कर सकते हैं</translation> +<translation id="8223946939421658889">इस समय से डेटा साफ़ करें</translation> <translation id="8261506727792406068">हटाएं</translation> <translation id="8275818695183729150">अनुमति दें (पता बार खोजों के लिए)</translation> +<translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> से समन्वयित हो रहा है</translation> <translation id="8310344678080805313">मानक टैब</translation> <translation id="8374821112118309944">आपको TalkBack को अधिक नए वर्शन से अपडेट करना होगा.</translation> <translation id="8396312449826231789">केवल स्वीकृत साइटें</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">पहले पूछें (सुझाया गया)</translation> <translation id="8428213095426709021">सेटिंग्स</translation> <translation id="8429160401486700187">सहेजे गए पृष्ठ हटाएं</translation> +<translation id="8433057134996913067">इससे आप अधिकांश वेबसाइट से प्रस्थान कर जाएंगे.</translation> <translation id="8481940801237642152">इस साइट से आपका कनेक्शन निजी है, लेकिन नेटवर्क पर मौजूद कोई व्यक्ति पृष्ठ का रूप बदल सकता है.</translation> <translation id="8493948351860045254">स्थान खाली करें</translation> <translation id="8497726226069778601">यहां देखने के लिए…अभी तक कुछ भी नहीं है</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">इस साइट से आपका कनेक्शन निजी है.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">मार्गदर्शक तक नहीं पहुंचा जा सकता: <ph name="URL" /></translation> +<translation id="8979340629087822094">पिछला दिन</translation> <translation id="8987061207681586800">Chrome को अपना बनाएं</translation> <translation id="9019902583201351841">आपके अभिभावकों द्वारा प्रबंधित</translation> <translation id="9020607083536754075">वर्तमान टैब बंद करें और पिछले ऐप पर वापस लौटें</translation> +<translation id="9038649477754266430">अधिक तेज़ी से पृष्ठ लोड करने के लिए किसी पूर्वानुमान सेवा का उपयोग करें</translation> <translation id="9050666287014529139">पासफ़्रेज़</translation> <translation id="9060538597317784206"><ph name="APP_NAME" /> को Play स्टोर पर देखें. रेटिंग: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">अनुरोध डेस्कटॉप साइट बंद करें</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb index ee46455..7d3cac6 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Googleov doodle logotip: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Zaustavi</translation> <translation id="1285320974508926690">Nikad nemoj prevoditi ovu web-lokaciju</translation> +<translation id="1291207594882862231">Brisanje povijesti, kolačića, podataka web-lokacija, predmemorije...</translation> <translation id="129553762522093515">Nedavno zatvoreno</translation> <translation id="1346090444609141578">Ovdje nema spremljenih stranica</translation> <translation id="1369915414381695676">Dodana je web-lokacija <ph name="SITE_NAME" /></translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Fotoaparat</translation> <translation id="1623104350909869708">Spriječi da ova stranica stvori dodatne dijaloške okvire</translation> <translation id="1641113438599504367">Sigurno pregledavanje</translation> +<translation id="164269334534774161">Prikazuje se offline kopija stranice od <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Prevođenje stranice na <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Povijest</translation> <translation id="1647391597548383849">Pristup fotoaparatu</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Osvježavanje stranice</translation> <translation id="2709516037105925701">Automatsko popunjavanje</translation> <translation id="271033894570825754">Novo</translation> +<translation id="2742271047622814453">Spremljene postavke na web-lokacijama možda će se izbrisati</translation> <translation id="2748463065602559597">Gledate sigurnu stranicu Google Chrome.</translation> <translation id="2762000892062317888">upravo sada</translation> <translation id="2770465223704140727">Ukloni s popisa</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Želite li nastaviti s preuzimanjem sadržaja?</translation> <translation id="3328801116991980348">Informacije o web-lokaciji</translation> <translation id="3350687908700087792">Zatvori sve anonimne kartice</translation> +<translation id="3351441609270267898">Uvezi postojeće podatke</translation> <translation id="3358663646935160692">Ovim računom upravlja domena <ph name="DOMAIN_NAME" />. Prijavljujete se svojim upravljanim računom i njenom administratoru dajete nadzor nad svojim Chrome profilom. Vaši podaci na Chromeu bit će trajno povezani s ovim računom. Prekidanje veze s ovim računom dovest će do brisanja lokalnih podataka na Chromeu.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Nova anonimna kartica</translation> <translation id="3501331331116143684">Stranica spremljena offline u <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Prihvati i nastavi</translation> +<translation id="3522247891732774234">Dostupno je ažuriranje. Više opcija</translation> <translation id="3527085408025491307">Mapa</translation> <translation id="3549644494707163724">Šifriranje svih sinkroniziranih podataka vlastitom zaporkom za sinkronizaciju</translation> <translation id="360480449234699036">Saznajte više o temama na web-lokacijama bez zatvaranja stranice. "Dodirnite za pretraživanje" Google pretraživanju šalje riječ i njen kontekst, a vraća definicije, slike, rezultate pretraživanja i druge pojedinosti. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Otvori u novoj kartici</translation> <translation id="4198229475320555619">Oznaka od <ph name="PAGE_SIZE_STRING" /> spremljena offline</translation> <translation id="423410644998903704">Chrome treba imati pristup dopuštenjima da bi ih dijelio s ovom web-lokacijom.</translation> -<translation id="4247939399682707041">Podaci uređaja zamijenit će se podacima s računa <ph name="ACCOUNT" />. Svoje postojeće podatke možete dohvatiti tako što ćete se vratiti na račun <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Želite li se odjaviti s Chromea?</translation> <translation id="4254813446494774748">Jezik prijevoda:</translation> <translation id="4256782883801055595">Licence otvorenog koda</translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">Zaštićeni sadržaj</translation> <translation id="6612856669344839356">Spremanje oznake</translation> <translation id="6627583120233659107">Uredi mapu</translation> +<translation id="6647073004883890710">Želite li da <ph name="PASSWORD_MANAGER_BRAND" /> ažurira zaporku korisnika <ph name="USERNAME" /> za tu web-lokaciju?</translation> <translation id="6656545060687952787">Chrome treba pristup lokaciji kako bi skenirao uređaje. <ph name="BEGIN_LINK" />Ažuriraj dopuštenja<ph name="END_LINK" /></translation> <translation id="666268767214822976">Upotrijebi uslugu predviđanja za prikaz srodnih upita i popularnih web-lokacija prilikom upisivanja u adresnu traku</translation> <translation id="666981079809192359">Obavijest o privatnosti za Chrome</translation> @@ -452,7 +457,6 @@ <translation id="6868088497967843822">Prijavite se da biste imali svoje oznake, povijest, zaporke i druge postavke na svim svojim uređajima</translation> <translation id="6945221475159498467">Odaberi</translation> <translation id="6963766334940102469">Brisanje oznaka</translation> -<translation id="6964496835063002391">Dodajte račun</translation> <translation id="6965382102122355670">U redu</translation> <translation id="6973630695168034713">Mape</translation> <translation id="6978479750597523876">Poništavanje postavki prevođenja</translation> @@ -484,6 +488,7 @@ <translation id="7324738665594301612">Testiramo upotrebu proxyja za obradu HTTPS stranica putem Googleovih poslužitelja u eksperimentu.</translation> <translation id="7346217184097589238">Spremljene postavke web-lokacija neće se izbrisati i mogu odražavati vaše navike tijekom pregledavanja.</translation> <translation id="7346909386216857016">Dobro, shvaćam</translation> +<translation id="7347770551817603360">Offline sadržaj</translation> <translation id="7363354739009474003">Učitavanje videozapisa "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">Emitiranje na uređaj <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Vrsta:</translation> @@ -544,6 +549,7 @@ <translation id="8050319187894766337">Spremljeno. Pohrana gotovo puna.</translation> <translation id="8068648041423924542">Ne može se odabrati certifikat.</translation> <translation id="8069239273282989646">Nakon kompresije</translation> +<translation id="8073388330009372546">Otvori sliku u novoj kartici</translation> <translation id="8084156870963450514">Prijavite se za pristup svim svojim sadržajima na webu s bilo kojeg uređaja</translation> <translation id="8106211421800660735">Broj kreditne kartice</translation> <translation id="813082847718468539">Prikaz informacija o web-mjestu</translation> @@ -566,6 +572,7 @@ <translation id="8413385045638830869">Prvo pitaj (preporučeno)</translation> <translation id="8428213095426709021">Postavke</translation> <translation id="8429160401486700187">Izbriši spremljene stranice</translation> +<translation id="8433057134996913067">Time ćete se odjaviti s većine web-lokacija.</translation> <translation id="8481940801237642152">Veza s tom web-lokacijom privatna je, ali bi netko na mreži mogao izmijeniti izgled stranice.</translation> <translation id="8493948351860045254">Oslobodi prostor</translation> <translation id="8497726226069778601">Ovdje nema ničega... zasad</translation> @@ -610,6 +617,7 @@ <translation id="8987061207681586800">Prilagodite Chrome sebi</translation> <translation id="9019902583201351841">Upravljaju tvoji roditelji</translation> <translation id="9020607083536754075">Zatvori trenutačnu karticu i vrati se na prethodnu aplikaciju</translation> +<translation id="9038649477754266430">Upotreba usluge predviđanja za brže učitavanje stranica</translation> <translation id="9050666287014529139">Zaporka</translation> <translation id="9060538597317784206">Prikaz aplikacije <ph name="APP_NAME" /> u Trgovini Play. Ocjena: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Isključivanje zahtjeva za prikaz klasične web-lokacije</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb index d17e6cc..4fcbb15 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hu"> +<translation id="1040144152982955218">Eszközök keresése… <ph name="BEGIN_LINK" />Kérjen segítséget<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Figyelmeztetés</translation> <translation id="10614374240317010">Az alábbi oldalakról soha ne mentsen jelszavakat</translation> <translation id="1061441684050139317">A Chrome-nak rendelkeznie kell hozzáféréssel a mikrofonhoz, hogy megoszthassa ezzel a webhellyel.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Adjon hozzá egy fiókot, hogy könyvjelzőit, előzményeit, jelszavait és más beállításait az összes eszközén elérje.</translation> <translation id="1098052486217676340">Befejezve</translation> <translation id="1121094540300013208">Használati és hibajelentések</translation> +<translation id="1137305377394488060">elmúlt óra</translation> <translation id="1178581264944972037">Szünet</translation> <translation id="1181037720776840403">Eltávolítás</translation> <translation id="1197267115302279827">Könyvjelzők áthelyezése</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google ünnepi embléma: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Leállítás</translation> <translation id="1285320974508926690">Ezt a webhelyet soha ne fordítsa le</translation> +<translation id="1291207594882862231">Előzmények, cookie-k, webhelyadatok és a gyorsítótár törlése…</translation> <translation id="129553762522093515">Mostanában bezárt</translation> <translation id="1346090444609141578">Nincsenek mentett oldalak</translation> <translation id="1369915414381695676">A(z) <ph name="SITE_NAME" /> webhely hozzáadva</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Akadályozza meg, hogy ez az oldal további párbeszédablakokat hozzon létre.</translation> <translation id="1641113438599504367">Biztonságos Böngészés</translation> +<translation id="164269334534774161">Jelenleg az oldal <ph name="CREATION_TIME" />-i dátummal mentett offline példányát tekinti meg</translation> <translation id="1643702317193804718">Oldal fordítása <ph name="SOURCE_LANGUAGE" /> nyelvre…</translation> <translation id="1644574205037202324">Előzmények</translation> <translation id="1647391597548383849">Hozzáférés a fényképezőgéphez</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">A fordítási beállítások visszaállítása megtörtént.</translation> <translation id="2359808026110333948">Folytatás</translation> <translation id="2381756643783702095">Kérdezzen rá küldés előtt (ajánlott)</translation> +<translation id="2385560268894525395">elmúlt hét</translation> <translation id="2387895666653383613">Szöveg nagyítása</translation> <translation id="238909021488141516">Hiba történt a tartalom letöltésekor.</translation> <translation id="2414886740292270097">Sötét</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Oldal frissítése</translation> <translation id="2709516037105925701">Automatikus kitöltés</translation> <translation id="271033894570825754">Új</translation> +<translation id="2742271047622814453">A webhelyeken megadott beállítások is törlődhetnek</translation> <translation id="2748463065602559597">Ön egy biztonságos Google Chrome-oldalt lát.</translation> <translation id="2762000892062317888">éppen most</translation> <translation id="2770465223704140727">Eltávolítás a listából</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">A fiók kezelői: <ph name="PARENT_NAME_1" /> és <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Minden jog fenntartva.</translation> <translation id="2968755619301702150">Tanúsítványmegtekintő</translation> +<translation id="2996291259634659425">Összetett jelszó létrehozása</translation> <translation id="2996809686854298943">URL szükséges</translation> <translation id="3029704984691124060">Az összetett jelszavak nem egyeznek</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Kérjen segítséget<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Videó mentése</translation> <translation id="306566828762083630">Az eszköz tárhelye megtelt. Szabadítson fel területet más tartalom eltávolításával.</translation> <translation id="307329814453917357">Az oldalak Google Fordítóval történő lefordításának felajánlása</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">A Chrome-ra vonatkozó engedélyek aktiválása az <ph name="BEGIN_LINK" />Android beállításaiban<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> tárolt adat</translation> <translation id="3207960819495026254">Könyvjelzőzött</translation> +<translation id="321773570071367578">Ha elfelejtette összetett jelszavát, vagy módosítani szeretné ezt a beállítást, <ph name="BEGIN_LINK" />állítsa alaphelyzetbe a szinkronizálást<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Internetes alkalmazás</translation> <translation id="3244271242291266297">HH</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Biztosan letölti a tartalmat?</translation> <translation id="3328801116991980348">Webhelyadatok</translation> <translation id="3350687908700087792">Az összes inkognitólap bezárása</translation> +<translation id="3351441609270267898">Meglévő adatok importálása</translation> <translation id="3358663646935160692">Ennek a fióknak <ph name="DOMAIN_NAME" /> a kezelője. Ön jelenleg kezelt fiókkal jelentkezik be, és engedélyezi a rendszergazdának az Ön Chrome-profiljához való hozzáférést. Chrome-adatai ezután véglegesen ehhez a fiókhoz társulnak. A fiók leválasztásával törölheti a helyi Chrome-adatokat.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Új inkognitólap</translation> <translation id="3501331331116143684">Oldal mentve offline ide: <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Elfogadás és tovább</translation> +<translation id="3522247891732774234">Frissítés áll rendelkezésre. További lehetőségek</translation> <translation id="3527085408025491307">Mappa</translation> <translation id="3549644494707163724">Az összes szinkronizált adat titkosítása saját összetett szinkronizálási jelszóval</translation> <translation id="360480449234699036">Megtudhatja a webhelyek témáit anélkül, hogy elhagyná az oldalt. A Keresés érintéssel funkció elküld egy szót és annak kontextusát a Google Keresés számára, majd meghatározásokat, képeket, keresési eredményeket és egyéb részleteket ad vissza. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Nagyítás/kicsinyítés kényszerített engedélyezése</translation> <translation id="3917783807003067648">A hely le van tiltva</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">elmúlt négy hét</translation> <translation id="393697183122708255">Nincs engedélyezett hangalapú keresés</translation> <translation id="3950820424414687140">Bejelentkezés</translation> <translation id="3988213473815854515">Hely engedélyezve</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Megnyitás új lapon</translation> <translation id="4198229475320555619">Könyvjelző (<ph name="PAGE_SIZE_STRING" />) mentve offline</translation> <translation id="423410644998903704">A Chrome-nak rendelkeznie kell hozzáférési engedélyekkel, hogy megoszthassa őket ezzel a webhellyel.</translation> +<translation id="424864128008805179">Kijelentkezés a Chrome-ból</translation> <translation id="4254813446494774748">A fordítás nyelve</translation> <translation id="4256782883801055595">Nyílt forráskódú licencek</translation> <translation id="4259722352634471385">Le van tiltva az ide vezető navigáció: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">A jövőben a Fizikai web közelben lévő oldalai megjelennek az értesítési listájában</translation> <translation id="4498934959426056365">Kulcsgenerálás</translation> <translation id="4505554159887937799">Elmentve offline</translation> +<translation id="4508440807153586353">Titkosított adatait csak az olvashatja el, aki rendelkezik összetett jelszavával. Az összetett jelszót a Google nem kapja meg, és nem is tárolja. Ha elfelejtette összetett jelszavát, vagy módosítani szeretné ezt a beállítást, alaphelyzetbe kell állítania a szinkronizálást. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# napja}other{# napja}}</translation> <translation id="4522570452068850558">Részletek</translation> <translation id="4526249700380860531">A mentett jelszavak megtekintése és kezelése a <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> címen</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Új lap</translation> <translation id="5271967389191913893">Az eszköz nem tudja megnyitni a letölteni kívánt tartalmat.</translation> <translation id="5275558766013849309">A lapok együtt fognak szerepelni a legutóbbi alkalmazásokkal.</translation> +<translation id="5284584623296338184">Könyvjelzői, előzményei, jelszavai és más beállításai a továbbiakban már nem lesznek szinkronizálva Google-fiókjával. Meglévő adatainak tárolása azonban továbbra is megmarad Google-fiókjában.</translation> <translation id="5301954838959518834">Rendben, értem</translation> <translation id="5302048478445481009">Nyelv</translation> <translation id="5304593522240415983">Ez a mező nem lehet üres</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Mentett név/jelszó vagy kivétel szerkesztése</translation> <translation id="5442257541162692417">Mentett oldal szerkesztése</translation> <translation id="544291274896356069">Ha ezt a linket külső alkalmazásban nyitja meg, elhagyja az inkognitómódot. Folytatja?</translation> +<translation id="5487521232677179737">Adatok törlése</translation> <translation id="5487729733663684359">Az Android e verziója többé nem támogatja a Chrome-frissítéseket.</translation> <translation id="5511351932351731210">Mindig küldjön</translation> <translation id="5512137114520586844">A fiók kezelője: <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Fordító</translation> <translation id="5916664084637901428">Be</translation> <translation id="5939518447894949180">Visszaállítás</translation> +<translation id="5965336165840183977">Ezzel eltávolítja a szinkronizált adatokat az összes eszközről. A rendszer nem jelentkezteti ki a Google-fiókjából. A mentett webhelybeállítások nem törlődnek, és tájékozódási alapul szolgálhatnak böngészési szokásait illetően.</translation> <translation id="5968595432776860642">„<ph name="VIDEO_TITLE" />” lejátszása</translation> <translation id="6010869025736512584">Hozzáférés videobemenethez</translation> <translation id="6012342843556706400">A Chrome-nak rendelkeznie kell hozzáféréssel a tartózkodási helyhez, hogy megoszthassa ezzel a webhellyel.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Védett tartalom</translation> <translation id="6612856669344839356">Könyvjelző mentése</translation> <translation id="6627583120233659107">Mappa szerkesztése</translation> +<translation id="6647073004883890710">Szeretné, hogy a <ph name="PASSWORD_MANAGER_BRAND" /> frissítse a(z) <ph name="USERNAME" /> fiók jelszavát ennél a webhelynél?</translation> <translation id="6656545060687952787">A Chrome-nak hozzá kell férnie a tartózkodási helyhez, hogy eszközöket kereshessen. <ph name="BEGIN_LINK" />Frissítse az engedélyeket<ph name="END_LINK" /></translation> <translation id="666268767214822976">„Várható kifejezések” szolgáltatás használata a kapcsolódó lekérdezések és népszerű webhelyek megjelenítéséhez a címsávba történő gépelés során.</translation> <translation id="666981079809192359">Chrome – Adatvédelmi közlemény</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">A mentett oldal nem érhető el offline módban</translation> <translation id="6722992508235227685">A böngésző szinkronizálni fogja a könyvjelzőket, az előzményeket, a jelszavakat és az egyéb beállításokat Google-fiókjával, hogy minden eszközén használhassa őket. A <ph name="BEGIN_LINK1" />Beállítások<ph name="END_LINK1" /> között adhatja meg, hogy milyen adatok legyenek szinkronizálva.</translation> <translation id="6738867403308150051">Letöltés…</translation> +<translation id="6762156594045689028">A beállítás módosításához <ph name="BEGIN_LINK" />állítsa alaphelyzetbe a szinkronizálást<ph name="END_LINK" /></translation> <translation id="6770414673596662518">A Chrome Biztonságos Böngészés rendszere is segít a rosszindulatú oldalak észlelésében, valamint megvédi Önt az adathalászattól, a rosszindulatú programoktól és az ártalmas letöltésektől.</translation> <translation id="6784675033504223784">A(z) „<ph name="SEARCH_TERM" />” keresése</translation> <translation id="6790428901817661496">Játék</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Jelentkezzen be, hogy könyvjelzőit, előzményeit, jelszavait és más beállításait az összes eszközén elérje.</translation> <translation id="6945221475159498467">Kiválasztás</translation> <translation id="6963766334940102469">Könyvjelzők törlése</translation> -<translation id="6964496835063002391">Adjon hozzá egy fiókot</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Mappák</translation> <translation id="6978479750597523876">A fordító beállításainak visszaállítása</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">A rendszer lassú kapcsolatot észlelt</translation> <translation id="7057058088140140610">Google Payments szolgáltatást használó hitelkártyák és címek</translation> <translation id="7063006564040364415">Nem sikerült csatlakozni a szinkronizálószerverhez.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> párosítást szeretne kezdeményezni a következővel:</translation> +<translation id="7081639897063626814">A meglévő adatok elkülönített tárolása</translation> <translation id="7094922512924405309">A Fizikai web nem talált oldalakat a közelben</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> megnyitott lap</translation> <translation id="7096034533295549981">Videó betöltése</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Súgó<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Könyvjelző törlése</translation> <translation id="7324738665594301612">Jelenlegi kísérletünkben azt teszteljük, hogy a HTTPS-t használó oldalak a Google szerverein át legyenek elérhetők.</translation> +<translation id="7346217184097589238">A mentett webhelybeállítások nem törlődnek, és tájékozódási alapul szolgálhatnak böngészési szokásait illetően.</translation> <translation id="7346909386216857016">Rendben, értem</translation> +<translation id="7347770551817603360">Offline tartalom</translation> <translation id="7363354739009474003">A(z) „<ph name="VIDEO_TITLE" />” betöltése</translation> <translation id="7366340029385295517">Átküldés a következőre: <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Típus:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Eszközhitelesítési adatok törlésének megerősítése</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (Frissítve: <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Kérjük, várjon…</translation> +<translation id="7499262814309712782">Fiók szinkronizálása</translation> <translation id="7501135638693251872">Minden könyvjelző</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Böngészési adatok törlése</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Offline mentve; kevés a tárhely.</translation> <translation id="8068648041423924542">A tanúsítvány kiválasztása nem sikerült.</translation> <translation id="8069239273282989646">Tömörítés után</translation> +<translation id="8073388330009372546">Kép megnyitása új lapon</translation> <translation id="8084156870963450514">Jelentkezzen be, hogy bármely eszközről hozzáférhessen valamennyi internetes dolgához</translation> <translation id="8106211421800660735">Hitelkártya száma</translation> <translation id="813082847718468539">Az oldalinformációk megtekintése</translation> <translation id="8137558756159375272">Az Érintéssel keresés elküldi a kiválasztott szót és az aktuális oldalt kontextusként a Google Keresés számára. A funkciót a <ph name="BEGIN_LINK" />Beállítások<ph name="END_LINK" /> szakaszban kikapcsolhatja.</translation> <translation id="8146397137182589628">Nincs mentve offline állapotban megtekinthető példány</translation> <translation id="8168435359814927499">Tartalom</translation> +<translation id="8173098127580644436">a kezdetektől</translation> <translation id="8200772114523450471">Folytatás</translation> <translation id="8209050860603202033">Kép megnyitása</translation> <translation id="8218346974737627104">Bejelentkezés megerősítése</translation> <translation id="8218934717680664417">Mostantól egyetlen érintéssel kereshet</translation> +<translation id="8223946939421658889">Adatok törlése:</translation> <translation id="8261506727792406068">Törlés</translation> <translation id="8275818695183729150">Engedélyezés (a címsávban történő kereséseknél)</translation> +<translation id="8283853025636624853">Szinkronizálás a következővel: <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Szabványos lapok</translation> <translation id="8374821112118309944">Frissítenie kell a TalkBack alkalmazást egy újabb verzióra.</translation> <translation id="8396312449826231789">Csak jóváhagyott webhelyek</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Kérdezzen rá (ajánlott)</translation> <translation id="8428213095426709021">Beállítások</translation> <translation id="8429160401486700187">Mentett oldalak törlése</translation> +<translation id="8433057134996913067">Ezzel kijelentkezik a legtöbb webhelyről.</translation> <translation id="8481940801237642152">A webhellyel való kapcsolata privát, ám valaki a hálózaton módosíthatja az oldal megjelenését.</translation> <translation id="8493948351860045254">Terület felszabadítása</translation> <translation id="8497726226069778601">Nincs itt semmi látnivaló… még</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">A webhellyel való kapcsolata privát.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Nem érhető el az ide vezető navigáció: <ph name="URL" /></translation> +<translation id="8979340629087822094">elmúlt nap</translation> <translation id="8987061207681586800">Formálja saját ízlésére a Chrome-ot</translation> <translation id="9019902583201351841">Szülők által kezelt</translation> <translation id="9020607083536754075">Az aktuális lap bezárása, és visszatérés az előző alkalmazáshoz</translation> +<translation id="9038649477754266430">A várható kifejezés szolgáltatás használata az oldalak gyorsabb betöltése érdekében</translation> <translation id="9050666287014529139">Összetett jelszó</translation> <translation id="9060538597317784206">A(z) <ph name="APP_NAME" /> alkalmazás megtekintése a Play Áruházban. Értékelés: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Kapcsolja ki az Asztali webhely kérése funkciót</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index 8f6c997e..8611bf3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Berhenti</translation> <translation id="1285320974508926690">Jangan pernah terjemahkan situs ini</translation> +<translation id="1291207594882862231">Menghapus riwayat, cookie, data situs, cache...</translation> <translation id="129553762522093515">Barusan ditutup</translation> <translation id="1346090444609141578">Tidak ada laman tersimpan di sini</translation> <translation id="1369915414381695676">Situs <ph name="SITE_NAME" /> ditambahkan</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Cegah dialog lain dari laman ini.</translation> <translation id="1641113438599504367">Penelusuran Aman</translation> +<translation id="164269334534774161">Anda melihat salinan offline laman ini dari <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Menerjemahkan laman ke bahasa <ph name="SOURCE_LANGUAGE" />...</translation> <translation id="1644574205037202324">Riwayat</translation> <translation id="1647391597548383849">Mengakses kamera Anda</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Segarkan laman</translation> <translation id="2709516037105925701">IsiOtomatis</translation> <translation id="271033894570825754">Baru</translation> +<translation id="2742271047622814453">Preferensi yang disimpan di situs mungkin terhapus</translation> <translation id="2748463065602559597">Anda sedang melihat laman Google Chrome yang aman.</translation> <translation id="2762000892062317888">baru saja</translation> <translation id="2770465223704140727">Hapus dari daftar</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Lanjutkan untuk mengunduh konten?</translation> <translation id="3328801116991980348">Informasi situs</translation> <translation id="3350687908700087792">Tutup semua jendela penyamaran</translation> +<translation id="3351441609270267898">Impor data yang ada</translation> <translation id="3358663646935160692">Akun ini dikelola oleh <ph name="DOMAIN_NAME" />. Anda masuk dengan akun yang dikelola dan memberikan administratornya kontrol atas profil Chrome Anda. Data Chrome Anda akan terikat dengan akun ini secara permanen. Memutuskan tautan dengan akun ini akan menghapus data Chrome lokal.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Tab penyamaran baru</translation> <translation id="3501331331116143684">Laman disimpan secara offline di <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Terima & lanjutkan</translation> +<translation id="3522247891732774234">Pembaruan tersedia. Opsi lainnya</translation> <translation id="3527085408025491307">Folder</translation> <translation id="3549644494707163724">Enkripsikan data yang disinkronkan dengan frasa sandi sinkronisasi Anda</translation> <translation id="360480449234699036">Pelajari tentang topik di situs web tanpa meninggalkan laman. Sentuh untuk Menelusuri mengirimkan kata dan konteks di sekitarnya ke Google Penelusuran, mengembalikan definisi, gambar, hasil penelusuran, serta detail lainnya. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Buka di tab baru</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> bookmark disimpan secara offline</translation> <translation id="423410644998903704">Chrome memerlukan akses izin untuk berbagi dengan situs ini.</translation> -<translation id="4247939399682707041">Ganti data perangkat ini dengan data <ph name="ACCOUNT" />. Anda dapat mengambil data yang sudah ada dengan beralih kembali ke <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Keluar dari Chrome?</translation> <translation id="4254813446494774748">Bahasa Terjemahan:</translation> <translation id="4256782883801055595">Lisensi sumber terbuka</translation> @@ -242,7 +246,7 @@ <translation id="4457399174246232812">Laman Web Fisik di sekitar mendatang akan muncul di daftar notifikasi</translation> <translation id="4498934959426056365">Pembuatan kunci</translation> <translation id="4505554159887937799">Disimpan untuk offline</translation> -<translation id="4508440807153586353">Hanya orang yang memiliki frasa sandi Anda yang dapat membaca data terenkripsi Anda. Frasa sandi tidak dikirim ke atau disimpan oleh Google. Jika lupa frasa sandi atau ingin mengubah setelan ini, Anda perlu menyetel ulang sinkronisasi. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation> +<translation id="4508440807153586353">Hanya orang yang memiliki frasa sandi Anda yang dapat membaca data terenkripsi. Frasa sandi tidak akan dikirim ke atau disimpan oleh Google. Jika lupa frasa sandi atau ingin mengubah setelan ini, Anda perlu menyetel ulang sinkronisasi. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# hari yang lalu}other{# hari yang lalu}}</translation> <translation id="4522570452068850558">Detail</translation> <translation id="4526249700380860531">Melihat dan mengelola sandi yang tersimpan di <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -372,7 +376,7 @@ <translation id="5911030830365207728">Google Terjemahan</translation> <translation id="5916664084637901428">Aktif</translation> <translation id="5939518447894949180">Setel ulang</translation> -<translation id="5965336165840183977">Tindakan ini menghapus data yang disinkronkan dari semua perangkat. Anda tidak akan dikeluarkan dari akun Google. Setelan situs yang tersimpan tidak akan dihapus dan dapat menunjukkan kebiasaan penjelajahan Anda.</translation> +<translation id="5965336165840183977">Tindakan ini akan menghapus data yang disinkronkan dari semua perangkat. Anda tidak akan dikeluarkan dari akun Google. Setelan situs yang tersimpan tidak akan dihapus dan dapat menunjukkan kebiasaan penjelajahan Anda.</translation> <translation id="5968595432776860642">Memutar “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Mengakses masukan video</translation> <translation id="6012342843556706400">Chrome memerlukan akses lokasi untuk berbagi dengan situs ini.</translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">Konten dilindungi</translation> <translation id="6612856669344839356">Simpan bookmark</translation> <translation id="6627583120233659107">Edit folder</translation> +<translation id="6647073004883890710">Ingin <ph name="PASSWORD_MANAGER_BRAND" /> memperbarui sandi bagi <ph name="USERNAME" /> untuk situs ini?</translation> <translation id="6656545060687952787">Chrome memerlukan akses lokasi untuk memindai perangkat. <ph name="BEGIN_LINK" />Perbarui izin<ph name="END_LINK" /></translation> <translation id="666268767214822976">Gunakan layanan prediksi untuk menunjukkan kueri terkait dan situs web populer saat Anda mengetik di bilah alamat</translation> <translation id="666981079809192359">Notifikasi Privasi Chrome</translation> @@ -452,7 +457,6 @@ <translation id="6868088497967843822">Masuk untuk mendapatkan bookmark, riwayat, sandi, dan setelan Anda lainnya di semua perangkat</translation> <translation id="6945221475159498467">Pilih</translation> <translation id="6963766334940102469">Hapus bookmark</translation> -<translation id="6964496835063002391">Tambahkan akun</translation> <translation id="6965382102122355670">Oke</translation> <translation id="6973630695168034713">Folder</translation> <translation id="6978479750597523876">Setel ulang setelan terjemahan</translation> @@ -484,6 +488,7 @@ <translation id="7324738665594301612">Kami menguji pemberian proxy pada laman HTTPS melalui server Google sebagai bagian dari percobaan.</translation> <translation id="7346217184097589238">Setelan situs yang tersimpan tidak akan dihapus dan dapat menunjukkan kebiasaan penjelajahan Anda.</translation> <translation id="7346909386216857016">Oke, mengerti</translation> +<translation id="7347770551817603360">Konten offline</translation> <translation id="7363354739009474003">Memuat “<ph name="VIDEO_TITLE" />”</translation> <translation id="7366340029385295517">Mentransmisikan ke <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Jenis:</translation> @@ -544,6 +549,7 @@ <translation id="8050319187894766337">Laman disimpan untuk offline. Penyimpanan hampir penuh.</translation> <translation id="8068648041423924542">Tidak dapat memilih sertifikat.</translation> <translation id="8069239273282989646">Setelah kompresi</translation> +<translation id="8073388330009372546">Buka gambar di tab baru</translation> <translation id="8084156870963450514">Masuk untuk mengakses semua file web Anda dari perangkat apa pun</translation> <translation id="8106211421800660735">Nomor kartu kredit</translation> <translation id="813082847718468539">Lihat informasi situs</translation> @@ -566,6 +572,7 @@ <translation id="8413385045638830869">Tanya dulu (disarankan)</translation> <translation id="8428213095426709021">Setelan</translation> <translation id="8429160401486700187">Hapus laman tersimpan</translation> +<translation id="8433057134996913067">Tindakan ini akan mengeluarkan Anda dari sebagian besar situs web.</translation> <translation id="8481940801237642152">Sambungan Anda ke situs ini bersifat pribadi, namun seseorang yang berada dalam jaringan Anda mungkin dapat mengubah tampilan laman.</translation> <translation id="8493948351860045254">Kosongkan ruang</translation> <translation id="8497726226069778601">Belum ada yang dapat dilihat di sini…</translation> @@ -610,6 +617,7 @@ <translation id="8987061207681586800">Gayakan Chrome sesukamu</translation> <translation id="9019902583201351841">Dikelola oleh orang tua Anda</translation> <translation id="9020607083536754075">Tutup tab saat ini dan kembali ke aplikasi sebelumnya</translation> +<translation id="9038649477754266430">Gunakan layanan prediksi agar laman dimuat dengan lebih cepat</translation> <translation id="9050666287014529139">Frasa sandi</translation> <translation id="9060538597317784206">Lihat aplikasi <ph name="APP_NAME" /> di Play Store. Rating: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Nonaktifkan Minta situs desktop</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb index 5c01d99..9a6ff43 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Doodle di Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Interrompi</translation> <translation id="1285320974508926690">Non tradurre mai questo sito</translation> +<translation id="1291207594882862231">Cancella la cronologia, i cookie, i dati siti, la cache…</translation> <translation id="129553762522093515">Chiuse di recente</translation> <translation id="1346090444609141578">Nessuna pagina salvata qui</translation> <translation id="1369915414381695676">Sito <ph name="SITE_NAME" /> aggiunto</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Videocamera</translation> <translation id="1623104350909869708">Impedisci la creazione di altre finestre di dialogo in questa pagina</translation> <translation id="1641113438599504367">Navigazione sicura</translation> +<translation id="164269334534774161">È visualizzata una copia offline di questa pagina del giorno <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Traduzione della pagina in <ph name="SOURCE_LANGUAGE" /> in corso...</translation> <translation id="1644574205037202324">Cronologia</translation> <translation id="1647391597548383849">Accesso alla videocamera</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Aggiorna la pagina</translation> <translation id="2709516037105925701">Compilazione automatica</translation> <translation id="271033894570825754">Nuovo</translation> +<translation id="2742271047622814453">Le preferenze salvate sui siti potrebbero essere eliminate.</translation> <translation id="2748463065602559597">È visualizzata una pagina sicura di Google Chrome.</translation> <translation id="2762000892062317888">in questo istante</translation> <translation id="2770465223704140727">Rimuovi dall'elenco</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Procedere al download dei contenuti?</translation> <translation id="3328801116991980348">Informazioni sito</translation> <translation id="3350687908700087792">Chiudi tutte le schede di navigazione in incognito</translation> +<translation id="3351441609270267898">Importa i dati esistenti</translation> <translation id="3358663646935160692">Questo account è gestito da <ph name="DOMAIN_NAME" />. Stai per eseguire l'accesso con un account gestito e consentire al relativo amministratore di controllare il tuo profilo Chrome. I tuoi dati di Chrome verranno associati definitivamente a questo account. La disconnessione dall'account comporterà l'eliminazione dei dati di Chrome locali.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Nuova scheda in incognito</translation> <translation id="3501331331116143684">Pagina salvata offline in <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Accetta e continua</translation> +<translation id="3522247891732774234">Aggiornamento disponibile. Altre opzioni</translation> <translation id="3527085408025491307">Cartella</translation> <translation id="3549644494707163724">Crittografa tutti i dati sincronizzati con la tua passphrase di sincronizzazione</translation> <translation id="360480449234699036">Scopri gli argomenti dei siti web senza lasciare la pagina. La funzione Tocca per cercare consente di inviare una parola e il relativo contesto alla Ricerca Google; vengono restituiti risultati di ricerca, immagini, definizioni e altri dettagli. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Apri in un'altra scheda</translation> <translation id="4198229475320555619">Preferito salvato offline: <ph name="PAGE_SIZE_STRING" /></translation> <translation id="423410644998903704">Chrome deve avere accesso alle autorizzazioni per condividerle con questo sito.</translation> -<translation id="4247939399682707041">Sostituisci i dati di questo dispositivo con i dati dell'account <ph name="ACCOUNT" />. Puoi recuperare i tuoi dati esistenti tornando all'account <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Uscire da Chrome?</translation> <translation id="4254813446494774748">Lingua della traduzione:</translation> <translation id="4256782883801055595">Licenze open source</translation> @@ -242,7 +246,7 @@ <translation id="4457399174246232812">In futuro le pagine Physical Web vicine verranno visualizzate nel tuo elenco di notifiche</translation> <translation id="4498934959426056365">Generazione di chiavi</translation> <translation id="4505554159887937799">Salvate offline</translation> -<translation id="4508440807153586353">Soltanto chi conosce la tua passphrase può leggere i tuoi dati criptati. La passphrase non viene inviata a o memorizzata da Google. Se dimentichi la passphrase o vuoi modificare questa impostazione, dovrai reimpostare la sincronizzazione. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation> +<translation id="4508440807153586353">Soltanto chi conosce la tua passphrase può leggere i tuoi dati criptati. La passphrase non viene inviata a Google né memorizzata. Se dimentichi la passphrase o vuoi modificare questa impostazione, dovrai reimpostare la sincronizzazione. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# giorno fa}other{# giorni fa}}</translation> <translation id="4522570452068850558">Dettagli</translation> <translation id="4526249700380860531">Controlla e gestisci le password salvate all'indirizzo <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -326,7 +330,7 @@ <translation id="5424715742813396254">Modifica nome/password salvati o eccezione</translation> <translation id="5442257541162692417">Modifica pagina salvata</translation> <translation id="544291274896356069">Se apri questo link in un'applicazione esterna uscirai dalla modalità di navigazione in incognito. Continuare?</translation> -<translation id="5487521232677179737">Cancella dati.</translation> +<translation id="5487521232677179737">Cancella dati</translation> <translation id="5487729733663684359">Gli aggiornamenti di Chrome non sono più supportati per questa versione di Android.</translation> <translation id="5511351932351731210">Invia sempre</translation> <translation id="5512137114520586844">Questo account è gestito da <ph name="PARENT_NAME" />.</translation> @@ -372,7 +376,7 @@ <translation id="5911030830365207728">Google Traduttore</translation> <translation id="5916664084637901428">On</translation> <translation id="5939518447894949180">Ripristina</translation> -<translation id="5965336165840183977">Questa operazione elimina i dati sincronizzati da tutti i dispositivi. Non verrai scollegato dal tuo account Google. Le impostazioni sito salvate non verranno eliminate e potrebbero rispecchiare le tue abitudini di navigazione.</translation> +<translation id="5965336165840183977">Questa operazione elimina i dati sincronizzati da tutti i dispositivi. Non verrai disconnesso dal tuo account Google. Le impostazioni del sito salvate non verranno eliminate e potrebbero rispecchiare le tue abitudini di navigazione.</translation> <translation id="5968595432776860642">"<ph name="VIDEO_TITLE" />" in riproduzione</translation> <translation id="6010869025736512584">Accesso all'input video in corso</translation> <translation id="6012342843556706400">Chrome deve avere accesso alla posizione per condividerla con questo sito.</translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">Contenuti protetti</translation> <translation id="6612856669344839356">Salva Preferito</translation> <translation id="6627583120233659107">Modifica cartella</translation> +<translation id="6647073004883890710">Vuoi che <ph name="PASSWORD_MANAGER_BRAND" /> aggiorni la password di questo sito per l'account <ph name="USERNAME" />?</translation> <translation id="6656545060687952787">Chrome ha bisogno dell'accesso alla posizione per cercare dispositivi. <ph name="BEGIN_LINK" />Aggiorna le autorizzazioni<ph name="END_LINK" /></translation> <translation id="666268767214822976">Utilizza un servizio di previsione per visualizzare query correlate e siti web popolari durante la digitazione nella barra degli indirizzi</translation> <translation id="666981079809192359">Informativa sulla privacy di Chrome</translation> @@ -452,7 +457,6 @@ <translation id="6868088497967843822">Accedi per visualizzare i tuoi Preferiti, la cronologia, le password e altre impostazioni su tutti i tuoi dispositivi</translation> <translation id="6945221475159498467">Seleziona</translation> <translation id="6963766334940102469">Elimina Preferiti</translation> -<translation id="6964496835063002391">Aggiungi un account</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Cartelle</translation> <translation id="6978479750597523876">Reimposta impostazioni traduzione</translation> @@ -482,8 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Guida<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Elimina preferito</translation> <translation id="7324738665594301612">Stiamo testando il proxy delle pagine HTTPS tramite i server di Google nell'ambito di un esperimento.</translation> -<translation id="7346217184097589238">Le impostazioni sito salvate non verranno eliminate e potrebbero rispecchiare le tue abitudini di navigazione.</translation> +<translation id="7346217184097589238">Le impostazioni del sito salvate non verranno eliminate e potrebbero rispecchiare le tue abitudini di navigazione.</translation> <translation id="7346909386216857016">OK</translation> +<translation id="7347770551817603360">Contenuto non in linea</translation> <translation id="7363354739009474003">Caricamento di "<ph name="VIDEO_TITLE" />" in corso</translation> <translation id="7366340029385295517">Trasmissione su <ph name="SCREEN_NAME" /> in corso</translation> <translation id="7375125077091615385">Tipo:</translation> @@ -544,6 +549,7 @@ <translation id="8050319187894766337">Pag salvata offline. Memoria quasi piena.</translation> <translation id="8068648041423924542">Impossibile selezionare il certificato.</translation> <translation id="8069239273282989646">Dopo la compressione</translation> +<translation id="8073388330009372546">Immagine in nuova scheda</translation> <translation id="8084156870963450514">Esegui l'accesso per accedere a tutti i tuoi contenuti web da qualsiasi dispositivo</translation> <translation id="8106211421800660735">Numero carta di credito</translation> <translation id="813082847718468539">Visualizza informazioni sul sito</translation> @@ -566,6 +572,7 @@ <translation id="8413385045638830869">Chiedi prima (opzione consigliata)</translation> <translation id="8428213095426709021">Impostazioni</translation> <translation id="8429160401486700187">Elimina pagine salvate</translation> +<translation id="8433057134996913067">In questo modo uscirai dalla maggior parte dei siti web.</translation> <translation id="8481940801237642152">La tua connessione a questo sito è privata, ma qualcuno in rete potrebbe riuscire a cambiare l'aspetto della pagina.</translation> <translation id="8493948351860045254">Libera spazio</translation> <translation id="8497726226069778601">Qui non c'è ancora niente</translation> @@ -610,6 +617,7 @@ <translation id="8987061207681586800">Personalizza Chrome</translation> <translation id="9019902583201351841">Gestito dai genitori</translation> <translation id="9020607083536754075">Chiudi la scheda corrente e torna all'app precedente</translation> +<translation id="9038649477754266430">Utilizza un servizio di previsione per velocizzare il caricamento delle pagine</translation> <translation id="9050666287014529139">Passphrase</translation> <translation id="9060538597317784206">Visualizza l'app <ph name="APP_NAME" /> sul Play Store. Valutazione: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Disattiva Richiedi sito desktop</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb index b0077aa..e76e07e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="iw"> +<translation id="1040144152982955218">מחפש מכשירים… <ph name="BEGIN_LINK" />קבל עזרה<ph name="END_LINK" /></translation> <translation id="1056898198331236512">אזהרה</translation> <translation id="10614374240317010">פריטים שאף פעם לא נשמרו</translation> <translation id="1061441684050139317">Chrome זקוק לגישה למיקרופון כדי לשתף אותו עם האתר הזה.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">הוסף חשבון כדי לקבל גישה אל הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות בכל המכשירים שברשותך.</translation> <translation id="1098052486217676340">הסתיים</translation> <translation id="1121094540300013208">דוחות קריסה ושימוש</translation> +<translation id="1137305377394488060">מהשעה האחרונה</translation> <translation id="1178581264944972037">השהה</translation> <translation id="1181037720776840403">הסר</translation> <translation id="1197267115302279827">העבר סימניות</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">דודל של Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">הפסק</translation> <translation id="1285320974508926690">לעולם אל תתרגם אתר זה</translation> +<translation id="1291207594882862231">נקה את ההיסטוריה, קובצי ה-cookie, נתוני האתרים, הקובץ השמור…</translation> <translation id="129553762522093515">נסגרו לאחרונה</translation> <translation id="1346090444609141578">אין כאן דפים שנשמרו</translation> <translation id="1369915414381695676">האתר <ph name="SITE_NAME" /> נוסף</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">מצלמה</translation> <translation id="1623104350909869708">מנע מהדף זה ליצור תיבות דו-שיח נוספות</translation> <translation id="1641113438599504367">גלישה בטוחה</translation> +<translation id="164269334534774161">אתה מציג עותק לא מקוון של הדף הזה מ-<ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">מתרגם את הדף ל<ph name="SOURCE_LANGUAGE" />...</translation> <translation id="1644574205037202324">היסטוריה</translation> <translation id="1647391597548383849">גישה אל המצלמה שלך</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">הגדרות התרגום שלך אופסו.</translation> <translation id="2359808026110333948">המשך</translation> <translation id="2381756643783702095">שאל לפני שליחה (מומלץ)</translation> +<translation id="2385560268894525395">מהשבוע האחרון</translation> <translation id="2387895666653383613">שינוי גודל טקסט</translation> <translation id="238909021488141516">אירעה שגיאה בזמן הורדת התוכן.</translation> <translation id="2414886740292270097">כהה</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">רענן את הדף</translation> <translation id="2709516037105925701">מילוי אוטומטי</translation> <translation id="271033894570825754">חדש</translation> +<translation id="2742271047622814453">ייתכן שהעדפות ששמרת לאתרים יימחקו</translation> <translation id="2748463065602559597">אתה מציג דף Google Chrome מאובטח.</translation> <translation id="2762000892062317888">ברגע זה</translation> <translation id="2770465223704140727">הסר מהרשימה</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">החשבון הזה מנוהל על ידי <ph name="PARENT_NAME_1" /> ו-<ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">זכויות יוצרים <ph name="YEAR" /> Google Inc. כל הזכויות שמורות.</translation> <translation id="2968755619301702150">מציג האישורים</translation> +<translation id="2996291259634659425">יצירת ביטוי סיסמה</translation> <translation id="2996809686854298943">דרושה כתובת אתר</translation> <translation id="3029704984691124060">ביטויי הסיסמה אינם תואמים</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />קבל עזרה<ph name="END_LINK" /></translation> <translation id="3063601790762993062">שמור סרטון</translation> <translation id="306566828762083630">שטח האחסון של המכשיר שלך מלא. הסר קבצים כדי לפנות מקום.</translation> <translation id="307329814453917357">הצע לתרגם דפים באמצעות Google Translate</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">הפעל הרשאות בשביל Chrome ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905">נתונים מאוחסנים בנפח <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">מסומן בסימניה</translation> +<translation id="321773570071367578">אם שכחת את ביטוי הסיסמה או אם ברצונך לשנות את ההגדרה הזו, <ph name="BEGIN_LINK" />אפס את הסינכרון<ph name="END_LINK" /></translation> <translation id="3227137524299004712">מיקרופון</translation> <translation id="3232754137068452469">אפליקציית אינטרנט</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">האם להוריד את התוכן?</translation> <translation id="3328801116991980348">פרטי אתר</translation> <translation id="3350687908700087792">סגור את כל כרטיסיות הגלישה בסתר</translation> +<translation id="3351441609270267898">ייבא נתונים קיימים</translation> <translation id="3358663646935160692">החשבון הזה מנוהל על ידי <ph name="DOMAIN_NAME" />. אתה נכנס לחשבון מנוהל, ונותן למנהל המערכת שליטה על פרופיל Chrome שלך. נתוני Chrome שלך ייקשרו באופן קבוע לחשבון הזה. התנתקות מהחשבון הזה תמחק את נתוני Chrome המקומיים.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">כרטיסייה חדשה לגלישה בסתר</translation> <translation id="3501331331116143684">הדף נשמר במצב לא מקוון בתיקייה <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">קבל והמשך</translation> +<translation id="3522247891732774234">יש עדכון זמין. עוד אפשרויות</translation> <translation id="3527085408025491307">תיקיה</translation> <translation id="3549644494707163724">הצפן את כל הנתונים המסונכרנים באמצעות משפט הסיסמה שלך לסנכרון</translation> <translation id="360480449234699036">קבל מידע על נושאים באתרים מבלי לצאת מהדף. התכונה 'גע כדי לחפש' שולחת מילה ואת ההקשר שלה אל חיפוש Google, המחזיר הגדרות, תמונות, תוצאות חיפוש ופרטים אחרים. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">אלץ הפעלת שינוי מרחק מתצוגה</translation> <translation id="3917783807003067648">המיקום חסום</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">מארבעת השבועות האחרונים</translation> <translation id="393697183122708255">חיפוש קולי מופעל לא זמין</translation> <translation id="3950820424414687140">כניסה</translation> <translation id="3988213473815854515">ניתנה הרשאת מיקום</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">פתח בכרטיסייה חדשה</translation> <translation id="4198229475320555619">סימניה בגודל <ph name="PAGE_SIZE_STRING" /> נשמרה במצב לא מקוון</translation> <translation id="423410644998903704">Chrome זקוק לגישה אל ההרשאות כדי לשתף אותן עם האתר הזה.</translation> +<translation id="424864128008805179">האם לצאת מ-Chrome?</translation> <translation id="4254813446494774748">שפת התרגום:</translation> <translation id="4256782883801055595">רישיונות קוד פתוח</translation> <translation id="4259722352634471385">הניווט חסום: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">מעתה ואילך, דפים בקרבת מקום באינטרנט הווירטופיזי יופיע ברשימת ההתראות</translation> <translation id="4498934959426056365">יצירת מפתחות</translation> <translation id="4505554159887937799">נשמר באופן לא מקוון</translation> +<translation id="4508440807153586353">רק מי שיודע את ביטוי הסיסמה שלך יכול לקרוא את הנתונים המוצפנים. ביטוי הסיסמה לא נשלח אל Google והיא אינה מאחסנת אותו. אם תשכח את ביטוי הסיסמה או אם תרצה לשנות את ההגדרה הזו, יהיה עליך לאפס את הסינכרון. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{לפני יום}two{לפני יומיים}many{לפני # ימים}other{לפני # ימים}}</translation> <translation id="4522570452068850558">פרטים</translation> <translation id="4526249700380860531">הצג ונהל סיסמאות שמורות ב-<ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">כרטיסייה חדשה</translation> <translation id="5271967389191913893">המכשיר לא מצליח לפתוח את התוכן להורדה.</translation> <translation id="5275558766013849309">כרטיסיות יאוחסנו ביחד עם יישומים אחרונים.</translation> +<translation id="5284584623296338184">שינויים בסימניות, בהיסטוריה, בסיסמאות ובהגדרות נוספות לא יסונכרנו עוד עם חשבון Google. עם זאת, הנתונים הקיימים עדיין יאוחסנו בחשבון Google שלך.</translation> <translation id="5301954838959518834">בסדר גמור, הבנתי</translation> <translation id="5302048478445481009">שפה</translation> <translation id="5304593522240415983">שדה זה לא יכול להיות ריק</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">ערוך שם/סיסמה או חריג שנשמרו</translation> <translation id="5442257541162692417">ערוך דף שמור</translation> <translation id="544291274896356069">פתיחת הקישור הזה ביישום חיצוני תוציא אותך ממצב גלישה בסתר. האם להמשיך?</translation> +<translation id="5487521232677179737">נקה נתונים</translation> <translation id="5487729733663684359">עדכוני Chrome אינם נתמכים עוד בגרסה הזו של Android.</translation> <translation id="5511351932351731210">שלח תמיד</translation> <translation id="5512137114520586844">החשבון הזה מנוהל על ידי <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Translate</translation> <translation id="5916664084637901428">פועל</translation> <translation id="5939518447894949180">אפס</translation> +<translation id="5965336165840183977">פעולה זו מוחקת נתונים מסונכרנים מכל המכשירים. לא תתבצע התנתקות מחשבון Google. הגדרות אתרים ששמרת לא יימחקו והן עשויות לשקף את הרגלי הגלישה שלך.</translation> <translation id="5968595432776860642">מפעיל את "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">גישה לפלט אודיו</translation> <translation id="6012342843556706400">Chrome זקוק לגישה אל המיקום כדי לשתף אותו עם האתר הזה.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">תוכן מוגן</translation> <translation id="6612856669344839356">שמור סימניה</translation> <translation id="6627583120233659107">ערוך תיקיה</translation> +<translation id="6647073004883890710">האם אתה רוצה ש-<ph name="PASSWORD_MANAGER_BRAND" /> יעדכן את הסיסמה של <ph name="USERNAME" /> באתר הזה?</translation> <translation id="6656545060687952787">כדי לבצע סריקה לאיתור מכשירים ב-Chrome, יש צורך בגישה לנתוני מיקום. <ph name="BEGIN_LINK" />עדכן הרשאות<ph name="END_LINK" /></translation> <translation id="666268767214822976">השתמש בשירות חיזוי כדי להציג שאילתות קשורות ואתרים פופולריים תוך כדי ההקלדה בסרגל הכתובות</translation> <translation id="666981079809192359">הודעת הפרטיות של Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">הדף שנשמר אינו זמין במצב לא מקוון</translation> <translation id="6722992508235227685">הסימניות, ההיסטוריה, הסיסמאות והגדרות אחרות יסונכרנו עם חשבון Google כך שתוכל להשתמש בהם בכל המכשירים שלך. בעזרת ה<ph name="BEGIN_LINK1" />הגדרות<ph name="END_LINK1" /> ניתן לבחור איזה פריטים לסנכרן.</translation> <translation id="6738867403308150051">מוריד...</translation> +<translation id="6762156594045689028"><ph name="BEGIN_LINK" />אפס את הסינכרון<ph name="END_LINK" /> כדי לשנות את ההגדרה הזו</translation> <translation id="6770414673596662518">מערכת הגלישה הבטוחה של Chrome תשמש גם לזיהוי דפים זדוניים ולהגנה עליך מפני דיוג, תוכנות זדוניות והורדות של קבצים מזיקים.</translation> <translation id="6784675033504223784">חפש את "<ph name="SEARCH_TERM" />"</translation> <translation id="6790428901817661496">הפעל</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">היכנס כדי לקבל גישה אל הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות בכל המכשירים שברשותך</translation> <translation id="6945221475159498467">בחר</translation> <translation id="6963766334940102469">מחק סימניות</translation> -<translation id="6964496835063002391">הוסף חשבון</translation> <translation id="6965382102122355670">אישור</translation> <translation id="6973630695168034713">תיקיות</translation> <translation id="6978479750597523876">אפס את הגדרות Google Translate</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">זוהה חיבור איטי</translation> <translation id="7057058088140140610">שימוש בכרטיסי אשראי ובכתובות באמצעות Google Payments</translation> <translation id="7063006564040364415">לא ניתן היה להתחבר אל שרת הסנכרון.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> רוצה לבצע התאמה עם:</translation> +<translation id="7081639897063626814">שמור בנפרד את הנתונים הקיימים</translation> <translation id="7094922512924405309">לא נמצאו דפים של האינטרנט הווירטופיזי בקרבת מקום</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> כרטיסיות פתוחות</translation> <translation id="7096034533295549981">טוען סרטון</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />עזרה<ph name="END_LINK" /></translation> <translation id="7299721129597238157">מחק סימניה</translation> <translation id="7324738665594301612">אנו בודקים את ההעברה של דפי HTTPS בשרתי proxy של Google כחלק מניסוי.</translation> +<translation id="7346217184097589238">הגדרות אתרים ששמרת לא יימחקו והן עשויות לשקף את הרגלי הגלישה שלך.</translation> <translation id="7346909386216857016">בסדר, הבנתי</translation> +<translation id="7347770551817603360">תוכן לא מקוון</translation> <translation id="7363354739009474003">טוען את "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">מעביר אל <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">סוג:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">אשר את מחיקת פרטי הכניסה של המכשיר</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (עודכן <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">המתן…</translation> +<translation id="7499262814309712782">חשבון לסינכרון</translation> <translation id="7501135638693251872">כל הסימניות</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">מנקה נתוני גלישה</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">הדף נשמר באופן לא מקוון. האחסון כמעט מלא.</translation> <translation id="8068648041423924542">אין אפשרות לבחור אישור.</translation> <translation id="8069239273282989646">לאחר דחיסה</translation> +<translation id="8073388330009372546">פתח את התמונה בכרטיסייה חדשה</translation> <translation id="8084156870963450514">היכנס כדי לגשת לכל הדברים שלך באינטרנט מכל מכשיר</translation> <translation id="8106211421800660735">מספר כרטיס אשראי</translation> <translation id="813082847718468539">הצג נתוני אתר</translation> <translation id="8137558756159375272">'גע כדי לחפש' שולח אל חיפוש Google את המילה הנבחרת, יחד עם הדף הנוכחי בתור הקשר. תוכל לכבות זאת ב<ph name="BEGIN_LINK" />הגדרות<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">לא נשמר באופן לא מקוון</translation> <translation id="8168435359814927499">תוכן</translation> +<translation id="8173098127580644436">משחר ההיסטוריה</translation> <translation id="8200772114523450471">חדש</translation> <translation id="8209050860603202033">פתח את התמונה</translation> <translation id="8218346974737627104">אשר את הכניסה</translation> <translation id="8218934717680664417">עכשיו אפשר לחפש בנגיעה אחת</translation> +<translation id="8223946939421658889">נקה נתונים</translation> <translation id="8261506727792406068">מחק</translation> <translation id="8275818695183729150">התר (בשביל חיפושים בסרגל הכתובות)</translation> +<translation id="8283853025636624853">מסנכרן עם <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">כרטיסיות רגילות</translation> <translation id="8374821112118309944">עליך לעדכן את TalkBack לגרסה חדשה יותר.</translation> <translation id="8396312449826231789">רק אתרים שאושרו</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">שאל תחילה (מומלץ)</translation> <translation id="8428213095426709021">הגדרות</translation> <translation id="8429160401486700187">מחק את הדפים שנשמרו</translation> +<translation id="8433057134996913067">פעולה זו תוציא אותך מהחשבון ברוב האתרים.</translation> <translation id="8481940801237642152">החיבור שלך לאתר הזה הוא פרטי, אך ייתכן שמישהו ברשת יכול לשנות את המראה של הדף.</translation> <translation id="8493948351860045254">פנה שטח אחסון</translation> <translation id="8497726226069778601">אין מה לראות כאן… בינתיים</translation> @@ -583,9 +611,11 @@ <translation id="8941248009481596111">החיבור שלך לאתר זה הוא פרטי.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">הניווט לא אפשרי: <ph name="URL" /></translation> +<translation id="8979340629087822094">מהיום האחרון</translation> <translation id="8987061207681586800">התאם אישית את Chrome</translation> <translation id="9019902583201351841">מנוהל על-ידי ההורים שלך</translation> <translation id="9020607083536754075">סגור את הכרטיסייה הנוכחית וחזור לאפליקציה הקודמת</translation> +<translation id="9038649477754266430">השתמש בשירות חיזוי כדי לטעון דפים מהר יותר</translation> <translation id="9050666287014529139">משפט-סיסמה</translation> <translation id="9060538597317784206">הצג את האפליקציה <ph name="APP_NAME" /> בחנות Play. דירוג: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">כבה את 'בקש אתר עבור מחשב שולחני'</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb index 4effc0aa..9a56563 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ja"> +<translation id="1040144152982955218">デバイスを検索しています… <ph name="BEGIN_LINK" />ヘルプ<ph name="END_LINK" /></translation> <translation id="1056898198331236512">警告</translation> <translation id="10614374240317010">未保存</translation> <translation id="1061441684050139317">このサイトとマイクを共有するには Chrome にマイクへのアクセスを許可する必要があります。</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">アカウントを追加すると、お使いのどのデバイスでも同じブックマーク、履歴、パスワード、その他の設定を利用できるようになります。</translation> <translation id="1098052486217676340">終了しました</translation> <translation id="1121094540300013208">利用状況と障害レポート</translation> +<translation id="1137305377394488060">過去 1 時間</translation> <translation id="1178581264944972037">一時停止</translation> <translation id="1181037720776840403">削除</translation> <translation id="1197267115302279827">ブックマークを移動</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google Doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">中止</translation> <translation id="1285320974508926690">このサイトは翻訳しない</translation> +<translation id="1291207594882862231">履歴、Cookie、サイトデータ、キャッシュを消去…</translation> <translation id="129553762522093515">最近閉じたタブ</translation> <translation id="1346090444609141578">ここに保存されているページはありません</translation> <translation id="1369915414381695676">サイト <ph name="SITE_NAME" /> を追加しました</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">カメラ</translation> <translation id="1623104350909869708">このページで追加のダイアログが作成されないようにする</translation> <translation id="1641113438599504367">セーフ ブラウジング</translation> +<translation id="164269334534774161">このページの <ph name="CREATION_TIME" /> のオフライン コピーを表示しています</translation> <translation id="1643702317193804718">ページを<ph name="SOURCE_LANGUAGE" />に翻訳しています...</translation> <translation id="1644574205037202324">履歴</translation> <translation id="1647391597548383849">カメラへのアクセス</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">翻訳設定をリセットしました。</translation> <translation id="2359808026110333948">続行</translation> <translation id="2381756643783702095">送信する前に確認する(推奨)</translation> +<translation id="2385560268894525395">過去 1 週間</translation> <translation id="2387895666653383613">テキストの拡大と縮小</translation> <translation id="238909021488141516">コンテンツのダウンロード中にエラーが発生しました。</translation> <translation id="2414886740292270097">暗</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">ページを更新</translation> <translation id="2709516037105925701">自動入力</translation> <translation id="271033894570825754">新しいファイル</translation> +<translation id="2742271047622814453">サイトで保存した設定が削除されることがあります</translation> <translation id="2748463065602559597">Google Chrome の安全なページを表示しています。</translation> <translation id="2762000892062317888">たった今</translation> <translation id="2770465223704140727">リストから削除</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">このアカウントは <ph name="PARENT_NAME_1" /> と <ph name="PARENT_NAME_2" /> によって管理されています。</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. All rights reserved.</translation> <translation id="2968755619301702150">証明書ビューア</translation> +<translation id="2996291259634659425">パスフレーズの作成</translation> <translation id="2996809686854298943">URLが必要です</translation> <translation id="3029704984691124060">パスフレーズが一致しません</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />ヘルプ<ph name="END_LINK" /></translation> <translation id="3063601790762993062">動画を保存</translation> <translation id="306566828762083630">デバイスのストレージがいっぱいです。他のメディアを削除して容量を空けてください。</translation> <translation id="307329814453917357">Google 翻訳を使ってページを翻訳するかどうかを尋ねます</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />で Chrome の権限を有効にしてください。</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> の保存データ</translation> <translation id="3207960819495026254">ブックマークしました</translation> +<translation id="321773570071367578">パスフレーズを忘れた場合や、この設定を変更する場合は、<ph name="BEGIN_LINK" />同期をリセット<ph name="END_LINK" />します</translation> <translation id="3227137524299004712">マイク</translation> <translation id="3232754137068452469">ウェブアプリ</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">コンテンツのダウンロードに進みますか?</translation> <translation id="3328801116991980348">サイト情報</translation> <translation id="3350687908700087792">すべてのシークレット タブを閉じます</translation> +<translation id="3351441609270267898">既存のデータをインポートする</translation> <translation id="3358663646935160692">このアカウントは <ph name="DOMAIN_NAME" /> によって管理されています。 管理対象アカウントでログインし、アカウントの管理者に自分の Chrome プロフィールの管理を委ねようとしています。あなたの Chrome データはこのアカウントに永続的に関連付けられます。このアカウントを切り離すと、ローカルの Chrome データが削除されます。</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">新しいシークレット タブ</translation> <translation id="3501331331116143684"><ph name="FOLDER_NAME" /> にページをオフライン保存しました</translation> <translation id="3518985090088779359">同意して続行</translation> +<translation id="3522247891732774234">アップデートが見つかりました。その他のオプション</translation> <translation id="3527085408025491307">フォルダ</translation> <translation id="3549644494707163724">同期パスフレーズで同期データをすべて暗号化する</translation> <translation id="360480449234699036">ウェブサイト上のトピックについてページを移動せずに調べられます。[タップして検索] を使用すると、単語とその周囲のコンテキストが Google 検索に送信され、定義、画像、検索結果などの情報が返されます。 @@ -193,6 +204,7 @@ <translation id="3895926599014793903">強制的にズームを有効にする</translation> <translation id="3917783807003067648">位置情報はブロック</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">過去 4 週間</translation> <translation id="393697183122708255">有効な音声検索がありません</translation> <translation id="3950820424414687140">ログイン</translation> <translation id="3988213473815854515">位置情報は許可</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">新しいタブで開く</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> のブックマークをオフライン保存しました</translation> <translation id="423410644998903704">このサイトと機能を共有するには Chrome にアクセスを許可する必要があります。</translation> +<translation id="424864128008805179">Chrome からログアウトしますか?</translation> <translation id="4254813446494774748">翻訳言語:</translation> <translation id="4256782883801055595">オープンソース ライセンス</translation> <translation id="4259722352634471385"><ph name="URL" /> へのアクセスがブロックされました</translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">今後、近くのフィジカル ウェブページは通知リストに表示されます</translation> <translation id="4498934959426056365">キーの生成</translation> <translation id="4505554159887937799">オフライン保存したページ</translation> +<translation id="4508440807153586353">パスフレーズを知っているユーザーだけが暗号化データを読み取ることができます。パスフレーズが Google に送信されたり Google で保存されたりすることはありません。パスフレーズを忘れた場合や、この設定を変更する場合は、同期をリセットする必要があります。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# 日前}other{# 日前}}</translation> <translation id="4522570452068850558">詳細</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> での保存パスワードの表示と管理</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">新しいタブ</translation> <translation id="5271967389191913893">デバイスでダウンロード コンテンツを開くことができません。</translation> <translation id="5275558766013849309">タブは最近使ったアプリと一緒に表示されます。</translation> +<translation id="5284584623296338184">今後、ブックマーク、履歴、パスワードなどの設定への変更は Google アカウントに同期されません。ただし、既存のデータは Google アカウントに保存されたままとなります。</translation> <translation id="5301954838959518834">OK</translation> <translation id="5302048478445481009">言語</translation> <translation id="5304593522240415983">この項目は必須です</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">保存した名前 / パスワードまたは例外の編集</translation> <translation id="5442257541162692417">保存したページを編集してください</translation> <translation id="544291274896356069">このリンクを外部アプリケーションで開くと、シークレット モードが解除されます。続行しますか?</translation> +<translation id="5487521232677179737">データを消去</translation> <translation id="5487729733663684359">このバージョンの Android では Chrome の更新はサポートされなくなりました。</translation> <translation id="5511351932351731210">常に送信</translation> <translation id="5512137114520586844">このアカウントは <ph name="PARENT_NAME" /> によって管理されています。</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google 翻訳</translation> <translation id="5916664084637901428">オン</translation> <translation id="5939518447894949180">リセット</translation> +<translation id="5965336165840183977">すべての端末から同期データを消去します。Google アカウントからのログアウトは行われません。保存済みのサイトの設定は消去されず、普段の閲覧行動を反映した設定などが残る可能性もあります。</translation> <translation id="5968595432776860642">「<ph name="VIDEO_TITLE" />」を再生しています</translation> <translation id="6010869025736512584">ビデオ入力にアクセスしています</translation> <translation id="6012342843556706400">このサイトと位置情報を共有するには Chrome に位置情報へのアクセスを許可する必要があります。</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">保護されたコンテンツ</translation> <translation id="6612856669344839356">ブックマークを保存</translation> <translation id="6627583120233659107">フォルダを編集</translation> +<translation id="6647073004883890710"><ph name="PASSWORD_MANAGER_BRAND" /> に保存されているこのサイトの <ph name="USERNAME" /> のパスワードを更新しますか?</translation> <translation id="6656545060687952787">デバイスをスキャンするには、Chrome で位置情報にアクセスする必要があります。<ph name="BEGIN_LINK" />権限を更新<ph name="END_LINK" /></translation> <translation id="666268767214822976">予測サービスを使用し、アドレスバーへの入力時に関連性の高い検索キーワードや人気のウェブサイトを表示します</translation> <translation id="666981079809192359">Chrome のプライバシーに関するお知らせ</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">保存したページはオフラインで表示できません</translation> <translation id="6722992508235227685">ブックマーク、履歴、パスワードなどの設定が Google アカウントに同期され、どのデバイスでも利用できるようになります。同期する項目は [<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />] で選択できます。</translation> <translation id="6738867403308150051">ダウンロードしています…</translation> +<translation id="6762156594045689028">この設定を変更するには、<ph name="BEGIN_LINK" />同期をリセット<ph name="END_LINK" />します</translation> <translation id="6770414673596662518">また、Chrome のセーフ ブラウジング システムにより悪意のあるページが検出され、フィッシング、不正なソフトウェア、有害なダウンロードからユーザーを保護します。</translation> <translation id="6784675033504223784">「<ph name="SEARCH_TERM" />」を検索します</translation> <translation id="6790428901817661496">再生</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">ログインすると、お使いのどのデバイスでも同じブックマーク、履歴、パスワード、その他の設定を利用できるようになります。</translation> <translation id="6945221475159498467">選択</translation> <translation id="6963766334940102469">ブックマークを削除</translation> -<translation id="6964496835063002391">アカウントを追加</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">フォルダ</translation> <translation id="6978479750597523876">翻訳設定をリセット</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">低速な接続が見つかりました</translation> <translation id="7057058088140140610">Google ペイメントのクレジット カードと住所</translation> <translation id="7063006564040364415">同期サーバーに接続できませんでした。</translation> +<translation id="7074853159844403180"><ph name="SITE" /> とペア設定するデバイスを選択:</translation> +<translation id="7081639897063626814">既存のデータを別に保持する</translation> <translation id="7094922512924405309">近くにフィジカル ウェブページは見つかりませんでした</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> 個の開いているタブ</translation> <translation id="7096034533295549981">動画を読み込み中</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />ヘルプ<ph name="END_LINK" /></translation> <translation id="7299721129597238157">ブックマークを削除</translation> <translation id="7324738665594301612">Google では試験運用の一環として、Google サーバーを経由して HTTPS ページをプロキシ送信するテストを行っています。</translation> +<translation id="7346217184097589238">保存済みのサイトの設定は消去されず、普段の閲覧行動を反映した設定などが残る可能性もあります。</translation> <translation id="7346909386216857016">OK</translation> +<translation id="7347770551817603360">オフライン コンテンツ</translation> <translation id="7363354739009474003">「<ph name="VIDEO_TITLE" />」を読み込んでいます</translation> <translation id="7366340029385295517"><ph name="SCREEN_NAME" />にキャストしています</translation> <translation id="7375125077091615385">タイプ:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">デバイス認証情報の削除を確認する</translation> <translation id="7493994139787901920"><ph name="VERSION" />(<ph name="TIME_SINCE_UPDATE" />に更新)</translation> <translation id="7498271377022651285">お待ちください…</translation> +<translation id="7499262814309712782">同期するアカウント</translation> <translation id="7501135638693251872">すべてのブックマーク</translation> <translation id="7521387064766892559">Javascript</translation> <translation id="7562080006725997899">閲覧データの消去</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">オフライン保存完了(空き容量少)。</translation> <translation id="8068648041423924542">証明書を選択できません</translation> <translation id="8069239273282989646">圧縮後</translation> +<translation id="8073388330009372546">新しいタブで画像を開く</translation> <translation id="8084156870963450514">ログインすると、どのデバイスからもウェブ上の自分のデータにアクセスできます</translation> <translation id="8106211421800660735">クレジットカード番号</translation> <translation id="813082847718468539">サイト情報を表示</translation> <translation id="8137558756159375272">「タップして検索」では選択したキーワードと現在のページがコンテキストとして Google 検索に送信されます。これは [<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />] で無効にすることができます。</translation> <translation id="8146397137182589628">オフライン保存されていません</translation> <translation id="8168435359814927499">コンテンツ</translation> +<translation id="8173098127580644436">始めから</translation> <translation id="8200772114523450471">再開</translation> <translation id="8209050860603202033">画像を開く</translation> <translation id="8218346974737627104">ログインの確認</translation> <translation id="8218934717680664417">ワンタップで検索が可能に</translation> +<translation id="8223946939421658889">データを消去する期間:</translation> <translation id="8261506727792406068">削除</translation> <translation id="8275818695183729150">許可(アドレスバーでの検索)</translation> +<translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> に同期しています</translation> <translation id="8310344678080805313">標準のタブ</translation> <translation id="8374821112118309944">TalkBack を最新版に更新する必要があります。</translation> <translation id="8396312449826231789">承認済みのサイトのみ</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">最初に確認する(推奨)</translation> <translation id="8428213095426709021">設定</translation> <translation id="8429160401486700187">保存したページを削除</translation> +<translation id="8433057134996913067">ほとんどのウェブサイトからログアウトします。</translation> <translation id="8481940801237642152">このサイトへの接続はプライベート接続です。ただし、ネットワーク上のユーザーがこのページのデザインを変更できる可能性はあります。</translation> <translation id="8493948351860045254">容量を空ける</translation> <translation id="8497726226069778601">表示するものがまだありません</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">このサイトへの接続はプライベート接続です。</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698"><ph name="URL" /> にアクセスできません</translation> +<translation id="8979340629087822094">過去 1 日</translation> <translation id="8987061207681586800">自分だけの Chrome を</translation> <translation id="9019902583201351841">保護者により管理されています</translation> <translation id="9020607083536754075">現在のタブを閉じて前のアプリに戻る</translation> +<translation id="9038649477754266430">予測サービスを使用してページをより迅速に読み込む</translation> <translation id="9050666287014529139">パスフレーズ</translation> <translation id="9060538597317784206">Play ストアで <ph name="APP_NAME" /> アプリを表示。レーティング: <ph name="APP_RATING" /></translation> <translation id="9063523880881406963">[PC 版サイトを見る] をオフにします</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb index b35beb2..7f63063 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> +<translation id="1040144152982955218">기기 검색 중… <ph name="BEGIN_LINK" />도움 받기<ph name="END_LINK" /></translation> <translation id="1056898198331236512">경고</translation> <translation id="10614374240317010">비밀번호를 저장하지 않은 사이트</translation> <translation id="1061441684050139317">이 사이트에 공유하려면 Chrome에 마이크 액세스 권한이 있어야 합니다.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">계정을 추가하면 모든 기기에서 북마크, 방문 기록, 비밀번호, 기타 설정을 사용할 수 있습니다.</translation> <translation id="1098052486217676340">완료</translation> <translation id="1121094540300013208">사용 및 충돌 보고서</translation> +<translation id="1137305377394488060">지난 1시간</translation> <translation id="1178581264944972037">일시중지</translation> <translation id="1181037720776840403">삭제</translation> <translation id="1197267115302279827">북마크 이동</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google 기념일 로고: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">중지</translation> <translation id="1285320974508926690">이 사이트 번역 안함</translation> +<translation id="1291207594882862231">방문 기록, 쿠키, 사이트 데이터, 캐시 삭제…</translation> <translation id="129553762522093515">최근에 닫은 탭</translation> <translation id="1346090444609141578">저장된 페이지 없음</translation> <translation id="1369915414381695676"><ph name="SITE_NAME" /> 사이트 추가됨</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">카메라</translation> <translation id="1623104350909869708">이 페이지가 추가적인 대화를 생성하지 않도록 차단</translation> <translation id="1641113438599504367">안전 브라우징</translation> +<translation id="164269334534774161"><ph name="CREATION_TIME" />에 작성된 이 페이지의 오프라인 사본을 보는 중입니다.</translation> <translation id="1643702317193804718">페이지를 <ph name="SOURCE_LANGUAGE" />로 번역 중...</translation> <translation id="1644574205037202324">방문 기록</translation> <translation id="1647391597548383849">카메라에 액세스</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">번역 설정이 재설정되었습니다.</translation> <translation id="2359808026110333948">계속</translation> <translation id="2381756643783702095">보내기 전에 확인(권장)</translation> +<translation id="2385560268894525395">지난주</translation> <translation id="2387895666653383613">텍스트 크기 조정</translation> <translation id="238909021488141516">콘텐츠를 다운로드하는 중에 오류가 발생했습니다.</translation> <translation id="2414886740292270097">어두운</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">페이지 새로고침</translation> <translation id="2709516037105925701">자동완성</translation> <translation id="271033894570825754">새 파일</translation> +<translation id="2742271047622814453">사이트에 저장된 환경설정이 삭제될 수 있습니다.</translation> <translation id="2748463065602559597">지금 안전한 Chrome 페이지를 보고 계십니다.</translation> <translation id="2762000892062317888">방금 전</translation> <translation id="2770465223704140727">목록에서 삭제</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412"><ph name="PARENT_NAME_1" />님과 <ph name="PARENT_NAME_2" />님이 관리하는 계정입니다.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. All rights reserved.</translation> <translation id="2968755619301702150">인증서 뷰어</translation> +<translation id="2996291259634659425">암호 만들기</translation> <translation id="2996809686854298943">URL이 필요합니다.</translation> <translation id="3029704984691124060">암호가 일치하지 않습니다.</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />도움 받기<ph name="END_LINK" /></translation> <translation id="3063601790762993062">동영상 저장</translation> <translation id="306566828762083630">기기 저장용량이 가득 찼습니다. 다른 미디어를 삭제하여 공간을 확보하세요.</translation> <translation id="307329814453917357">Google 번역을 사용하여 페이지를 번역할 것을 제안합니다.</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 Chrome 관련 권한을 설정합니다.</translation> <translation id="3198916472715691905">저장 데이터 <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">북마크됨</translation> +<translation id="321773570071367578">암호를 잊어버렸거나 이 설정을 변경하려면 <ph name="BEGIN_LINK" />동기화를 재설정<ph name="END_LINK" />합니다.</translation> <translation id="3227137524299004712">마이크</translation> <translation id="3232754137068452469">웹 앱</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">콘텐츠를 다운로드하시겠습니까?</translation> <translation id="3328801116991980348">사이트 정보</translation> <translation id="3350687908700087792">모든 시크릿 탭 닫기</translation> +<translation id="3351441609270267898">기존 데이터 가져오기</translation> <translation id="3358663646935160692"><ph name="DOMAIN_NAME" />에서 관리하는 계정입니다. 관리 계정으로 로그인하면 사용자의 Chrome 프로필에 대한 제어 권한이 관리자에게 부여됩니다. 사용자의 Chrome 데이터는 이 계정에 영구적으로 연결되며, 이 계정의 연결을 해제하면 로컬 Chrome 데이터가 삭제됩니다.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">새 시크릿 탭</translation> <translation id="3501331331116143684">페이지가 오프라인에서 <ph name="FOLDER_NAME" />(으)로 저장되었습니다.</translation> <translation id="3518985090088779359">동의하고 계속</translation> +<translation id="3522247891732774234">업데이트할 수 있습니다. 옵션 더보기</translation> <translation id="3527085408025491307">폴더</translation> <translation id="3549644494707163724">나만의 동기화 암호로 모든 동기화 데이터 암호화</translation> <translation id="360480449234699036">페이지에 남아 웹사이트의 주제에 대해 알아보세요. 터치하여 검색 기능은 Google 검색에 단어와 관련 컨텍스트를 전송하여 정의, 사진, 검색결과, 기타 자세한 사항을 반환합니다. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">확대/축소 강제 사용</translation> <translation id="3917783807003067648">위치가 차단됨</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">지난 4주</translation> <translation id="393697183122708255">사용 가능한 음성 검색이 없습니다.</translation> <translation id="3950820424414687140">로그인</translation> <translation id="3988213473815854515">위치 허용됨</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">새 탭에서 열기</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> 북마크가 오프라인에 저장됨</translation> <translation id="423410644998903704">이 사이트에 공유하려면 Chrome에 액세스 권한이 있어야 합니다.</translation> +<translation id="424864128008805179">Chrome에서 로그아웃하시겠습니까?</translation> <translation id="4254813446494774748">번역 언어:</translation> <translation id="4256782883801055595">오픈소스 라이선스</translation> <translation id="4259722352634471385">탐색이 차단됨: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">향후 주변의 피지컬 웹페이지가 알림 목록에 표시됩니다.</translation> <translation id="4498934959426056365">키 생성</translation> <translation id="4505554159887937799">오프라인에 저장</translation> +<translation id="4508440807153586353">암호를 아는 사람만 암호화된 데이터를 읽을 수 있습니다. 암호는 Google로 전송되거나 Google에 저장되지 않습니다. 암호가 기억나지 않거나 이 설정을 변경하려면 동기화를 재설정해야 합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{#일 전}other{#일 전}}</translation> <translation id="4522570452068850558">세부정보</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />에서 저장된 비밀번호 보기 및 관리</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">새 탭</translation> <translation id="5271967389191913893">기기에서 다운로드하려는 콘텐츠를 열 수 없습니다.</translation> <translation id="5275558766013849309">탭은 최근 앱과 함께 보유할 수 있습니다.</translation> +<translation id="5284584623296338184">북마크, 방문 기록, 비밀번호, 기타 설정이 더 이상 Google 계정에 동기화되지 않습니다. 하지만 기존 데이터는 Google 계정에 계속 저장됩니다.</translation> <translation id="5301954838959518834">확인</translation> <translation id="5302048478445481009">언어</translation> <translation id="5304593522240415983">필수 입력란입니다.</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">저장된 이름/비밀번호 또는 예외 수정</translation> <translation id="5442257541162692417">저장된 페이지 수정</translation> <translation id="544291274896356069">이 링크가 외부 애플리케이션에서 열리면 시크릿 모드가 종료됩니다. 계속하시겠습니까?</translation> +<translation id="5487521232677179737">데이터 삭제</translation> <translation id="5487729733663684359">Chrome 업데이트는 더 이상 이 버전의 Android에서 지원되지 않습니다.</translation> <translation id="5511351932351731210">항상 보내기</translation> <translation id="5512137114520586844"><ph name="PARENT_NAME" />님이 관리하는 계정입니다.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google 번역</translation> <translation id="5916664084637901428">사용</translation> <translation id="5939518447894949180">초기화</translation> +<translation id="5965336165840183977">이렇게 하면 동기화된 데이터가 모든 기기에서 삭제되지만 Google 계정에서 로그아웃되지는 않습니다. 저장된 사이트 설정은 삭제되지 않으며 인터넷 사용 습관을 반영할 수 있습니다.</translation> <translation id="5968595432776860642">'<ph name="VIDEO_TITLE" />' 재생 중</translation> <translation id="6010869025736512584">비디오 입력 장치에 액세스 중</translation> <translation id="6012342843556706400">이 사이트에 공유하려면 Chrome에 위치 정보 액세스 권한이 있어야 합니다.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">보호된 콘텐츠</translation> <translation id="6612856669344839356">북마크 저장</translation> <translation id="6627583120233659107">폴더 수정</translation> +<translation id="6647073004883890710"><ph name="PASSWORD_MANAGER_BRAND" />이(가) 이 사이트에서 <ph name="USERNAME" />의 비밀번호를 업데이트하도록 하시겠습니까?</translation> <translation id="6656545060687952787">기기를 스캔하려면 Chrome에서 위치 정보에 액세스해야 합니다. <ph name="BEGIN_LINK" />권한 업데이트<ph name="END_LINK" /></translation> <translation id="666268767214822976">예상 검색어 서비스를 사용하여 검색주소창에 입력할 때 관련 검색어 및 인기 웹사이트를 표시합니다.</translation> <translation id="666981079809192359">Chrome 개인정보 보호정책</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">저장한 페이지를 오프라인에서 사용할 수 없습니다.</translation> <translation id="6722992508235227685">북마크, 방문 기록, 비밀번호 등 기타 설정이 Google 계정에 동기화되어 모든 기기에서 사용할 수 있습니다. <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />에서 동기화할 항목을 선택할 수 있습니다.</translation> <translation id="6738867403308150051">다운로드 중...</translation> +<translation id="6762156594045689028">이 설정을 변경하려면 <ph name="BEGIN_LINK" />동기화를 재설정<ph name="END_LINK" />합니다.</translation> <translation id="6770414673596662518">또한 Chrome의 세이프 브라우징 시스템이 악성 웹페이지를 탐지하여 피싱, 멀웨어, 유해한 다운로드로부터 사용자를 보호합니다.</translation> <translation id="6784675033504223784">'<ph name="SEARCH_TERM" />' 검색</translation> <translation id="6790428901817661496">재생</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호, 기타 설정을 사용할 수 있습니다.</translation> <translation id="6945221475159498467">선택</translation> <translation id="6963766334940102469">북마크 삭제</translation> -<translation id="6964496835063002391">계정 추가</translation> <translation id="6965382102122355670">확인</translation> <translation id="6973630695168034713">폴더</translation> <translation id="6978479750597523876">번역 설정 재설정</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">느린 연결이 감지됨</translation> <translation id="7057058088140140610">Google Payments를 사용하는 신용카드 및 주소</translation> <translation id="7063006564040364415">동기화 서버에 연결할 수 없습니다.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> 사이트에서 페어링하려는 기기:</translation> +<translation id="7081639897063626814">기존 데이터를 별도로 유지</translation> <translation id="7094922512924405309">주변에 피지컬 웹페이지가 없습니다.</translation> <translation id="7095930899177687653">탭 <ph name="OPEN_TABS" />개가 열려 있음</translation> <translation id="7096034533295549981">동영상 로드 중</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />도움말<ph name="END_LINK" /></translation> <translation id="7299721129597238157">북마크 삭제</translation> <translation id="7324738665594301612">Google은 실험의 일환으로 Google 서버를 통해 HTTPS 페이지의 프록시를 테스트하고 있습니다.</translation> +<translation id="7346217184097589238">저장된 사이트 설정은 삭제되지 않으며 인터넷 사용 습관을 반영할 수 있습니다.</translation> <translation id="7346909386216857016">확인</translation> +<translation id="7347770551817603360">오프라인 콘텐츠</translation> <translation id="7363354739009474003">'<ph name="VIDEO_TITLE" />' 로드 중</translation> <translation id="7366340029385295517"><ph name="SCREEN_NAME" />(으)로 전송 중</translation> <translation id="7375125077091615385">유형:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">기기 사용자 인증 정보 삭제 확인</translation> <translation id="7493994139787901920"><ph name="VERSION" />(<ph name="TIME_SINCE_UPDATE" />에 업데이트됨)</translation> <translation id="7498271377022651285">잠시 기다려 주세요…</translation> +<translation id="7499262814309712782">계정 동기화</translation> <translation id="7501135638693251872">모든 북마크</translation> <translation id="7521387064766892559">자바스크립트</translation> <translation id="7562080006725997899">인터넷 사용 기록 삭제</translation> @@ -521,23 +544,27 @@ <translation id="7998918019931843664">닫은 탭 다시 열기</translation> <translation id="7999064672810608036">쿠키를 포함하여 이 웹사이트의 데이터를 모두 삭제하고 모든 권한을 재설정하시겠습니까?</translation> <translation id="8007176423574883786">기기에 대해 사용 중지됨</translation> -<translation id="8026334261755873520">인터넷 사용정보 삭제</translation> +<translation id="8026334261755873520">인터넷 사용 기록 삭제</translation> <translation id="8035133914807600019">새 폴더…</translation> <translation id="8050319187894766337">페이지 오프라인 저장, 저장용량 거의 참</translation> <translation id="8068648041423924542">인증서를 선택할 수 없습니다.</translation> <translation id="8069239273282989646">압축 후</translation> +<translation id="8073388330009372546">새 탭에서 이미지 열기</translation> <translation id="8084156870963450514">모든 기기에서 모든 웹 항목에 액세스하려면 로그인하세요.</translation> <translation id="8106211421800660735">신용카드 번호</translation> <translation id="813082847718468539">사이트 정보 보기</translation> <translation id="8137558756159375272">터치하여 검색에서 선택한 단어와 현재 페이지를 Google 검색에 컨텍스트로 발송하세요. <ph name="BEGIN_LINK" />설정<ph name="END_LINK" />에서 이 기능을 사용 중지할 수 있습니다.</translation> <translation id="8146397137182589628">오프라인으로 저장되지 않음</translation> <translation id="8168435359814927499">콘텐츠</translation> +<translation id="8173098127580644436">전체</translation> <translation id="8200772114523450471">다시 시작</translation> <translation id="8209050860603202033">이미지 열기</translation> <translation id="8218346974737627104">로그인 확인</translation> <translation id="8218934717680664417">이제 터치 한 번으로 검색할 수 있습니다.</translation> +<translation id="8223946939421658889">다음 기간의 데이터 삭제</translation> <translation id="8261506727792406068">삭제</translation> <translation id="8275818695183729150">허용(검색주소창 검색)</translation> +<translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" />에 동기화 중</translation> <translation id="8310344678080805313">일반 탭</translation> <translation id="8374821112118309944">음성 안내 지원을 최신 버전으로 업데이트해야 합니다.</translation> <translation id="8396312449826231789">승인된 사이트만 허용</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">우선 확인(권장)</translation> <translation id="8428213095426709021">설정</translation> <translation id="8429160401486700187">저장된 페이지 삭제</translation> +<translation id="8433057134996913067">이 작업을 수행하면 대부분의 웹사이트에서 로그아웃됩니다.</translation> <translation id="8481940801237642152">이 사이트에 대한 연결은 비공개지만 네트워크에 있는 다른 사람은 페이지 디자인을 변경할 수 있습니다.</translation> <translation id="8493948351860045254">저장 공간 확보하기</translation> <translation id="8497726226069778601">아직 표시할 내용 없음</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">이 사이트에 대한 연결은 비공개입니다.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">탐색할 수 없음: <ph name="URL" /></translation> +<translation id="8979340629087822094">지난 1일</translation> <translation id="8987061207681586800">나만의 Chrome 만들기</translation> <translation id="9019902583201351841">부모님이 관리합니다.</translation> <translation id="9020607083536754075">현재 탭을 닫고 이전 앱으로 돌아가기</translation> +<translation id="9038649477754266430">빠른 페이지 로드를 위해 예상 검색어 서비스 사용</translation> <translation id="9050666287014529139">암호</translation> <translation id="9060538597317784206">Play 스토어에서 <ph name="APP_NAME" /> 앱을 봅니다. 등급은 <ph name="APP_RATING" />입니다.</translation> <translation id="9063523880881406963">데스크톱 버전으로 보기 사용 중지</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb index af1f2b39..5e61a73 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="1040144152982955218">Ieškoma įrenginių… <ph name="BEGIN_LINK" />Gaukite pagalbos<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Įspėjimas</translation> <translation id="10614374240317010">Niekada neišsaugota</translation> <translation id="1061441684050139317">„Chrome“ reikia galimybės pasiekti mikrofoną, kad jį būtų galima bendrinti su šia svetaine.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Pridėkite paskyrą ir pasiekite žymių, istorijos, slaptažodžių bei kitų nustatymų duomenis visuose įrenginiuose.</translation> <translation id="1098052486217676340">Baigta</translation> <translation id="1121094540300013208">Naudojimo ir strigčių ataskaitos</translation> +<translation id="1137305377394488060">pastaroji valanda</translation> <translation id="1178581264944972037">Pristabdyti</translation> <translation id="1181037720776840403">Pašalinti</translation> <translation id="1197267115302279827">Perkelti žymes</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">„Google“ papuoštas logotipas: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Sustabdyti</translation> <translation id="1285320974508926690">Niekada neversti šios svetainės</translation> +<translation id="1291207594882862231">Išvalykite istoriją, slapukus, svetainės duomenis, talpyklą…</translation> <translation id="129553762522093515">Neseniai uždarytas</translation> <translation id="1346090444609141578">Čia nėra jokių išsaugotų puslapių</translation> <translation id="1369915414381695676">Pridėta svetainė <ph name="SITE_NAME" /></translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Neleisti šiam puslapiui kurti papildomų dialogo langų</translation> <translation id="1641113438599504367">Saugus naršymas</translation> +<translation id="164269334534774161">Peržiūrite neprisijungus pasiekiamą šio puslapio kopiją (<ph name="CREATION_TIME" />)</translation> <translation id="1643702317193804718">Puslapis verčiamas į <ph name="SOURCE_LANGUAGE" /> k...</translation> <translation id="1644574205037202324">Istorija</translation> <translation id="1647391597548383849">Prieiga prie fotoaparato</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Vertimo nustatymai buvo nustatyti iš naujo.</translation> <translation id="2359808026110333948">Tęsti</translation> <translation id="2381756643783702095">Klausti prieš siunčiant (rekomenduojama)</translation> +<translation id="2385560268894525395">pastaroji savaitė</translation> <translation id="2387895666653383613">Teksto mastelio keitimas</translation> <translation id="238909021488141516">Atsisiunčiant turinį įvyko klaida.</translation> <translation id="2414886740292270097">Tamsi</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Atnaujinti puslapį</translation> <translation id="2709516037105925701">Automatinis pildymas</translation> <translation id="271033894570825754">Naujiena</translation> +<translation id="2742271047622814453">Svetainėse išsaugotos nuostatos gali būti ištrintos</translation> <translation id="2748463065602559597">Žiūrite saugų „Google Chrome“ puslapį.</translation> <translation id="2762000892062317888">ką tik</translation> <translation id="2770465223704140727">Pašalinti iš sąrašo</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Šią paskyrą tvarko <ph name="PARENT_NAME_1" /> ir <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Autorių teisės priklauso „Google Inc.“, <ph name="YEAR" /> m. Visos teisės saugomos.</translation> <translation id="2968755619301702150">Sertifikato peržiūros priemonė</translation> +<translation id="2996291259634659425">Kurkite slaptafrazę</translation> <translation id="2996809686854298943">Reikalingas URL</translation> <translation id="3029704984691124060">Slaptafrazės neatitinka</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Gaukite pagalbos<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Išsaugoti vaizdo įrašą</translation> <translation id="306566828762083630">Įrenginio saugykla pilna. Pašalinkite kitus medijos failus, kad atlaisvintumėte vietos.</translation> <translation id="307329814453917357">Siūlyti versti puslapius naudojant „Google“ vertėją</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Įjunkite „Chrome“ leidimus <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation> <translation id="3198916472715691905">Išsaugota duomenų: <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">Pažymėta</translation> +<translation id="321773570071367578">Jei pamiršote slaptafrazę arba norite pakeisti šį nustatymą, <ph name="BEGIN_LINK" />iš naujo nustatykite sinchronizavimą<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofonas</translation> <translation id="3232754137068452469">Žiniatinklio programa</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Tęsti turinio atsisiuntimo procesą?</translation> <translation id="3328801116991980348">Svetainės informacija</translation> <translation id="3350687908700087792">Uždaryti visus inkognito skirtukų lapus</translation> +<translation id="3351441609270267898">Importuoti esamus duomenis</translation> <translation id="3358663646935160692">Šią paskyrą valdo <ph name="DOMAIN_NAME" />. Prisijungiate naudodami valdomą paskyrą ir leidžiate administratoriui valdyti jūsų „Chrome“ profilį. „Chrome“ duomenys bus visam laikui susieti su šia paskyra. Atsijungus nuo šios paskyros bus ištrinti vietiniai „Chrome“ duomenys.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Naujas inkognito skirtukas</translation> <translation id="3501331331116143684">Psl. išsaug. „<ph name="FOLDER_NAME" />“ naud. neprisij.</translation> <translation id="3518985090088779359">Sutikti ir tęsti</translation> +<translation id="3522247891732774234">Pasiekiamas naujinys. Daugiau parinkčių</translation> <translation id="3527085408025491307">Aplankas</translation> <translation id="3549644494707163724">Šifruoti visus sinchronizuotus duomenis naudojant sinchronizavimo slaptafrazę</translation> <translation id="360480449234699036">Sužinokite apie temas svetainėse, neišėję iš puslapio. Naudojant funkciją „Paieška palietus“ siunčiamas žodis ir jo kontekstas „Google“ paieškai, kuri pateikia apibrėžimų, nuotraukų, paieškos rezultatų ir kitos išsamios informacijos. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Priverstinai įgalinti mastelio keitimą</translation> <translation id="3917783807003067648">Vietovės informacija blokuojama</translation> <translation id="3927692899758076493">Be užraitų</translation> +<translation id="3931947361983910192">pastarosios 4 savaitės</translation> <translation id="393697183122708255">Neįgalinta paieška balsu</translation> <translation id="3950820424414687140">Prisijungti</translation> <translation id="3988213473815854515">Vietovės informacija leidžiama</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Atidaryti naujame skirtuke</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> žymė išsaugota naudoti neprisijungus</translation> <translation id="423410644998903704">„Chrome“ reikia pasiekiamumo leidimų, kad juos būtų galima bendrinti su šia svetaine.</translation> +<translation id="424864128008805179">Atsijungti nuo „Chrome“?</translation> <translation id="4254813446494774748">Vertimo kalba:</translation> <translation id="4256782883801055595">Atvirojo šaltinio licencijos</translation> <translation id="4259722352634471385">Naršymas užblokuotas: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Būsimi netoliese esančių įrenginių fizinio žiniatinklio puslapiai bus rodomi pranešimų sąraše</translation> <translation id="4498934959426056365">Rakto generavimas</translation> <translation id="4505554159887937799">Išsaugoti naud. nepris.</translation> +<translation id="4508440807153586353">Tik jūsų slaptafrazę žinantis asmuo gali skaityti šifruotus duomenis. Slaptafrazė nesiunčiama į sistemą „Google“ ir joje nesaugoma. Pamiršę slaptafrazę arba norėdami pakeisti šį nustatymą turėsite iš naujo nustatyti sinchronizavimą. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Prieš # dieną}one{Prieš # dieną}few{Prieš # dienas}many{Prieš # dienos}other{Prieš # dienų}}</translation> <translation id="4522570452068850558">Išsami informacija</translation> <translation id="4526249700380860531">Peržiūrėkite ir tvarkykite išsaugotus slaptažodžius apsilankę adresu <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Naujas skirtukas</translation> <translation id="5271967389191913893">Įrenginyje nepavyksta atidaryti norimo atsisiųsti turinio.</translation> <translation id="5275558766013849309">Skirtukai bus pateikti su naujausiomis programomis.</translation> +<translation id="5284584623296338184">Žymių, istorijos, slaptažodžių ir kitų nustatymų pakeitimai nebebus sinchronizuojami su „Google“ paskyra. Tačiau esami duomenys ir toliau bus saugomi „Google“ paskyroje.</translation> <translation id="5301954838959518834">Gerai, supratau</translation> <translation id="5302048478445481009">Kalba</translation> <translation id="5304593522240415983">Šis laukas negali būti tuščias</translation> @@ -316,6 +331,7 @@ </translation> <translation id="5442257541162692417">Redaguokite išsaugotą puslapį</translation> <translation id="544291274896356069">Atidarydami šią nuorodą išorinėje programoje, išjungsite inkognito režimą. Tęsti?</translation> +<translation id="5487521232677179737">Išvalyti duomenis</translation> <translation id="5487729733663684359">„Chrome“ naujiniai daugiau nepalaikomi naudojant šios versijos „Android“.</translation> <translation id="5511351932351731210">Visada siųsti</translation> <translation id="5512137114520586844">Šią paskyrą tvarko <ph name="PARENT_NAME" />.</translation> @@ -361,6 +377,7 @@ <translation id="5911030830365207728">„Google“ vertėjas</translation> <translation id="5916664084637901428">Įjungta</translation> <translation id="5939518447894949180">Nustatyti iš naujo</translation> +<translation id="5965336165840183977">Sinchronizuoti duomenys bus išvalyti iš visų įrenginių. Nebūsite atjungti nuo „Google“ paskyros. Išsaugoti svetainių nustatymai nebus ištrinti ir gali nurodyti jūsų naršymo įpročius.</translation> <translation id="5968595432776860642">Leidžiamas „<ph name="VIDEO_TITLE" />“</translation> <translation id="6010869025736512584">Pasiekiama vaizdo įrašų įvestis</translation> <translation id="6012342843556706400">„Chrome“ reikia galimybės pasiekti vietovės informaciją, kad ją būtų galima bendrinti su šia svetaine.</translation> @@ -413,6 +430,7 @@ <translation id="6612358246767739896">Apsaugotas turinys</translation> <translation id="6612856669344839356">Išsaugoti žymę</translation> <translation id="6627583120233659107">Redaguoti aplanką</translation> +<translation id="6647073004883890710">Ar norite, kad „<ph name="PASSWORD_MANAGER_BRAND" />“ atnaujintų šios svetainės <ph name="USERNAME" /> slaptažodį?</translation> <translation id="6656545060687952787">„Chrome“ reikalinga prieiga prie vietos, kad galėtų nuskaityti įrenginius. <ph name="BEGIN_LINK" />Atnaujinkite leidimus<ph name="END_LINK" /></translation> <translation id="666268767214822976">Naudoti numatymo paslaugą, kad adreso juostoje įvedant tekstą būtų rodomos susijusios užklausos ir populiarios svetainės</translation> <translation id="666981079809192359">„Chrome“ privatumo pranešimas</translation> @@ -423,6 +441,7 @@ <translation id="6720988912937197322">Išsaugotas puslapis nepasiekiamas neprisijungus</translation> <translation id="6722992508235227685">Žymės, istorija, slaptažodžiai ir kiti nustatymai bus sinchronizuojami su „Google“ paskyra, kad galėtumėte juos naudoti visuose įrenginiuose. <ph name="BEGIN_LINK1" />„Nustatymų“<ph name="END_LINK1" /> skiltyje galite pasirinkti, ką norite sinchronizuoti.</translation> <translation id="6738867403308150051">Atsisiunčiama...</translation> +<translation id="6762156594045689028">Kad pakeistumėte šį nustatymą, <ph name="BEGIN_LINK" />iš naujo nustatykite sinchronizavimą<ph name="END_LINK" /></translation> <translation id="6770414673596662518">„Chrome“ saugaus naršymo sistema taip pat bus naudojama siekiant aptikti kenkėjiškus puslapius ir apsaugoti jus nuo sukčiavimo, kenkėjiškų programų ir žalingų atsisiuntimų.</translation> <translation id="6784675033504223784">Ieškoti pagal „<ph name="SEARCH_TERM" />“</translation> <translation id="6790428901817661496">Žaisti</translation> @@ -439,7 +458,6 @@ <translation id="6868088497967843822">Prisijunkite, kad žymės, istorija, slaptažodžiai ir kiti nustatymai būtų pateikti visuose įrenginiuose</translation> <translation id="6945221475159498467">Pasirinkti</translation> <translation id="6963766334940102469">Ištrinti žymes</translation> -<translation id="6964496835063002391">Pridėti paskyrą</translation> <translation id="6965382102122355670">Gerai</translation> <translation id="6973630695168034713">Aplankai</translation> <translation id="6978479750597523876">Nustatyti vertimo nustatymus iš naujo</translation> @@ -456,6 +474,8 @@ <translation id="7056999826593229648">Aptiktas lėtas ryšys</translation> <translation id="7057058088140140610">„Google Payments“ naudojamos kredito kortelės ir adresai</translation> <translation id="7063006564040364415">Nepavyko prisijungti prie sinchronizavimo serverio.</translation> +<translation id="7074853159844403180">Svetainė <ph name="SITE" /> nori būti susieta su:</translation> +<translation id="7081639897063626814">Esamus duomenis išlaikyti atskirus</translation> <translation id="7094922512924405309">Nerasta jokių fizinių tinklalapių netoliese</translation> <translation id="7095930899177687653">Atidaryta skirtukų lapų: <ph name="OPEN_TABS" /></translation> <translation id="7096034533295549981">Įkel. v. įrašas</translation> @@ -467,7 +487,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Pagalba<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Ištrinti žymę</translation> <translation id="7324738665594301612">Vykdydami eksperimentą išbandome HTTPS puslapių įgaliojimą naudojant „Google“ serverius.</translation> +<translation id="7346217184097589238">Išsaugoti svetainės duomenys nebus ištrinti ir gali parodyti jūsų naršymo įpročius.</translation> <translation id="7346909386216857016">Gerai, supratau</translation> +<translation id="7347770551817603360">Neprisijungus pasiekiamas turinys</translation> <translation id="7363354739009474003">Įkeliamas „<ph name="VIDEO_TITLE" />“</translation> <translation id="7366340029385295517">Perduodama į ekraną „<ph name="SCREEN_NAME" />“</translation> <translation id="7375125077091615385">Tipas:</translation> @@ -482,6 +504,7 @@ <translation id="748127970106343339">Patvirtinti įrenginio prisijungimo duomenų ištrynimą</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (atnaujinta <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Palaukite…</translation> +<translation id="7499262814309712782">Sinchronizavimo paskyra</translation> <translation id="7501135638693251872">Visos žymės</translation> <translation id="7521387064766892559">„JavaScript“</translation> <translation id="7562080006725997899">Naršymo duomenų išvalymas</translation> @@ -527,18 +550,22 @@ <translation id="8050319187894766337">Psl. išs. n. nepr. Saug. užpild.</translation> <translation id="8068648041423924542">Nepavyko pasirinkti sertifikato.</translation> <translation id="8069239273282989646">Suglaudinus</translation> +<translation id="8073388330009372546">Atid. vaizdą nauj. skirt. lap.</translation> <translation id="8084156870963450514">Prisijunkite, kad pasiektumėte visus žiniatinklio elementus bet kuriuo įrenginiu.</translation> <translation id="8106211421800660735">Kredito kortelės numeris</translation> <translation id="813082847718468539">Žiūrėti svetainės informaciją</translation> <translation id="8137558756159375272">Paieška palietus siunčia pasirinktą žodį ir esamą puslapį kaip kontekstą „Google“ paieškai. Galite išjungti šią funkciją <ph name="BEGIN_LINK" />nustatymuose<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Neišsaugota naudoti neprisijungus</translation> <translation id="8168435359814927499">Turinys</translation> +<translation id="8173098127580644436">laiko pradžia</translation> <translation id="8200772114523450471">Atnaujinti</translation> <translation id="8209050860603202033">Atidaryti vaizdą</translation> <translation id="8218346974737627104">Patvirtinti prisijungimą</translation> <translation id="8218934717680664417">Nuo šiol galite ieškoti vienu palietimu</translation> +<translation id="8223946939421658889">Išvalyti duomenis iš</translation> <translation id="8261506727792406068">Panaikinti</translation> <translation id="8275818695183729150">Leisti (atliekant paieškas adreso juostoje)</translation> +<translation id="8283853025636624853">Sinchronizuojama su <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Įprasti skirtukai</translation> <translation id="8374821112118309944">Reikia atnaujinti „TalkBack“ versiją į naujesnę.</translation> <translation id="8396312449826231789">Tik patvirtintos svetainės</translation> @@ -546,6 +573,7 @@ <translation id="8413385045638830869">Pirmiausia paklausti (rekomenduojama)</translation> <translation id="8428213095426709021">Nustatymai</translation> <translation id="8429160401486700187">Ištrinti išsaugotus puslapius</translation> +<translation id="8433057134996913067">Tai atlikę atsijungsite nuo daugumos svetainių.</translation> <translation id="8481940801237642152">Jūsų ryšys su šia svetaine privatus, bet gali būti, kad kitas asmuo tinkle gali pakeisti puslapio išvaizdą.</translation> <translation id="8493948351860045254">Atlaisvinti vietos</translation> <translation id="8497726226069778601">Čia dar nėra nieko, ką galėtumėte peržiūrėti…</translation> @@ -586,9 +614,11 @@ <translation id="8941248009481596111">Jūsų ryšys su šia svetaine privatus.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Naršymas nepasiekiamas: <ph name="URL" /></translation> +<translation id="8979340629087822094">pastaroji diena</translation> <translation id="8987061207681586800">Suasmeninkite „Chrome“</translation> <translation id="9019902583201351841">Tvarko jūsų tėvai</translation> <translation id="9020607083536754075">Uždaryti dabartinį skirtuką ir grįžti į ankstesnę programą</translation> +<translation id="9038649477754266430">Naudokite numatymo paslaugą, kad puslapiai būtų įkeliami greičiau</translation> <translation id="9050666287014529139">Slaptafrazė</translation> <translation id="9060538597317784206">Peržiūrėkite programą „<ph name="APP_NAME" />“ „Google Play“ parduotuvėje. Įvertinimas: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Išjungti stalinio kompiuterio svetainės užklausą</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb index 101d380..0d62944 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lv"> +<translation id="1040144152982955218">Notiek ierīču meklēšana… <ph name="BEGIN_LINK" />Saņemt palīdzību<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Brīdinājums</translation> <translation id="10614374240317010">Netiek saglabātas</translation> <translation id="1061441684050139317">Pārlūkam Chrome ir nepieciešama piekļuve mikrofonam, lai kopīgotu to ar šo vietni.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Pievienojiet kontu, lai piekļūtu savām grāmatzīmēm, vēsturei, parolēm un citiem iestatījumiem no visām savām ierīcēm.</translation> <translation id="1098052486217676340">Pabeigts</translation> <translation id="1121094540300013208">Lietojuma un avāriju pārskati</translation> +<translation id="1137305377394488060">iepriekšējās stundas</translation> <translation id="1178581264944972037">Pauzēt</translation> <translation id="1181037720776840403">Noņemt</translation> <translation id="1197267115302279827">Pārvietot grāmatzīmes</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google svētku logotips: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Apturēt</translation> <translation id="1285320974508926690">Nekad netulkot šo vietni</translation> +<translation id="1291207594882862231">Dzēst vēsturi, sīkfailus, vietnes datus, kešatmiņu…</translation> <translation id="129553762522093515">Nesen aizvērtas</translation> <translation id="1346090444609141578">Šeit nav nevienas saglabātas lapas</translation> <translation id="1369915414381695676">Tika pievienota vietne <ph name="SITE_NAME" /></translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Neļaut šai lapai veidot papildu dialoglodziņus</translation> <translation id="1641113438599504367">Droša pārlūkošana</translation> +<translation id="164269334534774161">Jūs skatāt šīs lapas bezsaistes kopiju, kas tika izveidota šādā datumā: <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Notiek lapas tulkošana <ph name="SOURCE_LANGUAGE" /> valodā…</translation> <translation id="1644574205037202324">Vēsture</translation> <translation id="1647391597548383849">Piekļuve kamerai</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Tulkošanas iestatījumi ir atiestatīti.</translation> <translation id="2359808026110333948">Turpināt</translation> <translation id="2381756643783702095">Jautāt pirms sūtīšanas (ieteicams)</translation> +<translation id="2385560268894525395">iepriekšējās nedēļas</translation> <translation id="2387895666653383613">Teksta mērogošana</translation> <translation id="238909021488141516">Lejupielādējot saturu, radās kļūda.</translation> <translation id="2414886740292270097">Tumšs</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Atsvaidzināt lapu</translation> <translation id="2709516037105925701">Automātiskā aizpilde</translation> <translation id="271033894570825754">Jauns</translation> +<translation id="2742271047622814453">Var tikt dzēstas vietnēs saglabātās preferences</translation> <translation id="2748463065602559597">Jūs skatāt drošu Google Chrome lapu.</translation> <translation id="2762000892062317888">tikko</translation> <translation id="2770465223704140727">Noņemt no saraksta</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Šo kontu pārvalda <ph name="PARENT_NAME_1" /> un <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Autortiesības <ph name="YEAR" /> Google Inc. Visas tiesības paturētas.</translation> <translation id="2968755619301702150">Sertifikātu skatītājs</translation> +<translation id="2996291259634659425">Ieejas frāzes izveide</translation> <translation id="2996809686854298943">URL ir jānorāda obligāti.</translation> <translation id="3029704984691124060">Ieejas frāzes neatbilst.</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Saņemt palīdzību<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Saglabāt videoklipu</translation> <translation id="306566828762083630">Ierīces atmiņa ir pilna. Lūdzu, noņemiet citu multivides saturu, lai atbrīvotu vietu.</translation> <translation id="307329814453917357">Piedāvāt lapu tulkošanu, izmantojot Google tulkotāju</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" /> ieslēdziet atļaujas pārlūkam Chrome.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> saglabātu datu</translation> <translation id="3207960819495026254">Atzīmēts kā grāmatzīme</translation> +<translation id="321773570071367578">Ja esat aizmirsis ieejas frāzi vai vēlaties mainīt šo iestatījumu, <ph name="BEGIN_LINK" />atiestatiet sinhronizāciju<ph name="END_LINK" />.</translation> <translation id="3227137524299004712">Mikrofons</translation> <translation id="3232754137068452469">Tīmekļa lietotne</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Vai turpināt ar satura lejupielādi?</translation> <translation id="3328801116991980348">Vietnes informācija</translation> <translation id="3350687908700087792">Aizvērt visas inkognito režīma cilnes</translation> +<translation id="3351441609270267898">Esošo datu importēšana</translation> <translation id="3358663646935160692">Šis konts tiek pārvaldīts domēnā <ph name="DOMAIN_NAME" />. Jūs pierakstāties, izmantojot pārvaldītu kontu, un ļaujat šī konta administratoram pārvaldīt jūsu Chrome profilu. Jūsu Chrome dati tiks neatgriezeniski saistīti ar šo kontu. Noņemot saiti no šī konta, tiks dzēsti lokālie Chrome dati.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Jauna inkognito cilne</translation> <translation id="3501331331116143684">Lapa ir saglabāta bezsaistē (mapē <ph name="FOLDER_NAME" />)</translation> <translation id="3518985090088779359">Piekrist un turpināt</translation> +<translation id="3522247891732774234">Pieejams atjauninājums. Citas iespējas</translation> <translation id="3527085408025491307">Mape</translation> <translation id="3549644494707163724">Šifrēt visus sinhronizētos datus, izmantojot sinhronizācijas ieejas frāzi</translation> <translation id="360480449234699036">Uzziniet par vietņu tēmām, neizejot no lapas. Pieskaroties vienumam “Meklēt”, vārds un tā konteksts tiek nosūtīts pakalpojumam Google meklēšana, un tiek iegūtas definīcijas, attēli, meklēšanas rezultāti un cita informācija. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Tālummaiņas piespiedu iespējošana</translation> <translation id="3917783807003067648">Bloķēta piekļuve atrašanās vietas informācijai</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">iepriekšējām 4 nedēļām</translation> <translation id="393697183122708255">Nav iespējota meklēšana ar balsi.</translation> <translation id="3950820424414687140">Pierakstīties</translation> <translation id="3988213473815854515">Atļauta piekļuve atrašanās vietas informācijai</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Atvērt jaunā cilnē</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> grāmatzīme ir saglabāta bezsaistē</translation> <translation id="423410644998903704">Pārlūkam Chrome ir nepieciešama piekļuve atļaujām, lai kopīgotu tās ar šo vietni.</translation> +<translation id="424864128008805179">Vai izrakstīties no pārlūka Chrome?</translation> <translation id="4254813446494774748">Tulkojuma valoda:</translation> <translation id="4256782883801055595">Atklātā pirmkoda licences</translation> <translation id="4259722352634471385">Navigācija ir bloķēta: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Turpmāk tuvumā esošās fiziskā tīmekļa lapas tiks rādītas paziņojumu sarakstā</translation> <translation id="4498934959426056365">Atslēgu ģenerēšana</translation> <translation id="4505554159887937799">Saglabāts bezsaistē</translation> +<translation id="4508440807153586353">Jūsu šifrētos datus var lasīt tikai personas, kurām ir zināma jūsu ieejas frāze. Ieejas frāze netiek sūtīta Google serveriem un netiek tajos glabāta. Ja aizmirsīsiet ieejas frāzi vai vēlēsieties mainīt šo iestatījumu, jums būs jāatiestata sinhronizācija. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation> <translation id="4513387527876475750">{DAYS,plural, =1{pirms # dienas}zero{pirms # dienām}one{pirms # dienas}other{pirms # dienām}}</translation> <translation id="4522570452068850558">Informācija</translation> <translation id="4526249700380860531">Skatīt un pārvaldīt saglabātās paroles vietnē <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Jauna cilne</translation> <translation id="5271967389191913893">Ierīcē nevar atvērt lejupielādējamo saturu.</translation> <translation id="5275558766013849309">Cilnes tiks rādītas kopā ar pēdējām izmantotajām lietotnēm.</translation> +<translation id="5284584623296338184">Grāmatzīmju, vēstures, paroļu un citu iestatījumu izmaiņas vairs netiks sinhronizētas ar jūsu Google kontu. Tomēr esošie dati joprojām tiks glabāti jūsu Google kontā.</translation> <translation id="5301954838959518834">Es sapratu</translation> <translation id="5302048478445481009">Valoda</translation> <translation id="5304593522240415983">Šis lauks nevar būt tukšs.</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Saglabātā vārda/paroles vai izņēmuma rediģēšana</translation> <translation id="5442257541162692417">Rediģēt saglabātu lapu</translation> <translation id="544291274896356069">Atverot šo saiti ārējā lietojumprogrammā, tiks aizvērts inkognito režīms. Vai turpināt?</translation> +<translation id="5487521232677179737">Notīrīt datus</translation> <translation id="5487729733663684359">Chrome atjauninājumi vairs netiek atbalstīti šajā Android versijā.</translation> <translation id="5511351932351731210">Vienmēr sūtīt</translation> <translation id="5512137114520586844">Šo kontu pārvalda <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google tulkotājs</translation> <translation id="5916664084637901428">Iesl.</translation> <translation id="5939518447894949180">Atiestatīt</translation> +<translation id="5965336165840183977">Tādējādi tiek dzēsti dati visās jūsu ierīcēs. Jūs netiksiet izrakstīts no sava Google konta. Saglabātie vietņu iestatījumi netiks dzēsti un var atspoguļot jūsu pārlūkošanas ieradumus.</translation> <translation id="5968595432776860642">Notiek videoklipa “<ph name="VIDEO_TITLE" />” atskaņošana</translation> <translation id="6010869025736512584">Notiek piekļūšana video ievadei</translation> <translation id="6012342843556706400">Pārlūkam Chrome ir nepieciešama piekļuve atrašanās vietai, lai kopīgotu to ar šo vietni.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Aizsargāts saturs</translation> <translation id="6612856669344839356">Saglabāt grāmatzīmi</translation> <translation id="6627583120233659107">Rediģēt mapi</translation> +<translation id="6647073004883890710">Vai vēlaties, lai <ph name="PASSWORD_MANAGER_BRAND" /> atjauninātu lietotāja <ph name="USERNAME" /> paroli šai vietnei?</translation> <translation id="6656545060687952787">Lai meklētu ierīces, pārlūkam Chrome ir nepieciešama piekļuve atrašanās vietai. <ph name="BEGIN_LINK" />Atjauniniet atļaujas<ph name="END_LINK" />.</translation> <translation id="666268767214822976">Izmantojiet ieteikumus, lai skatītu saistītos vaicājumus un populāras vietnes, kad rakstāt adreses joslā.</translation> <translation id="666981079809192359">Chrome konfidencialitātes paziņojums</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Saglabātā lapa nav pieejama bezsaistē.</translation> <translation id="6722992508235227685">Jūsu grāmatzīmes, vēsture, paroles un citi iestatījumi tiks sinhronizēti ar jūsu Google kontu, lai jūs varētu piekļūt šim saturam visās savās ierīcēs. Sinhronizējamo saturu varat izvēlēties sadaļā <ph name="BEGIN_LINK1" />Iestatījumi<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Notiek lejupielāde…</translation> +<translation id="6762156594045689028">Lai mainītu šo iestatījumu, <ph name="BEGIN_LINK" />atiestatiet sinhronizāciju<ph name="END_LINK" />.</translation> <translation id="6770414673596662518">Chrome sistēma Droša pārlūkošana tiks arī izmantota, lai noteiktu ļaunprātīgas lapas un pasargātu jūs no pikšķerēšanas, ļaunprātīgas programmatūras un kaitīgu failu lejupielādes.</translation> <translation id="6784675033504223784">Meklējiet vaicājumu “<ph name="SEARCH_TERM" />”</translation> <translation id="6790428901817661496">Atskaņot</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Pierakstieties, lai jūsu grāmatzīmes, vēsture, paroles un citi iestatījumi būtu pieejami visās jūsu ierīcēs.</translation> <translation id="6945221475159498467">Atlasīt</translation> <translation id="6963766334940102469">Dzēst grāmatzīmes</translation> -<translation id="6964496835063002391">Pievienojiet kontu</translation> <translation id="6965382102122355670">Labi</translation> <translation id="6973630695168034713">Mapes</translation> <translation id="6978479750597523876">Atiestatīt tulkošanas iestatījumus</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Tika konstatēts, ka savienojums ir lēns</translation> <translation id="7057058088140140610">Kredītkartes un adreses, izmantojot Google Payments</translation> <translation id="7063006564040364415">Nevarēja izveidot savienojumu ar sinhronizācijas serveri.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> vēlas izveidot savienojumu pārī ar:</translation> +<translation id="7081639897063626814">Glabāt esošos datus atsevišķi</translation> <translation id="7094922512924405309">Tuvumā nav atrasta neviena fiziskā tīmekļa lapa</translation> <translation id="7095930899177687653">Atvērtas <ph name="OPEN_TABS" /> cilnes</translation> <translation id="7096034533295549981">Video ielāde</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Palīdzība<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Dzēst grāmatzīmi</translation> <translation id="7324738665594301612">Eksperimenta laikā mēs testējam HTTPS lapu sūtīšanu, izmantojot Google serverus kā starpniekserverus.</translation> +<translation id="7346217184097589238">Saglabātie vietņu iestatījumi netiks dzēsti un var atspoguļot jūsu pārlūkošanas ieradumus.</translation> <translation id="7346909386216857016">Labi, sapratu</translation> +<translation id="7347770551817603360">Saturs bezsaistē</translation> <translation id="7363354739009474003">Notiek videoklipa “<ph name="VIDEO_TITLE" />” ielāde</translation> <translation id="7366340029385295517">Notiek apraide uz ekrānu “<ph name="SCREEN_NAME" />”</translation> <translation id="7375125077091615385">Veids:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Ierīces akreditācijas datu dzēšanas apstiprināšana</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (atjaunināts: <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Lūdzu, uzgaidiet...</translation> +<translation id="7499262814309712782">Sihrnonizācijas konts</translation> <translation id="7501135638693251872">Visas grāmatzīmes</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Notiek pārlūkošanas datu notīrīšana</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Saglabāts bezsaistē. Krātuvē maz vietas.</translation> <translation id="8068648041423924542">Nevar atlasīt sertifikātu.</translation> <translation id="8069239273282989646">Pēc saspiešanas</translation> +<translation id="8073388330009372546">Atvērt attēlu jaunā cilnē</translation> <translation id="8084156870963450514">Pierakstieties, lai piekļūtu visam savam tīmekļa saturam jebkurā ierīcē.</translation> <translation id="8106211421800660735">Kredītkartes numurs</translation> <translation id="813082847718468539">Skatīt informāciju par vietni</translation> <translation id="8137558756159375272">Izmantojot meklēšanu pieskaroties, atlasītais vārds un pašreiz skatītā lapa tiek nosūtīta kā konteksts pakalpojumam Google meklēšana. Varat to izslēgt lapā <ph name="BEGIN_LINK" />Iestatījumi<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Nav saglabāta bezsaistē</translation> <translation id="8168435359814927499">Saturs</translation> +<translation id="8173098127580644436">paša sākuma</translation> <translation id="8200772114523450471">Kopsavilkums</translation> <translation id="8209050860603202033">Atvērt attēlu</translation> <translation id="8218346974737627104">Pierakstīšanās apstiprinājums</translation> <translation id="8218934717680664417">Tagad varat veikt meklēšanu ar vienu pieskārienu</translation> +<translation id="8223946939421658889">Dzēst datus no</translation> <translation id="8261506727792406068">Dzēst</translation> <translation id="8275818695183729150">Atļaut (meklēšanas vaicājumiem adreses joslā)</translation> +<translation id="8283853025636624853">Sinhronizēšana ar <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Standarta cilnes</translation> <translation id="8374821112118309944">Jums ir jāatjaunina lietotne TalkBack uz jaunāku versiju.</translation> <translation id="8396312449826231789">Tikai apstiprinātas vietnes</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Vispirms jautāt (ieteicams)</translation> <translation id="8428213095426709021">Iestatījumi</translation> <translation id="8429160401486700187">Dzēst saglabātās lapas</translation> +<translation id="8433057134996913067">Šādi tiksiet izrakstīts no lielākās daļas vietņu.</translation> <translation id="8481940801237642152">Jūsu savienojums ar šo vietni ir privāts, taču kāds, kurš ir tīklā, var mainīt lapas izskatu.</translation> <translation id="8493948351860045254">Atbrīvot vietu</translation> <translation id="8497726226069778601">Šeit vēl nekā nav...</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Jūsu savienojums ar šo vietni ir privāts.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Navigācija nav sasniedzama: <ph name="URL" /></translation> +<translation id="8979340629087822094">iepriekšējās dienas</translation> <translation id="8987061207681586800">Pielāgojiet Chrome sev</translation> <translation id="9019902583201351841">Pārvalda jūsu vecāki</translation> <translation id="9020607083536754075">Aizvērt pašreizējo cilni un atgriezties iepriekšējā cilnē</translation> +<translation id="9038649477754266430">Ieteikumu pakalpojuma izmantošana ātrākai lapu ielādei</translation> <translation id="9050666287014529139">Ieejas frāze</translation> <translation id="9060538597317784206">Skatiet lietotni <ph name="APP_NAME" /> Play veikalā. Vērtējums: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Izslēgt iestatījumu “Pieprasīt datora vietni”</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index 5b0fcdd..e4b490b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Google-doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Stop</translation> <translation id="1285320974508926690">Deze site nooit vertalen</translation> +<translation id="1291207594882862231">Geschiedenis, cookies, sitegegevens, cachegeheugen wissen…</translation> <translation id="129553762522093515">Recent gesloten</translation> <translation id="1346090444609141578">Geen opgeslagen pagina's hier</translation> <translation id="1369915414381695676">Site <ph name="SITE_NAME" /> toegevoegd</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Camera</translation> <translation id="1623104350909869708">Voorkomen dat deze pagina extra dialoogvensters weergeeft</translation> <translation id="1641113438599504367">Safe Browsing</translation> +<translation id="164269334534774161">Je bekijkt een offline exemplaar van deze pagina van <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Pagina vertalen naar het <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Geschiedenis</translation> <translation id="1647391597548383849">Toegang tot camera</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Pagina vernieuwen</translation> <translation id="2709516037105925701">Automatisch aanvullen</translation> <translation id="271033894570825754">Nieuw</translation> +<translation id="2742271047622814453">Opgeslagen voorkeuren op sites kunnen worden verwijderd</translation> <translation id="2748463065602559597">Je bekijkt een veilige Google Chrome-pagina.</translation> <translation id="2762000892062317888">zojuist</translation> <translation id="2770465223704140727">Verwijderen uit lijst</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Doorgaan met het downloaden van de inhoud?</translation> <translation id="3328801116991980348">Site-informatie</translation> <translation id="3350687908700087792">Alle incognitotabbladen sluiten</translation> +<translation id="3351441609270267898">Bestaande gegevens importeren</translation> <translation id="3358663646935160692">Dit account wordt beheerd door <ph name="DOMAIN_NAME" />. Je logt in met een beheerd account en geeft de beheerder controle over je Chrome-profiel. Je Chrome-gegevens worden permanent gekoppeld aan dit account. Als je dit account loskoppelt, worden de lokale Chrome-gegevens verwijderd.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Nieuw incognitotabblad</translation> <translation id="3501331331116143684">Pagina offline opgeslagen in <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Accept. en doorgaan</translation> +<translation id="3522247891732774234">Update beschikbaar. Meer opties</translation> <translation id="3527085408025491307">Map</translation> <translation id="3549644494707163724">Alle gesynchroniseerde gegevens versleutelen met je eigen wachtwoordzin voor synchronisatie</translation> <translation id="360480449234699036">Meer informatie over onderwerpen op websites zonder dat je de pagina hoeft te verlaten. 'Tikken om te zoeken' stuurt een woord en contextuele informatie voor het woord naar Google Zoeken, waarna er definities, afbeeldingen, zoekresultaten en andere gegevens worden geretourneerd. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Openen op nieuw tabblad</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> bladwijzer offline opgeslagen</translation> <translation id="423410644998903704">Chrome heeft rechten nodig om het item te delen met deze site.</translation> -<translation id="4247939399682707041">De gegevens van dit apparaat vervangen door de gegevens van <ph name="ACCOUNT" />. Je kunt je bestaande gegevens ophalen door terug te schakelen naar <ph name="ACCOUNT" />.</translation> <translation id="424864128008805179">Uitloggen bij Chrome?</translation> <translation id="4254813446494774748">Doeltaal:</translation> <translation id="4256782883801055595">Open-sourcelicenties</translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">Beveiligde inhoud</translation> <translation id="6612856669344839356">Bladwijzer opslaan</translation> <translation id="6627583120233659107">Map bewerken</translation> +<translation id="6647073004883890710">Wil je dat <ph name="PASSWORD_MANAGER_BRAND" /> het wachtwoord voor <ph name="USERNAME" /> updatet voor deze site?</translation> <translation id="6656545060687952787">Chrome heeft locatietoegang nodig om naar apparaten te scannen. <ph name="BEGIN_LINK" />Rechten updaten<ph name="END_LINK" /></translation> <translation id="666268767214822976">Een voorspellingsservice gebruiken om gerelateerde zoekopdrachten en populaire websites te tonen terwijl je in de adresbalk typt</translation> <translation id="666981079809192359">Privacybeleid van Chrome</translation> @@ -452,7 +457,6 @@ <translation id="6868088497967843822">Log in om je bladwijzers, geschiedenis, wachtwoorden en andere instellingen op al je apparaten te gebruiken</translation> <translation id="6945221475159498467">Selecteren</translation> <translation id="6963766334940102469">Bladwijzers verwijderen</translation> -<translation id="6964496835063002391">Een account toevoegen</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Mappen</translation> <translation id="6978479750597523876">Vertaalinstellingen opnieuw instellen</translation> @@ -484,6 +488,7 @@ <translation id="7324738665594301612">We testen het via proxy overdragen van HTTPS-pagina's via servers van Google als onderdeel van een experiment.</translation> <translation id="7346217184097589238">Opgeslagen site-instellingen worden niet verwijderd en kunnen je browsegedrag weerspiegelen.</translation> <translation id="7346909386216857016">OK</translation> +<translation id="7347770551817603360">Offline content</translation> <translation id="7363354739009474003">'<ph name="VIDEO_TITLE" />' laden</translation> <translation id="7366340029385295517">Casten naar <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Type:</translation> @@ -544,6 +549,7 @@ <translation id="8050319187894766337">Pagina offline opgeslagen. Opslag bijna vol.</translation> <translation id="8068648041423924542">Kan certificaat niet selecteren.</translation> <translation id="8069239273282989646">Na compressie</translation> +<translation id="8073388330009372546">Openen op nieuw tabblad</translation> <translation id="8084156870963450514">Log in zodat al je online items toegankelijk zijn vanaf elk apparaat</translation> <translation id="8106211421800660735">Creditcardnummer</translation> <translation id="813082847718468539">Sitegegevens bekijken</translation> @@ -566,6 +572,7 @@ <translation id="8413385045638830869">Eerst vragen (aanbevolen)</translation> <translation id="8428213095426709021">Instellingen</translation> <translation id="8429160401486700187">Opgeslagen pagina's verwijderen</translation> +<translation id="8433057134996913067">Hiermee word je uitgelogd van de meeste websites.</translation> <translation id="8481940801237642152">Je verbinding met deze site is privé, maar iemand op het netwerk kan mogelijk het uiterlijk van de pagina wijzigen.</translation> <translation id="8493948351860045254">Ruimte vrijmaken</translation> <translation id="8497726226069778601">Hier is nog niets te zien</translation> @@ -610,6 +617,7 @@ <translation id="8987061207681586800">Personaliseer Chrome voor jou</translation> <translation id="9019902583201351841">Beheerd door je ouders</translation> <translation id="9020607083536754075">Het huidige tabblad sluiten en teruggaan naar de vorige app</translation> +<translation id="9038649477754266430">Een voorspellingsservice gebruiken om pagina's sneller te laden</translation> <translation id="9050666287014529139">Wachtwoordzin</translation> <translation id="9060538597317784206">App <ph name="APP_NAME" /> bekijken in de Play Store. Beoordeling: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">'Desktopsite opvragen' uitschakelen</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb index 486f797..7a41c8d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="no"> +<translation id="1040144152982955218">Søker etter enheter … <ph name="BEGIN_LINK" />Få hjelp<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Advarsel</translation> <translation id="10614374240317010">Aldri lagret</translation> <translation id="1061441684050139317">Chrome må ha tilgang til mikrofonen for å kunne dele den med dette nettstedet.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Legg til en konto for å få bokmerkene, loggen, passordene og de andre innstillingene dine på alle enhetene du bruker.</translation> <translation id="1098052486217676340">Ferdig</translation> <translation id="1121094540300013208">Bruks- og programstopprapporter</translation> +<translation id="1137305377394488060">den siste timen</translation> <translation id="1178581264944972037">Stans midlertidig</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1197267115302279827">Flytt bokmerker</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google-doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Stopp</translation> <translation id="1285320974508926690">Oversett aldri dette nettstedet</translation> +<translation id="1291207594882862231">Slett loggoppføringer, informasjonskapsler, nettstedsdata, bufferen …</translation> <translation id="129553762522093515">Nylig lukket</translation> <translation id="1346090444609141578">Det er ingen lagrede sider her</translation> <translation id="1369915414381695676">Nettstedet <ph name="SITE_NAME" /> er lagt til</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Hindre denne siden i å opprette flere dialogruter</translation> <translation id="1641113438599504367">Sikker surfing</translation> +<translation id="164269334534774161">Du ser en lokal kopi av denne siden fra <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Oversetter siden til <ph name="SOURCE_LANGUAGE" /> …</translation> <translation id="1644574205037202324">Logg</translation> <translation id="1647391597548383849">Tilgang til kameraet ditt</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Oversettelsesinnstillingene dine er tilbakestilt.</translation> <translation id="2359808026110333948">Fortsett</translation> <translation id="2381756643783702095">Spør før noe sendes (anbefales).</translation> +<translation id="2385560268894525395">den siste uken</translation> <translation id="2387895666653383613">Tekstskalering</translation> <translation id="238909021488141516">Det oppsto en feil under nedlastingen av innholdet.</translation> <translation id="2414886740292270097">Mørk</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Last inn siden på nytt</translation> <translation id="2709516037105925701">Autofyll</translation> <translation id="271033894570825754">Ny</translation> +<translation id="2742271047622814453">De lagrede innstillingene på nettsteder kan bli slettet</translation> <translation id="2748463065602559597">Du ser på en sikker Google Chrome-side.</translation> <translation id="2762000892062317888">akkurat nå</translation> <translation id="2770465223704140727">Fjern fra listen</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Denne kontoen er administrert av <ph name="PARENT_NAME_1" /> og <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Med enerett.</translation> <translation id="2968755619301702150">Visningsprogram for sertifikater</translation> +<translation id="2996291259634659425">Opprett en passordfrase</translation> <translation id="2996809686854298943">Nettadresse kreves</translation> <translation id="3029704984691124060">Passordfrasene stemmer ikke overens</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjelp<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Lagre videoen</translation> <translation id="306566828762083630">Lagringsplassen på enheten er full. Du må fjerne noen medier for å lage plass.</translation> <translation id="307329814453917357">Tilby oversettelse av nettsider ved hjelp av Google Oversetter</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Slå på tillatelsene for Chrome i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> lagrede data</translation> <translation id="3207960819495026254">Bokmerket</translation> +<translation id="321773570071367578">Hvis du har glemt passordfrasen din eller vil endre denne innstillingen, må du <ph name="BEGIN_LINK" />tilbakestille synkroniseringen<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Nettprogram</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Vil du gå videre med å laste ned innholdet?</translation> <translation id="3328801116991980348">Informasjon om nettstedet</translation> <translation id="3350687908700087792">Lukk alle inkognitofaner</translation> +<translation id="3351441609270267898">Importér eksisterende data</translation> <translation id="3358663646935160692">Denne kontoen administreres av <ph name="DOMAIN_NAME" />. Du logger på med en administrert konto, og gir administratoren kontroll over Chrome-profilen din. Chrome-dataene dine blir permanent knyttet til denne kontoen. Hvis du kobler fra denne kontoen, slettes de lokale Chrome-dataene.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Ny inkognitofane</translation> <translation id="3501331331116143684">Siden ble lagret lokalt i <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Godta og fortsett</translation> +<translation id="3522247891732774234">En oppdatering er tilgjengelig. Flere alternativer</translation> <translation id="3527085408025491307">Mappe</translation> <translation id="3549644494707163724">Kryptér alle synkroniserte data med din egen passordfrase for synkronisering</translation> <translation id="360480449234699036">Finn ut mer om emner på nettsteder uten å forlate siden. «Trykk for å søke» sender et ord og den omkringliggende konteksten til Google Søk, slik at definisjoner, bilder, søkeresultater og annen informasjon blir sendt tilbake. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Tving zoom på</translation> <translation id="3917783807003067648">Posisjonen er blokkert</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">de siste 4 ukene</translation> <translation id="393697183122708255">Ingen aktiverte talesøk er tilgjengelige</translation> <translation id="3950820424414687140">Logg på</translation> <translation id="3988213473815854515">Posisjon er tillatt</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Åpne i ny fane</translation> <translation id="4198229475320555619">Et bokmerke på <ph name="PAGE_SIZE_STRING" /> er lagret lokalt</translation> <translation id="423410644998903704">Chrome må ha tilgang til tillatelsene for å kunne dele dem med dette nettstedet.</translation> +<translation id="424864128008805179">Vil du logge av Chrome?</translation> <translation id="4254813446494774748">Språket siden skal oversettes til:</translation> <translation id="4256782883801055595">Lisenser for åpen kildekode</translation> <translation id="4259722352634471385">Nettadressen er blokkert: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Fremtidige sider på det fysiske nettet i nærheten vises i varsellisten din</translation> <translation id="4498934959426056365">Nøkkelgenerering</translation> <translation id="4505554159887937799">Lagret lokalt</translation> +<translation id="4508440807153586353">Bare personer som har passordfrasen din, kan lese de krypterte dataene dine. Passordfrasen blir verken sendt til Google eller lagret. Hvis du glemmer passordfrasen eller vil endre denne innstillingen, må du tilbakestille synkroniseringen. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{for # dag siden}other{for # dager siden}}</translation> <translation id="4522570452068850558">Detaljer</translation> <translation id="4526249700380860531">Se på og administrer lagrede passord på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Ny fane</translation> <translation id="5271967389191913893">Enheten kan ikke åpne innholdet som skal lastes ned.</translation> <translation id="5275558766013849309">Nylig brukte faner og apper vises sammen.</translation> +<translation id="5284584623296338184">Endringer i bokmerker, loggoppføringer, passord og andre innstillinger blir ikke synkronisert med Google-kontoen din lenger. Data som allerede er lagret i Google-kontoen din, blir imidlertid ikke fjernet.</translation> <translation id="5301954838959518834">OK, skjønner</translation> <translation id="5302048478445481009">Språk</translation> <translation id="5304593522240415983">Dette feltet må fylles ut</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Rediger lagret navn/passord eller unntak</translation> <translation id="5442257541162692417">Endre den lagrede siden</translation> <translation id="544291274896356069">Inkognitomodus forlates hvis denne linken åpnes i et eksternt program. Vil du fortsette?</translation> +<translation id="5487521232677179737">Slett data</translation> <translation id="5487729733663684359">Denne Android-versjonen har ikke lenger støtte for Chrome-oppdateringer.</translation> <translation id="5511351932351731210">Send alltid</translation> <translation id="5512137114520586844">Denne kontoen er administrert av <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Oversetter</translation> <translation id="5916664084637901428">På</translation> <translation id="5939518447894949180">Tilbakestill</translation> +<translation id="5965336165840183977">Dette fjerner synkroniserte data fra alle enheter. Du blir ikke logget av Google-kontoen din. Lagrede nettstedsinnstillinger blir ikke slettet, og disse kan gjenspeile nettvanene dine.</translation> <translation id="5968595432776860642">Spiller av <ph name="VIDEO_TITLE" /> ...</translation> <translation id="6010869025736512584">Åpner videoinngang</translation> <translation id="6012342843556706400">Chrome må ha tilgang til posisjonen din for å kunne dele den med dette nettstedet.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Beskyttet innhold</translation> <translation id="6612856669344839356">Lagre bokmerket</translation> <translation id="6627583120233659107">Rediger mappen</translation> +<translation id="6647073004883890710">Vil du at <ph name="PASSWORD_MANAGER_BRAND" /> skal oppdatere passordet for <ph name="USERNAME" /> for dette nettstedet?</translation> <translation id="6656545060687952787">Chrome trenger posisjonstilgang for å søke etter enheter. <ph name="BEGIN_LINK" />Oppdater tillatelsene<ph name="END_LINK" /></translation> <translation id="666268767214822976">Bruk en forslagstjeneste for å vise relaterte søkeord og populære nettsteder mens du skriver i adressefeltet</translation> <translation id="666981079809192359">Merknad om personvern for Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Den lagrede siden er ikke tilgjengelig uten nett</translation> <translation id="6722992508235227685">Bokmerkene dine, loggen din, passordene dine og andre innstillinger synkroniseres til Google-kontoen din, slik at du kan bruke dem på alle enhetene dine. Du kan velge hva som skal synkroniseres, i <ph name="BEGIN_LINK1" />innstillingene<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Laster ned …</translation> +<translation id="6762156594045689028">For å endre denne innstillingen, <ph name="BEGIN_LINK" />tilbakestill synkroniseringen<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Safe Browsing-systemet («sikker surfing») i Chrome brukes også til å oppdage skadelige sider og beskytte deg mot nettfisking, skadelig programvare og skadelige nedlastinger.</translation> <translation id="6784675033504223784">Søk etter <ph name="SEARCH_TERM" /></translation> <translation id="6790428901817661496">Spill av</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Logg på for å få bokmerkene, loggen, passordene og de andre innstillingene dine på alle enhetene du bruker.</translation> <translation id="6945221475159498467">Velg</translation> <translation id="6963766334940102469">Slett bokmerker</translation> -<translation id="6964496835063002391">Legg til en konto</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Mapper</translation> <translation id="6978479750597523876">Tilbakestilling av oversettelsesinnstillinger</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">En langsom tilkobling ble oppdaget</translation> <translation id="7057058088140140610">Kredittkort og adresser ved bruk av Google Payments</translation> <translation id="7063006564040364415">Kunne ikke koble til synkroniseringstjeneren.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> ønsker å koble til</translation> +<translation id="7081639897063626814">Hold eksisterende data adskilt</translation> <translation id="7094922512924405309">Fant ingen Fysisk nett-sider i nærheten</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> åpne faner</translation> <translation id="7096034533295549981">Laster inn videoen ...</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Hjelp<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Slett bokmerket</translation> <translation id="7324738665594301612">Vi tester sending av HTTPS-sider gjennom Google-tjenerne som en del av et eksperiment.</translation> +<translation id="7346217184097589238">Lagrede nettstedsinnstillinger blir ikke slettet, og disse kan gjenspeile nettvanene dine.</translation> <translation id="7346909386216857016">Greit</translation> +<translation id="7347770551817603360">Innhold uten nett</translation> <translation id="7363354739009474003">Laster inn <ph name="VIDEO_TITLE" /> ...</translation> <translation id="7366340029385295517">Caster til <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Type:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Bekreft sletting av enhetslegitimasjon</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (oppdatert <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Vent litt</translation> +<translation id="7499262814309712782">Kontoen som synkroniseres</translation> <translation id="7501135638693251872">Alle bokmerker</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Sletter nettlesingsdata</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Siden ble lagret lokalt. Lagringsplassen er nesten full.</translation> <translation id="8068648041423924542">Kan ikke velge sertifikat.</translation> <translation id="8069239273282989646">Etter komprimering</translation> +<translation id="8073388330009372546">Åpne bildet i en ny fane</translation> <translation id="8084156870963450514">Logg på, så får du tilgang til alt du har på nettet, på alle enheter du bruker</translation> <translation id="8106211421800660735">Kredittkortnummer</translation> <translation id="813082847718468539">Vis nettstedsinformasjon</translation> <translation id="8137558756159375272">Trykk for å søke sender det valgte ordet og den aktive siden som kontekst til Google Søk. Du kan slå av dette i <ph name="BEGIN_LINK" />Innstillinger<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Ikke lagret lokalt</translation> <translation id="8168435359814927499">Innhold</translation> +<translation id="8173098127580644436">tidenes morgen</translation> <translation id="8200772114523450471">Fortsett</translation> <translation id="8209050860603202033">Åpne bildet</translation> <translation id="8218346974737627104">Bekreft påloggingen</translation> <translation id="8218934717680664417">Nå kan du søke med ett trykk</translation> +<translation id="8223946939421658889">Slett data fra</translation> <translation id="8261506727792406068">Slett</translation> <translation id="8275818695183729150">Tillat (for søk fra adressefeltet)</translation> +<translation id="8283853025636624853">Synkroniserer til <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Standardfaner</translation> <translation id="8374821112118309944">Du må oppdatere til en nyere versjon av Talkback.</translation> <translation id="8396312449826231789">Bare godkjente nettsteder</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Spør først (anbefales)</translation> <translation id="8428213095426709021">Innstillinger</translation> <translation id="8429160401486700187">Slett de lagrede sidene</translation> +<translation id="8433057134996913067">Dette logger deg av de fleste nettsteder.</translation> <translation id="8481940801237642152">Tilkoblingen til dette området er privat, men det kan hende at noen på nettverket kan endre utseendet på siden.</translation> <translation id="8493948351860045254">Frigjør plass</translation> <translation id="8497726226069778601">Det er ikke noe her foreløpig</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Tilkoblingen til dette nettstedet er privat.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Nettadressen er utilgjengelig: <ph name="URL" /></translation> +<translation id="8979340629087822094">det siste døgnet</translation> <translation id="8987061207681586800">Tilpass Chrome</translation> <translation id="9019902583201351841">Administrert av foreldrene dine</translation> <translation id="9020607083536754075">Lukk den aktive fanen og gå tilbake til den forrige appen</translation> +<translation id="9038649477754266430">Bruk en forslagstjeneste for å laste inn sider raskere</translation> <translation id="9050666287014529139">Passordfrase</translation> <translation id="9060538597317784206">Vis <ph name="APP_NAME" />-appen i Play Butikk. Vurdering: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Slå av Bruk skrivebordsversjon</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb index da5eeb7..4a5edbd 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pl"> +<translation id="1040144152982955218">Wyszukuję urządzenia… <ph name="BEGIN_LINK" />poproś o pomoc<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Ostrzeżenie</translation> <translation id="10614374240317010">Nigdy nie zapisane</translation> <translation id="1061441684050139317">Aby zezwolić stronie na wykorzystanie mikrofonu, Chrome musi mieć do niego dostęp.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Dodaj konto, by korzystać z zakładek, historii, haseł i innych ustawień na wszystkich swoich urządzeniach.</translation> <translation id="1098052486217676340">Zakończono</translation> <translation id="1121094540300013208">Raporty o użytkowaniu i awariach</translation> +<translation id="1137305377394488060">z ostatniej godziny</translation> <translation id="1178581264944972037">Wstrzymaj</translation> <translation id="1181037720776840403">Usuń</translation> <translation id="1197267115302279827">Przenieś zakładki</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Doodle Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Zatrzymaj</translation> <translation id="1285320974508926690">Nigdy nie tłumacz tej witryny</translation> +<translation id="1291207594882862231">Wyczyść historię, pliki cookie, dane witryn, pamięć podręczną…</translation> <translation id="129553762522093515">Ostatnio zamknięte</translation> <translation id="1346090444609141578">Nie ma tu zapisanych stron</translation> <translation id="1369915414381695676">Strona <ph name="SITE_NAME" /> została dodana</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Zapobiegaj wyświetlaniu dodatkowych okien dialogowych na tej stronie</translation> <translation id="1641113438599504367">Bezpieczne przeglądanie</translation> +<translation id="164269334534774161">Oglądasz kopię offline tej strony z <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Tłumaczę stronę na <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Historia</translation> <translation id="1647391597548383849">Dostęp do kamery</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Ustawienia tłumaczenia zostały zresetowane.</translation> <translation id="2359808026110333948">Kontynuuj</translation> <translation id="2381756643783702095">Pytaj przed wysłaniem (zalecane)</translation> +<translation id="2385560268894525395">z ostatniego tygodnia</translation> <translation id="2387895666653383613">Skalowanie tekstu</translation> <translation id="238909021488141516">Podczas pobierania treści wystąpił błąd.</translation> <translation id="2414886740292270097">Ciemny</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Odśwież stronę</translation> <translation id="2709516037105925701">Autouzupełnianie</translation> <translation id="271033894570825754">Nowy</translation> +<translation id="2742271047622814453">Możesz stracić zapisane ustawienia dotyczące witryn</translation> <translation id="2748463065602559597">Przeglądasz bezpieczną stronę Google Chrome.</translation> <translation id="2762000892062317888">przed chwilą</translation> <translation id="2770465223704140727">Usuń z listy</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Tym kontem zarządzają <ph name="PARENT_NAME_1" /> i <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Wszelkie prawa zastrzeżone.</translation> <translation id="2968755619301702150">Przeglądarka certyfikatów</translation> +<translation id="2996291259634659425">Utwórz hasło</translation> <translation id="2996809686854298943">Wymagany adres URL</translation> <translation id="3029704984691124060">Hasła nie pasują do siebie</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Poproś o pomoc<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Zapisz film</translation> <translation id="306566828762083630">Pamięć urządzenia jest pełna. Usuń inne pliki, by zrobić miejsce.</translation> <translation id="307329814453917357">Proponuj tłumaczenie stron w Tłumaczu Google</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Przyznaj Chrome uprawnienia w <ph name="BEGIN_LINK" />ustawieniach Androida<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> zapisanych danych</translation> <translation id="3207960819495026254">Dodano do zakładek</translation> +<translation id="321773570071367578">Jeśli nie pamiętasz hasła lub chcesz zmienić to ustawienie, <ph name="BEGIN_LINK" />zresetuj synchronizację<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Aplikacja internetowa</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Przejść do pobrania treści?</translation> <translation id="3328801116991980348">Informacje o witrynie</translation> <translation id="3350687908700087792">Zamknij wszystkie karty incognito</translation> +<translation id="3351441609270267898">Importuj istniejące dane</translation> <translation id="3358663646935160692">Tym kontem zarządza <ph name="DOMAIN_NAME" />. Logujesz się na zarządzane konto i dajesz jego administratorowi kontrolę nad swoim profilem Chrome. Twoje dane Chrome zostaną na stałe powiązane z tym kontem. Odłączenie od tego konta spowoduje usunięcie lokalnych danych Chrome.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Nowa karta incognito</translation> <translation id="3501331331116143684">Zapisano offline w folderze <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Akceptuj i kontynuuj</translation> +<translation id="3522247891732774234">Dostępna jest aktualizacja. Więcej opcji</translation> <translation id="3527085408025491307">Folder</translation> <translation id="3549644494707163724">Szyfruj wszystkie synchronizowane dane za pomocą hasła synchronizacji</translation> <translation id="360480449234699036">Poznaj tematy w witrynach bez opuszczania strony. Funkcja Dotknij, by wyszukać kopiuje słowo wraz z kontekstem i wkleja je w wyszukiwarce Google, dzięki czemu otrzymujesz definicje, grafiki, wyniki wyszukiwania i inne informacje. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Wymuś powiększenie</translation> <translation id="3917783807003067648">Lokalizacja jest zablokowana</translation> <translation id="3927692899758076493">Bezszeryfowa</translation> +<translation id="3931947361983910192">z ostatnich czterech tygodni</translation> <translation id="393697183122708255">Brak włączonego wyszukiwania głosowego</translation> <translation id="3950820424414687140">Zaloguj się</translation> <translation id="3988213473815854515">Lokalizacja jest dozwolona</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Otwórz w nowej karcie</translation> <translation id="4198229475320555619">Zakładka o rozmiarze <ph name="PAGE_SIZE_STRING" /> została zapisana offline</translation> <translation id="423410644998903704">Aby zezwolić stronie na wykorzystanie uprawnień, Chrome musi je mieć.</translation> +<translation id="424864128008805179">Wylogować z Chrome?</translation> <translation id="4254813446494774748">Język tłumaczenia:</translation> <translation id="4256782883801055595">Licencje open source</translation> <translation id="4259722352634471385">Adres zablokowany: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Strony internetu rzeczy w pobliżu będą pojawiać się na liście powiadomień</translation> <translation id="4498934959426056365">Generowanie kluczy</translation> <translation id="4505554159887937799">Zapisane offline</translation> +<translation id="4508440807153586353">Twoje zaszyfrowane dane może odczytać tylko ktoś znający hasło. Google nie otrzyma Twojego hasła ani nie będzie go przechowywać. Jeśli je zapomnisz lub zechcesz zmienić to ustawienie, musisz zresetować synchronizację. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# dzień temu}few{# dni temu}many{# dni temu}other{# dnia temu}}</translation> <translation id="4522570452068850558">Szczegóły</translation> <translation id="4526249700380860531">Wyświetlaj zapisane hasła i zarządzaj nimi na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Nowa karta</translation> <translation id="5271967389191913893">Na tym urządzeniu nie można otworzyć treści, które chcesz pobrać.</translation> <translation id="5275558766013849309">Karty będą uruchomione razem z ostatnimi aplikacjami.</translation> +<translation id="5284584623296338184">Zmiany w zakładkach, historii, hasłach i innych ustawieniach nie będą już synchronizowane z kontem Google. Twoje istniejące dane będą jednak nadal na nim przechowywane.</translation> <translation id="5301954838959518834">OK, rozumiem</translation> <translation id="5302048478445481009">Język</translation> <translation id="5304593522240415983">To pole nie może być puste</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Edytuj zapisaną nazwę/hasło lub wyjątek</translation> <translation id="5442257541162692417">Edytuj zapisaną stronę</translation> <translation id="544291274896356069">Jeśli otworzysz ten link w aplikacji zewnętrznej, opuścisz tryb incognito. Kontynuować?</translation> +<translation id="5487521232677179737">Wyczyść dane</translation> <translation id="5487729733663684359">Aktualizacje Chrome nie są już dostępne w tej wersji Androida.</translation> <translation id="5511351932351731210">Zawsze wysyłaj</translation> <translation id="5512137114520586844">Tym kontem zarządza <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Tłumacz Google</translation> <translation id="5916664084637901428">Włączone</translation> <translation id="5939518447894949180">Resetuj</translation> +<translation id="5965336165840183977">Spowoduje to wyczyszczenie synchronizowanych danych ze wszystkich urządzeń. Nie wylogujemy Cię z konta Google. Zapisane ustawienia witryny nie zostaną usunięte i mogą odzwierciedlać Twoje nawyki przeglądania.</translation> <translation id="5968595432776860642">Odtwarzam „<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Otwieram wejście wideo</translation> <translation id="6012342843556706400">Aby zezwolić stronie na wykorzystanie danych o lokalizacji, Chrome musi mieć do nich dostęp.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Treść chroniona</translation> <translation id="6612856669344839356">Zapisz zakładkę</translation> <translation id="6627583120233659107">Edytuj folder</translation> +<translation id="6647073004883890710">Czy <ph name="PASSWORD_MANAGER_BRAND" /> ma zaktualizować hasło użytkownika <ph name="USERNAME" /> do tej witryny?</translation> <translation id="6656545060687952787">Aby wyszukać urządzenia, Chrome potrzebuje dostępu do lokalizacji. <ph name="BEGIN_LINK" />Zwiększ uprawnienia<ph name="END_LINK" /></translation> <translation id="666268767214822976">Gdy piszesz na pasku adresu, korzystaj z usługi przewidywania, by wyświetlać podobne zapytania i adresy popularnych stron</translation> <translation id="666981079809192359">Informacje na temat ochrony prywatności w Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Zapisana strona nie jest dostępna w trybie offline</translation> <translation id="6722992508235227685">Zakładki, historia, hasła i inne ustawienia zostaną zsynchronizowane z kontem Google, by można było z nich korzystać na wszystkich urządzeniach. Elementy do zsynchronizowania możesz wybrać w <ph name="BEGIN_LINK1" />Ustawieniach<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Pobieram…</translation> +<translation id="6762156594045689028">Aby zmienić to ustawienie, <ph name="BEGIN_LINK" />zresetuj synchronizację<ph name="END_LINK" /></translation> <translation id="6770414673596662518">System Bezpieczne przeglądanie w Chrome jest też używany do wykrywania złośliwych stron oraz ochrony przed wyłudzaniem informacji, złośliwym oprogramowaniem i szkodliwymi plikami do pobrania.</translation> <translation id="6784675033504223784">Szukaj „<ph name="SEARCH_TERM" />”</translation> <translation id="6790428901817661496">Odtwórz</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Zaloguj się, by korzystać z zakładek, historii, haseł i innych ustawień na wszystkich swoich urządzeniach</translation> <translation id="6945221475159498467">Wybierz</translation> <translation id="6963766334940102469">Usuń zakładki</translation> -<translation id="6964496835063002391">Dodaj konto</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Foldery</translation> <translation id="6978479750597523876">Zresetuj ustawienia tłumaczenia</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Wykryto wolne połączenie</translation> <translation id="7057058088140140610">Karty kredytowe i adresy z Google Payments</translation> <translation id="7063006564040364415">Nie udało się nawiązać połączenia z serwerem synchronizacji.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> chce się sparować z:</translation> +<translation id="7081639897063626814">Przechowuj istniejące dane oddzielnie</translation> <translation id="7094922512924405309">Nie znaleziono stron internetu rzeczy w pobliżu</translation> <translation id="7095930899177687653">Otwarte karty: <ph name="OPEN_TABS" /></translation> <translation id="7096034533295549981">Wczytuję film</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Pomoc<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Usuń zakładkę</translation> <translation id="7324738665594301612">W ramach eksperymentu testujemy przekazywanie stron HTTPS przez serwery Google.</translation> +<translation id="7346217184097589238">Zapisane ustawienia witryny nie zostaną usunięte i mogą odzwierciedlać Twoje nawyki przeglądania.</translation> <translation id="7346909386216857016">OK</translation> +<translation id="7347770551817603360">Treść offline</translation> <translation id="7363354739009474003">Wczytuję „<ph name="VIDEO_TITLE" />”</translation> <translation id="7366340029385295517">Przesyłam na ekran <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Typ:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Potwierdź usunięcie z urządzenia danych logowania</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (zaktualizowana <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Czekaj…</translation> +<translation id="7499262814309712782">Synchronizowane konto</translation> <translation id="7501135638693251872">Wszystkie zakładki</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Czyszczenie danych przeglądania</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Zapisano offline. Masz mało miejsca.</translation> <translation id="8068648041423924542">Nie można wybrać certyfikatu.</translation> <translation id="8069239273282989646">Po skompresowaniu</translation> +<translation id="8073388330009372546">Otwórz grafikę w nowej karcie</translation> <translation id="8084156870963450514">Zaloguj się, by móc korzystać ze wszystkich swoich rzeczy związanych z internetem na dowolnym urządzeniu</translation> <translation id="8106211421800660735">Numer karty kredytowej</translation> <translation id="813082847718468539">Wyświetl informacje o witrynie</translation> <translation id="8137558756159375272">Funkcja „Dotknij, by wyszukać” wysyła zaznaczone słowo i bieżącą stronę jako kontekst do wyszukiwarki Google. Możesz ją wyłączyć w <ph name="BEGIN_LINK" />ustawieniach<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Nie zapisano offline</translation> <translation id="8168435359814927499">Treści</translation> +<translation id="8173098127580644436">od początku</translation> <translation id="8200772114523450471">Wznów</translation> <translation id="8209050860603202033">Otwórz grafikę</translation> <translation id="8218346974737627104">Potwierdź, że chcesz się zalogować</translation> <translation id="8218934717680664417">Teraz możesz wyszukiwać jednym kliknięciem</translation> +<translation id="8223946939421658889">Wyczyść dane</translation> <translation id="8261506727792406068">Usuń</translation> <translation id="8275818695183729150">Zezwól (w przypadku wyszukiwań na pasku adresu)</translation> +<translation id="8283853025636624853">Synchronizowanie z kontem <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Karty standardowe</translation> <translation id="8374821112118309944">Musisz zainstalować nowszą wersję TalkBack.</translation> <translation id="8396312449826231789">Tylko zatwierdzone witryny</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Najpierw zapytaj (zalecane)</translation> <translation id="8428213095426709021">Ustawienia</translation> <translation id="8429160401486700187">Usuń zapisane strony</translation> +<translation id="8433057134996913067">Nastąpi wylogowanie z większości stron internetowych.</translation> <translation id="8481940801237642152">Twoje połączenie z tą witryną jest prywatne, ale inna osoba w sieci może zmienić wygląd tej strony.</translation> <translation id="8493948351860045254">Zwolnij miejsce</translation> <translation id="8497726226069778601">Tu jeszcze niczego nie ma</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Twoje połączenie z tą witryną jest prywatne.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Adres nieosiągalny: <ph name="URL" /></translation> +<translation id="8979340629087822094">z ostatniego dnia</translation> <translation id="8987061207681586800">Dostosuj Chrome</translation> <translation id="9019902583201351841">Zarządzany przez Twoich rodziców</translation> <translation id="9020607083536754075">Zamknij aktualną kartę i wróć do poprzedniej aplikacji</translation> +<translation id="9038649477754266430">Użyj usługi podpowiedzi, by strony ładowały się szybciej</translation> <translation id="9050666287014529139">Hasło</translation> <translation id="9060538597317784206">Wyświetl aplikację <ph name="APP_NAME" /> w sklepie Play. Ocena: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Wyłącz opcję „Wersja na komputer”</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb index 552ee285d..bb4abe13 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Doodle do Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Parar</translation> <translation id="1285320974508926690">Nunca traduzir este site</translation> +<translation id="1291207594882862231">Limpar histórico, cookies, dados do site, cache…</translation> <translation id="129553762522093515">Recentemente fechadas</translation> <translation id="1346090444609141578">Nenhuma página salva aqui</translation> <translation id="1369915414381695676">Site <ph name="SITE_NAME" /> adicionado</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Câmera</translation> <translation id="1623104350909869708">Impedir que esta página crie caixas de diálogo adicionais</translation> <translation id="1641113438599504367">Navegação segura</translation> +<translation id="164269334534774161">Você está vendo uma cópia off-line desta página de <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Traduzindo página para <ph name="SOURCE_LANGUAGE" />...</translation> <translation id="1644574205037202324">Histórico</translation> <translation id="1647391597548383849">Acessar sua câmera</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Atualizar página</translation> <translation id="2709516037105925701">Preenchimento automático</translation> <translation id="271033894570825754">Novo</translation> +<translation id="2742271047622814453">É possível que as preferências salvas em sites sejam excluídas</translation> <translation id="2748463065602559597">Você está em uma página segura do Google Chrome.</translation> <translation id="2762000892062317888">agora mesmo</translation> <translation id="2770465223704140727">Remover da lista</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Continuar com o download do conteúdo?</translation> <translation id="3328801116991980348">Informações do site</translation> <translation id="3350687908700087792">Fechar todas as guias anônimas</translation> +<translation id="3351441609270267898">Importar dados existentes</translation> <translation id="3358663646935160692">Esta conta é administrada por <ph name="DOMAIN_NAME" />. Você está fazendo login com uma conta gerenciada e fornecendo ao administrador da conta o controle sobre seu perfil do Google Chrome. Seus dados do Chrome serão permanentemente vinculados a esta conta. Se você se desconectar desta conta, os dados locais do Chrome serão excluídos.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Nova guia anônima</translation> <translation id="3501331331116143684">Página salva off-line em <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Aceitar e continuar</translation> +<translation id="3522247891732774234">Atualização disponível. Mais opções</translation> <translation id="3527085408025491307">Pasta</translation> <translation id="3549644494707163724">Criptografar todos os dados sincronizados com sua senha de sincronização</translation> <translation id="360480449234699036">Saiba mais sobre tópicos em websites sem sair da página. A opção "Tocar para pesquisar" envia uma palavra e seu respectivo contexto para a Pesquisa Google, que retorna definições, imagens, resultados de pesquisa e outros detalhes. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Abrir em uma nova guia</translation> <translation id="4198229475320555619">Favorito de <ph name="PAGE_SIZE_STRING" /> salvo off-line</translation> <translation id="423410644998903704">O Chrome precisa ter acesso às permissões para compartilhá-las com este site.</translation> -<translation id="4247939399682707041">Substitui os dados deste dispositivo com os dados de <ph name="ACCOUNT" />. É possível recuperar os dados já existentes voltando para <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Sair do Google Chrome?</translation> <translation id="4254813446494774748">Idioma de tradução:</translation> <translation id="4256782883801055595">Licenças de código aberto</translation> @@ -371,7 +375,7 @@ <translation id="5911030830365207728">Google Tradutor</translation> <translation id="5916664084637901428">Ativado</translation> <translation id="5939518447894949180">Redefinir</translation> -<translation id="5965336165840183977">Limpa os dados sincronizados de todos os dispositivos. Você não será desconectado da sua Conta do Google. As configurações do site salvas não serão excluídas e podem refletir seus hábitos de navegação.</translation> +<translation id="5965336165840183977">Limpa os dados sincronizados de todos os dispositivos. Você não será desconectado da sua Conta do Google. As configurações salvas em sites não serão excluídas e podem refletir seus hábitos de navegação.</translation> <translation id="5968595432776860642">Reproduzindo “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Acessando entrada de vídeo</translation> <translation id="6012342843556706400">O Chrome precisa ter acesso ao local para compartilhá-lo com este site.</translation> @@ -424,6 +428,7 @@ <translation id="6612358246767739896">Conteúdo protegido</translation> <translation id="6612856669344839356">Salvar favorito</translation> <translation id="6627583120233659107">Editar pasta</translation> +<translation id="6647073004883890710">Deseja que <ph name="PASSWORD_MANAGER_BRAND" /> atualize a senha de <ph name="USERNAME" /> para este site?</translation> <translation id="6656545060687952787">O Chrome precisa de acesso ao local para procurar por dispositivos. <ph name="BEGIN_LINK" />Atualizar permissões<ph name="END_LINK" /></translation> <translation id="666268767214822976">Usar um serviço de previsão para mostrar consultas relacionadas e sites populares quando você digitar na barra de endereços</translation> <translation id="666981079809192359">Aviso de Privacidade do Chrome</translation> @@ -451,7 +456,6 @@ <translation id="6868088497967843822">Faça login para que favoritos, histórico, senhas e outras configurações fiquem disponíveis em todos os seus dispositivos</translation> <translation id="6945221475159498467">Selecionar</translation> <translation id="6963766334940102469">Excluir favoritos</translation> -<translation id="6964496835063002391">Adicionar uma conta</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Pastas</translation> <translation id="6978479750597523876">Redefinir configurações do Google Tradutor</translation> @@ -481,8 +485,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ajuda<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Excluir favorito</translation> <translation id="7324738665594301612">Estamos testando o uso de proxy de páginas HTTPS por meio de servidores do Google como parte de um experimento.</translation> -<translation id="7346217184097589238">As configurações do site salvas não serão excluídas e podem refletir seus hábitos de navegação.</translation> +<translation id="7346217184097589238">As configurações salvas em sites não serão excluídas e podem refletir seus hábitos de navegação.</translation> <translation id="7346909386216857016">Ok, entendi.</translation> +<translation id="7347770551817603360">Conteúdo off-line</translation> <translation id="7363354739009474003">Carregando "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">Transmitindo em <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Tipo:</translation> @@ -543,6 +548,7 @@ <translation id="8050319187894766337">Página salva off-line. Armazenamento quase cheio.</translation> <translation id="8068648041423924542">Não foi possível selecionar certificado.</translation> <translation id="8069239273282989646">Após compactação</translation> +<translation id="8073388330009372546">Abrir imagem em nova guia</translation> <translation id="8084156870963450514">Faça login para acessar tudo o que você tem na Web, a partir de qualquer dispositivo</translation> <translation id="8106211421800660735">Número do cartão de crédito</translation> <translation id="813082847718468539">Visualizar informações do site</translation> @@ -565,6 +571,7 @@ <translation id="8413385045638830869">Perguntar primeiro (recomendado)</translation> <translation id="8428213095426709021">Configurações</translation> <translation id="8429160401486700187">Excluir páginas salvas</translation> +<translation id="8433057134996913067">Essa opção desconecta você da maioria dos websites.</translation> <translation id="8481940801237642152">Sua conexão a este site é particular, mas alguém na rede pode conseguir alterar a aparência da página.</translation> <translation id="8493948351860045254">Liberar espaço</translation> <translation id="8497726226069778601">Não há nada para ver aqui... ainda</translation> @@ -608,6 +615,7 @@ <translation id="8987061207681586800">O Chrome é seu</translation> <translation id="9019902583201351841">Gerenciado pelos seus pais</translation> <translation id="9020607083536754075">Fechar a guia atual e retornar para o app anterior</translation> +<translation id="9038649477754266430">Usar um serviço de previsão para carregar páginas mais rapidamente</translation> <translation id="9050666287014529139">Senha</translation> <translation id="9060538597317784206">Ver aplicativo <ph name="APP_NAME" /> na Play Store. Classificação: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Desativar "Ver versão para Web"</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb index fe499f8..684c8696 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Doodle da Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Parar</translation> <translation id="1285320974508926690">Nunca traduzir este site</translation> +<translation id="1291207594882862231">Limpar histórico, cookies, dados de sites, cache…</translation> <translation id="129553762522093515">Fechados recentemente</translation> <translation id="1346090444609141578">Nenhuma página guardada aqui</translation> <translation id="1369915414381695676">Site <ph name="SITE_NAME" /> adicionado</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Câmara</translation> <translation id="1623104350909869708">Evitar que esta página crie caixas de diálogo adicionais</translation> <translation id="1641113438599504367">Navegação segura</translation> +<translation id="164269334534774161">Está a visualizar uma cópia offline desta página de <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">A traduzir a página para <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Histórico</translation> <translation id="1647391597548383849">Aceder à câmara</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Atualizar página</translation> <translation id="2709516037105925701">Preenchimento automático</translation> <translation id="271033894570825754">Novo</translation> +<translation id="2742271047622814453">As preferências guardadas nos sites podem ser eliminadas</translation> <translation id="2748463065602559597">Está a ver uma página segura do Google Chrome.</translation> <translation id="2762000892062317888">agora mesmo</translation> <translation id="2770465223704140727">Remover da lista</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Pretende transferir o conteúdo?</translation> <translation id="3328801116991980348">Informações do site</translation> <translation id="3350687908700087792">Fechar todos os separadores de navegação anónima</translation> +<translation id="3351441609270267898">Importar dados existentes</translation> <translation id="3358663646935160692">Esta conta é gerida por <ph name="DOMAIN_NAME" />. Está a iniciar sessão com uma conta gerida e a atribuir ao respetivo administrador controlo sobre o seu perfil do Chrome. Os seus dados do Chrome ficarão associados permanentemente a esta conta. Desassociar esta conta irá eliminar os dados locais do Chrome.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Novo sep. navegação anónima</translation> <translation id="3501331331116143684">Página guardada offline em <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Aceitar e continuar</translation> +<translation id="3522247891732774234">Atualização disponível. Mais opções</translation> <translation id="3527085408025491307">Pasta</translation> <translation id="3549644494707163724">Encriptar todos os dados sincronizados com a sua própria frase de acesso de sincronização</translation> <translation id="360480449234699036">Saiba mais acerca dos tópicos nos Websites sem sair da página. A funcionalidade Tocar para pesquisar envia uma palavra e o respetivo contexto circundante para a Pesquisa Google, que devolve definições, imagens, resultados da pesquisa e outros detalhes. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Abrir num novo separador</translation> <translation id="4198229475320555619">Marcador com <ph name="PAGE_SIZE_STRING" /> guardado offline</translation> <translation id="423410644998903704">O Chrome necessita de acesso às autorizações para as partilhar com este site.</translation> -<translation id="4247939399682707041">Substitua os dados deste dispositivo pelos dados da conta <ph name="ACCOUNT" />. Pode obter os dados existentes ao alternar novamente para <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Pretende terminar sessão no Chrome?</translation> <translation id="4254813446494774748">Idioma de tradução:</translation> <translation id="4256782883801055595">Licenças de código aberto</translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">Conteúdo protegido</translation> <translation id="6612856669344839356">Guardar marcador</translation> <translation id="6627583120233659107">Editar pasta</translation> +<translation id="6647073004883890710">Pretende que o <ph name="PASSWORD_MANAGER_BRAND" /> atualize a palavra-passe de <ph name="USERNAME" /> para este site?</translation> <translation id="6656545060687952787">O Chrome necessita de acesso à localização para procurar dispositivos. <ph name="BEGIN_LINK" />Atualizar autorizações<ph name="END_LINK" /></translation> <translation id="666268767214822976">Utilizar um serviço de previsão para mostrar consultas relacionadas e Websites populares à medida que escreve na barra de endereço</translation> <translation id="666981079809192359">Aviso de privacidade do Chrome</translation> @@ -452,7 +457,6 @@ <translation id="6868088497967843822">Iniciar sessão para aceder aos marcadores, ao histórico, às palavras-passe e a outras definições em todos os dispositivos</translation> <translation id="6945221475159498467">Seleccionar</translation> <translation id="6963766334940102469">Eliminar marcadores</translation> -<translation id="6964496835063002391">Adicionar uma conta</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Pastas</translation> <translation id="6978479750597523876">Repor definições de tradução</translation> @@ -484,6 +488,7 @@ <translation id="7324738665594301612">Estamos a testar a utilização de páginas HTTPS com proxy através dos servidores da Google no âmbito de uma experiência.</translation> <translation id="7346217184097589238">As definições de sites guardadas não são eliminadas e podem refletir os seus hábitos de navegação.</translation> <translation id="7346909386216857016">OK, compreendi</translation> +<translation id="7347770551817603360">Conteúdo offline</translation> <translation id="7363354739009474003">A carregar "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">A transmitir para <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Tipo:</translation> @@ -544,6 +549,7 @@ <translation id="8050319187894766337">Pg guar offline. Amz quse cheio.</translation> <translation id="8068648041423924542">Não é possível selecionar o certificado.</translation> <translation id="8069239273282989646">Após compressão</translation> +<translation id="8073388330009372546">Abrir imagem num novo separad.</translation> <translation id="8084156870963450514">Iniciar sessão para aceder a todo o seu conteúdo da Web a partir de qualquer dispositivo</translation> <translation id="8106211421800660735">Número de cartão de crédito</translation> <translation id="813082847718468539">Ver informações do Web site</translation> @@ -566,6 +572,7 @@ <translation id="8413385045638830869">Perguntar primeiro (recomendado)</translation> <translation id="8428213095426709021">Definições</translation> <translation id="8429160401486700187">Eliminar páginas guardadas</translation> +<translation id="8433057134996913067">Esta opção termina a sessão na maioria dos Websites.</translation> <translation id="8481940801237642152">A sua ligação a este site é privada, mas alguém na rede pode estar a tentar alterar o aspeto da página.</translation> <translation id="8493948351860045254">Libertar espaço</translation> <translation id="8497726226069778601">Ainda não há nada para ver aqui</translation> @@ -610,6 +617,7 @@ <translation id="8987061207681586800">Personalizar o Chrome</translation> <translation id="9019902583201351841">Gerido pelos teus pais</translation> <translation id="9020607083536754075">Fechar o separador atual e regressar à aplicação anterior</translation> +<translation id="9038649477754266430">Utilizar um serviço de previsão para carregar páginas mais rapidamente</translation> <translation id="9050666287014529139">Frase de acesso</translation> <translation id="9060538597317784206">Ver a aplicação <ph name="APP_NAME" /> na Play Store. Classificação: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Desativar Pedir site para computador</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb index 875ddeb3e..ff19821 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ro"> +<translation id="1040144152982955218">Se caută dispozitive… <ph name="BEGIN_LINK" />obține ajutor<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Avertisment</translation> <translation id="10614374240317010">Nu se salvează niciodată</translation> <translation id="1061441684050139317">Chrome are nevoie de acces la microfon pentru a-l acorda acestui site.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Adaugă un cont pentru a avea marcajele, istoricul, parolele și alte setări pe toate dispozitivele.</translation> <translation id="1098052486217676340">Terminat</translation> <translation id="1121094540300013208">Statistici de utilizare și rapoarte de blocare</translation> +<translation id="1137305377394488060">din ultima oră</translation> <translation id="1178581264944972037">Întrerupe</translation> <translation id="1181037720776840403">Elimină</translation> <translation id="1197267115302279827">Mută marcaje</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Doodle Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Oprește</translation> <translation id="1285320974508926690">Nu traduce niciodată acest site</translation> +<translation id="1291207594882862231">Șterge istoricul, cookie-urile, datele privind site-urile și memoria cache…</translation> <translation id="129553762522093515">Închise recent</translation> <translation id="1346090444609141578">Nu există pagini salvate aici</translation> <translation id="1369915414381695676">Site-ul <ph name="SITE_NAME" /> a fost adăugat</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Camera</translation> <translation id="1623104350909869708">Restricționați capacitatea acestei pagini de a crea casete de dialog suplimentare</translation> <translation id="1641113438599504367">Navigare sigură</translation> +<translation id="164269334534774161">Se afișează o versiune offline a acestei pagini de pe <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Se traduce pagina în <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Istoric</translation> <translation id="1647391597548383849">Accesează camera foto</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Setările de traducere au fost resetate.</translation> <translation id="2359808026110333948">Continuă</translation> <translation id="2381756643783702095">Solicită permisiunea înainte de trimitere (recomandat)</translation> +<translation id="2385560268894525395">din ultima săptămână</translation> <translation id="2387895666653383613">Scalarea textului</translation> <translation id="238909021488141516">A apărut o eroare la descărcarea conținutului.</translation> <translation id="2414886740292270097">Întunecat</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Actualizează pagina</translation> <translation id="2709516037105925701">Completare automată</translation> <translation id="271033894570825754">Nou</translation> +<translation id="2742271047622814453">Este posibil ca preferințele salvate pe site-uri să fie șterse</translation> <translation id="2748463065602559597">Acum afișează o pagină Google Chrome securizată.</translation> <translation id="2762000892062317888">adineauri</translation> <translation id="2770465223704140727">Elimină din listă</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Acest cont este gestionat de <ph name="PARENT_NAME_1" /> și de <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Toate drepturile rezervate.</translation> <translation id="2968755619301702150">Vizualizator de certificate</translation> +<translation id="2996291259634659425">Creează o expresie de acces</translation> <translation id="2996809686854298943">Adresă URL obligatorie</translation> <translation id="3029704984691124060">Expresiile de acces nu corespund</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Obține ajutor<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Salvați videoclipul</translation> <translation id="306566828762083630">Stocarea dispozitivului este plină. Elimină alte fișiere media pentru a elibera spațiul.</translation> <translation id="307329814453917357">Oferă traducerea paginilor folosind Google Traducere</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Activează permisiunile pentru Chrome din <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905">Date stocate: <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">Marcată</translation> +<translation id="321773570071367578">Dacă ai uitat expresia de acces sau dorești să modifici această setare, <ph name="BEGIN_LINK" />resetează sincronizarea<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Microfonul</translation> <translation id="3232754137068452469">Aplicație web</translation> <translation id="3244271242291266297">LL</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Continui pentru descărcarea conținutului?</translation> <translation id="3328801116991980348">Informații despre site</translation> <translation id="3350687908700087792">Închide toate filele incognito</translation> +<translation id="3351441609270267898">Importă datele existente</translation> <translation id="3358663646935160692">Acest cont este gestionat de <ph name="DOMAIN_NAME" />. Urmează să vă conectați cu un cont gestionat și să acordați administratorului control asupra profilului Chrome. Datele din Chrome vor fi asociate definitiv acestui cont. Dacă vă deconectați de la acest cont, datele locale Chrome se vor șterge.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Filă incognito nouă</translation> <translation id="3501331331116143684">Pagină salvată offline în <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Acceptă și continuă</translation> +<translation id="3522247891732774234">Actualizare disponibilă. Mai multe opțiuni</translation> <translation id="3527085408025491307">Dosar</translation> <translation id="3549644494707163724">Criptați toate datele sincronizate cu parola dvs. de acces pentru sincronizare</translation> <translation id="360480449234699036">Află despre subiectele de pe site-uri fără să părăsești pagina. Funcția „Atinge pentru a căuta” trimite un cuvânt și contextul aferent către Căutarea Google, afișând definiții, imagini, rezultate ale căutării și alte detalii. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Forțează activarea zoomului</translation> <translation id="3917783807003067648">Accesul la locație este blocat</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">din ultimele 4 săptămâni</translation> <translation id="393697183122708255">Nu există căutare vocală activată</translation> <translation id="3950820424414687140">Conectează-te</translation> <translation id="3988213473815854515">Accesul la locație este permis</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Deschide în filă nouă</translation> <translation id="4198229475320555619">Un marcaj de <ph name="PAGE_SIZE_STRING" /> a fost salvat offline</translation> <translation id="423410644998903704">Chrome are nevoie de acces la permisiuni pentru a-l acorda acestui site.</translation> +<translation id="424864128008805179">Te deconectezi de la Chrome?</translation> <translation id="4254813446494774748">Limba traducerii:</translation> <translation id="4256782883801055595">Licențe open source</translation> <translation id="4259722352634471385">Navigarea este blocată: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Pe viitor, paginile din apropiere care fac parte din Webul material vor fi afișate în lista de notificări</translation> <translation id="4498934959426056365">Generarea cheilor</translation> <translation id="4505554159887937799">Salvate offline</translation> +<translation id="4508440807153586353">Numai un utilizator care are expresia de acces poate citi datele criptate. Expresia de acces nu este trimisă sau stocată la Google. Dacă uiți expresia de acces sau dorești să modifici această setare, va fi necesar să resetezi sincronizarea. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Acum # zi}few{Acum # zile}other{Acum # de zile}}</translation> <translation id="4522570452068850558">Detalii</translation> <translation id="4526249700380860531">Vezi și gestionează parolele salvate la <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Filă nouă</translation> <translation id="5271967389191913893">Dispozitivul nu poate deschide conținutul de descărcat.</translation> <translation id="5275558766013849309">Filele se vor afla în același loc ca aplicațiile recente.</translation> +<translation id="5284584623296338184">Modificările marcajelor, istoricului, parolelor sau ale altor setări nu vor mai fi sincronizate cu Contul Google. Totuși, datele existente vor rămâne stocate în Contul Google.</translation> <translation id="5301954838959518834">OK, am înțeles</translation> <translation id="5302048478445481009">Limbă</translation> <translation id="5304593522240415983">Acest câmp trebuie completat</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Editează numele/parola sau excepția salvată</translation> <translation id="5442257541162692417">Editează pagina salvată</translation> <translation id="544291274896356069">Vei părăsi modul incognito dacă acest link este deschis într-o aplicație externă. Continui?</translation> +<translation id="5487521232677179737">Șterge datele</translation> <translation id="5487729733663684359">Actualizările Chrome nu mai sunt acceptate pentru această versiune de Android.</translation> <translation id="5511351932351731210">Trimite întotdeauna</translation> <translation id="5512137114520586844">Acest cont este gestionat de <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Traducere</translation> <translation id="5916664084637901428">Activat</translation> <translation id="5939518447894949180">Resetează</translation> +<translation id="5965336165840183977">Astfel, se vor șterge datele sincronizate de pe toate dispozitivele. Nu vei fi deconectat(ă) de la Contul Google. Setările salvate pentru site-uri nu vor fi șterse și pot reflecta obiceiurile de navigare.</translation> <translation id="5968595432776860642">Se redă „<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">Se accesează intrarea video</translation> <translation id="6012342843556706400">Chrome are nevoie de acces la locație pentru a-l acorda acestui site.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Conținut protejat</translation> <translation id="6612856669344839356">Salvează marcajul</translation> <translation id="6627583120233659107">Editați dosarul</translation> +<translation id="6647073004883890710">Dorești ca <ph name="PASSWORD_MANAGER_BRAND" /> să actualizeze parola pentru <ph name="USERNAME" /> de pe acest site?</translation> <translation id="6656545060687952787">Chrome necesită accesul la locație pentru a căuta dispozitive. <ph name="BEGIN_LINK" />Actualizează permisiunile<ph name="END_LINK" /></translation> <translation id="666268767214822976">Folosește un serviciu de predicții pentru a afișa interogări similare și site-uri populare în timp ce introduci text în bara de adrese.</translation> <translation id="666981079809192359">Notificare privind confidențialitatea Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Pagina salvată nu este disponibilă offline</translation> <translation id="6722992508235227685">Marcajele, istoricul, parolele și alte setări vor fi sincronizate cu Contul Google pentru a le putea folosi pe toate dispozitivele. Poți alege ce să sincronizezi în <ph name="BEGIN_LINK1" />Setări<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Se descarcă...</translation> +<translation id="6762156594045689028">Pentru a modifica această setare, <ph name="BEGIN_LINK" />resetează sincronizarea<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Sistemul Navigare sigură din Chrome va fi folosit pentru a detecta pagini rău-intenționate și pentru a te proteja împotriva phishingului, a programelor malware și a descărcărilor periculoase.</translation> <translation id="6784675033504223784">Caută „<ph name="SEARCH_TERM" />”</translation> <translation id="6790428901817661496">Redă</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Conectează-te pentru a avea marcajele, istoricul, parolele și alte setări pe toate dispozitivele</translation> <translation id="6945221475159498467">Selectează</translation> <translation id="6963766334940102469">Șterge marcaje</translation> -<translation id="6964496835063002391">Adaugă un cont</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Dosare</translation> <translation id="6978479750597523876">Resetează setările pentru traducere</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">A fost detectată o conexiune lentă</translation> <translation id="7057058088140140610">Carduri de credit și adrese folosind Google Payments</translation> <translation id="7063006564040364415">Nu s-a putut stabili conexiunea cu serverul de sincronizare.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> dorește să se asocieze cu:</translation> +<translation id="7081639897063626814">Păstrează datele existente separat</translation> <translation id="7094922512924405309">Nu au fost găsite pagini din Webul material în apropiere</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> (de) file deschise</translation> <translation id="7096034533295549981">Se încarcă video</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ajutor<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Ștergeți marcajul</translation> <translation id="7324738665594301612">Testăm utilizarea serverelor Google ca proxy-uri pentru paginile HTTPS în cadrul unui experiment.</translation> +<translation id="7346217184097589238">Setările salvate pentru site-uri nu vor fi șterse și pot reflecta obiceiurile de navigare.</translation> <translation id="7346909386216857016">Ok, am înțeles</translation> +<translation id="7347770551817603360">Conținut offline</translation> <translation id="7363354739009474003">Se încarcă videoclipul „<ph name="VIDEO_TITLE" />”</translation> <translation id="7366340029385295517">Se proiectează pe <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Tip:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Confirmă ștergerea datelor de conectare de pe dispozitiv</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (Actualizată la <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Așteaptă...</translation> +<translation id="7499262814309712782">Cont pentru sincronizare</translation> <translation id="7501135638693251872">Toate marcajele</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Se șterg datele de navigare</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Pagină salvată offline. Stocare aproape plină.</translation> <translation id="8068648041423924542">Certificatul nu poate fi selectat.</translation> <translation id="8069239273282989646">După comprimare</translation> +<translation id="8073388330009372546">Vedeți imaginea în filă nouă</translation> <translation id="8084156870963450514">Conectează-te pentru a-ți accesa tot conținutul de pe web folosind orice dispozitiv</translation> <translation id="8106211421800660735">Numărul cardului de credit</translation> <translation id="813082847718468539">Afișează informațiile privind site-ul</translation> <translation id="8137558756159375272">Funcția Atinge pentru a căuta trimite cuvântul selectat și pagina actuală drept context către Căutare Google. Poți dezactiva această funcție din <ph name="BEGIN_LINK" />Setări<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Nu a fost salvată offline</translation> <translation id="8168435359814927499">Conținut</translation> +<translation id="8173098127580644436">de la început</translation> <translation id="8200772114523450471">Reia</translation> <translation id="8209050860603202033">Deschideți imaginea</translation> <translation id="8218346974737627104">Confirmați conectarea</translation> <translation id="8218934717680664417">Acum poți căuta cu o singură atingere</translation> +<translation id="8223946939421658889">Șterge datele</translation> <translation id="8261506727792406068">Șterge</translation> <translation id="8275818695183729150">Permite (pentru căutările din bara de adrese)</translation> +<translation id="8283853025636624853">Se sincronizează cu <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">File standard</translation> <translation id="8374821112118309944">Trebuie să actualizați TalkBack la o versiune mai nouă.</translation> <translation id="8396312449826231789">Numai site-uri aprobate</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Mai întâi întreabă (recomandat)</translation> <translation id="8428213095426709021">Setări</translation> <translation id="8429160401486700187">Șterge paginile salvate</translation> +<translation id="8433057134996913067">Astfel, te vei deconecta de pe majoritatea site-urilor.</translation> <translation id="8481940801237642152">Conexiunea la acest site este privată, dar cineva din rețea ar putea să schimbe aspectul paginii.</translation> <translation id="8493948351860045254">Eliberează spațiu</translation> <translation id="8497726226069778601">Nu este nimic de văzut aici... deocamdată</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Conexiunea la acest site este privată.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Navigarea nu este accesibilă: <ph name="URL" /></translation> +<translation id="8979340629087822094">din ultima zi</translation> <translation id="8987061207681586800">Personalizează Chrome</translation> <translation id="9019902583201351841">Gestionat de părinții tăi</translation> <translation id="9020607083536754075">Închide fila actuală și revino la aplicația anterioară</translation> +<translation id="9038649477754266430">Folosește un serviciu de predicții pentru a încărca paginile mai rapid</translation> <translation id="9050666287014529139">Expresie de acces</translation> <translation id="9060538597317784206">Vezi aplicația <ph name="APP_NAME" /> în Magazinul Play. Evaluare: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Dezactivează opțiunea Versiune site pentru desktop</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb index e4a7dfa..8cee5420 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ru"> +<translation id="1040144152982955218">Поиск устройств… <ph name="BEGIN_LINK" />Справка<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Внимание</translation> <translation id="10614374240317010">Сайты, пароли для которых не сохраняются</translation> <translation id="1061441684050139317">Предоставьте браузеру Chrome доступ к микрофону, чтобы пользоваться им на этом сайте.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Добавьте аккаунт, и вы сможете работать с одними и теми же закладками, историей, паролями и другими настройками на любом устройстве.</translation> <translation id="1098052486217676340">Завершено</translation> <translation id="1121094540300013208">Отчеты об использовании и сбоях</translation> +<translation id="1137305377394488060">последний час</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1181037720776840403">Удалить</translation> <translation id="1197267115302279827">Переместить закладки</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Дудл Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Остановить</translation> <translation id="1285320974508926690">Никогда не переводить этот сайт</translation> +<translation id="1291207594882862231">Удалить файлы cookie и данные сайтов, очистить историю и кеш…</translation> <translation id="129553762522093515">Недавно закрытые</translation> <translation id="1346090444609141578">Сохраненных страниц нет</translation> <translation id="1369915414381695676">Добавлен сайт <ph name="SITE_NAME" /></translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1623104350909869708">Запретить создание дополнительных диалоговых окон на этой странице</translation> <translation id="1641113438599504367">Безопасный просмотр</translation> +<translation id="164269334534774161">Эта офлайн-копия страницы была создана <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Выполняется перевод на <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">История</translation> <translation id="1647391597548383849">Доступ к камере</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Настройки перевода сброшены</translation> <translation id="2359808026110333948">Далее</translation> <translation id="2381756643783702095">Спрашивать разрешение перед отправкой (рекомендуется)</translation> +<translation id="2385560268894525395">прошлую неделю</translation> <translation id="2387895666653383613">Масштабирование текста</translation> <translation id="238909021488141516">Во время скачивания произошла ошибка.</translation> <translation id="2414886740292270097">Темный</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Обновить страницу</translation> <translation id="2709516037105925701">Автозаполнение</translation> <translation id="271033894570825754">Новый</translation> +<translation id="2742271047622814453">Пользовательские настройки сайтов будут удалены.</translation> <translation id="2748463065602559597">Вы просматриваете безопасную страницу Google Chrome.</translation> <translation id="2762000892062317888">только что</translation> <translation id="2770465223704140727">Удалить из списка</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Этим аккаунтом управляют <ph name="PARENT_NAME_1" /> и <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">© Google Inc., <ph name="YEAR" />. Все права защищены.</translation> <translation id="2968755619301702150">Просмотр сертификатов</translation> +<translation id="2996291259634659425">Придумайте кодовую фразу</translation> <translation id="2996809686854298943">Необходимо указать URL</translation> <translation id="3029704984691124060">Кодовые фразы не совпадают</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Справка<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Сохранить видео</translation> <translation id="306566828762083630">Память устройства переполнена. Чтобы освободить место, удалите фото, видео или музыку.</translation> <translation id="307329814453917357">Предлагать переводить страницы с помощью Google Переводчика</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Разрешения для Chrome можно предоставить в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905">В памяти занято: <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">Добавлено в закладки</translation> +<translation id="321773570071367578">Если вы забыли кодовую фразу или хотите изменить эту настройку, <ph name="BEGIN_LINK" />сбросьте параметры синхронизации<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Микрофон</translation> <translation id="3232754137068452469">Веб-приложение</translation> <translation id="3244271242291266297">ММ</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Скачать?</translation> <translation id="3328801116991980348">Информация о сайте</translation> <translation id="3350687908700087792">Закрыть все вкладки инкогнито</translation> +<translation id="3351441609270267898">Импортировать добавленные ранее данные</translation> <translation id="3358663646935160692">Этот аккаунт зарегистрирован в домене <ph name="DOMAIN_NAME" />. Если вы войдете в аккаунт, администратор домена сможет управлять вашим профилем Chrome. Ваши данные будут связаны с этим аккаунтом. Если вы из него выйдете, все данные Chrome будут удалены с устройства.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Новая вкладка инкогнито</translation> <translation id="3501331331116143684">Страница сохранена в папке <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Продолжить</translation> +<translation id="3522247891732774234">Доступно обновление. Другие параметры…</translation> <translation id="3527085408025491307">Папка</translation> <translation id="3549644494707163724">Шифровать все синхронизированные данные с помощью кодовой фразы</translation> <translation id="360480449234699036">Ищите картинки, определения и другую информацию, не покидая выбранную страницу. Просто выберите слово, и оно будет отправлено в Google Поиск вместе с контекстом. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Принудительно изменять масштаб</translation> <translation id="3917783807003067648">Доступ к геоданным запрещен</translation> <translation id="3927692899758076493">Без засечек</translation> +<translation id="3931947361983910192">последние 4 недели</translation> <translation id="393697183122708255">Голосовой поиск недоступен</translation> <translation id="3950820424414687140">Вход</translation> <translation id="3988213473815854515">Доступ к геоданным разрешен</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Открыть в новой вкладке</translation> <translation id="4198229475320555619">Размер сохраненной закладки: <ph name="PAGE_SIZE_STRING" /></translation> <translation id="423410644998903704">Предоставьте браузеру Chrome разрешения, чтобы продолжить работу на этом сайте.</translation> +<translation id="424864128008805179">Выйти из Chrome?</translation> <translation id="4254813446494774748">Перевести на:</translation> <translation id="4256782883801055595">Лицензии на ПО с открытым кодом</translation> <translation id="4259722352634471385">Навигация заблокирована: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Страницы из Интернета вокруг нас будут показываться в списке оповещений.</translation> <translation id="4498934959426056365">Создание ключей</translation> <translation id="4505554159887937799">В офлайн-доступе</translation> +<translation id="4508440807153586353">Ваши зашифрованные данные может прочитать только тот, кто знает кодовую фразу. Она не пересылается и не хранится в Google. Если вы забудете фразу или решите изменить эту настройку, вам придется сбросить параметры синхронизации. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# день назад}one{# день назад}few{# дня назад}many{# дней назад}other{# дня назад}}</translation> <translation id="4522570452068850558">Подробнее</translation> <translation id="4526249700380860531">Просматривайте сохраненные пароли и управляйте ими на странице <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Новая вкладка</translation> <translation id="5271967389191913893">Не удается открыть скачанный контент.</translation> <translation id="5275558766013849309">Каждая вкладка будет отображаться в виде отдельного окна в списке открытых приложений.</translation> +<translation id="5284584623296338184">Изменения в ваших закладках, паролях, истории и других настройках больше не будут синхронизироваться с аккаунтом Google. Это изменение не затронет данные, сохраненные в аккаунте ранее.</translation> <translation id="5301954838959518834">ОК</translation> <translation id="5302048478445481009">Язык</translation> <translation id="5304593522240415983">Это поле нужно заполнить</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Изменение имени, пароля или исключения</translation> <translation id="5442257541162692417">Редактировать страницу</translation> <translation id="544291274896356069">Эта ссылка откроется во внешнем приложении, и вы выйдете из режима инкогнито. Продолжить?</translation> +<translation id="5487521232677179737">Удалить данные</translation> <translation id="5487729733663684359">Невозможно обновить Chrome в текущей версии Android.</translation> <translation id="5511351932351731210">Отправлять всегда</translation> <translation id="5512137114520586844">Этим аккаунтом управляет <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Переводчик</translation> <translation id="5916664084637901428">ВКЛ</translation> <translation id="5939518447894949180">Сбросить</translation> +<translation id="5965336165840183977">Синхронизированные данные будут удалены со всех устройств. Вы останетесь в аккаунте Google. Настройки сайтов не изменятся, а следовательно сохранятся и данные о вашей работе в Интернете.</translation> <translation id="5968595432776860642">Воспроизведение видео "<ph name="VIDEO_TITLE" />"</translation> <translation id="6010869025736512584">Доступ к видеовходу</translation> <translation id="6012342843556706400">Предоставьте браузеру Chrome доступ к геоданным, чтобы продолжить работу на этом сайте.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Защищенное содержание</translation> <translation id="6612856669344839356">Сохранить закладку</translation> <translation id="6627583120233659107">Изменить папку</translation> +<translation id="6647073004883890710">Сохранить в <ph name="PASSWORD_MANAGER_BRAND" /> новый пароль пользователя <ph name="USERNAME" /> для этого сайта?</translation> <translation id="6656545060687952787">Чтобы выполнить поиск устройств, браузеру Chrome нужен доступ к геоданным. <ph name="BEGIN_LINK" />Обновить разрешения<ph name="END_LINK" /></translation> <translation id="666268767214822976">Показывать подсказки с похожими запросами и часто посещаемыми сайтами по мере ввода в адресную строку</translation> <translation id="666981079809192359">Примечание о конфиденциальности Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Страница недоступна в офлайн-режиме</translation> <translation id="6722992508235227685">Пароли, закладки, история и другие параметры будут синхронизированы с аккаунтом Google, чтобы у вас был доступ к ним на любом устройстве. Выбрать данные для синхронизации можно в <ph name="BEGIN_LINK1" />Настройках<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Скачивание…</translation> +<translation id="6762156594045689028">Чтобы изменить эту настройку, <ph name="BEGIN_LINK" />сбросьте параметры синхронизации<ph name="END_LINK" />.</translation> <translation id="6770414673596662518">Функция "Безопасный просмотр" также позволяет обнаружить подозрительные страницы и защитить устройство от фишинга и вредоносного ПО.</translation> <translation id="6784675033504223784">Искать "<ph name="SEARCH_TERM" />"</translation> <translation id="6790428901817661496">Воспроизвести</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Войдите в аккаунт, чтобы синхронизировать закладки, историю, пароли и другие настройки на всех устройствах.</translation> <translation id="6945221475159498467">Выбрать</translation> <translation id="6963766334940102469">Удалить закладки</translation> -<translation id="6964496835063002391">Добавить аккаунт</translation> <translation id="6965382102122355670">ОК</translation> <translation id="6973630695168034713">Папки</translation> <translation id="6978479750597523876">Сбросить настройки перевода</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Низкая скорость подключения</translation> <translation id="7057058088140140610">Банковские карты и адреса с помощью Google Payments</translation> <translation id="7063006564040364415">Не удалось связаться с сервером синхронизации</translation> +<translation id="7074853159844403180">Сайт <ph name="SITE" /> запрашивает подключение к следующему устройству:</translation> +<translation id="7081639897063626814">Хранить добавленные ранее данные отдельно</translation> <translation id="7094922512924405309">Ничего не найдено</translation> <translation id="7095930899177687653">Открыто вкладок: <ph name="OPEN_TABS" /></translation> <translation id="7096034533295549981">Загрузка видео…</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Справка<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Удалить закладку</translation> <translation id="7324738665594301612">Мы тестируем новую функцию: серверы Google сжимают данные HTTPS-страниц.</translation> +<translation id="7346217184097589238">Настройки сайтов не изменятся, а следовательно сохранятся и данные о вашей работе в Интернете.</translation> <translation id="7346909386216857016">ОК</translation> +<translation id="7347770551817603360">Офлайн-контент</translation> <translation id="7363354739009474003">Загрузка видео "<ph name="VIDEO_TITLE" />"…</translation> <translation id="7366340029385295517">Транслируется на экран устройства "<ph name="SCREEN_NAME" />"</translation> <translation id="7375125077091615385">Тип:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Подтвердите удаление учетных данных устройства</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (последнее обновление: <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Подождите…</translation> +<translation id="7499262814309712782">Аккаунт для синхронизации</translation> <translation id="7501135638693251872">Все закладки</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Очистить историю</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Сохранено. Свободное место заканчивается.</translation> <translation id="8068648041423924542">Невозможно выбрать сертификат.</translation> <translation id="8069239273282989646">После сжатия</translation> +<translation id="8073388330009372546">Открыть в новой вкладке</translation> <translation id="8084156870963450514">Войдите в аккаунт и получите доступ к своим данным, например вкладкам и истории просмотров, на любом устройстве</translation> <translation id="8106211421800660735">Номер карты</translation> <translation id="813082847718468539">Сведения о сайте</translation> <translation id="8137558756159375272">Функция "Нажмите для поиска" отправляет в Google выбранное слово, а также текущую страницу в качестве контекста. Включить или отключить эту функцию можно в <ph name="BEGIN_LINK" />настройках<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Не сохранено в офлайн-доступе</translation> <translation id="8168435359814927499">Контент</translation> +<translation id="8173098127580644436">все время</translation> <translation id="8200772114523450471">Возобновить</translation> <translation id="8209050860603202033">Открыть изображение</translation> <translation id="8218346974737627104">Подтвердите вход</translation> <translation id="8218934717680664417">Теперь поиск работает в одно касание!</translation> +<translation id="8223946939421658889">Удалить данные за</translation> <translation id="8261506727792406068">Удалить</translation> <translation id="8275818695183729150">Разрешать (для поиска в адресной строке)</translation> +<translation id="8283853025636624853">Синхронизация с аккаунтом <ph name="SYNC_ACCOUNT_USER_NAME" />…</translation> <translation id="8310344678080805313">Обычные вкладки</translation> <translation id="8374821112118309944">Установите последнюю версию TalkBack.</translation> <translation id="8396312449826231789">Только одобренные сайты</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Всегда спрашивать (рекомендуется)</translation> <translation id="8428213095426709021">Настройки</translation> <translation id="8429160401486700187">Удалить страницы</translation> +<translation id="8433057134996913067">На большинстве сайтов будет выполнен выход из аккаунта.</translation> <translation id="8481940801237642152">Подключение к веб-сайту защищено, но посторонний пользователь может изменить вид страницы</translation> <translation id="8493948351860045254">Освободить место</translation> <translation id="8497726226069778601">Здесь появятся часто посещаемые страницы</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Подключение к веб-сайту защищено</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Страница не найдена: <ph name="URL" /></translation> +<translation id="8979340629087822094">вчерашний день</translation> <translation id="8987061207681586800">Ваш персональный Chrome</translation> <translation id="9019902583201351841">Управляется вашими родителями</translation> <translation id="9020607083536754075">Закрыть текущую вкладку и вернуться к приложению</translation> +<translation id="9038649477754266430">Использовать подсказки для ускорения загрузки страниц</translation> <translation id="9050666287014529139">Кодовая фраза</translation> <translation id="9060538597317784206">Перейти к приложению "<ph name="APP_NAME" />" в Play Маркете. Рейтинг: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Выключить полную версию сайта</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb index 7cb0f7c..735e79c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Sviatočné logo Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Zastaviť</translation> <translation id="1285320974508926690">Nikdy neprekladať tieto webové stránky</translation> +<translation id="1291207594882862231">Vymazať históriu, súbory cookie, údaje stránok, vyrovnávaciu pamäť…</translation> <translation id="129553762522093515">Naposledy zatvorené</translation> <translation id="1346090444609141578">Nie sú tu uložené žiadne stránky</translation> <translation id="1369915414381695676">Boli pridané stránky <ph name="SITE_NAME" /></translation> @@ -51,6 +52,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Zakázať tejto stránke otvárať ďalšie dialógové okná</translation> <translation id="1641113438599504367">Bezpečné prehliadanie</translation> +<translation id="164269334534774161">Zobrazuje sa offline kópia tejto stránky z <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Stránka sa prekladá do jazyka <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">História</translation> <translation id="1647391597548383849">Prístup ku kamere</translation> @@ -127,6 +129,7 @@ <translation id="2707726405694321444">Obnoviť stránku</translation> <translation id="2709516037105925701">Automatické dopĺňanie</translation> <translation id="271033894570825754">Nové</translation> +<translation id="2742271047622814453">Uložené predvoľby webov môžu byť vymazané</translation> <translation id="2748463065602559597">Práve si prezeráte zabezpečenú stránku prehliadača Google Chrome.</translation> <translation id="2762000892062317888">práve teraz</translation> <translation id="2770465223704140727">Odstrániť zo zoznamu</translation> @@ -167,6 +170,7 @@ <translation id="3303414029551471755">Pokračovať a stiahnuť obsah?</translation> <translation id="3328801116991980348">Informácie o stránkach</translation> <translation id="3350687908700087792">Zavrieť všetky karty inkognito</translation> +<translation id="3351441609270267898">Importovanie existiujúcich údajov</translation> <translation id="3358663646935160692">Tento účet spravuje doména <ph name="DOMAIN_NAME" />. Prihlasujete sa pomocou spravovaného účtu a jeho správcovi tak umožňujete úplnú kontrolu nad vaším profilom Chrome. Vaše údaje prehliadača Chrome sa natrvalo prepoja s týmto účtom. Po odpojení tohto účtu sa odstránia miestne údaje prehliadača Chrome.</translation> @@ -178,6 +182,7 @@ <translation id="3492207499832628349">Nová karta inkognito</translation> <translation id="3501331331116143684">Stránka bola uložená offline do priečinka <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Prijať a pokračovať</translation> +<translation id="3522247891732774234">K dispozícii je aktualizácia. Ďalšie možnosti</translation> <translation id="3527085408025491307">Priečinok</translation> <translation id="3549644494707163724">Šifrovať všetky synchronizované údaje pomocou vlastnej prístupovej frázy pre synchronizáciu</translation> <translation id="360480449234699036">Získajte informácie o témach na weboch bez toho, aby ste danú stránku museli opustiť. Funkcia Vyhľadávanie klepnutím odošle slovo a súvisiaci kontext do Vyhľadávania Google a vráti definície, obrázky, výsledky vyhľadávania a ďalšie podrobnosti. @@ -220,7 +225,6 @@ <translation id="4195643157523330669">Otvoriť na novej karte</translation> <translation id="4198229475320555619">Veľkosť záložky uloženej offline: <ph name="PAGE_SIZE_STRING" /></translation> <translation id="423410644998903704">Na to, aby Chrome mohol s týmito webovými stránkami zdieľať povolenia, musí mať k ním prístup.</translation> -<translation id="4247939399682707041">Nahradiť údaje na tomto zariadení údajmi z účtu <ph name="ACCOUNT" />. Svoje súčasné údaje budete môcť získať prepnutím späť do účtu <ph name="ACCOUNT" />.</translation> <translation id="424864128008805179">Odhlásiť sa z prehliadača Chrome?</translation> <translation id="4254813446494774748">Jazyk prekladu:</translation> <translation id="4256782883801055595">Licencie open source</translation> @@ -424,6 +428,7 @@ <translation id="6612358246767739896">Chránený obsah</translation> <translation id="6612856669344839356">Uložiť záložku</translation> <translation id="6627583120233659107">Upraviť priečinok</translation> +<translation id="6647073004883890710">Chcete, aby aplikácia <ph name="PASSWORD_MANAGER_BRAND" /> aktualizovala heslo používateľa <ph name="USERNAME" /> pre tento web?</translation> <translation id="6656545060687952787">Na to, aby mohol Chrome hľadať zariadenia, musí mať prístup k polohe. <ph name="BEGIN_LINK" />Aktualizovať povolenia<ph name="END_LINK" /></translation> <translation id="666268767214822976">Použite službu predpovedí na zobrazovanie súvisiacich dopytov a populárnych webových stránok počas zadávania textu do panela s adresou</translation> <translation id="666981079809192359">Upozornenie o ochrane osobných údajov prehliadača Chrome</translation> @@ -451,7 +456,6 @@ <translation id="6868088497967843822">Prihláste sa a získate tak svoje záložky, históriu, heslá a ďalšie nastavenia na všetkých svojich zariadeniach.</translation> <translation id="6945221475159498467">Vybrať</translation> <translation id="6963766334940102469">Odstrániť záložky</translation> -<translation id="6964496835063002391">Pridať účet</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Priečinky</translation> <translation id="6978479750597523876">Obnoviť nastavenia prekladov</translation> @@ -483,6 +487,7 @@ <translation id="7324738665594301612">Vedenie stránok HTTPS cez servery Google testujeme ako súčasť experimentu.</translation> <translation id="7346217184097589238">Uložené nastavenia webov sa neodstránia a môžu odrážať vaše návyky prehliadania.</translation> <translation id="7346909386216857016">Ok, dobre</translation> +<translation id="7347770551817603360">Offline obsah</translation> <translation id="7363354739009474003">Načítava sa video <ph name="VIDEO_TITLE" /></translation> <translation id="7366340029385295517">Prenáša sa na obrazovku <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Typ:</translation> @@ -543,6 +548,7 @@ <translation id="8050319187894766337">Uložené offline. Úložisko je takmer plné.</translation> <translation id="8068648041423924542">Nedá sa vybrať certifikát</translation> <translation id="8069239273282989646">Po kompresii</translation> +<translation id="8073388330009372546">Otvoriť obrázok na novej karte</translation> <translation id="8084156870963450514">Prihláste sa a získajte prístup k všetkým svojim položkám na webe z ľubovoľného zariadenia</translation> <translation id="8106211421800660735">Číslo kreditnej karty</translation> <translation id="813082847718468539">Zobraziť informácie o stránkach</translation> @@ -565,6 +571,7 @@ <translation id="8413385045638830869">Najprv sa opýtať (odporúčané)</translation> <translation id="8428213095426709021">Nastavenia</translation> <translation id="8429160401486700187">Odstrániť uložené stránky</translation> +<translation id="8433057134996913067">Táto možnosť vás odhlási z väčšiny webov.</translation> <translation id="8481940801237642152">Vaše pripojenie k týmto stránkam je súkromné, ale niekto v sieti možno dokáže zmeniť vzhľad danej stránky.</translation> <translation id="8493948351860045254">Uvoľniť miesto</translation> <translation id="8497726226069778601">Zatiaľ tu nič nie je…</translation> @@ -607,6 +614,7 @@ <translation id="8987061207681586800">Prispôsobte si Chrome</translation> <translation id="9019902583201351841">Spravované vašimi rodičmi</translation> <translation id="9020607083536754075">Zavrieť aktuálnu kartu a prejsť do predchádzajúcej aplikácie</translation> +<translation id="9038649477754266430">Používať službu predpovedí na rýchlejšie načítanie stránok</translation> <translation id="9050666287014529139">Prístupová fráza</translation> <translation id="9060538597317784206">Zobraziť aplikáciu <ph name="APP_NAME" /> v Obchode Play. Hodnotenie: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Vypnutie žiadosti o verziu stránok pre počítače</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb index 394d502..470b778 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sl"> +<translation id="1040144152982955218">Iskanje naprav … <ph name="BEGIN_LINK" />Poiščite pomoč<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Opozorilo</translation> <translation id="10614374240317010">Nikoli shranjeno</translation> <translation id="1061441684050139317">Chrome potrebuje dostop do mikrofona, če želite, da temu spletnemu mestu omogoči dostop do njega.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Dodajte račun, da boste lahko dostopali do zaznamkov, zgodovine gesel in drugih nastavitev v vseh svojih napravah.</translation> <translation id="1098052486217676340">Končano</translation> <translation id="1121094540300013208">Poročila o uporabi in zrušitvah</translation> +<translation id="1137305377394488060">zadnje ure</translation> <translation id="1178581264944972037">Prekini</translation> <translation id="1181037720776840403">Odstrani</translation> <translation id="1197267115302279827">Premakni zavihke</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Googlov priložnostni logotip: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Ustavi</translation> <translation id="1285320974508926690">Nikoli ne prevedi tega spletnega mesta</translation> +<translation id="1291207594882862231">Izbris zgodovine, piškotkov, podatkov spletnih mest, predpomnilnika …</translation> <translation id="129553762522093515">Nedavno zaprto</translation> <translation id="1346090444609141578">Tu ni shranjenih strani</translation> <translation id="1369915414381695676">Spletno mesto <ph name="SITE_NAME" /> je bilo dodano</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Tej strani prepreči, da bi ustvarila dodatna pogovorna okna</translation> <translation id="1641113438599504367">Varno brskanje</translation> +<translation id="164269334534774161">Ogledujete si kopijo te strani brez povezave z dne <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Prevajanje strani v jezik <ph name="SOURCE_LANGUAGE" /> ...</translation> <translation id="1644574205037202324">Zgodovina</translation> <translation id="1647391597548383849">Dostop do fotoaparata</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Nastavitve za prevajanje so ponastavljene.</translation> <translation id="2359808026110333948">Nadaljuj</translation> <translation id="2381756643783702095">Vprašaj pred pošiljanjem (priporočljivo)</translation> +<translation id="2385560268894525395">zadnjega tedna</translation> <translation id="2387895666653383613">Prilagajanje besedila</translation> <translation id="238909021488141516">Pri prenosu vsebine je prišlo do napake.</translation> <translation id="2414886740292270097">Temno</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Osveži stran</translation> <translation id="2709516037105925701">Samodejno izpolnjevanje</translation> <translation id="271033894570825754">Novo</translation> +<translation id="2742271047622814453">Morda bodo izbrisane shranjene nastavitve na spletnih mestih</translation> <translation id="2748463065602559597">Ogledujete si varno stran Google Chrome.</translation> <translation id="2762000892062317888">pravkar</translation> <translation id="2770465223704140727">Odstrani s seznama</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Ta računa upravljata <ph name="PARENT_NAME_1" /> in <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. Vse pravice pridržane.</translation> <translation id="2968755619301702150">Pregledovalnik potrdil</translation> +<translation id="2996291259634659425">Ustvarjanje gesla</translation> <translation id="2996809686854298943">URL je obvezen</translation> <translation id="3029704984691124060">Gesli se ne ujemata</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Poiščite pomoč<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Shrani videoposnetek</translation> <translation id="306566828762083630">Shramba v napravi je polna. Odstranite drugo predstavnost, če želite sprostiti nekaj prostora.</translation> <translation id="307329814453917357">Ponudi prevajanje strani z Google Prevajalnikom</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">V <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" /> vklopite dovoljenja za Chrome.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> shranjenih podatkov</translation> <translation id="3207960819495026254">Zaznamovano</translation> +<translation id="321773570071367578">Če ste pozabili geslo ali želite spremeniti to nastavitev, <ph name="BEGIN_LINK" />ponastavite sinhronizacijo<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Spletna aplikacija</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Ali želite prenesti vsebino?</translation> <translation id="3328801116991980348">Podatki o mestu</translation> <translation id="3350687908700087792">Zapri vse zavihke brez beleženja zgodovine</translation> +<translation id="3351441609270267898">Uvoz obstoječih podatkov</translation> <translation id="3358663646935160692">Ta račun upravlja domena <ph name="DOMAIN_NAME" />. Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nadziranje vašega profila v Google Chromu. Vaši podatki v Google Chromu bodo trajno povezani s tem računom. Če prekinete povezavo s tem računom, se izbrišejo lokalni podatki v Google Chromu.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Nov zavihek brez beleženja zgodovine</translation> <translation id="3501331331116143684">Stran je shranjena za uporabo brez povezave v mapo <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Sprejmi in nadaljuj</translation> +<translation id="3522247891732774234">Posodobitev je na voljo. Več možnosti.</translation> <translation id="3527085408025491307">Mapa</translation> <translation id="3549644494707163724">Šifrirajte vse sinhronizirane podatke s svojim geslom</translation> <translation id="360480449234699036">Več informacij o temah na spletnih mestih, ne da bi zapustili stran. Možnost »Dotaknite se za iskanje« pošlje besedo in njeno sobesedilo Iskanju Google in vrne definicije, slike, rezultate iskanja in druge podrobnosti. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Vsili povečavo</translation> <translation id="3917783807003067648">Lokacija je blokirana</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">zadnjih 4 tednov</translation> <translation id="393697183122708255">Glasovno iskanje ni na voljo</translation> <translation id="3950820424414687140">Prijava</translation> <translation id="3988213473815854515">Lokacija je dovoljena</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Odpri v novem zavihku</translation> <translation id="4198229475320555619">Zaznamek velikosti <ph name="PAGE_SIZE_STRING" /> je shranjen za uporabo brez povezave</translation> <translation id="423410644998903704">Chrome potrebuje dostop do dovoljenj, če želite, da temu spletnemu mestu omogoči dostop do njih.</translation> +<translation id="424864128008805179">Se želite odjaviti iz Chroma?</translation> <translation id="4254813446494774748">Jezik prevoda:</translation> <translation id="4256782883801055595">Odprtokodne licence</translation> <translation id="4259722352634471385">Krmarjenje je blokirano: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Prihodnje strani za Fizični splet v bližini bodo prikazane na seznamu obvestil.</translation> <translation id="4498934959426056365">Ustvarjanje ključa</translation> <translation id="4505554159887937799">Shran. za način brez po.</translation> +<translation id="4508440807153586353">Vaše šifrirane podatke lahko bere samo oseba z vašim geslom. Geslo ni poslano Googlu in ni shranjeno v Googlu. Če ga pozabite ali če želite spremeniti to nastavitev, boste morali sinhronizacijo ponastaviti. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Pred # dnevom}one{Pred # dnevom}two{Pred # dnevoma}few{Pred # dnevi}other{Pred # dnevi}}</translation> <translation id="4522570452068850558">Podrobnosti</translation> <translation id="4526249700380860531">Ogled in upravljanje shranjenih gesel na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Nov zavihek</translation> <translation id="5271967389191913893">Naprava ne more odpreti vsebine za prenos.</translation> <translation id="5275558766013849309">Zavihki bodo prikazani skupaj z nedavno uporabljenimi aplikacijami.</translation> +<translation id="5284584623296338184">Spremembe zaznamkov, zgodovine, gesel in drugih nastavitev ne bodo več sinhronizirane z Google Računom. Obstoječi podatki bodo še naprej shranjeni v Google Računu.</translation> <translation id="5301954838959518834">V redu, razumem</translation> <translation id="5302048478445481009">Jezik</translation> <translation id="5304593522240415983">To polje ne sme biti prazno</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Urejanje shranjenega imena/gesla ali izjeme</translation> <translation id="5442257541162692417">Uredite shranjeno stran</translation> <translation id="544291274896356069">Če je ta povezava odprta v zunanji aplikaciji, boste ustavili način brez beleženja zgodovine. Želite nadaljevati?</translation> +<translation id="5487521232677179737">Izbriši podatke</translation> <translation id="5487729733663684359">Posodobitve za Chrome v tej različici Androida niso več podprte.</translation> <translation id="5511351932351731210">Vedno pošlji</translation> <translation id="5512137114520586844">Ta račun upravlja <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Prevajalnik</translation> <translation id="5916664084637901428">Vklopljeno</translation> <translation id="5939518447894949180">Ponastavi</translation> +<translation id="5965336165840183977">S tem izbrišete sinhronizirane podatke iz vseh naprav. Ne boste odjavljeni iz Google Računa. Shranjene nastavitve mest ne bodo izbrisane in morda kažejo vaše navade brskanja.</translation> <translation id="5968595432776860642">Predvajanje: »<ph name="VIDEO_TITLE" />«</translation> <translation id="6010869025736512584">Dostopanje do videovhoda</translation> <translation id="6012342843556706400">Chrome potrebuje dostop do lokacije, če želite, da temu spletnemu mestu omogoči dostop do nje.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Zaščitena vsebina</translation> <translation id="6612856669344839356">Shrani zaznamek</translation> <translation id="6627583120233659107">Uredi mapo</translation> +<translation id="6647073004883890710">Ali želite, da <ph name="PASSWORD_MANAGER_BRAND" /> posodobi geslo za uporabniško ime <ph name="USERNAME" /> za to spletno mesto?</translation> <translation id="6656545060687952787">Chrome za iskanje naprav potrebuje dostop do lokacije. <ph name="BEGIN_LINK" />Posodobite dovoljenja<ph name="END_LINK" /></translation> <translation id="666268767214822976">S storitvijo predvidevanja lahko med vnašanjem v naslovno vrstico prikažete povezane poizvedbe in priljubljena spletna mesta</translation> <translation id="666981079809192359">Obvestilo o zasebnosti za Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Shranjena stran ni na voljo brez povezave</translation> <translation id="6722992508235227685">Vaši zaznamki, zgodovina, gesla in druge nastavitve bodo sinhronizirani z Google Računom, tako da jih boste lahko uporabljali v vseh napravah. V <ph name="BEGIN_LINK1" />nastavitvah<ph name="END_LINK1" /> lahko izberete, kaj želite sinhronizirati.</translation> <translation id="6738867403308150051">Prenašanje ...</translation> +<translation id="6762156594045689028">Če želite spremeniti to nastavitev, <ph name="BEGIN_LINK" />ponastavite sinhronizacijo<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Chromov sistem varnega brskanja bo uporabljen za odkrivanje strani z zlonamerno vsebino in zaščito pred lažnim predstavljanjem, zlonamerno programsko opremo in škodljivimi prenosi.</translation> <translation id="6784675033504223784">Iskanje izraza »<ph name="SEARCH_TERM" />«</translation> <translation id="6790428901817661496">Predvajanje</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Prijavite se, da boste lahko dostopali do zaznamkov, zgodovine, gesel in drugih nastavitev v vseh napravah.</translation> <translation id="6945221475159498467">Izberi</translation> <translation id="6963766334940102469">Izbriši zaznamke</translation> -<translation id="6964496835063002391">Dodajanje računa</translation> <translation id="6965382102122355670">V redu</translation> <translation id="6973630695168034713">Mape</translation> <translation id="6978479750597523876">Ponastavljanje nastavitev za prevajanje</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Zaznana je počasna povezava</translation> <translation id="7057058088140140610">Kreditne kartice in naslovi s storitvijo Google Payments</translation> <translation id="7063006564040364415">Povezave s strežnikom za sinhronizacijo ni bilo mogoče vzpostaviti.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> želi opraviti seznanitev z napravo:</translation> +<translation id="7081639897063626814">Obstoječi podatki naj bodo ločeni</translation> <translation id="7094922512924405309">Ni strani za Fizični splet v bližini</translation> <translation id="7095930899177687653">Odprtih je toliko zavihkov: <ph name="OPEN_TABS" /></translation> <translation id="7096034533295549981">Nalaganje videa</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Pomoč<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Izbriši zaznamek</translation> <translation id="7324738665594301612">Prenos strani HTTPS prek Googlovih strežnikov proxy preskušamo v okviru preskusa.</translation> +<translation id="7346217184097589238">Shranjene nastavitve mest ne bodo izbrisane in morda kažejo vaše navade brskanja.</translation> <translation id="7346909386216857016">V redu, razumem</translation> +<translation id="7347770551817603360">Vsebina brez povezave</translation> <translation id="7363354739009474003">Nalaganje videoposnetka »<ph name="VIDEO_TITLE" />«</translation> <translation id="7366340029385295517">Predvajanje na zaslonu <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Vrsta:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Potrditev izbrisa poverilnice naprave</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (Posodobljeno: <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Počakajte …</translation> +<translation id="7499262814309712782">Račun za sinhronizacijo</translation> <translation id="7501135638693251872">Vsi zaznamki</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Brisanje podatkov brskanja</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Stran je shranjena za način brez povezave. Shramba je skoraj polna.</translation> <translation id="8068648041423924542">Izbira potrdila ni mogoča</translation> <translation id="8069239273282989646">Po stiskanju</translation> +<translation id="8073388330009372546">Odpri sliko na novem zavihku</translation> <translation id="8084156870963450514">Prijavite se za dostop do vseh vaših spletnih stvari iz poljubne naprave</translation> <translation id="8106211421800660735">Številka kreditne kartice</translation> <translation id="813082847718468539">Ogled podatkov o mestu</translation> <translation id="8137558756159375272">»Dotaknite se za iskanje« pošlje izbrano besedo in trenutno strank kot kontekst Iskanju Google. To lahko izklopite v <ph name="BEGIN_LINK" />nastavitvah<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Ni shranjena za način brez povezave</translation> <translation id="8168435359814927499">Vsebina</translation> +<translation id="8173098127580644436">od začetka</translation> <translation id="8200772114523450471">Nadaljuj</translation> <translation id="8209050860603202033">Odpri sliko</translation> <translation id="8218346974737627104">Potrditev prijave</translation> <translation id="8218934717680664417">Zdaj lahko iščete z enim dotikom</translation> +<translation id="8223946939421658889">Brisanje podatkov</translation> <translation id="8261506727792406068">Izbriši</translation> <translation id="8275818695183729150">Omogočeno (za iskanja v naslovni vrstici)</translation> +<translation id="8283853025636624853">Sinhronizacija z računom <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Standardni zavihki</translation> <translation id="8374821112118309944">TalkBack morate posodobiti na novejšo različico.</translation> <translation id="8396312449826231789">Samo odobrena spletna mesta</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Najprej vprašaj (priporočeno)</translation> <translation id="8428213095426709021">Nastavitve</translation> <translation id="8429160401486700187">Izbriši shranjene strani</translation> +<translation id="8433057134996913067">S tem boste odjavljeni z večine spletnih mest.</translation> <translation id="8481940801237642152">Povezava s tem mestom je zasebna, vendar lahko nekdo v omrežju spremeni videz strani.</translation> <translation id="8493948351860045254">Sprosti prostor</translation> <translation id="8497726226069778601">Nimate česa videti ... Za zdaj.</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Povezava s tem mestom je zasebna.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Krmarjenje ni dosegljivo: <ph name="URL" /></translation> +<translation id="8979340629087822094">zadnjega dne</translation> <translation id="8987061207681586800">Prilagodite si Chrome</translation> <translation id="9019902583201351841">Upravljajo starši</translation> <translation id="9020607083536754075">Zapri trenutni zavihek in nazaj na prejšnjo aplikacijo</translation> +<translation id="9038649477754266430">Uporaba storitve predvidevanja za hitrejše nalaganje strani</translation> <translation id="9050666287014529139">Geslo</translation> <translation id="9060538597317784206">Ogled aplikacije <ph name="APP_NAME" /> v Trgovini Play. Ocena: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Izklop možnosti »Zahteva za namizno spletno mesto«</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb index 67558b9f..2b656e9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sr"> +<translation id="1040144152982955218">Тражимо уређаје… <ph name="BEGIN_LINK" />Потражите помоћ<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Упозорење</translation> <translation id="10614374240317010">Никада се не чува</translation> <translation id="1061441684050139317">Chrome-у је потребан приступ за микрофон да би га делио са овим сајтом.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Додајте налог да би вам обележивачи, историја, лозинке и друга подешавања били доступни на свим уређајима.</translation> <translation id="1098052486217676340">Завршено је</translation> <translation id="1121094540300013208">Извештаји о коришћењу и отказивању</translation> +<translation id="1137305377394488060">прошли сат</translation> <translation id="1178581264944972037">Паузирај</translation> <translation id="1181037720776840403">Уклони</translation> <translation id="1197267115302279827">Премести обележиваче</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google дудл логотип: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Заустави</translation> <translation id="1285320974508926690">Никад не преводи овај сајт</translation> +<translation id="1291207594882862231">Обришите историју, колачиће, податке о сајтовима, кеш...</translation> <translation id="129553762522093515">Недавно затворено</translation> <translation id="1346090444609141578">Овде нема сачуваних страница</translation> <translation id="1369915414381695676">Сајт <ph name="SITE_NAME" /> је додат</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Камеру</translation> <translation id="1623104350909869708">Спречи ову страницу да прави додатне дијалоге</translation> <translation id="1641113438599504367">Безбедно прегледање</translation> +<translation id="164269334534774161">Приказује се офлајн копија ове странице од <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Страница се преводи на <ph name="SOURCE_LANGUAGE" />...</translation> <translation id="1644574205037202324">Историја</translation> <translation id="1647391597548383849">Приступ камери</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Подешавања за превођење су ресетована.</translation> <translation id="2359808026110333948">Настави</translation> <translation id="2381756643783702095">Питај пре слања (препоручује се)</translation> +<translation id="2385560268894525395">прошла недеља</translation> <translation id="2387895666653383613">Промена величине текста</translation> <translation id="238909021488141516">Дошло је до грешке при преузимању садржаја.</translation> <translation id="2414886740292270097">Тамнa</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Освежи страницу</translation> <translation id="2709516037105925701">Аутоматско попуњавање</translation> <translation id="271033894570825754">Ново</translation> +<translation id="2742271047622814453">Сачувана подешавања на сајтовима ће можда бити избрисана</translation> <translation id="2748463065602559597">Прегледате безбедну Google Chrome страницу.</translation> <translation id="2762000892062317888">малопре</translation> <translation id="2770465223704140727">Уклони са листе</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Овим налогом управљају <ph name="PARENT_NAME_1" /> и <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Ауторска права <ph name="YEAR" />. Google Inc. Сва права задржана.</translation> <translation id="2968755619301702150">Приказивач сертификата</translation> +<translation id="2996291259634659425">Направите приступну фразу</translation> <translation id="2996809686854298943">URL је обавезан</translation> <translation id="3029704984691124060">Приступне фразе се не подударају</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Потражите помоћ<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Сачувај видео</translation> <translation id="306566828762083630">Меморијски простор уређаја је пун. Уклоните друге медије да бисте ослободили простор.</translation> <translation id="307329814453917357">Нуди превод страница помоћу Google преводиоца</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Укључите дозволе за Chrome у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> сачуваних података</translation> <translation id="3207960819495026254">Обележено</translation> +<translation id="321773570071367578">Ако сте заборавили приступну фразу или желите да промените ово подешавање, <ph name="BEGIN_LINK" />ресетујте синхронизацију<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Микрофон</translation> <translation id="3232754137068452469">Веб-апликација</translation> <translation id="3244271242291266297">ММ</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Желите ли да наставите са преузимањем садржаја?</translation> <translation id="3328801116991980348">Информације о сајту</translation> <translation id="3350687908700087792">Затвори све картице без архивирања</translation> +<translation id="3351441609270267898">Увези постојеће податке</translation> <translation id="3358663646935160692">Овим налогом управља <ph name="DOMAIN_NAME" />. Пријављујете се помоћу управљаног налога и дајете администратору контролу над Chrome профилом. Chrome подаци ће постати трајно повезани са овим налогом. Ако прекинете везу са овим налогом, избрисаћете локалне Chrome податке.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Нова картица без архивирања</translation> <translation id="3501331331116143684">Сачували сте страницу офлајн у директоријуму <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Прихвати и настави</translation> +<translation id="3522247891732774234">Ажурирање је доступно. Још опција</translation> <translation id="3527085408025491307">Директоријум</translation> <translation id="3549644494707163724">Шифруј све синхронизоване податке помоћу моје приступне фразе за синхронизацију</translation> <translation id="360480449234699036">Сазнајте више о темама на веб-сајтовима без напуштања странице. Функција Додирните за претрагу шаље реч и околни контекст у Google претрагу и приказује дефиниције, слике, резултате претраге и друге детаље. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Принудно омогући зумирање</translation> <translation id="3917783807003067648">Локација је блокирана</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">последње 4 недеље</translation> <translation id="393697183122708255">Није доступна нијед. омогућ. глас. прет.</translation> <translation id="3950820424414687140">Пријави ме</translation> <translation id="3988213473815854515">Локација је дозвољена</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Отвори у новој картици</translation> <translation id="4198229475320555619">Сачували сте обележивач од <ph name="PAGE_SIZE_STRING" /> офлајн</translation> <translation id="423410644998903704">Chrome-у је потребан приступ за дозволе да би их делио са овим сајтом.</translation> +<translation id="424864128008805179">Желите ли да се одјавите из Chrome-а?</translation> <translation id="4254813446494774748">Језик на који се преводи:</translation> <translation id="4256782883801055595">Лиценце отвореног кода</translation> <translation id="4259722352634471385">Навигација је блокирана: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Будуће странице Интернета око нас у околини ће се приказивати у листи обавештења</translation> <translation id="4498934959426056365">Генерисање шифара</translation> <translation id="4505554159887937799">Сачувано офлајн</translation> +<translation id="4508440807153586353">Само неко ко има приступну фразу може да чита шифроване податке. Google не шаље нити чува приступну фразу. Ако заборавите приступну фразу или желите да промените ово подешавање, мораћете да ресетујете синхронизацију. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Пре # дана}one{Пре # дана}few{Пре # дана}other{Пре # дана}}</translation> <translation id="4522570452068850558">Детаљи</translation> <translation id="4526249700380860531">Прегледајте сачуване лозинке и управљајте њима на <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Нова картица</translation> <translation id="5271967389191913893">Уређај не може да отвори садржај за преузимање.</translation> <translation id="5275558766013849309">Картице ће се приказивати заједно са недавним апликацијама.</translation> +<translation id="5284584623296338184">Промене обележивача, историје, лозинки и других подешавања се више неће синхронизовати са Google налогом. Међутим, постојећи подаци ће остати сачувани на Google налогу.</translation> <translation id="5301954838959518834">Важи</translation> <translation id="5302048478445481009">Језик</translation> <translation id="5304593522240415983">Ово поље не сме да буде празно</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Мењање сачуваног имена/лозинке или изузетка</translation> <translation id="5442257541162692417">Измените сачувану страницу</translation> <translation id="544291274896356069">Напустићете режим без архивирања ако се овај линк отвори у спољној апликацији. Желите ли да наставите?</translation> +<translation id="5487521232677179737">Обриши податке</translation> <translation id="5487729733663684359">Chrome ажурирања више нису подржана за ову верзију Android-а.</translation> <translation id="5511351932351731210">Увек шаљи</translation> <translation id="5512137114520586844">Овим налогом управља <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google преводилац</translation> <translation id="5916664084637901428">Укључи</translation> <translation id="5939518447894949180">Ресетуј</translation> +<translation id="5965336165840183977">Ово брише синхронизоване податке са свих уређаја. Нећемо вас одјавити са Google налога. Нећемо избрисати сачувана подешавања сајтова и она могу да одражавају ваше навике при прегледању.</translation> <translation id="5968595432776860642">Репродукује се „<ph name="VIDEO_TITLE" />“</translation> <translation id="6010869025736512584">Приступа се видео улазу</translation> <translation id="6012342843556706400">Chrome-у је потребан приступ за локацију да би га делио са овим сајтом.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Заштићени садржај</translation> <translation id="6612856669344839356">Сачувај обележивач</translation> <translation id="6627583120233659107">Измени директоријум</translation> +<translation id="6647073004883890710">Да ли желите да <ph name="PASSWORD_MANAGER_BRAND" /> ажурира лозинку за <ph name="USERNAME" /> за овај сајт?</translation> <translation id="6656545060687952787">Chrome-у је потребан приступ локацији за скенирање уређаја. <ph name="BEGIN_LINK" />Ажурирајте дозволе<ph name="END_LINK" /></translation> <translation id="666268767214822976">Коришћење услуге предвиђања за приказивање сродних упита и популарних веб-сајтова док куцате у траци за адресу</translation> <translation id="666981079809192359">Chrome обавештење о приватности</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Сачувана страница није доступна офлајн</translation> <translation id="6722992508235227685">Обележивачи, историја, лозинке и друга подешавања ће се синхронизовати са Google налогом да бисте могли да их користите на свим уређајима. Можете да изаберете шта желите да синхронизујете у <ph name="BEGIN_LINK1" />Подешавањима<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Преузима се...</translation> +<translation id="6762156594045689028">Да бисте променили ово подешавање, <ph name="BEGIN_LINK" />ресетујте синхронизацију<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Chrome-ов систем Безбедно прегледање ћемо користити и да бисмо откривали злонамерне странице и да бисмо вас заштитили од „пецања“, малвера и штетних преузимања.</translation> <translation id="6784675033504223784">Потражите „<ph name="SEARCH_TERM" />“</translation> <translation id="6790428901817661496">Пусти</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Пријавите се да би вам обележивачи, историја, лозинке и друга подешавања били доступни на свим уређајима</translation> <translation id="6945221475159498467">Изабери</translation> <translation id="6963766334940102469">Избриши обележиваче</translation> -<translation id="6964496835063002391">Додајте налог</translation> <translation id="6965382102122355670">Потврди</translation> <translation id="6973630695168034713">Директоријуми</translation> <translation id="6978479750597523876">Ресетуј подешавања за превођење</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Откривена је спора веза</translation> <translation id="7057058088140140610">Кредитне картице и адресе које користе Google Payments</translation> <translation id="7063006564040364415">Није могуће повезивање са сервером за синхронизацију.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> жели да се упари са:</translation> +<translation id="7081639897063626814">Не обједињуј постојеће податке</translation> <translation id="7094922512924405309">Није пронађена ниједна страница Интернета око нас у околини</translation> <translation id="7095930899177687653">Отворених картица: <ph name="OPEN_TABS" /></translation> <translation id="7096034533295549981">Учитавање видеа</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Помоћ<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Брисање обележивача</translation> <translation id="7324738665594301612">Тестирамо преношење HTTPS страница преко Google сервера у склопу експеримента.</translation> +<translation id="7346217184097589238">Нећемо избрисати сачувана подешавања сајтова и она могу да одражавају ваше навике при прегледању.</translation> <translation id="7346909386216857016">Важи</translation> +<translation id="7347770551817603360">Офлајн садржај</translation> <translation id="7363354739009474003">„<ph name="VIDEO_TITLE" />“ се учитава</translation> <translation id="7366340029385295517">Пребацивање на <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Тип:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Потврди брисање акредитива уређаја</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (ажурирано је <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Сачекајте...</translation> +<translation id="7499262814309712782">Налог за синхронизацију</translation> <translation id="7501135638693251872">Сви обележивачи</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Брисање података прегледања</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Страница је сачувана офлајн. Меморија је скоро пуна.</translation> <translation id="8068648041423924542">Није могуће изабрати сертификат.</translation> <translation id="8069239273282989646">После компримовања</translation> +<translation id="8073388330009372546">Отвори слику на новој картици</translation> <translation id="8084156870963450514">Пријавите се да бисте приступали целокупном садржају на вебу са било ког уређаја</translation> <translation id="8106211421800660735">Број кредитне картице</translation> <translation id="813082847718468539">Погледајте информације о сајту</translation> <translation id="8137558756159375272">Функција Додирните за претрагу шаље изабрану реч и актуелну страницу као контекст у Google претрагу. Можете да је искључите у <ph name="BEGIN_LINK" />Подешавањима<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Није сачувана офлајн</translation> <translation id="8168435359814927499">Садржај</translation> +<translation id="8173098127580644436">одувек</translation> <translation id="8200772114523450471">Настави</translation> <translation id="8209050860603202033">Отвори слику</translation> <translation id="8218346974737627104">Потврдите пријављивање</translation> <translation id="8218934717680664417">Сада можете да претражујете једним додиром</translation> +<translation id="8223946939421658889">Обриши податке за:</translation> <translation id="8261506727792406068">Избриши</translation> <translation id="8275818695183729150">Дозволите (за претраге у траци за адресу)</translation> +<translation id="8283853025636624853">Синхронизује се са <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Стандардне картице</translation> <translation id="8374821112118309944">Морате да ажурирате TalkBack на новију верзију.</translation> <translation id="8396312449826231789">Само одобрени сајтови</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Прво питај (препоручено)</translation> <translation id="8428213095426709021">Подешавања</translation> <translation id="8429160401486700187">Избриши сачуване странице</translation> +<translation id="8433057134996913067">На овај начин ћете се одјавити са већине веб-сајтова.</translation> <translation id="8481940801237642152">Веза са овим сајтом је приватна, али неко на мрежи ће можда моћи да промени изглед странице.</translation> <translation id="8493948351860045254">Ослободите простор</translation> <translation id="8497726226069778601">Овде нема ничега... засад</translation> @@ -575,7 +603,7 @@ <translation id="8820817407110198400">Обележивачи</translation> <translation id="8829678271838353305"><ph name="ACCOUNT_EMAIL_LAST" /> је био пријављен/а. Ако се пријавите користећи <ph name="ACCOUNT_EMAIL_NEW" />, објединићете синхронизоване податке, попут обележивача, са више налога. Да би информације остале одвојене, обришите податке прегледања у <ph name="BEGIN_LINK" />подешавањима<ph name="END_LINK" />.</translation> <translation id="8853345339104747198"><ph name="TAB_TITLE" />, картица</translation> -<translation id="885701979325669005">Складишни простор</translation> +<translation id="885701979325669005">Меморијски простор</translation> <translation id="8901170036886848654">Није пронађен ниједан обележивач</translation> <translation id="8909135823018751308">Дели...</translation> <translation id="8912362522468806198">Google налога</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Веза са овим сајтом је приватна.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Навигација је недоступна: <ph name="URL" /></translation> +<translation id="8979340629087822094">прошли дан</translation> <translation id="8987061207681586800">Прилагодите Chrome</translation> <translation id="9019902583201351841">Овим управљају твоји родитељи</translation> <translation id="9020607083536754075">Затвори тренутну картицу и врати се у претходну апликацију</translation> +<translation id="9038649477754266430">Користите услугу предвиђања да бисте брже учитавали странице</translation> <translation id="9050666287014529139">Приступна фраза</translation> <translation id="9060538597317784206">Прегледајте апликацију <ph name="APP_NAME" /> у Play продавници. Оцена: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Искључи захтевање верзије сајта за рачунаре</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb index 575e423..616110c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sv"> +<translation id="1040144152982955218">Söker efter enheter … <ph name="BEGIN_LINK" />få hjälp<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Varning</translation> <translation id="10614374240317010">Aldrig sparad</translation> <translation id="1061441684050139317">Chrome behöver tillgång till mikrofonen för att kunna dela den på den här webbplatsen.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Lägg till ett konto och få åtkomst till bokmärken, historik, lösenord och andra inställningar på alla dina enheter.</translation> <translation id="1098052486217676340">Har avslutats</translation> <translation id="1121094540300013208">Användning och felrapporter</translation> +<translation id="1137305377394488060">den senaste timmen</translation> <translation id="1178581264944972037">Paus</translation> <translation id="1181037720776840403">Ta bort</translation> <translation id="1197267115302279827">Flytta bokmärken</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Googles doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Stopp</translation> <translation id="1285320974508926690">Översätt aldrig den här webbplatsen</translation> +<translation id="1291207594882862231">Rensa historiken, cookies, webbplatsdata, cacheminnet …</translation> <translation id="129553762522093515">Nyligen stängda</translation> <translation id="1346090444609141578">Inga sparade sidor här</translation> <translation id="1369915414381695676">Webbplatsen <ph name="SITE_NAME" /> har lagts till</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Hindra sidan från att skapa fler dialogrutor</translation> <translation id="1641113438599504367">Säker webbsökning</translation> +<translation id="164269334534774161">Det som visas är en offlinekopia av den här sidan från <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Översätter sidan till <ph name="SOURCE_LANGUAGE" /> …</translation> <translation id="1644574205037202324">Historik</translation> <translation id="1647391597548383849">Tillgång till din kamera</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Översättningsinställningarna har återställts.</translation> <translation id="2359808026110333948">Fortsätt</translation> <translation id="2381756643783702095">Fråga innan något skickas (rekommenderas)</translation> +<translation id="2385560268894525395">den senaste veckan</translation> <translation id="2387895666653383613">Textskalning</translation> <translation id="238909021488141516">Ett fel uppstod när innehållet skulle laddas ned.</translation> <translation id="2414886740292270097">Mörk</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Uppdatera sidan</translation> <translation id="2709516037105925701">Autofyll</translation> <translation id="271033894570825754">Ny</translation> +<translation id="2742271047622814453">Sparade inställningar på webbplatser kanske raderas</translation> <translation id="2748463065602559597">Du tittar på en säker Google Chrome-sida.</translation> <translation id="2762000892062317888">nyss</translation> <translation id="2770465223704140727">Ta bort från listan</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Det här kontot hanteras av <ph name="PARENT_NAME_1" /> och <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Upphovsrätt <ph name="YEAR" /> Google Inc. Med ensamrätt.</translation> <translation id="2968755619301702150">Certifikatvisare</translation> +<translation id="2996291259634659425">Skapa lösenfras</translation> <translation id="2996809686854298943">En webbadress måste anges.</translation> <translation id="3029704984691124060">Lösenfraserna matchar inte</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Få hjälp<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Spara video</translation> <translation id="306566828762083630">Lagringsutrymmet på enheten är fullt. Frigör utrymme genom att ta bort andra filer.</translation> <translation id="307329814453917357">Erbjud att översätta sidor med Google Översätt</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Aktivera behörigheter för Chrome i <ph name="BEGIN_LINK" />Android-inställningar<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> sparad data</translation> <translation id="3207960819495026254">Bokmärkt</translation> +<translation id="321773570071367578">Om du har glömt lösenfrasen eller vill ändra inställningen <ph name="BEGIN_LINK" />återställer du synkroniseringen<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Webbapp</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Vill du hämta innehållet?</translation> <translation id="3328801116991980348">Platsinformation</translation> <translation id="3350687908700087792">Stäng alla inkognitoflikar</translation> +<translation id="3351441609270267898">Importera befintlig data</translation> <translation id="3358663646935160692">Kontot hanteras av <ph name="DOMAIN_NAME" />. Du loggar in med ett hanterat konto, vilket innebär att administratören kontrollerar din Chrome-profil. Din Chrome-data kommer att knytas permanent till det här kontot. Om du kopplar ifrån det här kontot raderas din lokala Chrome-data.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Ny inkognitoflik</translation> <translation id="3501331331116143684">Sidan har sparats offline i <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Godkänn och fortsätt</translation> +<translation id="3522247891732774234">Det finns en tillgänglig uppdatering. Fler alternativ</translation> <translation id="3527085408025491307">Mapp</translation> <translation id="3549644494707163724">Kryptera alla synkroniserade data med en egen lösenfras</translation> <translation id="360480449234699036">Läs om olika ämnen på webbplatser utan att lämna sidan. När du trycker på Sök skickas ett ord och dess sammanhang till Google Sök och definitioner, bilder, sökresultat och annan information visas. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Tvinga aktivering av zoom</translation> <translation id="3917783807003067648">Platsen är blockerad</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">de senaste fyra veckorna</translation> <translation id="393697183122708255">Röstsökning är inte tillgängligt</translation> <translation id="3950820424414687140">Logga in</translation> <translation id="3988213473815854515">Platsen är tillåten</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Öppna i ny flik</translation> <translation id="4198229475320555619">Ett bokmärke på <ph name="PAGE_SIZE_STRING" /> har sparats offline</translation> <translation id="423410644998903704">Chrome behöver tillgång till behörigheter för att kunna dela dem på den här webbplatsen.</translation> +<translation id="424864128008805179">Vill du logga ut från Chrome?</translation> <translation id="4254813446494774748">Översättningsspråk:</translation> <translation id="4256782883801055595">Licenser för öppen källkod</translation> <translation id="4259722352634471385">Webbadressen har blockerats: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Physical Web-sidor i närheten visas i aviseringslistan i fortsättningen</translation> <translation id="4498934959426056365">Nyckelgenerering</translation> <translation id="4505554159887937799">Sparad offline</translation> +<translation id="4508440807153586353">Endast personer som har ditt lösenord kan läsa dina krypterade uppgifter. Lösenordet skickas inte till och sparas inte av Google. Om du glömmer lösenordet måste du återställa synkroniseringen. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{för # dag sedan}other{för # dagar sedan}}</translation> <translation id="4522570452068850558">Info</translation> <translation id="4526249700380860531">Visa och hantera sparade lösenord på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Ny flik</translation> <translation id="5271967389191913893">Innehållet som skulle laddas ned gick inte att öppna på enheten.</translation> <translation id="5275558766013849309">Flikarna visas tillsammans med aktuella appar.</translation> +<translation id="5284584623296338184">Ändringar i bokmärken, historik, lösenord och andra inställningar synkroniseras inte längre med ditt Google-konto. Befintlig data fortsätter dock att lagras i Google-kontot.</translation> <translation id="5301954838959518834">OK, jag fattar</translation> <translation id="5302048478445481009">Språk</translation> <translation id="5304593522240415983">Fältet får inte vara tomt</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Redigera sparat namn/lösenord eller undantag</translation> <translation id="5442257541162692417">Redigera sparad sida</translation> <translation id="544291274896356069">Om den här länken öppnas i ett externt program sker inte det i inkognitoläge. Vill du fortsätta?</translation> +<translation id="5487521232677179737">Rensa data</translation> <translation id="5487729733663684359">Uppdateringar av Chrome stöds inte längre för den här versionen av Android.</translation> <translation id="5511351932351731210">Skicka alltid</translation> <translation id="5512137114520586844">Det här kontot hanteras av <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Översätt</translation> <translation id="5916664084637901428">På</translation> <translation id="5939518447894949180">Återställ</translation> +<translation id="5965336165840183977">Detta rensar synkroniserad data från alla enheter. Du loggas inte ut från Google-kontot. Webbplatsinställningar som har sparats raderas inte och kan visa dina surfvanor.</translation> <translation id="5968595432776860642">Spelar upp <ph name="VIDEO_TITLE" /></translation> <translation id="6010869025736512584">Får åtkomst till videoindata</translation> <translation id="6012342843556706400">Chrome behöver tillgång till platsinformation för att kunna dela den på den här webbplatsen.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Skyddat innehåll</translation> <translation id="6612856669344839356">Spara bokmärke</translation> <translation id="6627583120233659107">Redigera mapp</translation> +<translation id="6647073004883890710">Vill du att <ph name="PASSWORD_MANAGER_BRAND" /> ska uppdatera lösenordet för <ph name="USERNAME" /> på den här webbplatsen?</translation> <translation id="6656545060687952787">Chrome behöver platsåtkomst för att söka efter enheter. <ph name="BEGIN_LINK" />Uppdatera behörigheter<ph name="END_LINK" /></translation> <translation id="666268767214822976">Använd en tjänst som ger förslag på relaterade sökfrågor och populära webbplatser när du skriver i adressfältet</translation> <translation id="666981079809192359">Chromes sekretessmeddelande</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Sidan som sparades är inte tillgänglig offline</translation> <translation id="6722992508235227685">Bokmärken, historik, lösenord och andra inställningar synkroniseras med ditt Google-konto så att du kan använda dem på alla enheter. Du kan välja vad som ska synkroniseras under <ph name="BEGIN_LINK1" />Inställningar<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Laddar ned …</translation> +<translation id="6762156594045689028"><ph name="BEGIN_LINK" />Återställ synkroniseringen<ph name="END_LINK" /> om du vill ändra den här inställningen.</translation> <translation id="6770414673596662518">Säker webbsökning i Chrome används dessutom för att identifiera skadliga sidor och skydda dig från nätfiske, skadlig programvara och skadliga filnedladdningar.</translation> <translation id="6784675033504223784">Sök efter <ph name="SEARCH_TERM" /></translation> <translation id="6790428901817661496">Spela</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Logga in om du vill att bokmärken, historik, lösenord och andra inställningar ska vara tillgängliga på alla dina enheter.</translation> <translation id="6945221475159498467">Välj</translation> <translation id="6963766334940102469">Radera bokmärken</translation> -<translation id="6964496835063002391">Lägg till ett konto</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Mappar</translation> <translation id="6978479750597523876">Återställ översättningsinställningar</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">En långsam anslutning upptäcktes</translation> <translation id="7057058088140140610">Kreditkort och adresser som används med Google Payments</translation> <translation id="7063006564040364415">Det gick inte att ansluta till synkroniseringsservern.</translation> +<translation id="7074853159844403180"><ph name="SITE" /> vill koppla till:</translation> +<translation id="7081639897063626814">Håll befintlig data separat</translation> <translation id="7094922512924405309">Inga Physical Web-sidor hittades i närheten</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> öppna flikar</translation> <translation id="7096034533295549981">Videon läses in</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Hjälp<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Ta bort bokmärke</translation> <translation id="7324738665594301612">Som en del av ett experiment testar vi att skicka HTTPS-sidor via Googles servrar som proxy.</translation> +<translation id="7346217184097589238">Webbplatsinställningar som har sparats raderas inte och kan visa dina surfvanor.</translation> <translation id="7346909386216857016">OK, jag förstår</translation> +<translation id="7347770551817603360">Offlineinnehåll</translation> <translation id="7363354739009474003">Läser in <ph name="VIDEO_TITLE" /></translation> <translation id="7366340029385295517">Castar till <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Typ:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Bekräfta borttagning av användaruppgifter för enheten</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (uppdaterades <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Vänta …</translation> +<translation id="7499262814309712782">Konto för synkronisering</translation> <translation id="7501135638693251872">Alla bokmärken</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Tar bort webbinformation</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Sparad offline. Nästan fullt.</translation> <translation id="8068648041423924542">Det går inte att välja certifikat.</translation> <translation id="8069239273282989646">Efter komprimering</translation> +<translation id="8073388330009372546">Öppna bild i ny flik</translation> <translation id="8084156870963450514">Logga in för att komma åt alla dina grejer på webben från vilken enhet som helst</translation> <translation id="8106211421800660735">Kreditkortsnummer</translation> <translation id="813082847718468539">Visa information om webbplatsen</translation> <translation id="8137558756159375272">Funktionen Tryck för att söka skickar det markerade ordet till Google Sök med den aktuella sidan som kontext. Du kan stänga av funktionen i <ph name="BEGIN_LINK" />Inställningar<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Inte sparad offline</translation> <translation id="8168435359814927499">Innehåll</translation> +<translation id="8173098127580644436">tidens början</translation> <translation id="8200772114523450471">Återuppta</translation> <translation id="8209050860603202033">Öppna bild</translation> <translation id="8218346974737627104">Bekräfta inloggning</translation> <translation id="8218934717680664417">Nu kan du söka med en tryckning</translation> +<translation id="8223946939421658889">Rensa data från</translation> <translation id="8261506727792406068">Radera</translation> <translation id="8275818695183729150">Tillåt (för sökningar i adressfältet)</translation> +<translation id="8283853025636624853">Synkroniseras med <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Standardflikar</translation> <translation id="8374821112118309944">Du måste uppdatera till en senare version av TalkBack.</translation> <translation id="8396312449826231789">Endast godkända webbplatser</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Fråga först (rekommenderas)</translation> <translation id="8428213095426709021">Inställningar</translation> <translation id="8429160401486700187">Radera sparade sidor</translation> +<translation id="8433057134996913067">Alternativet innebär att du loggas ut från de flesta webbplatser.</translation> <translation id="8481940801237642152">Din anslutning till webbplatsen är privat, men någon i nätverket kanske kan ändra utseendet på sidan.</translation> <translation id="8493948351860045254">Frigör lagringsutrymme</translation> <translation id="8497726226069778601">Det finns inget att se här … än</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Din anslutning till webbplatsen är privat.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Det går inte att nå webbadressen: <ph name="URL" /></translation> +<translation id="8979340629087822094">den senaste dagen</translation> <translation id="8987061207681586800">Anpassa Chrome</translation> <translation id="9019902583201351841">Hanteras av dina föräldrar</translation> <translation id="9020607083536754075">Stäng nuvarande flik och återvänd till föregående app</translation> +<translation id="9038649477754266430">Använd en förslagstjänst om du vill läsa in sidor snabbare</translation> <translation id="9050666287014529139">Lösenfras</translation> <translation id="9060538597317784206">Visa appen <ph name="APP_NAME" /> i Play Butik. Betyg: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Inaktivera begäran av webbplats för stationär dator</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb index 0df3107..5cae504 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Simamisha</translation> <translation id="1285320974508926690">Kamwe usitafsiri tovuti hii</translation> +<translation id="1291207594882862231">Futa historia, vidakuzi, data ya tovuti, akiba…</translation> <translation id="129553762522093515">Vilivyofungwa hivi karibuni</translation> <translation id="1346090444609141578">Hapana kurasa zilizohifadhiwa hapa</translation> <translation id="1369915414381695676">Tovuti <ph name="SITE_NAME" /> imeongezwa</translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Zuia ukurasa huu usiunde vidadisi zaidi</translation> <translation id="1641113438599504367">Kuvinjari Salama</translation> +<translation id="164269334534774161">Unatazama nakala ya nje ya mtandao ya ukurasa huu kuanzia <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Inatafsiri ukurasa uwe katika <ph name="SOURCE_LANGUAGE" />...</translation> <translation id="1644574205037202324">Historia</translation> <translation id="1647391597548383849">Kufikia kamera yako</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Onyesha upya ukurasa</translation> <translation id="2709516037105925701">Kujaza Kiotomatiki</translation> <translation id="271033894570825754">Mpya</translation> +<translation id="2742271047622814453">Huenda mapendeleo yaliyohifadhiwa kwenye tovuti yatafutwa</translation> <translation id="2748463065602559597">Unautazama ukurasa salama wa Google Chrome.</translation> <translation id="2762000892062317888">sasa hivi tu</translation> <translation id="2770465223704140727">Ondoa kwenye orodha</translation> @@ -156,7 +159,7 @@ <translation id="3190152372525844641">Washa ruhusa za Chrome katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> za data iliyohifadhiwa</translation> <translation id="3207960819495026254">Imealamishwa</translation> -<translation id="321773570071367578">Ikiwa ulisahau kauli yako ya siri au ungependa kubadilisha mipangilio hii, <ph name="BEGIN_LINK" />weka upya usawazishaji<ph name="END_LINK" /></translation> +<translation id="321773570071367578">Ikiwa umesahau kauli yako ya siri au ungependa kubadilisha mipangilio hii, <ph name="BEGIN_LINK" />fanya usawazishaji upya<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Maikrofoni</translation> <translation id="3232754137068452469">Programu ya Wavuti</translation> <translation id="3244271242291266297">MW</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Ungependa kuendelea kupakua maudhui?</translation> <translation id="3328801116991980348">Maelezo ya tovuti</translation> <translation id="3350687908700087792">Funga vichupo vyote fiche</translation> +<translation id="3351441609270267898">Leta data iliyopo</translation> <translation id="3358663646935160692">Akaunti hii inasimamiwa na <ph name="DOMAIN_NAME" />. Unaingia katika akaunti ambayo inasimamiwa na kumpa msimamizi wa akaunti udhibiti wa wasifu wako kwenye Chrome. Data yako ya Chrome itahusishwa na akaunti hii milele. Kujiondoa kwenye akaunti hii kutafuta data yako iliyopo ya Chrome.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Kichupo fiche kipya</translation> <translation id="3501331331116143684">Ukurasa umehifadhiwa nje ya mtandao kwenye <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Kubali na uendelee</translation> +<translation id="3522247891732774234">Kuna toleo jipya. Chaguo zaidi</translation> <translation id="3527085408025491307">Folda</translation> <translation id="3549644494707163724">Simba kwa njia fiche data yote iliyosawazishwa kwa kaulisiri yako binafsi ya usawazishaji</translation> <translation id="360480449234699036">Pata maelezo kuhusu mada kwenye tovuti bila kuondoka kwenye ukurasa. Gusa ili Kutafuta inatuma neno na muktadha wake uliopo kwenye Tafuta na Google, kurejesha ufafanuzi, picha, matokeo ya utafutaji, na maelezo mengine. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Fungua katika kichupo kipya</translation> <translation id="4198229475320555619">Alamisho ya ukubwa wa <ph name="PAGE_SIZE_STRING" /> imehifadhiwa nje ya mtandao</translation> <translation id="423410644998903704">Chrome inahitaji idhini ya kufikia ruhusa ili izishiriki na tovuti hii.</translation> -<translation id="4247939399682707041">Badilisha data ya kifaa hiki kwa data ya <ph name="ACCOUNT" />. Unaweza kurudisha data yako iliyopo kwa kubadilisha na kurudi kwenye <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Ungependa kuondoka kwenye Chrome?</translation> <translation id="4254813446494774748">Lugha ya Tafsiri:</translation> <translation id="4256782883801055595">Leseni za programu huria</translation> @@ -242,7 +246,7 @@ <translation id="4457399174246232812">Kurasa za baadaye za Wavuti Kila Mahali zilizo karibu zitaonekana katika orodha yako ya arifa</translation> <translation id="4498934959426056365">Uundaji ufunguo</translation> <translation id="4505554159887937799">Zimehifadhiwa nje ya mtandao</translation> -<translation id="4508440807153586353">Ni mtu mwenye kauli yako ya siri pekee ndiye anayeweza kusoma data yako iliyosimbwa kwa njia fiche. kauli ya siri haitumwi au kuhifadhiwa na Google. Ukisahau kauli yako ya siri, utahitaji kuweka upya usawazishaji. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation> +<translation id="4508440807153586353">Ni mtu mwenye kauli yako ya siri pekee ndiye anaweza kusoma data yako iliyosimbwa kwa njia fiche. Kauli ya siri haitumwi au kuhifadhiwa na Google. Ukisahau kauli yako ya siri, utahitaji kufanya usawazishaji upya. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{Siku # iliyopita}other{Siku # zilizopita}}</translation> <translation id="4522570452068850558">Maelezo</translation> <translation id="4526249700380860531">Angalia na udhibiti manenosiri yaliyohifadhiwa kwenye <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">Maudhui yanayolindwa</translation> <translation id="6612856669344839356">Hifadhi alamisho</translation> <translation id="6627583120233659107">Badilisha folda</translation> +<translation id="6647073004883890710">Je, ungependa <ph name="PASSWORD_MANAGER_BRAND" /> isasishe nenosiri lako la <ph name="USERNAME" /> kwa ajili ya tovuti hii?</translation> <translation id="6656545060687952787">Chrome inahitaji idhini ya kufikia mahali ili ichanganue vifaa. <ph name="BEGIN_LINK" />Ruhusa za sasisho<ph name="END_LINK" /></translation> <translation id="666268767214822976">Tumia huduma ya ubashiri ili kuonyesha hoja zinazohusiana na tovuti maarufu unapocharaza katika sehemu ya anwani</translation> <translation id="666981079809192359">Ilani ya Faragha ya Chrome</translation> @@ -435,7 +440,7 @@ <translation id="6720988912937197322">Ukurasa uliohifadhiwa haupatikani nje ya mtandao</translation> <translation id="6722992508235227685">Alamisho, historia, manenosiri, na mipangilio yako mingine itasawazishwa kwenye Akaunti yako ya Google ili uweze kuitumia kwenye vifaa vyako vyote. Unaweza kuchagua faili za kusawazisha katika <ph name="BEGIN_LINK1" />Mipangilio<ph name="END_LINK1" />.</translation> <translation id="6738867403308150051">Inapakua...</translation> -<translation id="6762156594045689028">Ili kubadilisha mipangilio hii, <ph name="BEGIN_LINK" />weka upya usawazishaji<ph name="END_LINK" /></translation> +<translation id="6762156594045689028">Ili kubadilisha mipangilio hii, <ph name="BEGIN_LINK" />fanya usawazishaji upya<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Mfumo wa Kuvinjari Salama wa Chrome pia utatumiwa kugundua kurasa hasidi na kukulinda dhidi ya hadaa ili kupata maelezo ya kibinafsi, programu hasidi, na vipakuliwa vya kudhuru.</translation> <translation id="6784675033504223784">Tafuta “<ph name="SEARCH_TERM" />”</translation> <translation id="6790428901817661496">Cheza</translation> @@ -452,7 +457,6 @@ <translation id="6868088497967843822">Ingia katika akaunti ili upate alamisho, historia, manenosiri, na mipangilio yako mingine kwenye vifaa vyako vyote</translation> <translation id="6945221475159498467">Chagua</translation> <translation id="6963766334940102469">Futa alamisho</translation> -<translation id="6964496835063002391">Ongeza akaunti</translation> <translation id="6965382102122355670">Sawa</translation> <translation id="6973630695168034713">Folda</translation> <translation id="6978479750597523876">Weka upya mipangilio ya kutafsiri</translation> @@ -470,7 +474,7 @@ <translation id="7057058088140140610">Kadi za mikopo na anwani zinazotumia Google Payments</translation> <translation id="7063006564040364415">Haikuweza kuunganisha kwenye seva ya usawazishaji.</translation> <translation id="7074853159844403180"><ph name="SITE" /> ingependa kuoanisha na:</translation> -<translation id="7081639897063626814">Weka katika sehemu tofauti data iliyopo</translation> +<translation id="7081639897063626814">Weka data iliyopo katika sehemu tofauti</translation> <translation id="7094922512924405309">Hakuna kurasa za Wavuti Kila Mahali zilizo karibu zilizopatikana</translation> <translation id="7095930899177687653">Vichupo <ph name="OPEN_TABS" /> vilivyo wazi</translation> <translation id="7096034533295549981">Inapakia video</translation> @@ -484,6 +488,7 @@ <translation id="7324738665594301612">Tunajaribu kuweka seva mbadala ya kurasa za HTTPS kupitia seva za Google kama sehemu ya jaribio.</translation> <translation id="7346217184097589238">Mipangilio ya tovuti iliyohifadhiwa haitafutwa na inaweza kuonyesha tabia zako za kuvinjari.</translation> <translation id="7346909386216857016">Sawa, nimeelewa</translation> +<translation id="7347770551817603360">Maudhui ya nje ya mtandao</translation> <translation id="7363354739009474003">Inapakia "<ph name="VIDEO_TITLE" />"</translation> <translation id="7366340029385295517">Inatuma kwenye <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Aina:</translation> @@ -544,6 +549,7 @@ <translation id="8050319187894766337">Ukurasa umehifadhiwa nje ya mtandao. Hifadhi inakaribia kujaa.</translation> <translation id="8068648041423924542">Imeshindwa kuchagua cheti.</translation> <translation id="8069239273282989646">Baada ya kushindiliwa</translation> +<translation id="8073388330009372546">Fungua picha katika kichupo kipya</translation> <translation id="8084156870963450514">Ingia katika akaunti ili ufikie mambo yako yote ya wavuti kutoka kwenye kifaa chochote</translation> <translation id="8106211421800660735">Nambari ya kadi ya malipo</translation> <translation id="813082847718468539">Angalia maelezo ya tovuti</translation> @@ -566,6 +572,7 @@ <translation id="8413385045638830869">Uliza kwanza (imependekezwa)</translation> <translation id="8428213095426709021">Mipangilio</translation> <translation id="8429160401486700187">Futa kurasa zilizohifadhiwa</translation> +<translation id="8433057134996913067">Kufanya hivyo kutakuondoa kwenye tovuti nyingi.</translation> <translation id="8481940801237642152">Muunganisho wako kwenye tovuti hii ni wa faragha, lakini huenda mtu aliye kwenye mtandao akaweza kubadilisha maudhui ya ukurasa.</translation> <translation id="8493948351860045254">Ongeza nafasi ya hifadhi</translation> <translation id="8497726226069778601">Bado hapana chochote cha kuangalia...</translation> @@ -610,6 +617,7 @@ <translation id="8987061207681586800">Ifanye Chrome kuwa yako</translation> <translation id="9019902583201351841">Inadhibitiwa na wazazi wako</translation> <translation id="9020607083536754075">Funga kichupo cha sasa na urudi kwenye programu ya awali</translation> +<translation id="9038649477754266430">Tumia huduma ya kutabiri ili upakie kurasa kwa haraka zaidi</translation> <translation id="9050666287014529139">Kaulisiri</translation> <translation id="9060538597317784206">Angalia programu <ph name="APP_NAME" /> kwenye Duka la Google Play. Alama: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Zima Omba Tovuti ya Eneo-kazi</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb index 8904049..ba00416 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="th"> +<translation id="1040144152982955218">กำลังค้นหาอุปกรณ์… <ph name="BEGIN_LINK" />ขอความช่วยเหลือ<ph name="END_LINK" /></translation> <translation id="1056898198331236512">คำเตือน</translation> <translation id="10614374240317010">ไม่เคยบันทึก</translation> <translation id="1061441684050139317">Chrome ต้องการเข้าถึงไมโครโฟนเพื่อแชร์กับเว็บไซต์นี้</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">เพิ่มบัญชีเพื่อรับบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ บนอุปกรณ์ทั้งหมดของคุณ</translation> <translation id="1098052486217676340">เสร็จแล้ว</translation> <translation id="1121094540300013208">รายงานการใช้งานและข้อขัดข้อง</translation> +<translation id="1137305377394488060">ชั่วโมงที่ผ่านมา</translation> <translation id="1178581264944972037">หยุดชั่วคราว</translation> <translation id="1181037720776840403">ลบ</translation> <translation id="1197267115302279827">ย้ายบุ๊กมาร์ก</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">หยุด</translation> <translation id="1285320974508926690">ไม่ต้องแปลไซต์นี้</translation> +<translation id="1291207594882862231">ล้างประวัติการเข้าชม คุกกี้ ข้อมูลเว็บไซต์ แคช…</translation> <translation id="129553762522093515">เพิ่งปิด</translation> <translation id="1346090444609141578">ไม่มีหน้าที่บันทึกไว้ที่นี่</translation> <translation id="1369915414381695676">เพิ่มเว็บไซต์ <ph name="SITE_NAME" /> แล้ว</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">กล้องถ่ายรูป</translation> <translation id="1623104350909869708">ป้องกันหน้าเว็บนี้จากการสร้างการโต้ตอบเพิ่มเติม</translation> <translation id="1641113438599504367">Safe Browsing</translation> +<translation id="164269334534774161">คุณกำลังดูสำเนาออฟไลน์ของหน้านี้จากวันที่ <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">กำลังแปลหน้าเป็นภาษา<ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">ประวัติการเข้าชม</translation> <translation id="1647391597548383849">เข้าถึงกล้องถ่ายรูป</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">รีเซ็ตการตั้งค่าการแปลภาษาของคุณแล้ว</translation> <translation id="2359808026110333948">ดำเนินการต่อ</translation> <translation id="2381756643783702095">ถามก่อนที่จะส่ง (แนะนำ)</translation> +<translation id="2385560268894525395">สัปดาห์ที่ผ่านมา</translation> <translation id="2387895666653383613">อัตราส่วนข้อความ</translation> <translation id="238909021488141516">เกิดข้อผิดพลาดขณะดาวน์โหลดเนื้อหานี้</translation> <translation id="2414886740292270097">มืด</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">รีเฟรชหน้า</translation> <translation id="2709516037105925701">ป้อนอัตโนมัติ</translation> <translation id="271033894570825754">ใหม่</translation> +<translation id="2742271047622814453">ค่ากำหนดที่บันทึกไว้บนเว็บไซต์อาจถูกลบ</translation> <translation id="2748463065602559597">คุณกำลังดูหน้าเว็บ Google Chrome ที่ปลอดภัย</translation> <translation id="2762000892062317888">เมื่อสักครู่</translation> <translation id="2770465223704140727">ลบจากรายการ</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">บัญชีนี้ได้รับการจัดการโดย <ph name="PARENT_NAME_1" /> และ <ph name="PARENT_NAME_2" /></translation> <translation id="2960796085439532066">ลิขสิทธิ์ <ph name="YEAR" /> Google Inc. สงวนลิขสิทธิ์</translation> <translation id="2968755619301702150">เครื่องมือดูใบรับรอง</translation> +<translation id="2996291259634659425">สร้างรหัสผ่าน</translation> <translation id="2996809686854298943">ต้องระบุ URL</translation> <translation id="3029704984691124060">รหัสผ่านไม่ตรงกัน</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />ขอความช่วยเหลือ<ph name="END_LINK" /></translation> <translation id="3063601790762993062">บันทึกวิดีโอ</translation> <translation id="306566828762083630">พื้นที่เก็บข้อมูลของอุปกรณ์คุณเต็มแล้ว โปรดนำสื่ออื่นๆ ออกเพื่อเพิ่มพื้นที่</translation> <translation id="307329814453917357">เสนอให้แปลหน้าเว็บโดยใช้ Google แปลภาษา</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">เปิดการใช้สิทธิ์สำหรับ Chrome ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation> <translation id="3198916472715691905">ข้อมูลที่จัดเก็บมี <ph name="STORAGE_AMOUNT" /></translation> <translation id="3207960819495026254">บุ๊กมาร์กแล้ว</translation> +<translation id="321773570071367578">หากคุณลืมรหัสผ่านหรือต้องการเปลี่ยนการตั้งค่านี้ ให้<ph name="BEGIN_LINK" />รีเซ็ตการซิงค์<ph name="END_LINK" /></translation> <translation id="3227137524299004712">ไมโครโฟน</translation> <translation id="3232754137068452469">เว็บแอป</translation> <translation id="3244271242291266297">ดด</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">ต้องการดำเนินการดาวน์โหลดเนื้อหานี้ไหม</translation> <translation id="3328801116991980348">ข้อมูลไซต์</translation> <translation id="3350687908700087792">ปิดแท็บไม่ระบุตัวตนทั้งหมด</translation> +<translation id="3351441609270267898">นำเข้าข้อมูลที่มีอยู่</translation> <translation id="3358663646935160692">ผู้จัดการบัญชีนี้คือ <ph name="DOMAIN_NAME" /> คุณกำลังลงชื่อเข้าใช้ด้วยบัญชีที่มีผู้อื่นเป็นผู้จัดการ และคุณอนุญาตให้ผู้ดูแลระบบควบคุมโปรไฟล์ Chrome ของคุณได้ ข้อมูล Chrome ของคุณจะเชื่อมโยงกับบัญชีนี้อย่างถาวร การยกเลิกการเชื่อมต่อกับบัญชีนี้จะเป็นการนำออกข้อมูล Chrome ในเครื่อง</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">แท็บใหม่ที่ไม่ระบุตัวตน</translation> <translation id="3501331331116143684">บันทึกหน้าแบบออฟไลน์ไปยัง <ph name="FOLDER_NAME" /> แล้ว</translation> <translation id="3518985090088779359">ยอมรับและทำต่อ</translation> +<translation id="3522247891732774234">มีการอัปเดตให้บริการ ตัวเลือกเพิ่มเติม</translation> <translation id="3527085408025491307">โฟลเดอร์</translation> <translation id="3549644494707163724">เข้ารหัสข้อมูลที่ซิงค์ทั้งหมดด้วยข้อความรหัสผ่านการซิงค์ของคุณเอง</translation> <translation id="360480449234699036">เรียนรู้เกี่ยวกับหัวข้อบนเว็บไซต์โดยไม่ต้องออกจากหน้า แตะเพื่อค้นหาจะส่งคำและบริบทที่อยู่ข้างเคียงไปยัง Google Search เพื่อแสดงคำจำกัดความ รูปภาพ ผลการค้นหา และรายละเอียดอื่นๆ @@ -193,6 +204,7 @@ <translation id="3895926599014793903">บังคับให้เปิดใช้การซูม</translation> <translation id="3917783807003067648">บล็อกตำแหน่งอยู่</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">4 สัปดาห์ที่ผ่านมา</translation> <translation id="393697183122708255">ไม่มีการเปิดใช้การค้นหาด้วยเสียง</translation> <translation id="3950820424414687140">ลงชื่อเข้าใช้</translation> <translation id="3988213473815854515">อนุญาตตำแหน่ง</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">เปิดในแท็บใหม่</translation> <translation id="4198229475320555619">บันทึกบุ๊กมาร์กแบบออฟไลน์แล้ว <ph name="PAGE_SIZE_STRING" /></translation> <translation id="423410644998903704">Chrome ต้องการเข้าถึงสิทธิ์เพื่อแชร์กับเว็บไซต์นี้</translation> +<translation id="424864128008805179">ต้องการออกจากระบบ Chrome ไหม</translation> <translation id="4254813446494774748">ภาษาที่แปล:</translation> <translation id="4256782883801055595">ใบอนุญาตโอเพนซอร์ส</translation> <translation id="4259722352634471385">มีการบล็อกการนำทาง: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">หน้า Physical Web ที่อยู่ใกล้เคียงหลังจากนี้จะแสดงในรายการการแจ้งเตือน</translation> <translation id="4498934959426056365">การสร้างคีย์</translation> <translation id="4505554159887937799">บันทึกในโหมดออฟไลน์แล้ว</translation> +<translation id="4508440807153586353">เฉพาะผู้ที่มีรหัสผ่านของคุณเท่านั้นจึงจะสามารถอ่านข้อมูลที่เข้ารหัสของคุณได้ Google จะไม่ส่งหรือจัดเก็บรหัสผ่านนี้ หากคุณลืมรหัสผ่านหรือต้องการเปลี่ยนการตั้งค่านี้ คุณจะต้องรีเซ็ตการซิงค์ <ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# วันที่ผ่านมา}other{# วันที่ผ่านมา}}</translation> <translation id="4522570452068850558">รายละเอียด</translation> <translation id="4526249700380860531">ดูและจัดการรหัสผ่านที่บันทึกไว้ที่ <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">แท็บใหม่</translation> <translation id="5271967389191913893">อุปกรณ์ไม่สามารถเปิดเนื้อหาที่จะดาวน์โหลดได้</translation> <translation id="5275558766013849309">แท็บจะแสดงร่วมกับแอปล่าสุด</translation> +<translation id="5284584623296338184">การเปลี่ยนแปลงบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะไม่ซิงค์กับบัญชี Google ของคุณอีกต่อไป อย่างไรก็ตาม ข้อมูลที่คุณมีจะยังคงจัดเก็บอยู่ในบัญชี Google ของคุณ</translation> <translation id="5301954838959518834">ตกลง เข้าใจแล้ว</translation> <translation id="5302048478445481009">ภาษา </translation> <translation id="5304593522240415983">ต้องกรอกข้อมูลในช่องนี้</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">แก้ไขชื่อ/รหัสผ่านหรือข้อยกเว้นที่บันทึกไว้</translation> <translation id="5442257541162692417">แก้ไขหน้าที่บันทึกไว้</translation> <translation id="544291274896356069">ออกจากโหมดไม่ระบุตัวตนถ้ามีการเปิดลิงก์นี้ในแอปพลิเคชันภายนอก ดำเนินการต่อไหม</translation> +<translation id="5487521232677179737">ล้างข้อมูล</translation> <translation id="5487729733663684359">ไม่มีการสนับสนุนการอัปเดต Chrome บน Android เวอร์ชันนี้อีกต่อไป</translation> <translation id="5511351932351731210">ส่งเสมอ</translation> <translation id="5512137114520586844">บัญชีนี้ได้รับการจัดการโดย <ph name="PARENT_NAME" /></translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google แปลภาษา</translation> <translation id="5916664084637901428">เปิด</translation> <translation id="5939518447894949180">รีเซ็ต</translation> +<translation id="5965336165840183977">การดำเนินการนี้จะล้างข้อมูลที่ซิงค์จากอุปกรณ์ทั้งหมด คุณจะไม่ออกจากระบบบัญชี Google การตั้งค่าเว็บไซต์ที่บันทึกไว้จะไม่ถูกลบและอาจส่งผลกับลักษณะการท่องเว็บของคุณ</translation> <translation id="5968595432776860642">กำลังเล่น “<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">กำลังเข้าถึงอินพุตวิดีโอ</translation> <translation id="6012342843556706400">Chrome ต้องการเข้าถึงตำแหน่งเพื่อแชร์กับเว็บไซต์นี้</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">เนื้อหาที่ได้รับความคุ้มครอง</translation> <translation id="6612856669344839356">บันทึกบุ๊กมาร์ก</translation> <translation id="6627583120233659107">แก้ไขโฟลเดอร์</translation> +<translation id="6647073004883890710">คุณต้องการให้ <ph name="PASSWORD_MANAGER_BRAND" /> อัปเดตรหัสผ่านของ <ph name="USERNAME" /> สำหรับเว็บไซต์นี้ไหม</translation> <translation id="6656545060687952787">Chrome ต้องมีสิทธิ์เข้าถึงตำแหน่งเพื่อสแกนหาอุปกรณ์ โปรด<ph name="BEGIN_LINK" />อัปเดตสิทธิ์<ph name="END_LINK" /></translation> <translation id="666268767214822976">ใช้บริการการคาดคะเนเพื่อแสดงคำค้นหาที่เกี่ยวข้องและเว็บไซต์ยอดนิยมขณะที่คุณพิมพ์ในแถบที่อยู่เว็บ</translation> <translation id="666981079809192359">ประกาศเกี่ยวกับนโยบายส่วนบุคคลของ Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">หน้าที่บันทึกไว้ไม่พร้อมใช้งานแบบออฟไลน์</translation> <translation id="6722992508235227685">บุ๊กมาร์ก ประวัติ รหัสผ่าน และการตั้งค่าอื่นๆ จะซิงค์กับบัญชี Google คุณจึงสามารถใช้รายการดังกล่าวได้กับอุปกรณ์ของคุณทั้งหมด คุณสามารถเลือกข้อมูลที่จะซิงค์ได้ใน<ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" /></translation> <translation id="6738867403308150051">กำลังดาวน์โหลด…</translation> +<translation id="6762156594045689028">หากต้องการเปลี่ยนการตั้งค่านี้ โปรด<ph name="BEGIN_LINK" />รีเซ็ตการซิงค์<ph name="END_LINK" /></translation> <translation id="6770414673596662518">ระบบ Safe Browsing ของ Chrome ยังใช้ในการตรวจหาหน้าเว็บที่ไม่ปลอดภัยและปกป้องคุณจากฟิชชิง มัลแวร์ และการดาวน์โหลดที่เป็นอันตราย</translation> <translation id="6784675033504223784">ค้นหา “<ph name="SEARCH_TERM" />”</translation> <translation id="6790428901817661496">เล่น</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">ลงชื่อเข้าใช้เพื่อรับบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ บนอุปกรณ์ทั้งหมดของคุณ</translation> <translation id="6945221475159498467">เลือก</translation> <translation id="6963766334940102469">ลบบุ๊กมาร์ก</translation> -<translation id="6964496835063002391">เพิ่มบัญชี</translation> <translation id="6965382102122355670">ตกลง</translation> <translation id="6973630695168034713">โฟลเดอร์</translation> <translation id="6978479750597523876">รีเซ็ตการตั้งค่าการแปล</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">ตรวจพบการเชื่อมต่อที่ช้า</translation> <translation id="7057058088140140610">ใช้ข้อมูลบัตรเครดิตและที่อยู่จาก Google Payments</translation> <translation id="7063006564040364415">ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์การซิงค์</translation> +<translation id="7074853159844403180"><ph name="SITE" /> ต้องการจับคู่กับ:</translation> +<translation id="7081639897063626814">เก็บข้อมูลที่มีอยู่แยกไว้ต่างหาก</translation> <translation id="7094922512924405309">ไม่พบหน้า Physical Web ที่อยู่ใกล้เคียง</translation> <translation id="7095930899177687653">แท็บที่เปิด <ph name="OPEN_TABS" /> แท็บ</translation> <translation id="7096034533295549981">กำลังโหลดวิดีโอ</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />ความช่วยเหลือ<ph name="END_LINK" /></translation> <translation id="7299721129597238157">นำออกบุ๊กมาร์ก</translation> <translation id="7324738665594301612">เรากำลังทดสอบการพร็อกซีของหน้า HTTPS ผ่านเซิร์ฟเวอร์ของ Google ซึ่งเป็นส่วนหนึ่งของการทดลอง</translation> +<translation id="7346217184097589238">การตั้งค่าเว็บไซต์ที่บันทึกไว้จะไม่ถูกลบและอาจส่งผลกับลักษณะการท่องเว็บของคุณ</translation> <translation id="7346909386216857016">รับทราบ</translation> +<translation id="7347770551817603360">เนื้อหาออฟไลน์</translation> <translation id="7363354739009474003">กำลังโหลด “<ph name="VIDEO_TITLE" />”</translation> <translation id="7366340029385295517">กำลังส่งไปยัง <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">ประเภท:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">ยืนยันการลบข้อมูลรับรองของอุปกรณ์</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (อัปเดตเมื่อ <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">โปรดรอสักครู่…</translation> +<translation id="7499262814309712782">บัญชีสำหรับซิงค์</translation> <translation id="7501135638693251872">บุ๊กมาร์กทั้งหมด</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">กำลังล้างข้อมูลการท่องเว็บ</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">บันทึกหน้าแบบออฟไลน์แล้ว พื้นที่เกือบเต็มแล้ว</translation> <translation id="8068648041423924542">เลือกใบรับรองไม่ได้</translation> <translation id="8069239273282989646">หลังการบีบอัด</translation> +<translation id="8073388330009372546">เปิดภาพในแท็บใหม่</translation> <translation id="8084156870963450514">ลงชื่อเข้าใช้เพื่อเข้าถึงข้อมูลทั้งหมดของคุณในเว็บจากอุปกรณ์ใดก็ได้</translation> <translation id="8106211421800660735">หมายเลขบัตรเครดิต</translation> <translation id="813082847718468539">ดูข้อมูลเว็บไซต์</translation> <translation id="8137558756159375272">แตะเพื่อค้นหาจะส่งคำที่เลือกและหน้าปัจจุบันเป็นบริบทไปยัง Google Search คุณสามารถปิดคุณลักษณะนี้ใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation> <translation id="8146397137182589628">ไม่ได้บันทึกแบบออฟไลน์</translation> <translation id="8168435359814927499">เนื้อหา</translation> +<translation id="8173098127580644436">ตั้งแต่เริ่มต้น</translation> <translation id="8200772114523450471">ทำต่อ</translation> <translation id="8209050860603202033">เปิดรูปภาพ</translation> <translation id="8218346974737627104">ยืนยันการลงชื่อเข้าใช้</translation> <translation id="8218934717680664417">คุณสามารถค้นหาด้วยการแตะเพียงครั้งเดียวได้แล้วในขณะนี้</translation> +<translation id="8223946939421658889">ล้างข้อมูลตั้งแต่</translation> <translation id="8261506727792406068">ลบ</translation> <translation id="8275818695183729150">อนุญาต (สำหรับการค้นหาในแถบที่อยู่เว็บ)</translation> +<translation id="8283853025636624853">กำลังซิงค์กับ <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">แท็บมาตรฐาน</translation> <translation id="8374821112118309944">คุณต้องอัปเดต TalkBack เป็นเวอร์ชันใหม่</translation> <translation id="8396312449826231789">เฉพาะไซต์ที่อนุมัติ</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">ถามก่อน (แนะนำ)</translation> <translation id="8428213095426709021">การตั้งค่า</translation> <translation id="8429160401486700187">ลบหน้าที่บันทึกไว้</translation> +<translation id="8433057134996913067">วิธีนี้จะทำให้คุณออกจากระบบของเว็บไซต์ส่วนใหญ่</translation> <translation id="8481940801237642152">การเชื่อมต่อกับไซต์นี้เป็นแบบส่วนตัว แต่คนอื่นในเครือข่ายอาจเปลี่ยนลักษณะของหน้าได้</translation> <translation id="8493948351860045254">เพิ่มพื้นที่ว่าง</translation> <translation id="8497726226069778601">ที่นี่ยังไม่มีอะไรให้ดู… เลย</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">การเชื่อมต่อกับไซต์นี้เป็นแบบส่วนตัว</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">ไม่สามารถเข้าถึงการนำทางได้: <ph name="URL" /></translation> +<translation id="8979340629087822094">วันที่ผ่านมา</translation> <translation id="8987061207681586800">เปลี่ยน Chrome ในแบบคุณ</translation> <translation id="9019902583201351841">มีการจัดการโดยผู้ปกครอง</translation> <translation id="9020607083536754075">ปิดแท็บปัจจุบันและกลับไปที่แอปก่อนหน้า</translation> +<translation id="9038649477754266430">ใช้บริการการคาดคะเนเพื่อโหลดหน้าได้เร็วขึ้น</translation> <translation id="9050666287014529139">ข้อความรหัสผ่าน</translation> <translation id="9060538597317784206">ดูแอป <ph name="APP_NAME" /> บน Play สโตร์ คะแนน: <ph name="APP_RATING" /></translation> <translation id="9063523880881406963">ปิดการขอเว็บไซต์เดสก์ท็อป</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb index b50e195c..f4364647 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="tr"> +<translation id="1040144152982955218">Cihazlar aranıyor… <ph name="BEGIN_LINK" />yardım alın<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Uyarı</translation> <translation id="10614374240317010">Hiç kaydedilmeyecekler</translation> <translation id="1061441684050139317">Chrome'un mikrofonu bu siteyle paylaşması için mikrofon erişimine ihtiyacı var.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Yer işaretlerinize, geçmişinize, şifrelerinize ve diğer ayarlarınıza tüm cihazlarınızdan erişmek için bir hesap ekleyin.</translation> <translation id="1098052486217676340">Bitti</translation> <translation id="1121094540300013208">Kullanım ve kilitlenme raporları</translation> +<translation id="1137305377394488060">son 1 saat</translation> <translation id="1178581264944972037">Duraklat</translation> <translation id="1181037720776840403">Kaldır</translation> <translation id="1197267115302279827">Yer işaretlerini taşı</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google doodle'ı: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Durdur</translation> <translation id="1285320974508926690">Bu siteyi hiçbir zaman çevirme</translation> +<translation id="1291207594882862231">Geçmişi, çerezleri, site verilerini, önbelleği temizleyin…</translation> <translation id="129553762522093515">Son kapatılan</translation> <translation id="1346090444609141578">Burada kaydedilmiş sayfa yok</translation> <translation id="1369915414381695676"><ph name="SITE_NAME" /> sitesi eklendi</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1623104350909869708">Bu sayfanın daha fazla iletişim kutusu oluşturmasını önle</translation> <translation id="1641113438599504367">Güvenli Tarama</translation> +<translation id="164269334534774161">Bu sayfanın <ph name="CREATION_TIME" /> tarihinde oluşturulan bir çevrimdışı kopyasını görüntülüyorsunuz</translation> <translation id="1643702317193804718">Sayfa <ph name="SOURCE_LANGUAGE" /> diline çevriliyor…</translation> <translation id="1644574205037202324">Geçmiş</translation> <translation id="1647391597548383849">Kameranıza erişim</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Çeviri ayarlarınız sıfırlandı.</translation> <translation id="2359808026110333948">Devam Et</translation> <translation id="2381756643783702095">Göndermeden önce sor (önerilir)</translation> +<translation id="2385560268894525395">geçen hafta</translation> <translation id="2387895666653383613">Metin ölçekleme</translation> <translation id="238909021488141516">İçerik indirilirken bir hata oluştu.</translation> <translation id="2414886740292270097">Koyu</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Sayfayı yenile</translation> <translation id="2709516037105925701">Otomatik doldurma</translation> <translation id="271033894570825754">Yeni</translation> +<translation id="2742271047622814453">Sitelerde kaydedilen tercihler silinebilir</translation> <translation id="2748463065602559597">Güvenli bir Google Chrome sayfasını görüntülüyorsunuz.</translation> <translation id="2762000892062317888">az önce</translation> <translation id="2770465223704140727">Listeden kaldır</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Bu hesap <ph name="PARENT_NAME_1" /> ve <ph name="PARENT_NAME_2" /> tarafından yönetiliyor.</translation> <translation id="2960796085439532066">Telif Hakkı <ph name="YEAR" /> Google Inc. Tüm hakları saklıdır.</translation> <translation id="2968755619301702150">Sertifika görüntüleyici</translation> +<translation id="2996291259634659425">Parola oluşturun</translation> <translation id="2996809686854298943">URL gerekli</translation> <translation id="3029704984691124060">Parolalar eşleşmiyor</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Yardım alın<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Videoyu kaydet</translation> <translation id="306566828762083630">Cihazınızın depolama alanı dolu. Yer açmak için lütfen diğer medyalardan bazılarını kaldırın.</translation> <translation id="307329814453917357">Sayfaları Google Çeviri ile çevirmeyi öner</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda Chrome için izinleri açın.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> depolanmış veri</translation> <translation id="3207960819495026254">Yer işareti koyuldu</translation> +<translation id="321773570071367578">Parolanızı unuttuysanız veya bu ayarı değiştirmek istiyorsanız <ph name="BEGIN_LINK" />senkronizasyonu sıfırlayın<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3232754137068452469">Web Uygulaması</translation> <translation id="3244271242291266297">AA</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">İçeriği indirme işlemine başlansın mı?</translation> <translation id="3328801116991980348">Site bilgileri</translation> <translation id="3350687908700087792">Tüm gizli sekmeleri kapatın.</translation> +<translation id="3351441609270267898">Mevcut verileri içe aktar</translation> <translation id="3358663646935160692">Bu hesap <ph name="DOMAIN_NAME" /> tarafından yönetiliyor. Yönetilen bir hesapla oturum açıyor ve hesabın yöneticisine Chrome profilinizi denetleme olanağı veriyorsunuz. Chrome verileriniz bu hesaba kalıcı olarak bağlanır. Bu hesabın bağlantısı kesildiğinde yerel Chrome verileriniz silinir.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Yeni gizli sekme</translation> <translation id="3501331331116143684">Sayfa çevrimdışına kaydedildi: <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Kabul et ve devam et</translation> +<translation id="3522247891732774234">Güncelleme mevcut. Diğer seçenekler</translation> <translation id="3527085408025491307">Klasör</translation> <translation id="3549644494707163724">Senkronize edilen tüm verileri kendi senkronizasyon parolanızla şifreleyin</translation> <translation id="360480449234699036">Sayfadan ayrılmadan web siteleriyle ilgili konuları öğrenin. Ara'ya dokunduğunuzda bir kelime ve içinde bulunduğu bağlamı oluşturan metin Google Arama'ya gönderilerek ilgili tanımlar, resimler, arama sonuçları ve diğer ayrıntılar sonuç olarak döndürülür. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Yakınlaştırmayı etkinleştirmeye zorla</translation> <translation id="3917783807003067648">Konum engellendi</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">son 4 hafta</translation> <translation id="393697183122708255">Kullanılabilir etkin sesli arama yok</translation> <translation id="3950820424414687140">Oturum açın</translation> <translation id="3988213473815854515">Konuma izin veriliyor</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Yeni sekmede aç</translation> <translation id="4198229475320555619"><ph name="PAGE_SIZE_STRING" /> boyutunda yer işareti çevrimdışı olarak kaydedildi</translation> <translation id="423410644998903704">Chrome'un bu siteyle paylaşımda bulunabilmesi için izin erişimine ihtiyacı var.</translation> +<translation id="424864128008805179">Chrome oturumu kapatılsın mı?</translation> <translation id="4254813446494774748">Çeviri Dili:</translation> <translation id="4256782883801055595">Açık kaynak lisansları</translation> <translation id="4259722352634471385">Gezinme engellendi: <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Bundan sonra yakınlardaki Fiziksel Web sayfaları bildirimler listenizde gösterilecek</translation> <translation id="4498934959426056365">Anahtar oluşturma</translation> <translation id="4505554159887937799">Çevrimdışına kaydedildi</translation> +<translation id="4508440807153586353">Yalnızca parolanızı bilen biri, şifrelenmiş verilerinizi okuyabilir. Parola Google'a gönderilmez veya Google tarafından saklanmaz. Parolanızı unutursanız veya bu ayarı değiştirmek isterseniz senkronizasyonu sıfırlamanız gerekir. <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# gün önce}other{# gün önce}}</translation> <translation id="4522570452068850558">Ayrıntılar</translation> <translation id="4526249700380860531">Kaydedilmiş şifreleri <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> adresinden görüntüleyin ve yönetin</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Yeni sekme</translation> <translation id="5271967389191913893">Cihaz, indirilecek içeriği açamıyor.</translation> <translation id="5275558766013849309">Sekmeler son kullanılan uygulamalarla birlikte görüntülenecek.</translation> +<translation id="5284584623296338184">Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızda yaptığınız değişiklikler artık Google Hesabınız ile senkronize edilmeyecek. Ancak, mevcut verileriniz Google hesabınızda saklanmaya devam edecek.</translation> <translation id="5301954838959518834">Evet, anladım</translation> <translation id="5302048478445481009">Dil</translation> <translation id="5304593522240415983">Bu alan boş olamaz</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Kayıtlı adı/şifreyi veya istisnayı düzenleyin</translation> <translation id="5442257541162692417">Kaydedilen sayfayı düzenle</translation> <translation id="544291274896356069">Bu bağlantı harici bir uygulamada açılırsa gizli moddan çıkılacak. Devam edilsin mi?</translation> +<translation id="5487521232677179737">Verileri temizle</translation> <translation id="5487729733663684359">Chrome güncellemeleri Android'in bu sürümü için artık desteklenmiyor.</translation> <translation id="5511351932351731210">Her zaman gönder</translation> <translation id="5512137114520586844">Bu hesap <ph name="PARENT_NAME" /> tarafından yönetiliyor.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google Çeviri</translation> <translation id="5916664084637901428">Açık</translation> <translation id="5939518447894949180">Sıfırla</translation> +<translation id="5965336165840183977">Bu işlem, senkronize edilen verileri tüm cihazlardan temizler. Google hesabı oturumunuz kapatılmaz. Kayıtlı site ayarları silinmeyecektir ve göz atma alışkanlıklarınızı yansıtabilir.</translation> <translation id="5968595432776860642">“<ph name="VIDEO_TITLE" />” oynatılıyor</translation> <translation id="6010869025736512584">Video girişine erişiliyor</translation> <translation id="6012342843556706400">Chrome'un konumu bu siteyle paylaşması için konum erişimine ihtiyacı var.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Korunan içerik</translation> <translation id="6612856669344839356">Yer işaretini kaydet</translation> <translation id="6627583120233659107">Klasörü düzenle</translation> +<translation id="6647073004883890710"><ph name="USERNAME" /> adlı kullanıcının bu siteye ait şifresinin <ph name="PASSWORD_MANAGER_BRAND" /> tarafından güncellenmesini istiyor musunuz?</translation> <translation id="6656545060687952787">Chrome'un cihazları taraması için konuma erişmesi gerekiyor. <ph name="BEGIN_LINK" />İzinleri güncelleyin<ph name="END_LINK" /></translation> <translation id="666268767214822976">Adres çubuğuna yazarken ilgili sorguları ve popüler siteleri göstermek için bir tahmin hizmeti kullan</translation> <translation id="666981079809192359">Chrome Gizlilik Uyarısı</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Kaydedilen sayfa çevrimdışı olarak kullanılamıyor</translation> <translation id="6722992508235227685">Yer işaretleri, geçmiş, şifre ve diğer ayarlarınız Google Hesabınızla senkronize edilecek. Böylece, bu ayarlarınızı tüm cihazlarınızda kullanabileceksiniz. Nelerin senkronize edileceğini <ph name="BEGIN_LINK1" />Ayarlar<ph name="END_LINK1" />'da seçebilirsiniz.</translation> <translation id="6738867403308150051">İndiriliyor…</translation> +<translation id="6762156594045689028">Bu ayarı değiştirmek için <ph name="BEGIN_LINK" />senkronizasyonu sıfırlayın<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Chrome'un Güvenli Tarama sistemi, kötü amaçlı sayfaların tespit edilmesinin yanı sıra sizi kimlik avı, kötü amaçlı uygulama ve zararlı indirme işlemlerine karşı korumak için de kullanılır.</translation> <translation id="6784675033504223784">Şunu ara: “<ph name="SEARCH_TERM" />”</translation> <translation id="6790428901817661496">Oynat</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Yer işaretlerinize, geçmişinize ve diğer ayarlarınıza tüm cihazlarınızdan erişmek için oturum açın.</translation> <translation id="6945221475159498467">Seç</translation> <translation id="6963766334940102469">Yer işaretlerini silme</translation> -<translation id="6964496835063002391">Bir hesap ekleyin</translation> <translation id="6965382102122355670">Tamam</translation> <translation id="6973630695168034713">Klasörler</translation> <translation id="6978479750597523876">Çeviri ayarlarını sıfırla</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Yavaş bağlantı algılandı</translation> <translation id="7057058088140140610">Google Payments'ı kullanan kredi kartları ve adresler</translation> <translation id="7063006564040364415">Senkronizasyon sunucusuna bağlanılamadı.</translation> +<translation id="7074853159844403180"><ph name="SITE" />, şu cihazla eşlenmek istiyor:</translation> +<translation id="7081639897063626814">Mevcut verileri ayrı tut</translation> <translation id="7094922512924405309">Yakınlarda herhangi bir Fiziksel Web sayfası bulunamadı</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> açık sekme</translation> <translation id="7096034533295549981">Video yükleniyor</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Yardım<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Yer işaretini sil</translation> <translation id="7324738665594301612">Bir deney kapsamında, Google sunucuları aracılığıyla HTTPS sayfalarına proxy uygulama işlevini test ediyoruz.</translation> +<translation id="7346217184097589238">Kayıtlı site ayarları silinmeyecektir ve göz atma alışkanlıklarınızı yansıtabilir.</translation> <translation id="7346909386216857016">Tamam, anladım</translation> +<translation id="7347770551817603360">Çevrimdışı içerik</translation> <translation id="7363354739009474003">“<ph name="VIDEO_TITLE" />” yükleniyor</translation> <translation id="7366340029385295517"><ph name="SCREEN_NAME" /> ekranına yayınlanıyor</translation> <translation id="7375125077091615385">Tür:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Cihazın kimlik bilgilerini silmeyi onaylayın</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (<ph name="TIME_SINCE_UPDATE" /> güncellendi)</translation> <translation id="7498271377022651285">Lütfen bekleyin…</translation> +<translation id="7499262814309712782">Hesabı senkronize et</translation> <translation id="7501135638693251872">Tüm yer işaretleri</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Göz atma verileri temizleniyor</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Sayfa çevrimdışına kaydedildi. Depolama alanı neredeyse doldu.</translation> <translation id="8068648041423924542">Sertifika seçilemiyor.</translation> <translation id="8069239273282989646">Sıkıştırmadan sonra</translation> +<translation id="8073388330009372546">Resmi yeni sekmede aç</translation> <translation id="8084156870963450514">Herhangi bir cihazdan tüm web öğelerinize erişmek için oturum açın</translation> <translation id="8106211421800660735">Kredi kartı numarası</translation> <translation id="813082847718468539">Site bilgilerini görüntüle</translation> <translation id="8137558756159375272">Dokun ve Ara, seçilen kelimeyi ve geçerli sayfayı Google Arama'ya bağlam olarak gönderir. Bu özelliği <ph name="BEGIN_LINK" />Ayarlar<ph name="END_LINK" />'da kapatabilirsiniz.</translation> <translation id="8146397137182589628">Çevrimdışına kaydedilmedi</translation> <translation id="8168435359814927499">İçerik</translation> +<translation id="8173098127580644436">en baştan</translation> <translation id="8200772114523450471">Sürdür</translation> <translation id="8209050860603202033">Resmi aç</translation> <translation id="8218346974737627104">Oturum açmayı onaylayın</translation> <translation id="8218934717680664417">Artık tek bir dokunuşla arama yapabilirsiniz</translation> +<translation id="8223946939421658889">Şu zamandan itibaren olan verileri temizle:</translation> <translation id="8261506727792406068">Sil</translation> <translation id="8275818695183729150">İzin ver (adres çubuğu aramaları için)</translation> +<translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> ile senkronize ediliyor</translation> <translation id="8310344678080805313">Standart sekmeler</translation> <translation id="8374821112118309944">TalkBack'i daha yeni bir sürüme güncellemeniz gerekiyor.</translation> <translation id="8396312449826231789">Sadece onaylı siteler</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Önce sor (önerilir)</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8429160401486700187">Kaydedilen sayfaları sil</translation> +<translation id="8433057134996913067">Bu işlem, çoğu web sitesinden çıkış yapmanıza neden olacak.</translation> <translation id="8481940801237642152">Bu siteye bağlantınız gizli bir bağlantı, ancak ağ üzerindeki biri sayfanın görünümünü değiştirebilir.</translation> <translation id="8493948351860045254">Yer aç</translation> <translation id="8497726226069778601">Burada görülecek bir şey yok… henüz</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Bu siteye bağlantınız gizli.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Gezinme işlevine ulaşılamıyor: <ph name="URL" /></translation> +<translation id="8979340629087822094">son 1 gün</translation> <translation id="8987061207681586800">Chrome'u size özel yapın</translation> <translation id="9019902583201351841">Ebeveynleriniz tarafından yönetiliyor</translation> <translation id="9020607083536754075">Geçerli sekmeyi kapat ve önceki uygulamaya geri dön</translation> +<translation id="9038649477754266430">Sayfaları daha hızlı yüklemek için bir tahmin hizmeti kullanın</translation> <translation id="9050666287014529139">Parola</translation> <translation id="9060538597317784206"><ph name="APP_NAME" /> uygulamasını Play Store'da görüntüle. Derecelendirme: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Masaüstü sitesi istemeyi devre dışı bırak</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb index 5590cd7..ffa3879 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="uk"> +<translation id="1040144152982955218">Пошук пристроїв… <ph name="BEGIN_LINK" />Довідка<ph name="END_LINK" /></translation> <translation id="1056898198331236512">Застереження</translation> <translation id="10614374240317010">Ніколи не зберігалося</translation> <translation id="1061441684050139317">Chrome потрібен доступ до мікрофона, щоб дозволити цьому сайту використовувати його.</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">Додайте обліковий запис, щоб мати доступ до закладок, історії, паролів та інших налаштувань на всіх своїх пристроях.</translation> <translation id="1098052486217676340">Завершено</translation> <translation id="1121094540300013208">Звіти про використання й аварійне завершення роботи</translation> +<translation id="1137305377394488060">останню годину</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1181037720776840403">Видалити</translation> <translation id="1197267115302279827">Перемістити закладки</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Дудл Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Зупинити</translation> <translation id="1285320974508926690">Ніколи не перекладати цей сайт</translation> +<translation id="1291207594882862231">Очистити історію, файли cookie, дані сайтів, кеш…</translation> <translation id="129553762522093515">Нещодавно закриті</translation> <translation id="1346090444609141578">Немає збережених сторінок</translation> <translation id="1369915414381695676">Сайт <ph name="SITE_NAME" /> додано</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1623104350909869708">Заборонити цій сторінці створювати додаткові діалогові вікна</translation> <translation id="1641113438599504367">Безпечний перегляд</translation> +<translation id="164269334534774161">Ви переглядаєте офлайн-копію цієї сторінки, створену <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Сторінка перекладається такою мовою: <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Історія</translation> <translation id="1647391597548383849">Доступ до камери</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">Налаштування перекладу скинуто.</translation> <translation id="2359808026110333948">Продовжити</translation> <translation id="2381756643783702095">Запитувати, перш ніж надсилати (рекомендується)</translation> +<translation id="2385560268894525395">останній тиждень</translation> <translation id="2387895666653383613">Масштаб тексту</translation> <translation id="238909021488141516">Сталася помилка під час завантаження вмісту.</translation> <translation id="2414886740292270097">Темна</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">Оновити сторінку</translation> <translation id="2709516037105925701">Автозаповнення</translation> <translation id="271033894570825754">Новий</translation> +<translation id="2742271047622814453">Також може бути видалено збережені налаштування для сайтів</translation> <translation id="2748463065602559597">Ви переглядаєте безпечну сторінку Google Chrome.</translation> <translation id="2762000892062317888">щойно</translation> <translation id="2770465223704140727">Видалити зі списку</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">Цим обліковим записом керують <ph name="PARENT_NAME_1" /> і <ph name="PARENT_NAME_2" />.</translation> <translation id="2960796085439532066">Авторське право <ph name="YEAR" /> Google Inc. Усі права захищено.</translation> <translation id="2968755619301702150">Перегляд сертифікатів</translation> +<translation id="2996291259634659425">Створити парольну фразу</translation> <translation id="2996809686854298943">Потрібна URL-адреса</translation> <translation id="3029704984691124060">Парольні фрази не збігаються</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />Довідка<ph name="END_LINK" /></translation> <translation id="3063601790762993062">Зберегти відео</translation> <translation id="306566828762083630">Пам’ять пристрою заповнено. Видаліть інші медіафайли, щоб звільнити місце.</translation> <translation id="307329814453917357">Пропонувати перекладати сторінки в Перекладачі Google</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">Увімкніть дозволи для Chrome у <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> збережених даних</translation> <translation id="3207960819495026254">Створено закладку</translation> +<translation id="321773570071367578">Якщо ви забули парольну фразу або хочете змінити це налаштування, <ph name="BEGIN_LINK" />скиньте синхронізацію<ph name="END_LINK" /></translation> <translation id="3227137524299004712">Мікрофон</translation> <translation id="3232754137068452469">Веб-додаток</translation> <translation id="3244271242291266297">ММ</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">Завантажити вміст?</translation> <translation id="3328801116991980348">Інформація про сайт</translation> <translation id="3350687908700087792">Закрити всі анонімні вікна</translation> +<translation id="3351441609270267898">Імпортувати наявні дані</translation> <translation id="3358663646935160692">Цим обліковим записом керує домен <ph name="DOMAIN_NAME" />. Ви входите в керований обліковий запис і дозволяєте його адміністратору керувати вашим профілем Chrome. Ваші дані Chrome буде назавжди пов’язано з цим обліковим записом. Відключення від цього облікового запису видалить усі локальні дані Chrome.</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">Нова анонімна вкладка</translation> <translation id="3501331331116143684">Сторінку збережено офлайн: "<ph name="FOLDER_NAME" />"</translation> <translation id="3518985090088779359">Прийняти та продовж.</translation> +<translation id="3522247891732774234">Доступне оновлення. Більше опцій</translation> <translation id="3527085408025491307">Папка</translation> <translation id="3549644494707163724">Шифрувати всі синхронізовані дані за допомогою власної парольної фрази для синхронізації</translation> <translation id="360480449234699036">Дізнавайтеся більше про теми на веб-сайтах, не залишаючи сторінку. Функція пошуку дотиком надсилає слово та його контекст у Пошук Google і повертає визначення, зображення, результати пошуку й інші дані. @@ -193,6 +204,7 @@ <translation id="3895926599014793903">Примусово ввімкнути масштабування</translation> <translation id="3917783807003067648">Доступ до геоданих заблоковано</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">останні 4 тижні</translation> <translation id="393697183122708255">Голосовий пошук вимкнено</translation> <translation id="3950820424414687140">Увійти</translation> <translation id="3988213473815854515">Доступ до геоданих надано</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">Відкрити в новій вкладці</translation> <translation id="4198229475320555619">Закладку обсягом <ph name="PAGE_SIZE_STRING" /> збережено офлайн</translation> <translation id="423410644998903704">Chrome потрібен доступ до дозволів, щоб дозволити цьому сайту використовувати їх.</translation> +<translation id="424864128008805179">Вийти з Chrome?</translation> <translation id="4254813446494774748">Мова перекладу:</translation> <translation id="4256782883801055595">Ліцензії ПЗ з відкритим кодом</translation> <translation id="4259722352634471385">Веб-сторінку <ph name="URL" /> заблоковано</translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">Сторінки поблизу із сервісу "Інтернет навколо нас" з’являтимуться в списку сповіщень</translation> <translation id="4498934959426056365">Генерування ключів</translation> <translation id="4505554159887937799">Для перегляду офлайн</translation> +<translation id="4508440807153586353">Ваші зашифровані дані можуть переглядати лише користувачі, які знають вашу парольну фразу. Парольна фраза не надсилається й не зберігається в Google. Якщо ви забули її або хочете змінити це налаштування, скиньте синхронізацію. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# день тому}one{# день тому}few{# дні тому}many{# днів тому}other{# дня тому}}</translation> <translation id="4522570452068850558">Деталі</translation> <translation id="4526249700380860531">Переглядайте збережені паролі та керуйте ними на сторінці <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">Нова вкладка</translation> <translation id="5271967389191913893">Вміст, який ви хочете завантажити, не можна відкрити на цьому пристрої.</translation> <translation id="5275558766013849309">Вкладки відображатимуться разом із нещодавно відкритими додатками.</translation> +<translation id="5284584623296338184">Зміни в закладках, історії, паролях та інших налаштуваннях більше не синхронізуватимуться з вашим обліковим записом Google. Однак наявні дані залишаться у вашому обліковому записі Google.</translation> <translation id="5301954838959518834">OK</translation> <translation id="5302048478445481009">Мова</translation> <translation id="5304593522240415983">Це поле не може бути порожнім</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">Редагувати збережене ім’я/пароль або виняток</translation> <translation id="5442257541162692417">Редагувати збережену сторінку</translation> <translation id="544291274896356069">Якщо ви відкриєте це посилання в зовнішньому додатку, буде вимкнено режим анонімного перегляду. Продовжити?</translation> +<translation id="5487521232677179737">Видалити дані</translation> <translation id="5487729733663684359">Chrome більше не оновлюється в цій версії Android.</translation> <translation id="5511351932351731210">Завжди надсилати</translation> <translation id="5512137114520586844">Цим обліковим записом керує <ph name="PARENT_NAME" />.</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Перекладач Google</translation> <translation id="5916664084637901428">Увімкнути</translation> <translation id="5939518447894949180">Скинути</translation> +<translation id="5965336165840183977">Синхронізовані дані буде видалено з усіх пристроїв. Ви не вийдете зі свого облікового запису Google. Збережені налаштування, які стосуються ваших зацікавлень в Інтернеті, не буде видалено.</translation> <translation id="5968595432776860642">Відео "<ph name="VIDEO_TITLE" />" відтворюється</translation> <translation id="6010869025736512584">Отримання доступу до відеовходу</translation> <translation id="6012342843556706400">Chrome потрібен доступ до геоданих, щоб дозволити цьому сайту використовувати їх.</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">Захищений вміст</translation> <translation id="6612856669344839356">Зберегти закладку</translation> <translation id="6627583120233659107">Редагувати папку</translation> +<translation id="6647073004883890710">Оновити пароль користувача <ph name="USERNAME" /> для цього сайту в <ph name="PASSWORD_MANAGER_BRAND" />?</translation> <translation id="6656545060687952787">Щоб знаходити пристрої, Chrome потрібний доступ до геоданих. <ph name="BEGIN_LINK" />Оновлити дозволи<ph name="END_LINK" /></translation> <translation id="666268767214822976">Показувати підказки зі схожими запитами та популярними веб-сайтами під час введення запиту в адресному рядку</translation> <translation id="666981079809192359">Примітка про конфіденційність Chrome</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">Збережена сторінка недоступна в режимі офлайн</translation> <translation id="6722992508235227685">Ваші закладки, історія, паролі й інші налаштування синхронізуватимуться з обліковим записом Google, щоб ви могли користуватися ними на всіх своїх пристроях. У <ph name="BEGIN_LINK1" />Налаштуваннях<ph name="END_LINK1" /> можна вибрати, що синхронізувати.</translation> <translation id="6738867403308150051">Завантаження…</translation> +<translation id="6762156594045689028">Щоб змінити це налаштування, <ph name="BEGIN_LINK" />скиньте синхронізацію<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Система Безпечного перегляду Chrome також використовується для виявлення шкідливих сторінок і захисту від фішингу, зловмисного програмного забезпечення та небезпечних завантажень.</translation> <translation id="6784675033504223784">Шукати "<ph name="SEARCH_TERM" />"</translation> <translation id="6790428901817661496">Відтворити</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">Увійдіть в обліковий запис, щоб мати доступ до своїх закладок, історії, паролів та інших налаштувань на всіх своїх пристроях</translation> <translation id="6945221475159498467">Вибрати</translation> <translation id="6963766334940102469">Видалити закладки</translation> -<translation id="6964496835063002391">Додати обліковий запис</translation> <translation id="6965382102122355670">ОК</translation> <translation id="6973630695168034713">Папки</translation> <translation id="6978479750597523876">Скинути налаштування перекладу</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">Виявлено повільне з’єднання</translation> <translation id="7057058088140140610">Кредитні картки й адреси, додані в Google Payments</translation> <translation id="7063006564040364415">Не вдалося з’єднатись із сервером синхронізації.</translation> +<translation id="7074853159844403180">Сайт <ph name="SITE" /> хоче підключитися до:</translation> +<translation id="7081639897063626814">Зберігати наявні дані окремо</translation> <translation id="7094922512924405309">Немає сторінок із сервісу "Інтернет навколо нас"</translation> <translation id="7095930899177687653">Відкрито вкладок: <ph name="OPEN_TABS" /></translation> <translation id="7096034533295549981">Завантаж. відео</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Довідка<ph name="END_LINK" /></translation> <translation id="7299721129597238157">Видалити закладку</translation> <translation id="7324738665594301612">Перевірка передавання сторінок HTTPS через сервери Google є частиною експерименту.</translation> +<translation id="7346217184097589238">Збережені налаштування сайту, які стосуються ваших зацікавлень в Інтернеті, не буде видалено.</translation> <translation id="7346909386216857016">OK</translation> +<translation id="7347770551817603360">Офлайн-вміст</translation> <translation id="7363354739009474003">Відео "<ph name="VIDEO_TITLE" />" завантажується</translation> <translation id="7366340029385295517">Трансляція на екран "<ph name="SCREEN_NAME" />"</translation> <translation id="7375125077091615385">Тип:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">Підтвердити видалення облікових даних пристрою</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (оновлено: <ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">Зачекайте…</translation> +<translation id="7499262814309712782">Обліковий запис для синхронізації</translation> <translation id="7501135638693251872">Усі закладки</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">Очищення даних веб-перегляду</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">Збережено офлайн. Пам’ять майже повна.</translation> <translation id="8068648041423924542">Не вдалося вибрати сертифікат.</translation> <translation id="8069239273282989646">Після стиснення</translation> +<translation id="8073388330009372546">Відкрити в новій вкладці</translation> <translation id="8084156870963450514">Увійдіть в обліковий запис, щоб користуватися збереженим веб-вмістом на будь-якому пристрої</translation> <translation id="8106211421800660735">Номер кредитної картки</translation> <translation id="813082847718468539">Перегляд інформації про сайт</translation> <translation id="8137558756159375272">Функція пошуку дотиком надсилає слово та поточну сторінку як додаткові дані в Пошук Google. Її можна вимкнути в <ph name="BEGIN_LINK" />налаштуваннях<ph name="END_LINK" />.</translation> <translation id="8146397137182589628">Не збережено для перегляду в режимі офлайн</translation> <translation id="8168435359814927499">Вміст</translation> +<translation id="8173098127580644436">весь період</translation> <translation id="8200772114523450471">Поновити</translation> <translation id="8209050860603202033">Відкрити зображення</translation> <translation id="8218346974737627104">Підтвердити вхід</translation> <translation id="8218934717680664417">Тепер можна шукати вміст одним дотиком</translation> +<translation id="8223946939421658889">Очистити дані за</translation> <translation id="8261506727792406068">Видалити</translation> <translation id="8275818695183729150">Дозволити (для пошуку в адресному рядку)</translation> +<translation id="8283853025636624853">Синхронізація з обліковим записом <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">Стандартні вкладки</translation> <translation id="8374821112118309944">Потрібно оновити додаток TalkBack до новішої версії.</translation> <translation id="8396312449826231789">Лише схвалені сайти</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">Спершу запитувати (рекомендується)</translation> <translation id="8428213095426709021">Налаштування</translation> <translation id="8429160401486700187">Видалити збережені сторінки</translation> +<translation id="8433057134996913067">Ви вийдете з облікового запису на більшості веб-сайтів.</translation> <translation id="8481940801237642152">Ваше з’єднання з сайтом приватне, але хтось у мережі може змінювати вигляд сторінки.</translation> <translation id="8493948351860045254">Звільнити місце</translation> <translation id="8497726226069778601">Тут ще нічого немає…</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">Ваше з’єднання з цим сайтом конфіденційне.</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">Веб-сторінка <ph name="URL" /> недоступна</translation> +<translation id="8979340629087822094">останній день</translation> <translation id="8987061207681586800">Chrome саме для вас</translation> <translation id="9019902583201351841">Керується батьками</translation> <translation id="9020607083536754075">Закрити поточну вкладку й повернутися в попередній додаток</translation> +<translation id="9038649477754266430">Користуйтеся службою передбачення, щоб сторінки завантажувалися швидше</translation> <translation id="9050666287014529139">Парольна фраза</translation> <translation id="9060538597317784206">Перегляньте додаток <ph name="APP_NAME" /> у магазині Google Play. Оцінка: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Вимкнути функцію "Запитувати версію сайту для комп’ютера"</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb index 73015ef..2412bb6e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -22,6 +22,7 @@ <translation id="1258753120186372309">Hình tượng trưng của Google: <ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">Dừng</translation> <translation id="1285320974508926690">Không bao giờ dịch trang web này</translation> +<translation id="1291207594882862231">Xóa lịch sử, cookie, dữ liệu trang web, bộ nhớ cache…</translation> <translation id="129553762522093515">Các tab đã đóng gần đây</translation> <translation id="1346090444609141578">Chưa có trang đã lưu nào ở đây</translation> <translation id="1369915414381695676">Đã thêm trang web <ph name="SITE_NAME" /></translation> @@ -52,6 +53,7 @@ <translation id="1620510694547887537">Máy ảnh</translation> <translation id="1623104350909869708">Ngăn trang này tạo hộp thoại bổ sung</translation> <translation id="1641113438599504367">Duyệt web an toàn</translation> +<translation id="164269334534774161">Bạn đang xem bản sao ngoại tuyến của trang này từ <ph name="CREATION_TIME" /></translation> <translation id="1643702317193804718">Đang dịch trang sang <ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">Lịch sử</translation> <translation id="1647391597548383849">Truy cập máy ảnh của bạn</translation> @@ -128,6 +130,7 @@ <translation id="2707726405694321444">Làm mới trang</translation> <translation id="2709516037105925701">Tự động điền</translation> <translation id="271033894570825754">Mới</translation> +<translation id="2742271047622814453">Tùy chọn đã lưu trên trang web có thể bị xóa</translation> <translation id="2748463065602559597">Bạn đang xem trang Google Chrome an toàn.</translation> <translation id="2762000892062317888">vừa xong</translation> <translation id="2770465223704140727">Xóa khỏi danh sách</translation> @@ -168,6 +171,7 @@ <translation id="3303414029551471755">Tiếp tục tải xuống nội dung?</translation> <translation id="3328801116991980348">Thông tin về trang web</translation> <translation id="3350687908700087792">Đóng tất cả các tab ẩn danh</translation> +<translation id="3351441609270267898">Nhập dữ liệu hiện có</translation> <translation id="3358663646935160692">Tài khoản này được quản lý bởi <ph name="DOMAIN_NAME" />. Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp cho quản trị viên quyền kiểm soát đối với hồ sơ trên Chrome của bạn. Dữ liệu Chrome của bạn sẽ vĩnh viễn gắn với tài khoản này. Ngắt kết nối khỏi tài khoản này sẽ xóa các dữ liệu Chrome trên máy.</translation> @@ -179,6 +183,7 @@ <translation id="3492207499832628349">Tab ẩn danh mới</translation> <translation id="3501331331116143684">Đã lưu trang ngoại tuyến vào <ph name="FOLDER_NAME" /></translation> <translation id="3518985090088779359">Chấp nhận và tiếp tục</translation> +<translation id="3522247891732774234">Bản cập nhật có sẵn. Tùy chọn khác</translation> <translation id="3527085408025491307">Thư mục</translation> <translation id="3549644494707163724">Mã hóa tất cả dữ liệu đã đồng bộ hóa bằng cụm mật khẩu đồng bộ hóa của riêng bạn</translation> <translation id="360480449234699036">Tìm hiểu về các chủ đề trên trang web mà không rời khỏi trang. Chạm để Tìm kiếm gửi một từ và ngữ cảnh xung quanh từ đó tới Google Tìm kiếm, trả về định nghĩa, hình ảnh, kết quả tìm kiếm và các chi tiết khác. @@ -221,7 +226,6 @@ <translation id="4195643157523330669">Mở bằng tab mới</translation> <translation id="4198229475320555619">Đã lưu dấu trang <ph name="PAGE_SIZE_STRING" /> ngoại tuyến</translation> <translation id="423410644998903704">Chrome cần quyền truy cập quyền để chia sẻ quyền với trang web này.</translation> -<translation id="4247939399682707041">Thay thế dữ liệu của thiết bị này bằng dữ liệu của <ph name="ACCOUNT" />. Bạn có thể truy xuất dữ liệu hiện có của mình bằng cách chuyển về <ph name="ACCOUNT" /></translation> <translation id="424864128008805179">Đăng xuất khỏi Chrome?</translation> <translation id="4254813446494774748">Ngôn ngữ dịch:</translation> <translation id="4256782883801055595">Giấy phép nguồn mở</translation> @@ -425,6 +429,7 @@ <translation id="6612358246767739896">Nội dung được bảo vệ</translation> <translation id="6612856669344839356">Lưu dấu trang</translation> <translation id="6627583120233659107">Chỉnh sửa thư mục</translation> +<translation id="6647073004883890710">Bạn có muốn <ph name="PASSWORD_MANAGER_BRAND" /> cập nhật mật khẩu cho <ph name="USERNAME" /> cho trang web này không?</translation> <translation id="6656545060687952787">Chrome cần có quyền truy cập vị trí để quét tìm thiết bị. <ph name="BEGIN_LINK" />Cập nhật quyền<ph name="END_LINK" /></translation> <translation id="666268767214822976">Sử dụng dịch vụ dự đoán để hiển thị các truy vấn có liên quan và các trang web phổ biến khi bạn nhập vào thanh địa chỉ</translation> <translation id="666981079809192359">Thông báo bảo mật của Chrome</translation> @@ -452,7 +457,6 @@ <translation id="6868088497967843822">Đăng nhập để nhận dấu trang, lịch sử, mật khẩu và các cài đặt khác trên tất cả các thiết bị của bạn</translation> <translation id="6945221475159498467">Chọn</translation> <translation id="6963766334940102469">Xóa dấu trang</translation> -<translation id="6964496835063002391">Thêm tài khoản</translation> <translation id="6965382102122355670">OK</translation> <translation id="6973630695168034713">Thư mục</translation> <translation id="6978479750597523876">Đặt lại cài đặt dịch</translation> @@ -484,6 +488,7 @@ <translation id="7324738665594301612">Chúng tôi đang kiểm tra việc ủy quyền các trang HTTPS thông qua máy chủ Google dưới dạng một phần của thử nghiệm.</translation> <translation id="7346217184097589238">Cài đặt trang web đã lưu sẽ không bị xóa và có thể phản ánh thói quen duyệt web của bạn.</translation> <translation id="7346909386216857016">Ok</translation> +<translation id="7347770551817603360">Nội dung ngoại tuyến</translation> <translation id="7363354739009474003">Đang tải “<ph name="VIDEO_TITLE" />”</translation> <translation id="7366340029385295517">Đang truyền tới <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">Loại:</translation> @@ -544,6 +549,7 @@ <translation id="8050319187894766337">Đã lưu trang ngoại tuyến. Bộ nhớ sắp đầy.</translation> <translation id="8068648041423924542">Không thể chọn chứng chỉ.</translation> <translation id="8069239273282989646">Sau khi nén</translation> +<translation id="8073388330009372546">Mở ảnh trong tab mới</translation> <translation id="8084156870963450514">Đăng nhập để truy cập tất cả nội dung trên trang web của bạn từ mọi thiết bị</translation> <translation id="8106211421800660735">Số thẻ tín dụng</translation> <translation id="813082847718468539">Xem thông tin trang web</translation> @@ -566,6 +572,7 @@ <translation id="8413385045638830869">Hỏi trước (được đề xuất)</translation> <translation id="8428213095426709021">Cài đặt</translation> <translation id="8429160401486700187">Xóa các trang đã lưu</translation> +<translation id="8433057134996913067">Thao tác này sẽ đăng xuất bạn khỏi hầu hết các trang web.</translation> <translation id="8481940801237642152">Kết nối của bạn tới trang web này ở chế độ riêng tư nhưng ai đó trên mạng có thể thay đổi giao diện của trang.</translation> <translation id="8493948351860045254">Giải phóng dung lượng</translation> <translation id="8497726226069778601">Chưa có gì để xem ở đây...</translation> @@ -610,6 +617,7 @@ <translation id="8987061207681586800">Tùy chỉnh riêng Chrome</translation> <translation id="9019902583201351841">Do cha mẹ của bạn quản lý</translation> <translation id="9020607083536754075">Đóng tab hiện tại và quay lại ứng dụng trước</translation> +<translation id="9038649477754266430">Sử dụng dịch vụ truy vấn dự đoán để tải trang nhanh hơn</translation> <translation id="9050666287014529139">Cụm mật khẩu</translation> <translation id="9060538597317784206">Xem ứng dụng <ph name="APP_NAME" /> trên Cửa hàng Play. Xếp hạng: <ph name="APP_RATING" />.</translation> <translation id="9063523880881406963">Tắt Yêu cầu trang web cho máy tính</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb index ed0e251..4decd97 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> +<translation id="1040144152982955218">正在搜索设备…<ph name="BEGIN_LINK" />获取帮助<ph name="END_LINK" /></translation> <translation id="1056898198331236512">警告</translation> <translation id="10614374240317010">一律不保存</translation> <translation id="1061441684050139317">Chrome 需要具有麦克风使用权限,才能批准此网站的分享请求。</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">请添加帐户,以便获取您所有设备上保存的书签、历史记录、密码和其他设置。</translation> <translation id="1098052486217676340">已完成</translation> <translation id="1121094540300013208">使用情况统计信息和崩溃报告</translation> +<translation id="1137305377394488060">过去 1 小时</translation> <translation id="1178581264944972037">暂停</translation> <translation id="1181037720776840403">删除</translation> <translation id="1197267115302279827">移动书签</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google 涂鸦:<ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">停止</translation> <translation id="1285320974508926690">一律不翻译此网站</translation> +<translation id="1291207594882862231">清除历史记录、Cookie、网站数据、缓存内容…</translation> <translation id="129553762522093515">最近关闭的标签页</translation> <translation id="1346090444609141578">此处未保存任何网页</translation> <translation id="1369915414381695676">网站 <ph name="SITE_NAME" /> 已添加</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">摄像头</translation> <translation id="1623104350909869708">阻止此页创建其他对话框</translation> <translation id="1641113438599504367">安全浏览</translation> +<translation id="164269334534774161">您目前浏览的是此网页的离线副本(创建时间:<ph name="CREATION_TIME" />)</translation> <translation id="1643702317193804718">正在将网页翻译成<ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">历史记录</translation> <translation id="1647391597548383849">使用您的摄像头</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">您的翻译设置已重置。</translation> <translation id="2359808026110333948">继续</translation> <translation id="2381756643783702095">发送前先询问(推荐)</translation> +<translation id="2385560268894525395">过去 1 周</translation> <translation id="2387895666653383613">文字大小</translation> <translation id="238909021488141516">下载该内容时出现错误。</translation> <translation id="2414886740292270097">深色调</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">刷新网页</translation> <translation id="2709516037105925701">自动填充</translation> <translation id="271033894570825754">新建</translation> +<translation id="2742271047622814453">已保存的网站偏好设置可能会被删除</translation> <translation id="2748463065602559597">您正在查看的是安全的 Google Chrome 浏览器网页。</translation> <translation id="2762000892062317888">刚刚</translation> <translation id="2770465223704140727">从列表中移除</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">该帐户由 <ph name="PARENT_NAME_1" /> 和 <ph name="PARENT_NAME_2" /> 管理。</translation> <translation id="2960796085439532066">版权所有 <ph name="YEAR" /> Google Inc. 保留所有权利。</translation> <translation id="2968755619301702150">证书查看器</translation> +<translation id="2996291259634659425">创建密码</translation> <translation id="2996809686854298943">必须提供网址</translation> <translation id="3029704984691124060">密码不匹配</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />获取帮助<ph name="END_LINK" /></translation> <translation id="3063601790762993062">保存视频</translation> <translation id="306566828762083630">设备存储空间已用尽,请移除其他媒体内容以释放空间。</translation> <translation id="307329814453917357">询问是否要使用“Google 翻译”来翻译网页内容</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中为 Chrome 启用这些权限。</translation> <translation id="3198916472715691905">已存储 <ph name="STORAGE_AMOUNT" /> 数据</translation> <translation id="3207960819495026254">已加书签</translation> +<translation id="321773570071367578">如果您忘记了密码或想更改此设置,请<ph name="BEGIN_LINK" />重置同步设置<ph name="END_LINK" /></translation> <translation id="3227137524299004712">麦克风</translation> <translation id="3232754137068452469">网络应用</translation> <translation id="3244271242291266297">MM</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">要开始下载该内容吗?</translation> <translation id="3328801116991980348">网站信息</translation> <translation id="3350687908700087792">关闭所有隐身标签页</translation> +<translation id="3351441609270267898">导入现有数据</translation> <translation id="3358663646935160692">此帐户由 <ph name="DOMAIN_NAME" /> 管理。 您目前登录的帐户是一个托管帐户,该帐户的管理员将能够控制您的 Chrome 个人资料。您的 Chrome 数据将永远与此帐户相关联。断开与此帐户的关联将删除本地 Chrome 数据。</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">新的隐身标签页</translation> <translation id="3501331331116143684">网页已离线保存到“<ph name="FOLDER_NAME" />”</translation> <translation id="3518985090088779359">接受并继续</translation> +<translation id="3522247891732774234">有更新。更多选项</translation> <translation id="3527085408025491307">文件夹</translation> <translation id="3549644494707163724">使用您自己的同步密码加密所有已同步数据</translation> <translation id="360480449234699036">无需离开所在页面,即可了解网站上的主题。“触摸搜索”功能会将被触摸的字词及上下文一起发送至 Google 搜索,后者将返回相应的定义、图片、搜索结果及其他详细信息。 @@ -193,6 +204,7 @@ <translation id="3895926599014793903">强制启用缩放功能</translation> <translation id="3917783807003067648">禁止访问位置信息</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">过去 4 周</translation> <translation id="393697183122708255">无法启用语音搜索功能</translation> <translation id="3950820424414687140">登录</translation> <translation id="3988213473815854515">允许访问位置信息</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">在新标签页中打开</translation> <translation id="4198229475320555619">书签已离线保存(大小:<ph name="PAGE_SIZE_STRING" />)</translation> <translation id="423410644998903704">Chrome 需要具有这些功能的使用权限,才能批准此网站的分享请求。</translation> +<translation id="424864128008805179">退出 Chrome?</translation> <translation id="4254813446494774748">翻译语言:</translation> <translation id="4256782883801055595">开放源代码许可</translation> <translation id="4259722352634471385">已屏蔽 <ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">日后附近的“实物网”网页将会显示在您的通知列表中</translation> <translation id="4498934959426056365">密钥生成</translation> <translation id="4505554159887937799">已离线保存</translation> +<translation id="4508440807153586353">只有知道您密码的人才能读取您的已加密数据。系统不会将该密码发送给 Google,Google 也不会存储该密码。如果您忘记了密码或想更改此设置,则需重置同步设置。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# 天前}other{# 天前}}</translation> <translation id="4522570452068850558">详细信息</translation> <translation id="4526249700380860531">通过 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> 查看和管理已保存的密码</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">打开新的标签页</translation> <translation id="5271967389191913893">设备无法打开要下载的内容。</translation> <translation id="5275558766013849309">标签页将与最近用过的应用一起显示。</translation> +<translation id="5284584623296338184">对您的书签、历史记录、密码和其他设置所做的更改将不再同步到您的 Google 帐户。但是,您的现有数据将继续存储在您的 Google 帐户中。</translation> <translation id="5301954838959518834">知道了</translation> <translation id="5302048478445481009">语言</translation> <translation id="5304593522240415983">此字段不能为空</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">修改已保存的名称/密码或例外情况</translation> <translation id="5442257541162692417">修改保存的网页</translation> <translation id="544291274896356069">如果在外部应用中打开此链接,您将退出隐身模式。是否继续?</translation> +<translation id="5487521232677179737">清除数据</translation> <translation id="5487729733663684359">该版本的 Android 不再支持 Chrome 更新。</translation> <translation id="5511351932351731210">一律发送</translation> <translation id="5512137114520586844">该帐户由 <ph name="PARENT_NAME" /> 管理。</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google 翻译</translation> <translation id="5916664084637901428">启用</translation> <translation id="5939518447894949180">重置</translation> +<translation id="5965336165840183977">这会清除所有设备上的已同步数据,但不会使您退出自己的 Google 帐户。已保存的网站设置不会被删除,并且可能会反映您的浏览习惯。</translation> <translation id="5968595432776860642">正在播放“<ph name="VIDEO_TITLE" />”</translation> <translation id="6010869025736512584">正在存取视频输入</translation> <translation id="6012342843556706400">Chrome 需要具有位置信息使用权,才能批准此网站的分享请求。</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">受保护的内容</translation> <translation id="6612856669344839356">保存书签</translation> <translation id="6627583120233659107">修改文件夹</translation> +<translation id="6647073004883890710">您希望 <ph name="PASSWORD_MANAGER_BRAND" /> 更新 <ph name="USERNAME" /> 用于登录此网站的密码吗?</translation> <translation id="6656545060687952787">Chrome 需要拥有位置信息权限才能扫描设备。<ph name="BEGIN_LINK" />更新权限<ph name="END_LINK" /></translation> <translation id="666268767214822976">当您在地址栏中输入查询内容时,使用联想查询服务显示相关查询和热门网站</translation> <translation id="666981079809192359">Chrome 隐私权声明</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">无法为保存的页面创建离线副本</translation> <translation id="6722992508235227685">您的书签、历史记录、密码和其他设置将同步到您的 Google 帐户,这样您便可以在自己的任意设备上使用这些内容。您可以在<ph name="BEGIN_LINK1" />设置<ph name="END_LINK1" />部分选择要同步的内容。</translation> <translation id="6738867403308150051">即将开始下载…</translation> +<translation id="6762156594045689028">要更改此设置,请<ph name="BEGIN_LINK" />重置同步设置<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Chrome 的安全浏览系统也将用于检测恶意网页,保护您免受网上诱骗、恶意软件和有害下载内容的侵害。</translation> <translation id="6784675033504223784">搜索“<ph name="SEARCH_TERM" />”</translation> <translation id="6790428901817661496">播放</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">登录后可获取您所有设备上保存的书签、历史记录、密码和其他设置</translation> <translation id="6945221475159498467">选择</translation> <translation id="6963766334940102469">删除书签</translation> -<translation id="6964496835063002391">添加帐户</translation> <translation id="6965382102122355670">确定</translation> <translation id="6973630695168034713">文件夹</translation> <translation id="6978479750597523876">重置翻译设置</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">检测到网速很慢</translation> <translation id="7057058088140140610">使用 Google Payments 存储的信用卡和地址信息</translation> <translation id="7063006564040364415">无法连接到同步服务器。</translation> +<translation id="7074853159844403180"><ph name="SITE" /> 希望与以下设备配对:</translation> +<translation id="7081639897063626814">将现有数据单独存储</translation> <translation id="7094922512924405309">找不到附近的“实物网”网页</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> 个打开的标签页</translation> <translation id="7096034533295549981">加载视频</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />帮助<ph name="END_LINK" /></translation> <translation id="7299721129597238157">删除书签</translation> <translation id="7324738665594301612">我们正在作为某项实验的参与者对通过 Google 服务器代理 HTTPS 网页进行测试。</translation> +<translation id="7346217184097589238">已保存的网站设置不会被删除,并且可能会反映您的浏览习惯。</translation> <translation id="7346909386216857016">知道了</translation> +<translation id="7347770551817603360">离线内容</translation> <translation id="7363354739009474003">正在加载“<ph name="VIDEO_TITLE" />”</translation> <translation id="7366340029385295517">正在投射至<ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">类型:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">确认删除设备凭据</translation> <translation id="7493994139787901920"><ph name="VERSION" />(上次更新时间:<ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">请稍候…</translation> +<translation id="7499262814309712782">同步帐户</translation> <translation id="7501135638693251872">所有书签</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">正在清除浏览数据</translation> @@ -526,25 +549,30 @@ <translation id="8050319187894766337">该网页已离线保存。存储空间即将用尽。</translation> <translation id="8068648041423924542">无法选择证书。</translation> <translation id="8069239273282989646">压缩后</translation> +<translation id="8073388330009372546">在新标签页中打开图片</translation> <translation id="8084156870963450514">登录后即可通过任意设备查看您的所有在线内容</translation> <translation id="8106211421800660735">信用卡号</translation> <translation id="813082847718468539">查看网站信息</translation> <translation id="8137558756159375272">“触摸搜索”会将所选字词和当前页面(作为上下文)一起发送给 Google 搜索。您可以在<ph name="BEGIN_LINK" />设置<ph name="END_LINK" />中停用此功能。</translation> <translation id="8146397137182589628">未离线保存</translation> <translation id="8168435359814927499">内容</translation> +<translation id="8173098127580644436">自始至今</translation> <translation id="8200772114523450471">继续</translation> <translation id="8209050860603202033">打开图片</translation> <translation id="8218346974737627104">确认登录</translation> <translation id="8218934717680664417">现在,您只需触摸一下即可启动搜索</translation> +<translation id="8223946939421658889">清除以下时间段内的数据:</translation> <translation id="8261506727792406068">删除</translation> <translation id="8275818695183729150">允许(针对地址栏搜索)</translation> +<translation id="8283853025636624853">正在同步到 <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">标准标签页</translation> -<translation id="8374821112118309944">您需要将“话语提示”更新到更高版本。</translation> +<translation id="8374821112118309944">您需要将 TalkBack 更新到更高版本。</translation> <translation id="8396312449826231789">只能访问经过批准的网站</translation> <translation id="8413126021676339697">显示全部历史记录</translation> <translation id="8413385045638830869">先询问(推荐)</translation> <translation id="8428213095426709021">设置</translation> <translation id="8429160401486700187">删除保存的网页</translation> +<translation id="8433057134996913067">这将使您退出大多数网站。</translation> <translation id="8481940801237642152">您与此网站建立的是私密连接,但网络上的某些用户也许能更改此网页的外观。</translation> <translation id="8493948351860045254">释放空间</translation> <translation id="8497726226069778601">目前还未列出任何网页…</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">您与此网站建立的是私密连接。</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">无法访问 <ph name="URL" /></translation> +<translation id="8979340629087822094">过去 1 天</translation> <translation id="8987061207681586800">定制自己专属的 Chrome</translation> <translation id="9019902583201351841">由您父母管理</translation> <translation id="9020607083536754075">关闭当前的标签页,并返回到之前的应用</translation> +<translation id="9038649477754266430">使用联想查询服务更快速地加载网页</translation> <translation id="9050666287014529139">密码</translation> <translation id="9060538597317784206">在 Play 商店中查看“<ph name="APP_NAME" />”应用。评分:<ph name="APP_RATING" />。</translation> <translation id="9063523880881406963">关闭“请求切换到桌面版网站”</translation> @@ -603,7 +633,7 @@ <translation id="9187199695613236444">适合在移动设备上浏览的视图</translation> <translation id="9192643434065497760">请在<ph name="BEGIN_LINK" />设备设置<ph name="END_LINK" />部分开启蓝牙,以允许配对。</translation> <translation id="9206873250291191720">A</translation> -<translation id="932327136139879170">家庭</translation> +<translation id="932327136139879170">首页</translation> <translation id="938850635132480979">错误:<ph name="ERROR_CODE" /></translation> <translation id="945632385593298557">使用您的麦克风</translation> <translation id="954352821720225055">存储空间即将用尽,无法为书签创建离线副本。</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb index dfb0a13..5821237 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-TW"> +<translation id="1040144152982955218">正在搜尋裝置… <ph name="BEGIN_LINK" />取得說明<ph name="END_LINK" /></translation> <translation id="1056898198331236512">警告</translation> <translation id="10614374240317010">永不儲存</translation> <translation id="1061441684050139317">Chrome 需要存取麥克風,才能與這個網站分享。</translation> @@ -8,6 +9,7 @@ <translation id="1095407227123756519">新增帳戶後,即可從任何裝置取得自己的書籤、歷史紀錄、密碼和其他設定。</translation> <translation id="1098052486217676340">已結束</translation> <translation id="1121094540300013208">使用資料和當機報告</translation> +<translation id="1137305377394488060">過去 1 小時</translation> <translation id="1178581264944972037">暫停</translation> <translation id="1181037720776840403">移除</translation> <translation id="1197267115302279827">移動書籤</translation> @@ -20,6 +22,7 @@ <translation id="1258753120186372309">Google Doodle:<ph name="DOODLE_DESCRIPTION" /></translation> <translation id="1272079795634619415">停止</translation> <translation id="1285320974508926690">一律不翻譯此網站</translation> +<translation id="1291207594882862231">清除歷史紀錄、Cookie、網站資料、快取…</translation> <translation id="129553762522093515">最近關閉的分頁</translation> <translation id="1346090444609141578">這個資料夾中尚未儲存任何網頁</translation> <translation id="1369915414381695676">已新增 <ph name="SITE_NAME" /> 網站</translation> @@ -50,6 +53,7 @@ <translation id="1620510694547887537">攝影機</translation> <translation id="1623104350909869708">防止這個網頁產生其他對話方塊</translation> <translation id="1641113438599504367">安全瀏覽</translation> +<translation id="164269334534774161">您目前瀏覽的是這個網頁的離線複本 (建立時間:<ph name="CREATION_TIME" />)</translation> <translation id="1643702317193804718">正在將網頁內容翻譯成<ph name="SOURCE_LANGUAGE" />…</translation> <translation id="1644574205037202324">歷史紀錄</translation> <translation id="1647391597548383849">存取您的攝影機</translation> @@ -99,6 +103,7 @@ <translation id="2351097562818989364">您的翻譯設定已重設。</translation> <translation id="2359808026110333948">繼續</translation> <translation id="2381756643783702095">傳送前詢問我 (建議)</translation> +<translation id="2385560268894525395">過去 1 週</translation> <translation id="2387895666653383613">文字大小</translation> <translation id="238909021488141516">下載這項內容時發生錯誤。</translation> <translation id="2414886740292270097">深色</translation> @@ -125,6 +130,7 @@ <translation id="2707726405694321444">重新整理頁面</translation> <translation id="2709516037105925701">自動填入</translation> <translation id="271033894570825754">新</translation> +<translation id="2742271047622814453">已儲存的網站偏好設定可能會遭到刪除</translation> <translation id="2748463065602559597">您正在瀏覽安全型 Google Chrome 網頁。</translation> <translation id="2762000892062317888">剛剛</translation> <translation id="2770465223704140727">從清單中移除</translation> @@ -139,8 +145,10 @@ <translation id="2956410042958133412">這個帳戶受 <ph name="PARENT_NAME_1" /> 和 <ph name="PARENT_NAME_2" /> 管理。</translation> <translation id="2960796085439532066">Copyright <ph name="YEAR" /> Google Inc. 版權所有。</translation> <translation id="2968755619301702150">憑證檢視器</translation> +<translation id="2996291259634659425">建立通關密語</translation> <translation id="2996809686854298943">必須要有網址</translation> <translation id="3029704984691124060">通關密語不符</translation> +<translation id="3036750288708366620"><ph name="BEGIN_LINK" />取得說明<ph name="END_LINK" /></translation> <translation id="3063601790762993062">儲存影片</translation> <translation id="306566828762083630">您的裝置儲存空間已用盡,請移除其他媒體以釋出空間。</translation> <translation id="307329814453917357">可使用「Google 翻譯」翻譯網頁內容</translation> @@ -151,6 +159,7 @@ <translation id="3190152372525844641">請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中為 Chrome 啟用這些權限。</translation> <translation id="3198916472715691905">儲存了 <ph name="STORAGE_AMOUNT" /> 的資料</translation> <translation id="3207960819495026254">已加入書籤</translation> +<translation id="321773570071367578">如果您忘記通關密語,或是想變更這項設定,請<ph name="BEGIN_LINK" />重設同步功能<ph name="END_LINK" /></translation> <translation id="3227137524299004712">麥克風</translation> <translation id="3232754137068452469">網路應用程式</translation> <translation id="3244271242291266297">月</translation> @@ -162,6 +171,7 @@ <translation id="3303414029551471755">繼續下載這項內容?</translation> <translation id="3328801116991980348">網站資訊</translation> <translation id="3350687908700087792">關閉所有無痕式分頁</translation> +<translation id="3351441609270267898">匯入現有的資料</translation> <translation id="3358663646935160692">這個帳戶由 <ph name="DOMAIN_NAME" /> 負責管理。 您即將登入受管理的帳戶,並且讓帳戶管理員控制您的 Chrome 設定檔。您的 Chrome 資料將與這個帳戶建立永久連結。如果與這個帳戶解除連結,本機 Chrome 資料將會遭到刪除。</translation> @@ -173,6 +183,7 @@ <translation id="3492207499832628349">新無痕式分頁</translation> <translation id="3501331331116143684">已將離線網頁儲存至「<ph name="FOLDER_NAME" />」</translation> <translation id="3518985090088779359">接受並繼續</translation> +<translation id="3522247891732774234">有可用的更新。更多選項</translation> <translation id="3527085408025491307">資料夾</translation> <translation id="3549644494707163724">使用您的通關密語對所有已同步處理的資料進行加密</translation> <translation id="360480449234699036">不需離開網頁即可瞭解網站上的主題。「輕觸搜尋」可將特定字詞及其上下文內容傳送至 Google 搜尋,並傳回字詞定義、相關圖片、搜尋結果和其他詳細資料。 @@ -193,6 +204,7 @@ <translation id="3895926599014793903">強制啟用縮放功能</translation> <translation id="3917783807003067648">位置資訊遭到封鎖</translation> <translation id="3927692899758076493">Sans Serif</translation> +<translation id="3931947361983910192">過去 4 週</translation> <translation id="393697183122708255">沒有可用的語音搜尋功能</translation> <translation id="3950820424414687140">登入</translation> <translation id="3988213473815854515">禁止存取位置資訊</translation> @@ -214,6 +226,7 @@ <translation id="4195643157523330669">在新分頁中開啟</translation> <translation id="4198229475320555619">已儲存離線書籤 (大小:<ph name="PAGE_SIZE_STRING" />)</translation> <translation id="423410644998903704">Chrome 需要存取權限,才能與這個網站分享。</translation> +<translation id="424864128008805179">要登出 Chrome 嗎?</translation> <translation id="4254813446494774748">翻譯語言:</translation> <translation id="4256782883801055595">開放原始碼授權</translation> <translation id="4259722352634471385">瀏覽的網址已封鎖:<ph name="URL" /></translation> @@ -233,6 +246,7 @@ <translation id="4457399174246232812">日後附近的實體化網路網頁會顯示在您的通知清單中</translation> <translation id="4498934959426056365">金鑰產生</translation> <translation id="4505554159887937799">儲存的離線網頁</translation> +<translation id="4508440807153586353">只有知道您通關密語的使用者,才能讀取加密保護的資料。系統不會將通關密語傳送給 Google,Google 也不會儲存通關密語。如果您忘記自己的通關密語,或是想變更這項設定,則必須重設同步功能。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="4513387527876475750">{DAYS,plural, =1{# 天前}other{# 天前}}</translation> <translation id="4522570452068850558">詳細資訊</translation> <translation id="4526249700380860531">您可以前往 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> 查看及管理已儲存的密碼</translation> @@ -297,6 +311,7 @@ <translation id="5233638681132016545">新增分頁</translation> <translation id="5271967389191913893">裝置無法開啟您要下載的這項內容。</translation> <translation id="5275558766013849309">分頁和最近使用的應用程式將會並列顯示。</translation> +<translation id="5284584623296338184">您更改過的書籤、歷史紀錄、密碼和其他設定不會繼續與您 Google 帳戶中的資料保持同步,但是您 Google 帳戶現有的資料仍會保留。</translation> <translation id="5301954838959518834">好,我瞭解了</translation> <translation id="5302048478445481009">語言</translation> <translation id="5304593522240415983">這個欄位不能留空</translation> @@ -315,6 +330,7 @@ <translation id="5424715742813396254">編輯已儲存的名稱/密碼或例外</translation> <translation id="5442257541162692417">編輯已儲存的網頁</translation> <translation id="544291274896356069">如果使用外部應用程式開啟這個連結,無痕模式就會結束。要繼續嗎?</translation> +<translation id="5487521232677179737">清除資料</translation> <translation id="5487729733663684359">這個 Android 版本已停止支援 Chrome 更新。</translation> <translation id="5511351932351731210">一律傳送</translation> <translation id="5512137114520586844">這個帳戶受 <ph name="PARENT_NAME" /> 管理。</translation> @@ -360,6 +376,7 @@ <translation id="5911030830365207728">Google 翻譯</translation> <translation id="5916664084637901428">開啟</translation> <translation id="5939518447894949180">重設</translation> +<translation id="5965336165840183977">這麼做會將已同步處理的資料從所有裝置上清除。您不會因此登出自己的 Google 帳戶。已儲存的網站設定不會遭到刪除,而且可能會反映您的瀏覽習慣。</translation> <translation id="5968595432776860642">正在播放「<ph name="VIDEO_TITLE" />」</translation> <translation id="6010869025736512584">正在存取視訊輸入</translation> <translation id="6012342843556706400">Chrome 需要存取位置資訊,才能與這個網站分享。</translation> @@ -412,6 +429,7 @@ <translation id="6612358246767739896">受保護內容</translation> <translation id="6612856669344839356">儲存書籤</translation> <translation id="6627583120233659107">編輯資料夾</translation> +<translation id="6647073004883890710">您要讓 <ph name="PASSWORD_MANAGER_BRAND" /> 更新 <ph name="USERNAME" /> 在這個網站設定的密碼嗎?</translation> <translation id="6656545060687952787">Chrome 需要位置資訊存取權才能掃描裝置。<ph name="BEGIN_LINK" />更新權限<ph name="END_LINK" /></translation> <translation id="666268767214822976">啟用預測查詢字串服務,讓您在網址列中輸入查詢內容時,能夠即時看到相關查詢和熱門網站</translation> <translation id="666981079809192359">Chrome 隱私權聲明</translation> @@ -422,6 +440,7 @@ <translation id="6720988912937197322">無法離線存取您剛儲存的網頁</translation> <translation id="6722992508235227685">您的書籤、歷史紀錄、密碼和其他設定都會在您的 Google 帳戶中保持同步,讓您在所有個人裝置上使用。您可以在 [<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />] 中選擇要同步處理的資料。</translation> <translation id="6738867403308150051">下載中…</translation> +<translation id="6762156594045689028">如要變更這項設定,請<ph name="BEGIN_LINK" />重設同步功能<ph name="END_LINK" /></translation> <translation id="6770414673596662518">Chrome 的安全瀏覽系統也會用於偵測惡意網頁,保護您不受網路釣魚、惡意軟體和有害下載內容的攻擊。</translation> <translation id="6784675033504223784">搜尋「<ph name="SEARCH_TERM" />」</translation> <translation id="6790428901817661496">播放</translation> @@ -438,7 +457,6 @@ <translation id="6868088497967843822">登入後,即可從任何裝置取得自己的書籤、歷史紀錄、密碼和其他設定</translation> <translation id="6945221475159498467">選取</translation> <translation id="6963766334940102469">刪除書籤</translation> -<translation id="6964496835063002391">新增帳戶</translation> <translation id="6965382102122355670">確定</translation> <translation id="6973630695168034713">資料夾</translation> <translation id="6978479750597523876">重設翻譯設定</translation> @@ -455,6 +473,8 @@ <translation id="7056999826593229648">偵測到連線速度緩慢</translation> <translation id="7057058088140140610">使用 Google Payments 儲存的信用卡和地址資訊。</translation> <translation id="7063006564040364415">無法連線至同步處理伺服器。</translation> +<translation id="7074853159844403180"><ph name="SITE" /> 要求與下列藍牙裝置配對:</translation> +<translation id="7081639897063626814">與現有資料分開保留</translation> <translation id="7094922512924405309">找不到附近的實體化網路網頁</translation> <translation id="7095930899177687653"><ph name="OPEN_TABS" /> 個開啟的分頁</translation> <translation id="7096034533295549981">正在載入影片</translation> @@ -466,7 +486,9 @@ <translation id="7299441085833132046"><ph name="BEGIN_LINK" />說明<ph name="END_LINK" /></translation> <translation id="7299721129597238157">刪除書籤</translation> <translation id="7324738665594301612">我們正在執行實驗功能,測試透過 Google 伺服器對 HTTPS 網頁執行 Proxy 處理的效能。</translation> +<translation id="7346217184097589238">已儲存的網站設定不會遭到刪除,而且可能會反映您的瀏覽習慣。</translation> <translation id="7346909386216857016">好,我瞭解了</translation> +<translation id="7347770551817603360">離線內容</translation> <translation id="7363354739009474003">正在載入「<ph name="VIDEO_TITLE" />」</translation> <translation id="7366340029385295517">正在投放到 <ph name="SCREEN_NAME" /></translation> <translation id="7375125077091615385">類型:</translation> @@ -481,6 +503,7 @@ <translation id="748127970106343339">確認刪除裝置憑證</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (上次更新時間:<ph name="TIME_SINCE_UPDATE" />)</translation> <translation id="7498271377022651285">請稍候…</translation> +<translation id="7499262814309712782">同步處理帳戶</translation> <translation id="7501135638693251872">所有書籤</translation> <translation id="7521387064766892559">JavaScript</translation> <translation id="7562080006725997899">正在清除瀏覽資料</translation> @@ -526,18 +549,22 @@ <translation id="8050319187894766337">已離線儲存網頁。儲存空間即將用盡。</translation> <translation id="8068648041423924542">無法選取憑證。</translation> <translation id="8069239273282989646">壓縮後大小</translation> +<translation id="8073388330009372546">在新分頁中開啟圖片</translation> <translation id="8084156870963450514">登入帳戶即可透過任何裝置存取您在網路上的所有資料</translation> <translation id="8106211421800660735">信用卡號碼</translation> <translation id="813082847718468539">查看網站資訊</translation> <translation id="8137558756159375272">「輕觸搜尋」會將選取的字詞和目前所在的網頁 (以便建立關聯) 傳送給 Google 搜尋。您可以在<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />中關閉這項功能。</translation> <translation id="8146397137182589628">未離線儲存</translation> <translation id="8168435359814927499">內容</translation> +<translation id="8173098127580644436">不限時間</translation> <translation id="8200772114523450471">繼續</translation> <translation id="8209050860603202033">開啟圖片</translation> <translation id="8218346974737627104">確認登入</translation> <translation id="8218934717680664417">從現在起,只要輕觸即可搜尋</translation> +<translation id="8223946939421658889">資料清除範圍:</translation> <translation id="8261506727792406068">刪除</translation> <translation id="8275818695183729150">允許 (從網址列搜尋)</translation> +<translation id="8283853025636624853">正在同步到 <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> <translation id="8310344678080805313">標準分頁</translation> <translation id="8374821112118309944">請更新至新版 TalkBack。</translation> <translation id="8396312449826231789">僅限核准的網站</translation> @@ -545,6 +572,7 @@ <translation id="8413385045638830869">先詢問我 (建議)</translation> <translation id="8428213095426709021">設定</translation> <translation id="8429160401486700187">刪除儲存的網頁</translation> +<translation id="8433057134996913067">您會因此登出大多數網站。</translation> <translation id="8481940801237642152">您與這個網站建立了私人連線,但網路上的其他人可能可以變更網頁的外觀。</translation> <translation id="8493948351860045254">釋出空間</translation> <translation id="8497726226069778601">目前還沒有任何常用網頁…</translation> @@ -585,9 +613,11 @@ <translation id="8941248009481596111">您與這個網站建立了私人連線。</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="8959122750345127698">瀏覽的網址無法存取:<ph name="URL" /></translation> +<translation id="8979340629087822094">過去 1 天</translation> <translation id="8987061207681586800">自訂您專屬的 Chrome</translation> <translation id="9019902583201351841">您的家長已停用這項功能</translation> <translation id="9020607083536754075">關閉目前的分頁並返回上一個應用程式</translation> +<translation id="9038649477754266430">使用預測查詢字串服務,以便更快載入網頁</translation> <translation id="9050666287014529139">通關密語</translation> <translation id="9060538597317784206">前往 Play 商店查看「<ph name="APP_NAME" />」應用程式。評分:<ph name="APP_RATING" />。</translation> <translation id="9063523880881406963">關閉「要求電腦版網站」</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java index 42ec87c..02ba57ce 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java
@@ -100,20 +100,22 @@ private AutofillSuggestion[] createTwoAutofillSuggestionArray() { return new AutofillSuggestion[] { - new AutofillSuggestion("Sherlock Holmes", "221B Baker Street", DropdownItem.NO_ICON, - 42, false), - new AutofillSuggestion("Arthur Dent", "West Country", DropdownItem.NO_ICON, 43, false), + new AutofillSuggestion("Sherlock Holmes", "221B Baker Street", DropdownItem.NO_ICON, + 42, false, false), + new AutofillSuggestion( + "Arthur Dent", "West Country", DropdownItem.NO_ICON, 43, false, false), }; } private AutofillSuggestion[] createFiveAutofillSuggestionArray() { return new AutofillSuggestion[] { - new AutofillSuggestion("Sherlock Holmes", "221B Baker Street", DropdownItem.NO_ICON, - 42, false), - new AutofillSuggestion("Arthur Dent", "West Country", DropdownItem.NO_ICON, 43, false), - new AutofillSuggestion("Arthos", "France", DropdownItem.NO_ICON, 44, false), - new AutofillSuggestion("Porthos", "France", DropdownItem.NO_ICON, 45, false), - new AutofillSuggestion("Aramis", "France", DropdownItem.NO_ICON, 46, false), + new AutofillSuggestion("Sherlock Holmes", "221B Baker Street", DropdownItem.NO_ICON, + 42, false, false), + new AutofillSuggestion( + "Arthur Dent", "West Country", DropdownItem.NO_ICON, 43, false, false), + new AutofillSuggestion("Arthos", "France", DropdownItem.NO_ICON, 44, false, false), + new AutofillSuggestion("Porthos", "France", DropdownItem.NO_ICON, 45, false, false), + new AutofillSuggestion("Aramis", "France", DropdownItem.NO_ICON, 46, false, false), }; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java index 6b3b3bb..8d698894 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
@@ -10,6 +10,7 @@ import android.os.Environment; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; +import android.text.TextUtils; import android.view.ContextMenu; import android.view.KeyEvent; @@ -23,7 +24,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModel; -import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.browser.contextmenu.ContextMenuUtils; import org.chromium.content.browser.test.util.CallbackHelper; import org.chromium.content.browser.test.util.Criteria; @@ -125,7 +125,7 @@ "testImageLink", "/chrome/test/data/android/contextmenu/test_image.png"); } - private void checkOpenImageInNewTab(String domId, String expectedUrl) + private void checkOpenImageInNewTab(String domId, final String expectedPath) throws InterruptedException, TimeoutException { final Tab activityTab = getActivity().getActivityTab(); @@ -155,7 +155,16 @@ fail("New tab never created from context menu press"); } - ChromeTabUtils.waitForTabPageLoaded(newTab.get(), mTestServer.getURL(expectedUrl)); + // Only check for the URL matching as the tab will not be fully created in svelte mode. + final String expectedUrl = mTestServer.getURL(expectedPath); + CriteriaHelper.pollForUIThreadCriteria(new Criteria() { + @Override + public boolean isSatisfied() { + String actualUrl = newTab.get().getUrl(); + updateFailureReason("Expected URL: " + expectedUrl + ", actual: " + actualUrl); + return TextUtils.equals(actualUrl, expectedUrl); + } + }); } @MediumTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index c1ec9ac..cd5180f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -1440,7 +1440,7 @@ }; getActivity().getTabModelSelector().addObserver(observer); // This tab tracking requires document mode be disabled. - assertFalse(FeatureUtilities.isDocumentMode(getInstrumentation().getContext())); + assertFalse(FeatureUtilities.isDocumentMode(getInstrumentation().getTargetContext())); // -------- TEST --------- // Start a slow-resolve search and maximize the Panel.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java b/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java index 687f7dc5..b12dcdd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java
@@ -15,6 +15,7 @@ import org.chromium.base.ApplicationStatus; import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.MinAndroidSdkLevel; +import org.chromium.base.test.util.Restriction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeTabbedActivity; @@ -29,6 +30,7 @@ import org.chromium.chrome.test.MultiActivityTestBase; import org.chromium.chrome.test.util.ActivityUtils; import org.chromium.chrome.test.util.ApplicationTestUtils; +import org.chromium.chrome.test.util.ChromeRestriction; import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; @@ -45,6 +47,7 @@ * tested using the DocumentActivityTestBase class. */ @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) +@Restriction(ChromeRestriction.RESTRICTION_TYPE_PHONE) public class DocumentModeTestBase extends MultiActivityTestBase { protected static final String TAG = "document";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java index 44b1fe1..c3b55bf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java
@@ -91,7 +91,7 @@ @Override protected void setUp() throws Exception { super.setUp(); - mDelegate.setContext(getInstrumentation().getContext()); + mDelegate.setContext(getInstrumentation().getTargetContext()); CommandLine.init(new String[0]); RecordHistogram.disableForTests(); mDelegate.mQueryIntentOverride = null;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java index d041d574..648a7a7b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java
@@ -64,7 +64,7 @@ * or Tabbed mode. */ private TabModel getTabModel(boolean incognito) { - if (FeatureUtilities.isDocumentMode(getInstrumentation().getContext())) { + if (FeatureUtilities.isDocumentMode(getInstrumentation().getTargetContext())) { return ChromeApplication.getDocumentTabModelSelector().getModel(incognito); } return getActivity().getTabModelSelector().getModel(incognito);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java index ac740c92..59f7844 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java
@@ -4,9 +4,7 @@ package org.chromium.chrome.browser.preferences; -import android.accounts.Account; import android.app.Activity; -import android.app.DialogFragment; import android.app.Instrumentation; import android.content.Context; import android.content.Intent; @@ -25,14 +23,9 @@ import org.chromium.chrome.browser.search_engines.TemplateUrlService; import org.chromium.chrome.browser.search_engines.TemplateUrlService.LoadListener; import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl; -import org.chromium.chrome.browser.signin.SigninManager; -import org.chromium.chrome.browser.sync.ui.ChooseAccountFragment; import org.chromium.content.browser.test.NativeLibraryTestBase; import org.chromium.content.browser.test.util.CallbackHelper; import org.chromium.content.browser.test.util.UiUtils; -import org.chromium.sync.signin.AccountManagerHelper; -import org.chromium.sync.test.util.MockAccountManager; -import org.chromium.sync.test.util.SimpleFuture; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -219,50 +212,6 @@ return locationPermission; } - /** - * Tests that double-clicking on sign-in doesn't show two sign-in prompts. - * - * This is a regression test for http://crbug.com/515055. - */ - @SmallTest - @Feature({"Preferences"}) - public void testDoubleSignin() throws Exception { - // Sets up state so that displayAccountPicker() shows a ChooseAccountFragment. - setUpTestAccount(); - final Preferences prefActivity = startPreferences(getInstrumentation(), - MainPreferences.class.getName()); - final MainPreferences mainPrefs = (MainPreferences) prefActivity.getFragmentForTest(); - - DialogFragment fragment1 = displayAccountPicker(mainPrefs); - DialogFragment fragment2 = displayAccountPicker(mainPrefs); - assertTrue(fragment1 instanceof ChooseAccountFragment); - assertNull(fragment2); - } - - private DialogFragment displayAccountPicker(final MainPreferences mainPrefs) - throws InterruptedException { - final SimpleFuture<DialogFragment> result = new SimpleFuture<DialogFragment>(); - ThreadUtils.runOnUiThread(new Runnable() { - public void run() { - mainPrefs.displayAccountPicker(result.createCallback()); - } - }); - return result.get(); - } - - private void setUpTestAccount() { - final Context context = getInstrumentation().getTargetContext(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - SigninManager.get(context).onFirstRunCheckDone(); - } - }); - Account account = AccountManagerHelper.createAccountFromName("test@chromium.org"); - MockAccountManager accountManager = new MockAccountManager(context, context, account); - AccountManagerHelper.overrideAccountManagerHelperForTests(context, accountManager); - } - // TODO(mvanouwerkerk): Write new preference intent tests for notification settings. // https://crbug.com/461885
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java new file mode 100644 index 0000000..c113a2d --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java
@@ -0,0 +1,916 @@ +// 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. + +package org.chromium.chrome.browser.media.router.cast; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.isNull; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import org.chromium.base.test.util.Feature; +import org.chromium.chrome.browser.media.router.cast.CastMessageHandler.RequestRecord; +import org.chromium.chrome.browser.media.router.cast.JSONTestUtils.JSONObjectLike; +import org.chromium.chrome.browser.media.router.cast.JSONTestUtils.JSONStringLike; +import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowLog; + +import java.util.ArrayDeque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Robolectric tests for CastSession. + */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class CastMessageHandlerTest { + private static final String TAG = "MediaRouter"; + + private static final String SESSION_ID = "SESSION_ID"; + private static final String INVALID_SESSION_ID = "INVALID_SESSION_ID"; + private static final String APP_STATUS = "status"; + private static final String ORIGIN = "http://www.example.com/"; + private static final String SOURCE_ID = new StringBuilder() + .append("https://google.com/cast#") + .append("__castAppId__=CCCCCCCC/") + .append("__castClientId__=00000000000000001/") + .append("__castAutoJoinPolicy__=origin_scoped/") + .append("__castLaunchTimeout__=10000") + .toString(); + private static final int TAB_ID = 1; + private static final int CALLBACK_ID = 1; + private static final String CLIENT_ID1 = "00000000000000001"; + private static final String CLIENT_ID2 = "00000000000000002"; + private static final String INVALID_CLIENT_ID = "xxxxxxxxxxxxxxxxx"; + private static final String NAMESPACE1 = "namespace1"; + private static final String NAMESPACE2 = "namespace2"; + private static final String MEDIA_NAMESPACE = CastMessageHandler.MEDIA_NAMESPACE; + private static final int SEQUENCE_NUMBER1 = 1; + private static final int SEQUENCE_NUMBER2 = 2; + private static final int REQUEST_ID1 = 1; + private static final int REQUEST_ID2 = 2; + private static final int INVALID_SEQUENCE_NUMBER = + CastMessageHandler.INVALID_SEQUENCE_NUMBER; + private CastMediaRouteProvider mRouteProvider; + private CastSession mSession; + private CastMessageHandler mMessageHandler; + private int mNumStopApplicationCalled = 0; + + private interface CheckedRunnable { void run() throws Exception; } + + @Before + public void setUp() { + ShadowLog.stream = System.out; + mRouteProvider = mock(CastMediaRouteProvider.class); + mSession = mock(CastSession.class); + doReturn(SESSION_ID).when(mSession).getSessionId(); + doReturn(true).when(mSession).sendStringCastMessage( + anyString(), anyString(), anyString(), anyInt()); + mMessageHandler = spy(new CastMessageHandler(mRouteProvider)); + mMessageHandler.onSessionCreated(mSession); + final Set<String> clientIds = new HashSet<String>(); + clientIds.add(CLIENT_ID1); + clientIds.add(CLIENT_ID2); + doAnswer(new Answer() { + public Object answer(InvocationOnMock invocation) { + return clientIds; + } + }) + .when(mRouteProvider).getClients(); + doNothing().when(mRouteProvider).onMessage(anyString(), anyString()); + doNothing().when(mRouteProvider).onMessageSentResult(anyBoolean(), anyInt()); + } + + void setUpForAppMessageTest() throws JSONException { + Set<String> namespaces = new HashSet<String>(); + namespaces.add(NAMESPACE1); + doReturn(namespaces).when(mSession).getNamespaces(); + doReturn(true).when(mMessageHandler) + .sendJsonCastMessage(any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + + @Test + @Feature({"MediaRouter"}) + public void testOnSessionCreated() { + Map<String, ClientRecord> clientRecords = new HashMap<String, ClientRecord>(); + clientRecords.put(CLIENT_ID1, new ClientRecord( + "DONTCARE", CLIENT_ID1, "DONTCARE", "DONTCARE", "DONTCARE", 0)); + clientRecords.put(CLIENT_ID2, new ClientRecord( + "DONTCARE", CLIENT_ID2, "DONTCARE", "DONTCARE", "DONTCARE", 0)); + clientRecords.get(CLIENT_ID1).isConnected = true; + doReturn(clientRecords).when(mRouteProvider).getClientRecords(); + // The call in setUp() actually only sets the session. This call will notify the clients + // that have sent "client_connect" + mMessageHandler.onSessionCreated(mSession); + verify(mSession).onClientConnected(CLIENT_ID1); + verify(mSession, never()).onClientConnected(CLIENT_ID2); + } + + @Test + @Feature({"MediaRouter"}) + public void testHandleSessionMessageOfV2MessageType() throws JSONException { + doReturn(true).when(mMessageHandler).handleCastV2Message(any(JSONObject.class)); + + JSONObject message = new JSONObject(); + message.put("type", "v2_message"); + assertTrue(mMessageHandler.handleSessionMessage(message)); + verify(mMessageHandler).handleCastV2Message(argThat(new JSONObjectLike(message))); + } + + @Test + @Feature({"MediaRouter"}) + public void testHandleSessionMessageOfAppMessageType() throws JSONException { + doReturn(true).when(mMessageHandler).handleAppMessage(any(JSONObject.class)); + + JSONObject message = new JSONObject(); + message.put("type", "app_message"); + assertTrue(mMessageHandler.handleSessionMessage(message)); + verify(mMessageHandler).handleAppMessage(argThat(new JSONObjectLike(message))); + } + + @Test + @Feature({"MediaRouter"}) + public void testHandleSessionMessageOfUnsupportedType() throws JSONException { + doReturn(true).when(mMessageHandler).handleCastV2Message(any(JSONObject.class)); + + JSONObject message = new JSONObject(); + message.put("type", "unsupported"); + assertFalse(mMessageHandler.handleSessionMessage(message)); + verify(mMessageHandler, never()).handleCastV2Message(any(JSONObject.class)); + verify(mMessageHandler, never()).handleAppMessage(any(JSONObject.class)); + } + + @Test + @Feature({"MediaRouter"}) + public void testCastV2MessageWithWrongTypeInnerMessage() throws JSONException { + JSONObject innerMessage = new JSONObject() + .put("type", "STOP"); + final JSONObject message = buildCastV2Message(CLIENT_ID1, innerMessage); + // Replace the inner JSON message with string. + message.put("message", "wrong type inner message"); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleCastV2Message(message); + } + }, JSONException.class); + verify(mMessageHandler, never()).handleStopMessage(anyString(), anyInt()); + verify(mSession, never()).handleVolumeMessage(any(JSONObject.class), anyString(), anyInt()); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testCastV2MessageOfStopType() throws JSONException { + JSONObject innerMessage = new JSONObject() + .put("type", "STOP"); + JSONObject message = buildCastV2Message(CLIENT_ID1, innerMessage); + assertTrue(mMessageHandler.handleCastV2Message(message)); + verify(mMessageHandler).handleStopMessage(eq(CLIENT_ID1), eq(SEQUENCE_NUMBER1)); + } + + @Test + @Feature({"MediaRouter"}) + public void testCastV2MessageofSetVolumeTypeShouldWait() throws JSONException { + doReturn(new CastSession.HandleVolumeMessageResult(true, true)) + .when(mSession).handleVolumeMessage(any(JSONObject.class), anyString(), anyInt()); + JSONObject innerMessage = new JSONObject() + .put("type", "SET_VOLUME") + .put("volume", new JSONObject() + .put("level", (double) 1) + .put("muted", false)); + JSONObject message = buildCastV2Message(CLIENT_ID1, innerMessage); + assertTrue(mMessageHandler.handleCastV2Message(message)); + JSONObject volumeMessage = innerMessage.getJSONObject("volume"); + verify(mSession).handleVolumeMessage( + argThat(new JSONObjectLike(innerMessage.getJSONObject("volume"))), + eq(CLIENT_ID1), eq(SEQUENCE_NUMBER1)); + assertEquals(mMessageHandler.getVolumeRequestsForTest().size(), 1); + } + + @Test + @Feature({"MediaRouter"}) + public void testCastV2MessageofSetVolumeTypeShouldNotWait() throws JSONException { + doReturn(new CastSession.HandleVolumeMessageResult(true, false)) + .when(mSession).handleVolumeMessage(any(JSONObject.class), anyString(), anyInt()); + JSONObject innerMessage = new JSONObject() + .put("type", "SET_VOLUME") + .put("volume", new JSONObject() + .put("level", (double) 1) + .put("muted", false)); + JSONObject message = buildCastV2Message(CLIENT_ID1, innerMessage); + assertTrue(mMessageHandler.handleCastV2Message(message)); + JSONObject volumeMessage = innerMessage.getJSONObject("volume"); + verify(mSession).handleVolumeMessage( + argThat(new JSONObjectLike(innerMessage.getJSONObject("volume"))), + eq(CLIENT_ID1), eq(SEQUENCE_NUMBER1)); + assertEquals(mMessageHandler.getVolumeRequestsForTest().size(), 0); + } + + @Test + @Feature({"MediaRouter"}) + public void testCastV2MessageofSetVolumeTypeWithNullVolumeMessage() throws JSONException { + JSONObject innerMessage = new JSONObject() + .put("type", "SET_VOLUME"); + final JSONObject message = buildCastV2Message(CLIENT_ID1, innerMessage); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleCastV2Message(message); + } + }, JSONException.class); + verify(mSession, never()).handleVolumeMessage(any(JSONObject.class), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testCastV2MessageofSetVolumeTypeWithWrongTypeVolumeMessage() throws JSONException { + JSONObject innerMessage = new JSONObject() + .put("type", "SET_VOLUME") + .put("volume", "wrong type volume message"); + final JSONObject message = buildCastV2Message(CLIENT_ID1, innerMessage); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleCastV2Message(message); + } + }, JSONException.class); + verify(mSession, never()).handleVolumeMessage(any(JSONObject.class), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testCastV2MessageOfMediaMessageType() throws JSONException { + doReturn(true).when(mMessageHandler).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + for (String messageType : CastMessageHandler.getMediaMessageTypesForTest()) { + // TODO(zqzhang): SET_VOLUME and STOP should not reach here? + if (messageType == "MEDIA_SET_VOLUME" || messageType == "STOP_MEDIA") + continue; + JSONObject innerMessage = new JSONObject().put("type", messageType); + JSONObject message = buildCastV2Message(CLIENT_ID1, innerMessage); + assertTrue(mMessageHandler.handleCastV2Message(message)); + + JSONObject expected = new JSONObject(); + if (CastMessageHandler.getMediaOverloadedMessageTypesForTest() + .containsKey(messageType)) { + expected.put("type", CastMessageHandler.getMediaOverloadedMessageTypesForTest() + .get(messageType)); + } else { + expected.put("type", messageType); + } + verify(mMessageHandler).sendJsonCastMessage( + argThat(new JSONObjectLike(expected)), + eq(CastMessageHandler.MEDIA_NAMESPACE), + eq(CLIENT_ID1), eq(SEQUENCE_NUMBER1)); + } + } + + @Test + @Feature({"MediaRouter"}) + public void testCastV2MessageWithNullSequenceNumber() throws JSONException { + JSONObject innerMessage = new JSONObject() + .put("type", "STOP"); + JSONObject message = buildCastV2Message(CLIENT_ID1, innerMessage); + message.remove("sequenceNumber"); + assertTrue(mMessageHandler.handleCastV2Message(message)); + verify(mMessageHandler).handleStopMessage(eq(CLIENT_ID1), eq(INVALID_SEQUENCE_NUMBER)); + } + + @Test + @Feature({"MediaRouter"}) + public void testHandleStopMessage() throws JSONException { + assertEquals(0, mMessageHandler.getStopRequestsForTest().size()); + mMessageHandler.handleStopMessage(CLIENT_ID1, SEQUENCE_NUMBER1); + assertEquals(1, mMessageHandler.getStopRequestsForTest().get(CLIENT_ID1).size(), 1); + verify(mSession).stopApplication(); + mMessageHandler.handleStopMessage(CLIENT_ID1, SEQUENCE_NUMBER2); + assertEquals(2, mMessageHandler.getStopRequestsForTest().get(CLIENT_ID1).size(), 2); + verify(mSession, times(2)).stopApplication(); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithExistingNamespace() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + assertTrue(mMessageHandler.handleAppMessage(message)); + verify(mMessageHandler).sendJsonCastMessage( + argThat(new JSONObjectLike(actualMessage)), eq(NAMESPACE1), + eq(CLIENT_ID1), eq(SEQUENCE_NUMBER1)); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithNonexistingNamespace() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE2, actualMessage); + assertFalse(mMessageHandler.handleAppMessage(message)); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithoutSequenceNumber() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.remove("sequenceNumber"); + assertTrue(mMessageHandler.handleAppMessage(message)); + verify(mMessageHandler).sendJsonCastMessage( + argThat(new JSONObjectLike(actualMessage)), eq(NAMESPACE1), + eq(CLIENT_ID1), eq(INVALID_SEQUENCE_NUMBER)); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithNullSessionId() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + final JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.getJSONObject("message").remove("sessionId"); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleAppMessage(message); + } + }, JSONException.class); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithWrongSessionId() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.getJSONObject("message").put("sessionId", INVALID_SESSION_ID); + assertFalse(mMessageHandler.handleAppMessage(message)); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithNullActualMessage() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + final JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.getJSONObject("message").remove("message"); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleAppMessage(message); + } + }, JSONException.class); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithStringMessage() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.getJSONObject("message").put("message", "string message"); + assertTrue(mMessageHandler.handleAppMessage(message)); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + verify(mSession).sendStringCastMessage( + eq("string message"), eq(NAMESPACE1), eq(CLIENT_ID1), eq(SEQUENCE_NUMBER1)); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithNullAppMessage() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + final JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.remove("message"); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleAppMessage(message); + } + }, JSONException.class); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithEmptyAppMessage() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + final JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.put("message", new JSONObject()); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleAppMessage(message); + } + }, JSONException.class); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithWrongTypeAppMessage() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + final JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.put("message", "wrong type app message"); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleAppMessage(message); + } + }, JSONException.class); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithNullClient() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + final JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.remove("clientId"); + expectException(new CheckedRunnable() { + @Override + public void run() throws Exception { + mMessageHandler.handleAppMessage(message); + } + }, JSONException.class); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testAppMessageWithNonexistingClient() throws JSONException { + setUpForAppMessageTest(); + + JSONObject actualMessage = buildActualAppMessage(); + JSONObject message = buildAppMessage(CLIENT_ID1, NAMESPACE1, actualMessage); + message.put("clientId", INVALID_CLIENT_ID); + assertFalse(mMessageHandler.handleAppMessage(message)); + verify(mMessageHandler, never()).sendJsonCastMessage( + any(JSONObject.class), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testSendJsonCastMessage() throws JSONException { + assertEquals(mMessageHandler.getRequestsForTest().size(), 0); + JSONObject message = buildJsonCastMessage("message"); + assertTrue(mMessageHandler.sendJsonCastMessage( + message, NAMESPACE1, CLIENT_ID1, SEQUENCE_NUMBER1)); + assertEquals(mMessageHandler.getRequestsForTest().size(), 1); + verify(mSession).sendStringCastMessage( + argThat(new JSONStringLike(message)), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testSendJsonCastMessageWhenApiClientInvalid() throws JSONException { + doReturn(true).when(mSession).isApiClientInvalid(); + + JSONObject message = buildJsonCastMessage("message"); + assertFalse(mMessageHandler.sendJsonCastMessage( + message, NAMESPACE1, CLIENT_ID1, SEQUENCE_NUMBER1)); + assertEquals(mMessageHandler.getRequestsForTest().size(), 0); + verify(mSession, never()).sendStringCastMessage( + anyString(), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testSendJsonCastMessageWithInvalidSequenceNumber() throws JSONException { + JSONObject message = buildJsonCastMessage("message"); + assertTrue(mMessageHandler.sendJsonCastMessage( + message, NAMESPACE1, CLIENT_ID1, INVALID_SEQUENCE_NUMBER)); + assertEquals(mMessageHandler.getRequestsForTest().size(), 0); + verify(mSession).sendStringCastMessage( + argThat(new JSONStringLike(message)), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testSendJsonCastMessageWithNullRequestId() throws JSONException { + assertEquals(mMessageHandler.getRequestsForTest().size(), 0); + JSONObject message = buildJsonCastMessage("message"); + message.remove("requestId"); + assertTrue(mMessageHandler.sendJsonCastMessage( + message, NAMESPACE1, CLIENT_ID1, SEQUENCE_NUMBER1)); + assertTrue(message.has("requestId")); + assertEquals(mMessageHandler.getRequestsForTest().size(), 1); + verify(mSession).sendStringCastMessage( + argThat(new JSONStringLike(message)), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnMessageReceivedWithExistingRequestId() throws JSONException { + doNothing().when(mMessageHandler).onAppMessage( + anyString(), anyString(), any(RequestRecord.class)); + assertEquals(mMessageHandler.getRequestsForTest().size(), 0); + RequestRecord request = new RequestRecord(CLIENT_ID1, SEQUENCE_NUMBER1); + mMessageHandler.getRequestsForTest().append( + REQUEST_ID1, request); + assertEquals(mMessageHandler.getRequestsForTest().size(), 1); + JSONObject message = new JSONObject(); + message.put("requestId", REQUEST_ID1); + mMessageHandler.onMessageReceived(NAMESPACE1, message.toString()); + assertEquals(mMessageHandler.getRequestsForTest().size(), 0); + verify(mMessageHandler).onAppMessage(eq(message.toString()), eq(NAMESPACE1), eq(request)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnMessageReceivedWithNonexistingRequestId() throws JSONException { + doNothing().when(mMessageHandler).onAppMessage( + anyString(), anyString(), any(RequestRecord.class)); + assertEquals(mMessageHandler.getRequestsForTest().size(), 0); + RequestRecord request = new RequestRecord(CLIENT_ID1, SEQUENCE_NUMBER1); + mMessageHandler.getRequestsForTest().append( + REQUEST_ID1, request); + assertEquals(mMessageHandler.getRequestsForTest().size(), 1); + JSONObject message = new JSONObject(); + message.put("requestId", REQUEST_ID2); + mMessageHandler.onMessageReceived(NAMESPACE1, message.toString()); + assertEquals(mMessageHandler.getRequestsForTest().size(), 1); + verify(mMessageHandler).onAppMessage( + eq(message.toString()), eq(NAMESPACE1), isNull(RequestRecord.class)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnMessageReceivedWithoutRequestId() throws JSONException { + doNothing().when(mMessageHandler).onAppMessage( + anyString(), anyString(), any(RequestRecord.class)); + assertEquals(mMessageHandler.getRequestsForTest().size(), 0); + RequestRecord request = new RequestRecord(CLIENT_ID1, SEQUENCE_NUMBER1); + mMessageHandler.getRequestsForTest().append( + REQUEST_ID1, request); + assertEquals(mMessageHandler.getRequestsForTest().size(), 1); + JSONObject message = new JSONObject(); + mMessageHandler.onMessageReceived(NAMESPACE1, message.toString()); + assertEquals(mMessageHandler.getRequestsForTest().size(), 1); + verify(mMessageHandler).onAppMessage( + eq(message.toString()), eq(NAMESPACE1), isNull(RequestRecord.class)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnMessageReceivedOfMediaNamespace() throws JSONException { + doNothing().when(mMessageHandler).onMediaMessage(anyString(), any(RequestRecord.class)); + mMessageHandler.onMessageReceived(MEDIA_NAMESPACE, "anymessage"); + verify(mMessageHandler).onMediaMessage(eq("anymessage"), isNull(RequestRecord.class)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnMediaMessageOfMediaStatusTypeWithRequestRecord() { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + doReturn(true).when(mMessageHandler).isMediaStatusMessage(anyString()); + RequestRecord request = new RequestRecord(CLIENT_ID1, SEQUENCE_NUMBER1); + mMessageHandler.onMediaMessage("anymessage", request); + verify(mMessageHandler, never()).sendClientMessageTo( + eq(CLIENT_ID1), eq("v2_message"), eq("anymessage"), eq(INVALID_SEQUENCE_NUMBER)); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID2), eq("v2_message"), eq("anymessage"), eq(INVALID_SEQUENCE_NUMBER)); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID1), eq("v2_message"), eq("anymessage"), eq(SEQUENCE_NUMBER1)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnMediaMessageOfMediaStatusTypeWithNullRequestRecord() { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + doReturn(true).when(mMessageHandler).isMediaStatusMessage(anyString()); + mMessageHandler.onMediaMessage("anymessage", null); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID1), eq("v2_message"), eq("anymessage"), eq(INVALID_SEQUENCE_NUMBER)); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID2), eq("v2_message"), eq("anymessage"), eq(INVALID_SEQUENCE_NUMBER)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnMediaMessageOfNonMediaStatusTypeWithRequestRecord() { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + doReturn(false).when(mMessageHandler).isMediaStatusMessage(anyString()); + RequestRecord request = new RequestRecord(CLIENT_ID1, SEQUENCE_NUMBER1); + mMessageHandler.onMediaMessage("anymessage", request); + verify(mMessageHandler, never()).sendClientMessageTo( + anyString(), anyString(), anyString(), eq(INVALID_SEQUENCE_NUMBER)); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID1), eq("v2_message"), eq("anymessage"), eq(SEQUENCE_NUMBER1)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnMediaMessageOfNonMediaStatusTypeWithNullRequestRecord() { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + doReturn(false).when(mMessageHandler).isMediaStatusMessage(anyString()); + mMessageHandler.onMediaMessage("anymessage", null); + verify(mMessageHandler, never()).sendClientMessageTo( + anyString(), anyString(), anyString(), eq(INVALID_SEQUENCE_NUMBER)); + verify(mMessageHandler, never()).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnAppMessageWithRequestRecord() throws JSONException { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + RequestRecord request = new RequestRecord(CLIENT_ID1, SEQUENCE_NUMBER1); + mMessageHandler.onAppMessage("anyMessage", NAMESPACE1, request); + JSONObject expected = new JSONObject(); + expected.put("sessionId", SESSION_ID); + expected.put("namespaceName", NAMESPACE1); + expected.put("message", "anyMessage"); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID1), eq("app_message"), + argThat(new JSONStringLike(expected)), eq(SEQUENCE_NUMBER1)); + verify(mMessageHandler, never()).broadcastClientMessage(anyString(), anyString()); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnAppMessageWithNullRequestRecord() throws JSONException { + doNothing().when(mMessageHandler).broadcastClientMessage(anyString(), anyString()); + mMessageHandler.onAppMessage("anyMessage", NAMESPACE1, null); + JSONObject expected = new JSONObject(); + expected.put("sessionId", SESSION_ID); + expected.put("namespaceName", NAMESPACE1); + expected.put("message", "anyMessage"); + verify(mMessageHandler, never()).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + verify(mMessageHandler).broadcastClientMessage( + eq("app_message"), argThat(new JSONStringLike(expected))); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnApplicationStopped() { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + assertEquals(0, mMessageHandler.getStopRequestsForTest().size()); + mMessageHandler.getStopRequestsForTest().put(CLIENT_ID1, new ArrayDeque<Integer>()); + mMessageHandler.getStopRequestsForTest().get(CLIENT_ID1).add(SEQUENCE_NUMBER1); + mMessageHandler.getStopRequestsForTest().get(CLIENT_ID1).add(SEQUENCE_NUMBER2); + assertEquals(1, mMessageHandler.getStopRequestsForTest().size()); + assertEquals(2, mMessageHandler.getStopRequestsForTest().get(CLIENT_ID1).size()); + + mMessageHandler.onApplicationStopped(); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID1), eq("remove_session"), eq(SESSION_ID), eq(SEQUENCE_NUMBER1)); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID1), eq("remove_session"), eq(SESSION_ID), eq(SEQUENCE_NUMBER2)); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID2), eq("remove_session"), eq(SESSION_ID), eq(INVALID_SEQUENCE_NUMBER)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnVolumeChanged() { + doNothing().when(mMessageHandler).onVolumeChanged(anyString(), anyInt()); + assertEquals(0, mMessageHandler.getVolumeRequestsForTest().size()); + mMessageHandler.getVolumeRequestsForTest() + .add(new RequestRecord(CLIENT_ID1, SEQUENCE_NUMBER1)); + assertEquals(1, mMessageHandler.getVolumeRequestsForTest().size()); + + mMessageHandler.onVolumeChanged(); + verify(mMessageHandler).onVolumeChanged(CLIENT_ID1, SEQUENCE_NUMBER1); + assertEquals(0, mMessageHandler.getVolumeRequestsForTest().size()); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnVolumeChangedWithEmptyVolumeRequests() { + mMessageHandler.onVolumeChanged(); + verify(mMessageHandler, never()).onVolumeChanged(eq(CLIENT_ID1), eq(SEQUENCE_NUMBER1)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnVolumeChangedForClient() { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + mMessageHandler.onVolumeChanged(CLIENT_ID1, SEQUENCE_NUMBER1); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID1), eq("v2_message"), isNull(String.class), eq(SEQUENCE_NUMBER1)); + } + + @Test + @Feature({"MediaRouter"}) + public void testOnAppMessageSent() { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + mMessageHandler.onAppMessageSent(CLIENT_ID1, SEQUENCE_NUMBER1); + verify(mMessageHandler).sendClientMessageTo( + eq(CLIENT_ID1), eq("app_message"), isNull(String.class), eq(SEQUENCE_NUMBER1)); + } + + @Test + @Feature({"MediaRouter"}) + public void testSendClientMessageTo() throws JSONException { + String message = "discarded_message1"; + doReturn(message).when(mMessageHandler) + .buildInternalMessage(anyString(), anyString(), anyString(), anyInt()); + mMessageHandler.sendClientMessageTo( + CLIENT_ID1, "anytype", "discarded_message2", SEQUENCE_NUMBER1); + + verify(mRouteProvider).onMessage( + eq(CLIENT_ID1), eq(message)); + } + + @Test + @Feature({"MediaRouter"}) + public void testBroadcastClientMessage() { + doNothing().when(mMessageHandler).sendClientMessageTo( + anyString(), anyString(), anyString(), anyInt()); + mMessageHandler.broadcastClientMessage("anytype", "anymessage"); + for (String clientId : mRouteProvider.getClients()) { + verify(mMessageHandler).sendClientMessageTo( + eq(clientId), eq("anytype"), eq("anymessage"), eq(INVALID_SEQUENCE_NUMBER)); + } + } + + @Test + @Feature({"MediaRouter"}) + public void testBuildInternalMessageWithNullMessage() throws JSONException { + String message = mMessageHandler.buildInternalMessage( + "anytype", null, CLIENT_ID1, SEQUENCE_NUMBER1); + JSONObject expected = new JSONObject(); + expected.put("type", "anytype"); + expected.put("sequenceNumber", SEQUENCE_NUMBER1); + expected.put("timeoutMillis", 0); + expected.put("clientId", CLIENT_ID1); + expected.put("message", null); + + assertTrue("\nexpected: " + expected.toString() + ",\n actual: " + message.toString(), + new JSONObjectLike(expected).matches(new JSONObject(message))); + } + + @Test + @Feature({"MediaRouter"}) + public void testBuildInternalMessageOfRemoveSessionType() throws JSONException { + String message = mMessageHandler.buildInternalMessage( + "remove_session", SESSION_ID, CLIENT_ID1, SEQUENCE_NUMBER1); + JSONObject expected = new JSONObject(); + expected.put("type", "remove_session"); + expected.put("sequenceNumber", SEQUENCE_NUMBER1); + expected.put("timeoutMillis", 0); + expected.put("clientId", CLIENT_ID1); + expected.put("message", SESSION_ID); + + assertTrue("\nexpected: " + expected.toString() + ",\n actual: " + message.toString(), + new JSONObjectLike(expected).matches(new JSONObject(message))); + } + + @Test + @Feature({"MediaRouter"}) + public void testBuildInternalMessageOfDisconnectSessionType() throws JSONException { + String message = mMessageHandler.buildInternalMessage( + "disconnect_session", SESSION_ID, CLIENT_ID1, SEQUENCE_NUMBER1); + JSONObject expected = new JSONObject(); + expected.put("type", "disconnect_session"); + expected.put("sequenceNumber", SEQUENCE_NUMBER1); + expected.put("timeoutMillis", 0); + expected.put("clientId", CLIENT_ID1); + expected.put("message", SESSION_ID); + + assertTrue("\nexpected: " + expected.toString() + ",\n actual: " + message.toString(), + new JSONObjectLike(expected).matches(new JSONObject(message))); + } + + @Test + @Feature({"MediaRouter"}) + public void testBuildInternalMessageWithInnerMessage() throws JSONException { + JSONObject innerMessage = buildSessionMessage(SESSION_ID); + String message = mMessageHandler.buildInternalMessage( + "anytype", innerMessage.toString(), CLIENT_ID1, SEQUENCE_NUMBER1); + JSONObject expected = new JSONObject(); + expected.put("type", "anytype"); + expected.put("sequenceNumber", SEQUENCE_NUMBER1); + expected.put("timeoutMillis", 0); + expected.put("clientId", CLIENT_ID1); + expected.put("message", innerMessage); + + assertTrue("\nexpected: " + expected.toString() + ",\n actual: " + message.toString(), + new JSONObjectLike(expected).matches(new JSONObject(message))); + } + + JSONObject buildCastV2Message(String clientId, JSONObject innerMessage) throws JSONException { + JSONObject message = new JSONObject(); + message.put("type", "v2_message"); + message.put("message", innerMessage); + message.put("sequenceNumber", SEQUENCE_NUMBER1); + message.put("timeoutMillis", 0); + message.put("clientId", clientId); + + return message; + } + + JSONObject buildAppMessage(String clientId, String namespace, Object actualMessage) + throws JSONException { + JSONObject innerMessage = new JSONObject(); + innerMessage.put("sessionId", mSession.getSessionId()); + innerMessage.put("namespaceName", namespace); + innerMessage.put("message", actualMessage); + + JSONObject message = new JSONObject(); + message.put("type", "app_message"); + message.put("message", innerMessage); + message.put("sequenceNumber", SEQUENCE_NUMBER1); + message.put("timeoutMillis", 0); + message.put("clientId", clientId); + + return message; + } + + JSONObject buildActualAppMessage() throws JSONException { + JSONObject message = new JSONObject(); + message.put("type", "actual app message type"); + + return message; + } + + JSONObject buildSessionMessage(String sessionId) throws JSONException { + JSONObject message = new JSONObject(); + message.put("sessionId", sessionId); + + return message; + } + + void expectException(CheckedRunnable r, Class exceptionClass) { + boolean caughtException = false; + try { + r.run(); + } catch (Exception e) { + if (e.getClass() == exceptionClass) caughtException = true; + } + assertTrue(caughtException); + } + + JSONObject buildJsonCastMessage(String message) throws JSONException { + JSONObject jsonMessage = new JSONObject(); + jsonMessage.put("requestId", REQUEST_ID1); + jsonMessage.put("message", message); + return jsonMessage; + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/JSONTestUtils.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/JSONTestUtils.java new file mode 100644 index 0000000..b52dcae --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/router/cast/JSONTestUtils.java
@@ -0,0 +1,117 @@ +// 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. + +package org.chromium.chrome.browser.media.router.cast; + +import org.hamcrest.Description; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.mockito.ArgumentMatcher; + +import java.util.Iterator; + +/** + * Utilities for comparing JSON objects and strings. + * TODO(zqzhang): Move the class to somewhere more generic. + */ +public class JSONTestUtils { + private static final String TAG = "MediaRouter"; + private static final String ANY_PREFIX = "ANY_"; + + private static boolean isPureJSONObjectEqual(JSONObject expected, JSONObject actual) { + try { + Iterator<?> iterKey = expected.keys(); + while (iterKey.hasNext()) { + String key = (String) iterKey.next(); + if (key.startsWith(ANY_PREFIX)) { + if (!actual.has(key.substring(ANY_PREFIX.length()))) return false; + } else { + if (!isJSONObjectEqual(expected.get(key), actual.get(key))) return false; + } + } + } catch (JSONException e) { + return false; + } + return true; + } + + public static boolean isJSONArrayEqual(JSONArray expected, JSONArray actual) { + try { + if (expected.length() != actual.length()) return false; + for (int i = 0; i < expected.length(); i++) { + if (!isJSONObjectEqual(expected.get(i), actual.get(i))) return false; + } + } catch (JSONException e) { + return false; + } + return true; + } + + public static boolean isJSONObjectEqual(Object expected, Object actual) { + if (expected == null && actual == null) return true; + if (expected == null || actual == null) return false; + + if (expected.getClass() == JSONArray.class) { + if (actual.getClass() != JSONArray.class) return false; + if (!isJSONArrayEqual((JSONArray) expected, (JSONArray) actual)) return false; + } else if (expected.getClass() == JSONObject.class) { + if (actual.getClass() != JSONObject.class) return false; + if (!isPureJSONObjectEqual((JSONObject) expected, (JSONObject) actual)) return false; + } else if (expected.getClass() == Double.class || actual.getClass() == Double.class) { + if (getDoubleValue(expected) != getDoubleValue(actual)) return false; + } else { + if (!expected.equals(actual)) return false; + } + return true; + } + + private static double getDoubleValue(Object object) { + if (object.getClass() == Integer.class) { + return ((Integer) object).doubleValue(); + } else { + return ((Double) object).doubleValue(); + } + } + + static class JSONObjectLike extends ArgumentMatcher<JSONObject> { + private final JSONObject mExpected; + + public JSONObjectLike(JSONObject expected) { + mExpected = expected; + } + + @Override + public boolean matches(Object actual) { + return isJSONObjectEqual(mExpected, (JSONObject) actual); + } + + @Override + public void describeTo(Description description) { + description.appendText("(JSONObject) " + mExpected.toString()); + } + } + + static class JSONStringLike extends ArgumentMatcher<String> { + private JSONObject mExpected; + + public JSONStringLike(JSONObject expected) { + mExpected = expected; + } + + @Override + public boolean matches(Object actual) { + try { + return isJSONObjectEqual(mExpected, new JSONObject((String) actual)); + } catch (JSONException e) { + return false; + } + } + + @Override + public void describeTo(Description description) { + description.appendText("\"" + mExpected.toString() + "\""); + } + } +}
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 5307661..3922c6d 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -1582,14 +1582,21 @@ <message name="IDS_LOGIN_PREVIOUS_PASSWORD" desc="Password field text on the password changed dialog"> Previous password </message> - <message name="IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_MESSAGE" desc="Message text for the fatal cryptohome error dialog box"> - We're very sorry, but a serious error has occurred and your profile will need to be recreated to continue. Don't worry, your account is safe, but unfortunately, your local data and files on this device may have been lost. + <message name="IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_TITLE" desc="Title for the fatal cryptohome error dialog box"> + Could not sign in + </message> + <message name="IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_MESSAGE" desc="Message for the fatal cryptohome error dialog box"> + We're very sorry, but a serious error has occurred and your profile on this device will need to be re-created to continue.<ph name="BR"><br></ph> + <ph name="BR"><br></ph> + Don't worry, your account is safe, but unfortunately, your local data and files on this device may have been lost.<ph name="BR"><br></ph> + <ph name="BR"><br></ph> + Please send feedback to help us prevent this issue in the future. </message> <message name="IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_CONTINUE" desc="Label of the button to continue with re-creating cryptohome for the fatal cryptohome error dialog box"> Continue </message> - <message name="IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_SEND_FEEDBACK" desc="Label of the checkbox to send feedback for the fatal cryptohome error dialog box"> - Send anonymized system information to help us fix this issue + <message name="IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_WAIT_MESSAGE" desc="Message to show when the fatal cryptohome error dialog box is waiting for user profile re-creation to be closed."> + Re-creating profile, please wait... </message> <message name="IDS_LOGIN_SAML_NOTICE" desc="Text message displayed above SAML portal to early indicate that the user is being redirected to another sign-in provider. This is the version of the string used in the GAIA flow."> This sign-in service is hosted by <ph name="SAML_DOMAIN">$1<ex>saml.com</ex></ph>
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 3dbb22a..ceec21c 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -12683,6 +12683,9 @@ <message name="IDS_PROFILES_CREATE_SUPERVISED_SIGNED_IN_LABEL" desc="Label for the 'Supervised user' checkbox in the create-profile dialog when the current user is signed in."> Control and view the websites this person visits from <ph name="CUSTODIAN_EMAIL">$1<ex>user@gmail.com</ex></ph>. </message> + <message name="IDS_PROFILES_CREATE_SUPERVISED_MULTI_SIGNED_IN_LABEL" desc="Label for the 'Supervised user' checkbox in the create-profile dialog when user can choose from a list of signed in users."> + Control and view the websites this person visits from + </message> <message name="IDS_PROFILES_CREATE_SUPERVISED_ACCOUNT_DETAILS_OUT_OF_DATE_LABEL" desc="Label for the 'Supervised user' checkbox in the create-profile dialog when the current user is signed in, but their sign-in information is invalid. This will be followed by a 'Sign in again' link."> Control and view the websites this person visits from <ph name="CUSTODIAN_EMAIL">$1<ex>user@gmail.com</ex></ph>. Your account sign-in details are out of date.
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index 3b02ae8..ba74d16 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -31,7 +31,7 @@ <translation id="1929939181775079593">Chromium no respon. Voleu tornar-lo a iniciar ara?</translation> <translation id="1967743265616885482">Se sap que un mòdul amb el mateix nom entra en conflicte amb Chromium.</translation> <translation id="2077129598763517140">Utilitza l'acceleració per maquinari quan estigui disponible</translation> -<translation id="2117181891440368863">Chromium ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació sobre Certificate Transparency, però no era vàlida.</translation> +<translation id="2117181891440368863">Chromium ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació sobre Transparència de certificats, però no era vàlida.</translation> <translation id="2119636228670142020">Quant a &Chromium OS</translation> <translation id="2158734852934720349">Llicències de programari lliure de Chromium OS</translation> <translation id="2241627712206172106">Si compartiu un ordinador, els amics i els familiars poden navegar de manera independent i configurar Chromium com vulguin.</translation> @@ -153,7 +153,7 @@ <translation id="6734080038664603509">Actualitza &Chromium</translation> <translation id="6757767188268205357">No em molestis</translation> <translation id="6810143991807788455">Informa de la configuració actual per ajudar-nos a millorar Chromium</translation> -<translation id="6838494703713445896">Chromium ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació vàlida sobre Certificate Transparency.</translation> +<translation id="6838494703713445896">Chromium ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació vàlida sobre Transparència de certificats.</translation> <translation id="6883876366448858277">Envia una paraula i el seu context a Cerca de Google i, a continuació, mostra definicions, imatges i altres resultats de la cerca.</translation> <translation id="6893813176749746474">S'ha actualitzat Chromium, però fa almenys 30 dies que no l'heu utilitzat.</translation> <translation id="6930860321615955692">https://support.google.com/chrome/?p=ib_chromeframe</translation> @@ -165,7 +165,7 @@ <translation id="7066436765290594559">Chromium OS no ha pogut sincronitzar les vostres dades. Actualitzeu la frase de contrasenya de sincronització.</translation> <translation id="7138853919861947730">Chromium pot utilitzar serveis web per millorar l'experiència de navegació dels usuaris.</translation> <translation id="7162152143154757523">Perquè el corrector ortogràfic sigui més útil, Chromium envia als servidors de Google el text que escriviu al navegador i, així, podeu fer servir la mateixa tecnologia de correcció ortogràfica de la Cerca de Google.</translation> -<translation id="7178626992616222740">Chromium ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació sobre Certificate Transparency, però Chromium no n'ha reconegut cap registre.</translation> +<translation id="7178626992616222740">Chromium ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació sobre Transparència de certificats, però Chromium no n'ha reconegut cap registre.</translation> <translation id="7196020411877309443">Per què veig aquest missatge?</translation> <translation id="7205698830395646142">Amaga al menú de Chromium</translation> <translation id="7211828883345145708">Activa tecles de drecera addicionals que siguin útils per depurar Chromium.</translation> @@ -190,7 +190,7 @@ <translation id="7641113255207688324">Chromium no és el navegador predeterminat.</translation> <translation id="7729447699958282447">Chromium no ha pogut sincronitzar les dades perquè l'opció de sincronització no està disponible per al vostre domini.</translation> <translation id="7747138024166251722">L'instal·lador no ha pogut crear un directori temporal. Comprova que hi ha espai lliure al disc i que tens permís per instal·lar el programari.</translation> -<translation id="7918535023914021398">Chromium ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor no ha proporcionat informació sobre Certificate Transparency.</translation> +<translation id="7918535023914021398">Chromium ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor no ha proporcionat informació sobre Transparència de certificats.</translation> <translation id="7937630085815544518">Teníeu la sessió iniciada a Chromium com a <ph name="USER_EMAIL_ADDRESS" />. Utilitzeu el mateix compte per tornar a iniciar-hi la sessió.</translation> <translation id="7962572577636132072">Chromium s'actualitza automàticament perquè en tingueu sempre la versió més recent.</translation> <translation id="7979877361127045932">Amaga al menú de Chromium</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 7f5259b..cfb7d52 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">ይህ የእርስዎን የመነሻ ገጽ፣ አዲስ የትር ገጽ፣ የፍለጋ ፕሮግራምን እና የተሰኩ ትሮችን ዳግም ያቀናብራቸዋል። እንዲሁም ሁሉንም ቅጥያዎች ያሰናክላል እና እንደ ኩኪዎች ያለ ጊዜያዊ ውሂብን ያጸዳል። የእርስዎ ዕልባቶች፣ ታሪክ እና የተቀመጡ የይለፍ ቃላት አይጸዱም።</translation> <translation id="1434886155212424586">መነሻ ገጽ አዲሱ የትር ገጽ ነው</translation> <translation id="1435550882135542937">የቅጥያ መሣሪያ አሞሌ ዳግም ንድፍ</translation> +<translation id="1436402875660227532">ማስታወሻ፦ እነዚህ ቅንብሮች ከእንግዲህ በዚህ ሥርዓት ላይ ጥቅም ላይ አይውሉም፣ ነገር ግን አሁንም ሊመለከቷቸው እና ሊያርትዑዋቸው ይችላሉ።</translation> <translation id="1436784010935106834">ተወግዷል</translation> <translation id="1438632560381091872">የትሮች ድምጸ-ከል አንሳ</translation> <translation id="1441841714100794440">የቪዬትናምኛ የቁልፍ ሰሌዳ (ቴለክስ)</translation> @@ -1317,6 +1318,7 @@ <translation id="2889064240420137087">አገናኝ ክፈት በ...</translation> <translation id="2889925978073739256">በማጠሪያ ያልተቀመጡ ተሰኪዎችን ማገዱን ቀጥል</translation> <translation id="2890624088306605051">የተመሳሰሉ ቅንብሮችንና ውሂብ ብቻ አምጣ</translation> +<translation id="2890678560483811744">ከወሰን ውጭጭ የሆነ የገጽ ማጣቀሻ</translation> <translation id="2893168226686371498">ነባሪ አሳሽ</translation> <translation id="289426338439836048">ሌላ የተንቀሳቃሽ ስልክ አውታረ መረብ...</translation> <translation id="2894745200702272315">የሃርድዌር ጥገኝነት ያላቸው የ«Ok Google» የሙከራ ትኩስ ቃል ማወቂያ ባህሪያትን ያነቃል።</translation> @@ -1345,7 +1347,6 @@ <translation id="2925966894897775835">ሉሆች</translation> <translation id="2927017729816812676">የመሸጎጫ ማከማቻ</translation> <translation id="2927657246008729253">ለውጥ…</translation> -<translation id="2928415919076124714">በሙሉ ማያ ገጽ ውስጥ የመሣሪያ አሞሌን ደብቅ</translation> <translation id="2928526264833629376">ወደ Hangouts ቀጥል</translation> <translation id="2930644991850369934">የማግኛ ምስሉን በማውረድ ላይ ሳለ ችግር ነበር። የአውታረ መረብ ግንኙነት ጠፍቷል።</translation> <translation id="293111069139560936">ነጠላ አስቀድሞ ገባሪ የሆነ ከእሱ ጋር የተጎዳኘ መስኮት ያለው የመደርደሪያ ንጥል ጠቅ ከተደረገ መደርደሪያው መስኮት ለማሳነስ ያስችላል።</translation> @@ -1590,7 +1591,6 @@ <translation id="3289566588497100676">ቀላል ምልክት ግብዓት</translation> <translation id="3289856944988573801">ዝማኔዎች ካሉ ለማየት እባክዎ Ethernet ወይም Wi-Fi ይጠቀሙ።</translation> <translation id="3293325348208285494">ፈጣን ጅማሬ</translation> -<translation id="3293894718455402932">«<ph name="EXTENSION" />» ምልክት በተደረገባቸው አቃፊዎች ውስጥ ያሉ ምስሎችን፣ ቪዲዮዎችን እና የድምጽ ፋይሎችን ማንበብ እና መጻፍ ይችላል።</translation> <translation id="3294437725009624529">እንግዳ</translation> <translation id="329650768420594634">የጥቅል ቅጥያ ማስጠንቀቂያ</translation> <translation id="3296763833017966289">ጆርጂያኛ</translation> @@ -1648,6 +1648,7 @@ <translation id="3338239663705455570">የስሎቬኒያኛ ቁልፍ ሰሌዳ</translation> <translation id="3340978935015468852">ቅንብሮች</translation> <translation id="3341703758641437857">ለፋይል ዩአርኤልዎች መዳረሻ ፍቀድ</translation> +<translation id="3343813173145836998">በዚህ መሣሪያ ላይ በቀላሉ ወደ መለያ ይግቡ</translation> <translation id="3344786168130157628">የመዳረሻ ነጥብ ስም፦</translation> <translation id="3345135638360864351">ይህን ጣቢያ ለመድረስ ያቀረቡት ጥያቄ ወደ <ph name="NAME" /> ሊላክ አልተቻለም። እባክዎ እንደገና ይሞክሩ።</translation> <translation id="3345886924813989455">ምንም የሚደገፍ አሳሽ አልተገኘም።</translation> @@ -2285,6 +2286,7 @@ <translation id="4268025649754414643">የቀልፍ ሚስጥራዊነት</translation> <translation id="4268574628540273656">URL፦</translation> <translation id="4270393598798225102">ስሪት <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">ምንም ተዛማጆች የሉም</translation> <translation id="4274187853770964845">የማመሳሰል ስህተት፦ እባክዎ ያቁሙና ማመሳሰልን ዳግም ያስጀምሩ።</translation> <translation id="4275830172053184480">መሣሪያዎን ዳግም ያስጀምሩ</translation> <translation id="4276796043975446927">እንኳን በደህና ወደ Chromebox ለስብሰባዎች መጡ!</translation> @@ -2354,6 +2356,7 @@ <translation id="4378551569595875038">በመገናኘት ላይ...</translation> <translation id="438122767399415311">የUI አቅጣጫ ያስገድዱ</translation> <translation id="4381849418013903196">ኮሎን</translation> +<translation id="4383192539467954373">በተለያዩ መሣሪያዎች ላይ በራስ-ሰር ወደ መለያ ይግቡ</translation> <translation id="4384652540891215547">ቅጥያውን አግብር</translation> <translation id="438503109373656455">ሳራቶጋ</translation> <translation id="4387554346626014084">የመተግበሪያ ማስጀመሪያ አመሳሰልን ያንቁ። ይሄ እንዲሁም ሲገኙ አቃፊዎችንም ያነቃል (OSX ያልሆኑ)።</translation> @@ -2386,6 +2389,7 @@ <translation id="444267095790823769">የተጠበቁ የይዘት ልዩ ሁኔታዎች</translation> <translation id="4443536555189480885">&እገዛ</translation> <translation id="4444304522807523469">በዩ.ኤስ.ቢ ወይም በአካባቢ አውታረ መረብ በኩል የተያያዙ የሰነድ ቃኚዎችን ይድረስባቸው</translation> +<translation id="4445559854264555037">የእርስዎ መሣሪያ አይታየዎትም? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">ተንጸባርቋል</translation> <translation id="4447465454292850432">ባትሪ፦</translation> <translation id="4449935293120761385">ስለራስ-ሙላ</translation> @@ -2644,6 +2648,7 @@ <translation id="485316830061041779">ጀርመን</translation> <translation id="4856478137399998590">የተንቀሳቃሽ ስልክ ውሂብ አገልግሎትዎ የገበረና ስራ ላይ ለመዋል ዝግጁ ነው</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">ተገቢነት ሲሆን ውርዶች በሥርዓቱ የማውረጃ አስተዳዳሪ በኩል እንዲስተናገዱ ይፍቀዱ።</translation> <translation id="48607902311828362">የአውሮፕላን ሁነታ</translation> <translation id="4861833787540810454">&አጫውት</translation> <translation id="4862050643946421924">መሣሪያን በማከል ላይ...</translation> @@ -2727,7 +2732,6 @@ <translation id="4977942889532008999">መዳረሻ ያረጋግጡ</translation> <translation id="4982718461356080574">በሚደራረብበት ጊዜ የዝጋ አዝራሮችን በንቁ ያልሆኑ ትሮች ላይ በመደበቅ ላይ</translation> <translation id="498294082491145744">የድር ጣቢያዎችን መዳረሻ የሚቆጣጠሩ እንደ ኩኪዎች፣ ጃቫስክሪፕት፣ ተሰኪዎች፣ የስነምድራዊ መገኛ ቦታ፣ ማይክራፎን፣ ካሜራ ወዘተ የመሳሰሉ ባህሪዎች የእርስዎን ቅንብሮች ይለውጡ።</translation> -<translation id="4984329823325527157">የማህደረመረጃ ምንጭ ኤፒአይ</translation> <translation id="4988526792673242964">ገፆች</translation> <translation id="4988792151665380515">ህዝባዊ ቁልፍን መላክ አልተሳካም።</translation> <translation id="49896407730300355">በሰዓት መዞሪያ አቅጣጫ &ተቃራኒ አሽከርክር</translation> @@ -2916,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (ከሂደት ውጪ)</translation> <translation id="526926484727016706">ሁሉም iframes በነባሪ ሁሉንም ፍቃዶች እንዲከለከሉ ያደርጋል። የተወሰኑ ፍቃዶችን ለአንድ iframe መፍቀድ የእነዚህን ፍቃዶች ስሞች እንደ የiframe ባህሪዎች እሴቶች መዘርዘርን ሊያካትት ይችላል።</translation> <translation id="5269977353971873915">ማተም አልተሳካም</translation> -<translation id="5270884342523754894">«<ph name="EXTENSION" />» ምልክት በተደረገባቸው አቃፊዎች ውስጥ ያሉ ምስሎችን፣ ቪዲዮዎችን እና የድምጽ ፋይሎችን ማንበብ ይችላል።</translation> <translation id="5271247532544265821">ቀላል/ባህላዊ ቻይንኛ ሁነታን ይቀያይሩ</translation> <translation id="5271549068863921519">የይለፍ ቃሉን አስቀምጥ</translation> <translation id="5273628206174272911">ለአግድሞሽ ማሸብለል ምላሽነት የሙከራ ታሪክ አሰሳን ያነቃል።</translation> @@ -3006,11 +3009,11 @@ <translation id="5390284375844109566">በመረጃ ጠቋሚ የተሰናዳ የውሂብ ጎታ</translation> <translation id="5392544185395226057">የቤተኛ ደንበኛ ድጋፍን ያነቃል።</translation> <translation id="5393125431335030955">ይህ ተሰኪ በዴስክቶፑ ላይ ብቻ ነው የሚሰራው።</translation> -<translation id="5393559999218790205">የበይነገጽ ጥንቅር እነማ የጊዜ መስመሮችን አሰናክል</translation> <translation id="5396126354477659676">በ<ph name="PEPPER_PLUGIN_DOMAIN" /> ላይ ያለው <ph name="PEPPER_PLUGIN_NAME" /> ኮምፒውተርዎን ሊደርስበት ይፈልጋል።</translation> <translation id="539755880180803351">የራስ-ሙላ መስክ ትየባ ግምቶች ያላቸው የድር ቅጾችን እንደ ቦታ ያዥ ጽሑፍ ያብራራቸዋል።</translation> <translation id="5397578532367286026">የዚህ ተጠቃሚ አጠቃቀም እና ታሪክ በchrome.com ላይ በአስተዳዳሪ (<ph name="MANAGER_EMAIL" />) ሊገመገም ይችላል።</translation> <translation id="5397794290049113714">እርስዎ</translation> +<translation id="5398572795982417028">ከወሰን ውጪ ያለ ገጽ ማጣቀሻ፣ ገደቡ <ph name="MAXIMUM_PAGE" /> ነው</translation> <translation id="5398824043967640339"><ph name="COUNT" /> ከሌሎች ጣቢያዎች</translation> <translation id="5399158067281117682">ፒንዎቹ አይመሳሰሉም!</translation> <translation id="5400640815024374115">የታመነ የመሣሪያ ስርዓት ሞዱል (ቲ ፒ ኤም) ቺፕ ተሰናክሏል ወይም የለም።</translation> @@ -3030,7 +3033,7 @@ <translation id="5423849171846380976">ገብሯል</translation> <translation id="5425470845862293575">የሙከራ የDirectWrite ቅርጸ ቁምፊ የመስጠት ስርዓት መጠቀምን ያነቃል።</translation> <translation id="5425722269016440406">ይህ ቅንብር በስልኩ ላይ እና በሌሎች መሣሪያዎች ላይ እንዲመሳሰል ስለተደረገ Smart Lockን ለማጥፋት መስመር ላይ መሆን አለብዎት። በመጀመሪያ እባክዎ ወደ አውታረ መረብ ያገናኙ።</translation> -<translation id="5426623592374109001">በበይነገጽ ውስጥ ላሉ የተጠናቀሩ እነማዎች የድሮ ሰርጎ-ገብ እነማ ንዑስ ሥርዓቱን ይጠቀሙ።</translation> +<translation id="5425863515030416387">በተለያዩ መሣሪያዎች ላይ በቀላሉ ወደ መለያ ይግቡ</translation> <translation id="5427459444770871191">በ&ሰዓት መዞሪያ አቅጣጫ አሽከርክር</translation> <translation id="5428105026674456456">ስፓኒሽ</translation> <translation id="542872847390508405">እያሰሱ ያለው እንደ እንግዳ ነው</translation> @@ -3225,7 +3228,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">መለኪያ ማስጀመሪያ</translation> <translation id="5710406368443808765">ውይ! ስርዓቱ የመሣሪያ ማስመሰያ እና መታወቂያ ማከማቸት አልተሳካለትም።</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> ምላሽ እየሰጠ አይደለም። Cast ማድረግ አልተቻለም።</translation> <translation id="5711983031544731014">ማስከፈት አልተቻለም። የይለፍ ቃልዎን ያስገቡ።</translation> <translation id="5712966208980506909">ከነቃ የchrome://md-policy ዩአርኤሉ የቁሳዊ ንድፍ መመሪያ ገጹን ይጭነዋል።</translation> <translation id="5715711091495208045">የተሰኪ አስማሚ፦ <ph name="PLUGIN_NAME" /></translation> @@ -3493,7 +3495,6 @@ <translation id="6111974609785983504">በነባሪነት የተፈቀደ</translation> <translation id="6113134669445407638">በWebRTC ውስጥ Delay Agnostic AECን ያሰናክሉ። ሪፖርት የተደረጉ የስርዓት መዘግየቶች የታመኑ ከሆኑ ወይም ሌሎች ከእርስዎ ማሽን ተሞክሮ የገደል ማሚቶ ካስተጋቡ ይጠቀሙ።</translation> <translation id="6116921718742659598">የቋንቋ እና ግቤት ቅንብሮችን ይቀይሩ</translation> -<translation id="6117536376248197233">በምስል ሰሪዎች ውስጥ የተጠናቀሩ እነማ የጊዜ መስመሮችን አሰናክል</translation> <translation id="6120205520491252677">ይህን ገጽ የመነሻ ገጹ ላይ ይሰኩት...</translation> <translation id="6122081475643980456">የበይነመረብ ግንኙነትዎ ቁጥጥር እየተደረገበት ነው</translation> <translation id="6122093587541546701">ኢሜይል (ከተፈለገ)፦</translation> @@ -3525,6 +3526,7 @@ <translation id="6163522313638838258">ሁሉንም ዘርጋ...</translation> <translation id="6164005077879661055">ይህ ክትትል የሚደረግበት ተጠቃሚ አንዴ ከተወገደ በኋላ ሁሉም ከዚህ ክትትል የሚደረግበት ተጠቃሚ ጋር የተጎዳኙ ፋይሎች እና አካባቢያዊ ውሂብ እስከመጨረሻው ይሰረዛሉ። አስተዳዳሪው የዚህ ክትትል የሚደረግበት ተጠቃሚ የጎበኛቸው ድር ጣቢያዎች እና ቅንብሮች <ph name="MANAGEMENT_URL" /> ላይ ሊያዩት ይችላሉ።</translation> <translation id="6165508094623778733">ተጨማሪ ለመረዳት</translation> +<translation id="6167008112175207002">የእርስዎን ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች በሁሉም መሣሪያዎችዎ ላይ እንዲጠቀሙባቸው ከGoogle መለያዎ ጋር ይሰምራሉ። ይህንን በ<ph name="BEGIN_LINK" /> ውስጥ መለወጥ ይችላሉ</translation> <translation id="6171550060231646388">የተመሳሰሉ ሃርድዌር የ«Ok Google» ባህሪያትን አንቃ</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">የዕውቅና ማረጋገጫ ምረጥ/ሰርቲፊኬት</translation> @@ -3770,7 +3772,6 @@ <translation id="6555432686520421228">ሁሉንም የተጠቃሚ መለያዎች ያስወግዱና ልክ እንደ አዲስ እንዲሆን የ<ph name="IDS_SHORT_PRODUCT_NAME" /> መሣሪያዎን ዳግም ያስጀምሩት።</translation> <translation id="6556866813142980365">ድገም</translation> <translation id="6557565812667414268">ለባለከፍተኛ ዲ ፒ አይ ማሳያዎች ብቻ የነቃ</translation> -<translation id="655845594391856372">ትር ምላሽ እየሰጠ አይደለም። Cast ማድረግ አልተቻለም።</translation> <translation id="6559580823502247193">(በዚህ መሣሪያ ላይ አስቀድሞ አለ)</translation> <translation id="6561726789132298588">ያስገቡ</translation> <translation id="6562437808764959486">የዳግም ማግኛ ምስልን በማውጣት ላይ...</translation> @@ -3871,6 +3872,7 @@ <translation id="6723354935081862304">ወድ Google ሰነዶች እና ሌሎች የዳመና መድረሻዎች ያትሙ። ወደ Google የዳመና ህትመት ለማተም <ph name="BEGIN_LINK" />ይግቡ<ph name="END_LINK" />።</translation> <translation id="6723661294526996303">ዕልባቶችን እና ቅንብሮችን አስመጣ...</translation> <translation id="6723839937902243910">ኃይል</translation> +<translation id="6725240607822645708">በራሱ ተከታታይ ላይ አይኤምኢን አስሂድ።</translation> <translation id="6725970970008349185">በገጽ የሚታዩ የእጩዎች ብዛት</translation> <translation id="672609503628871915">ምን አዲስ ነገር እንዳለ ይመልከቱ</translation> <translation id="6727005317916125192">ቀዳሚ ንጥል</translation> @@ -4001,12 +4003,11 @@ <translation id="6948736568813450284">ለገንቢዎች፦ የማጠሪያ አገልግሎቱን ለGoogle Payments ኤፒአይ ጥሪዎች ይጠቀሙ።</translation> <translation id="6949306908218145636">ክፍት ገጾችን በዕልባት ያስቀምጡ...</translation> <translation id="695164542422037736">ይህ አማራጭ ነቅቶ ከሆነ፣ እንዲሁም body የተዘጋጀው background-attachment:fixed በሚል ከሆነ፣ ጀርባው የራሱ የሆነ የውህድ ሽፋን ይኖረዋል።</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> በዚህ መሣሪያ ላይ የእርስዎን የይለፍ ቃል ያስተውሳል እና በራስ ሰር መዝግቦ ያስገባዎታል።</translation> <translation id="6955446738988643816">ብቅ-ባይ ይመርምሩ</translation> <translation id="695755122858488207">ያልተመረጠ የሬዲዮ አዝራር</translation> +<translation id="6960277925159781810">በዚህ መሣሪያ ላይ በራስ-ሰር ወደ መለያ ይግቡ</translation> <translation id="696036063053180184">3 Set (ምንም መቀየሪያ የለም)</translation> <translation id="696203921837389374">በሞባይል ውሂብ ላይ ማመሳሰልን አንቃ</translation> -<translation id="6964308487066031935">አቃፊዎች ወደ «<ph name="EXTENSION" />» ይታከሉ?</translation> <translation id="6965382102122355670">ይሁን</translation> <translation id="6965648386495488594">ወደብ</translation> <translation id="6965978654500191972">መሣሪያ</translation> @@ -4107,7 +4108,6 @@ <translation id="7076293881109082629">በመግባት ላይ</translation> <translation id="7077829361966535409">የመግቢያ ገጹ የአሁኑ የተኪ ቅንብሮች ተጠቅሞ መጫን አልቻለም። እባክዎ <ph name="GAIA_RELOAD_LINK_START" />እንደገና ለመግባት ይሞክሩ<ph name="GAIA_RELOAD_LINK_END" /> ወይም ደግሞ የተለየ <ph name="PROXY_SETTINGS_LINK_START" />የተኪ ቅንብሮች<ph name="PROXY_SETTINGS_LINK_END" />ን ይጠቀሙ።</translation> <translation id="7077872827894353012">ችላ የተባሉ የፕሮቶኮል ተቆጣጣሪዎች</translation> -<translation id="7079038783243627996">«<ph name="EXTENSION" />» ምልክት በተደረገባቸው አቃፊዎች ውስጥ ያሉ ምስሎችን፣ ቪዲዮዎችን እና የድምጽ ፋይሎችን ማንበብ እና መሰረዝ ይችላል።</translation> <translation id="708060913198414444">የኦዲዮ አድራሻ &ቅዳ</translation> <translation id="708187310695946552">የክፍለ ጊዜ እንደነበረ መመለሻ አረፋ ዩአይ</translation> <translation id="7082055294850503883">የCapsLock ሁኔታን ችላ በልና ንዑስ ሆሄያትን በነባሪነት አስገባ</translation> @@ -4479,7 +4479,6 @@ <translation id="7650511557061837441">«<ph name="TRIGGERING_EXTENSION_NAME" />» «<ph name="EXTENSION_NAME" />»ን ማስወግድ ይፈልጋል።</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> በዚህ ቋንቋ እየታየ ነው</translation> <translation id="7654941827281939388">ይህ መለያ አስቀድሞ በዚህ ኮምፒውተር ላይ ስራ ላይ ውሏል።</translation> -<translation id="7655165758820095116">የMediaSource ነገር ጃቫስክሪፕት የማህደረመረጃ ውሂብ በቀጥታ ወደ አንድ የቪዲዮ አባል እንዲልክ ያስችለዋል።</translation> <translation id="7658239707568436148">ይቅር</translation> <translation id="7659584679870740384">ይህን መሣሪያ ለመጠቀም ስልጣን አልተሰጠዎትም። የመግባት ፍቃድ ለማግኘት አስተዳዳሪውን ያነጋግሩ።</translation> <translation id="7664620655576155379">የማይደገፍ የብሉቱዝ መሣሪያ፦ «<ph name="DEVICE_NAME" />»።</translation> @@ -4610,6 +4609,7 @@ <translation id="7861215335140947162">&የወረዱ</translation> <translation id="7864539943188674973">ብሉቱዝን ያሰናክሉ</translation> <translation id="7868891395842935202">የኤፒአይ ሙከራዎች መዳረሻን ለመቆጣጠር የሙከራ መዋቅርን ያነቃል።</translation> +<translation id="7870576007982733437">ተገቢነት ሲሆን የሥርዓት ውርድ አስተዳዳሪውን ይጠቀሙ።</translation> <translation id="7870790288828963061">ምንም አዲስ ስሪት ያላቸው የKiosk መተግበሪያዎች አልተገኙም። ምንም የሚዘምን ነገር የለም። እባክዎ የዩ.ኤስ.ቢ. ስቲኩን ያስወግዱ።</translation> <translation id="787150342916295244">ክሬዲት ካርድን መቃኘት</translation> <translation id="7874357055309047713">ሁልጊዜ በሁሉም ጣቢያዎች ላይ አሂድ</translation> @@ -4652,7 +4652,6 @@ <translation id="7918257978052780342">ተመዝገብ</translation> <translation id="7920092496846849526">ይህን ገጽ መጎብኘት ችግር ካለው ወላጅዎን ጠይቀዋል።</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> በመጠበቅ ላይ…</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> በእነኝህ መሣሪያዎች ላይ ሁሉ የእርስዎን የይለፍ ቃል ያስተውሳል እና በራስ ሰር መዝግቦ ያስገባዎታል።</translation> <translation id="7925686952655276919">ለማመሳሰል የተንቀሳቃሽ ስልክ ውሂብን አትጠቀም</translation> <translation id="7926906273904422255">ደህንነታቸው ያልተረጋገጡ ምንጮችን ደህንነታቸው ያልተረጋገጡ ወይም «አጠራጣሪ» የሚል ምልክት አድርግበት።</translation> <translation id="7928710562641958568">መሣሪያን አውጣ</translation> @@ -4719,7 +4718,6 @@ nil</translation> <translation id="799923393800005025">ማየት ይችላሉ</translation> <translation id="7999338963698132743">አዲስ የተግባር አስተዳዳሪ</translation> -<translation id="8000004253404706714">በምስል ሰሪዎች ላሉ የተጠናቀሩ እነማዎች የድሮ ሰርጎ-ገብ እነማ ንዑስ ሥርዓቱን ይጠቀሙ።</translation> <translation id="8004582292198964060">አሳሽ</translation> <translation id="8007030362289124303">ባትሪ አንሷል</translation> <translation id="8008356846765065031">የበይነመረብ ግንኙነት ተቋርጧል። እባክዎ የበይነመረብዎን ግንኙነት ይፈትሹ።</translation> @@ -5243,6 +5241,7 @@ <translation id="8765985713192161328">ተቆጣጣሪዎችን ያቀናብሩ...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">ተጠቃሚዎች</translation> +<translation id="8768367823103160496">የመዳፊት ጠቋሚ መቆለፊያ</translation> <translation id="8769662576926275897">የካርድ ዝርዝሮች</translation> <translation id="8770196827482281187">የፋርስኛ ግቤት ስልት (ISIRI 2901 አቀማመጥ)</translation> <translation id="8774934320277480003">የላይኛው ህዳግ</translation> @@ -5262,6 +5261,7 @@ <translation id="8795668016723474529">የብድር ካርድ አክል</translation> <translation id="8795916974678578410">አዲስ መስኮት</translation> <translation id="8798099450830957504">እንደወረደ</translation> +<translation id="8799127529310003270">እንዲነቃ ከተደረገ InputConnection በአይኤምኢ ተከታታይ ላይ ጥሪዎችን ያስሄዳል፣ እና የብዜት አርታዒን በማቆየት ፈንታ እያንዳንዱ የInputConnection ምስል አቅራቢውን በቀጥታ ያነጋግራል።</translation> <translation id="8799839487311913894">«የይለፍ ቃል ለውጥ» ቅፅን ካስገቡ በኋላ በይለፍ ቃል አስተዳዳሪ ውስጥ የይለፍ ቃል ማዘመንን ያንቁ።</translation> <translation id="8800004011501252845">መድረሻዎችን በማሳየት ላይ ለ፦</translation> <translation id="8800420788467349919">ድምጽ፦ <ph name="PRECENTAGE" />%</translation> @@ -5287,6 +5287,7 @@ <translation id="8841142799574815336">Inert ምስላዊ መመልከቻ።</translation> <translation id="884264119367021077">የመላኪያ አድራሻ</translation> <translation id="8844238624737526720">የአዲሱን የተመቻቸውን የchrome ተግባር መሪን ትግበራ አጠቃቀም።</translation> +<translation id="8845001906332463065">እገዛ ያግኙ</translation> <translation id="8846141544112579928">የቁልፍ ሰሌዳን በመፈለግ ላይ...</translation> <translation id="8847988622838149491">ዩ ኤስ ቢ</translation> <translation id="8848709220963126773">የShift ቁልፍ ሁነታ ቅያሬ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 190c857..2ba4adf 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">سيعيد هذا تعيين صفحة بدء التشغيل، وصفحة علامة تبويب جديدة، ومحرك البحث، وعلامات التبويب المثبتة. وستعطِّل أيضًا جميع الإضافات وتمحو البيانات المؤقتة مثل ملفات تعريف الارتباط. ولن يتم محو الإشارات المرجعية، والسجل، وكلمات المرور المحفوظة.</translation> <translation id="1434886155212424586">الصفحة الرئيسية هي صفحة "علامة تبويب جديدة"</translation> <translation id="1435550882135542937">إعادة تصميم شريط أدوات الإضافات</translation> +<translation id="1436402875660227532">ملاحظة: لن يتم استخدام هذه الإعدادات على هذا النظام بعد الآن، ولكن لا يزال بإمكانك عرضها وتعديلها.</translation> <translation id="1436784010935106834">تمت الإزالة</translation> <translation id="1438632560381091872">إلغاء تجاهل علامات التبويب</translation> <translation id="1441841714100794440">لوحة المفاتيح الفيتنامية (Telex)</translation> @@ -1316,6 +1317,7 @@ <translation id="2889064240420137087">فتح الرابط باستخدام...</translation> <translation id="2889925978073739256">متابعة حظر المكونات الإضافية غير المحمية</translation> <translation id="2890624088306605051">استرداد الإعدادات والبيانات التي تمت مزامنتها فقط</translation> +<translation id="2890678560483811744">مرجع صفحة خارج الحدود المفروضة</translation> <translation id="2893168226686371498">المتصفح الافتراضي</translation> <translation id="289426338439836048">شبكة جوال أخرى...</translation> <translation id="2894745200702272315">تمكين نسخة تجريبية من ميزات كشف الكلمة المهمة "Ok Google" والتي لها اعتمادية الأجهزة.</translation> @@ -1344,7 +1346,6 @@ <translation id="2925966894897775835">جداول البيانات</translation> <translation id="2927017729816812676">السعة التخزينية لذاكرة التخزين المؤقت</translation> <translation id="2927657246008729253">تغيير...</translation> -<translation id="2928415919076124714">إخفاء شريط الأدوات في وضع ملء الشاشة</translation> <translation id="2928526264833629376">المتابعة إلى Hangouts</translation> <translation id="2930644991850369934">حدثت مشكلة أثناء تنزيل ملف الاستعادة. حيث فُقد الاتصال بالشبكة.</translation> <translation id="293111069139560936">السماح للرف بتصغير نافذة في حالة النقر على عنصر في الرف، لا يتضمن سوى نافذة مرتبطة نشطة فعلاً.</translation> @@ -1589,7 +1590,6 @@ <translation id="3289566588497100676">إدخال الرموز البسيطة</translation> <translation id="3289856944988573801">للتحقق من وجود تحديثات، يُرجى استخدام شبكة Ethernet أو Wi-Fi.</translation> <translation id="3293325348208285494">البدء السريع</translation> -<translation id="3293894718455402932">ستتمكن الإضافة "<ph name="EXTENSION" />" من قراءة وكتابة ملفات الصور ومقاطع الفيديو والملفات الصوتية في المجلدات المحددة.</translation> <translation id="3294437725009624529">ضيف</translation> <translation id="329650768420594634">تحذير حزمة الإضافة</translation> <translation id="3296763833017966289">الجورجية</translation> @@ -1644,6 +1644,7 @@ <translation id="3338239663705455570">لوحة المفاتيح السلوفينية</translation> <translation id="3340978935015468852">الإعدادات</translation> <translation id="3341703758641437857">السماح بالدخول إلى عناوين URL للملفات</translation> +<translation id="3343813173145836998">تسجيل الدخول بسهولة على هذا الجهاز</translation> <translation id="3344786168130157628">اسم نقطة الدخول:</translation> <translation id="3345135638360864351">تعذر إرسال طلبك للوصول إلى هذا الموقع إلى <ph name="NAME" />. يُرجى إعادة المحاولة مرة أخرى.</translation> <translation id="3345886924813989455">لم يتم العثور على·متصفح متوافق.</translation> @@ -2280,6 +2281,7 @@ <translation id="4268025649754414643">تشفير المفتاح</translation> <translation id="4268574628540273656">عنوان URL:</translation> <translation id="4270393598798225102">الإصدار <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">لا توجد أي مطابقات</translation> <translation id="4274187853770964845">خطأ في المزامنة. الرجاء إيقاف المزامنة وإعادة تشغيلها.</translation> <translation id="4275830172053184480">إعادة تشغيل جهازك</translation> <translation id="4276796043975446927">مرحبًا في Chromebox للاجتماعات</translation> @@ -2349,6 +2351,7 @@ <translation id="4378551569595875038">جارٍ الاتصال...</translation> <translation id="438122767399415311">فرض اتجاه واجهة المستخدم</translation> <translation id="4381849418013903196">نقطتان</translation> +<translation id="4383192539467954373">تسجيل الدخول تلقائيًا عبر الأجهزة</translation> <translation id="4384652540891215547">تنشيط الإضافة</translation> <translation id="438503109373656455">ساراتوجا</translation> <translation id="4387554346626014084">تمكين مزامنة تطبيقات Launcher. ويؤدي هذا أيضًا إلى تمكين المجلدات متى توفرت (بخلاف OSX).</translation> @@ -2381,6 +2384,7 @@ <translation id="444267095790823769">استثناءات المحتوى المحمي</translation> <translation id="4443536555189480885">&تعليمات</translation> <translation id="4444304522807523469">الدخول إلى الماسحات الضوئية للمستند الملحق عبر جهاز USB أو على الشبكة المحلية</translation> +<translation id="4445559854264555037">ألا ترى جهازك؟ <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">معكوس</translation> <translation id="4447465454292850432">البطارية:</translation> <translation id="4449935293120761385">حول الملء التلقائي</translation> @@ -2638,6 +2642,7 @@ <translation id="485316830061041779">الألمانية</translation> <translation id="4856478137399998590">تم تنشيط خدمة بيانات الجوال وهي جاهزة للاستخدام.</translation> <translation id="4858913220355269194">فريتز</translation> +<translation id="4860565041166337978">اسمح لمدير تنزيل النظام بمعالجة التنزيلات عندما يكون ذلك مناسبًا.</translation> <translation id="48607902311828362">وضع الطائرة</translation> <translation id="4861833787540810454">تش&غيل</translation> <translation id="4862050643946421924">جارٍ إضافة جهاز...</translation> @@ -2721,7 +2726,6 @@ <translation id="4977942889532008999">تأكيد الدخول</translation> <translation id="4982718461356080574">إخفاء أزرار الإغلاق على علامات التبويب غير النشطة عند جمعها في حزم</translation> <translation id="498294082491145744">تغيير الإعدادات التي تتحكم في وصول مواقع الويب إلى ميزات كملفات تعريف الارتباط، وجافا سكريبت، والمكونات الإضافية، والمواقع الجغرافية، والميكروفون والكاميرا، وغيرها.</translation> -<translation id="4984329823325527157">واجهة برمجة تطبيقات مصدر الوسائط</translation> <translation id="4988526792673242964">صفحات</translation> <translation id="4988792151665380515">أخفق تصدير المفتاح العام.</translation> <translation id="49896407730300355">تدوير ع&كس اتجاه عقارب الساعة</translation> @@ -2909,7 +2913,6 @@ <translation id="5268606875983318825">PPAPI (خارج المعالجة)</translation> <translation id="526926484727016706">يؤدي إلى رفض جميع أذونات أطر iFrame على نحو افتراضي. وقد يتضمن السماح لأذونات معينة لأحد إطارات iFrame إدراج أسماء هذه الأذونات كقيم لسمات إطار iFrame الجديد.</translation> <translation id="5269977353971873915">أخفقت الطباعة</translation> -<translation id="5270884342523754894">ستتمكن الإضافة "<ph name="EXTENSION" />" من قراءة ملفات الصور ومقاطع الفيديو والملفات الصوتية في المجلدات المحددة.</translation> <translation id="5271247532544265821">التبديل بين وضعي الصينية المبسطة/التقليدية</translation> <translation id="5271549068863921519">حفظ كلمة المرور</translation> <translation id="5273628206174272911">التنقل التجريبي عبر السجل استجابة للتمرير الأفقي الزائد.</translation> @@ -2999,11 +3002,11 @@ <translation id="5390284375844109566">قاعدة بيانات مفهرسة</translation> <translation id="5392544185395226057">تمكين دعم Native Client.</translation> <translation id="5393125431335030955">لا يعمل هذا المكون الإضافي إلا في سطح المكتب.</translation> -<translation id="5393559999218790205">تعطيل المخططات الزمنية للصور المتحركة لمكون واجهة المستخدم</translation> <translation id="5396126354477659676">يريد <ph name="PEPPER_PLUGIN_NAME" /> الموجود على <ph name="PEPPER_PLUGIN_DOMAIN" /> الدخول إلى جهاز الكمبيوتر.</translation> <translation id="539755880180803351">إضافة تعليق توضيحي لنماذج الويب باستخدام تنبؤات من نوع حقل الملء التلقائي كنص لعنصر نائب.</translation> <translation id="5397578532367286026">يُمكن للمدير مراجعة الاستخدام والسجل الخاص بهذا المستخدم (<ph name="MANAGER_EMAIL" />) على chrome.com.</translation> <translation id="5397794290049113714">أنت</translation> +<translation id="5398572795982417028">مرجع صفحة خارج الحدود المفروضة، الحد الأقصى هو <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> من المواقع الأخرى</translation> <translation id="5399158067281117682">أرقام التعريف الشخصية غير متطابقة.</translation> <translation id="5400640815024374115">شريحة الوحدة النمطية للنظام الأساسي الموثوق به (TPM) معطلة أو غير موجودة.</translation> @@ -3023,7 +3026,7 @@ <translation id="5423849171846380976">نشطة</translation> <translation id="5425470845862293575">تمكين استخدام نظام عرض خط DirectWrite التجريبي.</translation> <translation id="5425722269016440406">يجب أن تكون متصلاً بالإنترنت لإيقاف تشغيل Smart Lock لأن هذا الإعداد متزامن مع هاتفك وأجهزة أخرى. يُرجى الاتصال بإحدى الشبكات أولاً.</translation> -<translation id="5426623592374109001">استخدم النظام الفرعي للصور المتحركة المتداخل القديم للصور المتحركة المكونة في واجهة المستخدم.</translation> +<translation id="5425863515030416387">تسجيل الدخول بسهولة عبر الأجهزة</translation> <translation id="5427459444770871191">تدوير &في اتجاه عقارب الساعة</translation> <translation id="5428105026674456456">الإسبانية</translation> <translation id="542872847390508405">أنت تتصفح كضيف</translation> @@ -3218,7 +3221,6 @@ <translation id="5708171344853220004">الاسم الأساسي في Microsoft</translation> <translation id="5709885306771508267">تصغير النطاق</translation> <translation id="5710406368443808765">عفوًا! فشل النظام في تخزين رمز الجهاز والمعرّف.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> لا يستجيب. يتعذر الإرسال.</translation> <translation id="5711983031544731014">يتعذر إلغاء القفل. أدخل كلمة المرور.</translation> <translation id="5712966208980506909">في حالة التمكين، سيعمل عنوان URL chrome://md-policy على تحميل صفحة سياسة التصميم متعدد الأبعاد.</translation> <translation id="5715711091495208045">وسيط المكوّن الإضافي: <ph name="PLUGIN_NAME" /></translation> @@ -3485,7 +3487,6 @@ <translation id="6111974609785983504">تم السماح بها افتراضيًا</translation> <translation id="6113134669445407638">تعطيل Delay Agnostic AEC في WebRTC. تُستخدم إذا كانت تأخيرات النظام المُبلغ عنها موثوقًا بها للغاية، أو إذا واجه الآخرون صدى من جهازك.</translation> <translation id="6116921718742659598">تغيير إعدادات اللغة والإدخال</translation> -<translation id="6117536376248197233">تعطيل المخططات الزمنية للصور المتحركة للمكون في برامج العرض.</translation> <translation id="6120205520491252677">جارٍ إضافة هذه الصفحة إلى شاشة البدء...</translation> <translation id="6122081475643980456">يتم التحكم في اتصال الإنترنت التابع لك</translation> <translation id="6122093587541546701">البريد الإلكتروني (اختياري):</translation> @@ -3518,6 +3519,7 @@ <translation id="6164005077879661055">سيتم حذف جميع الملفات والبيانات المحلية المقترنة بالمستخدم الذي يخضع للإشراف نهائيًا بمجرد إزالة هذا المستخدم الذي يخضع للإشراف. وقد تظل مواقع الويب التي تم الانتقال إليها والإعدادات التابعة للمستخدم الذي يخضع للإشراف مرئية للمدير على <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">مزيد من المعلومات</translation> +<translation id="6167008112175207002">ستتم مزامنة الإشارات المرجعية والسجل وكلمات المرور والإعدادات الأخرى إلى حسابك في Google حتى يتسنَّى لك استخدامها على جميع أجهزتك. يمكنك تغيير هذا في <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">أجهزة تمت محاكاتها لميزات "Ok Google"</translation> <translation id="6175314957787328458">المعرّف الفريد العمومي لنطاق Microsoft</translation> <translation id="6178664161104547336">تحديد شهادة</translation> @@ -3763,7 +3765,6 @@ <translation id="6555432686520421228">إزالة جميع حسابات المستخدمين وإعادة تعيين جهاز <ph name="IDS_SHORT_PRODUCT_NAME" /> كما لو كان جديدًا.</translation> <translation id="6556866813142980365">إعادة</translation> <translation id="6557565812667414268">ممكّنة فقط للشاشات ذات عدد كبير للنقاط لكل بوصة</translation> -<translation id="655845594391856372">علامة التبويب لا تستجيب. يتعذر الإرسال.</translation> <translation id="6559580823502247193">(موجود من قبل على هذا الجهاز)</translation> <translation id="6561726789132298588">إدخال</translation> <translation id="6562437808764959486">جارٍ استخراج صورة الاستعادة...</translation> @@ -3864,6 +3865,7 @@ <translation id="6723354935081862304">الطباعة إلى مستندات Google ووجهات السحاب الأخرى. يمكنك <ph name="BEGIN_LINK" />تسجيل الدخول<ph name="END_LINK" /> للطباعة إلى طباعة في السحاب من Google.</translation> <translation id="6723661294526996303">استيراد الإشارات والإعدادات...</translation> <translation id="6723839937902243910">الطاقة</translation> +<translation id="6725240607822645708">تشغيل محرر أسلوب الإدخال (IME) على سلسلة محادثاته الخاصة.</translation> <translation id="6725970970008349185">عدد المرشحين المراد عرضهم لكل صفحة</translation> <translation id="672609503628871915">تعرف على الجديد</translation> <translation id="6727005317916125192">الجزء السابق</translation> @@ -3994,12 +3996,11 @@ <translation id="6948736568813450284">بالنسبة إلى مطوِّري البرامج: يمكن استخدام خدمة وضع الحماية مع مكالمات واجهة برمجة تطبيقات Google Payments.</translation> <translation id="6949306908218145636">وضع إشارة مرجعية على الصفحات المفتوحة...</translation> <translation id="695164542422037736">عند تمكين هذا الخيار، وعندما يتم اختيار نمط background-attachment:fixed للنص الأساسي، سيكون للخلفية طبقتها المركبة الخاصة.</translation> -<translation id="6952626679169241027">يتذكر <ph name="PASSWORD_MANAGER_BRAND" /> كلمات المرور ويسجل دخولك إلى المواقع تلقائيًا على هذا الجهاز.</translation> <translation id="6955446738988643816">فحص النوافذ المنبثقة</translation> <translation id="695755122858488207">زر اختيار غير محدد</translation> +<translation id="6960277925159781810">تسجيل الدخول تلقائيًا على هذا الجهاز</translation> <translation id="696036063053180184">المجموعة 3 (بدون مفتاح Shift)</translation> <translation id="696203921837389374">تمكين المزامنة عبر بيانات الجوّال</translation> -<translation id="6964308487066031935">هل تريد إضافة مجلدات إلى "<ph name="EXTENSION" />"؟</translation> <translation id="6965382102122355670">موافق</translation> <translation id="6965648386495488594">المنفذ</translation> <translation id="6965978654500191972">جهاز</translation> @@ -4100,7 +4101,6 @@ <translation id="7076293881109082629">تسجيل الدخول</translation> <translation id="7077829361966535409">أخفق تحميل صفحة تسجيل الدخول باستخدام إعدادات الخادم الوكيل الحالية. الرجاء <ph name="GAIA_RELOAD_LINK_START" />إعادة محاولة تسجيل الدخول<ph name="GAIA_RELOAD_LINK_END" />، أو استخدام <ph name="PROXY_SETTINGS_LINK_START" />إعدادات خادم وكيل<ph name="PROXY_SETTINGS_LINK_END" /> مختلفة.</translation> <translation id="7077872827894353012">معالجات البروتوكول التي تم تجاهلها</translation> -<translation id="7079038783243627996">ستتمكن الإضافة "<ph name="EXTENSION" />" من قراءة وحذف ملفات الصور ومقاطع الفيديو والملفات الصوتية في المجلدات المحددة.</translation> <translation id="708060913198414444">ن&سخ عنوان الصوت</translation> <translation id="708187310695946552">واجهة مستخدم الفقاعة التفسيرية لاستعادة الجلسة</translation> <translation id="7082055294850503883">تجاهل حالة الأحرف الكبيرة وأدخل الأحرف الصغيرة بشكل افتراضي</translation> @@ -4472,7 +4472,6 @@ <translation id="7650511557061837441">تريد الإضافة "<ph name="TRIGGERING_EXTENSION_NAME" />" إزالة "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772">يتم عرض <ph name="PRODUCT_NAME" /> بهذه اللغة</translation> <translation id="7654941827281939388">يتم الآن استخدام هذا الحساب فعلاً على هذا الكمبيوتر.</translation> -<translation id="7655165758820095116">يتيح كائن MediaSource لجافا سكريبت إرسال بيانات الوسائط إلى أي عنصر فيديو مباشرةً.</translation> <translation id="7658239707568436148">إلغاء</translation> <translation id="7659584679870740384">لا يصرح لك باستخدام هذا الجهاز. يُرجى الاتصال بالمسؤول، للحصول على إذن تسجيل الدخول.</translation> <translation id="7664620655576155379">جهاز بلوتوث غير متوافق: "<ph name="DEVICE_NAME" />".</translation> @@ -4603,6 +4602,7 @@ <translation id="7861215335140947162">ال&تنزيلات</translation> <translation id="7864539943188674973">تعطيل البلوتوث</translation> <translation id="7868891395842935202">تُمكن إطار العمل التجريبي للتحكُّم في الدخول إلى تجارب واجهة برمجة التطبيقات.</translation> +<translation id="7870576007982733437">استخدم مدير تنزيل النظام عندما يكون ذلك مناسبًا.</translation> <translation id="7870790288828963061">لا توجد إصدارات أحدث لتطبيق Kiosk. لا يوجد شيء لتحديثه. يُرجى إزالة جهاز USB.</translation> <translation id="787150342916295244">المسح الضوئي لبطاقة الائتمان</translation> <translation id="7874357055309047713">تشغيل على جميع المواقع دائمًا</translation> @@ -4645,7 +4645,6 @@ <translation id="7918257978052780342">تسجيل</translation> <translation id="7920092496846849526">هل سألت والديك ما إذا كان مناسبًا لك زيارة هذه الصفحة.</translation> <translation id="7925285046818567682">في انتظار <ph name="HOST_NAME" /> ...</translation> -<translation id="7925425262460550824">يتذكر <ph name="PASSWORD_MANAGER_BRAND" /> كلمات المرور ويسجل دخولك إلى التطبيقات والمواقع تلقائيًا عبر الأجهزة.</translation> <translation id="7925686952655276919">عدم استخدام بيانات الجوال للمزامنة</translation> <translation id="7926906273904422255">وضع علامة على الأصول غير الآمنة كغير آمنة، أو "مشكوك فيها".</translation> <translation id="7928710562641958568">إخراج الجهاز</translation> @@ -4707,7 +4706,6 @@ احتفظ بملف المفتاح في مكان آمن، حيث ستحتاج إليه لإنشاء إصدارات جديدة من إضافتك.</translation> <translation id="799923393800005025">يمكن العرض</translation> <translation id="7999338963698132743">إدارة المهام الجديدة</translation> -<translation id="8000004253404706714">استخدم النظام الفرعي للصور المتحركة المتداخل القديم للصور المتحركة المكونة في برامج العرض.</translation> <translation id="8004582292198964060">المتصفّح</translation> <translation id="8007030362289124303">طاقة البطارية منخفضة</translation> <translation id="8008356846765065031">تم قطع الاتصال بالإنترنت. الرجاء التحقق من الاتصال بالإنترنت.</translation> @@ -5230,6 +5228,7 @@ <translation id="8765985713192161328">إدارة المعالجات...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">المستخدمون</translation> +<translation id="8768367823103160496">قفل مؤشر الماوس</translation> <translation id="8769662576926275897">تفاصيل البطاقة</translation> <translation id="8770196827482281187">أسلوب الإدخال الفارسي (تخطيط ISIRI 2901)</translation> <translation id="8774934320277480003">الهامش العلوي</translation> @@ -5249,6 +5248,7 @@ <translation id="8795668016723474529">إضافة بطاقة ائتمان</translation> <translation id="8795916974678578410">نافذة جديدة</translation> <translation id="8798099450830957504">الافتراضي</translation> +<translation id="8799127529310003270">عند التمكين، يتم تشغيل مكالمات InputConnection على سلسلة محادثات محرر أسلوب الإدخال (IME)، وبدلاً من الحفاظ على أداة تحرير النُسخ المتماثلة، سيتم توجيه كل مكالمة InputConnection إلى العارض مباشرةً.</translation> <translation id="8799839487311913894">تمكين تحديث كلمة المرور في مدير كلمة المرور بعد تقديم نموذج "تغيير كلمة المرور".</translation> <translation id="8800004011501252845">عرض الوجهات لـ</translation> <translation id="8800420788467349919">مستوى الصوت: <ph name="PRECENTAGE" />%</translation> @@ -5274,6 +5274,7 @@ <translation id="8841142799574815336">إطار العرض المرئي غير النشط.</translation> <translation id="884264119367021077">عنوان الشحن</translation> <translation id="8844238624737526720">استخدام التنفيذ الجديد والمحسّن لإدارة مهام Chrome.</translation> +<translation id="8845001906332463065">الحصول على مساعدة</translation> <translation id="8846141544112579928">جارٍ البحث عن لوحة المفاتيح...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">التبديل إلى وضع استخدام مفتاح Shift</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 981b6a0..8737f123 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Запазване на отметка към тази страница...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> елемента се изтриват...</translation> <translation id="1048597748939794622">Принудително активиране за всички слоеве</translation> +<translation id="1049795001945932310">&Езикови настройки</translation> <translation id="1049926623896334335">Документ в Word</translation> <translation id="1054153489933238809">Отваряне на оригиналното изображение в нов раздел</translation> <translation id="1055806300943943258">Търсят се устройства с Bluetooth и USB...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Транслитерация (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Автоматично избиране на сървъри за имена</translation> <translation id="1215411991991485844">Добавено е ново приложение на заден план</translation> +<translation id="1216954813581739968">Активиране на възможността за избор на раздел при споделяне на работния плот.</translation> <translation id="121827551500866099">Показване на всички изтеглени файлове...</translation> <translation id="122082903575839559">Алгоритъм за подписа на сертификата</translation> <translation id="1221024147024329929">PKCS 1 MD2 с RSA шифроване</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Автоматичният вход не бе успешен</translation> <translation id="1293556467332435079">Файлове</translation> <translation id="1294298200424241932">Редактиране на настройките за доверие:</translation> +<translation id="1295794900245526845">Изберете запазения си чрез <ph name="PASSWORD_MANAGER_BRAND" /> профил, за да влезете</translation> <translation id="1297175357211070620">Принтер</translation> <translation id="1297922636971898492">В момента няма достъп до Google Диск. Качването ще се рестартира автоматично, щом услугата отново е налице.</translation> <translation id="1300861494336759522">Пренасочване на търсенията от работния плот на Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Така ще се нулират началната страница, новият раздел в браузъра, търсещата машина и фиксираните раздели. Освен това ще се деактивират всички разширения и ще се изчистят временните данни, като например „бисквитките“. Отметките, историята и запазените ви пароли няма да бъдат премахнати.</translation> <translation id="1434886155212424586">Началната страница е новият раздел</translation> <translation id="1435550882135542937">Нов дизайн на лентата с инструменти за разширения</translation> +<translation id="1436402875660227532">Забележка: Настройките вече не се използват в тази система, но пак можете да ги преглеждате и редактирате.</translation> <translation id="1436784010935106834">Премахнато</translation> <translation id="1438632560381091872">Включване отново на звука на разделите</translation> <translation id="1441841714100794440">Виетнамска клавиатура (телекс)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Активирайте поддръжката за виртуална клавиатура.</translation> <translation id="1474079335130556426">Активиране на режима на заден план за приложния програмен интерфейс (API) за насочени съобщения. Това дава възможност на Chrome да продължи да работи след затварянето на последния прозорец и да започне да се изпълнява при стартиране на операционната система, ако този API го изисква.</translation> <translation id="1474339897586437869">Файлът „<ph name="FILENAME" />“ не бе качен. Нямате достатъчно свободно място в Google Диск.</translation> +<translation id="1476607407192946488">&Езикови настройки</translation> <translation id="1476949146811612304">Задайте коя търсеща машина да се използва при търсене от <ph name="BEGIN_LINK" />полето за всичко<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Кеш на означенията за приложния програмен интерфейс (API) за самоличност</translation> <translation id="1478340334823509079">Подробности: <ph name="FILE_NAME" /></translation> @@ -646,6 +651,7 @@ <translation id="1962233722219655970">Тази страница използва приложение за клиент с директно изпълнение, което не работи на компютъра ви.</translation> <translation id="1965328510789761112">Частна памет</translation> <translation id="1965624977906726414">Няма специални разрешения.</translation> +<translation id="1968720524450620475">Активиране на иконите за действия за известията от мрежата.</translation> <translation id="1970746430676306437">Преглед на информацията за страни&цата</translation> <translation id="197288927597451399">Запазване</translation> <translation id="1973491249112991739">Изтеглянето на <ph name="PLUGIN_NAME" /> не бе успешно.</translation> @@ -905,6 +911,7 @@ <translation id="2344262275956902282">Да се използват клавишите „-“ и „=“ за прелистване на списъка с предложения</translation> <translation id="2347476388323331511">Синхронизирането не бе успешно</translation> <translation id="2347991999864119449">Нека избирам кога да се изпълнява съдържание от приставки</translation> +<translation id="2348165084656290171">За да споделите звук, изберете раздел или целия екран.</translation> <translation id="2350182423316644347">Приложението се подготвя за работа...</translation> <translation id="2350796302381711542">Да се разреши ли на <ph name="HANDLER_HOSTNAME" /> да отваря вместо <ph name="REPLACED_HANDLER_TITLE" /> всички връзки от типа „<ph name="PROTOCOL" />“?</translation> <translation id="2351266942280602854">Език и въвеждане</translation> @@ -992,6 +999,7 @@ <translation id="247772113373397749">Канадска многоезична клавиатура</translation> <translation id="2478176599153288112">Разрешения за медийни файлове за <ph name="EXTENSION" /></translation> <translation id="2478830106132467213">Отключване на този <ph name="DEVICE_TYPE" /> само когато телефонът ви е на една ръка разстояние от него.</translation> +<translation id="247949520305900375">Споделяне на звука</translation> <translation id="2479780645312551899">Изпълняване на всички приставки този път</translation> <translation id="2480626392695177423">Превключване на режим за цяла/половин ширина на препинателните знаци</translation> <translation id="2481332092278989943">Добавяне към лавицата</translation> @@ -1306,6 +1314,7 @@ <translation id="2889064240420137087">Отваряне на връзката със...</translation> <translation id="2889925978073739256">Блокирането на приставки извън тестова среда да продължи</translation> <translation id="2890624088306605051">Извличане само на синхронизираните настройки и данни</translation> +<translation id="2890678560483811744">Посочената страница е извън обхват</translation> <translation id="2893168226686371498">Браузър по подразбиране</translation> <translation id="289426338439836048">Друга мобилна мрежа...</translation> <translation id="2894745200702272315">Активира експериментална версия на функциите за откриване на активиращата дума „Ok Google“, които зависят от хардуера.</translation> @@ -1334,7 +1343,6 @@ <translation id="2925966894897775835">Електронни таблици</translation> <translation id="2927017729816812676">Хранилище за кеш</translation> <translation id="2927657246008729253">Промяна...</translation> -<translation id="2928415919076124714">Скриване на лентата с инструменти в режим на цял екран</translation> <translation id="2928526264833629376">Напред към Hangouts</translation> <translation id="2930644991850369934">Възникна проблем при изтеглянето на образа за възстановяване. Връзката с мрежата прекъсна.</translation> <translation id="293111069139560936">Разрешава намаляването на прозореца при кликване върху елемент в лавицата, ако това е единственият активен и свързан с елемента прозорец.</translation> @@ -1458,6 +1466,7 @@ <translation id="3117812041123364382">Активиране/деактивиране на плаващата виртуална клавиатура.</translation> <translation id="3118319026408854581">Помощ за <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Недостатъчно шифроване за дадена операция на: <ph name="DEVICE_NAME" />.</translation> +<translation id="3121260210578524273">Активирайте иконите в бутоните за действия за известията от мрежата.</translation> <translation id="3121793941267913344">Възстановяване на това устройство с <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Експерименти в инструментите за програмисти</translation> <translation id="3122464029669770682">Процесор</translation> @@ -1578,7 +1587,6 @@ <translation id="3289566588497100676">Лесно въвеждане на символи</translation> <translation id="3289856944988573801">За да проверите за актуализации, моля, използвайте Ethernet или Wi-Fi.</translation> <translation id="3293325348208285494">Бърз старт</translation> -<translation id="3293894718455402932"><ph name="EXTENSION" /> ще може да чете и записва изображения, видео- и звукови файлове в папките с отметка.</translation> <translation id="3294437725009624529">Гост</translation> <translation id="329650768420594634">Предупреждение за пакетиране на разширението</translation> <translation id="3296763833017966289">грузински</translation> @@ -1635,6 +1643,7 @@ <translation id="3338239663705455570">Словенска клавиатура</translation> <translation id="3340978935015468852">настройки</translation> <translation id="3341703758641437857">Да се разреши достъп до URL адресите на файловете</translation> +<translation id="3343813173145836998">Лесно влизане в това устройство</translation> <translation id="3344786168130157628">Име на точката за достъп:</translation> <translation id="3345135638360864351">Заявката ви за достъп до този сайт не можа да се изпрати до <ph name="NAME" />. Моля, опитайте отново.</translation> <translation id="3345886924813989455">Не е открит поддържан браузър</translation> @@ -2114,6 +2123,7 @@ <translation id="3996912167543967198">Нулира се...</translation> <translation id="3997015411467176489">Експериментални функции за платното</translation> <translation id="40027638859996362">Преместване на дума</translation> +<translation id="400554499662786523">За да споделите звук, изберете раздел.</translation> <translation id="4012550234655138030">Настройка или управление на принтерите в <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="4014432863917027322">Да се поправи ли <ph name="EXTENSION_NAME" />?</translation> <translation id="4018133169783460046">Показване на <ph name="PRODUCT_NAME" /> на този език</translation> @@ -2216,6 +2226,7 @@ <translation id="4180788401304023883">Да се изтрие ли сертификатът на сертифициращ орган „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="418179967336296930">Руска фонетична клавиатура (YaZHert)</translation> <translation id="4181841719683918333">Езици</translation> +<translation id="4187248015940562149">Активира технологията Web Bluetooth, която дава възможност на уебсайтовете да се свързват с устройства с Bluetooth в близост до вас и да ги контролират.</translation> <translation id="4188026131102273494">Ключова дума:</translation> <translation id="4189406272289638749">Разширението <b><ph name="EXTENSION_NAME" /></b> контролира тази настройка.</translation> <translation id="4193154014135846272">Документ в Google</translation> @@ -2272,6 +2283,7 @@ <translation id="4268025649754414643">Шифроване на ключ</translation> <translation id="4268574628540273656">URL адрес:</translation> <translation id="4270393598798225102">Версия <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Няма съответствия</translation> <translation id="4274187853770964845">Грешка при синхронизирането: Моля, спрете го и го стартирайте отново.</translation> <translation id="4275830172053184480">Рестартиране на устройството ви</translation> <translation id="4276796043975446927">Добре дошли в Chromebox за срещи</translation> @@ -2341,6 +2353,7 @@ <translation id="4378551569595875038">Установява се връзка...</translation> <translation id="438122767399415311">Принудително задаване на посока за потребителския интерфейс</translation> <translation id="4381849418013903196">Двоеточие</translation> +<translation id="4383192539467954373">Автоматично влизане във всички устройства</translation> <translation id="4384652540891215547">Активиране на разширението</translation> <translation id="438503109373656455">Светкавица</translation> <translation id="4387554346626014084">Активирайте синхронизирането на стартовия панел за приложения. Така ще активирате и папките, където са налице (без OSX).</translation> @@ -2358,6 +2371,7 @@ <translation id="4421932782753506458">Пухчо</translation> <translation id="4422347585044846479">Редактиране на отметката за тази страница</translation> <translation id="4422428420715047158">Домейн:</translation> +<translation id="4423482519432579560">&Проверка на правописа</translation> <translation id="442477792133831654">Комуникация с разположени наблизо устройства</translation> <translation id="4425149324548788773">Моят диск</translation> <translation id="4428582326923056538">Изключенията за камерата за Adobe Flash Player са различни.</translation> @@ -2372,6 +2386,7 @@ <translation id="444267095790823769">Изключения за защитено съдържание</translation> <translation id="4443536555189480885">&Помощ</translation> <translation id="4444304522807523469">Достъп до скенери на документи, свързани чрез USB или с локалната мрежа</translation> +<translation id="4445559854264555037">Не виждате устройството си? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Дублиран</translation> <translation id="4447465454292850432">Батерия:</translation> <translation id="4449935293120761385">Всичко за автоматичното попълване</translation> @@ -2629,6 +2644,7 @@ <translation id="485316830061041779">немски</translation> <translation id="4856478137399998590">Услугата ви за данни е активирана и готова за употреба</translation> <translation id="4858913220355269194">Фриц</translation> +<translation id="4860565041166337978">Разрешаване изтеглянията да се обработват от системния мениджър на изтеглянията, когато е приложимо.</translation> <translation id="48607902311828362">Самолетен режим</translation> <translation id="4861833787540810454">&Старт</translation> <translation id="4862050643946421924">Добавяне на устройство...</translation> @@ -2712,7 +2728,6 @@ <translation id="4977942889532008999">Потвърждаване на достъпа</translation> <translation id="4982718461356080574">Скриване на бутоните за затваряне на неактивните раздели, насложени един върху друг</translation> <translation id="498294082491145744">Промяна на настройките, които контролират достъпа на уебсайтовете до функции като „бисквитки“, JavaScript, приставки, геолокация, микрофон, камера и др.</translation> -<translation id="4984329823325527157">Приложен програмен интерфейс (API) за мултимедийни източници</translation> <translation id="4988526792673242964">Страници</translation> <translation id="4988792151665380515">Експортирането на публичен ключ не бе успешно.</translation> <translation id="49896407730300355">Завъртане о&братно на часовниковата стрелка</translation> @@ -2901,7 +2916,6 @@ <translation id="5268606875983318825">PPAPI (извън процеса)</translation> <translation id="526926484727016706">Всички разрешения за вложени рамки са отказани по подразбиране. За да се предостави някое от тях, може да се наложи името му да бъде посочено като стойност на нов атрибут за вложена рамка.</translation> <translation id="5269977353971873915">Отпечатването не бе успешно</translation> -<translation id="5270884342523754894"><ph name="EXTENSION" /> ще може да чете изображения, видео- и звукови файлове в папките с отметки.</translation> <translation id="5271247532544265821">Превключване на режимите за опростен/традиционен китайски</translation> <translation id="5271549068863921519">Запазване на паролата</translation> <translation id="5273628206174272911">Експериментално придвижване в историята при хоризонтално превъртане до края.</translation> @@ -2938,6 +2952,7 @@ <translation id="5316716239522500219">Дублиране на мониторите</translation> <translation id="5317780077021120954">Запазване</translation> <translation id="5319782540886810524">Латвийска клавиатура</translation> +<translation id="532247166573571973">Възможно е да няма достъп до сървъра. Опитайте отново по-късно.</translation> <translation id="5323213332664049067">латиноамерикански</translation> <translation id="532360961509278431">Не може да се отвори „$1“: $2</translation> <translation id="5324674707192845912">На път сте да отпишете това устройство <ph name="DEVICE_TYPE" /> от Google и да деактивирате възможността за отдалеченото му откриване и заключване и изтриване на данните от него. За целта ще е необходимо рестартиране. Искате ли да продължите?</translation> @@ -2990,11 +3005,11 @@ <translation id="5390284375844109566">Индексирана база от данни</translation> <translation id="5392544185395226057">Активиране на поддръжката за клиенти с директно изпълнение.</translation> <translation id="5393125431335030955">Тази приставка функционира само на работния плот.</translation> -<translation id="5393559999218790205">Деактивиране на времевите контроли за обработваните чрез модула за комбиниране анимации в потребителския интерфейс</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> в/ъв <ph name="PEPPER_PLUGIN_DOMAIN" /> иска да осъществи достъп до компютъра ви.</translation> <translation id="539755880180803351">Поставя пояснения като заместващ текст към уеб формуляри с предвиждания от тип автоматично попълване в полето.</translation> <translation id="5397578532367286026">Данните за употребата и историята на този потребител могат да се преглеждат от мениджъра (<ph name="MANAGER_EMAIL" />) на адрес chrome.com.</translation> <translation id="5397794290049113714">Вие</translation> +<translation id="5398572795982417028">Посочената страница е извън обхват. Ограничението е <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> от други сайтове</translation> <translation id="5399158067281117682">ПИН кодовете не съвпадат!</translation> <translation id="5400640815024374115">Чипът на модула за доверена платформа (TPM) е деактивиран или липсва.</translation> @@ -3014,7 +3029,7 @@ <translation id="5423849171846380976">Активиран</translation> <translation id="5425470845862293575">Активира използването на експерименталната система DirectWrite за изобразяване на шрифтове.</translation> <translation id="5425722269016440406">Трябва да сте онлайн, за да изключите Smart Lock, защото тази настройка се синхронизира с телефона и другите ви устройства. Моля, първо се свържете с мрежа.</translation> -<translation id="5426623592374109001">Използване на старата, възпрепятстваща работата подсистема за комбинираните анимации в потребителския интерфейс.</translation> +<translation id="5425863515030416387">Лесно влизане във всички устройства</translation> <translation id="5427459444770871191">Завъртане &по часовниковата стрелка</translation> <translation id="5428105026674456456">испански</translation> <translation id="542872847390508405">Сърфирате като гост</translation> @@ -3039,6 +3054,7 @@ <translation id="5451646087589576080">Преглед на информацията за &рамката</translation> <translation id="5453029940327926427">Затваряне на разделите</translation> <translation id="5453632173748266363">Кирилица</translation> +<translation id="5454166040603940656">с/ъс <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Невалидно</translation> <translation id="5457459357461771897">Четене и изтриване на снимки, музика и друга мултимедия от компютъра ви</translation> <translation id="5457599981699367932">Сърфиране като гост</translation> @@ -3209,7 +3225,6 @@ <translation id="5708171344853220004">Основно име от Microsoft</translation> <translation id="5709885306771508267">Промяна на мащаба чрез събиране на пръсти</translation> <translation id="5710406368443808765">Ами сега! Системата не успя да съхрани означението и идентификационния номер на устройството.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> не отговаря. Предаването не е възможно.</translation> <translation id="5711983031544731014">Не може да се отключи. Въведете паролата си.</translation> <translation id="5712966208980506909">Ако настройката е активирана, чрез URL адреса chrome://md-policy ще се зарежда основаната на material design страница с правила.</translation> <translation id="5715711091495208045">Посредник за приставки: <ph name="PLUGIN_NAME" /></translation> @@ -3476,7 +3491,6 @@ <translation id="6111974609785983504">Разрешено по подразбиране</translation> <translation id="6113134669445407638">Деактивиране в WebRTC на потискането на ехото без информация за закъснението. Използвайте този флаг, в случай че имате голямо доверие на съобщените системни забавяния или други хора чуват ехо от машината ви.</translation> <translation id="6116921718742659598">Промяна на настройките за език и въвеждане</translation> -<translation id="6117536376248197233">Деактивиране на времевите контроли за обработваните чрез модула за комбиниране анимации в програмите за визуализация.</translation> <translation id="6120205520491252677">Фиксиране на тази страница в стартовия екран...</translation> <translation id="6122081475643980456">Връзката ви с интернет се контролира</translation> <translation id="6122093587541546701">Имейл адрес (по избор):</translation> @@ -3508,6 +3522,7 @@ <translation id="6163522313638838258">Разгъване на всички...</translation> <translation id="6164005077879661055">Всички файлове и локални данни, свързани с контролирания потребител, ще бъдат изтрити за постоянно, щом той бъде премахнат. Посетените уебсайтове и настройките за него може все още да се виждат от мениджъра на адрес <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Научете повече</translation> +<translation id="6167008112175207002">Вашите отметки, история, пароли и други настройки ще се синхронизират с профила ви в Google, за да можете да ги използвате на всичките си устройства. В състояние сте да промените това от <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Симулирани хардуерни функции за „Ok Google“</translation> <translation id="6175314957787328458">GUID на домейн от Microsoft</translation> <translation id="6178664161104547336">Избор на сертификат</translation> @@ -3711,6 +3726,7 @@ <translation id="648927581764831596">Няма</translation> <translation id="6490936204492416398">Инсталиране на нови от уеб магазина</translation> <translation id="6492313032770352219">Размер на диска:</translation> +<translation id="6498249116389603658">&Всичките ви езици</translation> <translation id="6499143127267478107">Получава се разрешение от хоста в скрипта за прокси сървъра...</translation> <translation id="6503077044568424649">Ползвани</translation> <translation id="6503256918647795660">Швейцарска (френски) клавиатура</translation> @@ -3752,7 +3768,6 @@ <translation id="6555432686520421228">Премахване на всички профили на потребители и възстановяване на устройството ви с <ph name="IDS_SHORT_PRODUCT_NAME" />, така че да бъде като ново.</translation> <translation id="6556866813142980365">Възстановяване</translation> <translation id="6557565812667414268">Активирано само за дисплеи с висока разделителна способност</translation> -<translation id="655845594391856372">Разделът не отговаря. Предаването не е възможно.</translation> <translation id="6559580823502247193">(вече е на това устройство)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Образът за възстановяване се извлича...</translation> @@ -3853,6 +3868,7 @@ <translation id="6723354935081862304">Отпечатвайте към Google Документи и други местоназначения в облака. <ph name="BEGIN_LINK" />Влезте в профила си<ph name="END_LINK" />, за да печатате с Google Отпечатване в облак.</translation> <translation id="6723661294526996303">Импортиране на отметки и настройки...</translation> <translation id="6723839937902243910">Захранване</translation> +<translation id="6725240607822645708">Редакторът за метод на въвеждане да се изпълнява в собствената си нишка.</translation> <translation id="6725970970008349185">Брой на предложенията, които да се показват на страница</translation> <translation id="672609503628871915">Вижте новите неща</translation> <translation id="6727005317916125192">Предишният панел</translation> @@ -3983,12 +3999,11 @@ <translation id="6948736568813450284">За програмисти: За извиквания на приложния програмен интерфейс (API) на Google Payments използвайте услугата за тестова среда.</translation> <translation id="6949306908218145636">Запазване на отметки за отворените страници...</translation> <translation id="695164542422037736">Ако тази опция е активирана и основната част е оформена с background-attachment:fixed, фонът ще има свой собствен комбиниран слой.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> запомня паролите ви и автоматично влиза в профилите ви на сайтове от това устройство.</translation> <translation id="6955446738988643816">Инспектиране на изскачащ прозорец</translation> <translation id="695755122858488207">Немаркиран бутон за избор</translation> +<translation id="6960277925159781810">Автоматично влизане в това устройство</translation> <translation id="696036063053180184">Набор 3 (без отместване)</translation> <translation id="696203921837389374">Активиране на синхронизирането чрез мобилни данни</translation> -<translation id="6964308487066031935">Искате ли да добавите папки към <ph name="EXTENSION" />?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Порт</translation> <translation id="6965978654500191972">Устройство</translation> @@ -4086,7 +4101,6 @@ <translation id="7076293881109082629">Влизате</translation> <translation id="7077829361966535409">Зареждането на страницата за вход посредством текущите настройки на прокси сървъра не бе успешно. Моля, <ph name="GAIA_RELOAD_LINK_START" />опитайте отново да влезете в профила си<ph name="GAIA_RELOAD_LINK_END" /> или използвайте други <ph name="PROXY_SETTINGS_LINK_START" />настройки<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Пренебрегнати манипулатори на протоколи</translation> -<translation id="7079038783243627996"><ph name="EXTENSION" /> ще може да чете и изтрива изображения, видео- и звукови файлове в папките с отметка.</translation> <translation id="708060913198414444">К&опиране на адреса на аудиозаписа</translation> <translation id="708187310695946552">Потребителски интерфейс с балончета за възстановяване на сесия</translation> <translation id="7082055294850503883">По подразбиране да се пренебрегва състоянието на клавиша „CapsLock“ и въвеждането на малки букви</translation> @@ -4230,6 +4244,8 @@ <translation id="7313804056609272439">Метод за въвеждане на виетнамски (VNI)</translation> <translation id="7314244761674113881">SOCKS хост</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (текущ)</translation> +<translation id="7321545336522791733">Няма достъп до сървъра</translation> +<translation id="7324841169865301118">Позволява на потребителите да избират раздел при споделяне на работния плот.</translation> <translation id="7325437708553334317">Разширение High Contrast</translation> <translation id="7326565110843845436">Кликване с три пръста върху сензорния панел</translation> <translation id="73289266812733869">Неизбрано</translation> @@ -4456,7 +4472,6 @@ <translation id="7650511557061837441"><ph name="TRIGGERING_EXTENSION_NAME" /> иска да премахне <ph name="EXTENSION_NAME" />.</translation> <translation id="7650701856438921772">Това е екранният език на <ph name="PRODUCT_NAME" /></translation> <translation id="7654941827281939388">Профилът вече се използва на този компютър.</translation> -<translation id="7655165758820095116">Обектът MediaSource позволява на JavaScript да изпраща мултимедийни данни директно до видеоелемент.</translation> <translation id="7658239707568436148">Отказ</translation> <translation id="7659584679870740384">Не сте упълномощени да използвате това устройство. За разрешение за вход се свържете с администратора.</translation> <translation id="7664620655576155379">Неподдържано устройство с Bluetooth: <ph name="DEVICE_NAME" />.</translation> @@ -4587,6 +4602,7 @@ <translation id="7861215335140947162">&За изтегляне</translation> <translation id="7864539943188674973">Деактивиране на Bluetooth</translation> <translation id="7868891395842935202">Активира експерименталната рамка за контролиране на достъпа до експериментите с приложни програмни интерфейси (API).</translation> +<translation id="7870576007982733437">Използване на системния мениджър на изтеглянията, когато е приложимо.</translation> <translation id="7870790288828963061">Няма намерени павилионни приложения с по-нова версия. Няма нищо за актуализиране. Моля, извадете USB паметта.</translation> <translation id="787150342916295244">Сканиране на кредитни карти</translation> <translation id="7874357055309047713">Стартиране винаги на всички сайтове</translation> @@ -4629,7 +4645,6 @@ <translation id="7918257978052780342">Записване</translation> <translation id="7920092496846849526">Попитахте родителя си дали може да посетите тази страница.</translation> <translation id="7925285046818567682">Изчаква се отговор от <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> запомня паролите ви и автоматично влиза в профилите ви в приложения и на сайтове от различни устройства.</translation> <translation id="7925686952655276919">Без използване на мобилни данни за синхронизиране</translation> <translation id="7926906273904422255">Означаване на незащитените източници като ненадеждни или съмнителни.</translation> <translation id="7928710562641958568">Изваждане на устройството</translation> @@ -4691,7 +4706,6 @@ Пазете файла си с ключ на сигурно място. Той ви е необходим за създаване на нови версии на разширението.</translation> <translation id="799923393800005025">Може да преглежда</translation> <translation id="7999338963698132743">Нов диспечер на задачите</translation> -<translation id="8000004253404706714">Използване на старата, възпрепятстваща работата подсистема за комбинираните анимации в програмите за визуализация.</translation> <translation id="8004582292198964060">Браузър</translation> <translation id="8007030362289124303">Батерията е изтощена</translation> <translation id="8008356846765065031">Няма връзка с интернет. Моля, проверете връзката си.</translation> @@ -4820,6 +4834,7 @@ <translation id="8185331656081929126">Показване на известия, когато в мрежата бъдат открити нови принтери</translation> <translation id="8186609076106987817">Сървърът не можа да намери файла.</translation> <translation id="8186706823560132848">Софтуер</translation> +<translation id="8188120771410500975">&Проверка на правописа на текстовите полета</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> и още <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Осъществява се връзка с: <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Управление на вашите приложения, разширения и теми</translation> @@ -5213,6 +5228,7 @@ <translation id="8765985713192161328">Управление на манипулаторите...</translation> <translation id="8766796754185931010">Котоери</translation> <translation id="8767072502252310690">Потребители</translation> +<translation id="8768367823103160496">Заключване на курсора на мишката</translation> <translation id="8769662576926275897">Данни за картата</translation> <translation id="8770196827482281187">Метод за въвеждане на фарси (подредба ISIRI 2901)</translation> <translation id="8774934320277480003">Горно поле</translation> @@ -5232,6 +5248,7 @@ <translation id="8795668016723474529">Добавяне на кредитна карта</translation> <translation id="8795916974678578410">Нов прозорец</translation> <translation id="8798099450830957504">По подразбиране</translation> +<translation id="8799127529310003270">Ако флагът е активиран, извикванията на InputConnection се изпълняват в нишката на редактора за метод на въвеждане. Също така, вместо да се използва дубликат на редактора, при всяко извикване на InputConnection се комуникира директно с програмата за визуализация.</translation> <translation id="8799839487311913894">Активиране на актуализирането на паролата от съответния мениджър, след като изпратите формуляр за промяна на паролата.</translation> <translation id="8800004011501252845">Показани са местоназначенията за</translation> <translation id="8800420788467349919">Сила на звука: <ph name="PRECENTAGE" />%</translation> @@ -5257,6 +5274,7 @@ <translation id="8841142799574815336">Инертна вътрешна част на прозоречния изглед.</translation> <translation id="884264119367021077">Адрес за доставка</translation> <translation id="8844238624737526720">Използване на новата, оптимизирана реализация на диспечера на задачите в Chrome.</translation> +<translation id="8845001906332463065">Получете помощ</translation> <translation id="8846141544112579928">Търси се клавиатура...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Превключване между режими с клавиша „Shift“</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 80bb0a3..c3e36f1 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">এই পৃষ্ঠাটি বুকমার্ক করুন...</translation> <translation id="1047956942837015229"><ph name="COUNT" />টি আইটেম মুছে ফেলা হচ্ছে...</translation> <translation id="1048597748939794622">সব স্তরগুলির জন্য ফোর্স-সক্ষমিত</translation> +<translation id="1049795001945932310">&ভাষা সেটিংস</translation> <translation id="1049926623896334335">Word document</translation> <translation id="1054153489933238809">নতুন ট্যাবে আসল চিত্রটি খুলুন</translation> <translation id="1055806300943943258">Bluetooth ও USB ডিভাইসগুলির জন্য অনুসন্ধান করা হচ্ছে...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">লিপ্যন্তরকরণ (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">স্বয়ংক্রিয় নাম সার্ভার</translation> <translation id="1215411991991485844">নতুন পটভূমি অ্যাপ্লিকেশন জোড়া হয়েছে</translation> +<translation id="1216954813581739968">ডেস্কটপ শেয়ারের জন্য ট্যাব সক্রিয় করুন।</translation> <translation id="121827551500866099">সকল ডাউনলোড দেখান...</translation> <translation id="122082903575839559">শংসাপত্র স্বাক্ষর অ্যালগরিদম</translation> <translation id="1221024147024329929">RSA এনক্রিপশানের সাথে PKCS #1 MD2</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">স্বয়ংক্রিয় সাইন ইন ব্যর্থ হয়েছে</translation> <translation id="1293556467332435079">ফাইলসমূহ</translation> <translation id="1294298200424241932">বিশ্বস্ত সেটিংস সম্পাদনা করুন:</translation> +<translation id="1295794900245526845">সাইন ইন করতে <ph name="PASSWORD_MANAGER_BRAND" /> এ সংরক্ষণ করা আপনার অ্যাকাউন্ট চয়ন করুন</translation> <translation id="1297175357211070620">গন্তব্য</translation> <translation id="1297922636971898492">এই মুহূর্তে Google ড্রাইভ উপলব্ধ নেই৷ একবার Google ড্রাইভ উপলব্ধ হলেই আপলোড করার কাজটি স্বয়ংক্রিয়ভাবে পুনরায় চালু হবে৷</translation> <translation id="1300861494336759522">Windows ডেস্কটপ অনুসন্ধানের পুনঃনির্দেশ</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">এটি আপনার শুরুর পৃষ্ঠা, নতুন ট্যাব পৃষ্ঠা, সার্চ ইঞ্জিন, এবং পিন হওয়া ট্যাবগুলি পুনরায় সেট করবে। এছাড়াও এটি সব কটি এক্সটেনশান অক্ষম করবে এবং কুকিজের মতো অস্থায়ী ডেটা সাফ করবে। আপনার বুকমার্ক, ইতিহাস এবং সংরক্ষিত পাসওয়ার্ডগুলি সাফ করা হবে না।</translation> <translation id="1434886155212424586">হোমপেজ হল নতুন ট্যাব পৃষ্ঠা</translation> <translation id="1435550882135542937">এক্সটেনশান সরঞ্জামদন্ডের পুনঃডিজাইন</translation> +<translation id="1436402875660227532">দ্রষ্টব্য: এসব সেটিংস এই সিস্টেমে আর ব্যবহার করা হয় না, কিন্তু আপনি এখনও এগুলি দেখতে ও সম্পাদনা করতে পারবেন।</translation> <translation id="1436784010935106834">সরানো হয়েছে</translation> <translation id="1438632560381091872">ট্যাবগুলি সশব্দ করুন</translation> <translation id="1441841714100794440">ভিয়েতনামি কীবোর্ড (টেলেক্স)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">ভার্চুয়াল কীবোর্ড সহায়তা সক্ষম করুন৷</translation> <translation id="1474079335130556426">পুশ API এর জন্য পটভূমি মোড সক্ষম করুন। সর্বশেষ উইন্ডো বন্ধ হওয়ার পর এটি Chrome কে চালু থাকতে মঞ্জুরি দেয়, এবং পুশ API এর প্রয়োজন মাফিক প্রারম্ভে OS আরম্ভ করতে মঞ্জুরি দেয়।</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" আপলোড করা হয়নি। আপনার Google ড্রাইভে পর্যাপ্ত ফাঁকা স্থান নেই।</translation> +<translation id="1476607407192946488">&ভাষা সেটিংস</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />বহূউপযোগী ক্ষেত্র<ph name="END_LINK" />. থেকে অনুসন্ধানের সময় কোন অনুসন্ধান ইঞ্জিন ব্যবহার করা হবে তা সেট করুন৷</translation> <translation id="1477301030751268706">পরিচয় API টোকেন ক্যাশে</translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">এই পৃষ্ঠাটি একটি নেটিভ ক্লায়েন্ট অ্যাপ্লিকেশন ব্যবহার করে যা আপনার কম্পিউটারে কাজ করে না৷</translation> <translation id="1965328510789761112">ব্যক্তিগত স্মৃতি</translation> <translation id="1965624977906726414">কোনো বিশেষ অনুমতি নেই৷</translation> +<translation id="1968720524450620475">ওয়েব বিজ্ঞপ্তিগুলির জন্য ক্রিয়া আইকন সক্ষম করে।</translation> <translation id="1970746430676306437">পৃষ্ঠা &তথ্য দেখুন</translation> <translation id="197288927597451399">রাখুন</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> ডাউনলোড ব্যর্থ হয়েছে৷</translation> @@ -907,6 +913,7 @@ <translation id="2344262275956902282">একটি প্রার্থী তালিকা পৃষ্ঠাবদ্ধ করার জন্য - এবং = কী ব্যবহার করুন</translation> <translation id="2347476388323331511">সিঙ্ক করা যায়নি</translation> <translation id="2347991999864119449">প্লাগ ইন করা সামগ্রী কখন চালু করতে হবে তা আমাকে চয়ন করতে দিন</translation> +<translation id="2348165084656290171">অডিও ভাগ করার জন্য, একটি ট্যাব বা সম্পূর্ণ স্ক্রীন নির্বাচন করুন।</translation> <translation id="2350182423316644347">অ্যাপ্লিকেশান শুরু করা হচ্ছে...</translation> <translation id="2350796302381711542"><ph name="REPLACED_HANDLER_TITLE" /> এর পরিবর্তে সমস্ত <ph name="PROTOCOL" /> লিঙ্কগুলি খুলতে <ph name="HANDLER_HOSTNAME" />কে অনুমোদিত করবেন?</translation> <translation id="2351266942280602854">ভাষা ও কিবোর্ড</translation> @@ -994,6 +1001,7 @@ <translation id="247772113373397749">কানাডিয়ান বহুভাষিক কীবোর্ড</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" এর জন্য মিডিয়া-ফাইলের অনুমতি</translation> <translation id="2478830106132467213">আপনার ফোন এক হাত দূরত্বের মধ্যে থাকলে শুধুমাত্র তখনই এই <ph name="DEVICE_TYPE" /> আনলক হয়৷</translation> +<translation id="247949520305900375">অডিও ভাগ করুন</translation> <translation id="2479780645312551899">এই মুহূর্তে সকল প্ল্যাগ ইন চালু করুন</translation> <translation id="2480626392695177423">পূর্ণ/অর্ধেক প্রস্থ যতিচিহ্ন মোড টগল করুন</translation> <translation id="2481332092278989943">শেল্ফে যোগ করুন</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">এর সাথে লিঙ্ক খুলুন...</translation> <translation id="2889925978073739256">আনস্যান্ডবক্সড প্লাগ ইনগুলি অবরুদ্ধ করা অবিরত রাখুন</translation> <translation id="2890624088306605051">শুধুমাত্র সিঙ্ক করা সেটিংস এবং ডেটা পুনরূদ্ধার করুন</translation> +<translation id="2890678560483811744">পৃষ্ঠা সীমার বাইরের উল্লেখ</translation> <translation id="2893168226686371498">ডিফল্ট ব্রাউজার</translation> <translation id="289426338439836048">অন্য মোবাইল নেটওয়ার্ক...</translation> <translation id="2894745200702272315">'Ok Google' হটওয়ার্ড সনাক্তকরণ বৈশিষ্ট্যের একটি পরীক্ষামূলক সংস্করণ সক্ষম করে, যার একটি হার্ডওয়্যার নির্ভরতা রয়েছ৷</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">পত্রকগুলি</translation> <translation id="2927017729816812676">ক্যাশে সঞ্চয় স্থান</translation> <translation id="2927657246008729253">পরিবর্তন...</translation> -<translation id="2928415919076124714">পূর্ণ স্ক্রীনে সরঞ্জাম দণ্ড গোপন করুন</translation> <translation id="2928526264833629376">Hangouts এ অবিরত থাকুন</translation> <translation id="2930644991850369934">পুনরুদ্ধার চিত্র ডাউনলোড করার সময় একটি সমস্যা হয়েছে৷ নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হয়েছে৷</translation> <translation id="293111069139560936">যদি এমন কোনো শেল্ফ আইটেমে ক্লিক করা হয়ে থাকে যার সাথে একটি একক, ইতিমধ্যেই সক্রিয়, উইন্ডো সংশ্লিষ্ট রয়েছে, তবে শেল্ফটিকে একটি উইন্ডো ছোট করার মঞ্জুরি দেয়।</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">ভাসমান ভার্চুয়াল কীবোর্ড সক্ষম/অক্ষম করুন।</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> সহায়তা</translation> <translation id="3120430004221004537">এখানে একটি নির্দিষ্ট ক্রিয়াকলাপের জন্য অপর্যাপ্ত এনক্রিপশান: "<ph name="DEVICE_NAME" />"।</translation> +<translation id="3121260210578524273">ওয়েব বিজ্ঞপ্তির জন্য ক্রিয়া বোতামগুলিতে আইকন সক্ষম করে।</translation> <translation id="3121793941267913344">এই <ph name="IDS_SHORT_PRODUCT_NAME" /> ডিভাইসটি পুনরায় সেট করুন</translation> <translation id="3122162841865761901">বিকাশকারী সরঞ্জামগুলির পরীক্ষা</translation> <translation id="3122464029669770682">CPU</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">সহজ ইনপুট প্রতীক</translation> <translation id="3289856944988573801">আপডেটগুলি পরীক্ষা করার জন্য, দয়া করে Ethernet বা Wi-Fi ব্যবহার করুন৷</translation> <translation id="3293325348208285494">দ্রুত শুরু</translation> -<translation id="3293894718455402932">টিক চিহ্ন দেওয়া ফোল্ডারগুলিতে "<ph name="EXTENSION" />" চিত্র, ভিডিও এবং সাউন্ড ফাইলগুলি পড়তে এবং লিখতে পারবে৷</translation> <translation id="3294437725009624529">অতিথি</translation> <translation id="329650768420594634">Pack এক্সটেনশান সতর্কীকরণ</translation> <translation id="3296763833017966289">জর্জিয়ান</translation> @@ -1634,6 +1642,7 @@ <translation id="3338239663705455570">স্লোভেনিয় কীবোর্ড</translation> <translation id="3340978935015468852">সেটিংস</translation> <translation id="3341703758641437857">ফাইল URLগুলিতে অ্যাক্সেস মঞ্জুর করুন</translation> +<translation id="3343813173145836998">এই ডিভাইসে সহজে সাইন ইন করুন</translation> <translation id="3344786168130157628">অ্যাক্সেস পয়েন্ট নাম:</translation> <translation id="3345135638360864351">এই সাইটটি অ্যাক্সেস করার জন্য আপনার অনুরোধ <ph name="NAME" /> এ পাঠানো যায়নি৷ অনুগ্রহ করে আবার চেষ্টা করুন৷</translation> <translation id="3345886924813989455">কোন সমর্থিত ব্রাউজার খুঁজে পাওয়া যায় নি</translation> @@ -2112,6 +2121,7 @@ <translation id="3996912167543967198">রিসেট করা হচ্ছে...</translation> <translation id="3997015411467176489">পরীক্ষামূলক ক্যানভাস বৈশিষ্ট্যগুলি</translation> <translation id="40027638859996362">শব্দ সরানো</translation> +<translation id="400554499662786523">অডিও ভাগ করার জন্য, একটি ট্যাব নির্বাচন করুন।</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" /> এ মুদ্রকগুলি স্থাপন অথবা পরিচালনা করুন৷</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />" মেরামত করবেন?</translation> <translation id="4018133169783460046">এই ভাষাতে <ph name="PRODUCT_NAME" /> প্রদর্শন করান</translation> @@ -2214,6 +2224,7 @@ <translation id="4180788401304023883">CA শংসাপত্র "<ph name="CERTIFICATE_NAME" />"মুছবেন?</translation> <translation id="418179967336296930">রাশিয়ান ফোনেটিক (YaZHert) কীবোর্ড</translation> <translation id="4181841719683918333">ভাষাসমূহ</translation> +<translation id="4187248015940562149">ওয়েবসাইটগুলিকে আপনার চারপাশের Bluetooth ডিভাইসগুলির সাথে সংযোগ এবং সেগুলি নিয়ন্ত্রণ করতে ওয়েব Bluetooth সক্ষম করে।</translation> <translation id="4188026131102273494">মূলশব্দ:</translation> <translation id="4189406272289638749">একটি এক্সটেনশান, <b> <ph name="EXTENSION_NAME" /> </ b>, এই সেটিংটিকে নিয়ন্ত্রণ করছে৷</translation> <translation id="4193154014135846272">Google দস্তাবেজ</translation> @@ -2270,6 +2281,7 @@ <translation id="4268025649754414643">কী চিহ্নকরণ</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">সংস্করণ <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">কোনো মিল নেই</translation> <translation id="4274187853770964845">সিঙ্ক ত্রুটি: দয়া করে বন্ধ করে সিঙ্কটি পুনঃসূচনা করুন</translation> <translation id="4275830172053184480">আপনার যন্ত্র বন্ধ করে চালু করুন</translation> <translation id="4276796043975446927">মিটিংয়ের জন্য Chromebox এ স্বাগতম</translation> @@ -2338,6 +2350,7 @@ <translation id="4378551569595875038">সংযুক্ত হচ্ছে...</translation> <translation id="438122767399415311">UI গতিপথ বাধ্য করা</translation> <translation id="4381849418013903196">কোলন</translation> +<translation id="4383192539467954373">স্বয়ংক্রিয়ভাবে ডিভাইসগুলি জুড়ে সাইন ইন করুন</translation> <translation id="4384652540891215547">এক্সটেনশন সক্রিয় করুন</translation> <translation id="438503109373656455">সারাটোগা</translation> <translation id="4387554346626014084">অ্যাপ্লিকেশান লঞ্চার সিঙ্ক সক্ষম করুন৷ এছাড়াও এটি যেখানে উপলব্ধ হয় সেখানে ফোল্ডারগুলি সক্ষম করে (অ OSX)৷</translation> @@ -2355,6 +2368,7 @@ <translation id="4421932782753506458">ফুঁয়োফুঁয়ো</translation> <translation id="4422347585044846479">এই পৃষ্ঠার বুকমার্ক সম্পাদনা করুন</translation> <translation id="4422428420715047158">DOMAIN:</translation> +<translation id="4423482519432579560">&বানান পরীক্ষা</translation> <translation id="442477792133831654">কাছাকাছি থাকা ডিভাইসগুলির সাথে যোগাযোগ করুন</translation> <translation id="4425149324548788773">আমার ড্রাইভ</translation> <translation id="4428582326923056538">Adobe Flash Player ক্যামেরা ব্যতিক্রমগুলি ভিন্ন।</translation> @@ -2369,6 +2383,7 @@ <translation id="444267095790823769">সুরক্ষিত সামগ্রীর ব্যতিক্রমগুলি</translation> <translation id="4443536555189480885">&Help</translation> <translation id="4444304522807523469">USB বা স্থানীয় নেটওয়ার্কের মাধ্যমে সংযুক্ত দস্তাবেজ স্ক্যানার অ্যাক্সেস করে</translation> +<translation id="4445559854264555037">আপনার ডিভাইসটি দেখতে পাচ্ছেন না? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">মিরর করা হয়েছে</translation> <translation id="4447465454292850432">ব্যাটারি:</translation> <translation id="4449935293120761385">স্বতঃপূরণ সম্পর্কে</translation> @@ -2625,6 +2640,7 @@ <translation id="485316830061041779">জার্মান</translation> <translation id="4856478137399998590">আপনার মোবাইল ডেটা পরিষেবা সক্রিয় করা হয়েছে এবং তা ব্যবহারের জন্য তৈরি আছে</translation> <translation id="4858913220355269194">ফ্রিটজ</translation> +<translation id="4860565041166337978">প্রযোজ্য হলে, ডাউনলোড পরিচালককে ডাউনলোডস দেখাশোনা করতে মঞ্জুরি দেয়</translation> <translation id="48607902311828362">বিমান মোড</translation> <translation id="4861833787540810454">&খেলুন</translation> <translation id="4862050643946421924">ডিভাইস যোগ করা হচ্ছে...</translation> @@ -2708,7 +2724,6 @@ <translation id="4977942889532008999">অ্যাক্সেস নিশ্চিত করুন</translation> <translation id="4982718461356080574">যখন স্তুপীকৃত হয়ে যায় তখন নিষ্ক্রিয় ট্যাবগুলির বন্ধ বোতামগুলি গোপন করে</translation> <translation id="498294082491145744">কুকিজ, JavaScript, প্লাগ ইন, ভূ-অবস্থান, মাইক্রোফোন, ক্যামেরা ইত্যাদির মতো বৈশিষ্ট্যগুলিতে ওয়েবসাইটগুলির অ্যাক্সেস নিয়ন্ত্রণ করে, আপনার সেই সেটিংস পরিবর্তন করুন।</translation> -<translation id="4984329823325527157">মিডিয়া সূত্র API</translation> <translation id="4988526792673242964">পৃষ্ঠাসমূহ</translation> <translation id="4988792151665380515">ব্যক্তিগত কী-টি রপ্তানি করতে ব্যর্থ৷</translation> <translation id="49896407730300355">ঘড়ির কাঁটার &বিপরীত দিকে ঘোরান</translation> @@ -2896,7 +2911,6 @@ <translation id="5268606875983318825">PPAPI (প্রক্রিয়ার বাইরে)</translation> <translation id="526926484727016706">সব আইফ্রেমের জন্য ডিফল্ট ভাবে সব অনুমতি অস্বীকার করায়। একটি আইফ্রেমে নির্দিষ্ট অনুমতিগুলি মঞ্জুরের জন্য এই অনুমতিগুলির নামগুলিকে নতুন আইফ্রেম অ্যাট্রিবিউটের মান হিসাবে তালিকাভুক্ত করতে হতে পারে।</translation> <translation id="5269977353971873915">প্রিন্ট ব্যর্থ হয়েছে</translation> -<translation id="5270884342523754894">টিক চিহ্ন দেওয়া ফোল্ডারগুলিতে "<ph name="EXTENSION" />" চিত্র, ভিডিও এবং সাউন্ড ফাইলগুলি পড়তে পারবে৷</translation> <translation id="5271247532544265821">সরলীকৃত/ঐতিহ্যশীল চীনা মোড টগল করুন</translation> <translation id="5271549068863921519">পাসওয়ার্ড সংরক্ষণ করুন</translation> <translation id="5273628206174272911">অনুভূমিক ওভারস্ক্রোলের প্রতিক্রিয়াতে পরীক্ষামূলক ইতিহাস নেভিগেশন৷</translation> @@ -2933,6 +2947,7 @@ <translation id="5316716239522500219">আয়না মনিটর</translation> <translation id="5317780077021120954">সংরক্ষণ করুন</translation> <translation id="5319782540886810524">লাটভিও কীবোর্ড</translation> +<translation id="532247166573571973">সার্ভারে সংযোগ নাও হতে পারে। পরে আবার চেষ্টা করুন।</translation> <translation id="5323213332664049067">লাতিন আমেরিকান</translation> <translation id="532360961509278431">"$1": $2 খুলতে অক্ষম</translation> <translation id="5324674707192845912">আপনার ডিভাইসটিকে দূর থেকে সনাক্ত করা, মোছা ও লক করতে অক্ষম করার জন্য অাপনি আপনার <ph name="DEVICE_TYPE" /> কে Google থেকে তালিকামুক্ত করতে যাচ্ছেন। এ জন্য পুনরায় চালু করা প্রয়োজন। আপনি কি চালিয়ে যেতে চান?</translation> @@ -2985,11 +3000,11 @@ <translation id="5390284375844109566">সূচিবদ্ধ ডেটাবেস</translation> <translation id="5392544185395226057">নেটিভ ক্লায়েন্টের জন্য সমর্থন সক্ষম করুন৷</translation> <translation id="5393125431335030955">এই প্লাগ ইনটি শুধুমাত্র ডেস্কটপে কাজ করে৷</translation> -<translation id="5393559999218790205">UI কম্পোজিটর অ্যানিমেশান টাইমলাইনগুলি অক্ষম করুন</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> এ <ph name="PEPPER_PLUGIN_NAME" /> আপনার কম্পিউটার্ অ্যাক্সেস করতে চায়৷</translation> <translation id="539755880180803351">প্লেসহোডার পাঠ রূপে স্বতঃপূর্ণ ক্ষেত্র প্রকার পূর্বানুমান সহ ওয়েব ফর্ম টীকা যোগ করে৷</translation> <translation id="5397578532367286026">chrome.com এ পরিচালক (<ph name="MANAGER_EMAIL" />) এই ব্যবহারকারীর ব্যবহার এবং ইতিহাস পর্যালোচনা করতে পারেন৷</translation> <translation id="5397794290049113714">আপনি</translation> +<translation id="5398572795982417028">পৃষ্ঠা সীমার বাইরের উল্লেখ, সীমা হলো <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339">অন্যান্য সাইট থেকে <ph name="COUNT" />টি</translation> <translation id="5399158067281117682">PINগুলি মেলে না!</translation> <translation id="5400640815024374115">ট্রাস্টেড প্ল্যাটফর্ম মডিউল (TPM) চিপটি অক্ষম বা অনুপস্থিত আছে৷</translation> @@ -3009,7 +3024,7 @@ <translation id="5423849171846380976">সক্রিয় হয়েছে</translation> <translation id="5425470845862293575">পরীক্ষামূলক DirectWrite ফন্ট রেন্ডারিং সিস্টেম ব্যবহার করতে সক্ষম করে।</translation> <translation id="5425722269016440406">এই সেটিং আপনার ফোন এবং অন্যান্য ডিভাইসের সাথে সিঙ্ক হওয়ার কারণে Smart Lock বন্ধ করতে আপনাকে অনলাইনে থাকতে হবে। দয়া করে প্রথমে একটি নেটওয়ার্কের সাথে সংযুক্ত হোন।</translation> -<translation id="5426623592374109001">UI এর মধ্যে কম্পোজিট অ্যানিমেশনগুলির জন্য পুরোনো অনাহূতপ্রবেশমূলক অ্যানিমেশন সাবসিস্টেম ব্যবহার করুন।</translation> +<translation id="5425863515030416387">ডিভাইস জুড়ে সহজে সাইন ইন করুন</translation> <translation id="5427459444770871191">&ঘড়ির কাঁটার দিকে ঘোরান</translation> <translation id="5428105026674456456">স্প্যানিশ</translation> <translation id="542872847390508405">আপনি অতিথি হিসাবে ব্রাউজ করছেন</translation> @@ -3034,6 +3049,7 @@ <translation id="5451646087589576080">ফ্রেম &তথ্য দেখুন</translation> <translation id="5453029940327926427">ট্যাবগুলি বন্ধ করুন</translation> <translation id="5453632173748266363">সিরিলিক</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> সহ</translation> <translation id="5457113250005438886">অবৈধ</translation> <translation id="5457459357461771897">আপনার কম্পিউটার থেকে ফটো, সঙ্গীত ও অন্যান্য মিডিয়া পড়ুন এবং মুছুন</translation> <translation id="5457599981699367932">অতিথি হিসাবে ব্রাউজ করুন</translation> @@ -3204,7 +3220,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">পিঞ্চ স্কেল</translation> <translation id="5710406368443808765">ওহো! সিস্টেমটি এই ডিভাইসের টোকেন ও ID সঞ্চয় করতে ব্যর্থ হয়েছে।</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> সাড়া দিচ্ছে না। কাস্ট করতে অক্ষম।</translation> <translation id="5711983031544731014">আনলক করতে অক্ষম৷ আপনার পাসওয়ার্ড লিখুন৷</translation> <translation id="5712966208980506909">সক্ষম করা হলে, chrome://md-policy URL মেটারিয়াল ডিজাইন নীতি পৃষ্ঠা লোড করবে।</translation> <translation id="5715711091495208045">প্লাগ ইন ব্রোকার: <ph name="PLUGIN_NAME" /></translation> @@ -3471,7 +3486,6 @@ <translation id="6111974609785983504">ডিফল্টভাবে মঞ্জুরিপ্রাপ্ত</translation> <translation id="6113134669445407638">WebRTC -তে বিলম্ব অ্যাগনোস্টিক AEC অক্ষম করুন। যদি প্রতিবেদন করা সিস্টেম বিলম্বগুলি খুব বিশ্বস্ত হয়, বা অন্যান্যরা আপনার মেশিন থেকে প্রতিধ্বনি শুনতে পায় তবে তাহলে ব্যবহার করুন৷</translation> <translation id="6116921718742659598">ভাষা এবং ইনপুট সেটিংস পরিবর্তন করুন</translation> -<translation id="6117536376248197233">রেন্ডারারগুলির মধ্যে কম্পোজিটর অ্যানিমেশান টাইমলাইন অক্ষম করুন।</translation> <translation id="6120205520491252677">সূচনা স্ক্রীনে এই পৃষ্ঠাটিকে পিন করুন...</translation> <translation id="6122081475643980456">আপনার ইন্টারনেট সংযোগ নিয়ন্ত্রিত হচ্ছে</translation> <translation id="6122093587541546701">ইমেল (ঐচ্ছিক):</translation> @@ -3504,6 +3518,7 @@ <translation id="6164005077879661055">একবার এই তত্ত্বাবধানে থাকা ব্যবহারকারী সরানো হলে এর সঙ্গে সংশ্লিষ্ট সমস্ত ফাইল এবং স্থানীয় ডেটা স্থায়ীভাবে মুছে ফেলা হবে৷ এই তত্ত্বাবধানে থাকা ব্যবহারকারীর জন্য পরিদর্শিত এবং সেটিংস <ph name="MANAGEMENT_URL" /> এ পরিচালকের কাছে এখনো দৃশ্যমান হতে পারে৷</translation> <translation id="6165508094623778733">আরো জানুন</translation> +<translation id="6167008112175207002">আপনার বুকমার্ক, ইতিহাস এবং অন্যান্য সেটিংস আপনার Google অ্যাকাউন্টে সিঙ্ক হবে যাতে আপনি আপনার সমস্ত ডিভাইসে সেগুলি ব্যবহার করতে পারেন। আপনি <ph name="BEGIN_LINK" /> থেকে এটি পরিবর্তন করতে পারেন</translation> <translation id="6171550060231646388">সিমুলেটেড হার্ডওয়্যারের 'Ok Google' বৈশিষ্ট্যগুলি</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">একটি শংসাপত্র নির্বাচন করুন</translation> @@ -3706,6 +3721,7 @@ <translation id="648927581764831596">কিছুই উপলব্ধ নয়</translation> <translation id="6490936204492416398">ওয়েবস্টোর থেকে নতুন ইনস্টল করুন</translation> <translation id="6492313032770352219">ডিস্কের মাপ:</translation> +<translation id="6498249116389603658">&আপনার সব ভাষা</translation> <translation id="6499143127267478107">প্রক্সি স্ক্রিপ্টের মধ্যে হোস্ট পুনসমাধান করুন..</translation> <translation id="6503077044568424649">সর্বাধিক দেখা</translation> <translation id="6503256918647795660">সুইশ ফরাসী কীবোর্ড</translation> @@ -3747,7 +3763,6 @@ <translation id="6555432686520421228">নতুনের মত করতে সমস্ত ব্যবহারকারী অ্যাকাউন্টগুলি সরান এবং আপনার <ph name="IDS_SHORT_PRODUCT_NAME" /> ডিভাইস পুনরায় সেট করুন৷</translation> <translation id="6556866813142980365">পুনরায় করুন</translation> <translation id="6557565812667414268">শুধুমাত্র উচ্চ DPI প্রদর্শনগুলির জন্য সক্ষমিত</translation> -<translation id="655845594391856372">ট্যাব সাড়া দিচ্ছে না। কাস্ট করতে অক্ষম।</translation> <translation id="6559580823502247193">(ইতিমধ্যে এই ডিভাইসে)</translation> <translation id="6561726789132298588">লিখুন</translation> <translation id="6562437808764959486">পুনরুদ্ধার চিত্র নিষ্কাশন হচ্ছে...</translation> @@ -3848,6 +3863,7 @@ <translation id="6723354935081862304">Google দস্তাবেজ এবং অন্য ক্লাউড গন্তব্যস্থল প্রিন্ট করুন৷ Google ক্লাউড প্রিন্টে প্রিন্ট করতে <ph name="BEGIN_LINK" />সাইন ইন<ph name="END_LINK" /> করুন৷</translation> <translation id="6723661294526996303">বুকমার্কস এবং সেটিংস আমদানি করুন...</translation> <translation id="6723839937902243910">পাওয়ার</translation> +<translation id="6725240607822645708">নিজ থ্রেডে IME চালু করুন।</translation> <translation id="6725970970008349185">পৃষ্ঠা প্রতি প্রদর্শিত প্রার্থীর সংখ্যা</translation> <translation id="672609503628871915">নতুন কী আছে দেখুন</translation> <translation id="6727005317916125192">পূর্ববর্তী ফলক</translation> @@ -3980,12 +3996,11 @@ <translation id="6948736568813450284">বিকাশকারীদের জন্য: Google Payments API কলগুলির জন্য স্যান্ডবক্স পরিষেবা ব্যবহার করুন।</translation> <translation id="6949306908218145636">খোলা পৃষ্ঠাগুলিকে বুকমার্ক করুন...</translation> <translation id="695164542422037736">যদি এই বিকল্পটি সক্ষম থাকে, এবং বিষয়টি যদি শৈলী করে পশ্চাদপট-সংযুক্তি:সুনির্দিষ্ট করা থাকে, তাহলে পশ্চাদপটটির কম্পোজিট করা নিজস্ব স্তর থাকবে৷</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> আপনার পাসওয়ার্ডগুলি মনে রাখে এবং আপনাকে স্বয়ংক্রিয়ভাবে এই ডিভাইসে সাইটগুলিতে সাইন ইন করায়।</translation> <translation id="6955446738988643816">পপআপ সংবীক্ষণ</translation> <translation id="695755122858488207">অনির্বাচিত রেডিও বোতাম</translation> +<translation id="6960277925159781810">স্বয়ংক্রিয়ভাবে এই ডিভাইসটিতে সাইন ইন করুন</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">মোবাইল ডেটার মাধ্যমে সিঙ্ক করা সক্ষম করুন</translation> -<translation id="6964308487066031935">"<ph name="EXTENSION" />" এ ফোল্ডারগুলি যোগ করবেন?</translation> <translation id="6965382102122355670">ওকে</translation> <translation id="6965648386495488594">পোর্ট</translation> <translation id="6965978654500191972">ডিভাইস</translation> @@ -4083,7 +4098,6 @@ <translation id="7076293881109082629">সাইন ইন হচ্ছে</translation> <translation id="7077829361966535409">সাইন-ইন পৃষ্ঠাটি বর্তমান প্রক্সি সেটিংস ব্যবহার করে লোড হতে ব্যর্থ হয়েছে৷ দয়া করে <ph name="GAIA_RELOAD_LINK_START" />আবার সাইন ইন করার চেষ্টা করুন<ph name="GAIA_RELOAD_LINK_END" />, অথবা পৃথক <ph name="PROXY_SETTINGS_LINK_START" />প্রক্সি সেটিংস<ph name="PROXY_SETTINGS_LINK_END" /> ব্যবহার করুন৷</translation> <translation id="7077872827894353012">প্রোটোকল নিয়ন্ত্রণকারীকে এড়ানো হয়েছে</translation> -<translation id="7079038783243627996">টিক চিহ্ন দেওয়া ফোল্ডারগুলিতে "<ph name="EXTENSION" />" চিত্র, ভিডিও এবং সাউন্ড ফাইলগুলি পড়তে এবং মুছে ফেলতে পারবে৷</translation> <translation id="708060913198414444">অ&ডিও ঠিকানা অনুলিপি করুন</translation> <translation id="708187310695946552">বুদবুদ UI এ সেশন পুনরুদ্ধার</translation> <translation id="7082055294850503883">ডিফল্ট অনুসারে CapsLock স্থিতিটি এবং ইনপুট লোয়ার কেসটি উপেক্ষা করুন</translation> @@ -4227,6 +4241,8 @@ <translation id="7313804056609272439">ভিয়েতনামী ইনপুট পদ্ধতি (ভিএনআই)</translation> <translation id="7314244761674113881">সক্স হোস্ট</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (বর্তমান)</translation> +<translation id="7321545336522791733">সার্ভারে সংযোগ করা যাচ্ছে না</translation> +<translation id="7324841169865301118">ডেস্কটপ শেয়ারের জন্য একটি ট্যাব বেছে নিতে ব্যবহারকারিকে সক্ষম করে।</translation> <translation id="7325437708553334317">উচ্চ বৈপরীত্য এক্সটেনশন</translation> <translation id="7326565110843845436">টাচপ্যাড তিন-আঙুল-ক্লিক</translation> <translation id="73289266812733869">অনির্বাচিত</translation> @@ -4452,7 +4468,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" "<ph name="EXTENSION_NAME" />" সরাতে চাইছে।</translation> <translation id="7650701856438921772">এই ভাষাতে <ph name="PRODUCT_NAME" /> প্রদর্শিত হয়</translation> <translation id="7654941827281939388">এই অ্যাকাউন্টটি ইতিমধ্যেই এই কম্পিউটারে ব্যবহৃত হচ্ছে৷</translation> -<translation id="7655165758820095116">MediaSource অবজেক্ট JavaScript কে কোনো ভিডিও উপাদানে সরাসরি মিডিয়া ডেটা প্রেরণ করতে অনুমতি দেয়৷</translation> <translation id="7658239707568436148">বাতিল</translation> <translation id="7659584679870740384">আপনার কাছে এই ডিভাইস ব্যবহারের অনুমতি নেই৷ দয়া করে সাইন-ইন করার অনুমতির জন্য প্রশাসকের সঙ্গে যোগাযোগ করুন৷</translation> <translation id="7664620655576155379">অসমর্থিত Bluetooth ডিভাইস: "<ph name="DEVICE_NAME" />"৷</translation> @@ -4583,6 +4598,7 @@ <translation id="7861215335140947162">&ডাউনলোডগুলি</translation> <translation id="7864539943188674973">ব্লুটুথ অক্ষম করুন</translation> <translation id="7868891395842935202">API পরীক্ষাগুলিতে অ্যাক্সেস নিয়ন্ত্রণের জন্য পরীক্ষামূলক ফ্রেমওয়ার্ক সক্ষম করে।</translation> +<translation id="7870576007982733437">প্রযোজ্য হলে, সিস্টেম ডাউনলোড পরিচালক ব্যবহার করুন।</translation> <translation id="7870790288828963061">এর থেকে আরো নতুন সংস্করণের ওনো কিয়স্ক অ্যাপ্লিকেশান পাওয়া যায়নি৷ দয়া করে USB স্টিক সরান৷</translation> <translation id="787150342916295244">ক্রেডিট কার্ড স্ক্যান করা</translation> <translation id="7874357055309047713">সর্বদা সমস্ত সাইটে চালু রাখুন</translation> @@ -4625,7 +4641,6 @@ <translation id="7918257978052780342">নথিভুক্ত করুন</translation> <translation id="7920092496846849526">এই পৃষ্ঠাটিতে যাওয়া ঠিক হবে কিনা সেই বিষয়ে আপনি আপনার পিতামাতার অনুমতি নিন৷</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" />-এর জন্য অপেক্ষা করা হচ্ছে...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> আপনার পাসওয়ার্ডগুলি মনে রাখে এবং স্বয়ংক্রিয়ভাবে ডিভাইস জুড়ে অ্যাপ্লিকেশান ও সাইটগুলিতে আপনাকে সাইন ইন করায়।</translation> <translation id="7925686952655276919">সিঙ্ক-এর জন্য মোবাইল ডেটা ব্যবহার করবেন না</translation> <translation id="7926906273904422255">অ-নিরাপদ মূলগুলিকে অ-নিরাপদ বা "সন্দেহজনক" হিসেবে চিহ্নিত করুন৷</translation> <translation id="7928710562641958568">বের করে দেওযার ডিভাইস</translation> @@ -4687,7 +4702,6 @@ নিজের কী ফাইল কোন নিরাপদ স্থানে রাখুন৷ আপনাকে নিজের এক্সটেনশানের নতুন সংস্করণ তৈরি করতে হবে৷</translation> <translation id="799923393800005025">দেখতে পারবেন</translation> <translation id="7999338963698132743">নতুন কার্য পরিচালক</translation> -<translation id="8000004253404706714">রেন্ডারারগুলির মধ্যে কম্পোজিট অ্যানিমেশনগুলির জন্য পুরোনো অনাহূতপ্রবেশমূলক অ্যানিমেশন সাবসিস্টেম ব্যবহার করুন।</translation> <translation id="8004582292198964060">ব্রাউজার</translation> <translation id="8007030362289124303">ব্যাটারি নিম্ন</translation> <translation id="8008356846765065031">ইন্টারনেট সংযোগ বিচ্ছিন্ন হয়েছে৷ দয়া করে আপনার ইন্টারনেট সংযোগ পরীক্ষা করুন৷</translation> @@ -4817,6 +4831,7 @@ <translation id="8185331656081929126">নেটওয়ার্কে নতুন মুদ্রণগুলি শণাক্ত করা হলে বিজ্ঞপ্তিগুলি দেখান</translation> <translation id="8186609076106987817">সার্ভার ফাইলটি খুঁজে পায়নি৷</translation> <translation id="8186706823560132848">সফটওয়ার</translation> +<translation id="8188120771410500975">&পাঠ্য ক্ষেত্রগুলির বানান চেক করুন</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" />, এবং অন্য <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" />টি</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" />-তে সংযুক্ত হচ্ছে</translation> <translation id="8191230140820435481">আপনার অ্যাপ্লিকেশন, এক্সটেনশন, এবং থিম পরিচালনা করুন</translation> @@ -5210,6 +5225,7 @@ <translation id="8765985713192161328">হ্যান্ডেলার পরিচালনা করুন...</translation> <translation id="8766796754185931010">কোটোয়েরি</translation> <translation id="8767072502252310690">ব্যবহারকারীগণ</translation> +<translation id="8768367823103160496">মাউস কার্সার লক</translation> <translation id="8769662576926275897">কার্ডের বিশদ বিবরণ</translation> <translation id="8770196827482281187">ফার্সী ইনপুট লেআউট(ISIRI 2901 লেআউট)</translation> <translation id="8774934320277480003">শীর্ষ মার্জিন</translation> @@ -5229,6 +5245,7 @@ <translation id="8795668016723474529">একটি ক্রেডিট কার্ড যুক্ত করুন</translation> <translation id="8795916974678578410">নতুন উইন্ডো</translation> <translation id="8798099450830957504">ডিফল্ট</translation> +<translation id="8799127529310003270">সক্ষম করা হলে, IME থ্রেডে InputConnection কল চালু হয়, এবং একটি রেপ্লিকা সম্পাদক রাখার পরিবর্তে প্রতিটি InputConnection কল সরাসরি রেন্ডারারের সাথে যোগাযোগ করবে।</translation> <translation id="8799839487311913894">একটি "পাসওয়ার্ড পরিবর্তন করুন" ফর্ম জমা দেওয়ার পরে পাসওয়ার্ড পরিচালকে একটি পাসওয়ার্ড আপডেট করা সক্ষম করুন।</translation> <translation id="8800004011501252845">এর জন্য দেখানো গন্তব্যস্থল</translation> <translation id="8800420788467349919">ভলিউম: <ph name="PRECENTAGE" />%</translation> @@ -5254,6 +5271,7 @@ <translation id="8841142799574815336">নিষ্ক্রিয় ভিজ্যুয়াল ভিউপোর্ট।</translation> <translation id="884264119367021077">শিপিং ঠিকানা</translation> <translation id="8844238624737526720">Chrome কার্য পরিচালকের নতুন ও নিখুঁত বাস্তবায়ন ব্যবহার করুন।</translation> +<translation id="8845001906332463065">সহায়তা পান</translation> <translation id="8846141544112579928">কীবোর্ডের জন্য অনুসন্ধান করা হচ্ছে...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift কী মোড স্যুইচ</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index c103202..0bc7ab9 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Afegeix aquesta pàgina a les adreces d'interès...</translation> <translation id="1047956942837015229">S'estan suprimint <ph name="COUNT" /> elements...</translation> <translation id="1048597748939794622">Activat per força per a totes les capes</translation> +<translation id="1049795001945932310">&Configuració d'idioma</translation> <translation id="1049926623896334335">Document de Word</translation> <translation id="1054153489933238809">Obre la &imatge original en una pestanya nova</translation> <translation id="1055806300943943258">S'estan cercant dispositius Bluetooth i USB...</translation> @@ -64,7 +65,7 @@ <translation id="1091767800771861448">Premeu ESCAPE per ometre (només compilacions no oficials).</translation> <translation id="1093457606523402488">Xarxes visibles:</translation> <translation id="1094607894174825014">S'ha sol·licitat una operació de lectura o escriptura amb un decalatge no vàlid a <ph name="DEVICE_NAME" />.</translation> -<translation id="1095631072651601838"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor ha proporcionat informació de Certificate Transparency, però no se n'han reconegut un o més registres.</translation> +<translation id="1095631072651601838"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor ha proporcionat informació de Transparència de certificats, però no se n'han reconegut un o més registres.</translation> <translation id="1097091804514346906">Mostra els comptadors del volum de dades al quadre de diàleg Esborra les dades de navegació.</translation> <translation id="1097507499312291972"><ph name="BEGIN_SIGN_IN_LINK" />Inicieu la sessió<ph name="END_SIGN_IN_LINK" /> per controlar i consultar els llocs web que aquesta persona visita.</translation> <translation id="1097658378307015415">Abans d'iniciar la sessió amb el vostre usuari, entreu com a convidat per activar la xarxa <ph name="NETWORK_ID" /></translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliteració (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Servidors de noms automàtics</translation> <translation id="1215411991991485844">S'ha afegit una aplicació en segon pla nova</translation> +<translation id="1216954813581739968">Activa la pestanya per als escriptoris compartits.</translation> <translation id="121827551500866099">Mostra totes les baixades...</translation> <translation id="122082903575839559">Algoritme de signatura del certificat</translation> <translation id="1221024147024329929">PKCS #1 MD2 amb encriptació RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">S'ha produït un error en l'inici de sessió automàtic.</translation> <translation id="1293556467332435079">Fitxers</translation> <translation id="1294298200424241932">Edita la configuració de confiança:</translation> +<translation id="1295794900245526845">Trieu el compte desat a <ph name="PASSWORD_MANAGER_BRAND" /> per iniciar la sessió</translation> <translation id="1297175357211070620">Destinació</translation> <translation id="1297922636971898492">En aquest moment Google Drive no està disponible. La càrrega es reiniciarà automàticament quan Google Drive torni a estar actiu.</translation> <translation id="1300861494336759522">Redirecció per a cerques a l'escriptori de Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Aquesta funció restablirà la pàgina d'inici, la pàgina Pestanya nova, el motor de cerca i les pestanyes fixades que tingueu configurades. També desactivarà totes les extensions i esborrarà les dades temporals, com ara les galetes. Les adreces d'interès, l'historial i les contrasenyes desades no s'esborraran.</translation> <translation id="1434886155212424586">La pàgina d'inici és la pàgina Pestanya nova</translation> <translation id="1435550882135542937">Nou disseny de la barra d'eines d'extensions</translation> +<translation id="1436402875660227532">Nota: aquestes opcions de configuració ja no s'utilitzen en aquest sistema, però encara podeu veure-les i editar-les.</translation> <translation id="1436784010935106834">Eliminat</translation> <translation id="1438632560381091872">Activa el so de les pestanyes</translation> <translation id="1441841714100794440">Teclat vietnamita (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Activa la compatibilitat del teclat virtual.</translation> <translation id="1474079335130556426">Activa el mode en segon pla per a l'API de tramesa automàtica. D'aquesta manera, Chrome pot continuar executant-se un cop tancada l'última finestra i, si l'API de tramesa automàtica ho requereix, es pot iniciar en arrancar el sistema operatiu.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" no s'ha penjat. No hi ha prou espai lliure al vostre compte de Google Drive.</translation> +<translation id="1476607407192946488">&Configuració d'idioma</translation> <translation id="1476949146811612304">Definiu el motor de cerca que s'ha de fer servir en fer una cerca des de l'<ph name="BEGIN_LINK" />omnibox<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Memòria cau del testimoni API d'identitat</translation> <translation id="1478340334823509079">Detalls: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Aquesta pàgina fa servir una aplicació de Native Client que no funciona al vostre ordinador.</translation> <translation id="1965328510789761112">Memòria privada</translation> <translation id="1965624977906726414">No té permisos especials.</translation> +<translation id="1968720524450620475">Activa les icones d'acció per a les notificacions web.</translation> <translation id="1970746430676306437">Visualitza la &informació de la pàgina</translation> <translation id="197288927597451399">Conserva</translation> <translation id="1973491249112991739">No s'ha pogut baixar <ph name="PLUGIN_NAME" />.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">Utilitza les tecles - i = per mostrar una llista de candidats</translation> <translation id="2347476388323331511">No s'ha pogut sincronitzar</translation> <translation id="2347991999864119449">Permet-me triar quan vull executar el contingut del connector</translation> +<translation id="2348165084656290171">Per compartir l'àudio, seleccioneu una pestanya o la pantalla completa.</translation> <translation id="2350182423316644347">S'està inicialitzant l'aplicació...</translation> <translation id="2350796302381711542">Voleu permetre que <ph name="HANDLER_HOSTNAME" /> obri tots els enllaços de <ph name="PROTOCOL" /> en comptes de <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Idioma i introducció de text</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">Teclat multilingüe canadenc</translation> <translation id="2478176599153288112">Permisos de fitxer multimèdia per a "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">Només desbloqueja <ph name="DEVICE_TYPE" /> quan el telèfon estigui a l'abast de la mà.</translation> +<translation id="247949520305900375">Comparteix l'àudio</translation> <translation id="2479780645312551899">Aquesta vegada executa tots els connectors</translation> <translation id="2480626392695177423">Commuta el mode de puntuació d'amplada completa/mitja amplada</translation> <translation id="2481332092278989943">Afegeix al prestatge</translation> @@ -1308,6 +1316,7 @@ <translation id="2889064240420137087">Obre l'enllaç amb...</translation> <translation id="2889925978073739256">Continua bloquejant els connectors de fora de la zona de proves</translation> <translation id="2890624088306605051">Recupera només la configuració i les dades sincronitzades</translation> +<translation id="2890678560483811744">La pàgina indicada no respecta el límit</translation> <translation id="2893168226686371498">Navegador predeterminat</translation> <translation id="289426338439836048">Altres xarxes de telefonia mòbil...</translation> <translation id="2894745200702272315">Permet utilitzar una versió experimental de les funcions per a la detecció de paraules actives d'"Ok Google" que depenen del maquinari.</translation> @@ -1336,7 +1345,6 @@ <translation id="2925966894897775835">Fulls</translation> <translation id="2927017729816812676">Emmagatzematge a la memòria cau</translation> <translation id="2927657246008729253">Canvia...</translation> -<translation id="2928415919076124714">Amaga la barra d'eines en mode de pantalla completa</translation> <translation id="2928526264833629376">Vés a Hangouts</translation> <translation id="2930644991850369934">S'ha produït un problema en baixar la imatge de recuperació. S'ha perdut la connexió a la xarxa.</translation> <translation id="293111069139560936">Permet que el prestatge minimitzi una finestra si es fa clic en un element del prestatge que només tingui associada una finestra activa.</translation> @@ -1460,6 +1468,7 @@ <translation id="3117812041123364382">Activa o desactiva el teclat virtual flotant.</translation> <translation id="3118319026408854581">Ajuda de <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">El nivell d'encriptació no és prou alt per a una operació determinada a <ph name="DEVICE_NAME" />.</translation> +<translation id="3121260210578524273">Activa les icones als botons d'acció per a les notificacions web.</translation> <translation id="3121793941267913344">Restabliu aquest dispositiu <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="3122162841865761901">Experiments d'Eines per a desenvolupadors</translation> <translation id="3122464029669770682">CPU</translation> @@ -1580,7 +1589,6 @@ <translation id="3289566588497100676">Entrada de símbols simples</translation> <translation id="3289856944988573801">Per comprovar si hi ha actualitzacions, feu servir Ethernet o Wi-Fi.</translation> <translation id="3293325348208285494">Inici ràpid</translation> -<translation id="3293894718455402932"><ph name="EXTENSION" /> podrà llegir i escriure missatges, vídeos i fitxers de so a les carpetes marcades.</translation> <translation id="3294437725009624529">Convidat</translation> <translation id="329650768420594634">Advertiment de l'extensió de paquets</translation> <translation id="3296763833017966289">Georgià</translation> @@ -1637,6 +1645,7 @@ <translation id="3338239663705455570">Teclat eslovè</translation> <translation id="3340978935015468852">configuració</translation> <translation id="3341703758641437857">Permet l'accés als URL de fitxer</translation> +<translation id="3343813173145836998">Inicieu la sessió fàcilment en aquest dispositiu</translation> <translation id="3344786168130157628">Nom del punt d'accés:</translation> <translation id="3345135638360864351">La sol·licitud per accedir al lloc no s'ha pogut enviar a <ph name="NAME" />. Torneu-ho a provar.</translation> <translation id="3345886924813989455">No s'ha trobat cap navegador compatible</translation> @@ -2115,6 +2124,7 @@ <translation id="3996912167543967198">S'està restablint...</translation> <translation id="3997015411467176489">Funcions experimentals de llenç</translation> <translation id="40027638859996362">Desplaçament de paraules</translation> +<translation id="400554499662786523">Per compartir l'àudio, seleccioneu una pestanya.</translation> <translation id="4012550234655138030">Configureu o gestioneu les impressores a <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Voleu reparar <ph name="EXTENSION_NAME" />?</translation> <translation id="4018133169783460046">Mostra <ph name="PRODUCT_NAME" /> en aquest idioma</translation> @@ -2217,6 +2227,7 @@ <translation id="4180788401304023883">Voleu suprimir el certificat de CA "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">Teclat fonètic rus (YaZHert)</translation> <translation id="4181841719683918333">Idiomes</translation> +<translation id="4187248015940562149">Activa Web Bluetooth, la qual cosa pot permetre que els llocs web es connectin a dispositius Bluetooth propers i els controlin.</translation> <translation id="4188026131102273494">Paraula clau:</translation> <translation id="4189406272289638749">Una extensió, <b><ph name="EXTENSION_NAME" /></b>, està controlant aquest paràmetre.</translation> <translation id="4193154014135846272">Document de Google</translation> @@ -2273,6 +2284,7 @@ <translation id="4268025649754414643">Encriptació de claus</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versió <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Cap coincidència</translation> <translation id="4274187853770964845">Error de sincronització: atureu i reinicieu la sincronització.</translation> <translation id="4275830172053184480">Reinici del dispositiu</translation> <translation id="4276796043975446927">Us donem la benvinguda a Chromebox per a reunions.</translation> @@ -2342,6 +2354,7 @@ <translation id="4378551569595875038">S'està connectant...</translation> <translation id="438122767399415311">Força la direcció de la interfície d'usuari</translation> <translation id="4381849418013903196">Dos punts</translation> +<translation id="4383192539467954373">Inicieu la sessió automàticament en tots els dispositius</translation> <translation id="4384652540891215547">Activa l'extensió</translation> <translation id="438503109373656455">Cavall</translation> <translation id="4387554346626014084">Activa la sincronització del Menú d'aplicacions. Aquesta acció també admet carpetes on la funció estigui disponible (no ho està a OS X).</translation> @@ -2359,6 +2372,7 @@ <translation id="4421932782753506458">Gatet</translation> <translation id="4422347585044846479">Editeu l'adreça d'interès d'aquesta pàgina</translation> <translation id="4422428420715047158">Domini:</translation> +<translation id="4423482519432579560">&Corrector ortogràfic</translation> <translation id="442477792133831654">Comunicar-se amb els dispositius propers</translation> <translation id="4425149324548788773">La meva unitat</translation> <translation id="4428582326923056538">Les excepcions de la càmera d'Adobe Flash Player són diferents.</translation> @@ -2373,6 +2387,7 @@ <translation id="444267095790823769">Excepcions de contingut protegit</translation> <translation id="4443536555189480885">&Ajuda</translation> <translation id="4444304522807523469">Accedir als escàners del document adjunts mitjançant USB o a la xarxa local</translation> +<translation id="4445559854264555037">No es mostra el vostre dispositiu? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Duplicat</translation> <translation id="4447465454292850432">Bateria:</translation> <translation id="4449935293120761385">Quant a la funció Emplenament automàtic</translation> @@ -2605,7 +2620,7 @@ <translation id="4823484602432206655">Llegir i canviar la configuració de l'usuari i del dispositiu</translation> <translation id="4824518112777153488">Compatibilitat amb pantalles tàctils amb funció de passar el cursor per sobre</translation> <translation id="4830573902900904548">El vostre dispositiu <ph name="DEVICE_TYPE" /> no es pot connectar a Internet mitjançant <ph name="NETWORK_NAME" />. Trieu una altra xarxa. <ph name="LEARN_MORE_LINK_START" />Més informació<ph name="LEARN_MORE_LINK_END" /></translation> -<translation id="4830663122372455572"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor ha proporcionat informació vàlida de Transparency Certificate.</translation> +<translation id="4830663122372455572"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor ha proporcionat informació vàlida de Transparència de certificats.</translation> <translation id="4834912470034578916">Activa els dissenys personalitzats per a les notificacions web.</translation> <translation id="4835836146030131423">S'ha produït un error en iniciar la sessió.</translation> <translation id="4837926214103741331">No teniu autorització per fer servir aquest dispositiu. Contacteu amb el propietari del dispositiu per obtenir el permís d'inici de sessió.</translation> @@ -2628,6 +2643,7 @@ <translation id="485316830061041779">Alemany</translation> <translation id="4856478137399998590">El servei de dades mòbil està activat i a punt per fer servir</translation> <translation id="4858913220355269194">Pilota</translation> +<translation id="4860565041166337978">Permet que el gestor de baixades del sistema gestioni les baixades quan sigui pertinent.</translation> <translation id="48607902311828362">Mode d'avió</translation> <translation id="4861833787540810454">Repro&dueix</translation> <translation id="4862050643946421924">S'està afegint el dispositiu...</translation> @@ -2711,7 +2727,6 @@ <translation id="4977942889532008999">Confirmació de l'accés</translation> <translation id="4982718461356080574">Amaga els botons per tancar en pestanyes inactives quan estiguin apilades</translation> <translation id="498294082491145744">Modifiqueu la configuració que controla l'accés dels llocs web a elements com les galetes, JavaScript, els connectors, la ubicació geogràfica, el micròfon, la càmera, etc.</translation> -<translation id="4984329823325527157">API de Media Source</translation> <translation id="4988526792673242964">Pàgines</translation> <translation id="4988792151665380515">No s'ha pogut exportar la clau pública.</translation> <translation id="49896407730300355">Gira en el sentit con&trari a les agulles del rellotge</translation> @@ -2899,7 +2914,6 @@ <translation id="5268606875983318825">PPAPI (fora de procés)</translation> <translation id="526926484727016706">Provoca que es deneguin tots els permisos per a tots els iframes de manera predeterminada. Si es permeten permisos concrets per a un iframe, és possible que es mostrin els noms d'aquests permisos com a valors d'atributs d'iframe nous.</translation> <translation id="5269977353971873915">Error d'impressió</translation> -<translation id="5270884342523754894"><ph name="EXTENSION" /> podrà llegir imatges, vídeos i fitxers de so a les carpetes marcades.</translation> <translation id="5271247532544265821">Canvia entre xinès mode simplificat/xinès mode tradicional</translation> <translation id="5271549068863921519">Desa la contrasenya</translation> <translation id="5273628206174272911">Navegació experimental per l'historial en desplaçar-s'hi horitzontalment per sobre.</translation> @@ -2936,6 +2950,7 @@ <translation id="5316716239522500219">Replica els monitors</translation> <translation id="5317780077021120954">Desa</translation> <translation id="5319782540886810524">Teclat letó</translation> +<translation id="532247166573571973">És possible que no es pugui accedir al servidor. Torneu-ho a provar més tard.</translation> <translation id="5323213332664049067">Espanyol d'Amèrica Llatina</translation> <translation id="532360961509278431">No es pot obrir "$1": $2</translation> <translation id="5324674707192845912">Esteu a punt de cancel·lar el registre d'aquest dispositiu <ph name="DEVICE_TYPE" /> a Google perquè no es pugui localitzar, esborrar-ne les dades ni bloquejar-lo remotament. Caldrà que el reinicieu. Voleu continuar?</translation> @@ -2988,11 +3003,11 @@ <translation id="5390284375844109566">Base de dades indexada</translation> <translation id="5392544185395226057">Activeu la compatibilitat amb Native Client.</translation> <translation id="5393125431335030955">Aquest connector només funciona a l'escriptori.</translation> -<translation id="5393559999218790205">Desactivar la línia de temps d'animacions del componedor d'interfícies d'usuari</translation> <translation id="5396126354477659676">El connector <ph name="PEPPER_PLUGIN_NAME" /> de <ph name="PEPPER_PLUGIN_DOMAIN" /> vol accedir al vostre ordinador.</translation> <translation id="539755880180803351">Anota formularis web amb prediccions de tipus d'emplenament automàtic dels camps com a text de adreces d'interès de posició.</translation> <translation id="5397578532367286026">El gestor (<ph name="MANAGER_EMAIL" />) pot revisar l'ús i l'historial d'aquest usuari a chrome.com.</translation> <translation id="5397794290049113714">Usuari</translation> +<translation id="5398572795982417028">La pàgina indicada no respecta el límit de <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> d'altres llocs</translation> <translation id="5399158067281117682">Els PIN no coincideixen.</translation> <translation id="5400640815024374115">El xip de Trusted Platform Module (TPM) està desactivat o bé no és present.</translation> @@ -3012,7 +3027,7 @@ <translation id="5423849171846380976">Activat</translation> <translation id="5425470845862293575">Permet l'ús del sistema experimental de renderització de tipus de lletra DirectWrite.</translation> <translation id="5425722269016440406">Heu d'estar connectat a Internet per desactivar Smart Lock, perquè aquesta opció se sincronitza amb el telèfon i amb altres dispositius. Connecteu-vos a una xarxa en primer lloc.</translation> -<translation id="5426623592374109001">Utilitzeu l'antic subsistema d'animació intrusiva per a les animacions compostes de la interfície d'usuari.</translation> +<translation id="5425863515030416387">Inicieu la sessió fàcilment en tots els dispositius</translation> <translation id="5427459444770871191">Gira en el sentit de les &agulles del rellotge</translation> <translation id="5428105026674456456">Espanyol</translation> <translation id="542872847390508405">Esteu navegant com a convidat.</translation> @@ -3037,6 +3052,7 @@ <translation id="5451646087589576080">V&isualitza la informació del marc</translation> <translation id="5453029940327926427">Tanca les pestanyes</translation> <translation id="5453632173748266363">Ciríl·lic</translation> +<translation id="5454166040603940656">amb <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">No vàlides</translation> <translation id="5457459357461771897">Llegeix i suprimeix fotos, música i altres elements multimèdia de l'ordinador</translation> <translation id="5457599981699367932">Navega com a convidat</translation> @@ -3207,7 +3223,6 @@ <translation id="5708171344853220004">Nom principal de Microsoft</translation> <translation id="5709885306771508267">Pessic per ajustar la mida</translation> <translation id="5710406368443808765">El sistema no ha pogut desar el testimoni ni l'identificador del dispositiu.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> no respon. No es pot emetre contingut.</translation> <translation id="5711983031544731014">No es pot desbloquejar: introduïu la contrasenya</translation> <translation id="5712966208980506909">Si s'activa, l'URL chrome://md-policy carrega la pàgina de la política de material design.</translation> <translation id="5715711091495208045">Agent de connectors: <ph name="PLUGIN_NAME" /></translation> @@ -3244,7 +3259,7 @@ <translation id="5757567991662509396">Activa l'ús del corrector ortogràfic d'Android.</translation> <translation id="5758879179008762764">Baixa prèviament els resultats de la cerca de la consulta que s'ha escrit a l'omnibox i reutilitza la pàgina de base de la cerca prerenderitzada per confirmar les consultes de cerca (no només la consulta de baixada prèvia).</translation> <translation id="5759728514498647443"><ph name="APP_NAME" /> pot llegir els documents que envieu a la impressora mitjançant <ph name="APP_NAME" />.</translation> -<translation id="5762019362523090260"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor ha proporcionat informació de Certificate Transparency, però no era vàlida.</translation> +<translation id="5762019362523090260"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor ha proporcionat informació de Transparència de certificats, però no era vàlida.</translation> <translation id="5764483294734785780">De&sa l'àudio com a...</translation> <translation id="57646104491463491">Data de modificació</translation> <translation id="5765491088802881382">No hi ha cap xarxa disponible</translation> @@ -3470,12 +3485,11 @@ <translation id="6105158702728922449">Utilitzar la càmera i el micròfon</translation> <translation id="6107012941649240045">Emès per a</translation> <translation id="6107079717483424262">Reconeix la veu quan dieu "Ok Google"</translation> -<translation id="6110466548232134880"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor no ha proporcionat informació de Certificate Transparency.</translation> +<translation id="6110466548232134880"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor no ha proporcionat informació de Transparència de certificats.</translation> <translation id="6111770213269631447">Transliteració (namaskar → নমস্কার)</translation> <translation id="6111974609785983504">Permès de manera predeterminada</translation> <translation id="6113134669445407638">Desactiva Delay Agnostic AEC a WebRTC. Utilitzeu aquesta opció si els retards del sistema detectats són de molta confiança o si altres persones reben eco de la vostra màquina.</translation> <translation id="6116921718742659598">Canvia la configuració d'idioma i d'introducció de text</translation> -<translation id="6117536376248197233">Desactivar la línia de temps d'animacions del componedor als renderitzadors.</translation> <translation id="6120205520491252677">Fixa aquesta pàgina a la pantalla d'inici...</translation> <translation id="6122081475643980456">La vostra connexió a Internet s'està controlant</translation> <translation id="6122093587541546701">Adreça electrònica (opcional):</translation> @@ -3507,6 +3521,7 @@ <translation id="6163522313638838258">Amplia-ho tot...</translation> <translation id="6164005077879661055">Tots els fitxers i les dades locals associats amb l'usuari supervisat se suprimiran de manera permanent quan aquest usuari supervisat se suprimeixi. És possible que el gestor encara pugui veure els llocs web visitats i la configuració d'aquest usuari supervisat a la pàgina <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Més informació</translation> +<translation id="6167008112175207002">Les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració se sincronitzaran amb el vostre compte de Google, perquè els pugueu utilitzar en tots els dispositius. Podeu canviar aquesta configuració a <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Funcions "Ok Google" per a maquinari simulat</translation> <translation id="6175314957787328458">GUID de domini de Microsoft</translation> <translation id="6178664161104547336">Seleccioneu un certificat</translation> @@ -3709,6 +3724,7 @@ <translation id="648927581764831596">No n'hi ha cap de disponible</translation> <translation id="6490936204492416398">Instal·leu-ne de noves des de la botiga web</translation> <translation id="6492313032770352219">Espai ocupat al disc:</translation> +<translation id="6498249116389603658">&Tots els vostres idiomes</translation> <translation id="6499143127267478107">S'està resolent l'amfitrió de l'script del servidor intermediari...</translation> <translation id="6503077044568424649">Els més visitats</translation> <translation id="6503256918647795660">Teclat francès de Suïssa</translation> @@ -3750,7 +3766,6 @@ <translation id="6555432686520421228">Suprimeix tots els comptes d'usuari i restableix el dispositiu <ph name="IDS_SHORT_PRODUCT_NAME" />, com si fos nou.</translation> <translation id="6556866813142980365">Refés</translation> <translation id="6557565812667414268">Activat només per a visualitzacions ppp d'alt rendiment</translation> -<translation id="655845594391856372">La pestanya no respon. No es pot emetre contingut.</translation> <translation id="6559580823502247193">(ja és en aquest dispositiu)</translation> <translation id="6561726789132298588">retorn</translation> <translation id="6562437808764959486">S'està extraient la imatge de recuperació...</translation> @@ -3851,6 +3866,7 @@ <translation id="6723354935081862304">Imprimeix a Google Docs i a altres destinacions al núvol. <ph name="BEGIN_LINK" />Inicia la sessió<ph name="END_LINK" /> per imprimir a Google Cloud Print.</translation> <translation id="6723661294526996303">Importa les adreces d'interès i la configuració...</translation> <translation id="6723839937902243910">Alimentació</translation> +<translation id="6725240607822645708">Executa l'editor del mètode d'introducció a la conversa pròpia.</translation> <translation id="6725970970008349185">Nombre de candidats que es mostren per pàgina</translation> <translation id="672609503628871915">Novetats</translation> <translation id="6727005317916125192">Subfinestra anterior</translation> @@ -3981,12 +3997,11 @@ <translation id="6948736568813450284">Per als desenvolupadors: utilitzeu el servei de la zona de proves per a les crides a l'API de Google Payments.</translation> <translation id="6949306908218145636">Afegeix les pàgines obertes a les adreces d'interès...</translation> <translation id="695164542422037736">Si aquesta opció està activada i l'estil del cos és background-attachment:fixed, el fons tindrà la seva pròpia capa de composició.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> recorda les vostres contrasenyes i us inicia la sessió als llocs automàticament en aquest dispositiu.</translation> <translation id="6955446738988643816">Inspecciona l'element emergent</translation> <translation id="695755122858488207">Botó d'opció no seleccionat</translation> +<translation id="6960277925159781810">Inicieu la sessió automàticament en aquest dispositiu</translation> <translation id="696036063053180184">Configuració 3 (sense majúscules)</translation> <translation id="696203921837389374">Activa la sincronització mitjançant dades mòbils</translation> -<translation id="6964308487066031935">Voleu afegir carpetes a <ph name="EXTENSION" />?</translation> <translation id="6965382102122355670">D'acord</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Dispositiu</translation> @@ -4085,7 +4100,6 @@ <translation id="7076293881109082629">Inicia la sessió</translation> <translation id="7077829361966535409">La pàgina d'inici de sessió no s'ha pogut carregar amb la configuració de servidor intermediari actual. <ph name="GAIA_RELOAD_LINK_START" />Proveu de tornar a iniciar la sessió<ph name="GAIA_RELOAD_LINK_END" /> o utilitzeu una <ph name="PROXY_SETTINGS_LINK_START" />configuració de servidor intermediari<ph name="PROXY_SETTINGS_LINK_END" /> diferent.</translation> <translation id="7077872827894353012">Gestors de protocols ignorats</translation> -<translation id="7079038783243627996"><ph name="EXTENSION" /> podrà llegir i suprimir imatges, vídeos i fitxers de so a les carpetes marcades.</translation> <translation id="708060913198414444">C&opia l'adreça de l'àudio</translation> <translation id="708187310695946552">Restauració de sessió de la interfície d'usuari basada en quadres d'ajuda</translation> <translation id="7082055294850503883">Ignora l'estat de Bloq Maj i estableix les minúscules de manera predeterminada</translation> @@ -4229,6 +4243,8 @@ <translation id="7313804056609272439">Mètode d'entrada de vietnamita (VNI)</translation> <translation id="7314244761674113881">Amfitrió SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (actual)</translation> +<translation id="7321545336522791733">No s'ha pogut accedir al servidor</translation> +<translation id="7324841169865301118">Permet que l'usuari triï una pestanya per als escriptoris compartits.</translation> <translation id="7325437708553334317">Extensió d'alt contrast</translation> <translation id="7326565110843845436">Clic amb tres dits al ratolí tàctil</translation> <translation id="73289266812733869">Ja no està seleccionat</translation> @@ -4346,7 +4362,7 @@ <translation id="7503191893372251637">Tipus de certificat de Netscape</translation> <translation id="7503821294401948377">No s'ha pogut carregar la icona "<ph name="ICON" />" per a l'acció del navegador.</translation> <translation id="750413812607578381">Reinicieu <ph name="PRODUCT_NAME" /> ara.</translation> -<translation id="7504483980780085481">Aquest lloc ha proporcionat informació sobre Certificate Transparency que no és vàlida.</translation> +<translation id="7504483980780085481">Aquest lloc ha proporcionat informació sobre Transparència de certificats que no és vàlida.</translation> <translation id="7504676042960447229"><ph name="SITE_NAME" /> vol:</translation> <translation id="750509436279396091">Obre la carpeta de baixades</translation> <translation id="7505167922889582512">Mostra els fitxers amagats</translation> @@ -4447,7 +4463,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" vol eliminar "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> es mostra en aquest idioma</translation> <translation id="7654941827281939388">Aquest compte ja s'està utilitzant en aquest ordinador.</translation> -<translation id="7655165758820095116">L'objecte MediaSource permet que JavaScript enviï dades multimèdia directament a un element de vídeo.</translation> <translation id="7658239707568436148">Cancel·la</translation> <translation id="7659584679870740384">No teniu autorització per fer servir aquest dispositiu. Contacteu amb l'administrador per obtenir el permís d'inici de sessió.</translation> <translation id="7664620655576155379">Dispositiu Bluetooth no compatible: "<ph name="DEVICE_NAME" />".</translation> @@ -4578,6 +4593,7 @@ <translation id="7861215335140947162">&Baixades</translation> <translation id="7864539943188674973">Desactiva el Bluetooth</translation> <translation id="7868891395842935202">Activa l'entorn de treball experimental per controlar l'accés als experiments de l'API.</translation> +<translation id="7870576007982733437">Utilitza el gestor de baixades del sistema quan és pertinent.</translation> <translation id="7870790288828963061">No s'ha trobat cap aplicació de Quiosc amb una versió més nova. No hi ha res per actualitzar. Extraieu la memòria USB.</translation> <translation id="787150342916295244">Escaneig de targetes de crèdit</translation> <translation id="7874357055309047713">Executa sempre en tots els llocs</translation> @@ -4620,7 +4636,6 @@ <translation id="7918257978052780342">Inscriu</translation> <translation id="7920092496846849526">S'ha enviat una sol·licitud als pares per visitar aquesta pàgina.</translation> <translation id="7925285046818567682">Esperant <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> recorda les vostres contrasenyes i us inicia la sessió automàticament a les aplicacions i als llocs en tots els dispositius.</translation> <translation id="7925686952655276919">No utilitzis les dades mòbils per a la sincronització</translation> <translation id="7926906273904422255">Marca els orígens no segurs com a no segurs o com a "dubtosos".</translation> <translation id="7928710562641958568">Expulsa el dispositiu</translation> @@ -4682,7 +4697,6 @@ Deseu el fitxer de clau en una ubicació segura. El necessitareu per crear versions noves de l'extensió.</translation> <translation id="799923393800005025">Pot consultar</translation> <translation id="7999338963698132743">Gestor de tasques nou</translation> -<translation id="8000004253404706714">Utilitzeu l'antic subsistema d'animació intrusiva per a les animacions compostes dels renderitzadors.</translation> <translation id="8004582292198964060">Navegador</translation> <translation id="8007030362289124303">Nivell de bateria baix</translation> <translation id="8008356846765065031">S'ha desconnectat Internet. Comproveu la connexió.</translation> @@ -4811,6 +4825,7 @@ <translation id="8185331656081929126">Mostra notificacions quan es detectin impressores noves a la xarxa</translation> <translation id="8186609076106987817">El servidor no ha pogut trobar el fitxer.</translation> <translation id="8186706823560132848">Programari</translation> +<translation id="8188120771410500975">&Revisa l'ortografia dels camps de text</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> i <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> més</translation> <translation id="8190193592390505034">S'està connectant amb <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Gestionar les aplicacions, les extensions i els temes</translation> @@ -5203,6 +5218,7 @@ <translation id="8765985713192161328">Gestiona els gestors...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Usuaris</translation> +<translation id="8768367823103160496">Bloqueig del cursor del ratolí</translation> <translation id="8769662576926275897">Detalls de la targeta</translation> <translation id="8770196827482281187">Mètode d'entrada de persa (disseny ISIRI 2901)</translation> <translation id="8774934320277480003">Marge superior</translation> @@ -5222,6 +5238,7 @@ <translation id="8795668016723474529">Afegir una targeta de crèdit</translation> <translation id="8795916974678578410">Finestra nova</translation> <translation id="8798099450830957504">Predeterminat</translation> +<translation id="8799127529310003270">Si està activada, les crides d'InputConnection s'executen a la conversa de l'editor del mètode d'introducció i, en comptes de mantenir un editor de rèpliques, cada crida d'InputConnection es comunica directament amb el renderitzador.</translation> <translation id="8799839487311913894">Activa l'opció per actualitzar una contrasenya al gestor de contrasenyes després d'enviar un formulari per canviar la contrasenya.</translation> <translation id="8800004011501252845">S'estan mostrant les destinacions per a</translation> <translation id="8800420788467349919">Volum: <ph name="PRECENTAGE" /> %</translation> @@ -5247,6 +5264,7 @@ <translation id="8841142799574815336">Finestra gràfica visual inert</translation> <translation id="884264119367021077">Adreça d’enviament</translation> <translation id="8844238624737526720">Utilitza la implementació nova i optimitzada del gestor de tasques de Chrome.</translation> +<translation id="8845001906332463065">Obteniu ajuda</translation> <translation id="8846141544112579928">S'està cercant el teclat...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Canvi de mode amb la tecla Maj</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 367cbf07..035fcb71 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Přidat stránku do záložek...</translation> <translation id="1047956942837015229">Mazání <ph name="COUNT" /> položek...</translation> <translation id="1048597748939794622">Vynuceně povoleno pro všechny vrstvy</translation> +<translation id="1049795001945932310">&Jazyková nastavení</translation> <translation id="1049926623896334335">Dokument aplikace Word</translation> <translation id="1054153489933238809">Otevřít původní &obrázek na nové kartě</translation> <translation id="1055806300943943258">Vyhledávání zařízení připojených pomocí rozhraní Bluetooth a USB...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Přepis (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automatické názvové servery</translation> <translation id="1215411991991485844">Byla přidána nová aplikace na pozadí</translation> +<translation id="1216954813581739968">Povolit kartu pro sdílení plochy</translation> <translation id="121827551500866099">Zobrazit všechny stažené soubory...</translation> <translation id="122082903575839559">Algoritmus podpisu certifikátu</translation> <translation id="1221024147024329929">Šifrování PKCS #1 MD2 s RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Automatické přihlášení se nezdařilo</translation> <translation id="1293556467332435079">Soubory</translation> <translation id="1294298200424241932">Upravit nastavení důvěryhodnosti:</translation> +<translation id="1295794900245526845">Vyberte účet uložený v aplikaci <ph name="PASSWORD_MANAGER_BRAND" />, pomocí kterého se chcete přihlásit</translation> <translation id="1297175357211070620">Cíl</translation> <translation id="1297922636971898492">Disk Google aktuálně není k dispozici. Jakmile bude Disk Google opět dostupný, nahrávání se automaticky obnoví.</translation> <translation id="1300861494336759522">Přesměrování vyhledávání na ploše Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Bude resetována vaše počáteční stránka, stránka Nová karta, vyhledávač a připnuté karty. Budou také zakázána všechna rozšíření a vymazána dočasná data, jako jsou soubory cookie. Uložené záložky, historie ani hesla vymazána nebudou.</translation> <translation id="1434886155212424586">Domovská stránka je stránka nové karty</translation> <translation id="1435550882135542937">Nový vzhled lišty rozšíření</translation> +<translation id="1436402875660227532">Poznámka: Tato nastavení se již v tomto systému nepoužívají, ale můžete je stále zobrazit a upravit.</translation> <translation id="1436784010935106834">Odebráno</translation> <translation id="1438632560381091872">Zapnout zvuk karet</translation> <translation id="1441841714100794440">Vietnamská klávesnice (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Aktivuje podporu virtuální klávesnice.</translation> <translation id="1474079335130556426">Povolí režim na pozadí pro rozhraní Push API. Pokud to rozhraní Push API bude potřebovat, bude Chrome moci zůstat spuštěný i po zavření posledního okna a bude se moci spouštět při spuštění operačního systému.</translation> <translation id="1474339897586437869">Soubor <ph name="FILENAME" /> nelze nahrát. Na Disku Google je nedostatek místa.</translation> +<translation id="1476607407192946488">&Jazyková nastavení</translation> <translation id="1476949146811612304">Nastavit vyhledávač, který se používá při vyhledávání v <ph name="BEGIN_LINK" />omniboxu<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Mezipaměť tokenů rozhraní Identity API</translation> @@ -650,6 +655,7 @@ <translation id="1962233722219655970">Tato stránka používá aplikaci nativního klienta, která ve vašem počítači nefunguje.</translation> <translation id="1965328510789761112">Privátní paměť</translation> <translation id="1965624977906726414">Nemá žádná zvláštní oprávnění.</translation> +<translation id="1968720524450620475">Povolit ikony akcí pro oznámení Web Notifications</translation> <translation id="1970746430676306437">Zobrazit &informace o stránkách</translation> <translation id="197288927597451399">Uložit</translation> <translation id="1973491249112991739">Stahování pluginu <ph name="PLUGIN_NAME" /> selhalo. </translation> @@ -906,6 +912,7 @@ <translation id="2344262275956902282">K vyvolání seznamu návrhů použít klávesy - a =</translation> <translation id="2347476388323331511">Nelze synchronizovat</translation> <translation id="2347991999864119449">Chci vybrat, kdy bude obsah pluginu spuštěn</translation> +<translation id="2348165084656290171">Chcete-li sdílet zvuk, vyberte kartu nebo celou obrazovku.</translation> <translation id="2350182423316644347">Aplikace se inicializuje...</translation> <translation id="2350796302381711542">Chcete obslužnému nástroji <ph name="HANDLER_HOSTNAME" /> povolit otevírat všechny odkazy s protokolem <ph name="PROTOCOL" /> (namísto obslužného nástroje <ph name="REPLACED_HANDLER_TITLE" />)?</translation> <translation id="2351266942280602854">Jazyk a vstup</translation> @@ -993,6 +1000,7 @@ <translation id="247772113373397749">Kanadská vícejazyčná klávesnice</translation> <translation id="2478176599153288112">Oprávnění souborů médií pro rozšíření <ph name="EXTENSION" /></translation> <translation id="2478830106132467213">Zařízení <ph name="DEVICE_TYPE" /> lze odemknout, pouze když váš telefon bude v dosahu.</translation> +<translation id="247949520305900375">Sdílet zvuk</translation> <translation id="2479780645312551899">Tentokrát spustit všechny pluginy</translation> <translation id="2480626392695177423">Přepnout mezi režimem plné a poloviční šířky interpunkce</translation> <translation id="2481332092278989943">Přidat na poličku</translation> @@ -1307,6 +1315,7 @@ <translation id="2889064240420137087">Otevřít odkaz pomocí...</translation> <translation id="2889925978073739256">Pokračovat v blokování pluginů mimo izolovaný prostor</translation> <translation id="2890624088306605051">Načíst pouze synchronizovaná nastavení a data</translation> +<translation id="2890678560483811744">Odkaz na stránku mimo rozsah</translation> <translation id="2893168226686371498">Výchozí prohlížeč</translation> <translation id="289426338439836048">Jiná mobilní síť...</translation> <translation id="2894745200702272315">Aktivuje experimentální verzi funkcí detekce klíčového slova „Ok Google“, které jsou závislé na hardwaru.</translation> @@ -1335,7 +1344,6 @@ <translation id="2925966894897775835">Tabulky</translation> <translation id="2927017729816812676">Cache Storage</translation> <translation id="2927657246008729253">Změnit...</translation> -<translation id="2928415919076124714">V režimu celé obrazovky skrýt lištu</translation> <translation id="2928526264833629376">Pokračovat do služby Hangouts</translation> <translation id="2930644991850369934">Při stahování obrazu pro obnovení došlo k potížím. Připojení k síti bylo ztraceno.</translation> <translation id="293111069139560936">Po kliknutí na položku poličky, ke které je přidruženo jen jedno okno, které je již aktivní, polička toto okno minimalizuje.</translation> @@ -1459,6 +1467,7 @@ <translation id="3117812041123364382">Umožňuje aktivovat či zakázat plovoucí virtuální klávesnici.</translation> <translation id="3118319026408854581">Nápověda aplikace <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Šifrování je pro danou operaci na zařízení <ph name="DEVICE_NAME" /> nedostatečné.</translation> +<translation id="3121260210578524273">Povolit ikony v tlačítkách akcí oznámení Web Notifications.</translation> <translation id="3121793941267913344">Resetování tohoto zařízení <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Experimenty v Nástrojích pro vývojáře</translation> <translation id="3122464029669770682">CPU</translation> @@ -1579,7 +1588,6 @@ <translation id="3289566588497100676">Snadné zadávání symbolů</translation> <translation id="3289856944988573801">Chcete-li zkontrolovat dostupnost aktualizací, použijte síť Ethernet nebo Wi-Fi.</translation> <translation id="3293325348208285494">Rychlé spuštění</translation> -<translation id="3293894718455402932">Rozšíření <ph name="EXTENSION" /> bude moci číst a zapisovat obrázky, videa a zvukové soubory v zaškrtnutých složkách.</translation> <translation id="3294437725009624529">Host</translation> <translation id="329650768420594634">Upozornění na zabalení rozšíření</translation> <translation id="3296763833017966289">gruzínština</translation> @@ -1634,6 +1642,7 @@ <translation id="3338239663705455570">Slovinská klávesnice</translation> <translation id="3340978935015468852">nastavení</translation> <translation id="3341703758641437857">Umožnit přístup k adresám URL souborů</translation> +<translation id="3343813173145836998">Snadné přihlášení na tomto zařízení</translation> <translation id="3344786168130157628">Název přístupového bodu:</translation> <translation id="3345135638360864351">Odeslání žádosti o přístup k tomuto webu uživateli <ph name="NAME" /> se nezdařilo. Zkuste to prosím znovu.</translation> <translation id="3345886924813989455">Nebyl nalezen žádný podporovaný prohlížeč</translation> @@ -2112,6 +2121,7 @@ <translation id="3996912167543967198">Resetování...</translation> <translation id="3997015411467176489">Povolit experimentální funkce pro prvky canvas</translation> <translation id="40027638859996362">Přesunutí slova</translation> +<translation id="400554499662786523">Chcete-li sdílet zvuk, vyberte kartu.</translation> <translation id="4012550234655138030">Nastavit nebo spravovat tiskárny ve službě <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Opravit rozšíření <ph name="EXTENSION_NAME" />?</translation> <translation id="4018133169783460046">Zobrazit <ph name="PRODUCT_NAME" /> v tomto jazyce</translation> @@ -2214,6 +2224,7 @@ <translation id="4180788401304023883">Smazat certifikát CA <ph name="CERTIFICATE_NAME" />?</translation> <translation id="418179967336296930">Ruská fonetická klávesnice (YaZHert)</translation> <translation id="4181841719683918333">Jazyky</translation> +<translation id="4187248015940562149">Aktivuje rozhraní Web Bluetooth, které webům umožňuje připojit se k zařízením Bluetooth ve vašem okolí a ovládat je.</translation> <translation id="4188026131102273494">Klíčové slovo:</translation> <translation id="4189406272289638749">Toto nastavení je spravováno rozšířením <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Dokument Google</translation> @@ -2270,6 +2281,7 @@ <translation id="4268025649754414643">Šifrování klíče</translation> <translation id="4268574628540273656">Adresa URL:</translation> <translation id="4270393598798225102">Verze <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Žádné shody</translation> <translation id="4274187853770964845">Chyba synchronizace: Zastavte prosím synchronizaci a restartujte ji.</translation> <translation id="4275830172053184480">Restartovat zařízení</translation> <translation id="4276796043975446927">Vítejte ve službě Chromebox pro videokonference</translation> @@ -2339,6 +2351,7 @@ <translation id="4378551569595875038">Připojování...</translation> <translation id="438122767399415311">Vynucení směru uživatelského rozhraní</translation> <translation id="4381849418013903196">Dvojtečka</translation> +<translation id="4383192539467954373">Automatické přihlašování v různých zařízeních</translation> <translation id="4384652540891215547">Aktivovat rozšíření</translation> <translation id="438503109373656455">Hříbě</translation> <translation id="4387554346626014084">Aktivuje synchronizaci Spouštěče aplikací. Pokud je k dispozici funkce složek, bude povolena také (v systémech OS X nebude povolena).</translation> @@ -2356,6 +2369,7 @@ <translation id="4421932782753506458">Kotě</translation> <translation id="4422347585044846479">Upravit záložku pro tuto stránku</translation> <translation id="4422428420715047158">Doména:</translation> +<translation id="4423482519432579560">&Kontrola pravopisu</translation> <translation id="442477792133831654">Komunikace se zařízeními v okolí</translation> <translation id="4425149324548788773">Můj disk</translation> <translation id="4428582326923056538">Výjimky fotoaparátu v přehrávači Adobe Flash Player se liší.</translation> @@ -2370,6 +2384,7 @@ <translation id="444267095790823769">Výjimky z chráněného obsahu</translation> <translation id="4443536555189480885">&Nápověda</translation> <translation id="4444304522807523469">Přístup ke skenerům dokumentů připojeným přes USB nebo v místní síti</translation> +<translation id="4445559854264555037">Nevidíte své zařízení? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Zrcadleno</translation> <translation id="4447465454292850432">Baterie:</translation> <translation id="4449935293120761385">O funkci Automatické vyplňování</translation> @@ -2626,6 +2641,7 @@ <translation id="485316830061041779">němčina</translation> <translation id="4856478137399998590">Datové služby jsou aktivovány a můžete je začít používat</translation> <translation id="4858913220355269194">Fotbal</translation> +<translation id="4860565041166337978">Pokud je to možné, povolí správu stahování souborů pomocí systémového správce stahování.</translation> <translation id="48607902311828362">Režim Letadlo</translation> <translation id="4861833787540810454">&Přehrát</translation> <translation id="4862050643946421924">Přidávání zařízení...</translation> @@ -2709,7 +2725,6 @@ <translation id="4977942889532008999">Potvrzení přístupu</translation> <translation id="4982718461356080574">Skrývání tlačítek Zavřít u neaktivních karet shromážděných nad sebou</translation> <translation id="498294082491145744">Změnit vaše nastavení, která řídí přístup webů k funkcím, jako jsou soubory cookie, JavaScript, pluginy, určování geografické polohy, mikrofon, fotoaparát apod.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Stránky</translation> <translation id="4988792151665380515">Export veřejného klíče se nezdařil.</translation> <translation id="49896407730300355">Otočit &proti směru hodinových ručiček</translation> @@ -2896,7 +2911,6 @@ <translation id="5268606875983318825">PPAPI (mimo proces)</translation> <translation id="526926484727016706">Způsobuje, že ve výchozím nastavení budou u všech prvků iframe zamítnuta všechna oprávnění. Pokud u některého prvku iframe povolíte konkrétní oprávnění, nejspíš bude třeba názvy jednotlivých oprávnění uvést jako hodnoty nových atributů prvku iframe.</translation> <translation id="5269977353971873915">Tisk se nezdařil</translation> -<translation id="5270884342523754894">Rozšíření <ph name="EXTENSION" /> bude moci číst obrázky, videa a zvukové soubory v zaškrtnutých položkách.</translation> <translation id="5271247532544265821">Přepnout režim zjednodušené / tradiční čínštiny</translation> <translation id="5271549068863921519">Uložit heslo</translation> <translation id="5273628206174272911">Experimentální navigace v historii spouštěná horizontálním posouváním</translation> @@ -2933,6 +2947,7 @@ <translation id="5316716239522500219">Zrcadlit monitory</translation> <translation id="5317780077021120954">Uložit</translation> <translation id="5319782540886810524">Lotyšská klávesnice</translation> +<translation id="532247166573571973">Server pravděpodobně není dostupný. Zkuste to znovu později.</translation> <translation id="5323213332664049067">Latinská Amerika</translation> <translation id="532360961509278431">Soubor $1 nelze otevřít: $2</translation> <translation id="5324674707192845912">Chystáte se zrušit registraci tohoto zařízení <ph name="DEVICE_TYPE" /> na Googlu za účelem deaktivace možnosti vzdáleného vyhledání, smazání a uzamknutí zařízení. Tato akce bude vyžadovat restart. Opravdu chcete pokračovat?</translation> @@ -2985,11 +3000,11 @@ <translation id="5390284375844109566">Indexovaná databáze</translation> <translation id="5392544185395226057">Aktivuje podporu modulu Native Client.</translation> <translation id="5393125431335030955">Tento plugin lze spustit pouze v tradičním rozhraní systému Windows.</translation> -<translation id="5393559999218790205">Zakázat časové osy složených animací v uživatelském rozhraní</translation> <translation id="5396126354477659676">Plugin <ph name="PEPPER_PLUGIN_NAME" /> v doméně <ph name="PEPPER_PLUGIN_DOMAIN" /> chce získat přístup do vašeho počítače.</translation> <translation id="539755880180803351">Označí webové formuláře tak, že jako zástupný text vloží typ pole předpovídaný Automatickým vyplňováním.</translation> <translation id="5397578532367286026">Údaje o využití a historii tohoto uživatele si správce (<ph name="MANAGER_EMAIL" />) může prohlédnout na webu chrome.com.</translation> <translation id="5397794290049113714">Vy</translation> +<translation id="5398572795982417028">Odkaz na stránku mimo rozsah, limit je <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339">Z jiných webů: <ph name="COUNT" /></translation> <translation id="5399158067281117682">Kódy PIN nejsou shodné.</translation> <translation id="5400640815024374115">Čip modulu TPM je zakázán nebo chybí.</translation> @@ -3009,7 +3024,7 @@ <translation id="5423849171846380976">Aktivováno</translation> <translation id="5425470845862293575">Povoluje experimentální systém vykreslování písma pomocí rozhraní DirectWrite.</translation> <translation id="5425722269016440406">Chcete-li funkci Smart Lock vypnout, musíte být online, protože toto nastavení je synchronizováno do telefonu a ostatních zařízení. Nejdříve se prosím připojte k síti.</translation> -<translation id="5426623592374109001">U složených animací v uživatelském rozhraní bude použit zastaralý animační subsystém.</translation> +<translation id="5425863515030416387">Snadné přihlášení v různých zařízeních</translation> <translation id="5427459444770871191">Otočit &ve směru hodinových ručiček</translation> <translation id="5428105026674456456">španělština</translation> <translation id="542872847390508405">Prohlížíte si web jako host</translation> @@ -3034,6 +3049,7 @@ <translation id="5451646087589576080">Zobrazit &informace o rámu</translation> <translation id="5453029940327926427">Zavřít karty</translation> <translation id="5453632173748266363">Cyrilice</translation> +<translation id="5454166040603940656">(<ph name="PROVIDER" />)</translation> <translation id="5457113250005438886">Neplatné</translation> <translation id="5457459357461771897">Číst a mazat fotografie, hudbu a další média z počítače</translation> <translation id="5457599981699367932">Použít jako host</translation> @@ -3203,7 +3219,6 @@ <translation id="5708171344853220004">Hlavní název Microsoft</translation> <translation id="5709885306771508267">Změna velikosti přiblížením nebo oddálením prstů</translation> <translation id="5710406368443808765">Jejda! Systému se nepodařilo uložit token a ID zařízení.</translation> -<translation id="571161420693302741">Hostitel <ph name="HOST_NAME" /> neodpovídá. Odeslání nelze provést.</translation> <translation id="5711983031544731014">Zařízení nelze odemknout. Zadejte heslo.</translation> <translation id="5712966208980506909">Je-li tato zásada aktivována, adresa URL chrome://md-policy načte stránku zásad se vzhledem Material Design.</translation> <translation id="5715711091495208045">Zprostředkovatel pluginu: <ph name="PLUGIN_NAME" /></translation> @@ -3472,7 +3487,6 @@ <translation id="6111974609785983504">Povoleno ve výchozím nastavení</translation> <translation id="6113134669445407638">Umožňuje deaktivovat funkci Delay Agnostic AEC v rozhraní WebRTC. Funkce bude použita, pokud nahlášené prodlevy systému jsou vysoce důvěryhodné nebo ostatní uživatelé zaznamenali z vašeho počítače ozvěnu.</translation> <translation id="6116921718742659598">Změnit nastavení jazyka a vstupu</translation> -<translation id="6117536376248197233">Zakázat časové osy složených animací v modulech vykreslení</translation> <translation id="6120205520491252677">Připnout tuto stránku na úvodní obrazovku...</translation> <translation id="6122081475643980456">Vaše připojení k internetu je ovládáno</translation> <translation id="6122093587541546701">E-mail (nepovinné):</translation> @@ -3504,6 +3518,7 @@ <translation id="6163522313638838258">Rozbalit vše...</translation> <translation id="6164005077879661055">Po odebrání dozorovaného uživatele budou trvale smazány všechny soubory a místní data, která jsou k němu přiřazena. Navštívené weby a nastavení tohoto dozorovaného uživatele může správce i nadále zobrazit na adrese <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Další informace</translation> +<translation id="6167008112175207002">Vaše záložky, historie, hesla a další nastavení budou synchronizována do účtu Google, abyste je mohli používat ve všech svých zařízeních. Můžete to změnit v <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Simulované hardwarové funkce „Ok Google“</translation> <translation id="6175314957787328458">Identifikátor GUID domény Microsoft</translation> <translation id="6178664161104547336">Vyberte certifikát</translation> @@ -3707,6 +3722,7 @@ <translation id="648927581764831596">Není k dispozici</translation> <translation id="6490936204492416398">Nainstalovat nová rozšíření z internetového obchodu</translation> <translation id="6492313032770352219">Velikost na disku:</translation> +<translation id="6498249116389603658">&Všechny vaše jazyky</translation> <translation id="6499143127267478107">Rozpoznávání hostitele ve skriptu proxy serveru...</translation> <translation id="6503077044568424649">Nejnavštěvovanější</translation> <translation id="6503256918647795660">Švýcarská francouzská klávesnice</translation> @@ -3748,7 +3764,6 @@ <translation id="6555432686520421228">Odebere všechny uživatelské účty a resetuje zařízení <ph name="IDS_SHORT_PRODUCT_NAME" /> na tovární nastavení.</translation> <translation id="6556866813142980365">Opakovat</translation> <translation id="6557565812667414268">Aktivováno pouze pro monitory s vysokou hodnotou DPI.</translation> -<translation id="655845594391856372">Karta neodpovídá. Odeslání nelze provést.</translation> <translation id="6559580823502247193">(již v zařízení)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Rozbalování obrazu pro obnovení...</translation> @@ -3849,6 +3864,7 @@ <translation id="6723354935081862304">Tiskněte do Dokumentů Google a dalších cílů v cloudu. Chcete-li tisknout do služby Google Cloud Print, <ph name="BEGIN_LINK" />přihlaste se<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">Importovat záložky a nastavení...</translation> <translation id="6723839937902243910">Napájení</translation> +<translation id="6725240607822645708">Spouštět editor IME v samostatném podprocesu</translation> <translation id="6725970970008349185">Počet zobrazených návrhů na stránku</translation> <translation id="672609503628871915">Co je nového</translation> <translation id="6727005317916125192">Předchozí podokno</translation> @@ -3978,12 +3994,11 @@ <translation id="6948736568813450284">Pro vývojáře: K volání rozhraní Google Payments API používat izolovanou službu (sandbox).</translation> <translation id="6949306908218145636">Přidat do záložek otevřené stránky...</translation> <translation id="695164542422037736">Pokud je tato možnost aktivní a tělo využívá styl background-attachment:fixed, pozadí bude mít vlastní skládanou vrstvu.</translation> -<translation id="6952626679169241027">Aplikace <ph name="PASSWORD_MANAGER_BRAND" /> si pamatuje vaše hesla a automaticky vás v tomto zařízení přihlašuje na weby.</translation> <translation id="6955446738988643816">Prozkoumat vyskakovací okna</translation> <translation id="695755122858488207">Nezvolený přepínač</translation> +<translation id="6960277925159781810">Automatické přihlášení na tomto zařízení</translation> <translation id="696036063053180184">3 sady (bez klávesy Shift)</translation> <translation id="696203921837389374">Aktivovat synchronizaci pomocí mobilního datového připojení</translation> -<translation id="6964308487066031935">Přidat složky do rozšíření <ph name="EXTENSION" />?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Zařízení</translation> @@ -4084,7 +4099,6 @@ <translation id="7076293881109082629">Přihlášení</translation> <translation id="7077829361966535409">Přihlašovací stránku se pomocí aktuálního nastavení proxy serveru nepodařilo načíst. <ph name="GAIA_RELOAD_LINK_START" />Zkuste se prosím přihlásit znovu<ph name="GAIA_RELOAD_LINK_END" />, nebo použijte jiné <ph name="PROXY_SETTINGS_LINK_START" />nastavení proxy serveru<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignorované obslužné nástroje protokolů</translation> -<translation id="7079038783243627996">Rozšíření <ph name="EXTENSION" /> bude moci číst a mazat obrázky, videa a zvukové soubory v zaškrtnutých položkách.</translation> <translation id="708060913198414444">K&opírovat adresu zvukového souboru</translation> <translation id="708187310695946552">Bublinové uživatelské rozhraní obnovení relace</translation> <translation id="7082055294850503883">Ve výchozím nastavení ignorovat stav funkce CapsLock a zadávat malá písmena</translation> @@ -4228,6 +4242,8 @@ <translation id="7313804056609272439">Metoda zadávání vietnamštiny (VNI)</translation> <translation id="7314244761674113881">Hostitel protokolu SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (aktuální)</translation> +<translation id="7321545336522791733">Server je nedostupný</translation> +<translation id="7324841169865301118">Umožňuje uživateli vybrat kartu pro sdílení plochy.</translation> <translation id="7325437708553334317">Rozšíření Vysoký kontrast</translation> <translation id="7326565110843845436">Aktivovat klepnutí třemi prsty na touchpad</translation> <translation id="73289266812733869">Nevybráno</translation> @@ -4450,7 +4466,6 @@ <translation id="7650511557061837441">Rozšíření <ph name="TRIGGERING_EXTENSION_NAME" /> by chtělo odebrat rozšíření <ph name="EXTENSION_NAME" />.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> se zobrazuje v tomto jazyce</translation> <translation id="7654941827281939388">Tento účet je v tomto počítači již používán.</translation> -<translation id="7655165758820095116">Objekt MediaSource umožňuje JavaScriptu odesílat data médií přímo do prvku videa.</translation> <translation id="7658239707568436148">Zrušit</translation> <translation id="7659584679870740384">Nemáte oprávnění používat toto zařízení. Kontaktujte administrátora a požádejte jej o oprávnění k přihlášení.</translation> <translation id="7664620655576155379">Nepodporované zařízení Bluetooth: <ph name="DEVICE_NAME" />.</translation> @@ -4581,6 +4596,7 @@ <translation id="7861215335140947162">&Stažené soubory</translation> <translation id="7864539943188674973">Vypnout Bluetooth</translation> <translation id="7868891395842935202">Aktivuje experimentální platformu ke kontrole přístupu k experimentálním rozhraním API.</translation> +<translation id="7870576007982733437">Pokud je to možné, použít systémového správce stahování</translation> <translation id="7870790288828963061">Nebyly nalezeny žádné novější verze terminálových aplikací. Aktualizaci není třeba provést. Vyjměte jednotku USB.</translation> <translation id="787150342916295244">Skenování platebních karet</translation> <translation id="7874357055309047713">Vždy spouštět na všech webech</translation> @@ -4623,7 +4639,6 @@ <translation id="7918257978052780342">Zaregistrovat</translation> <translation id="7920092496846849526">Zeptali jste se svého rodiče, zda můžete navštívit tuto stránku.</translation> <translation id="7925285046818567682">Čekání na <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824">Aplikace <ph name="PASSWORD_MANAGER_BRAND" /> si pamatuje vaše hesla a automaticky vás v zařízeních přihlašuje do aplikací a na weby.</translation> <translation id="7925686952655276919">Nepoužívat k synchronizaci mobilní datové přenosy</translation> <translation id="7926906273904422255">Označit nezabezpečené zdroje jako nezabezpečené, nebo jako „podezřelé“.</translation> <translation id="7928710562641958568">Vysunout zařízení</translation> @@ -4685,7 +4700,6 @@ Svůj soubor klíče uchovávejte na bezpečném místě. Budete jej potřebovat při vytváření nových verzí svého rozšíření.</translation> <translation id="799923393800005025">Může zobrazit</translation> <translation id="7999338963698132743">Nový Správce úloh</translation> -<translation id="8000004253404706714">U složených animací v modulech vykreslení bude použit zastaralý animační subsystém.</translation> <translation id="8004582292198964060">Prohlížeč</translation> <translation id="8007030362289124303">Baterie je téměř vybitá</translation> <translation id="8008356846765065031">Internet byl odpojen. Zkontrolujte prosím své internetové připojení.</translation> @@ -4815,6 +4829,7 @@ <translation id="8185331656081929126">Zobrazit oznámení, když budou v síti zjištěny nové tiskárny</translation> <translation id="8186609076106987817">Serveru se nepodařilo soubor najít.</translation> <translation id="8186706823560132848">Software</translation> +<translation id="8188120771410500975">&Kontrolovat pravopis v textových polích</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> a ještě <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Připojování k síti poskytovatele <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Spravovat aplikace, rozšíření a motivy</translation> @@ -5208,6 +5223,7 @@ <translation id="8765985713192161328">Spravovat obslužné nástroje...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Uživatelé</translation> +<translation id="8768367823103160496">Zámek ukazatele myši</translation> <translation id="8769662576926275897">Údaje o kartě</translation> <translation id="8770196827482281187">Metoda zadávání perštiny (rozložení ISIRI 2901)</translation> <translation id="8774934320277480003">Horní okraj</translation> @@ -5227,6 +5243,7 @@ <translation id="8795668016723474529">Přidat platební kartu</translation> <translation id="8795916974678578410">Nové okno</translation> <translation id="8798099450830957504">Výchozí</translation> +<translation id="8799127529310003270">Pokud je tato zásada aktivována, volání InputConnection se spouštějí v podprocesu IME a každé volání InputConnection bude namísto kopie editoru komunikovat přímo s vykreslovacím modulem.</translation> <translation id="8799839487311913894">Povolí aktualizaci hesla ve správci hesel po odeslání formuláře pro změnu hesla.</translation> <translation id="8800004011501252845">Zobrazují se cíle pro</translation> <translation id="8800420788467349919">Hlasitost: <ph name="PRECENTAGE" /> %</translation> @@ -5252,6 +5269,7 @@ <translation id="8841142799574815336">Inertní vizuální viewport</translation> <translation id="884264119367021077">Dodací adresa</translation> <translation id="8844238624737526720">Používat novou a optimalizovanou implementaci Správce úloh Chrome.</translation> +<translation id="8845001906332463065">Nápověda</translation> <translation id="8846141544112579928">Vyhledávání klávesnice...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Přepínání režimu klávesou Shift</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 09ebf183..30c9fa8 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Tilføj denne side som bogmærke...</translation> <translation id="1047956942837015229">Sletter <ph name="COUNT" /> elementer...</translation> <translation id="1048597748939794622">Automatisk aktivering for alle lag</translation> +<translation id="1049795001945932310">&Sprogindstillinger</translation> <translation id="1049926623896334335">Word-dokument</translation> <translation id="1054153489933238809">Åbn originalbillede på ny fane</translation> <translation id="1055806300943943258">Søger efter Bluetooth- og USB-enheder…</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Translitteration (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automatiske navneservere</translation> <translation id="1215411991991485844">Der er tilføjet en ny baggrunds-app</translation> +<translation id="1216954813581739968">Aktivér fane til skrivebordsdeling.</translation> <translation id="121827551500866099">Vis alle downloads...</translation> <translation id="122082903575839559">Algoritme for certifikatsignatur</translation> <translation id="1221024147024329929">PKCS #1 MD2 med RSA-kryptering</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Automatisk login mislykkedes</translation> <translation id="1293556467332435079">Filer</translation> <translation id="1294298200424241932">Rediger, hvilke indstillinger der er tillid til:</translation> +<translation id="1295794900245526845">Vælg din konto, der er gemt med <ph name="PASSWORD_MANAGER_BRAND" />, for at logge ind</translation> <translation id="1297175357211070620">Destination</translation> <translation id="1297922636971898492">Google Drev er ikke tilgængeligt lige nu. Uploadet genstarter automatisk, når Google Drev er tilgængeligt igen.</translation> <translation id="1300861494336759522">Omdirigering af søgninger på Windows-skrivebord</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Denne funktion nulstiller din opstartsside, siden Ny fane, din søgemaskine og dine fastgjorte faner. Den deaktiverer også alle udvidelser og rydder midlertidige data, såsom cookies. Dine bogmærker, din historik og dine gemte adgangskoder slettes ikke.</translation> <translation id="1434886155212424586">Startsiden er siden Ny fane</translation> <translation id="1435550882135542937">Nyt design af udvidelsesværktøjslinjen</translation> +<translation id="1436402875660227532">Bemærk! Disse indstillinger bruges ikke længere i dette system, men du kan stadig se og redigere dem.</translation> <translation id="1436784010935106834">Fjernet</translation> <translation id="1438632560381091872">Slå fanernes lyd til</translation> <translation id="1441841714100794440">Vietnamesisk tastatur (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Aktivér understøttelse af virtuelt tastatur.</translation> <translation id="1474079335130556426">Aktivér baggrundstilstanden for Push API. Dette gør, at Chrome kan fortsætte med at køre, efter det sidste vindue er blevet lukket, og at Chrome kan starte ved opstart af operativsystemet, hvis det er nødvendigt for Push API.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" blev ikke uploadet. Der er ikke plads nok i Google Drev.</translation> +<translation id="1476607407192946488">&Sprogindstillinger</translation> <translation id="1476949146811612304">Angiv, hvilken søgemaskine der skal bruges, når du søger via <ph name="BEGIN_LINK" />omnifeltet<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Tokencache for Identity API</translation> <translation id="1478340334823509079">Detaljer: <ph name="FILE_NAME" /></translation> @@ -646,6 +651,7 @@ <translation id="1962233722219655970">Denne side bruger en Native Client-app, der ikke virker på din computer.</translation> <translation id="1965328510789761112">Privat hukommelse</translation> <translation id="1965624977906726414">Har ingen særlige tilladelser.</translation> +<translation id="1968720524450620475">Aktivér handlingsikoner for Webunderretninger.</translation> <translation id="1970746430676306437">Vis side&information</translation> <translation id="197288927597451399">Behold</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> download mislykkedes.</translation> @@ -905,6 +911,7 @@ <translation id="2344262275956902282">Brug tasterne - og = til at bladre igennem en kandidatliste.</translation> <translation id="2347476388323331511">Kunne ikke synkronisere</translation> <translation id="2347991999864119449">Lad mig bestemme, hvornår pluginindhold skal køres</translation> +<translation id="2348165084656290171">Vælg en fane eller hele skærmen for at dele lyd.</translation> <translation id="2350182423316644347">Starter applikation...</translation> <translation id="2350796302381711542">Vil du tillade, at <ph name="HANDLER_HOSTNAME" /> åbner alle <ph name="PROTOCOL" />-links i stedet for <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Sprog og indtastning</translation> @@ -992,6 +999,7 @@ <translation id="247772113373397749">Canadisk tastatur til flere sprog</translation> <translation id="2478176599153288112">Mediefiltilladelser for "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">Du bør kun låse denne <ph name="DEVICE_TYPE" /> op, når din telefon er inden for rækkevidde.</translation> +<translation id="247949520305900375">Del lyd</translation> <translation id="2479780645312551899">Kør alle plugins nu</translation> <translation id="2480626392695177423">Skift mellem fuld/halv bredde for tegnsætningstilstand</translation> <translation id="2481332092278989943">Føj til hylden</translation> @@ -1307,6 +1315,7 @@ <translation id="2889064240420137087">Åbn link med...</translation> <translation id="2889925978073739256">Fortsæt blokering af plugins, der ikke er gemt i sandbox</translation> <translation id="2890624088306605051">Hent kun synkroniserede indstillinger og data</translation> +<translation id="2890678560483811744">Sidereferencen er ugyldig</translation> <translation id="2893168226686371498">Standardbrowser</translation> <translation id="289426338439836048">Andet mobilnetværk...</translation> <translation id="2894745200702272315">Aktiverer en eksperimentel version af funktioner for registrering af kommandoer ved hjælp af "OK Google", som afhænger af hardwaren.</translation> @@ -1335,7 +1344,6 @@ <translation id="2925966894897775835">Sheets</translation> <translation id="2927017729816812676">Cachelagring</translation> <translation id="2927657246008729253">Skift...</translation> -<translation id="2928415919076124714">Skjul værktøjslinjen i fuld skærm</translation> <translation id="2928526264833629376">Fortsæt til Hangouts</translation> <translation id="2930644991850369934">Der opstod et problem under download af genoprettelsesbilledet. Netværksforbindelsen er mistet.</translation> <translation id="293111069139560936">Tillader, at hylden minimerer vinduet, hvis der kun findes ét aktivt vindue, der er knyttet til det element på hylden, der klikkes på.</translation> @@ -1459,6 +1467,7 @@ <translation id="3117812041123364382">Aktivér/deaktiver svævende virtuelt tastatur.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> Hjælp</translation> <translation id="3120430004221004537">Utilstrækkelig kryptering til en angivet handling på: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">Aktivér ikoner på handlingsknapper for Webunderretninger.</translation> <translation id="3121793941267913344">Nulstil denne <ph name="IDS_SHORT_PRODUCT_NAME" />-enhed</translation> <translation id="3122162841865761901">Eksperimenter for Udviklerværktøjer</translation> <translation id="3122464029669770682">CPU</translation> @@ -1579,7 +1588,6 @@ <translation id="3289566588497100676">Nem indtastning af symboler</translation> <translation id="3289856944988573801">Du kan søge efter opdateringer via Ethernet eller Wi-Fi.</translation> <translation id="3293325348208285494">Hurtig start</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" kan læse og skrive billeder, video- og lydfiler i de markerede mapper.</translation> <translation id="3294437725009624529">Gæst</translation> <translation id="329650768420594634">Advarsel om pakkeudvidelse</translation> <translation id="3296763833017966289">Georgisk</translation> @@ -1637,6 +1645,7 @@ <translation id="3338239663705455570">Slovensk tastatur</translation> <translation id="3340978935015468852">indstillinger</translation> <translation id="3341703758641437857">Tillad adgang til webadresser på filer</translation> +<translation id="3343813173145836998">Du kan nemt logge ind på denne enhed</translation> <translation id="3344786168130157628">Adgangspunkt:</translation> <translation id="3345135638360864351">Din anmodning om at få adgang til dette website kunne ikke sendes til <ph name="NAME" />. Prøv igen.</translation> <translation id="3345886924813989455">Der blev ikke fundet en understøttet browser</translation> @@ -2116,6 +2125,7 @@ <translation id="3996912167543967198">Nulstiller...</translation> <translation id="3997015411467176489">Eksperimentelle kanvasfunktioner</translation> <translation id="40027638859996362">Flytning af ord</translation> +<translation id="400554499662786523">Vælg en fane for at dele lyd.</translation> <translation id="4012550234655138030">Konfigurer eller administrer printere i <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Vil du reparere "<ph name="EXTENSION_NAME" />"?</translation> <translation id="4018133169783460046">Vis <ph name="PRODUCT_NAME" /> på dette sprog</translation> @@ -2217,6 +2227,7 @@ <translation id="4180788401304023883">Vil du slette CA-certifikatet "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">Russisk fonetisk (YaZHert) tastatur</translation> <translation id="4181841719683918333">Sprog</translation> +<translation id="4187248015940562149">Aktiverer Web-Bluetooth, der kan give websites tilladelse til at oprette forbindelse til og styre Bluetooth-enheder i nærheden af dig.</translation> <translation id="4188026131102273494">Søgeord:</translation> <translation id="4189406272289638749">Udvidelsen <b><ph name="EXTENSION_NAME" /></b> styrer denne indstilling.</translation> <translation id="4193154014135846272">Google-dokument</translation> @@ -2273,6 +2284,7 @@ <translation id="4268025649754414643">Omsætning af nøgle til kode</translation> <translation id="4268574628540273656">Webadresse:</translation> <translation id="4270393598798225102">Version <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Ingen resultater</translation> <translation id="4274187853770964845">Synkroniseringsfejl: Stop og genstart synkronisering.</translation> <translation id="4275830172053184480">Genstart din enhed</translation> <translation id="4276796043975446927">Velkommen til Chromebox videokonference</translation> @@ -2342,6 +2354,7 @@ <translation id="4378551569595875038">Opretter forbindelse...</translation> <translation id="438122767399415311">Gennemtving retning for brugerfladen</translation> <translation id="4381849418013903196">Kolon</translation> +<translation id="4383192539467954373">Log automatisk ind på alle enheder</translation> <translation id="4384652540891215547">Aktivér udvidelsen</translation> <translation id="438503109373656455">Tarok</translation> <translation id="4387554346626014084">Aktivér synkronisering af Appliste. Dermed aktiveres også Mapper hvor muligt (ikke OSX).</translation> @@ -2359,6 +2372,7 @@ <translation id="4421932782753506458">Pjuske</translation> <translation id="4422347585044846479">Rediger bogmærke for denne side</translation> <translation id="4422428420715047158">Domæne:</translation> +<translation id="4423482519432579560">&Stavekontrol</translation> <translation id="442477792133831654">Kommuniker med enheder i nærheden</translation> <translation id="4425149324548788773">Mit drev</translation> <translation id="4428582326923056538">Kameraundtagelserne for Adobe Flash Player er forskellige.</translation> @@ -2373,6 +2387,7 @@ <translation id="444267095790823769">Undtagelser for beskyttet indhold</translation> <translation id="4443536555189480885">&Hjælp</translation> <translation id="4444304522807523469">Få adgang til dokumentscannere, der er forbundet via USB eller det lokale netværk</translation> +<translation id="4445559854264555037">Kan du ikke se din enhed? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Spejlet</translation> <translation id="4447465454292850432">Batteri:</translation> <translation id="4449935293120761385">Om AutoFyld</translation> @@ -2630,6 +2645,7 @@ <translation id="485316830061041779">Tysk</translation> <translation id="4856478137399998590">Din mobildatatjeneste er aktiveret og klar til brug</translation> <translation id="4858913220355269194">Laudrup</translation> +<translation id="4860565041166337978">Tillad, at downloads administreres af systemets downloadadministrator, når det er relevant.</translation> <translation id="48607902311828362">Flytilstand</translation> <translation id="4861833787540810454">&Spil</translation> <translation id="4862050643946421924">Tilføjer enhed…</translation> @@ -2713,7 +2729,6 @@ <translation id="4977942889532008999">Bekræft adgang</translation> <translation id="4982718461356080574">Knapper til lukning af inaktive faner skjules i staktilstand</translation> <translation id="498294082491145744">Skift de indstillinger, der kontrollerer websites' adgang til funktioner, som f.eks. cookies, JavaScript, plugins, geografisk placering, mikrofon, kamera osv.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Sider</translation> <translation id="4988792151665380515">Den offentlige nøgle kunne ikke eksporteres.</translation> <translation id="49896407730300355">Roter m&od uret</translation> @@ -2901,7 +2916,6 @@ <translation id="5268606875983318825">PPAPI (ikke i gang)</translation> <translation id="526926484727016706">Bevirker, at alle iframes som standard nægtes alle tilladelser. Hvis du vil godkende bestemte tilladelser for en iframe, er du muligvis nødt til at angive navnene på disse tilladelser som værdier af nye iframe-attributter.</translation> <translation id="5269977353971873915">Udskrift mislykkedes</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" kan læse billeder, video- og lydfiler i de markerede mapper.</translation> <translation id="5271247532544265821">Skift mellem forenklet/traditionelt kinesisk</translation> <translation id="5271549068863921519">Gem adgangskode</translation> <translation id="5273628206174272911">Eksperimentel funktion, der muliggør vandret rulning i historikken.</translation> @@ -2938,6 +2952,7 @@ <translation id="5316716239522500219">Spejlvend skærmene</translation> <translation id="5317780077021120954">Gem</translation> <translation id="5319782540886810524">Lettisk tastatur</translation> +<translation id="532247166573571973">Serveren kan være utilgængelig. Prøv igen senere.</translation> <translation id="5323213332664049067">Latinamerikansk</translation> <translation id="532360961509278431">"$1" kunne ikke åbnes: $2</translation> <translation id="5324674707192845912">Du er ved at framelde denne <ph name="DEVICE_TYPE" /> på Google og deaktivere muligheden for at finde, slette og låse enheden via fjernadgang. Dette kræver en genstart. Vil du fortsætte?</translation> @@ -2990,11 +3005,11 @@ <translation id="5390284375844109566">Indekseret database</translation> <translation id="5392544185395226057">Aktivér understøttelse af Native Client.</translation> <translation id="5393125431335030955">Dette plugin fungerer kun på en computer.</translation> -<translation id="5393559999218790205">Deaktiver brugerfladesammensætning for animationstidslinjer</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> på <ph name="PEPPER_PLUGIN_DOMAIN" /> vil have adgang til din computer.</translation> <translation id="539755880180803351">Angiver forudsigelser som pladsholdertekst i webformularer med Autofyld-felttyper.</translation> <translation id="5397578532367286026">Denne brugers forbrug og historik kan ses af administratoren (<ph name="MANAGER_EMAIL" />) på chrome.com.</translation> <translation id="5397794290049113714">Dig</translation> +<translation id="5398572795982417028">Sidereferencen er ugyldig. Grænsen er <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> fra andre websites</translation> <translation id="5399158067281117682">PIN-koderne stemmer ikke overens!</translation> <translation id="5400640815024374115">TPM-chip (Trusted Platform Module) er deaktiveret eller mangler.</translation> @@ -3014,7 +3029,7 @@ <translation id="5423849171846380976">Aktiveret</translation> <translation id="5425470845862293575">Aktiverer brugen af det eksperimenterende DirectWrite-system til gengivelse af skrifttyper.</translation> <translation id="5425722269016440406">Du skal være online for at kunne deaktivere Smart Lock, da denne indstilling er synkroniseret med din telefon og andre enheder. Opret forbindelse til et netværk først.</translation> -<translation id="5426623592374109001">Anvend gammelt, intrusivt animationsdelsystem til sammensatte animationer i brugerfladen.</translation> +<translation id="5425863515030416387">Du kan nemt logge ind på alle enheder</translation> <translation id="5427459444770871191">Roter med &uret</translation> <translation id="5428105026674456456">Spansk</translation> <translation id="542872847390508405">Du er logget ind som gæst.</translation> @@ -3039,6 +3054,7 @@ <translation id="5451646087589576080">Se ramme&oplysninger</translation> <translation id="5453029940327926427">Luk faner</translation> <translation id="5453632173748266363">Kyrillisk</translation> +<translation id="5454166040603940656">med <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Ugyldig</translation> <translation id="5457459357461771897">Læs og slet billeder, musik og andre medier på din computer</translation> <translation id="5457599981699367932">Anvend som gæst</translation> @@ -3208,7 +3224,6 @@ <translation id="5708171344853220004">Microsoft-hovednavn</translation> <translation id="5709885306771508267">Skala for at knibe sammen</translation> <translation id="5710406368443808765">Ups! Systemet kunne ikke gemme enhedstoken og id.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> svarer ikke. Det er ikke muligt at caste til enheden.</translation> <translation id="5711983031544731014">Enheden kan ikke låses op. Indtast din adgangskode.</translation> <translation id="5712966208980506909">Hvis denne indstilling er aktiveret, indlæses siden med politikken for Material design på webadressen chrome://md-policy.</translation> <translation id="5715711091495208045">Pluginmægler: <ph name="PLUGIN_NAME" /></translation> @@ -3475,7 +3490,6 @@ <translation id="6111974609785983504">Tilladt som standard</translation> <translation id="6113134669445407638">Deaktiver Delay Agnostic AEC i WebRTC. Brug denne indstilling, hvis de rapporterede systemforsinkelser er troværdige, eller hvis andre oplever et ekko fra din computer.</translation> <translation id="6116921718742659598">Rediger indstillingerne for sprog og indtastning</translation> -<translation id="6117536376248197233">Deaktiver gengivelse af sammensætning for animationstidslinjer.</translation> <translation id="6120205520491252677">Fastgør denne side til startskærmen...</translation> <translation id="6122081475643980456">Din internetforbindelse bliver kontrolleret</translation> <translation id="6122093587541546701">E-mail (valgfri):</translation> @@ -3508,6 +3522,7 @@ <translation id="6164005077879661055">Alle filer og lokale data, der er knyttet til den administrerede bruger, slettes permanent, når den administrerede bruger fjernes. Besøgte websites og indstillinger for denne administrerede bruger er muligvis stadig synlige for administratoren på <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Flere oplysninger</translation> +<translation id="6167008112175207002">Dine bogmærker, din historik, dine adgangskoder og andre indstillinger synkroniseres til din Google-konto, så du kan bruge dem på alle dine enheder. Du kan ændre dette under <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Simulerede hardwarefunktioner for "Ok Google"</translation> <translation id="6175314957787328458">Microsoft-domæne-GUID</translation> <translation id="6178664161104547336">Vælg et certifikat</translation> @@ -3711,6 +3726,7 @@ <translation id="648927581764831596">Ingen tilgængelig</translation> <translation id="6490936204492416398">Installer nye fra webbutikken</translation> <translation id="6492313032770352219">Diskstørrelse:</translation> +<translation id="6498249116389603658">&Alle dine sprog</translation> <translation id="6499143127267478107">Værtsløsning i proxyscript...</translation> <translation id="6503077044568424649">Mest besøgte</translation> <translation id="6503256918647795660">Schweizisk (fransk) tastatur</translation> @@ -3752,7 +3768,6 @@ <translation id="6555432686520421228">Fjern alle brugerkonti, og nulstil din <ph name="IDS_SHORT_PRODUCT_NAME" />-enhed, så den er som ny.</translation> <translation id="6556866813142980365">Gør det igen</translation> <translation id="6557565812667414268">Kun aktiveret for skærme med høj DPI</translation> -<translation id="655845594391856372">Fanen svarer ikke. Det er ikke muligt at caste til enheden.</translation> <translation id="6559580823502247193">(findes allerede på denne enhed)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Dekompilerer genoprettelsesbillede...</translation> @@ -3853,6 +3868,7 @@ <translation id="6723354935081862304">Udskriv til Google Docs og andre cloud-destinationer. <ph name="BEGIN_LINK" />Log ind<ph name="END_LINK" /> for at udskrive til Google Cloudprinter.</translation> <translation id="6723661294526996303">Importer bogmærker og indstillinger</translation> <translation id="6723839937902243910">Strøm</translation> +<translation id="6725240607822645708">Kør IME i sin egen tråd.</translation> <translation id="6725970970008349185">Antal kandidater, der skal vises pr. side</translation> <translation id="672609503628871915">Se de nye funktioner</translation> <translation id="6727005317916125192">Forrige rude</translation> @@ -3983,12 +3999,11 @@ <translation id="6948736568813450284">Til udviklere: Brug sandbox-tjenesten til Google Payments API-kald.</translation> <translation id="6949306908218145636">Tilføjer åbne sider som bogmærke...</translation> <translation id="695164542422037736">Hvis dette er aktiveret, og hvis teksten er stylet med background-attachment:fixed, vil baggrunden have sit eget sammensatte lag.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> husker dine adgangskoder og logger dig automatisk ind på websites på denne enhed.</translation> <translation id="6955446738988643816">Undersøg pop op-vindue</translation> <translation id="695755122858488207">Ikke-valgte alternativknapper</translation> +<translation id="6960277925159781810">Log automatisk ind på denne enhed</translation> <translation id="696036063053180184">3-sæt (ingen shift)</translation> <translation id="696203921837389374">Aktivér synkronisering via mobildata</translation> -<translation id="6964308487066031935">Vil du føje mapperne til "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Enhed</translation> @@ -4086,7 +4101,6 @@ <translation id="7076293881109082629">Login</translation> <translation id="7077829361966535409">Loginsiden kunne ikke indlæses med de aktuelle proxyindstillinger. <ph name="GAIA_RELOAD_LINK_START" />Prøv at logge ind igen<ph name="GAIA_RELOAD_LINK_END" />, eller brug nogle andre <ph name="PROXY_SETTINGS_LINK_START" />proxyindstillinger<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignorerede protokolhåndteringer</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" kan læse og slette billeder, video- og lydfiler i de markerede mapper.</translation> <translation id="708060913198414444">K&opiér webadressen til lyden</translation> <translation id="708187310695946552">Boblegrænseflade for gendannelse af session</translation> <translation id="7082055294850503883">Ignorer som standard CapsLock og indtastning af små bogstaver</translation> @@ -4230,6 +4244,8 @@ <translation id="7313804056609272439">Vietnamesisk indtastningsmetode (VNI)</translation> <translation id="7314244761674113881">SOCKS-host</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (nuværende)</translation> +<translation id="7321545336522791733">Serveren er utilgængelig</translation> +<translation id="7324841169865301118">Giver brugeren mulighed for at vælge en fane til skrivebordsdeling.</translation> <translation id="7325437708553334317">Udvidelsen Høj kontrast</translation> <translation id="7326565110843845436">Trefingerklik på touchpad</translation> <translation id="73289266812733869">Ikke valgt</translation> @@ -4456,7 +4472,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" vil gerne fjerne "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> vises på dette sprog</translation> <translation id="7654941827281939388">Denne konto er allerede i brug på denne computer.</translation> -<translation id="7655165758820095116">MediaSource-objektet gør det muligt for JavaScript at sende mediedata direkte til et videoelement.</translation> <translation id="7658239707568436148">Annuller</translation> <translation id="7659584679870740384">Du har ikke tilladelse til at bruge denne enhed. Kontakt administratoren for at få tilladelse til at logge ind.</translation> <translation id="7664620655576155379">Ikke-understøttet Bluetooth-enhed: "<ph name="DEVICE_NAME" />".</translation> @@ -4587,6 +4602,7 @@ <translation id="7861215335140947162">&Downloads</translation> <translation id="7864539943188674973">Deaktiver Bluetooth</translation> <translation id="7868891395842935202">Aktiverer den eksperimentelle struktur for styring af adgang til API-eksperimenter.</translation> +<translation id="7870576007982733437">Brug systemets downloadadministrator, når det er relevant.</translation> <translation id="7870790288828963061">Der blev ikke fundet nogen terminalapps med en nyere version. Intet at opdatere. Fjern USB-stikket.</translation> <translation id="787150342916295244">Scanning af kreditkort</translation> <translation id="7874357055309047713">Kør altid på alle websites</translation> @@ -4629,7 +4645,6 @@ <translation id="7918257978052780342">Tilmeld dig</translation> <translation id="7920092496846849526">Du har spurgt en af dine forældre, om det er i orden, at du besøger denne side.</translation> <translation id="7925285046818567682">Venter på <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> husker dine adgangskoder og logger dig automatisk ind på apps og websites på alle enheder.</translation> <translation id="7925686952655276919">Brug ikke mobildata til synkronisering</translation> <translation id="7926906273904422255">Markér usikre kilder som "usikre" eller "tvivlsomme".</translation> <translation id="7928710562641958568">Skub enheden ud</translation> @@ -4691,7 +4706,6 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye versioner af din udvidelse.</translation> <translation id="799923393800005025">Kan se</translation> <translation id="7999338963698132743">Ny Jobliste</translation> -<translation id="8000004253404706714">Anvend gengivelse af gammelt, intrusivt animationsdelsystem til sammensatte animationer.</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8007030362289124303">Lavt batteriniveau</translation> <translation id="8008356846765065031">Internetforbindelsen blev afbrudt. Kontrollér din internetforbindelse.</translation> @@ -4821,6 +4835,7 @@ <translation id="8185331656081929126">Vis underretninger, når der registreres nye printere på netværket</translation> <translation id="8186609076106987817">Serveren kunne ikke finde filen.</translation> <translation id="8186706823560132848">Software</translation> +<translation id="8188120771410500975">&Kontrollér stavning i tekstfelter</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> og <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> andre</translation> <translation id="8190193592390505034">Forbinder til <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Administrere dine apps, udvidelser og temaer</translation> @@ -5214,6 +5229,7 @@ <translation id="8765985713192161328">Administrer håndtering...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Brugere</translation> +<translation id="8768367823103160496">Lås musemarkør</translation> <translation id="8769662576926275897">Kortoplysninger</translation> <translation id="8770196827482281187">Persisk indtastningsmetode (ISIRI 2901-layout)</translation> <translation id="8774934320277480003">Topmargen</translation> @@ -5233,6 +5249,7 @@ <translation id="8795668016723474529">Tilføj et kreditkort</translation> <translation id="8795916974678578410">Nyt vindue</translation> <translation id="8798099450830957504">Standard</translation> +<translation id="8799127529310003270">Hvis InputConnection aktiveres, køres kaldene i IME-tråden, og i stedet for at have et kopiredigeringsværktøj kommunikerer hvert InputConnection-opkald direkte med gengivelsen.</translation> <translation id="8799839487311913894">Aktivér opdatering af en adgangskode i adgangskodeadministrator efter indsendelse af en "skift adgangskode"-formular.</translation> <translation id="8800004011501252845">Viser destinationer for</translation> <translation id="8800420788467349919">Lydstyrke: <ph name="PRECENTAGE" /> %</translation> @@ -5258,6 +5275,7 @@ <translation id="8841142799574815336">Inaktiv visuel visning.</translation> <translation id="884264119367021077">Leveringsadresse</translation> <translation id="8844238624737526720">Brug den nye og optimerede implementering af Jobliste i Chrome.</translation> +<translation id="8845001906332463065">Få hjælp</translation> <translation id="8846141544112579928">Søger efter tastatur...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Skift mellem tilstande for Shift-tast</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 1a77f98..4b97566f 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Lesezeichen für diese Seite erstellen</translation> <translation id="1047956942837015229"><ph name="COUNT" /> Elemente werden gelöscht...</translation> <translation id="1048597748939794622">Erzwingt die Einstellung auf allen Ebenen</translation> +<translation id="1049795001945932310">&Spracheinstellungen</translation> <translation id="1049926623896334335">Word-Dokument</translation> <translation id="1054153489933238809">&Original in neuem Tab öffnen</translation> <translation id="1055806300943943258">Suche nach Bluetooth- und USB-Geräten...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliteration (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automatische Wahl des Nameservers</translation> <translation id="1215411991991485844">Neue Hintergrund-App hinzugefügt</translation> +<translation id="1216954813581739968">Tab "Für Desktopfreigabe" aktivieren.</translation> <translation id="121827551500866099">Alle Downloads anzeigen...</translation> <translation id="122082903575839559">Algorithmus für Zertifikatsignatur</translation> <translation id="1221024147024329929">PKCS #1 MD2 mit RSA-Verschlüsselung</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Fehler bei der automatischen Anmeldung</translation> <translation id="1293556467332435079">Dateien</translation> <translation id="1294298200424241932">Vertrauenseinstellungen bearbeiten:</translation> +<translation id="1295794900245526845">Zum Anmelden das mit <ph name="PASSWORD_MANAGER_BRAND" /> gespeicherte Konto auswählen</translation> <translation id="1297175357211070620">Ziel</translation> <translation id="1297922636971898492">Google Drive ist momentan nicht verfügbar. Das Hochladen Ihrer Dateien wird automatisch fortgesetzt, sobald Google Drive wieder verfügbar ist.</translation> <translation id="1300861494336759522">Windows-Desktopsuche weiterleiten</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Mit dieser Funktion werden Ihre Startseite, Ihre Suchmaschine, die "Neuer Tab"-Seite und angeheftete Tabs zurückgesetzt. Außerdem werden alle Erweiterungen deaktiviert und temporäre Daten wie Cookies gelöscht. Ihre Lesezeichen, der Verlauf und gespeicherte Passwörter werden nicht gelöscht.</translation> <translation id="1434886155212424586">Die "Neuer Tab"-Seite ist die Startseite.</translation> <translation id="1435550882135542937">Neues Design der Erweiterungssymbolleiste</translation> +<translation id="1436402875660227532">Hinweis: Diese Einstellungen werden in diesem System nicht mehr verwendet. Sie können sie aber weiterhin ansehen und bearbeiten.</translation> <translation id="1436784010935106834">Entfernt</translation> <translation id="1438632560381091872">Stummschaltung der Tabs aufheben</translation> <translation id="1441841714100794440">Vietnamesische Tastatur (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Aktiviert die Unterstützung für die Bildschirmtastatur.</translation> <translation id="1474079335130556426">Aktivieren Sie für die Push API den Hintergrundmodus. Dadurch kann Chrome nach dem Schließen des letzten Fensters weiter ausgeführt und beim Hochfahren des Betriebssystems gestartet werden, sofern dies für die Push API erforderlich ist.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" konnte nicht hochgeladen werden. In Ihrem Google Drive-Konto ist nicht genügend Speicherplatz frei.</translation> +<translation id="1476607407192946488">&Spracheinstellungen</translation> <translation id="1476949146811612304">Legen Sie fest, welche Suchmaschine bei einer Suche über die <ph name="BEGIN_LINK" />Omnibox<ph name="END_LINK" /> verwendet werden soll.</translation> <translation id="1477301030751268706">Token-Cache für die Identity API</translation> <translation id="1478340334823509079">Details: <ph name="FILE_NAME" /></translation> @@ -646,6 +651,7 @@ <translation id="1962233722219655970">Diese Seite verwendet eine Native Client App, die auf Ihrem Computer nicht funktioniert.</translation> <translation id="1965328510789761112">Privater Speicher</translation> <translation id="1965624977906726414">Erfordert keine besonderen Berechtigungen</translation> +<translation id="1968720524450620475">Aktionssymbole für Webbenachrichtigungen aktivieren.</translation> <translation id="1970746430676306437">Seiten&info anzeigen</translation> <translation id="197288927597451399">Behalten</translation> <translation id="1973491249112991739">Fehler beim Download von <ph name="PLUGIN_NAME" /></translation> @@ -905,6 +911,7 @@ <translation id="2344262275956902282">Kandidatenliste mit den Tasten "-" und "=" paginieren</translation> <translation id="2347476388323331511">Synchronisierung nicht möglich</translation> <translation id="2347991999864119449">Selbst auswählen, wann Plug-in-Inhalte ausgeführt werden sollen</translation> +<translation id="2348165084656290171">Wählen Sie zum Freigeben von Audioinhalten einen Tab oder den gesamten Bildschirm aus.</translation> <translation id="2350182423316644347">App wird gestartet...</translation> <translation id="2350796302381711542">Öffnen aller <ph name="PROTOCOL" />-Links durch <ph name="HANDLER_HOSTNAME" /> anstatt <ph name="REPLACED_HANDLER_TITLE" /> zulassen?</translation> <translation id="2351266942280602854">Sprache und Eingabe</translation> @@ -992,10 +999,11 @@ <translation id="247772113373397749">Kanadische mehrsprachige Tastatur</translation> <translation id="2478176599153288112">Mediendatei-Berechtigungen für "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213"><ph name="DEVICE_TYPE" /> nur entsperren, wenn Ihr Telefon sich in direkter Nähe befindet</translation> +<translation id="247949520305900375">Audio freigeben</translation> <translation id="2479780645312551899">Dieses Mal alle Plug-ins ausführen</translation> <translation id="2480626392695177423">Zwischen Satzzeichen mit ganzer/halber Breite wechseln</translation> <translation id="2481332092278989943">Zu Ablage hinzufügen</translation> -<translation id="2482081114970574549">Nutzt einen Iframe-basierten Anmeldevorgang statt eines auf WebView basierenden Vorgangs.</translation> +<translation id="2482081114970574549">Nutzt einen iFrame-basierten Anmeldevorgang statt eines auf WebView basierenden Vorgangs.</translation> <translation id="2482878487686419369">Benachrichtigungen</translation> <translation id="2485056306054380289">CA-Serverzertifikat:</translation> <translation id="2489316678672211764">Ein Plug-in (<ph name="PLUGIN_NAME" />) reagiert nicht.</translation> @@ -1196,7 +1204,7 @@ <translation id="2778459533137481732">Schwarze Liste für Berechtigungen</translation> <translation id="2779552785085366231">Diese Seite kann zum App Launcher hinzugefügt werden.</translation> <translation id="2781645665747935084">Belgisch</translation> -<translation id="2782688068604007519">Out-of-Process-Iframes</translation> +<translation id="2782688068604007519">Out-of-Process-iFrames</translation> <translation id="2783298271312924866">Heruntergeladen</translation> <translation id="2783321960289401138">Verknüpfung erstellen...</translation> <translation id="2783661497142353826">Kioskanwendungen verwalten</translation> @@ -1305,6 +1313,7 @@ <translation id="2889064240420137087">Link öffnen mit...</translation> <translation id="2889925978073739256">Plug-ins ohne Sandbox weiterhin blockieren</translation> <translation id="2890624088306605051">Nur synchronisierte Einstellungen und Daten abrufen</translation> +<translation id="2890678560483811744">Seitenbereich ist zu groß</translation> <translation id="2893168226686371498">Standardbrowser</translation> <translation id="289426338439836048">Anderes Mobilfunknetz...</translation> <translation id="2894745200702272315">Hiermit wird eine experimentelle Version der "Ok Google"-Hotworderkennung mit Hardware-Abhängigkeit aktiviert.</translation> @@ -1333,7 +1342,6 @@ <translation id="2925966894897775835">Tabellen</translation> <translation id="2927017729816812676">Cache-Speicher</translation> <translation id="2927657246008729253">Ändern...</translation> -<translation id="2928415919076124714">Symbolleiste im Vollbildmodus ausblenden</translation> <translation id="2928526264833629376">Weiter zu Hangouts</translation> <translation id="2930644991850369934">Beim Download des Wiederherstellungsabbilds ist ein Problem aufgetreten. Die Netzwerkverbindung wurde unterbrochen.</translation> <translation id="293111069139560936">Ermöglicht das Minimieren eines Fensters in der Ablage, wenn auf ein Ablagenelement geklickt wird, dem nur ein einziges, bereits aktives Fenster zugeordnet ist.</translation> @@ -1387,7 +1395,7 @@ <translation id="3010279545267083280">Passwort wurde gelöscht.</translation> <translation id="3011284594919057757">Über Flash</translation> <translation id="3011362742078013760">Alle Lesezeichen in &Inkognito-Fenster öffnen</translation> -<translation id="3012631534724231212">(Iframe)</translation> +<translation id="3012631534724231212">(iFrame)</translation> <translation id="3012804260437125868">Nur bei sicheren Verbindungen zur gleichen Website</translation> <translation id="3012890944909934180">Chrome auf dem Desktop neu starten</translation> <translation id="3012917896646559015">Wenden Sie sich bitte umgehend an Ihren Hardware-Hersteller, um Ihren Computer an eine Reparaturwerkstatt zu senden.</translation> @@ -1457,6 +1465,7 @@ <translation id="3117812041123364382">Aktiviert/deaktiviert die schwebende Bildschirmtastatur</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" />-Hilfe</translation> <translation id="3120430004221004537">Unzureichende Verschlüsselung für einen bestimmten Vorgang auf folgendem Gerät: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">Symbole in Aktionsschaltflächen für Webbenachrichtigungen aktivieren.</translation> <translation id="3121793941267913344"><ph name="IDS_SHORT_PRODUCT_NAME" />-Gerät zurücksetzen</translation> <translation id="3122162841865761901">Entwicklertool-Experimente</translation> <translation id="3122464029669770682">CPU</translation> @@ -1577,7 +1586,6 @@ <translation id="3289566588497100676">Einfache Symboleingabe</translation> <translation id="3289856944988573801">Verwenden Sie Ethernet oder WLAN zur Suche nach Updates.</translation> <translation id="3293325348208285494">Schnellstart</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" kann Bilder, Videos und Audiodateien in den ausgewählten Ordnern lesen und schreiben.</translation> <translation id="3294437725009624529">Gast</translation> <translation id="329650768420594634">Erweiterung packen: Warnung</translation> <translation id="3296763833017966289">Georgisch</translation> @@ -1635,6 +1643,7 @@ <translation id="3338239663705455570">Slowenische Tastatur</translation> <translation id="3340978935015468852">Einstellungen</translation> <translation id="3341703758641437857">Zugriff auf Datei-URLs zulassen</translation> +<translation id="3343813173145836998">Einfach auf diesem Gerät anmelden</translation> <translation id="3344786168130157628">Name des Zugangspunkts:</translation> <translation id="3345135638360864351">Ihre Zugriffsanfrage für diese Website konnte nicht an <ph name="NAME" /> gesendet werden. Bitte versuchen Sie es erneut.</translation> <translation id="3345886924813989455">Keine unterstützten Browser gefunden</translation> @@ -1728,7 +1737,7 @@ <translation id="3481915276125965083">Die folgenden Pop-ups wurden auf dieser Seite blockiert:</translation> <translation id="3484869148456018791">Neues Zertifikat anfordern</translation> <translation id="3487007233252413104">Anonyme Funktion</translation> -<translation id="348771913750618459">Iframe-basierte Anmeldevorgänge</translation> +<translation id="348771913750618459">iFrame-basierte Anmeldevorgänge</translation> <translation id="348780365869651045">Warten auf AppCache...</translation> <translation id="3488065109653206955">Teilweise aktiviert</translation> <translation id="3489147694311384940">MTP-Schreibunterstützung in der Dateisystem API und im Dateimanager. Vorgänge für die Direktbearbeitung werden nicht unterstützt.</translation> @@ -1880,7 +1889,7 @@ <translation id="367645871420407123">Leer lassen, wenn Sie für das Root-Passwort den Standardtestwert festlegen möchten</translation> <translation id="3678156199662914018">Erweiterung: <ph name="EXTENSION_NAME" /></translation> <translation id="3678559383040232393">Maltesische Tastatur</translation> -<translation id="3680173818488851340">Iframes mit geringer Priorität.</translation> +<translation id="3680173818488851340">iFrames mit geringer Priorität.</translation> <translation id="3683524264665795342">Anfrage zur Bildschirmfreigabe durch <ph name="APP_NAME" /></translation> <translation id="3685122418104378273">Die Google Drive-Synchronisierung ist bei der mobilen Datennutzung standardmäßig deaktiviert.</translation> <translation id="3685387984467886507">Entscheidungen zum Umgang mit SSL-Fehlern für einen bestimmten Zeitraum merken</translation> @@ -2114,6 +2123,7 @@ <translation id="3996912167543967198">Einstellungen werden zurückgesetzt...</translation> <translation id="3997015411467176489">Experimentelle Canvas-Funktionen</translation> <translation id="40027638859996362">Wort verschieben</translation> +<translation id="400554499662786523">Wählen Sie zum Freigeben von Audioinhalten einen Tab aus.</translation> <translation id="4012550234655138030">Drucker in <ph name="CLOUD_PRINT_NAME" /> einrichten oder verwalten</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />" reparieren?</translation> <translation id="4018133169783460046"><ph name="PRODUCT_NAME" /> in dieser Sprache anzeigen</translation> @@ -2216,6 +2226,7 @@ <translation id="4180788401304023883">CA-Zertifikat "<ph name="CERTIFICATE_NAME" />" löschen?</translation> <translation id="418179967336296930">Russische Tastatur (YaZHert)</translation> <translation id="4181841719683918333">Sprachen</translation> +<translation id="4187248015940562149">Aktiviert Web Bluetooth, über das Websites eine Verbindung zu Bluetooth-Geräten in Ihrer Nähe herstellen und diese steuern können.</translation> <translation id="4188026131102273494">Suchkürzel:</translation> <translation id="4189406272289638749">Diese Einstellung wird von einer Erweiterung namens <b><ph name="EXTENSION_NAME" /></b> gesteuert.</translation> <translation id="4193154014135846272">Google-Dokument</translation> @@ -2272,6 +2283,7 @@ <translation id="4268025649754414643">Schlüsselverschlüsselung</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Version <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Keine Übereinstimmungen</translation> <translation id="4274187853770964845">Synchronisierungsfehler: Halten Sie die Synchronisierung an und starten Sie sie dann erneut.</translation> <translation id="4275830172053184480">Gerät neu starten</translation> <translation id="4276796043975446927">Willkommen bei Chromebox für Meetings</translation> @@ -2341,6 +2353,7 @@ <translation id="4378551569595875038">Verbindung wird hergestellt...</translation> <translation id="438122767399415311">Richtung der Benutzeroberfläche erzwingen</translation> <translation id="4381849418013903196">Doppelpunkt</translation> +<translation id="4383192539467954373">Automatisch auf verschiedenen Geräten anmelden</translation> <translation id="4384652540891215547">Erweiterung aktivieren</translation> <translation id="438503109373656455">Brauner</translation> <translation id="4387554346626014084">App Launcher-Synchronisierung aktivieren. Hierdurch werden gegebenenfalls auch Ordner aktiviert (nicht bei OSX).</translation> @@ -2358,6 +2371,7 @@ <translation id="4421932782753506458">Miez</translation> <translation id="4422347585044846479">Lesezeichen für diese Seite bearbeiten</translation> <translation id="4422428420715047158">Domain:</translation> +<translation id="4423482519432579560">&Rechtschreibprüfung</translation> <translation id="442477792133831654">Mit Geräten in der Nähe kommunizieren</translation> <translation id="4425149324548788773">Meine Ablage</translation> <translation id="4428582326923056538">Die Adobe Flash Player-Kameraausnahmen unterscheiden sich von den angegebenen.</translation> @@ -2372,6 +2386,7 @@ <translation id="444267095790823769">Ausnahmen bei geschützten Inhalten</translation> <translation id="4443536555189480885">&Hilfe</translation> <translation id="4444304522807523469">Auf Dokumentenscanner zugreifen, die per USB angeschlossen sind oder sich im lokalen Netzwerk befinden</translation> +<translation id="4445559854264555037">Ihr Gerät ist nicht zu sehen? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Gespiegelt</translation> <translation id="4447465454292850432">Akku:</translation> <translation id="4449935293120761385">Über AutoFill</translation> @@ -2627,6 +2642,7 @@ <translation id="485316830061041779">Deutsch</translation> <translation id="4856478137399998590">Ihr mobiler Datendienst ist aktiviert und einsatzbereit.</translation> <translation id="4858913220355269194">Fußball</translation> +<translation id="4860565041166337978">Downloads dürfen, sofern möglich, vom Downloadmanager des Systems verarbeitet werden.</translation> <translation id="48607902311828362">Flugmodus</translation> <translation id="4861833787540810454">&Start</translation> <translation id="4862050643946421924">Gerät hinzufügen...</translation> @@ -2710,7 +2726,6 @@ <translation id="4977942889532008999">Zugriff bestätigen</translation> <translation id="4982718461356080574">Ausblenden der Schaltflächen zum Schließen inaktiver Tabs beim Stapeln</translation> <translation id="498294082491145744">Einstellungen ändern, über die der Websitezugriff auf Cookies, JavaScript, Plug-ins, Standort, Mikrofon, Kamera und ähnliche Funktionen gesteuert wird</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Seiten</translation> <translation id="4988792151665380515">Öffentlicher Schlüssel konnte nicht exportiert werden.</translation> <translation id="49896407730300355">&Gegen den Uhrzeigersinn drehen</translation> @@ -2895,9 +2910,8 @@ <translation id="5265562206369321422">Seit über einer Woche offline</translation> <translation id="5266113311903163739">Zertifizierungsstelle - Fehler beim Import</translation> <translation id="5268606875983318825">PPAPI (Out-of-Process)</translation> -<translation id="526926484727016706">Allen Iframes werden alle Berechtigungen standardmäßig verweigert. Um einem Iframe bestimmte Berechtigungen zu erteilen, müssen gegebenenfalls die Namen dieser Berechtigungen als Werte neuer Iframe-Attribute aufgeführt werden.</translation> +<translation id="526926484727016706">Allen iFrames werden alle Berechtigungen standardmäßig verweigert. Um einem iFrame bestimmte Berechtigungen zu erteilen, müssen gegebenenfalls die Namen dieser Berechtigungen als Werte neuer iFrame-Attribute aufgeführt werden.</translation> <translation id="5269977353971873915">Fehler beim Drucken</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" kann Bilder, Videos und Audiodateien in den ausgewählten Ordnern lesen.</translation> <translation id="5271247532544265821">Zwischen Modi für vereinfachtes/traditionelles Chinesisch umschalten</translation> <translation id="5271549068863921519">Passwort speichern</translation> <translation id="5273628206174272911">Experimentelle Navigation im Verlauf durch waagrechten Overscroll</translation> @@ -2934,6 +2948,7 @@ <translation id="5316716239522500219">Monitore spiegeln</translation> <translation id="5317780077021120954">Speichern</translation> <translation id="5319782540886810524">Lettische Tastatur</translation> +<translation id="532247166573571973">Der Server ist möglicherweise nicht erreichbar. Versuchen Sie es später noch einmal.</translation> <translation id="5323213332664049067">Lateinamerikanisch</translation> <translation id="532360961509278431">"$1" kann nicht geöffnet werden: $2</translation> <translation id="5324674707192845912">Sie möchten die <ph name="DEVICE_TYPE" />-Registrierung bei Google aufheben, um das Lokalisieren, Löschen und Sperren des Geräts per Remotezugriff zu deaktivieren. Dazu ist ein Neustart erforderlich. Möchten Sie fortfahren?</translation> @@ -2986,11 +3001,11 @@ <translation id="5390284375844109566">Indexierte Datenbank</translation> <translation id="5392544185395226057">Support für Native Client aktivieren</translation> <translation id="5393125431335030955">Dieses Plug-in funktioniert nur auf dem Desktop.</translation> -<translation id="5393559999218790205">Zeitachsen für die Animationszusammensetzung in der Benutzeroberfläche deaktivieren</translation> <translation id="5396126354477659676">Das Plug-in <ph name="PEPPER_PLUGIN_NAME" /> auf <ph name="PEPPER_PLUGIN_DOMAIN" /> möchte auf Ihren Computer zugreifen.</translation> <translation id="539755880180803351">Versieht Web-Formulare mit AutoFill-Eingabevorschlägen als Platzhaltertext</translation> <translation id="5397578532367286026">Die Nutzung und der Verlauf des Nutzers sind für den Manager (<ph name="MANAGER_EMAIL" />) unter chrome.com einsehbar.</translation> <translation id="5397794290049113714">Ich</translation> +<translation id="5398572795982417028">Der Seitenbereich ist zu groß. Die maximale Seitenanzahl liegt bei <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> von anderen Websites</translation> <translation id="5399158067281117682">PINs stimmen nicht überein!</translation> <translation id="5400640815024374115">Der TPM-Chip (Trusted Platform Module) ist deaktiviert oder fehlt.</translation> @@ -3010,7 +3025,7 @@ <translation id="5423849171846380976">Aktiviert</translation> <translation id="5425470845862293575">Aktivierung der Nutzung des experimentellen DirectWrite-Systems für die Schriftdarstellung</translation> <translation id="5425722269016440406">Zur Deaktivierung von Smart Lock muss eine Internetverbindung bestehen, da diese Einstellung mit Ihrem Telefon und anderen Geräten synchronisiert wird. Stellen Sie zunächst eine Verbindung zu einem Netzwerk her.</translation> -<translation id="5426623592374109001">Verwendet das alte, einschränkende Animationssubsystem für zusammengesetzte Animationen in der Benutzeroberfläche.</translation> +<translation id="5425863515030416387">Einfach auf verschiedenen Geräten anmelden</translation> <translation id="5427459444770871191">Im &Uhrzeigersinn drehen</translation> <translation id="5428105026674456456">Spanisch</translation> <translation id="542872847390508405">Der Gastmodus ist aktiviert.</translation> @@ -3035,6 +3050,7 @@ <translation id="5451646087589576080">Frame&informationen anzeigen</translation> <translation id="5453029940327926427">Tabs schließen</translation> <translation id="5453632173748266363">Kyrillisch</translation> +<translation id="5454166040603940656">mit <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Ungültig</translation> <translation id="5457459357461771897">Fotos, Musik und andere Medien auf Ihrem Computer lesen und löschen</translation> <translation id="5457599981699367932">Als Gast nutzen</translation> @@ -3204,7 +3220,6 @@ <translation id="5708171344853220004">Microsoft-Prinzipalname</translation> <translation id="5709885306771508267">Per Zusammenziehen skalieren</translation> <translation id="5710406368443808765">Hoppla! Das System konnte das Gerätetoken und die ID nicht speichern.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> antwortet nicht. Streaming nicht möglich.</translation> <translation id="5711983031544731014">Entsperren nicht möglich. Bitte geben Sie Ihr Passwort ein,</translation> <translation id="5712966208980506909">Wenn die Option ausgewählt ist, lädt die URL chrome://md-policy die Seite der Material Design-Richtlinien.</translation> <translation id="5715711091495208045">Plug-in-Broker: <ph name="PLUGIN_NAME" /></translation> @@ -3471,7 +3486,6 @@ <translation id="6111974609785983504">Standardmäßig zugelassen</translation> <translation id="6113134669445407638">Deaktiviert "Delay Agnostic AEC" in WebRTC. Verwenden Sie diese Markierung, wenn gemeldete Systemverzögerungen vertrauenswürdig sind oder wenn andere ein Echo von Ihrem Gerät wahrnehmen.</translation> <translation id="6116921718742659598">Sprach- und Eingabeeinstellungen ändern</translation> -<translation id="6117536376248197233">Zeitachsen für die Animationszusammensetzung in Renderern deaktivieren.</translation> <translation id="6120205520491252677">Diese Seite an Startbildschirm anheften...</translation> <translation id="6122081475643980456">Internetverbindung wird kontrolliert</translation> <translation id="6122093587541546701">E-Mail-Adresse (optional):</translation> @@ -3503,6 +3517,7 @@ <translation id="6163522313638838258">Alle anzeigen...</translation> <translation id="6164005077879661055">Durch das Entfernen des betreuten Nutzers werden alle mit ihm verknüpften Dateien und lokalen Daten endgültig gelöscht. Besuchte Websites und Einstellungen des betreuten Nutzers kann der Manager möglicherweise weiterhin unter <ph name="MANAGEMENT_URL" /> einsehen.</translation> <translation id="6165508094623778733">Weitere Informationen</translation> +<translation id="6167008112175207002">Lesezeichen, Verlauf, Passwörter und andere Einstellungen werden mit Ihrem Google-Konto synchronisiert, damit Sie diese auf allen Ihren Geräten nutzen können. Sie können diese Einstellung unter dem folgenden Link ändern: <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">"Ok Google"-Funktionen für simulierte Hardware</translation> <translation id="6175314957787328458">Microsoft-Domain-GUID</translation> <translation id="6178664161104547336">Zertifikat auswählen</translation> @@ -3706,6 +3721,7 @@ <translation id="648927581764831596">Keine verfügbar</translation> <translation id="6490936204492416398">Neue vom Web Store installieren</translation> <translation id="6492313032770352219">Größe auf Datenträger:</translation> +<translation id="6498249116389603658">&Alle Ihre Sprachen</translation> <translation id="6499143127267478107">Host in Proxy-Skript wird aufgelöst...</translation> <translation id="6503077044568424649">Meistbesucht</translation> <translation id="6503256918647795660">Schweizerisch-französische Tastatur</translation> @@ -3747,7 +3763,6 @@ <translation id="6555432686520421228">Entfernen Sie alle Nutzerkonten und setzen Sie Ihr <ph name="IDS_SHORT_PRODUCT_NAME" />-Gerät auf die Werkseinstellungen zurück.</translation> <translation id="6556866813142980365">Wiederholen</translation> <translation id="6557565812667414268">Nur für High DPI-Displays aktiviert</translation> -<translation id="655845594391856372">Tab antwortet nicht. Streaming nicht möglich.</translation> <translation id="6559580823502247193">(auf diesem Gerät bereits vorhanden)</translation> <translation id="6561726789132298588">Eingabe</translation> <translation id="6562437808764959486">Wiederherstellungsabbild wird extrahiert...</translation> @@ -3814,7 +3829,7 @@ <translation id="6662016084451426657">Synchronisierungsfehler: Bitten Sie Ihren Administrator, die Synchronisierung zu aktivieren.</translation> <translation id="6663792236418322902">Das gewählte Passwort wird später zur Wiederherstellung dieser Datei benötigt. Bewahren Sie es an einem sicheren Ort auf.</translation> <translation id="6664237456442406323">Ihr Computer wurde mit einer ungültigen Hardware-ID konfiguriert. Daher kann Chrome OS keine aktuellen Sicherheitsupdates installieren und Ihr Computer ist <ph name="BEGIN_BOLD" />möglicherweise anfällig für schädliche Angriffe<ph name="END_BOLD" />.</translation> -<translation id="666541661050183336">Verringert die Ladepriorität von Iframe-Ressourcen.</translation> +<translation id="666541661050183336">Verringert die Ladepriorität von iFrame-Ressourcen.</translation> <translation id="6666647326143344290">mit Ihrem Google-Konto</translation> <translation id="6675665718701918026">Zeigegerät verbunden</translation> <translation id="6677037229676347494">Erwartete ID: "<ph name="EXPECTED_ID" />", tatsächliche ID: "<ph name="NEW_ID" />"</translation> @@ -3848,6 +3863,7 @@ <translation id="6723354935081862304">Drücken Sie über Google Docs und andere Cloud-Ziele. <ph name="BEGIN_LINK" />Melden Sie sich an<ph name="END_LINK" />, um über Google Cloud Print zu drucken.</translation> <translation id="6723661294526996303">Lesezeichen und Einstellungen importieren...</translation> <translation id="6723839937902243910">Akkuleistung</translation> +<translation id="6725240607822645708">IME im eigenen Thread ausführen.</translation> <translation id="6725970970008349185">Anzahl von Kandidaten, die pro Seite angezeigt werden sollen</translation> <translation id="672609503628871915">Mehr erfahren</translation> <translation id="6727005317916125192">Vorheriger Bereich</translation> @@ -3977,12 +3993,11 @@ <translation id="6948736568813450284">Für Entwickler: Verwenden Sie den Sandbox-Dienst für Google Payments API-Aufrufe.</translation> <translation id="6949306908218145636">Offene Seiten als Lesezeichen speichern...</translation> <translation id="695164542422037736">Bei Aktivierung dieser Option und Formatierung des Texts mit background-attachment:fixed wird für den Hintergrund eine eigene Ebene erstellt.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> speichert Ihre Passwörter und meldet Sie auf diesem Gerät automatisch in Websites an.</translation> <translation id="6955446738988643816">Pop-up prüfen</translation> <translation id="695755122858488207">Deaktiviertes Optionsfeld</translation> +<translation id="6960277925159781810">Automatisch auf diesem Gerät anmelden</translation> <translation id="696036063053180184">3 Set (Kein Shift)</translation> <translation id="696203921837389374">Synchronisierung über mobile Daten aktivieren</translation> -<translation id="6964308487066031935">Ordner zu "<ph name="EXTENSION" />" hinzufügen?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Gerät</translation> @@ -4080,7 +4095,6 @@ <translation id="7076293881109082629">Anmeldung</translation> <translation id="7077829361966535409">Die Anmeldeseite konnte mit den aktuellen Proxy-Einstellungen nicht geladen werden. <ph name="GAIA_RELOAD_LINK_START" />Versuchen Sie erneut, sich anzumelden<ph name="GAIA_RELOAD_LINK_END" />, oder verwenden Sie andere <ph name="PROXY_SETTINGS_LINK_START" />Proxy-Einstellungen<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignorierte Protokoll-Handler</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" kann Bilder, Videos und Audiodateien in den ausgewählten Ordnern lesen und löschen.</translation> <translation id="708060913198414444">Audioadresse k&opieren</translation> <translation id="708187310695946552">Benutzeroberfläche für Sitzungswiederherstellung in einem Infofeld</translation> <translation id="7082055294850503883">Feststelltaste ignorieren und standardmäßig Kleinbuchstaben eingeben</translation> @@ -4224,6 +4238,8 @@ <translation id="7313804056609272439">Vietnamesische Eingabemethode (VNI)</translation> <translation id="7314244761674113881">SOCKS-Host</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (aktuell)</translation> +<translation id="7321545336522791733">Server nicht erreichbar</translation> +<translation id="7324841169865301118">Ermöglicht dem Nutzer die Auswahl eines Tabs für die Desktopfreigabe.</translation> <translation id="7325437708553334317">High Contrast-Erweiterung</translation> <translation id="7326565110843845436">Klicken mit drei Fingern für das Touchpad</translation> <translation id="73289266812733869">Markierung aufgehoben</translation> @@ -4453,7 +4469,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" möchte "<ph name="EXTENSION_NAME" />" entfernen.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> wird in dieser Sprache angezeigt.</translation> <translation id="7654941827281939388">Dieses Konto wird bereits auf dem Computer verwendet.</translation> -<translation id="7655165758820095116">Das MediaSource-Objekt ermöglicht JavaScript, Mediendaten direkt an ein Videoelement zu senden.</translation> <translation id="7658239707568436148">Abbrechen</translation> <translation id="7659584679870740384">Sie sind nicht zur Verwendung dieses Geräts berechtigt. Bitten Sie den Administrator um eine Anmeldeberechtigung.</translation> <translation id="7664620655576155379">Nicht unterstütztes Bluetooth-Gerät: "<ph name="DEVICE_NAME" />"</translation> @@ -4584,6 +4599,7 @@ <translation id="7861215335140947162">&Downloads</translation> <translation id="7864539943188674973">Bluetooth deaktivieren</translation> <translation id="7868891395842935202">Aktiviert Experimental Framework, sodass der Zugriff auf API-Experimente überprüft werden kann.</translation> +<translation id="7870576007982733437">Downloadmanager des Systems sofern möglich verwenden</translation> <translation id="7870790288828963061">Es wurden keine Kiosk-Apps mit neuerer Version gefunden. Es sind keine Updates vorhanden. Bitte entfernen Sie den USB-Stick.</translation> <translation id="787150342916295244">Kreditkartenscan</translation> <translation id="7874357055309047713">Immer auf allen Websites ausführen</translation> @@ -4626,7 +4642,6 @@ <translation id="7918257978052780342">Anmelden</translation> <translation id="7920092496846849526">Du hast deine Eltern gefragt, ob du diese Seite besuchen darfst.</translation> <translation id="7925285046818567682">Warten auf <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> speichert Ihre Passwörter und meldet Sie automatisch in Apps und Websites an.</translation> <translation id="7925686952655276919">Keine mobilen Daten für die Synchronisierung verwenden</translation> <translation id="7926906273904422255">Nicht sicheren Ursprung als nicht sicher oder als "zweifelhaft" markieren</translation> <translation id="7928710562641958568">Gerät auswerfen</translation> @@ -4688,7 +4703,6 @@ Speichern Sie Ihre Schlüsseldatei an einem sicheren Ort. Sie benötigen die Datei, um neue Versionen Ihrer Erweiterung zu erstellen.</translation> <translation id="799923393800005025">Darf ansehen</translation> <translation id="7999338963698132743">Neuer Task-Manager</translation> -<translation id="8000004253404706714">Verwendet das alte, einschränkende Animationssubsystem für zusammengesetzte Animationen in Renderern.</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8007030362289124303">Schwacher Akku</translation> <translation id="8008356846765065031">Sie haben keine Verbindung mit dem Internet. Bitte überprüfen Sie Ihre Internetverbindung.</translation> @@ -4817,6 +4831,7 @@ <translation id="8185331656081929126">Benachrichtigung anzeigen, wenn neue Drucker im Netzwerk gefunden werden</translation> <translation id="8186609076106987817">Die Datei konnte nicht gefunden werden.</translation> <translation id="8186706823560132848">Software</translation> +<translation id="8188120771410500975">&Rechtschreibung in allen Textfeldern prüfen</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> und <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> weitere</translation> <translation id="8190193592390505034">Verbindung zu <ph name="PROVIDER_NAME" /> wird hergestellt.</translation> <translation id="8191230140820435481">Apps, Erweiterungen und Designs verwalten</translation> @@ -4974,7 +4989,7 @@ <translation id="8426519927982004547">HTTPS/SSL</translation> <translation id="8427933533533814946">Foto von</translation> <translation id="8428213095426709021">Einstellungen</translation> -<translation id="8432590265309978927">Sehr experimentelle Unterstützung des Renderings von websiteübergreifenden Iframes in separaten Prozessen</translation> +<translation id="8432590265309978927">Sehr experimentelle Unterstützung des Renderings von websiteübergreifenden iFrames in separaten Prozessen</translation> <translation id="8432745813735585631">US-amerikanische Colemak-Tastatur</translation> <translation id="8434177709403049435">&Codierung</translation> <translation id="8434480141477525001">NaCl-Debug-Port</translation> @@ -5075,7 +5090,7 @@ <translation id="8589311641140863898">Experimentelle Erweiterungs-APIs</translation> <translation id="8590375307970699841">Automatische Updates einrichten</translation> <translation id="8591846766485502580">Diese Nachricht wird dir angezeigt, weil deine Eltern diese Website blockiert haben.</translation> -<translation id="8592071947729879125">Iframe-Berechtigungen beschränken</translation> +<translation id="8592071947729879125">iFrame-Berechtigungen beschränken</translation> <translation id="8594787581355215556">Sie sind als <ph name="USER_EMAIL_ADDRESS" /> angemeldet. Verwalten Sie Ihre synchronisierten Daten im <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="8596540852772265699">Benutzerdefinierte Dateien</translation> <translation id="8596785155158796745">Das Mikrofon ist momentan nicht verfügbar. <ph name="BEGIN_LINK" />Mikrofon verwalten<ph name="END_LINK" /></translation> @@ -5209,6 +5224,7 @@ <translation id="8765985713192161328">Handler verwalten...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Nutzer</translation> +<translation id="8768367823103160496">Mauszeigersperre</translation> <translation id="8769662576926275897">Kartendaten</translation> <translation id="8770196827482281187">Persische Eingabemethode (ISIRI 2901-Layout)</translation> <translation id="8774934320277480003">Oberer Rand</translation> @@ -5228,6 +5244,7 @@ <translation id="8795668016723474529">Kreditkarte hinzufügen</translation> <translation id="8795916974678578410">Neues Fenster</translation> <translation id="8798099450830957504">Standardeinstellung</translation> +<translation id="8799127529310003270">Wenn diese Funktion aktiviert ist, werden InputConnection-Aufrufe im IME-Thread ausgeführt. Dabei wird kein Replikat-Editor eingesetzt, stattdessen kommuniziert jeder InputConnection-Aufruf direkt mit dem Renderer.</translation> <translation id="8799839487311913894">Das Aktualisieren eines Passworts im Passwortmanager aktivieren, nachdem ein Formular "Passwort ändern" eingereicht wurde.</translation> <translation id="8800004011501252845">Ziele werden angezeigt für</translation> <translation id="8800420788467349919">Lautstärke: <ph name="PRECENTAGE" /> %</translation> @@ -5253,6 +5270,7 @@ <translation id="8841142799574815336">Inaktiver visueller Darstellungsbereich</translation> <translation id="884264119367021077">Versandadresse</translation> <translation id="8844238624737526720">Neue und optimierte Implementierung des Task-Managers von Chrome verwenden.</translation> +<translation id="8845001906332463065">Hilfe aufrufen</translation> <translation id="8846141544112579928">Suche nach Tastatur läuft...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Moduswechsel mit Shift</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 7f1edfcf..e69210a 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -293,6 +293,7 @@ <translation id="1434696352799406980">Με αυτήν την ενέργεια, θα γίνει επαναφορά της σελίδας εκκίνησης, της σελίδας σε νέα καρτέλα, της μηχανής αναζήτησης και των καρφιτσωμένων καρτελών σας. Επιπλέον, θα απενεργοποιηθούν όλες οι επεκτάσεις και θα γίνει εκκαθάριση των προσωρινών δεδομένων σας, όπως είναι τα cookie. Οι σελιδοδείκτες, το ιστορικό και οι αποθηκευμένοι κωδικοί πρόσβασής σας δεν θα διαγραφούν.</translation> <translation id="1434886155212424586">Η αρχική σελίδα είναι η σελίδα "Νέα καρτέλα"</translation> <translation id="1435550882135542937">Επανασχεδιασμός γραμμής εργαλείων επεκτάσεων</translation> +<translation id="1436402875660227532">Σημείωση: Αυτές οι ρυθμίσεις δεν χρησιμοποιούνται πλέον σε αυτό το σύστημα αλλά μπορείτε ακόμη να τις προβάλετε και να τις επεξεργαστείτε.</translation> <translation id="1436784010935106834">Καταργήθηκαν</translation> <translation id="1438632560381091872">Κατάργηση σίγασης καρτελών</translation> <translation id="1441841714100794440">Πληκτρολόγιο Βιετναμικών (Telex)</translation> @@ -1321,6 +1322,7 @@ <translation id="2889064240420137087">Άνοιγμα συνδέσμου με...</translation> <translation id="2889925978073739256">Συνέχιση αποκλεισμού προσθηκών εκτός περιβάλλοντος δοκιμών</translation> <translation id="2890624088306605051">Να γίνεται ανάκτηση μόνο των συγχρονισμένων ρυθμίσεων και δεδομένων</translation> +<translation id="2890678560483811744">Η αναφορά της σελίδας βρίσκεται εκτός ορίων</translation> <translation id="2893168226686371498">Προεπιλεγμένο πρόγραμμα περιήγησης</translation> <translation id="289426338439836048">Άλλο δίκτυο κινητής τηλεφωνίας...</translation> <translation id="2894745200702272315">Ενεργοποιεί την πειραματική έκδοση των λειτουργιών εντοπισμού της λέξης-κλειδί "Ok Google" που εξαρτώνται από το εκάστοτε υλικό.</translation> @@ -1350,7 +1352,6 @@ <translation id="2925966894897775835">Φύλλα</translation> <translation id="2927017729816812676">Αποθηκευτικός χώρος κρυφής μνήμης</translation> <translation id="2927657246008729253">Αλλαγή...</translation> -<translation id="2928415919076124714">Απόκρυψη γραμμής εργαλείων σε πλήρη οθόνη</translation> <translation id="2928526264833629376">Συνέχεια στο Hangouts</translation> <translation id="2930644991850369934">Προέκυψε πρόβλημα κατά τη λήψη της εικόνας ανάκτησης. Χάθηκε η σύνδεση δικτύου.</translation> <translation id="293111069139560936">Επιτρέπει στο ράφι την ελαχιστοποίηση παραθύρου, εάν γίνει κλικ σε ένα στοιχείο του το οποίο έχει μόνο ένα ήδη ενεργό παράθυρο που συσχετίζεται με αυτό.</translation> @@ -1596,7 +1597,6 @@ <translation id="3289566588497100676">Εύκολη εισαγωγή συμβόλου</translation> <translation id="3289856944988573801">Για να ελέγξετε για ενημερώσεις, χρησιμοποιήστε δίκτυο Ethernet ή Wi-Fi.</translation> <translation id="3293325348208285494">Γρήγορη εκκίνηση</translation> -<translation id="3293894718455402932">Το "<ph name="EXTENSION" />" θα μπορεί να πραγματοποιεί ανάγνωση και εγγραφή εικόνων, βίντεο και αρχείων ήχου στους επιλεγμένους φακέλους.</translation> <translation id="3294437725009624529">Επισκέπτης</translation> <translation id="329650768420594634">Προειδοποίηση στοίβαξης επέκτασης</translation> <translation id="3296763833017966289">Γεωργιανά @@ -1655,6 +1655,7 @@ <translation id="3338239663705455570">Πληκτρολόγιο με σλοβενικούς χαρακτήρες</translation> <translation id="3340978935015468852">ρυθμίσεις</translation> <translation id="3341703758641437857">Να επιτρέπεται η πρόσβαση σε διευθύνσεις URL αρχείων</translation> +<translation id="3343813173145836998">Συνδεθείτε με ευκολία σε αυτήν τη συσκευή</translation> <translation id="3344786168130157628">Όνομα σημείου πρόσβασης:</translation> <translation id="3345135638360864351">Δεν ήταν δυνατή η αποστολή του αιτήματος πρόσβασής σας σε αυτόν τον ιστότοπο σε <ph name="NAME" />. Δοκιμάστε ξανά.</translation> <translation id="3345886924813989455">Δεν βρέθηκε υποστηριζόμενο πρόγραμμα περιήγησης</translation> @@ -2296,6 +2297,7 @@ <translation id="4268025649754414643">Κρυπτογράφηση κλειδιού</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Έκδοση <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Δεν υπάρχουν αντιστοιχίες</translation> <translation id="4274187853770964845">Σφάλμα συγχρονισμού: διακόψτε και επανεκκινήστε τον συγχρονισμό.</translation> <translation id="4275830172053184480">Επανεκκινήστε τη συσκευή σας</translation> <translation id="4276796043975446927">Καλωσήρθατε στο Chromebox για συναντήσεις</translation> @@ -2365,6 +2367,7 @@ <translation id="4378551569595875038">Σύνδεση…</translation> <translation id="438122767399415311">Επιβολή κατεύθυνσης διεπαφής χρήστη</translation> <translation id="4381849418013903196">Άνω κάτω τελεία</translation> +<translation id="4383192539467954373">Συνδεθείτε αυτόματα σε όλες τις συσκευές</translation> <translation id="4384652540891215547">Ενεργοποίηση επέκτασης</translation> <translation id="438503109373656455">Σαρατόγκα</translation> <translation id="4387554346626014084">Ενεργοποίηση συγχρονισμού Εφαρμογής εκκίνησης. Αυτό ενεργοποιεί επίσης τους φακέλους, όπου διατίθενται (εκτός OSX).</translation> @@ -2397,6 +2400,7 @@ <translation id="444267095790823769">Εξαιρέσεις προστατευόμενου περιεχομένου</translation> <translation id="4443536555189480885">&Βοήθεια</translation> <translation id="4444304522807523469">Πρόσβαση στους σαρωτές εγγράφων που προσαρτώνται μέσω USB ή σε κάποιο τοπικό δίκτυο</translation> +<translation id="4445559854264555037">Δεν βλέπετε τη συσκευή σας; <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Κατοπτριζόμενο</translation> <translation id="4447465454292850432">Μπαταρία:</translation> <translation id="4449935293120761385">Σχετικά με την Αυτόματη συμπλήρωση</translation> @@ -2657,6 +2661,7 @@ </translation> <translation id="4856478137399998590">Η υπηρεσία δεδομένων κινητής συσκευής είναι ενεργοποιημένη και έτοιμη προς χρήση</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">Να επιτρέπεται η διαχείριση των λήψεων από τη λειτουργία διαχείρισης λήψεων του συστήματος, όπου υπάρχει αυτή η δυνατότητα.</translation> <translation id="48607902311828362">Λειτουργία πτήσης</translation> <translation id="4861833787540810454">&Αναπαραγωγή</translation> <translation id="4862050643946421924">Προσθήκη συσκευής…</translation> @@ -2740,7 +2745,6 @@ <translation id="4977942889532008999">Επιβεβαίωση πρόσβασης</translation> <translation id="4982718461356080574">Απόκρυψη κουμπιών κλεισίματος σε ανενεργές καρτέλες όταν είναι τοποθετημένες σε στοίβα</translation> <translation id="498294082491145744">Αλλάξτε τις ρυθμίσεις που ελέγχουν την πρόσβαση των ιστότοπων σε δυνατότητες, όπως είναι τα cookie, η JavaScript, οι προσθήκες, η γεωγραφική τοποθεσία, το μικρόφωνο, η κάμερα, κ.λπ.</translation> -<translation id="4984329823325527157">API πηγής μέσων</translation> <translation id="4988526792673242964">Σελίδες</translation> <translation id="4988792151665380515">Αποτυχία εξαγωγής δημόσιου κλειδιού.</translation> <translation id="49896407730300355">Περιστροφή προς τα &αριστερά</translation> @@ -2931,7 +2935,6 @@ <translation id="5268606875983318825">PPAPI (εκτός διαδικασίας)</translation> <translation id="526926484727016706">Προκαλεί την από προεπιλογή απόρριψη όλων των αδειών στα iframe. Η χορήγηση συγκεκριμένων αδειών για κάποιο iframe ενδέχεται να περιλαμβάνει τη δημιουργία λίστας με τα ονόματα αυτών των αδειών με τη μορφή τιμών νέων χαρακτηριστικών iframe.</translation> <translation id="5269977353971873915">Η εκτύπωση απέτυχε</translation> -<translation id="5270884342523754894">Το "<ph name="EXTENSION" />" θα μπορεί να πραγματοποιεί ανάγνωση εικόνων, βίντεο και αρχείων ήχου στους επιλεγμένους φακέλους.</translation> <translation id="5271247532544265821">Εναλλαγή λειτουργίας απλοποιημένων/παραδοσιακών κινέζικων.</translation> <translation id="5271549068863921519">Αποθήκευση κωδικού πρόσβασης</translation> <translation id="5273628206174272911">Πειραματική πλοήγηση ιστορικού ως απόκριση στο οριζόντιο overscroll.</translation> @@ -3021,11 +3024,11 @@ <translation id="5390284375844109566">Ευρετηριασμένη βάση δεδομένων</translation> <translation id="5392544185395226057">Ενεργοποίηση υποστήριξης για το Native Client.</translation> <translation id="5393125431335030955">Αυτή η προσθήκη λειτουργεί μόνο στον υπολογιστή.</translation> -<translation id="5393559999218790205">Απενεργοποίηση χρονικών ορίων κινούμενων εικόνων σύνθεσης διεπαφής</translation> <translation id="5396126354477659676">Η προσθήκη <ph name="PEPPER_PLUGIN_NAME" /> στον τομέα <ph name="PEPPER_PLUGIN_DOMAIN" /> επιθυμεί να αποκτήσει πρόσβαση στον υπολογιστή σας.</translation> <translation id="539755880180803351">Προσθέτει σχολιασμούς σε φόρμες ιστού με προβλέψεις τύπου του πεδίου Αυτόματης συμπλήρωσης με τη μορφή κειμένου κράτησης θέσης.</translation> <translation id="5397578532367286026">Ο διαχειριστής (<ph name="MANAGER_EMAIL" />) μπορεί να ελέγξει τη χρήση και το ιστορικό αυτού του χρήστη στη διεύθυνση chrome.com.</translation> <translation id="5397794290049113714">Εσείς</translation> +<translation id="5398572795982417028">Η αναφορά της σελίδας βρίσκεται εκτός ορίων, το όριο είναι <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> από άλλους ιστότοπους</translation> <translation id="5399158067281117682">Τα PIN δεν ταιριάζουν!</translation> <translation id="5400640815024374115">Το τσιπ TPM (Mονάδα αξιόπιστης πλατφόρμας) είναι απενεργοποιημένο ή λείπει.</translation> @@ -3045,7 +3048,7 @@ <translation id="5423849171846380976">Ενεργοποιημένο</translation> <translation id="5425470845862293575">Ενεργοποιεί τη χρήση του πειραματικού συστήματος απόδοσης γραμματοσειράς DirectWrite.</translation> <translation id="5425722269016440406">Πρέπει να είστε συνδεδεμένοι στο Διαδίκτυο για να απενεργοποιήσετε το Smart Lock, καθώς αυτή η ρύθμιση είναι συγχρονισμένη με το τηλέφωνό σας και με άλλες συσκευές. Συνδεθείτε πρώτα σε κάποιο δίκτυο.</translation> -<translation id="5426623592374109001">Χρησιμοποιήστε το παλιό παρεμβατικό υποσύστημα κινούμενων εικόνων για σύνθετες κινούμενες εικόνες στη διεπαφή.</translation> +<translation id="5425863515030416387">Συνδεθείτε με ευκολία σε όλες τις συσκευές</translation> <translation id="5427459444770871191">Περιστροφή &προς τα δεξιά</translation> <translation id="5428105026674456456">Ισπανικά </translation> @@ -3242,7 +3245,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">Κλίμακα πλησιάσματος</translation> <translation id="5710406368443808765">Ωχ! Το σύστημα απέτυχε να αποθηκεύσει το διακριτικό και το αναγνωριστικό της συσκευής.</translation> -<translation id="571161420693302741">Το <ph name="HOST_NAME" /> δεν ανταποκρίνεται. Αδυναμία μετάδοσης.</translation> <translation id="5711983031544731014">Το ξεκλείδωμα δεν είναι δυνατό. Πληκτρολογήστε τον κωδικό πρόσβασής σας.</translation> <translation id="5712966208980506909">Εάν είναι ενεργοποιημένο, η διεύθυνση URL chrome://md-policy φορτώνει τη σελίδα πολιτικής του Material Design.</translation> <translation id="5715711091495208045">Μεσάζων προσθηκών: <ph name="PLUGIN_NAME" /></translation> @@ -3509,7 +3511,6 @@ <translation id="6111974609785983504">Επιτρέπεται από προεπιλογή</translation> <translation id="6113134669445407638">Απενεργοποίηση καθυστέρησης ανεξάρτητα από το AEC στο WebRTC. Χρησιμοποιήστε εάν οι καθυστερήσεις που αναφέρονται από το σύστημα είναι πολύ αξιόπιστες ή εάν το μηχάνημά σας παράγει ηχώ.</translation> <translation id="6116921718742659598">Αλλαγή γλώσσας και ρυθμίσεις εισόδου</translation> -<translation id="6117536376248197233">Απενεργοποίηση χρονικών ορίων κινούμενων εικόνων σύνθεσης σε λειτουργίες απόδοσης.</translation> <translation id="6120205520491252677">Καρφίτσωμα αυτής της σελίδας στην Οθόνη έναρξης…</translation> <translation id="6122081475643980456">Η σύνδεσή σας στο διαδίκτυο παρακολουθείται</translation> <translation id="6122093587541546701">Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικά):</translation> @@ -3541,6 +3542,7 @@ <translation id="6163522313638838258">Ανάπτυξη όλων...</translation> <translation id="6164005077879661055">Όλα τα αρχεία και τα τοπικά δεδομένα που σχετίζονται με το χρήστη υπό επίβλεψη θα διαγραφούν οριστικά μόλις καταργηθεί ο χρήστης υπό επίβλεψη. Οι ιστοσελίδες που έχει επισκεφτεί και οι ρυθμίσεις που έχει επιλέξει ενδεχομένως να εξακολουθούν να εμφανίζονται στο διαχειριστή στη διεύθυνση <ph name="MANAGEMENT_URL" /> .</translation> <translation id="6165508094623778733">Μάθετε περισσότερα</translation> +<translation id="6167008112175207002">Οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλες ρυθμίσεις σας θα συγχρονιστούν με το Λογαριασμό σας Google ώστε η χρήση τους να είναι δυνατή σε όλες τις συσκευές σας. Μπορείτε να αλλάξετε αυτήν τη ρύθμιση στο <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Προσομοιωμένες λειτουργίες "Ok Google" εξοπλισμού</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">Επιλογή πιστοποιητικού</translation> @@ -3786,7 +3788,6 @@ <translation id="6555432686520421228">Καταργήστε όλους τους λογαριασμούς χρηστών και επαναφέρετε τη συσκευή σας <ph name="IDS_SHORT_PRODUCT_NAME" /> για να γίνει σαν καινούρια.</translation> <translation id="6556866813142980365">Επανάληψη ενέργειας</translation> <translation id="6557565812667414268">Ενεργοποιημένο μόνο για οθόνες με υψηλό DPI</translation> -<translation id="655845594391856372">Η καρτέλα δεν ανταποκρίνεται. Αδυναμία μετάδοσης.</translation> <translation id="6559580823502247193">(υπάρχει ήδη στη συσκευή)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Εξαγωγή εικόνας ανάκτησης...</translation> @@ -3887,6 +3888,7 @@ <translation id="6723354935081862304">Εκτύπωση στα Έγγραφα Google και σε άλλους προορισμούς νέφους. <ph name="BEGIN_LINK" />Συνδεθείτε<ph name="END_LINK" /> για να κάνετε εκτύπωση στο Google Cloud Print.</translation> <translation id="6723661294526996303">Εισαγωγή σελιδοδεικτών και ρυθμίσεων...</translation> <translation id="6723839937902243910">Ενεργοποίηση</translation> +<translation id="6725240607822645708">Εκτέλεση του IME σε δικό του νήμα.</translation> <translation id="6725970970008349185">Αριθμός υποψηφίων για προβολή ανά σελίδα</translation> <translation id="672609503628871915">Δείτε τι νέο υπάρχει</translation> <translation id="6727005317916125192">Προηγούμενο παράθυρο</translation> @@ -4019,12 +4021,11 @@ <translation id="6948736568813450284">Για προγραμματιστές: χρησιμοποιήστε την υπηρεσία περιβάλλοντος δοκιμών για κλήσεις API του Google Payments.</translation> <translation id="6949306908218145636">Δημιουργία σελιδοδεικτών για όλες τις ανοικτές σελίδες…</translation> <translation id="695164542422037736">Εάν είναι ενεργοποιημένη αυτή η επιλογή και το σώμα του κειμένου έχει μορφοποίηση background-attachment:fixed, το φόντο θα έχει το δικό του σύνθετο επίπεδο.</translation> -<translation id="6952626679169241027">Το <ph name="PASSWORD_MANAGER_BRAND" /> διατηρεί τους κωδικούς πρόσβασής σας και σας συνδέει αυτόματα σε ιστότοπους σε αυτήν τη συσκευή.</translation> <translation id="6955446738988643816">Έλεγχος αναδυόμενου παραθύρου</translation> <translation id="695755122858488207">Μη επιλεγμένο κουμπί επιλογής</translation> +<translation id="6960277925159781810">Συνδεθείτε αυτόματα σε αυτήν τη συσκευή</translation> <translation id="696036063053180184">3 Set (Χωρίς shift)</translation> <translation id="696203921837389374">Ενεργοποίηση συγχρονισμού μέσω δεδομένων κινητής τηλεφωνίας</translation> -<translation id="6964308487066031935">Να προστεθούν φάκελοι στο "<ph name="EXTENSION" />";</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Θύρα</translation> <translation id="6965978654500191972">Συσκευή</translation> @@ -4124,7 +4125,6 @@ <translation id="7076293881109082629">Σύνδεση</translation> <translation id="7077829361966535409">Αποτυχία φόρτωσης σελίδας σύνδεσης με χρήση των τρεχουσών ρυθμίσεων διακομιστή μεσολάβησης. <ph name="GAIA_RELOAD_LINK_START" />Δοκιμάστε να συνδεθείτε ξανά<ph name="GAIA_RELOAD_LINK_END" />, ή χρησιμοποιήστε διαφορετικές <ph name="PROXY_SETTINGS_LINK_START" />ρυθμίσεις διακομιστή μεσολάβησης<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Χειριστές πρωτοκόλλου που αγνοούνται</translation> -<translation id="7079038783243627996">Το "<ph name="EXTENSION" />" θα μπορεί να πραγματοποιεί ανάγνωση και διαγραφή εικόνων, βίντεο και αρχείων ήχου στους επιλεγμένους φακέλους.</translation> <translation id="708060913198414444">Α&ντιγραφή διεύθυνσης ήχου</translation> <translation id="708187310695946552">Διεπαφή χρήστη με συννεφάκι επαναφοράς περιόδου σύνδεσης</translation> <translation id="7082055294850503883">Παράβλεψη λειτουργίας CapsLock και εισαγωγή πεζών από προεπιλογή</translation> @@ -4499,7 +4499,6 @@ <translation id="7650511557061837441">Η επέκταση "<ph name="TRIGGERING_EXTENSION_NAME" />" θέλει να καταργήσει την επέκταση "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772">Το <ph name="PRODUCT_NAME" /> εμφανίζεται σε αυτήν τη γλώσσα</translation> <translation id="7654941827281939388">Αυτός ο λογαριασμός χρησιμοποιείται ήδη σε αυτόν τον υπολογιστή.</translation> -<translation id="7655165758820095116">Το αντικείμενο MediaSource επιτρέπει στην JavaScript την αποστολή δεδομένων μέσων απευθείας σε ένα στοιχείο βίντεο.</translation> <translation id="7658239707568436148">Ακύρωση</translation> <translation id="7659584679870740384">Δεν έχετε εξουσιοδότηση για χρήση αυτής της συσκευής. Για να λάβετε άδεια σύνδεσης, επικοινωνήστε με το διαχειριστή της συσκευής.</translation> <translation id="7664620655576155379">Μη υποστηριζόμενη συσκευή Bluetooth: "<ph name="DEVICE_NAME" />".</translation> @@ -4630,6 +4629,7 @@ <translation id="7861215335140947162">&Λήψεις</translation> <translation id="7864539943188674973">Απενεργοποίηση Bluetooth</translation> <translation id="7868891395842935202">Ενεργοποιεί το Πειραματικό πλαίσιο εργασίας για τον έλεγχο της πρόσβασης σε πειράματα API.</translation> +<translation id="7870576007982733437">Να γίνεται χρήση της λειτουργίας διαχείρισης λήψεων συστήματος, όπου υπάρχει αυτή η δυνατότητα.</translation> <translation id="7870790288828963061">Δεν βρέθηκαν εφαρμογές kiosk με νεότερη έκδοση. Δεν υπάρχουν στοιχεία προς ενημέρωση. Αφαιρέστε τη συσκευή USB.</translation> <translation id="787150342916295244">Σάρωση πιστωτικής κάρτας</translation> <translation id="7874357055309047713">Να εκτελείται πάντα σε όλους τους ιστότοπους</translation> @@ -4672,7 +4672,6 @@ <translation id="7918257978052780342">Εγγραφή</translation> <translation id="7920092496846849526">Ρώτησες τους γονείς σου εάν σου επιτρέπουν να επισκεφτείς αυτήν τη σελίδα.</translation> <translation id="7925285046818567682">Αναμονή για κεντρικό υπολογιστή <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824">Το <ph name="PASSWORD_MANAGER_BRAND" /> διατηρεί τους κωδικούς πρόσβασής σας και σας συνδέει αυτόματα σε εφαρμογές και ιστότοπους σε όλες τις συσκευές.</translation> <translation id="7925686952655276919">Μη χρησιμοποιείτε δεδομένα για κινητά για συγχρονισμό</translation> <translation id="7926906273904422255">Επισημάνετε μη ασφαλείς προελεύσεις ως μη ασφαλείς ή ως "αμφίβολες".</translation> <translation id="7928710562641958568">Εξαγωγή συσκευής</translation> @@ -4734,7 +4733,6 @@ Διατηρείτε το αρχείο κλειδιού σε ασφαλές μέρος. Θα το χρειαστείτε για τη δημιουργία νέων εκδόσεων της επέκτασής σας.</translation> <translation id="799923393800005025">Δυνατότητα προβολής</translation> <translation id="7999338963698132743">Νέα διαχείριση εργασιών</translation> -<translation id="8000004253404706714">Χρησιμοποιήστε το παλιό παρεμβατικό υποσύστημα κινούμενων εικόνων για σύνθετες κινούμενες εικόνες σε λειτουργίες απόδοσης.</translation> <translation id="8004582292198964060">Πρόγραμμα περιήγησης</translation> <translation id="8007030362289124303">Χαμηλή στάθμη μπαταρίας</translation> <translation id="8008356846765065031">Η σύνδεση στο διαδίκτυο διακόπηκε. Ελέγξτε τη σύνδεσή σας στο διαδίκτυο.</translation> @@ -5261,6 +5259,7 @@ <translation id="8765985713192161328">Διαχείριση προγραμμάτων χειρισμού...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Χρήστες</translation> +<translation id="8768367823103160496">Κλείδωμα του δείκτη του ποντικιού</translation> <translation id="8769662576926275897">Στοιχεία κάρτας</translation> <translation id="8770196827482281187">Μέθοδος εισαγωγής Περσικών (Διάταξη ISIRI 2901)</translation> <translation id="8774934320277480003">Επάνω περιθώριο</translation> @@ -5280,6 +5279,7 @@ <translation id="8795668016723474529">Προσθήκη πιστωτικής κάρτας</translation> <translation id="8795916974678578410">Νέο Παράθυρο</translation> <translation id="8798099450830957504">Προεπιλογή</translation> +<translation id="8799127529310003270">Εάν είναι ενεργοποιημένες, οι κλήσεις InputConnection θα εκτελούνται στο νήμα IME και κάθε κλήση InputConnection θα επικοινωνεί απευθείας με τη λειτουργία απόδοσης αντί να διατηρεί μια επεξεργασία ρέπλικας.</translation> <translation id="8799839487311913894">Ενεργοποιεί την ενημέρωση ενός κωδικού πρόσβασης στη διαχείριση κωδικών πρόσβασης μετά την υποβολή μιας φόρμας "αλλαγής κωδικού πρόσβασης".</translation> <translation id="8800004011501252845">Εμφάνιση προορισμών για</translation> <translation id="8800420788467349919">Ένταση ήχου: <ph name="PRECENTAGE" />%</translation> @@ -5305,6 +5305,7 @@ <translation id="8841142799574815336">Αδρανής οπτική θύρα προβολής</translation> <translation id="884264119367021077">Διεύθυνση αποστολής</translation> <translation id="8844238624737526720">Χρησιμοποιήστε τη νέα και βελτιστοποιημένη εφαρμογή της διαχείρισης εργασιών του Chrome.</translation> +<translation id="8845001906332463065">Λήψη βοήθειας</translation> <translation id="8846141544112579928">Αναζήτηση για πληκτρολόγιο…</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Εναλλαγή λειτουργίας με πλήκτρο Shift</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 99d6016b..e611177 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">This will reset your startup page, new tab page, search engine and pinned tabs. It will also disable all extensions and clear temporary data like cookies. Your bookmarks, history and saved passwords will not be cleared.</translation> <translation id="1434886155212424586">Homepage is the New Tab page</translation> <translation id="1435550882135542937">Extension toolbar redesign</translation> +<translation id="1436402875660227532">Note: These settings are no longer used on this system, but you can still view and edit them.</translation> <translation id="1436784010935106834">Removed</translation> <translation id="1438632560381091872">Unmute tabs</translation> <translation id="1441841714100794440">Vietnamese keyboard (Telex)</translation> @@ -1317,6 +1318,7 @@ <translation id="2889064240420137087">Open link with...</translation> <translation id="2889925978073739256">Continue blocking unsandboxed plug-ins</translation> <translation id="2890624088306605051">Only retrieve synced settings and data</translation> +<translation id="2890678560483811744">Out of bounds page reference</translation> <translation id="2893168226686371498">Default browser</translation> <translation id="289426338439836048">Other mobile network...</translation> <translation id="2894745200702272315">Enables an experimental version of 'OK Google' hotword detection features that have a hardware dependency.</translation> @@ -1345,7 +1347,6 @@ <translation id="2925966894897775835">Sheets</translation> <translation id="2927017729816812676">Cache Storage</translation> <translation id="2927657246008729253">Change...</translation> -<translation id="2928415919076124714">Hide toolbar in full screen</translation> <translation id="2928526264833629376">Continue to Hangouts</translation> <translation id="2930644991850369934">There was a problem during recovery image download. Network connection has been lost.</translation> <translation id="293111069139560936">Allows the shelf to minimise a window if a shelf item gets clicked which has only a single, already active, window associated with it.</translation> @@ -1590,7 +1591,6 @@ <translation id="3289566588497100676">Easy symbol input</translation> <translation id="3289856944988573801">To check for updates, please use Ethernet or Wi-Fi.</translation> <translation id="3293325348208285494">Fast start</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" will be able to read and write images, video and sound files in the checked folders.</translation> <translation id="3294437725009624529">Guest</translation> <translation id="329650768420594634">Pack Extension Warning</translation> <translation id="3296763833017966289">Georgian</translation> @@ -1648,6 +1648,7 @@ <translation id="3338239663705455570">Slovenian keyboard</translation> <translation id="3340978935015468852">settings</translation> <translation id="3341703758641437857">Allow access to file URLs</translation> +<translation id="3343813173145836998">Sign in easily on this device</translation> <translation id="3344786168130157628">Access Point Name:</translation> <translation id="3345135638360864351">Your request to access this site could not be sent to <ph name="NAME" />. Please try again.</translation> <translation id="3345886924813989455">No supported browser found</translation> @@ -2287,6 +2288,7 @@ <translation id="4268025649754414643">Key Encipherment</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Version <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">No matches</translation> <translation id="4274187853770964845">Sync Error: Please stop and restart Sync.</translation> <translation id="4275830172053184480">Restart your device</translation> <translation id="4276796043975446927">Welcome to Chromebox for meetings</translation> @@ -2356,6 +2358,7 @@ <translation id="4378551569595875038">Connecting...</translation> <translation id="438122767399415311">Force UI direction</translation> <translation id="4381849418013903196">Colon</translation> +<translation id="4383192539467954373">Automatically sign in across devices</translation> <translation id="4384652540891215547">Activate the extension</translation> <translation id="438503109373656455">Spirit</translation> <translation id="4387554346626014084">Enable App Launcher sync. This also enables Folders where available (non OSX).</translation> @@ -2388,6 +2391,7 @@ <translation id="444267095790823769">Protected content exceptions</translation> <translation id="4443536555189480885">&Help</translation> <translation id="4444304522807523469">Access document scanners attached via USB or on the local network</translation> +<translation id="4445559854264555037">Not seeing your device? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Mirrored</translation> <translation id="4447465454292850432">Battery:</translation> <translation id="4449935293120761385">About Auto-fill</translation> @@ -2646,6 +2650,7 @@ <translation id="485316830061041779">German</translation> <translation id="4856478137399998590">Your data service is activated and ready to use</translation> <translation id="4858913220355269194">Footy</translation> +<translation id="4860565041166337978">Allow downloads to be handled by the system download manager when applicable.</translation> <translation id="48607902311828362">Aeroplane mode</translation> <translation id="4861833787540810454">&Play</translation> <translation id="4862050643946421924">Adding device...</translation> @@ -2729,7 +2734,6 @@ <translation id="4977942889532008999">Confirm Access</translation> <translation id="4982718461356080574">Hiding close buttons on inactive tabs when stacked</translation> <translation id="498294082491145744">Change your settings that control websites' access to features such as cookies, JavaScript, plug-ins, geo-location, microphone, camera etc.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Pages</translation> <translation id="4988792151665380515">Failed to export public key.</translation> <translation id="49896407730300355">Rotate a&nti-clockwise</translation> @@ -2918,7 +2922,6 @@ <translation id="5268606875983318825">PPAPI (out-of-process)</translation> <translation id="526926484727016706">Causes all iframes to be denied all permissions by default. Allowing particular permissions for an iframe may involve listing the names of these permissions as values of new iframe attributes.</translation> <translation id="5269977353971873915">Print Failed</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" will be able to read images, video and sound files in the ticked folders.</translation> <translation id="5271247532544265821">Toggle Simplified/Traditional Chinese mode</translation> <translation id="5271549068863921519">Save password</translation> <translation id="5273628206174272911">Experimental history navigation in response to horizontal overscroll.</translation> @@ -3008,11 +3011,11 @@ <translation id="5390284375844109566">Indexed Database</translation> <translation id="5392544185395226057">Enable support for Native Client.</translation> <translation id="5393125431335030955">This plug-in only works on the desktop.</translation> -<translation id="5393559999218790205">Disable UI compositor animation timelines</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> on <ph name="PEPPER_PLUGIN_DOMAIN" /> wants to access your computer.</translation> <translation id="539755880180803351">Annotates web forms with Auto-fill field type predictions as placeholder text.</translation> <translation id="5397578532367286026">Usage and history of this user can be reviewed by the manager (<ph name="MANAGER_EMAIL" />) on chrome.com.</translation> <translation id="5397794290049113714">You</translation> +<translation id="5398572795982417028">Out of bounds page reference, limit is <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> from other sites</translation> <translation id="5399158067281117682">PINs don't match!</translation> <translation id="5400640815024374115">Trusted Platform Module (TPM) chip is disabled or absent.</translation> @@ -3032,7 +3035,7 @@ <translation id="5423849171846380976">Activated</translation> <translation id="5425470845862293575">Enables the use of experimental DirectWrite font rendering system.</translation> <translation id="5425722269016440406">You must be online to turn off Smart Lock because this setting is synced to your phone and other devices. Please connect to a network first.</translation> -<translation id="5426623592374109001">Use old intrusive animation subsystem for composited animations in UI.</translation> +<translation id="5425863515030416387">Sign in easily across devices</translation> <translation id="5427459444770871191">Rotate &Clockwise</translation> <translation id="5428105026674456456">Spanish</translation> <translation id="542872847390508405">You’re browsing as a Guest</translation> @@ -3227,7 +3230,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">Pinch scale</translation> <translation id="5710406368443808765">Oops! The system failed to store the device token and ID.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> not responding. Unable to cast.</translation> <translation id="5711983031544731014">Unable to unlock. Enter your password.</translation> <translation id="5712966208980506909">If enabled, the chrome://md-policy URL loads the Material Design policy page.</translation> <translation id="5715711091495208045">Plug-in Broker: <ph name="PLUGIN_NAME" /></translation> @@ -3496,7 +3498,6 @@ <translation id="6111974609785983504">Allowed by default</translation> <translation id="6113134669445407638">Disable Delay Agnostic AEC in WebRTC. Use if reported system delays are very trusted, or if others experience echo from your machine.</translation> <translation id="6116921718742659598">Change language and input settings</translation> -<translation id="6117536376248197233">Disable compositor animation timelines in renderers.</translation> <translation id="6120205520491252677">Pin this page to Start screen...</translation> <translation id="6122081475643980456">Your Internet connection is being controlled</translation> <translation id="6122093587541546701">Email (optional):</translation> @@ -3528,6 +3529,7 @@ <translation id="6163522313638838258">Expand all...</translation> <translation id="6164005077879661055">All files and local data associated with the supervised user will be permanently deleted once this supervised user is removed. Visited websites and settings for this supervised user may still be visible by the manager at <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Learn more</translation> +<translation id="6167008112175207002">Your bookmarks, history, passwords and other settings will be synced to your Google Account so that you can use them on all your devices. You can change this in <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Simulated hardware 'OK Google' features</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">Select a certificate</translation> @@ -3773,7 +3775,6 @@ <translation id="6555432686520421228">Remove all user accounts and reset your <ph name="IDS_SHORT_PRODUCT_NAME" /> device to be just like new.</translation> <translation id="6556866813142980365">Redo</translation> <translation id="6557565812667414268">Enabled only for high-DPI displays</translation> -<translation id="655845594391856372">Tab not responding. Unable to cast.</translation> <translation id="6559580823502247193">(already on this device)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Extracting recovery image...</translation> @@ -3874,6 +3875,7 @@ <translation id="6723354935081862304">Print to Google Docs and other cloud destinations. <ph name="BEGIN_LINK" />Sign in<ph name="END_LINK" /> to print to Google Cloud Print.</translation> <translation id="6723661294526996303">Import bookmarks and settings...</translation> <translation id="6723839937902243910">Power</translation> +<translation id="6725240607822645708">Run IME on its own thread.</translation> <translation id="6725970970008349185">Number of candidates to be displayed per page</translation> <translation id="672609503628871915">See what's new</translation> <translation id="6727005317916125192">Previous pane</translation> @@ -4004,12 +4006,11 @@ <translation id="6948736568813450284">For developers: use the sandbox service for Google Payments API calls.</translation> <translation id="6949306908218145636">Bookmark Open Pages...</translation> <translation id="695164542422037736">If this option is enabled and if the body is styled with background-attachment:fixed, the background will have its own composited layer.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> remembers your passwords and signs you in to sites automatically on this device.</translation> <translation id="6955446738988643816">Inspect Pop-up</translation> <translation id="695755122858488207">Unselected radio button</translation> +<translation id="6960277925159781810">Automatically sign in on this device</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Enable syncing over mobile data</translation> -<translation id="6964308487066031935">Add folders to "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Device</translation> @@ -4110,7 +4111,6 @@ <translation id="7076293881109082629">Signing in</translation> <translation id="7077829361966535409">The sign-in page failed to load using the current proxy settings. Please <ph name="GAIA_RELOAD_LINK_START" />try to sign in again<ph name="GAIA_RELOAD_LINK_END" /> or use different <ph name="PROXY_SETTINGS_LINK_START" />proxy settings<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignored protocol handlers</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" will be able to read and delete images, video and sound files in the ticked folders.</translation> <translation id="708060913198414444">C&opy audio address</translation> <translation id="708187310695946552">Session restore bubble UI</translation> <translation id="7082055294850503883">Ignore Caps Lock status and input lower case by default</translation> @@ -4482,7 +4482,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" would like to remove "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> is displayed in this language</translation> <translation id="7654941827281939388">This account is already being used on this computer.</translation> -<translation id="7655165758820095116">The MediaSource object allows JavaScript to send media data directly to a video element.</translation> <translation id="7658239707568436148">Cancel</translation> <translation id="7659584679870740384">You are not authorised to use this device. Please contact the administrator for sign-in permission.</translation> <translation id="7664620655576155379">Unsupported Bluetooth device: "<ph name="DEVICE_NAME" />".</translation> @@ -4613,6 +4612,7 @@ <translation id="7861215335140947162">&Downloads</translation> <translation id="7864539943188674973">Disable Bluetooth</translation> <translation id="7868891395842935202">Enables the Experimental Framework for controlling access to API experiments.</translation> +<translation id="7870576007982733437">Use system download manager when applicable.</translation> <translation id="7870790288828963061">No Kiosk apps with newer version found. Nothing to update. Please remove the USB stick.</translation> <translation id="787150342916295244">Credit card scanning</translation> <translation id="7874357055309047713">Always run on all sites</translation> @@ -4655,7 +4655,6 @@ <translation id="7918257978052780342">Enrol</translation> <translation id="7920092496846849526">You asked your parent if it's OK to visit this page.</translation> <translation id="7925285046818567682">Waiting for <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> remembers your passwords and signs you in to apps and sites automatically across devices.</translation> <translation id="7925686952655276919">Do not use mobile data for sync</translation> <translation id="7926906273904422255">Mark non-secure origins as non-secure or "dubious".</translation> <translation id="7928710562641958568">Eject device</translation> @@ -4717,7 +4716,6 @@ Keep your key file in a safe place. You will need it to create new versions of your extension.</translation> <translation id="799923393800005025">Can view</translation> <translation id="7999338963698132743">New task manager</translation> -<translation id="8000004253404706714">Use old intrusive animation subsystem for composited animations in renderers.</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8007030362289124303">Battery Low</translation> <translation id="8008356846765065031">Internet disconnected. Please check your Internet connection.</translation> @@ -5241,6 +5239,7 @@ <translation id="8765985713192161328">Manage handlers...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Users</translation> +<translation id="8768367823103160496">Mouse cursor lock</translation> <translation id="8769662576926275897">Card details</translation> <translation id="8770196827482281187">Persian input method (ISIRI 2901 layout)</translation> <translation id="8774934320277480003">Top margin</translation> @@ -5260,6 +5259,7 @@ <translation id="8795668016723474529">Add a credit card</translation> <translation id="8795916974678578410">New Window</translation> <translation id="8798099450830957504">Default</translation> +<translation id="8799127529310003270">If enabled, InputConnection calls run on IME thread, and instead of keeping a replica editor, each InputConnection call will directly talk to renderer.</translation> <translation id="8799839487311913894">Enable updating a password in the password manager after submitting a "change password" form.</translation> <translation id="8800004011501252845">Showing destinations for</translation> <translation id="8800420788467349919">Volume: <ph name="PRECENTAGE" />%</translation> @@ -5285,6 +5285,7 @@ <translation id="8841142799574815336">Inert visual viewport.</translation> <translation id="884264119367021077">Delivery address</translation> <translation id="8844238624737526720">Use the new and optimised implementation of the chrome task manager.</translation> +<translation id="8845001906332463065">Get help</translation> <translation id="8846141544112579928">Searching for keyboard...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift-key mode switch</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index d535053..879cef9 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Agregar esta página a marcadores...</translation> <translation id="1047956942837015229">Eliminando <ph name="COUNT" /> elementos…</translation> <translation id="1048597748939794622">Forzado en todas las capas</translation> +<translation id="1049795001945932310">&Configuración de idiomas</translation> <translation id="1049926623896334335">Documento de Word</translation> <translation id="1054153489933238809">Abrir imagen original en una pestaña nueva</translation> <translation id="1055806300943943258">Buscando dispositivos Bluetooth y USB…</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliteración (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Servidores de nombres automáticos</translation> <translation id="1215411991991485844">Nueva aplicación en segundo plano agregada</translation> +<translation id="1216954813581739968">Habilitar pestaña para uso compartido de escritorio</translation> <translation id="121827551500866099">Mostrar todas las descargas...</translation> <translation id="122082903575839559">Algoritmo de firma del certificado</translation> <translation id="1221024147024329929">PKCS N. º 1 MD2 con encriptación RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Se produjo un error al acceder automáticamente.</translation> <translation id="1293556467332435079">Archivos</translation> <translation id="1294298200424241932">Modificar configuración de confiabilidad:</translation> +<translation id="1295794900245526845">Elegir tu cuenta guardada con <ph name="PASSWORD_MANAGER_BRAND" /> para acceder</translation> <translation id="1297175357211070620">Destino</translation> <translation id="1297922636971898492">Actualmente, Google Drive no está disponible. La carga se reiniciará automáticamente cuando vuelva a estar disponible.</translation> <translation id="1300861494336759522">Redireccionamiento de la búsqueda de escritorio de Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Esta acción restablecerá la página de inicio, la página Nueva pestaña, el motor de búsqueda y las pestañas fijas. Además, inhabilitará todas las extensiones y borrará datos temporales, como las cookies. No se borrarán tus marcadores, historial ni contraseñas guardadas.</translation> <translation id="1434886155212424586">La página Nueva pestaña es la nueva página principal.</translation> <translation id="1435550882135542937">Nuevo diseño de la barra de herramientas de extensiones</translation> +<translation id="1436402875660227532">Nota: Si bien puedes ver y editar esta configuración, ya no se usa en este sistema.</translation> <translation id="1436784010935106834">Eliminado</translation> <translation id="1438632560381091872">Activar sonido de las pestañas</translation> <translation id="1441841714100794440">Teclado vietnamita (Télex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Permite habilitar la compatibilidad con el teclado virtual.</translation> <translation id="1474079335130556426">Habilita el modo en segundo plano para la API de Push. Permite que Chrome continúe ejecutándose después de que la última ventana se cierra y que arranque al iniciarse el SO, si la API de Push lo necesita.</translation> <translation id="1474339897586437869">No se cargó "<ph name="FILENAME" />". No hay suficiente espacio libre en Google Drive.</translation> +<translation id="1476607407192946488">&Configuración de idiomas</translation> <translation id="1476949146811612304">Establece el motor de búsqueda que se utiliza cuando se realiza una búsqueda en el <ph name="BEGIN_LINK" />cuadro multifunción<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Caché del token de la API de identidad</translation> <translation id="1478340334823509079">Detalles: <ph name="FILE_NAME" /></translation> @@ -646,6 +651,7 @@ <translation id="1962233722219655970">Esta página usa una aplicación con tecnología Native Client que no funciona en tu computadora.</translation> <translation id="1965328510789761112">Memoria privada</translation> <translation id="1965624977906726414">No requiere permisos especiales.</translation> +<translation id="1968720524450620475">Habilitar íconos de acción para las notificaciones web</translation> <translation id="1970746430676306437">Ver &información de la página</translation> <translation id="197288927597451399">Conservar</translation> <translation id="1973491249112991739">Error al descargar <ph name="PLUGIN_NAME" /></translation> @@ -905,6 +911,7 @@ <translation id="2344262275956902282">Utilizar las teclas - y = para enviar una lista de candidatos</translation> <translation id="2347476388323331511">No fue posible sincronizar.</translation> <translation id="2347991999864119449">Permitirme elegir cuándo ejecutar contenido de complementos</translation> +<translation id="2348165084656290171">Para compartir audio, selecciona una pestaña o una pantalla completa.</translation> <translation id="2350182423316644347">Iniciando aplicación...</translation> <translation id="2350796302381711542">¿Deseas permitir que <ph name="HANDLER_HOSTNAME" /> abra todos los vínculos de <ph name="PROTOCOL" /> en lugar de <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Teclado e idioma</translation> @@ -992,6 +999,7 @@ <translation id="247772113373397749">Teclado multilingüe canadiense</translation> <translation id="2478176599153288112">Permisos de archivo de medios para "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">Solo desbloquear este dispositivo <ph name="DEVICE_TYPE" /> cuando el teléfono esté al alcance de la mano</translation> +<translation id="247949520305900375">Compartir audio</translation> <translation id="2479780645312551899">Ejecutar todos los complementos simultáneamente</translation> <translation id="2480626392695177423">Alternar entre modo de puntuación de ancho completo/medio</translation> <translation id="2481332092278989943">Agregar a la biblioteca</translation> @@ -1306,6 +1314,7 @@ <translation id="2889064240420137087">Abrir el vínculo con...</translation> <translation id="2889925978073739256">Seguir bloqueando los complementos no incluidos en la zona de pruebas</translation> <translation id="2890624088306605051">Solo recuperar la configuración y los datos sincronizados</translation> +<translation id="2890678560483811744">Referencia de página fuera de los límites</translation> <translation id="2893168226686371498">Navegador predeterminado</translation> <translation id="289426338439836048">Otra red para celulares...</translation> <translation id="2894745200702272315">Habilita una versión experimental de funciones de detección de palabras clave de "OK Google" que dependen del hardware.</translation> @@ -1334,7 +1343,6 @@ <translation id="2925966894897775835">Hojas de cálculo de Google</translation> <translation id="2927017729816812676">Almacenamiento en caché</translation> <translation id="2927657246008729253">Cambiar...</translation> -<translation id="2928415919076124714">Ocultar la barra de herramientas en pantalla completa</translation> <translation id="2928526264833629376">Continuar a Hangouts</translation> <translation id="2930644991850369934">Se produjo un error durante la descarga de la imagen de recuperación. Se perdió la conexión de red.</translation> <translation id="293111069139560936">Permite que la biblioteca minimice una ventana si se hace clic en un elemento de la biblioteca que solo tenga una ventana activa asociada.</translation> @@ -1458,6 +1466,7 @@ <translation id="3117812041123364382">Permite habilitar o inhabilitar el teclado virtual flotante.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> Ayuda</translation> <translation id="3120430004221004537">La encriptación no fue suficiente para una operación en: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">Permite habilitar íconos en los botones de acción para las notificaciones web.</translation> <translation id="3121793941267913344">Restablecer este dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Experimentos en Herramientas para programadores</translation> <translation id="3122464029669770682">CPU</translation> @@ -1578,7 +1587,6 @@ <translation id="3289566588497100676">Ingreso fácil de símbolos</translation> <translation id="3289856944988573801">Para comprobar si hay actualizaciones, utiliza una conexión Ethernet o Wi-Fi.</translation> <translation id="3293325348208285494">Inicio rápido</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" podrá leer y editar archivos de sonido, video e imagen almacenados en las carpetas seleccionadas.</translation> <translation id="3294437725009624529">Invitado</translation> <translation id="329650768420594634">Advertencia sobre empaquetar extensiones</translation> <translation id="3296763833017966289">Georgiano</translation> @@ -1636,6 +1644,7 @@ <translation id="3338239663705455570">Teclado esloveno</translation> <translation id="3340978935015468852">configuración</translation> <translation id="3341703758641437857">Permitir el acceso a las URL del archivo</translation> +<translation id="3343813173145836998">Acceder fácilmente en este dispositivo</translation> <translation id="3344786168130157628">Nombre de punto de acceso:</translation> <translation id="3345135638360864351">No se pudo enviar la solicitud de acceso al sitio a <ph name="NAME" />. Vuelve a intentarlo.</translation> <translation id="3345886924813989455">No se ha encontrado el navegador compatible</translation> @@ -2115,6 +2124,7 @@ <translation id="3996912167543967198">Restableciendo…</translation> <translation id="3997015411467176489">Elementos canvas experimentales</translation> <translation id="40027638859996362">Movimiento de palabra</translation> +<translation id="400554499662786523">Para compartir audio, selecciona una pestaña.</translation> <translation id="4012550234655138030">Configurar o administrar impresoras en <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">¿Reparar "<ph name="EXTENSION_NAME" />"?</translation> <translation id="4018133169783460046">Mostrar <ph name="PRODUCT_NAME" /> en este idioma</translation> @@ -2217,6 +2227,7 @@ <translation id="4180788401304023883">¿Eliminar Entidad del certificado "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">Teclado fonético de ruso (YaZHert)</translation> <translation id="4181841719683918333">Idiomas</translation> +<translation id="4187248015940562149">Habilita Web Bluetooth, que podría permitir que los sitios web se conecten a los dispositivos Bluetooth que tengas cerca y controlarlos.</translation> <translation id="4188026131102273494">Palabra clave:</translation> <translation id="4189406272289638749">La extensión <b><ph name="EXTENSION_NAME" /></b> controla esta configuración.</translation> <translation id="4193154014135846272">Documento de Google</translation> @@ -2273,6 +2284,7 @@ <translation id="4268025649754414643">Cifrado de clave</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versión <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">No hay coincidencias</translation> <translation id="4274187853770964845">Error de sincronización: debes detener la sincronización y reiniciarla.</translation> <translation id="4275830172053184480">Reiniciar tu dispositivo</translation> <translation id="4276796043975446927">Te damos la bienvenida a Chromebox para reuniones</translation> @@ -2342,6 +2354,7 @@ <translation id="4378551569595875038">Conectando…</translation> <translation id="438122767399415311">Forzar la dirección de la interfaz de usuario</translation> <translation id="4381849418013903196">Dos puntos</translation> +<translation id="4383192539467954373">Acceder automáticamente en diferentes dispositivos</translation> <translation id="4384652540891215547">Activar la extensión</translation> <translation id="438503109373656455">Rocinante</translation> <translation id="4387554346626014084">Habilita la sincronización del Selector de aplicaciones. También habilita las carpetas si están disponibles (no en OS X).</translation> @@ -2359,6 +2372,7 @@ <translation id="4421932782753506458">Peludito</translation> <translation id="4422347585044846479">Editar marcador para esta página</translation> <translation id="4422428420715047158">Dominio:</translation> +<translation id="4423482519432579560">&Corrección ortográfica</translation> <translation id="442477792133831654">Comunicación con dispositivos cercanos</translation> <translation id="4425149324548788773">Mi unidad</translation> <translation id="4428582326923056538">Las excepciones de la cámara de Adobe Flash Player son diferentes.</translation> @@ -2373,6 +2387,7 @@ <translation id="444267095790823769">Excepciones de contenido protegido</translation> <translation id="4443536555189480885">&Ayuda</translation> <translation id="4444304522807523469">Acceder a los escáneres de documentos conectados vía USB o en la red local</translation> +<translation id="4445559854264555037">¿No puedes ver tu dispositivo? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Duplicado</translation> <translation id="4447465454292850432">Batería:</translation> <translation id="4449935293120761385">Acerca de Autocompletar</translation> @@ -2630,6 +2645,7 @@ <translation id="485316830061041779">Alemán</translation> <translation id="4856478137399998590">Tu servicio de datos para celulares está activado y listo para ser utilizado</translation> <translation id="4858913220355269194">Balón</translation> +<translation id="4860565041166337978">Permitir que el administrador de descargas del sistema controle las descargas, cuando es posible</translation> <translation id="48607902311828362">Modo de avión</translation> <translation id="4861833787540810454">Reproducir</translation> <translation id="4862050643946421924">Agregando dispositivo…</translation> @@ -2713,7 +2729,6 @@ <translation id="4977942889532008999">Confirmar acceso</translation> <translation id="4982718461356080574">Opción para ocultar los botones de cierre de las pestañas inactivas cuando están apiladas</translation> <translation id="498294082491145744">Permite cambiar la configuración que controla el acceso de los sitios web a ciertas funciones, como las cookies, JavaScript, los complementos, la geolocalización, el micrófono, la cámara, etc.</translation> -<translation id="4984329823325527157">API de fuente de medios</translation> <translation id="4988526792673242964">Páginas</translation> <translation id="4988792151665380515">Error al exportar la clave pública.</translation> <translation id="49896407730300355">Girar &a la izquierda</translation> @@ -2902,7 +2917,6 @@ <translation id="5268606875983318825">PPAPI (fuera de proceso)</translation> <translation id="526926484727016706">Causa que se nieguen todos los permisos de todos los iframes de forma predeterminada. Permitir permisos particulares para un iframe puede implicar que los nombres de esos permisos se muestren como valores de atributos de iframe nuevos.</translation> <translation id="5269977353971873915">Error de impresión</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" podrá leer archivos de sonido, video e imagen almacenados en las carpetas seleccionadas.</translation> <translation id="5271247532544265821">Alternar modo chino simplificado/tradicional</translation> <translation id="5271549068863921519">Guardar contraseña</translation> <translation id="5273628206174272911">Navegación experimental por el historial en respuesta al desplazamiento horizontal</translation> @@ -2939,6 +2953,7 @@ <translation id="5316716239522500219">Reflejar monitores</translation> <translation id="5317780077021120954">Guardar</translation> <translation id="5319782540886810524">Teclado letón</translation> +<translation id="532247166573571973">Es posible que no se pueda acceder al servidor. Vuelve a intentarlo más tarde.</translation> <translation id="5323213332664049067">Latinoamericano</translation> <translation id="532360961509278431">No se puede abrir "$1": $2.</translation> <translation id="5324674707192845912">Estás a punto de anular el registro de tu <ph name="DEVICE_TYPE" /> en Google para inhabilitar la función que permite localizar el dispositivo, bloquearlo y borrar sus datos de forma remota. Para esto, debes reiniciar el dispositivo. ¿Quieres continuar?</translation> @@ -2991,11 +3006,11 @@ <translation id="5390284375844109566">Base de datos indexada</translation> <translation id="5392544185395226057">Activar asistencia para Native Client</translation> <translation id="5393125431335030955">El complemento solamente funciona en el escritorio.</translation> -<translation id="5393559999218790205">Inhabilitar los cronogramas de animación del compositor de la interfaz de usuario</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> del dominio <ph name="PEPPER_PLUGIN_DOMAIN" /> desea acceder a tu computadora.</translation> <translation id="539755880180803351">Anota los formularios web con las predicciones del tipo de campo Autocompletar como texto del marcador.</translation> <translation id="5397578532367286026">El administrador (<ph name="MANAGER_EMAIL" />) puede revisar el uso y el historial de este usuario en la página chrome.com.</translation> <translation id="5397794290049113714">Tú</translation> +<translation id="5398572795982417028">Referencia de página fuera de los límites, el valor máximo es <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> de otros sitios</translation> <translation id="5399158067281117682">Los números de PIN no coinciden.</translation> <translation id="5400640815024374115">El chip del módulo TPM está deshabilitado o no está.</translation> @@ -3015,7 +3030,7 @@ <translation id="5423849171846380976">Activado</translation> <translation id="5425470845862293575">Habilita el uso del sistema experimental de procesamiento de fuentes en DirectWrite.</translation> <translation id="5425722269016440406">Debes estar conectado a Internet para activar Smart Lock porque esta configuración se sincroniza al teléfono y a otros dispositivos. Primero, conéctate a una red.</translation> -<translation id="5426623592374109001">Usa el subsistema de animación intrusivo anterior para animaciones compuestas en la interfaz de usuario.</translation> +<translation id="5425863515030416387">Acceder fácilmente en varios dispositivos</translation> <translation id="5427459444770871191">Girar &a la derecha</translation> <translation id="5428105026674456456">Español</translation> <translation id="542872847390508405">Estás navegando como invitado</translation> @@ -3040,6 +3055,7 @@ <translation id="5451646087589576080">Ver &información del marco</translation> <translation id="5453029940327926427">Cerrar pestañas</translation> <translation id="5453632173748266363">Cirílico</translation> +<translation id="5454166040603940656">con <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Sin validez</translation> <translation id="5457459357461771897">Leer y eliminar fotos, música y otro contenido multimedia desde tu computadora</translation> <translation id="5457599981699367932">Navegar como invitado</translation> @@ -3209,7 +3225,6 @@ <translation id="5708171344853220004">Nombre principal de Microsoft</translation> <translation id="5709885306771508267">Pellizcar para escalar</translation> <translation id="5710406368443808765">El sistema no pudo almacenar el ID y el token del dispositivo.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> no responde. No se puede transmitir.</translation> <translation id="5711983031544731014">No se puede desbloquear. Ingresa la contraseña.</translation> <translation id="5712966208980506909">Si está habilitada, la URL chrome://md-policy carga la página de la política de material design.</translation> <translation id="5715711091495208045">Agente del complemento: <ph name="PLUGIN_NAME" /></translation> @@ -3476,7 +3491,6 @@ <translation id="6111974609785983504">Permitido de forma predeterminada</translation> <translation id="6113134669445407638">Permite inhabilitar Delay Agnostic AEC en WebRTC. Usa esta opción si las demoras informadas del sistema son de mucha confianza o si otras personas reciben eco desde tu máquina.</translation> <translation id="6116921718742659598">Cambiar la configuración de idioma y de entrada de texto</translation> -<translation id="6117536376248197233">Inhabilita los cronogramas de animación del compositor en procesadores.</translation> <translation id="6120205520491252677">Fijar esta página a la Pantalla de inicio...</translation> <translation id="6122081475643980456">Se está controlando tu conexión a Internet</translation> <translation id="6122093587541546701">Correo electrónico (opcional):</translation> @@ -3508,6 +3522,7 @@ <translation id="6163522313638838258">Expandir todo...</translation> <translation id="6164005077879661055">Todos los archivos y los datos locales asociados al usuario supervisado se eliminarán de forma permanente una vez que se elimine este usuario supervisado. Es posible que el administrador pueda seguir viendo la configuración y los sitios web visitados de este usuario supervisado en <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Más información</translation> +<translation id="6167008112175207002">Tus marcadores, historial, contraseñas y otras opciones de configuración se sincronizarán con tu cuenta de Google para que puedas usarlos en todos tus dispositivos. Puedes cambiar esto en <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Funciones "Ok Google" de hardware simulado</translation> <translation id="6175314957787328458">GUID de dominio de Microsoft</translation> <translation id="6178664161104547336">Seleccionar un certificado</translation> @@ -3711,6 +3726,7 @@ <translation id="648927581764831596">Ningún medio disponible</translation> <translation id="6490936204492416398">Instalar nueva extensión desde la tienda virtual</translation> <translation id="6492313032770352219">Tamaño en disco:</translation> +<translation id="6498249116389603658">&Todos tus idiomas</translation> <translation id="6499143127267478107">Resolviendo host en secuencia de comandos de proxy...</translation> <translation id="6503077044568424649">Más visitados</translation> <translation id="6503256918647795660">Teclado francés de Suiza</translation> @@ -3752,7 +3768,6 @@ <translation id="6555432686520421228">Elimina todas las cuentas de usuario y restablece tu dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /> como si fuera recién comprado.</translation> <translation id="6556866813142980365">Rehacer</translation> <translation id="6557565812667414268">Habilitado solo en pantallas de alta resolución por pulgada</translation> -<translation id="655845594391856372">La pestaña no responde. No se puede transmitir.</translation> <translation id="6559580823502247193">(ya está incluido en este dispositivo)</translation> <translation id="6561726789132298588">ingresar</translation> <translation id="6562437808764959486">Extrayendo imagen de recuperación...</translation> @@ -3853,6 +3868,7 @@ <translation id="6723354935081862304">Imprimir en Documentos de Google y en otros destinos en la nube. <ph name="BEGIN_LINK" />Inicia sesión<ph name="END_LINK" /> para imprimir en Google Cloud Print.</translation> <translation id="6723661294526996303">Importar marcadores y configuración...</translation> <translation id="6723839937902243910">Alimentación</translation> +<translation id="6725240607822645708">Ejecuta IME en su propio subproceso.</translation> <translation id="6725970970008349185">Cantidad de candidatos para mostrar por página</translation> <translation id="672609503628871915">Novedades</translation> <translation id="6727005317916125192">Panel anterior</translation> @@ -3983,12 +3999,11 @@ <translation id="6948736568813450284">Los programadores pueden usar el servicio de zona de pruebas para las llamadas de la API de Google Payments.</translation> <translation id="6949306908218145636">Agregar páginas abiertas a Marcadores…</translation> <translation id="695164542422037736">Si se habilita esta opción y se utiliza el estilo background-attachment:fixed en el cuerpo, el fondo tendrá su propia capa compuesta.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> recuerda tus contraseñas y permite que accedas a los sitios de forma automática en este dispositivo.</translation> <translation id="6955446738988643816">Inspeccionar ventana emergente</translation> <translation id="695755122858488207">Botón de radio no seleccionado</translation> +<translation id="6960277925159781810">Acceder automáticamente en este dispositivo</translation> <translation id="696036063053180184">3 Establecer (Sin Shift)</translation> <translation id="696203921837389374">Habilitar la sincronización mediante datos móviles</translation> -<translation id="6964308487066031935">¿Agregar carpetas a "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="6965648386495488594">Puerto</translation> <translation id="6965978654500191972">Dispositivo</translation> @@ -4086,7 +4101,6 @@ <translation id="7076293881109082629">Accediendo</translation> <translation id="7077829361966535409">No se pudo cargar la página de acceso a la cuenta con la configuración de proxy actual. <ph name="GAIA_RELOAD_LINK_START" />Intenta volver a acceder<ph name="GAIA_RELOAD_LINK_END" /> o utiliza otra <ph name="PROXY_SETTINGS_LINK_START" />configuración de proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Controladores de protocolo ignorados</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" podrá leer y eliminar archivos de sonido, video e imagen almacenados en las carpetas seleccionadas.</translation> <translation id="708060913198414444">Copiar dirección del audio</translation> <translation id="708187310695946552">Interfaz de usuario basada en cuadros para restaurar la sesión</translation> <translation id="7082055294850503883">Ignorar el estado de Bloq Mayús e ingresar minúsculas de forma predeterminada</translation> @@ -4230,6 +4244,8 @@ <translation id="7313804056609272439">Método de entrada vietnamita (VNI)</translation> <translation id="7314244761674113881">Host SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (actual)</translation> +<translation id="7321545336522791733">No se puede acceder al servidor</translation> +<translation id="7324841169865301118">Permite que el usuario elija una pestaña para el uso compartido para escritorio.</translation> <translation id="7325437708553334317">Extensión de alto contraste</translation> <translation id="7326565110843845436">Panel táctil para hacer clic con tres dedos</translation> <translation id="73289266812733869">Desmarcado</translation> @@ -4456,7 +4472,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" quiere eliminar "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> se muestra en este idioma</translation> <translation id="7654941827281939388">Ya se está utilizando esta cuenta en esta computadora.</translation> -<translation id="7655165758820095116">El objeto MediaSource permite que JavaScript envíe datos de medios directamente a un elemento de video.</translation> <translation id="7658239707568436148">Cancelar</translation> <translation id="7659584679870740384">No tienes autorización para utilizar este dispositivo. Para obtener permiso de acceso, comunícate con el administrador.</translation> <translation id="7664620655576155379">Dispositivo Bluetooth no compatible: "<ph name="DEVICE_NAME" />"</translation> @@ -4587,6 +4602,7 @@ <translation id="7861215335140947162">&Descargas</translation> <translation id="7864539943188674973">Desactivar Bluetooth</translation> <translation id="7868891395842935202">Habilita el marco experimental para controlar el acceso a los experimentos de API.</translation> +<translation id="7870576007982733437">Usa el administrador de descargas del sistema, cuando es posible.</translation> <translation id="7870790288828963061">No se encontraron aplicaciones de kiosco con una versión más reciente. No hay nada para actualizar. Desconecta el dispositivo USB.</translation> <translation id="787150342916295244">Escaneo de la tarjeta de crédito</translation> <translation id="7874357055309047713">Ejecutar siempre en todos los sitios</translation> @@ -4629,7 +4645,6 @@ <translation id="7918257978052780342">Inscribir</translation> <translation id="7920092496846849526">Les preguntaste a tus padres si puedes visitar esta página.</translation> <translation id="7925285046818567682">Esperando <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> recuerda tus contraseñas y permite que accedas a las apps y los sitios de forma automática a través de los dispositivos.</translation> <translation id="7925686952655276919">No utilizar datos móviles para la sincronización</translation> <translation id="7926906273904422255">Marcar un origen no seguro como "no seguro" o "dudoso"</translation> <translation id="7928710562641958568">Dispositivo de expulsión</translation> @@ -4691,7 +4706,6 @@ Mantén el archivo de clave en un lugar seguro. Debes crear las nuevas versiones de tu extensión.</translation> <translation id="799923393800005025">Se puede ver</translation> <translation id="7999338963698132743">Nuevo Administrador de tareas</translation> -<translation id="8000004253404706714">Usa el subsistema de animación intrusivo anterior para animaciones compuestas en procesadores.</translation> <translation id="8004582292198964060">Navegador</translation> <translation id="8007030362289124303">Batería baja</translation> <translation id="8008356846765065031">No hay conexión a Internet. Comprueba la conexión.</translation> @@ -4820,6 +4834,7 @@ <translation id="8185331656081929126">Mostrar notificaciones cuando se detecten nuevas impresoras en la red</translation> <translation id="8186609076106987817">El servidor no pudo encontrar el archivo.</translation> <translation id="8186706823560132848">Software</translation> +<translation id="8188120771410500975">&Comprobar la ortografía de los campos de texto</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> y <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> más</translation> <translation id="8190193592390505034">Estableciendo conexión con <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Administrar tus aplicaciones, extensiones y temas</translation> @@ -5212,6 +5227,7 @@ <translation id="8765985713192161328">Administrar controladores...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Usuarios</translation> +<translation id="8768367823103160496">Bloqueo del cursor del mouse</translation> <translation id="8769662576926275897">Detalles de la tarjeta</translation> <translation id="8770196827482281187">Método de entrada persa (diseño ISIRI 2901)</translation> <translation id="8774934320277480003">Margen superior</translation> @@ -5231,6 +5247,7 @@ <translation id="8795668016723474529">Agregar una tarjeta de crédito</translation> <translation id="8795916974678578410">Nueva ventana</translation> <translation id="8798099450830957504">Predeterminado</translation> +<translation id="8799127529310003270">Si esta opción está activada, InPutConnection invoca la ejecución del subproceso IME y, en lugar de mantener un editor de réplica, cada invocación de InputConnection se comunicará directamente con el procesador.</translation> <translation id="8799839487311913894">Habilita la actualización de una contraseña en el administrador de contraseñas después de enviar un formulario de cambio de contraseña.</translation> <translation id="8800004011501252845">Mostrando destinos para</translation> <translation id="8800420788467349919">Volumen: <ph name="PRECENTAGE" />%</translation> @@ -5256,6 +5273,7 @@ <translation id="8841142799574815336">Ventana gráfica visual inerte</translation> <translation id="884264119367021077">Dirección de envío</translation> <translation id="8844238624737526720">Utiliza la implementación nueva y optimizada del Administrador de tareas de Chrome.</translation> +<translation id="8845001906332463065">Obtener ayuda</translation> <translation id="8846141544112579928">Buscando teclado…</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Cambiar interruptor de modo clave</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index e5f9d5d..35b98ae 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Añadir esta página a marcadores...</translation> <translation id="1047956942837015229">Eliminando <ph name="COUNT" /> elementos...</translation> <translation id="1048597748939794622">Forzado en todas las capas</translation> +<translation id="1049795001945932310">&Configuración de idioma</translation> <translation id="1049926623896334335">Documento de Word</translation> <translation id="1054153489933238809">Abrir &imagen original en una pestaña nueva</translation> <translation id="1055806300943943258">Buscando dispositivos USB y Bluetooth...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliteración (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Servidores de nombres automáticos</translation> <translation id="1215411991991485844">Nueva aplicación en segundo plano añadida</translation> +<translation id="1216954813581739968">Habilitar la función de compartir pestañas en el escritorio remoto.</translation> <translation id="121827551500866099">Mostrar todas las descargas...</translation> <translation id="122082903575839559">Algoritmo de firma de certificado</translation> <translation id="1221024147024329929">PKCS #1 MD2 con cifrado RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Error al iniciar sesión automáticamente</translation> <translation id="1293556467332435079">Archivos</translation> <translation id="1294298200424241932">Editar configuración de confianza:</translation> +<translation id="1295794900245526845">Selecciona tu cuenta guardada con <ph name="PASSWORD_MANAGER_BRAND" /> para iniciar sesión</translation> <translation id="1297175357211070620">Destino</translation> <translation id="1297922636971898492">Google Drive no está disponible en estos momentos. La subida se reiniciará automáticamente cuando vuelva a estar disponible.</translation> <translation id="1300861494336759522">Redirección de las búsquedas del escritorio de Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Se restablecerán la página de inicio, la página Nueva pestaña, el motor de búsqueda y las pestañas fijadas. También se inhabilitarán todas las extensiones y se borrarán los datos temporales como las cookies. Los marcadores, el historial y las contraseñas guardadas no se borrarán.</translation> <translation id="1434886155212424586">La página de inicio es la página Nueva pestaña</translation> <translation id="1435550882135542937">Nuevo diseño de barra de herramientas de extensiones</translation> +<translation id="1436402875660227532">Nota: Esta configuración ya no se utiliza en este sistema, pero puedes verla y cambiarla.</translation> <translation id="1436784010935106834">Eliminado</translation> <translation id="1438632560381091872">Activar sonido de pestañas</translation> <translation id="1441841714100794440">Teclado vietnamita (Télex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Permite habilitar el uso del teclado virtual.</translation> <translation id="1474079335130556426">Habilita el modo en segundo plano para la API de Push. De este modo, Chrome puede seguir funcionando cuando se cierre la última ventana y puede ejecutarse al iniciar el SO si la API de Push lo necesita.</translation> <translation id="1474339897586437869">No se ha subido <ph name="FILENAME" />. No hay suficiente espacio libre en tu cuenta de Google Drive.</translation> +<translation id="1476607407192946488">&Configuración de idioma</translation> <translation id="1476949146811612304">Especifica el motor de búsqueda que se debe utilizar al realizar una búsqueda desde el <ph name="BEGIN_LINK" />omnibox<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Caché del token de la API de identidad</translation> <translation id="1478340334823509079">Detalles: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Esta página utiliza una aplicación de Native Client que no funciona en tu ordenador.</translation> <translation id="1965328510789761112">Memoria privada</translation> <translation id="1965624977906726414">No tiene permisos especiales.</translation> +<translation id="1968720524450620475">Habilitar iconos de acción para las notificaciones web.</translation> <translation id="1970746430676306437">Ver &información de la página</translation> <translation id="197288927597451399">Descargar</translation> <translation id="1973491249112991739">Error al descargar <ph name="PLUGIN_NAME" /></translation> @@ -909,6 +915,7 @@ <translation id="2344262275956902282">Utilizar las teclas "-" y "=" para mostrar la lista de caracteres</translation> <translation id="2347476388323331511">No se ha podido realizar la sincronización.</translation> <translation id="2347991999864119449">Permitirme decidir cuándo ejecutar contenido de plugins</translation> +<translation id="2348165084656290171">Seleccionar una pestaña o toda la pantalla para compartir audio</translation> <translation id="2350182423316644347">Iniciando aplicación...</translation> <translation id="2350796302381711542">¿Quieres permitir que <ph name="HANDLER_HOSTNAME" /> en lugar de <ph name="REPLACED_HANDLER_TITLE" /> abra todos los enlaces de <ph name="PROTOCOL" />?</translation> <translation id="2351266942280602854">Idioma y entrada</translation> @@ -996,6 +1003,7 @@ <translation id="247772113373397749">Teclado multilingüe canadiense</translation> <translation id="2478176599153288112">Permisos de archivos multimedia para "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">Solo se desbloqueará este <ph name="DEVICE_TYPE" /> cuando el teléfono esté al alcance de la mano.</translation> +<translation id="247949520305900375">Compartir audio</translation> <translation id="2479780645312551899">Ejecutar todos los complementos esta vez</translation> <translation id="2480626392695177423">Alternar modo de puntuación de ancho medio o completo</translation> <translation id="2481332092278989943">Añadir a la estantería</translation> @@ -1312,6 +1320,7 @@ <translation id="2889064240420137087">Abrir enlace con...</translation> <translation id="2889925978073739256">Seguir bloqueando complementos no incluidos en la zona de pruebas</translation> <translation id="2890624088306605051">Recuperar solamente datos y valores de configuración sincronizados</translation> +<translation id="2890678560483811744">La referencia de página está fuera de los límites admitidos</translation> <translation id="2893168226686371498">Navegador predeterminado</translation> <translation id="289426338439836048">Otra red móvil...</translation> <translation id="2894745200702272315">Habilita una versión experimental de las funciones de detección de la palabra activa "Ok Google" con dependencia de hardware.</translation> @@ -1340,7 +1349,6 @@ <translation id="2925966894897775835">Hojas de cálculo de Google</translation> <translation id="2927017729816812676">Almacenamiento en caché</translation> <translation id="2927657246008729253">Cambiar...</translation> -<translation id="2928415919076124714">Ocultar barra de herramientas en modo de pantalla completa</translation> <translation id="2928526264833629376">Acceder a Hangouts</translation> <translation id="2930644991850369934">Se ha producido un error durante la descarga de la imagen de recuperación. Se ha perdido la conexión de red.</translation> <translation id="293111069139560936">Permite que la estantería minimice una ventana si se hace clic en un elemento de la estantería que solo tenga una ventana activa asociada.</translation> @@ -1464,6 +1472,7 @@ <translation id="3117812041123364382">Habilita o inhabilita el teclado virtual flotante.</translation> <translation id="3118319026408854581">Ayuda de <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Cifrado insuficiente para una operación determinada de "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">Habilitar iconos en los botones de acción para las notificaciones web.</translation> <translation id="3121793941267913344">Restablece este dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Experimentos de Herramientas para desarrolladores</translation> <translation id="3122464029669770682">CPU</translation> @@ -1584,7 +1593,6 @@ <translation id="3289566588497100676">Introducción sencilla de símbolos</translation> <translation id="3289856944988573801">Para comprobar si hay actualizaciones, utiliza una conexión Ethernet o Wi-Fi.</translation> <translation id="3293325348208285494">Inicio rápido</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" podrá leer y editar archivos de sonido, vídeo e imágenes almacenados en las carpetas seleccionadas.</translation> <translation id="3294437725009624529">Invitado</translation> <translation id="329650768420594634">Advertencia sobre el empaquetado de extensión</translation> <translation id="3296763833017966289">Georgiano</translation> @@ -1639,6 +1647,7 @@ <translation id="3338239663705455570">Teclado esloveno</translation> <translation id="3340978935015468852">configuración</translation> <translation id="3341703758641437857">Permitir acceso a URL de archivo</translation> +<translation id="3343813173145836998">Inicia sesión fácilmente en este dispositivo</translation> <translation id="3344786168130157628">Nombre del punto de acceso:</translation> <translation id="3345135638360864351">No se ha podido enviar la solicitud de acceso a este sitio a <ph name="NAME" />. Vuelve a intentarlo.</translation> <translation id="3345886924813989455">No se ha encontrado ningún navegador compatible.</translation> @@ -2117,6 +2126,7 @@ <translation id="3996912167543967198">Restableciendo...</translation> <translation id="3997015411467176489">Elementos canvas experimentales</translation> <translation id="40027638859996362">Movimiento de palabras</translation> +<translation id="400554499662786523">Seleccionar una pestaña para compartir audio</translation> <translation id="4012550234655138030">Configurar o administrar impresoras en <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">¿Reparar "<ph name="EXTENSION_NAME" />"?</translation> <translation id="4018133169783460046">Mostrar <ph name="PRODUCT_NAME" /> en este idioma</translation> @@ -2219,6 +2229,7 @@ <translation id="4180788401304023883">¿Quieres eliminar el certificado de CA "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">Teclado fonético ruso (YaZHert)</translation> <translation id="4181841719683918333">Idiomas</translation> +<translation id="4187248015940562149">Habilita la función Bluetooth web, lo que podría permitir que los sitios web se conecten a los dispositivos Bluetooth que se encuentren cerca de ti y los controlen.</translation> <translation id="4188026131102273494">Palabra clave:</translation> <translation id="4189406272289638749">La extensión <b><ph name="EXTENSION_NAME" /></b> controla esta opción.</translation> <translation id="4193154014135846272">Documento de Google</translation> @@ -2275,6 +2286,7 @@ <translation id="4268025649754414643">Cifrado de clave</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versión <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Sin resultados</translation> <translation id="4274187853770964845">Error de sincronización: debes detener la sincronización y reiniciarla.</translation> <translation id="4275830172053184480">Reiniciar tu dispositivo</translation> <translation id="4276796043975446927">Te damos la bienvenida a Chromebox para reuniones</translation> @@ -2344,6 +2356,7 @@ <translation id="4378551569595875038">Conectando...</translation> <translation id="438122767399415311">Forzar la dirección de la interfaz</translation> <translation id="4381849418013903196">Dos puntos</translation> +<translation id="4383192539467954373">Inicia sesión automáticamente en todos los dispositivos</translation> <translation id="4384652540891215547">Activar la extensión</translation> <translation id="438503109373656455">Rocinante</translation> <translation id="4387554346626014084">Habilita la sincronización del menú de aplicaciones. También habilita las carpetas si están disponibles (no en OS X).</translation> @@ -2361,6 +2374,7 @@ <translation id="4421932782753506458">Gatito</translation> <translation id="4422347585044846479">Editar marcador para esta página</translation> <translation id="4422428420715047158">Dominio:</translation> +<translation id="4423482519432579560">&Corrector ortográfico</translation> <translation id="442477792133831654">Comunicación con dispositivos cercanos</translation> <translation id="4425149324548788773">Mi unidad</translation> <translation id="4428582326923056538">Las excepciones de la cámara de Adobe Flash Player son diferentes.</translation> @@ -2375,6 +2389,7 @@ <translation id="444267095790823769">Excepciones de contenido protegido</translation> <translation id="4443536555189480885">&Ayuda</translation> <translation id="4444304522807523469">Acceder a escáneres de documentos conectados a través de USB o en la red local</translation> +<translation id="4445559854264555037">¿No aparece tu dispositivo? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Duplicado</translation> <translation id="4447465454292850432">Batería:</translation> <translation id="4449935293120761385">Sobre la función Autocompletar</translation> @@ -2632,6 +2647,7 @@ <translation id="485316830061041779">Alemán</translation> <translation id="4856478137399998590">Tu servicio de datos móviles se ha activado y está listo para utilizarse.</translation> <translation id="4858913220355269194">Balón</translation> +<translation id="4860565041166337978">Permitir que el administrador de descargas del sistema procese las descargas (si procede).</translation> <translation id="48607902311828362">Modo avión</translation> <translation id="4861833787540810454">&Reproducir</translation> <translation id="4862050643946421924">Añadiendo dispositivo...</translation> @@ -2715,7 +2731,6 @@ <translation id="4977942889532008999">Confirmar acceso</translation> <translation id="4982718461356080574">Ocultar botones de cierre en pestañas inactivas cuando están apiladas</translation> <translation id="498294082491145744">Cambiar la configuración que controla el acceso de los sitios web a funciones como las cookies, JavaScript, los complementos, la ubicación geográfica, el micrófono o la cámara.</translation> -<translation id="4984329823325527157">API de fuente de medios</translation> <translation id="4988526792673242964">Páginas</translation> <translation id="4988792151665380515">Se ha producido un error al exportar la clave pública.</translation> <translation id="49896407730300355">Girar a la &izquierda</translation> @@ -2901,7 +2916,6 @@ <translation id="5268606875983318825">PPAPI (fuera de proceso)</translation> <translation id="526926484727016706">Provoca que se denieguen todos los permisos para los iframes de forma predeterminada. Si se conceden permisos particulares para un iframe, es posible que haya que incluir los nombres de esos permisos como valores de los atributos de los nuevos iframe.</translation> <translation id="5269977353971873915">Error de impresión</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" podrá leer archivos de sonido, vídeo e imágenes almacenados en las carpetas seleccionadas.</translation> <translation id="5271247532544265821">Alternar modo chino tradicional y simplificado</translation> <translation id="5271549068863921519">Guardar contraseña</translation> <translation id="5273628206174272911">Permite habilitar la función experimental de navegación por el historial en respuesta al desplazamiento horizontal con rebote.</translation> @@ -2938,6 +2952,7 @@ <translation id="5316716239522500219">Copiar monitores</translation> <translation id="5317780077021120954">Guardar</translation> <translation id="5319782540886810524">Teclado lituano</translation> +<translation id="532247166573571973">Es posible que no se pueda acceder al servidor. Vuelve a intentarlo más tarde.</translation> <translation id="5323213332664049067">español (Latinoamérica)</translation> <translation id="532360961509278431">No se puede abrir "$1": $2</translation> <translation id="5324674707192845912">Vas a anular el registro de este <ph name="DEVICE_TYPE" /> en Google para inhabilitar la función que permite localizar, borrar y bloquear el dispositivo de forma remota. Para hacerlo, debes reiniciar el dispositivo. ¿Quieres continuar?</translation> @@ -2990,11 +3005,11 @@ <translation id="5390284375844109566">Base de datos indexada</translation> <translation id="5392544185395226057">Habilita la compatibilidad con el cliente nativo.</translation> <translation id="5393125431335030955">Este complemento solo funciona en el escritorio.</translation> -<translation id="5393559999218790205">Inhabilitar las líneas de tiempo de animaciones del compositor en la interfaz de usuario</translation> <translation id="5396126354477659676">El complemento <ph name="PEPPER_PLUGIN_NAME" /> del dominio <ph name="PEPPER_PLUGIN_DOMAIN" /> quiere acceder a tu ordenador.</translation> <translation id="539755880180803351">Muestra las predicciones de campos de la función Autocompletar en los formularios web.</translation> <translation id="5397578532367286026">El administrador puede consultar el uso y el historial de este usuario (<ph name="MANAGER_EMAIL" />) en la página chrome.com.</translation> <translation id="5397794290049113714">Tú</translation> +<translation id="5398572795982417028">La referencia de página está fuera de los límites admitidos, el límite es <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> de otros sitios web</translation> <translation id="5399158067281117682">Los números PIN no coinciden.</translation> <translation id="5400640815024374115">Falta el chip del módulo de plataforma de confianza (TPM) o está inhabilitado</translation> @@ -3014,7 +3029,7 @@ <translation id="5423849171846380976">Activado</translation> <translation id="5425470845862293575">Habilita el uso del sistema de representación de fuentes experimental DirectWrite.</translation> <translation id="5425722269016440406">Debes estar conectado a Internet para desactivar Smart Lock porque esta opción está sincronizada con tu teléfono y otros dispositivos. Conéctate primero a una red.</translation> -<translation id="5426623592374109001">Utiliza un subsistema de animación intrusivo antiguo para las animaciones compuestas en la interfaz de usuario.</translation> +<translation id="5425863515030416387">Inicia sesión fácilmente en todos los dispositivos</translation> <translation id="5427459444770871191">Girar a la &derecha</translation> <translation id="5428105026674456456">Español</translation> <translation id="542872847390508405">Estás navegando como invitado</translation> @@ -3039,6 +3054,7 @@ <translation id="5451646087589576080">Ver &información del marco</translation> <translation id="5453029940327926427">Cerrar pestañas</translation> <translation id="5453632173748266363">Cirílico</translation> +<translation id="5454166040603940656">con <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">No válido</translation> <translation id="5457459357461771897">Leer y eliminar fotos, música y otros archivos multimedia de tu ordenador</translation> <translation id="5457599981699367932">Navegar como invitado</translation> @@ -3208,7 +3224,6 @@ <translation id="5708171344853220004">Nombre principal de Microsoft</translation> <translation id="5709885306771508267">Pellizcar la pantalla para escalar</translation> <translation id="5710406368443808765">¡Vaya! El sistema no ha podido almacenar el ID y el token del dispositivo.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> no responde. No se puede enviar contenido.</translation> <translation id="5711983031544731014">No se puede realizar el desbloqueo. Introduce tu contraseña.</translation> <translation id="5712966208980506909">Si la opción está habilitada, la URL chrome://md-policy carga la página de políticas de Material Design.</translation> <translation id="5715711091495208045">Agente de complementos: <ph name="PLUGIN_NAME" /></translation> @@ -3477,7 +3492,6 @@ <translation id="6111974609785983504">Permitido de forma predeterminada</translation> <translation id="6113134669445407638">Inhabilita el AEC válido de retraso en WebRTC. Esta opción se debe utilizar si los retrasos del sistema notificados de total confianza o si otros usuarios escuchan eco de tu ordenador.</translation> <translation id="6116921718742659598">Cambiar configuración de idioma y de introducción de texto</translation> -<translation id="6117536376248197233">Inhabilitar las líneas de tiempo de animaciones del compositor en procesadores.</translation> <translation id="6120205520491252677">Fijar esta página en la pantalla de inicio...</translation> <translation id="6122081475643980456">Tu conexión a Internet está siendo controlada</translation> <translation id="6122093587541546701">Correo electrónico (opcional):</translation> @@ -3509,6 +3523,7 @@ <translation id="6163522313638838258">Ampliar todo...</translation> <translation id="6164005077879661055">Todos los archivos y datos locales asociados al usuario supervisado se eliminarán de forma permanente una vez que se haya eliminado este usuario supervisado. Es posible que el administrador pueda seguir viendo la configuración y los sitios web visitados de este usuario supervisado en la página <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Más información</translation> +<translation id="6167008112175207002">Tus marcadores, tu historial, tus contraseñas y otras opciones se sincronizarán con tu cuenta de Google para que puedas utilizarlos en todos tus dispositivos. Puedes cambiar esta opción en <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Funciones de "Ok Google" de hardware simulado</translation> <translation id="6175314957787328458">GUID de dominio de Microsoft</translation> <translation id="6178664161104547336">Seleccionar un certificado</translation> @@ -3711,6 +3726,7 @@ <translation id="648927581764831596">Ningún medio disponible</translation> <translation id="6490936204492416398">Instalar nuevas extensiones de Chrome Web Store</translation> <translation id="6492313032770352219">Tamaño en disco:</translation> +<translation id="6498249116389603658">&Todos tus idiomas</translation> <translation id="6499143127267478107">Resolviendo host de la secuencia de comandos de proxy...</translation> <translation id="6503077044568424649">Más visitado</translation> <translation id="6503256918647795660">Teclado suizo francés</translation> @@ -3752,7 +3768,6 @@ <translation id="6555432686520421228">Elimina todas las cuentas de usuario y restablece tu dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /> como si lo acabaras de comprar.</translation> <translation id="6556866813142980365">Rehacer</translation> <translation id="6557565812667414268">Habilitado solo para pantallas de alta resolución por pulgada</translation> -<translation id="655845594391856372">La pestaña no responde. No se puede enviar contenido.</translation> <translation id="6559580823502247193">(ya está incluido en este dispositivo)</translation> <translation id="6561726789132298588">intro</translation> <translation id="6562437808764959486">Extrayendo imagen de recuperación...</translation> @@ -3853,6 +3868,7 @@ <translation id="6723354935081862304">Imprimir en Google Docs y en otros destinos de la nube. <ph name="BEGIN_LINK" />Inicia sesión<ph name="END_LINK" /> para imprimir en Google Cloud Print.</translation> <translation id="6723661294526996303">Importar marcadores y configuración...</translation> <translation id="6723839937902243910">Batería</translation> +<translation id="6725240607822645708">Ejecutar IME en su propio hilo.</translation> <translation id="6725970970008349185">Número de candidatos por página</translation> <translation id="672609503628871915">Consultar las novedades</translation> <translation id="6727005317916125192">Panel anterior</translation> @@ -3982,12 +3998,11 @@ <translation id="6948736568813450284">Para desarrolladores: utiliza el servicio de zona de pruebas para las llamadas de la API de Google Payments.</translation> <translation id="6949306908218145636">Añadir páginas abiertas a marcadores...</translation> <translation id="695164542422037736">Si se habilita esta opción y se utiliza el estilo background-attachment:fixed en el cuerpo, el fondo tendrá su propia capa compuesta.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> recuerda tus contraseñas e inicia sesión automáticamente en los sitios en este dispositivo.</translation> <translation id="6955446738988643816">Inspeccionar pop-up</translation> <translation id="695755122858488207">Botón de selección sin seleccionar</translation> +<translation id="6960277925159781810">Inicia sesión automáticamente en este dispositivo</translation> <translation id="696036063053180184">Triple alternancia (sin pulsar Mayús)</translation> <translation id="696203921837389374">Habilitar sincronización a través de redes de datos móviles</translation> -<translation id="6964308487066031935">¿Añadir carpetas a "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="6965648386495488594">Puerto</translation> <translation id="6965978654500191972">Dispositivo</translation> @@ -4087,7 +4102,6 @@ <translation id="7076293881109082629">Iniciando sesión</translation> <translation id="7077829361966535409">No se ha podido cargar la página de inicio de sesión con la configuración de proxy actual. <ph name="GAIA_RELOAD_LINK_START" />Intenta iniciar sesión de nuevo<ph name="GAIA_RELOAD_LINK_END" /> o utiliza otra <ph name="PROXY_SETTINGS_LINK_START" />configuración de proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Controladores de protocolos ignorados</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" podrá leer y eliminar archivos de sonido, vídeo e imágenes almacenados en las carpetas seleccionadas.</translation> <translation id="708060913198414444">C&opiar dirección de audio</translation> <translation id="708187310695946552">Interfaz de usuario basada en cuadros de restauración de la sesión</translation> <translation id="7082055294850503883">Ignorar el estado de bloqueo de mayúsculas e introducir minúsculas de forma predeterminada</translation> @@ -4231,6 +4245,8 @@ <translation id="7313804056609272439">Método de entrada de vietnamita</translation> <translation id="7314244761674113881">Host SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (actual)</translation> +<translation id="7321545336522791733">No se puede acceder al servidor</translation> +<translation id="7324841169865301118">Habilita un usuario para que pueda seleccionar pestañas y compartirlas en el escritorio remoto.</translation> <translation id="7325437708553334317">Extensión de contraste alto</translation> <translation id="7326565110843845436">Clic con tres dedos en el panel táctil</translation> <translation id="73289266812733869">Sin seleccionar</translation> @@ -4456,7 +4472,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" quiere eliminar "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> se muestra en este idioma.</translation> <translation id="7654941827281939388">Esta cuenta ya se está utilizando en este ordenador.</translation> -<translation id="7655165758820095116">El objeto MediaSource permite que JavaScript envíe datos multimedia directamente a un elemento de vídeo.</translation> <translation id="7658239707568436148">Cancelar</translation> <translation id="7659584679870740384">No tienes autorización para utilizar este dispositivo. Ponte en contacto con el administrador para obtener permiso de inicio de sesión.</translation> <translation id="7664620655576155379">Dispositivo Bluetooth no compatible: <ph name="DEVICE_NAME" /></translation> @@ -4587,6 +4602,7 @@ <translation id="7861215335140947162">&Descargas</translation> <translation id="7864539943188674973">Inhabilitar Bluetooth</translation> <translation id="7868891395842935202">Habilita el framework experimental para controlar el acceso a los experimentos API.</translation> +<translation id="7870576007982733437">Utilizar el administrador de descargas del sistema (si procede).</translation> <translation id="7870790288828963061">No se ha encontrado ninguna aplicación de kiosco con una versión más reciente. No hay nada que actualizar. Extrae el dispositivo USB.</translation> <translation id="787150342916295244">Escaneado de tarjetas de crédito</translation> <translation id="7874357055309047713">Ejecutar siempre en todos los sitios</translation> @@ -4629,7 +4645,6 @@ <translation id="7918257978052780342">Registrar</translation> <translation id="7920092496846849526">Has solicitado permiso a uno de tus padres para poder acceder a esta página.</translation> <translation id="7925285046818567682">Esperando a <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> recuerda tus contraseñas e inicia sesión automáticamente en las aplicaciones y en los sitios en todos los dispositivos.</translation> <translation id="7925686952655276919">No utilizar datos móviles para la sincronización</translation> <translation id="7926906273904422255">Marca conexiones de origen que no son seguras como no seguras o dudosas.</translation> <translation id="7928710562641958568">Expulsar dispositivo</translation> @@ -4691,7 +4706,6 @@ Guarda tu archivo de clave en un lugar seguro, ya que lo necesitarás para crear nuevas versiones de tu extensión.</translation> <translation id="799923393800005025">Puede ver</translation> <translation id="7999338963698132743">Nuevo administrador de tareas</translation> -<translation id="8000004253404706714">Utiliza un subsistema de animación intrusivo antiguo para las animaciones compuestas en los procesadores.</translation> <translation id="8004582292198964060">Navegador</translation> <translation id="8007030362289124303">Batería baja</translation> <translation id="8008356846765065031">No hay conexión a Internet. Comprueba la conexión.</translation> @@ -4821,6 +4835,7 @@ <translation id="8185331656081929126">Mostrar notificaciones cuando se detecten nuevas impresoras en la red</translation> <translation id="8186609076106987817">El servidor no ha podido encontrar el archivo.</translation> <translation id="8186706823560132848">Software</translation> +<translation id="8188120771410500975">&Comprobar la ortografía de los campos de texto</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> y otros <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Conectando con <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Administrar tus aplicaciones, extensiones y temas</translation> @@ -5214,6 +5229,7 @@ <translation id="8765985713192161328">Administrar controladores...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Usuarios</translation> +<translation id="8768367823103160496">Bloqueo del cursor del ratón</translation> <translation id="8769662576926275897">Información de la tarjeta</translation> <translation id="8770196827482281187">Método de entrada de persa (diseño ISIRI 2901)</translation> <translation id="8774934320277480003">Margen superior</translation> @@ -5233,6 +5249,7 @@ <translation id="8795668016723474529">Añadir una tarjeta de crédito</translation> <translation id="8795916974678578410">Nueva ventana</translation> <translation id="8798099450830957504">Predeterminado</translation> +<translation id="8799127529310003270">Si se habilita esta opción, las llamadas de InputConnection se ejecutan en el hilo de IME. Además, en lugar de mantener un editor de réplica, cada llamada de InputConnection se comunicará directamente con el procesador.</translation> <translation id="8799839487311913894">Permite actualizar una contraseña en el administrador de contraseñas tras enviar un formulario de cambio de contraseña.</translation> <translation id="8800004011501252845">Mostrando destinos para</translation> <translation id="8800420788467349919">Volumen: <ph name="PRECENTAGE" />%</translation> @@ -5258,6 +5275,7 @@ <translation id="8841142799574815336">Ventana gráfica visual inerte.</translation> <translation id="884264119367021077">Dirección de envío</translation> <translation id="8844238624737526720">Utiliza la implementación nueva y optimizada del administrador de tareas de Chrome.</translation> +<translation id="8845001906332463065">Obtener ayuda</translation> <translation id="8846141544112579928">Buscando teclado...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Cambiar a modo de tecla Mayús</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 4d5ce53d..a02fb04 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Lisa selle lehe järjehoidja...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> üksuse kustutamine ...</translation> <translation id="1048597748939794622">Jõuga lubatud kõikide kihtide puhul</translation> +<translation id="1049795001945932310">&Keeleseaded</translation> <translation id="1049926623896334335">Wordi dokument</translation> <translation id="1054153489933238809">Ava &algkujutis uuel vahelehel</translation> <translation id="1055806300943943258">Bluetoothi ja USB-seadmete otsimine ...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliteratsioon (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automaatsed nimeserverid</translation> <translation id="1215411991991485844">Uus taustarakendus on lisatud</translation> +<translation id="1216954813581739968">Luba vaheleht lauaarvutis jagamiseks.</translation> <translation id="121827551500866099">Kuva kõik allalaadimised...</translation> <translation id="122082903575839559">Sertifikaadi allkirjaalgoritm</translation> <translation id="1221024147024329929">PKCS 1 MD2 koos RSA krüpteerimisega</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Automaatne sisselogimine ebaõnnestus</translation> <translation id="1293556467332435079">Failid</translation> <translation id="1294298200424241932">Usaldusväärsuse seadete muutmine:</translation> +<translation id="1295794900245526845">Sisselogimiseks valige konto, mis on salvestatud teenuses <ph name="PASSWORD_MANAGER_BRAND" /></translation> <translation id="1297175357211070620">Sihtkoht</translation> <translation id="1297922636971898492">Google Drive pole praegu saadaval. Kui Google Drive on tagasi, algab üleslaadimine automaatselt uuesti.</translation> <translation id="1300861494336759522">Windowsi töölauaotsingu ümbersuunamine</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">See lähtestab käivitamisel avatava lehe, uue vahelehe, otsingumootori ja vähendatud vahelehed. See keelab ka kõik laiendused ja kustutab kõik ajutised andmed (nt küpsised). Teie järjehoidjaid, ajalugu ega salvestatud paroole ei kustutata.</translation> <translation id="1434886155212424586">Avaleht on uus vaheleht</translation> <translation id="1435550882135542937">Laienduse tööriistariba ümberkujundamine</translation> +<translation id="1436402875660227532">Märkus. Neid seadeid ei kasutata enam selles süsteemis, kuid saate neid endiselt vaadata ja muuta.</translation> <translation id="1436784010935106834">Eemaldatud</translation> <translation id="1438632560381091872">Tühista vahekaartide summutus</translation> <translation id="1441841714100794440">Vietnami klaviatuur (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Virtuaalse klaviatuuri toe lubamine.</translation> <translation id="1474079335130556426">Lubage Push API taustarežiim. See lubab Chrome'il pärast viimase akna sulgemist tööd jätkata ja koos operatsioonisüsteemiga käivituda, kui Push API seda vajab.</translation> <translation id="1474339897586437869">Faili „<ph name="FILENAME" />” ei laaditud üles. Teie Google Drive’is ei ole piisavalt vaba ruumi.</translation> +<translation id="1476607407192946488">&Keeleseaded</translation> <translation id="1476949146811612304">Määrake, millist otsingumootorit <ph name="BEGIN_LINK" />omnikastikeses<ph name="END_LINK" /> otsides kasutatakse.</translation> <translation id="1477301030751268706">Identiteedi API loa vahemälu</translation> <translation id="1478340334823509079">Üksikasjad: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Leht kasutab omakliendi rakendust, mis ei tööta teie arvutis.</translation> <translation id="1965328510789761112">Privaatmälu</translation> <translation id="1965624977906726414">Pole erilubasid.</translation> +<translation id="1968720524450620475">Luba veebimärguannete toiminguikoonid.</translation> <translation id="1970746430676306437">Kuva lehekülje &andmed</translation> <translation id="197288927597451399">Jäta alles</translation> <translation id="1973491249112991739">Pistikprogrammi <ph name="PLUGIN_NAME" /> allalaadimine ebaõnnestus.</translation> @@ -909,6 +915,7 @@ <translation id="2344262275956902282">Kasuta klahve - ja = kandidaatide loendi lehitsemiseks</translation> <translation id="2347476388323331511">Ei saanud sünkroonida</translation> <translation id="2347991999864119449">Lase mul valida, millal pistikprogrammi sisu käitada</translation> +<translation id="2348165084656290171">Valige heli jagamiseks vaheleht või kogu ekraan.</translation> <translation id="2350182423316644347">Rakenduse lähtestamine ...</translation> <translation id="2350796302381711542">Kas lubada kasutajal <ph name="HANDLER_HOSTNAME" /> avada kõik protokolli <ph name="PROTOCOL" /> lingid kasutaja <ph name="REPLACED_HANDLER_TITLE" /> asemel?</translation> <translation id="2351266942280602854">Keel ja sisend</translation> @@ -996,6 +1003,7 @@ <translation id="247772113373397749">Kanada mitmekeelne klaviatuur</translation> <translation id="2478176599153288112">Meediafaili load laiendusele „<ph name="EXTENSION" />”</translation> <translation id="2478830106132467213">Seade <ph name="DEVICE_TYPE" /> avatakse vaid siis, kui teie telefon on käeulatuses.</translation> +<translation id="247949520305900375">Jaga heli</translation> <translation id="2479780645312551899">Käita praegu kõiki pistikprogramme</translation> <translation id="2480626392695177423">Ümberlülitus täis/poollaiuses kirjavahemärgi režiimile</translation> <translation id="2481332092278989943">Riiulile lisamine</translation> @@ -1310,6 +1318,7 @@ <translation id="2889064240420137087">Lingi avamine rakendusega ...</translation> <translation id="2889925978073739256">Blokeeri ka edaspidi liivakastist eemaldatud pistikprogrammid</translation> <translation id="2890624088306605051">Too vaid sünkroonitud seaded ja andmed</translation> +<translation id="2890678560483811744">Piiridest väljas olev leht</translation> <translation id="2893168226686371498">Vaikebrauser</translation> <translation id="289426338439836048">Muu mobiilsidevõrk ...</translation> <translation id="2894745200702272315">Otsetee sõna „Ok Google” katseliste tuvastusfunktsioonide (mis olenevad riistvarast) lubamine.</translation> @@ -1338,7 +1347,6 @@ <translation id="2925966894897775835">Arvutustabelid</translation> <translation id="2927017729816812676">Vahemälu</translation> <translation id="2927657246008729253">Muuda...</translation> -<translation id="2928415919076124714">Peida tööriistariba täisekraanil</translation> <translation id="2928526264833629376">Jätka Hangoutsiga</translation> <translation id="2930644991850369934">Taastetõmmise allalaadimisel ilmnes tõrge. Võrguühendus on kadunud.</translation> <translation id="293111069139560936">Lubab riiulil akna minimeerimise, kui klõpsatakse riiuli elemendil, millega on seotud üksainus aken, mis on juba aktiivne.</translation> @@ -1462,6 +1470,7 @@ <translation id="3117812041123364382">Hõljuva virtuaalse klaviatuuri lubamine/keelamine.</translation> <translation id="3118319026408854581">Toote <ph name="PRODUCT_NAME" /> abi</translation> <translation id="3120430004221004537">Ebapiisav krüpteerimine antud toimingu puhul seadmes „<ph name="DEVICE_NAME" />”.</translation> +<translation id="3121260210578524273">Lubage veebimärguannete puhul toimingunuppude ikoonid.</translation> <translation id="3121793941267913344">Toote <ph name="IDS_SHORT_PRODUCT_NAME" /> seadme lähtestamine</translation> <translation id="3122162841865761901">Arendaja tööriistade katsed</translation> <translation id="3122464029669770682">Protsessor</translation> @@ -1582,7 +1591,6 @@ <translation id="3289566588497100676">Lihtne sümbolite sisestamine</translation> <translation id="3289856944988573801">Kasutage värskenduste otsimiseks Etherneti või WiFi-ühendust.</translation> <translation id="3293325348208285494">Kiirkäivitus</translation> -<translation id="3293894718455402932">Laiendus „<ph name="EXTENSION" />” saab kirjutada ja lugeda märgitud kaustades olevaid kujutise-, video- ja helifaile.</translation> <translation id="3294437725009624529">Külaline</translation> <translation id="329650768420594634">Pakettlaienduse hoiatus</translation> <translation id="3296763833017966289">gruusia keel</translation> @@ -1640,6 +1648,7 @@ <translation id="3338239663705455570">Sloveenia klaviatuur</translation> <translation id="3340978935015468852">seaded</translation> <translation id="3341703758641437857">Luba juurdepääs failide URL-idele</translation> +<translation id="3343813173145836998">Lihtne sisselogimine selles seadmes</translation> <translation id="3344786168130157628">Pääsupunkti nimi:</translation> <translation id="3345135638360864351">Saidi külastamise taotlust ei õnnestunud saata kontaktile <ph name="NAME" />. Proovige uuesti.</translation> <translation id="3345886924813989455">Ei leitud ühtegi toetatud brauserit</translation> @@ -2119,6 +2128,7 @@ <translation id="3996912167543967198">Lähtestamine ...</translation> <translation id="3997015411467176489">Lõuendi katselised funktsioonid</translation> <translation id="40027638859996362">Sõna liigutamine</translation> +<translation id="400554499662786523">Valige heli jagamiseks vaheleht.</translation> <translation id="4012550234655138030">Seadistage või hallake printereid teenuses <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Kas parandada laiendust <ph name="EXTENSION_NAME" />?</translation> <translation id="4018133169783460046">Kuva <ph name="PRODUCT_NAME" /> selles keeles</translation> @@ -2221,6 +2231,7 @@ <translation id="4180788401304023883">Kustutada CA sertifikaat „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="418179967336296930">Vene foneetiline (YaZHert) klaviatuur</translation> <translation id="4181841719683918333">Keeled</translation> +<translation id="4187248015940562149">Lubatakse funktsioon Web Bluetooth, mis võib veebisaitidel lubada ühenduse loomise teie läheduses olevate Bluetoothi seadmetega ja neid juhtida.</translation> <translation id="4188026131102273494">Märksõna:</translation> <translation id="4189406272289638749">Laiendus <b><ph name="EXTENSION_NAME" /></b> juhib seda seadet.</translation> <translation id="4193154014135846272">Google'i dokument</translation> @@ -2277,6 +2288,7 @@ <translation id="4268025649754414643">Võtme šifreerimine</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versioon <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Vasted puuduvad</translation> <translation id="4274187853770964845">Sünkroonimisviga: peatage ja taaskäivitage sünkroonimine.</translation> <translation id="4275830172053184480">Taaskäivitage seade</translation> <translation id="4276796043975446927">Tere tulemast süsteemi Chromebox koosolekutele</translation> @@ -2345,6 +2357,7 @@ <translation id="4378551569595875038">Ühendamine ...</translation> <translation id="438122767399415311">Kasutajaliidese suuna jõustamine</translation> <translation id="4381849418013903196">Koolon</translation> +<translation id="4383192539467954373">Automaatne sisselogimine kõigis seadmetes</translation> <translation id="4384652540891215547">Aktiveeri laiendus</translation> <translation id="438503109373656455">Ratsu</translation> <translation id="4387554346626014084">Lubatakse rakenduste käivitaja sünkroonimine. See lubab võimaluse korral ka rakenduse Kaustad (mitte-OSX).</translation> @@ -2362,6 +2375,7 @@ <translation id="4421932782753506458">Miisu</translation> <translation id="4422347585044846479">Muuda selle lehekülje järjehoidjat</translation> <translation id="4422428420715047158">Domeen:</translation> +<translation id="4423482519432579560">&Õigekirjakontroll</translation> <translation id="442477792133831654">Läheduses olevate seadmetega suhtlemine</translation> <translation id="4425149324548788773">Minu ketas</translation> <translation id="4428582326923056538">Adobe Flash Playeri kaameraerandid on erinevad.</translation> @@ -2376,6 +2390,7 @@ <translation id="444267095790823769">Kaitstud sisu erandid</translation> <translation id="4443536555189480885">&Abi</translation> <translation id="4444304522807523469">Juurdepääs dokumendiskänneritele USB või kohaliku võrgu kaudu</translation> +<translation id="4445559854264555037">Kas te ei näe oma seadet? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Peegeldatud</translation> <translation id="4447465454292850432">Aku:</translation> <translation id="4449935293120761385">Teave automaatse täitmise kohta</translation> @@ -2634,6 +2649,7 @@ <translation id="485316830061041779">saksa keel</translation> <translation id="4856478137399998590">Teie mobiilne andmesideteenus on aktiveeritud ja kasutamiseks valmis</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">Võimaluse korral lubatakse allalaadimisi hallata süsteemi allalaadimiste halduril.</translation> <translation id="48607902311828362">Lennurežiim</translation> <translation id="4861833787540810454">&Esita</translation> <translation id="4862050643946421924">Seadme lisamine ...</translation> @@ -2717,7 +2733,6 @@ <translation id="4977942889532008999">Juurdepääsu kinnitamine</translation> <translation id="4982718461356080574">Virnastatud passiivsete vahelehtede sulgemisnuppude peitmine</translation> <translation id="498294082491145744">Muutke seadeid, mis juhivad veebisaitide juurdepääsu funktsioonidele (nt küpsistele, JavaScriptile, pistikprogrammidele, geograafilisele asukohale, mikrofonile, kaamerale jne).</translation> -<translation id="4984329823325527157">Meediaallika API</translation> <translation id="4988526792673242964">Leheküljed</translation> <translation id="4988792151665380515">Avalikku võtit ei õnnestunud eksportida.</translation> <translation id="49896407730300355">Pööra &vastupäeva</translation> @@ -2906,7 +2921,6 @@ <translation id="5268606875983318825">PPAPI (protsessiväline)</translation> <translation id="526926484727016706">Kõikidele iframe'idele keelatakse vaikimisi kõik load. Kui iframe'ile antakse konkreetsed load, võidakse nende lubade nimed lisada uute iframe'i atribuutide väärtustena.</translation> <translation id="5269977353971873915">Printimine nurjus</translation> -<translation id="5270884342523754894">Laiendus „<ph name="EXTENSION" />” saab lugeda märgitud kaustades olevaid kujutise-, video- ja helifaile.</translation> <translation id="5271247532544265821">Vaheta lihtsustatud/traditsioonilise hiina keele vahel</translation> <translation id="5271549068863921519">Salvesta parool</translation> <translation id="5273628206174272911">Ajaloos katseline navigeerimine horisontaalse ülekerimisega.</translation> @@ -2943,6 +2957,7 @@ <translation id="5316716239522500219">Kuvarite peegeldamine</translation> <translation id="5317780077021120954">Salvesta</translation> <translation id="5319782540886810524">Läti klaviatuur</translation> +<translation id="532247166573571973">Serveriga ei pruugi ühendust saada. Proovige hiljem uuesti.</translation> <translation id="5323213332664049067">Ladina-Ameerika</translation> <translation id="532360961509278431">„$1” ei saa avada: $2</translation> <translation id="5324674707192845912">Soovite tühistada seadme <ph name="DEVICE_TYPE" /> registreerimise Google'is, et keelata kaughalduse abil asukoha tuvastamine, andmete kustutamine ja seadme lukustamine. See nõuab seadme taaskäivitamist. Kas soovite jätkata?</translation> @@ -2995,11 +3010,11 @@ <translation id="5390284375844109566">Indekseeritud andmebaas</translation> <translation id="5392544185395226057">Lubage omakliendi tugi.</translation> <translation id="5393125431335030955">See pistikprogramm töötab ainult töölaual.</translation> -<translation id="5393559999218790205">Keela kasutajaliidese koostaja animatsiooni ajaskaalad</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> domeenil <ph name="PEPPER_PLUGIN_DOMAIN" /> soovib juurdepääsu teie arvutile.</translation> <translation id="539755880180803351">Täidab veebivormid välja tippimisel automaatse täitmise ennustuste ning kohatäitjaga tekstiga.</translation> <translation id="5397578532367286026">Haldur (<ph name="MANAGER_EMAIL" />) saab kasutaja kasutusandmeid ja ajalugu vaadata aadressil chrome.com.</translation> <translation id="5397794290049113714">Teie</translation> +<translation id="5398572795982417028">Piiridest väljas olev leht, limiit on <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> muudelt saitidelt</translation> <translation id="5399158067281117682">PIN-koodid ei ühti!</translation> <translation id="5400640815024374115">Usaldusväärse platvormi mooduli (TPM) kiip on keelatud või puudu.</translation> @@ -3019,7 +3034,7 @@ <translation id="5423849171846380976">Aktiveeritud</translation> <translation id="5425470845862293575">Lubab katselise fondirenderdamise süsteemi DirectWrite kasutamise.</translation> <translation id="5425722269016440406">Smart Locki väljalülitamiseks peab teil olema võrguühendus, kuna see seade on sünkroonitud teie telefoni ja muude seadmetega. Looge esmalt ühendus võrguga.</translation> -<translation id="5426623592374109001">Kasutajaliideses kasutatakse koostatud animatsioonide puhul vanu sekkuvaid animatsiooni alamsüsteeme.</translation> +<translation id="5425863515030416387">Lihtne sisselogimine kõigis seadmetes</translation> <translation id="5427459444770871191">Pööra &päripäeva</translation> <translation id="5428105026674456456">hispaania keel</translation> <translation id="542872847390508405">Sirvite külalisena</translation> @@ -3044,6 +3059,7 @@ <translation id="5451646087589576080">Vaata raami tea&vet</translation> <translation id="5453029940327926427">Sule vahelehed</translation> <translation id="5453632173748266363">Kirillits</translation> +<translation id="5454166040603940656">teenusepakkujaga <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Kehtetu</translation> <translation id="5457459357461771897">Arvutis olevate fotode, muusika ja muu meedia lugemine ja kustutamine</translation> <translation id="5457599981699367932">Sirvi külalisena</translation> @@ -3213,7 +3229,6 @@ <translation id="5708171344853220004">Microsofti põhinimi</translation> <translation id="5709885306771508267">Skaleerimine kokkusurudes</translation> <translation id="5710406368443808765">Kahjuks ei salvestanud süsteem seadme märki ega ID-d.</translation> -<translation id="571161420693302741">Host <ph name="HOST_NAME" /> ei vasta. Ülekandmine pole võimalik.</translation> <translation id="5711983031544731014">Ei õnnestu avada. Sisestage parool.</translation> <translation id="5712966208980506909">Kui see on lubatud, laadib URL chrome://md-policy materiaalse disaini eeskirjade lehe.</translation> <translation id="5715711091495208045">Pistikprogrammi vahendaja: <ph name="PLUGIN_NAME" /></translation> @@ -3482,7 +3497,6 @@ <translation id="6111974609785983504">Vaikimisi lubatud</translation> <translation id="6113134669445407638">WebRTC-s keelatakse funktsioon Delay Agnostic AEC. Kasutage seda juhul, kui teavitatud süsteemi viivitused on väga usaldusväärsed või teised kuulevad teie seadmest kaja.</translation> <translation id="6116921718742659598">Keele ja sisestusseadete muutmine</translation> -<translation id="6117536376248197233">Keela renderdajates koostaja animatsiooni ajaskaalad</translation> <translation id="6120205520491252677">Kinnita see leht avakuvale ...</translation> <translation id="6122081475643980456">Teie Interneti-ühendust juhitakse</translation> <translation id="6122093587541546701">E-post (valikuline):</translation> @@ -3514,6 +3528,7 @@ <translation id="6163522313638838258">Laienda kõik ...</translation> <translation id="6164005077879661055">Kõik jälgitava kasutajaga seotud failid ja kohalikud andmed kustutatakse jäädavalt kohe, kui jälgitav kasutaja eemaldatakse. Selle jälgitava kasutaja külastatud veebisaite ja seadeid näeb haldur endiselt aadressil <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Lisateave</translation> +<translation id="6167008112175207002">Teie järjehoidjad, ajalugu, paroolid ja muud seaded sünkroonitakse teie Google'i kontoga, et saaksite neid kasutada kõigis oma seadmetes. Seda saate muuta siin: <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Fraasi „Ok Google” simuleeritud riistvarapõhised funktsioonid</translation> <translation id="6175314957787328458">Microsofti domeeni GUID</translation> <translation id="6178664161104547336">Sertifikaadi valimine</translation> @@ -3717,6 +3732,7 @@ <translation id="648927581764831596">Pole saadaval</translation> <translation id="6490936204492416398">Uute installimine veebipoest</translation> <translation id="6492313032770352219">Maht kettal:</translation> +<translation id="6498249116389603658">&Kõik teie keeled</translation> <translation id="6499143127267478107">Hosti lahendamine puhverserveri skriptis ...</translation> <translation id="6503077044568424649">Populaarsed</translation> <translation id="6503256918647795660">Šveitsi prantsuse klaviatuur</translation> @@ -3758,7 +3774,6 @@ <translation id="6555432686520421228">Eemaldage kõik kasutajakontod ja lähtestage seade <ph name="IDS_SHORT_PRODUCT_NAME" />, et taas nullist alustada.</translation> <translation id="6556866813142980365">Tee uuesti</translation> <translation id="6557565812667414268">Lubatud ainult kõrge punktitihedusega (DPI) ekraanide puhul</translation> -<translation id="655845594391856372">Vahekaart ei vasta. Ülekandmine pole võimalik.</translation> <translation id="6559580823502247193">(on juba selles seadmes)</translation> <translation id="6561726789132298588">sisestusklahv</translation> <translation id="6562437808764959486">Taastetõmmise lahtipakkimine ...</translation> @@ -3859,6 +3874,7 @@ <translation id="6723354935081862304">Prindib Google Docsi ja muudesse pilvesihtkohadesse. Google'i pilvprintimise teenuse kaudu printimiseks <ph name="BEGIN_LINK" />logige sisse<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">Impordi järjehoidjad ja seaded ...</translation> <translation id="6723839937902243910">Toide</translation> +<translation id="6725240607822645708">Käita IME-d eraldi lõimes.</translation> <translation id="6725970970008349185">Igal lehel kuvatavate kandidaatide arv</translation> <translation id="672609503628871915">Vaadake, mis on uut</translation> <translation id="6727005317916125192">Eelmine paan</translation> @@ -3989,12 +4005,11 @@ <translation id="6948736568813450284">Arendajatele: kasutage liivakasti teenust Google Payments API kutsete jaoks.</translation> <translation id="6949306908218145636">Lisa avatud lehed järjehoidjasse ...</translation> <translation id="695164542422037736">Kui see valik on lubatud ja sisu on kujundatud elemendiga background-attachment:fixed, siis on taustal oma liitkiht.</translation> -<translation id="6952626679169241027">Teenus <ph name="PASSWORD_MANAGER_BRAND" /> jätab teie paroolid meelde ja logib teid selles seadmes saitidele automaatselt sisse.</translation> <translation id="6955446738988643816">Uuri hüpikut</translation> <translation id="695755122858488207">Valimata raadionupp</translation> +<translation id="6960277925159781810">Automaatne sisselogimine selles seadmes</translation> <translation id="696036063053180184">3. seade (tõstuklahv Shift puudub)</translation> <translation id="696203921837389374">Luba sünkroonimine mobiilse andmeside kaudu</translation> -<translation id="6964308487066031935">Kas lisada kaustad laiendusse „<ph name="EXTENSION" />”?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Seade</translation> @@ -4094,7 +4109,6 @@ <translation id="7076293881109082629">Sisselogimine</translation> <translation id="7077829361966535409">Sisselogimislehte ei saanud praeguste puhverserveri seadetega laadida. <ph name="GAIA_RELOAD_LINK_START" />Proovige uuesti sisse logida<ph name="GAIA_RELOAD_LINK_END" /> või kasutage teisi <ph name="PROXY_SETTINGS_LINK_START" />puhverserveri seadeid<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Protokolli ignoreeritud töötlejad</translation> -<translation id="7079038783243627996">Laiendus „<ph name="EXTENSION" />” saab lugeda ja kustutada märgitud kaustades olevaid kujutise-, video- ja helifaile.</translation> <translation id="708060913198414444">K&opeeri heli aadress</translation> <translation id="708187310695946552">Seansi taastamise mullkasutajaliides</translation> <translation id="7082055294850503883">Eira CapsLocki olekut ja sisesta vaikimisi väiketähtedena</translation> @@ -4238,6 +4252,8 @@ <translation id="7313804056609272439">Vietnami sisestusviis (VNI)</translation> <translation id="7314244761674113881">SOCKS-host</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (praegune)</translation> +<translation id="7321545336522791733">Serveriga ei saa ühendust</translation> +<translation id="7324841169865301118">Lubab kasutajal lauaarvutis jagamiseks valida vahelehe.</translation> <translation id="7325437708553334317">Kõrge kontrastsuse laiendus</translation> <translation id="7326565110843845436">Puuteplaadi kolme sõrmega klõps</translation> <translation id="73289266812733869">Valimata</translation> @@ -4464,7 +4480,6 @@ <translation id="7650511557061837441">„<ph name="TRIGGERING_EXTENSION_NAME" />” soovib eemaldada laienduse „<ph name="EXTENSION_NAME" />”.</translation> <translation id="7650701856438921772">Rakendust <ph name="PRODUCT_NAME" /> kuvatakse selles keeles</translation> <translation id="7654941827281939388">Konto on selles arvutis juba kasutusel.</translation> -<translation id="7655165758820095116">MediaSource'i objekt lubab JavaScriptil saata meediaandmeid otse videoelemendile.</translation> <translation id="7658239707568436148">Tühista</translation> <translation id="7659584679870740384">Teil ei ole seadme kasutamiseks volitust. Sisselogimisloa saamiseks võtke ühendust administraatoriga.</translation> <translation id="7664620655576155379">Toetamata Bluetooth-seade: „<ph name="DEVICE_NAME" />”.</translation> @@ -4595,6 +4610,7 @@ <translation id="7861215335140947162">&Allalaadimised</translation> <translation id="7864539943188674973">Keela Bluetooth</translation> <translation id="7868891395842935202">API katsetele juurdepääsu juhtimiseks lubatakse katseline raamistik.</translation> +<translation id="7870576007982733437">Võimaluse korral kasuta süsteemi allalaadimiste haldurit.</translation> <translation id="7870790288828963061">Ühtegi uuema versiooniga kioski rakendust ei leitud. Midagi pole värskendada. Eemaldage USB-mälupulk.</translation> <translation id="787150342916295244">Krediitkaardi skannimine</translation> <translation id="7874357055309047713">Käita alati kõikidel saitidel</translation> @@ -4637,7 +4653,6 @@ <translation id="7918257978052780342">Registreerimine</translation> <translation id="7920092496846849526">Küsisite vanemalt, kas võite seda lehte külastada.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> vastuse ootel...</translation> -<translation id="7925425262460550824">Teenus <ph name="PASSWORD_MANAGER_BRAND" /> jätab teie paroolid meelde ja logib teid rakendustesse ja saitidele automaatselt sisse kõigis seadmetes.</translation> <translation id="7925686952655276919">Ära kasuta sünkroonimiseks mobiilset andmesidet</translation> <translation id="7926906273904422255">Ebaturvalised allikad märgitakse ebaturvaliseks või kahtlaseks.</translation> <translation id="7928710562641958568">Seadme väljutamine</translation> @@ -4699,7 +4714,6 @@ Hoidke oma võtmefail kindlas kohas. Teil läheb seda oma laiendi uute versioonide loomiseks vaja.</translation> <translation id="799923393800005025">Saab vaadata</translation> <translation id="7999338963698132743">Uus tegumihaldur</translation> -<translation id="8000004253404706714">Renderdajates kasutatakse koostatud animatsioonide puhul vanu sekkuvaid animatsiooni alamsüsteeme.</translation> <translation id="8004582292198964060">Brauser</translation> <translation id="8007030362289124303">Aku tühjenemas</translation> <translation id="8008356846765065031">Interneti-ühendus puudub. Kontrollige Interneti-ühendust.</translation> @@ -4828,6 +4842,7 @@ <translation id="8185331656081929126">Kuva märguanne, kui võrgus tuvastatakse mõni uus printer</translation> <translation id="8186609076106987817">Server ei leidnud faili.</translation> <translation id="8186706823560132848">Tarkvara</translation> +<translation id="8188120771410500975">&Kontrolli tekstiväljade õigekirja</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> ja <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> muud</translation> <translation id="8190193592390505034">Ühendamine võrku <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Teie rakenduste, laienduste ja teemade haldamine</translation> @@ -5221,6 +5236,7 @@ <translation id="8765985713192161328">Halda töötlejaid ...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Kasutajad</translation> +<translation id="8768367823103160496">Hiirekursori lukk</translation> <translation id="8769662576926275897">Kaardi üksikasjad</translation> <translation id="8770196827482281187">Pärsia sisestusviis (paigutus ISIRI 2901)</translation> <translation id="8774934320277480003">Ülemine veeris</translation> @@ -5240,6 +5256,7 @@ <translation id="8795668016723474529">Krediitkaardi lisamine</translation> <translation id="8795916974678578410">Uus aken</translation> <translation id="8798099450830957504">Vaikimisi</translation> +<translation id="8799127529310003270">Kui see on lubatud, käitatakse reegli InputConnection kutseid IME lõimes ja koopiate redigeerija säilitamise asemel suunatakse kõik reegli InputConnection kutsed otse renderdajale.</translation> <translation id="8799839487311913894">Lubage parooli värskendamine paroolihalduris pärast vormi „Parooli muutmine” saatmist.</translation> <translation id="8800004011501252845">Sihtkohad aadressile</translation> <translation id="8800420788467349919">Helitugevus: <ph name="PRECENTAGE" />%</translation> @@ -5265,6 +5282,7 @@ <translation id="8841142799574815336">Inertne visuaalne vaateaken.</translation> <translation id="884264119367021077">Tarneaadress</translation> <translation id="8844238624737526720">Chrome'i tegumihalduri uue ja optimeeritud juurutuse kasutamine.</translation> +<translation id="8845001906332463065">Otsige abi</translation> <translation id="8846141544112579928">Klaviatuuri otsimine ...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Tõstuklahvi režiimi ümberlülitamine</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 1682cba17c..fd99d4de 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -293,6 +293,7 @@ <translation id="1434696352799406980">این گزینه صفحه شروع، صفحه برگه جدید، موتور جستجو و برگههای پینشده شما را بازنشانی میکند. همچنین همه افزونهها را غیرفعال میکند و دادههای موقتی مانند کوکیها را پاک میکند. نشانکها، سابقه و گذرواژههای ذخیرهشده شما پاک نمیشوند.</translation> <translation id="1434886155212424586">صفحه اصلی، صفحه برگه جدید است</translation> <translation id="1435550882135542937">طراحی مجدد نوارابزار افزونه</translation> +<translation id="1436402875660227532">توجه: این تنظیمات دیگر در این سیستم استفاده نمیشود اما همچنان میتوانید آنها را مشاهده و ویرایش کنید.</translation> <translation id="1436784010935106834">حذف شد</translation> <translation id="1438632560381091872">وصل کردن صدای برگهها</translation> <translation id="1441841714100794440">صفحهکلید ویتنامی (تلکس)</translation> @@ -1003,7 +1004,7 @@ <translation id="2479780645312551899">این بار همه افزایهها اجرا شوند</translation> <translation id="2480626392695177423">تغییر وضعیت بین حالت علامتگذاری عرض کامل/نیمه</translation> <translation id="2481332092278989943">افزودن به قفسه</translation> -<translation id="2482081114970574549">بهجای جریان مبتنی بر webview از جریان ورود به سیستم مبتنی بر iframe استفاده میکند.</translation> +<translation id="2482081114970574549">بهجای جریان مبتنی بر وبنما از جریان ورود به سیستم مبتنی بر iframe استفاده میکند.</translation> <translation id="2482878487686419369">اعلانها</translation> <translation id="2485056306054380289">گواهی CA سرور:</translation> <translation id="2489316678672211764">یک افزایه (<ph name="PLUGIN_NAME" />) پاسخ نمیدهد.</translation> @@ -1313,6 +1314,7 @@ <translation id="2889064240420137087">بازکردن پیوند با...</translation> <translation id="2889925978073739256">افزایههایی که در محیط آزمایشی نبودهاند همچنان مسدود بمانند</translation> <translation id="2890624088306605051">فقط دادهها و تنظیمات همگامسازی شده دریافت شود</translation> +<translation id="2890678560483811744">ارجاع صفحه بیش از حد مجاز</translation> <translation id="2893168226686371498">مرورگر پیشفرض</translation> <translation id="289426338439836048">دیگر شبکهٔ تلفن همراه...</translation> <translation id="2894745200702272315">نسخه آزمایشی ویژگیهای تشخیص کلیدگفته «Ok Google» را که به سختافزار وابسته هستند، فعال میکند.</translation> @@ -1341,7 +1343,6 @@ <translation id="2925966894897775835">صفحات</translation> <translation id="2927017729816812676">فضای حافظه پنهان</translation> <translation id="2927657246008729253">تغییر...</translation> -<translation id="2928415919076124714">پنهان کردن نوارابزار در حالت تمامصفحه</translation> <translation id="2928526264833629376">ادامه به Hangouts</translation> <translation id="2930644991850369934">در حین دانلود تصویر بازیابی مشکلی روی داد. اتصال شبکه قطع شده است.</translation> <translation id="293111069139560936">به قفسه اجازه میدهد اگر روی موردی از قفسه کلیک شد که فقط یک پنجره فعال مرتبط با آن دارد، پنجره را کوچک کند.</translation> @@ -1586,7 +1587,6 @@ <translation id="3289566588497100676">ورود آسان نماد</translation> <translation id="3289856944988573801">برای بررسی موارد بهروز لطفاً از کابل شبکه یا Wi-Fi استفاده کنید.</translation> <translation id="3293325348208285494">شروع سریع</translation> -<translation id="3293894718455402932">«<ph name="EXTENSION" />» قادر خواهد بود که تصاویر، فایلهای ویدیویی و صوتی را در پوشههای علامت زده شده بخواند و بنویسد.</translation> <translation id="3294437725009624529">مهمان</translation> <translation id="329650768420594634">هشدار در مورد پسوند بسته</translation> <translation id="3296763833017966289">گرجستانی</translation> @@ -1644,6 +1644,7 @@ <translation id="3338239663705455570">صفحهکلید اسلوونیایی</translation> <translation id="3340978935015468852">تنظیمات</translation> <translation id="3341703758641437857">اجازهٔ دسترسی به نشانیهای وب فایل</translation> +<translation id="3343813173145836998">ورود به سیستم آسان در این دستگاه</translation> <translation id="3344786168130157628">نام نقطه دسترسی:</translation> <translation id="3345135638360864351">درخواست شما برای دسترسی به این سایت به <ph name="NAME" /> ارسال نشد. لطفاً دوباره امتحان کنید.</translation> <translation id="3345886924813989455">مرورگر پشتیبانی شدهای یافت نشد</translation> @@ -2283,6 +2284,7 @@ <translation id="4268025649754414643">به رمز درآوردن کلید</translation> <translation id="4268574628540273656">نشانی وب:</translation> <translation id="4270393598798225102">نسخه <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">مورد منطبقی وجود ندارد</translation> <translation id="4274187853770964845">خطای همگامسازی: لطفاً Sync را متوقف کرده و دوباره راهاندازی کنید.</translation> <translation id="4275830172053184480">راهاندازی دستگاه خود</translation> <translation id="4276796043975446927">به «Chromebox برای جلسات» خوش آمدید</translation> @@ -2352,6 +2354,7 @@ <translation id="4378551569595875038">در حال اتصال...</translation> <translation id="438122767399415311">اجباری کردن جهت واسط کاربر</translation> <translation id="4381849418013903196">دونقطه</translation> +<translation id="4383192539467954373">ورود به سیستم خودکار در همه دستگاهها</translation> <translation id="4384652540891215547">فعال کردن افزونه</translation> <translation id="438503109373656455">اسب</translation> <translation id="4387554346626014084">فعال کردن همگامسازی راهانداز برنامه. این کار پوشهها را نیز هنگام در دسترس بودن فعال میکند (غیر OSX).</translation> @@ -2384,6 +2387,7 @@ <translation id="444267095790823769">استثنائات محتوای محافظتشده</translation> <translation id="4443536555189480885">&راهنما</translation> <translation id="4444304522807523469">دسترسی به اسکنرهای سند متصل شده از طریق USB یا در شبکه محلی</translation> +<translation id="4445559854264555037">دستگاهتان را نمیبینید؟ <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">صفحه نمایش روی دستگاه دیگر نمایش داده شد</translation> <translation id="4447465454292850432">باتری:</translation> <translation id="4449935293120761385">درباره تکمیل خودکار</translation> @@ -2640,6 +2644,7 @@ <translation id="485316830061041779">آلمانی</translation> <translation id="4856478137399998590">سرویس داده تلفن همراه شما فعال شده و آمادهٔ استفاده است.</translation> <translation id="4858913220355269194">فوتبالی</translation> +<translation id="4860565041166337978">انجام بارگیریها توسط مدیر بارگیری سیستم (در صورت امکان) مجاز است.</translation> <translation id="48607902311828362">حالت هواپیما</translation> <translation id="4861833787540810454">&پخش</translation> <translation id="4862050643946421924">در حال افزودن دستگاه...</translation> @@ -2723,7 +2728,6 @@ <translation id="4977942889532008999">تأیید دسترسی</translation> <translation id="4982718461356080574">پنهان کردن دکمههای بستن در برگههای غیرفعال جمعشده</translation> <translation id="498294082491145744">تغییر تنظیمات که دسترسی وبسایتها به قابلیتهایی مثل کوکیها، جاوا اسکرپیت، افزایهها، موقعیت جغرافیایی، میکروفن، دوربین و غیره را کنترل میکنند.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">صفحات</translation> <translation id="4988792151665380515">صادر کردن کلید عمومی ناموفق بود.</translation> <translation id="49896407730300355">چرخاندن خلاف جهت ع&قربههای ساعت</translation> @@ -2913,7 +2917,6 @@ <translation id="5268606875983318825">PPAPI (خارج از پردازش)</translation> <translation id="526926484727016706">باعث میشود بهطور پیشفرض همه مجوزهای iframe رد شود. اجازه دادن به مجوزهای خاصی برای یک iframe ممکن است موجب شود نام این مجوزها بهعنوان مقادیری برای مشخصههای جدید iframe فهرست شود.</translation> <translation id="5269977353971873915">چاپ نشد</translation> -<translation id="5270884342523754894">«<ph name="EXTENSION" />» قادر خواهد بود که تصاویر، فایلهای ویدیویی و صوتی را در پوشههای علامت زده شده بخواند.</translation> <translation id="5271247532544265821">تغییر وضعیت بین حالت چینی ساده/سنتی</translation> <translation id="5271549068863921519">ذخیره گذرواژه</translation> <translation id="5273628206174272911">پیمایش آزمایشی سابقه در مقایسه با پیمایش افقی.</translation> @@ -3003,11 +3006,11 @@ <translation id="5390284375844109566">پایگاه داده فهرستبندی شده</translation> <translation id="5392544185395226057">پشتیبانی برای Native Client فعال شود.</translation> <translation id="5393125431335030955">این افزایه فقط در رایانه عمل میکند.</translation> -<translation id="5393559999218790205">غیرفعال کردن خطهای زمان پویانمایی ترکیبکننده رابط کاربری</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> در <ph name="PEPPER_PLUGIN_DOMAIN" /> میخواهد به رایانه شما دسترسی پیدا کند.</translation> <translation id="539755880180803351">فرمهای وب را با پیش بینیهای نوع تکمیل خودکار قسمت بهعنوان یک متن نگهدارنده مکان حاشیهنویسی میکند.</translation> <translation id="5397578532367286026">میزان مصرف و سابقه این کاربر میتواند توسط مدیر (<ph name="MANAGER_EMAIL" />) در chrome.com بازبینی شود.</translation> <translation id="5397794290049113714">شما</translation> +<translation id="5398572795982417028">ارجاع صفحه بیش از حد مجاز است، حداکثر مجاز <ph name="MAXIMUM_PAGE" /> است</translation> <translation id="5398824043967640339"><ph name="COUNT" /> از این سایتها</translation> <translation id="5399158067281117682">پین ها مطابقت ندارند!</translation> <translation id="5400640815024374115">تراشه مادول سکوی قابل اطمینان (TPM) غیرفعال است یا موجود نیست.</translation> @@ -3027,7 +3030,7 @@ <translation id="5423849171846380976">فعال شد</translation> <translation id="5425470845862293575">استفاده از سیستم تولید تصویر قلم آزمایشی DirectWrite را فعال میکند.</translation> <translation id="5425722269016440406">برای خاموش کردن Smart Lock باید آنلاین باشید زیرا این تنظیم با تلفن و سایر دستگاههای شما همگامسازی میشود. لطفاً اول به شبکه متصل شوید.</translation> -<translation id="5426623592374109001">استفاده از سیستم فرعی پویانمایی نفوذی قدیمی برای پویانماییهای ترکیبی در رابط کاربری.</translation> +<translation id="5425863515030416387">ورود به سیستم آسان در همه دستگاهها</translation> <translation id="5427459444770871191">چرخاندن در جهت &عقربههای ساعت</translation> <translation id="5428105026674456456">اسپانیایی</translation> <translation id="542872847390508405">به عنوان مهمان مرور میکنید</translation> @@ -3222,7 +3225,6 @@ <translation id="5708171344853220004">نام اصلی Microsoft</translation> <translation id="5709885306771508267">مقیاس با نزدیک یا دور کردن انگشتان</translation> <translation id="5710406368443808765">اووه! سیستم نتوانست کد دسترسی و شناسه دستگاه را ذخیره کند.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> پاسخ نمیدهد. ارسال محتوا ممکن نیست.</translation> <translation id="5711983031544731014">قفل باز نشد. گذرواژهتان را وارد کنید.</translation> <translation id="5712966208980506909">اگر فعال باشد، نشانی وب chrome://md-policy صفحه خطمشی «طراحی سهبعدی» را بارگیری میکند.</translation> <translation id="5715711091495208045">واسطه افزایه: <ph name="PLUGIN_NAME" /></translation> @@ -3489,7 +3491,6 @@ <translation id="6111974609785983504">مجاز شده به صورت پیشفرض</translation> <translation id="6113134669445407638">Delay Agnostic AEC را در WebRTC غیرفعال میکند. اگر تأخیرهای گزارش شده سیستم خیلی قابل اعتماد است، یا اگر دیگران از دستگاهتان انعکاس صدا را میشنوند از این گزینه استفاده کنید.</translation> <translation id="6116921718742659598">تغییر تنظیمات زبان و ورودی</translation> -<translation id="6117536376248197233">غیرفعال کردن خطهای زمان پویانمایی ترکیبی در تولیدکنندههای تصویر.</translation> <translation id="6120205520491252677">این صفحه به صفحه شروع پین شود…</translation> <translation id="6122081475643980456">اتصال اینترنت شما کنترل میشود</translation> <translation id="6122093587541546701">ایمیل (اختیاری):</translation> @@ -3521,6 +3522,7 @@ <translation id="6163522313638838258">بزرگ کردن همه...</translation> <translation id="6164005077879661055">با حذف این کاربر نظارتشده، کلیه فایلها و دادههای محلی مربوط به کاربر نظارتشده برای همیشه حذف خواهند شد. وبسایتهای بازدید شده و تنظیمات این کاربر نظارتشده همچنان برای مدیر در <ph name="MANAGEMENT_URL" /> قابل مشاهده خواهد بود.</translation> <translation id="6165508094623778733">بیشتر بدانید</translation> +<translation id="6167008112175207002">نشانکها، سابقه، گذرواژه و سایر تنظیماتتان در حساب Google شما همگامسازی میشود، بنابراین میتوانید در همه دستگاههایتان از آنها استفاده کنید. این تنظیم را میتوانید در <ph name="BEGIN_LINK" /> تغییر دهید</translation> <translation id="6171550060231646388">قابلیتهای سختافزاری شبیهسازیشده «Ok Google»</translation> <translation id="6175314957787328458">GUID دامنه Microsoft</translation> <translation id="6178664161104547336">انتخاب گواهی</translation> @@ -3766,7 +3768,6 @@ <translation id="6555432686520421228">همه حسابهای کاربر حذف شود و دستگاه <ph name="IDS_SHORT_PRODUCT_NAME" /> شما بازنشانی شود تا جدید شود.</translation> <translation id="6556866813142980365">انجام مجدد</translation> <translation id="6557565812667414268">فقط برای نمایشگرهای دارای وضوح بالا فعال میشود</translation> -<translation id="655845594391856372">برگه پاسخ نمیدهد. ارسال محتوا ممکن نیست.</translation> <translation id="6559580823502247193">(از قبل در این دستگاه وجود دارد)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="6562437808764959486">در حال استخراج تصویر بازیابی...</translation> @@ -3867,6 +3868,7 @@ <translation id="6723354935081862304">در سندنگار Google و دیگر مقصدهای cloud چاپ کنید. <ph name="BEGIN_LINK" />وارد سیستم شوید<ph name="END_LINK" /> تا در Google Cloud Print چاپ کنید.</translation> <translation id="6723661294526996303">وارد کردن نشانکها و تنظیمات...</translation> <translation id="6723839937902243910">نیرو</translation> +<translation id="6725240607822645708">IME در گفتگوی خودش اجرا شود.</translation> <translation id="6725970970008349185">تعداد کاندیداها برای نمایش در هر صفحه</translation> <translation id="672609503628871915">مشاهده تازهها</translation> <translation id="6727005317916125192">چارچوب قبلی</translation> @@ -3997,12 +3999,11 @@ <translation id="6948736568813450284">برای برنامهنویسان: از سرویس جعبه ایمنی برای فراخوانیهای Google Payments API استفاده کنید.</translation> <translation id="6949306908218145636">نشانکگذاری صفحههای باز...</translation> <translation id="695164542422037736">اگر این گزینه فعال شود و متن با پسزمینه-attachment:fixed مدل داده شود، پسزمینه لایه ترکیبی خود را خواهد داشت.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> گذرواژههای شما را به خاطر میسپارد و شما را در این دستگاه بهصورت خودکار به سیستم سایتها وارد میکند.</translation> <translation id="6955446738988643816">بازرسی پنجره بازشو</translation> <translation id="695755122858488207">دکمه رادیویی انتخاب نشده</translation> +<translation id="6960277925159781810">ورود به سیستم خودکار در این دستگاه</translation> <translation id="696036063053180184">3 مجموعه (بدون shift)</translation> <translation id="696203921837389374">فعال کردن همگامسازی از طریق داده تلفن همراه</translation> -<translation id="6964308487066031935">پوشهها به «<ph name="EXTENSION" />» افزوده شوند؟</translation> <translation id="6965382102122355670">تأیید</translation> <translation id="6965648386495488594">درگاه</translation> <translation id="6965978654500191972">دستگاه</translation> @@ -4100,7 +4101,6 @@ <translation id="7076293881109082629">در حال ورود به سیستم</translation> <translation id="7077829361966535409">بارگیری صفحه ورود به سیستم با استفاده از تنظمیات کنونی پروکسی انجام نشد. لطفاً <ph name="GAIA_RELOAD_LINK_START" />دوباره به سیستم وارد شوید<ph name="GAIA_RELOAD_LINK_END" /> یا از <ph name="PROXY_SETTINGS_LINK_START" />تنظمیات پروکسی<ph name="PROXY_SETTINGS_LINK_END" /> متفاوتی استفاده نمایید.</translation> <translation id="7077872827894353012">کنترل کنندههای پروتکل نادیده گرفته شده</translation> -<translation id="7079038783243627996">«<ph name="EXTENSION" />» قادر خواهد بود که تصاویر، فایلهای ویدیویی و صوتی را در پوشههای علامت زده شده بخواند و حذف کند.</translation> <translation id="708060913198414444">کپی آدرس صوت</translation> <translation id="708187310695946552">واسط کاربری حبابی بازیابی جلسه</translation> <translation id="7082055294850503883">CapsLock را خاموش کنید و فقط حروف کوچک را بهصورت پیشفرض وارد کنید</translation> @@ -4473,7 +4473,6 @@ <translation id="7650511557061837441">«<ph name="TRIGGERING_EXTENSION_NAME" />» میخواهد «<ph name="EXTENSION_NAME" />» را حذف کند.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> به این زبان نمایش داده میشود</translation> <translation id="7654941827281939388">این حساب در حال حاضر در این رایانه در حال استفاده است.</translation> -<translation id="7655165758820095116">شیء MediaSource به جاوا اسکریپت امکان میدهد دادههای رسانه را بهطور مستقیم به یک عنصر ویدیویی ارسال کند.</translation> <translation id="7658239707568436148">لغو</translation> <translation id="7659584679870740384">مجاز به استفاده از این دستگاه نیستید. لطفاً برای دریافت اجازه ورود به سیستم با سرپرست تماس بگیرید.</translation> <translation id="7664620655576155379">دستگاه بلوتوث پشتیبانی نشده: «<ph name="DEVICE_NAME" />».</translation> @@ -4604,6 +4603,7 @@ <translation id="7861215335140947162">&فایلهای بارگیریشده</translation> <translation id="7864539943188674973">غیرفعال کردن بلوتوث</translation> <translation id="7868891395842935202">«چارچوب آزمایشی» را برای کنترل دسترسی به آزمایشهای API فعال میکند.</translation> +<translation id="7870576007982733437">در صورت امکان از مدیر بارگیری سیستم استفاده کنید.</translation> <translation id="7870790288828963061">برنامههای کیوسکی با نسخه جدیدتر پیدا نشد. موردی برای بهروزرسانی وجود ندارد. لطفاً فلش USB را خارج کنید.</translation> <translation id="787150342916295244">اسکن کارت اعتباری</translation> <translation id="7874357055309047713">همیشه در همه سایتها اجرا شود</translation> @@ -4646,7 +4646,6 @@ <translation id="7918257978052780342">ثبت نام</translation> <translation id="7920092496846849526">از والدینتان پرسیدید آیا اجازه بازدید از این صفحه را دارید.</translation> <translation id="7925285046818567682">منتظر <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> گذرواژههای شما را به خاطر میسپارد و شما را در همه دستگاهها بهصورت خودکار به سیستم برنامهها و سایتها وارد میکند.</translation> <translation id="7925686952655276919">از دادههای تلفن همراه برای همگامسازی استفاده نشود</translation> <translation id="7926906273904422255">علامتگذاری منبع اصلی غیرایمن به عنوان «غیرایمن» یا به عنوان «مشکوک».</translation> <translation id="7928710562641958568">خارج کردن دستگاه</translation> @@ -4708,7 +4707,6 @@ فایل کلید خود را در جای امن نگه دارید. برای ایجاد نسخههای جدید برنامهٔ افزودنی خود به آن نیاز دارید.</translation> <translation id="799923393800005025">میتواند مشاهده کند</translation> <translation id="7999338963698132743">مدیر فعالیت جدید</translation> -<translation id="8000004253404706714">استفاده از سیستم فرعی پویانمایی نفوذی قدیمی برای پویانماییهای ترکیبی در تولیدکنندههای تصویر.</translation> <translation id="8004582292198964060">مرورگر</translation> <translation id="8007030362289124303">باتری ضعیف است</translation> <translation id="8008356846765065031">اینترنت قطع است. لطفاً اتصال اینترنتتان را بررسی کنید.</translation> @@ -5230,6 +5228,7 @@ <translation id="8765985713192161328">مدیریت کنترل کننده...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">کاربران</translation> +<translation id="8768367823103160496">قفل نشانگر موشواره</translation> <translation id="8769662576926275897">جزئیات کارت</translation> <translation id="8770196827482281187">روش ورودی فارسی (طرح کلی ISIRI 2901)</translation> <translation id="8774934320277480003">حاشیه بالا</translation> @@ -5249,6 +5248,7 @@ <translation id="8795668016723474529">افزودن کارت اعتباری</translation> <translation id="8795916974678578410">پنجرهٔ جدید</translation> <translation id="8798099450830957504">پیشفرض</translation> +<translation id="8799127529310003270">اگر فعال شود، تماسهای InputConnection در گفتگوی IME اجرا میشوند و بهجای حفظ یک ویرایشگر کپی، هر تماس InputConnection مستقیماً با تولیدکننده تصویر ارتباط برقرار میکند.</translation> <translation id="8799839487311913894">فعال کردن بهروزرسانی یک گذرواژه در مدیریت گذرواژه بعد از ارسال فرم «تغییر گذرواژه».</translation> <translation id="8800004011501252845">نمایش مقصدها برای</translation> <translation id="8800420788467349919">میزان صدا: <ph name="PRECENTAGE" />%</translation> @@ -5274,6 +5274,7 @@ <translation id="8841142799574815336">بخش قابل مشاهده بیاثر.</translation> <translation id="884264119367021077">اطلاعات ارسال</translation> <translation id="8844238624737526720">استفاده از اجرای جدید و بهبودیافته مدیر فعالیتهای Chrome.</translation> +<translation id="8845001906332463065">دریافت راهنمایی</translation> <translation id="8846141544112579928">در حال جستجو برای صفحهکلید...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">تغییر حالت کلید shift</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 606cca0..58df16d 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">Tämä nollaa aloitussivun, Uusi välilehti ‑sivun, hakukoneen ja kiinnitetyt välilehdet. Lisäksi kaikki laajennukset poistetaan käytöstä ja väliaikaiset tiedot kuten evästeet poistetaan. Kirjanmerkkejä, selaushistoriaa tai tallennettuja salasanoja ei poisteta.</translation> <translation id="1434886155212424586">Etusivu on Uusi välilehti -sivu</translation> <translation id="1435550882135542937">Laajennusyläpalkin uusi ulkoasu</translation> +<translation id="1436402875660227532">Huom. Näitä asetuksia ei enää käytetä tässä järjestelmässä, mutta voit silti katsella ja muokata niitä.</translation> <translation id="1436784010935106834">Poistettu</translation> <translation id="1438632560381091872">Poista välilehtien mykistys</translation> <translation id="1441841714100794440">Vietnamilainen näppäimistö (telex)</translation> @@ -1317,6 +1318,7 @@ <translation id="2889064240420137087">Avaa linkki sovelluksessa...</translation> <translation id="2889925978073739256">Estä hiekkalaatikossa toimimattomat laajennukset edelleen</translation> <translation id="2890624088306605051">Nouda vain synkronoidut asetukset ja tiedot</translation> +<translation id="2890678560483811744">Sivuviittaus on rajojen ulkopuolella.</translation> <translation id="2893168226686371498">Oletusselain</translation> <translation id="289426338439836048">Muu mobiiliverkko...</translation> <translation id="2894745200702272315">Ottaa käyttöön kokeellisen version Ok Google -toimintosanojen laitteistokohtaisista havaitsemisominaisuuksista.</translation> @@ -1345,7 +1347,6 @@ <translation id="2925966894897775835">Taulukot</translation> <translation id="2927017729816812676">Välimuistin tallennustila</translation> <translation id="2927657246008729253">Vaihda...</translation> -<translation id="2928415919076124714">Piilota työkalupalkki koko näytön tilassa</translation> <translation id="2928526264833629376">Jatka Hangoutsiin</translation> <translation id="2930644991850369934">Virhe ladattaessa palautusnäköistiedostoa. Verkkoyhteys on katkennut.</translation> <translation id="293111069139560936">Sallii hyllyn pienentää ikkunan, kun käyttäjä klikkaa hyllyn kohdetta, johon liittyy vain yksittäinen, jo aktiivinen ikkuna.</translation> @@ -1590,7 +1591,6 @@ <translation id="3289566588497100676">Helppo merkkien syöttö</translation> <translation id="3289856944988573801">Tarkista päivitykset Ethernetin tai Wi-Fin kautta.</translation> <translation id="3293325348208285494">Nopea aloitus</translation> -<translation id="3293894718455402932"><ph name="EXTENSION" /> voi lukea ja kirjoittaa kuvia, videoita ja äänitiedostoja valituissa kansioissa.</translation> <translation id="3294437725009624529">Vieras</translation> <translation id="329650768420594634">Varoitus: pakattu laajennus</translation> <translation id="3296763833017966289">gruusia</translation> @@ -1647,6 +1647,7 @@ <translation id="3338239663705455570">Näppäimistö: sloveeni</translation> <translation id="3340978935015468852">asetuksissa</translation> <translation id="3341703758641437857">Salli tiedostojen URL-osoitteiden käyttö</translation> +<translation id="3343813173145836998">Kirjaudu helposti sisään tällä laitteella</translation> <translation id="3344786168130157628">Tukiaseman nimi:</translation> <translation id="3345135638360864351">Tämän sivuston käyttöpyyntöä ei voitu lähettää henkilölle <ph name="NAME" />. Yritä uudelleen.</translation> <translation id="3345886924813989455">Yhtään tuettua selainta ei löytynyt</translation> @@ -2283,6 +2284,7 @@ <translation id="4268025649754414643">Avaimen salakoodaus</translation> <translation id="4268574628540273656">URL-osoite:</translation> <translation id="4270393598798225102">Versio <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Ei hakutuloksia</translation> <translation id="4274187853770964845">Synkronointivirhe: Pysäytä synkronointi ja käynnistä se uudelleen.</translation> <translation id="4275830172053184480">Käynnistä laite uudelleen</translation> <translation id="4276796043975446927">Tervetuloa Chromebox kokouksille -palveluun!</translation> @@ -2351,6 +2353,7 @@ <translation id="4378551569595875038">Yhdistetään…</translation> <translation id="438122767399415311">Pakota käyttöliittymän suunta</translation> <translation id="4381849418013903196">Kaksoispiste</translation> +<translation id="4383192539467954373">Kirjaudu automaattisesti sisään eri laitteilla</translation> <translation id="4384652540891215547">Aktivoi laajennus</translation> <translation id="438503109373656455">V5</translation> <translation id="4387554346626014084">Ota sovellusten käynnistysohjelman synkronointi käyttöön. Tämä ottaa käyttöön myös Kansiot, jos saatavilla (muissa kuin OSX-järjestelmissä).</translation> @@ -2383,6 +2386,7 @@ <translation id="444267095790823769">Suojatun sisällön poikkeukset</translation> <translation id="4443536555189480885">O&hje</translation> <translation id="4444304522807523469">Käyttää USB:n tai lähiverkon kautta yhdistettyjä dokumenttiskannereita</translation> +<translation id="4445559854264555037">Etkö näe laitettasi? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Peilattu</translation> <translation id="4447465454292850432">Akku:</translation> <translation id="4449935293120761385">Tietoja Automaattisesta täytöstä</translation> @@ -2636,6 +2640,7 @@ <translation id="485316830061041779">saksa</translation> <translation id="4856478137399998590">Tiedonsiirtopalvelu on aktivoitu ja valmis käyttöön</translation> <translation id="4858913220355269194">Litti</translation> +<translation id="4860565041166337978">Salli järjestelmän latauksienhallinnan käsitellä latauksia, kun mahdollista.</translation> <translation id="48607902311828362">Lentokonetila</translation> <translation id="4861833787540810454">&Toista</translation> <translation id="4862050643946421924">Laitetta lisätään…</translation> @@ -2719,7 +2724,6 @@ <translation id="4977942889532008999">Vahvista osoite</translation> <translation id="4982718461356080574">Välilehtipinon ei-aktiivisten välilehtien sulkemispainikkeiden piilotus</translation> <translation id="498294082491145744">Muokata asetuksia, jotka ohjaavat verkkosivustojen käyttöoikeutta ominaisuuksiin, kuten evästeisiin, JavaScriptiin, laajennuksiin, sijaintiin, mikrofoniin, kameraan jne.</translation> -<translation id="4984329823325527157">Media Source -sovellusliittymä</translation> <translation id="4988526792673242964">Sivut</translation> <translation id="4988792151665380515">Julkisen avaimen vienti epäonnistui.</translation> <translation id="49896407730300355">Käännä &vastapäivään</translation> @@ -2906,7 +2910,6 @@ <translation id="5268606875983318825">PPAPI (prosessin ulkopuolinen)</translation> <translation id="526926484727016706">Aiheuttaa kaikkien iframe-kehysten käyttöoikeuksien epäämisen oletuksena. Tiettyjen iframe-kehysten käyttöoikeuksien salliminen saattaa sisältää näiden käyttöoikeuksien nimien määrittämisen uusien iframe-attribuuttien arvoina.</translation> <translation id="5269977353971873915">Tulostus epäonnistui</translation> -<translation id="5270884342523754894"><ph name="EXTENSION" /> voi lukea kuvia, videoita ja äänitiedostoja merkityissä kansioissa.</translation> <translation id="5271247532544265821">Ota käyttöön yksinkertaistettu/perinteinen kiina</translation> <translation id="5271549068863921519">Tallenna salasana</translation> <translation id="5273628206174272911">Kokeellinen historian navigointi vaakasuuntaisen ylivierityksen seurauksena.</translation> @@ -2996,11 +2999,11 @@ <translation id="5390284375844109566">Indeksoitu tietokanta</translation> <translation id="5392544185395226057">Ota Asiakassovelluksen tuki käyttöön.</translation> <translation id="5393125431335030955">Tämä laajennus toimii vain työpöytätilassa.</translation> -<translation id="5393559999218790205">Poista käyttöliittymän sommitellut animaatioaikajanat käytöstä</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> -laajennus verkkotunnuksessa <ph name="PEPPER_PLUGIN_DOMAIN" /> haluaa käyttää tietokonettasi.</translation> <translation id="539755880180803351">Merkitsee verkkolomakkeisiin automaattisen täytön ennusteita paikkamerkkeinä.</translation> <translation id="5397578532367286026">Hallinnoija (<ph name="MANAGER_EMAIL" />) voi tarkkailla tämän käyttäjän käyttö- ja historiatietoja osoitteessa chrome.com.</translation> <translation id="5397794290049113714">Sinä</translation> +<translation id="5398572795982417028">Sivuviittaus on rajojen ulkopuolella. Raja on <ph name="MAXIMUM_PAGE" />.</translation> <translation id="5398824043967640339"><ph name="COUNT" /> muilta sivustoilta</translation> <translation id="5399158067281117682">PIN-koodit eivät täsmää!</translation> <translation id="5400640815024374115">Trusted Platform Module (TPM) -siru on pois käytöstä tai puuttuu.</translation> @@ -3020,7 +3023,7 @@ <translation id="5423849171846380976">Aktivoitu</translation> <translation id="5425470845862293575">Poistaa käytöstä kokeellisen kirjasimien DirectWrite-hahmonnusjärjestelmän.</translation> <translation id="5425722269016440406">Voit poistaa Smart Lockin käytöstä vain, kun olet yhteydessä verkkoon, koska asetus on synkronoitu puhelimesi ja muiden laitteidesi kanssa. Muodosta ensin verkkoyhteys.</translation> -<translation id="5426623592374109001">Käyttöliittymän sommitelluissa animaatioissa käytetään vanhaa ja vähemmän huomaamatonta animaatioiden alijärjestelmää.</translation> +<translation id="5425863515030416387">Kirjaudu helposti sisään eri laitteilla</translation> <translation id="5427459444770871191">Käännä &myötäpäivään</translation> <translation id="5428105026674456456">espanja</translation> <translation id="542872847390508405">Selaat vierailijana</translation> @@ -3215,7 +3218,6 @@ <translation id="5708171344853220004">Microsoftin päänimi</translation> <translation id="5709885306771508267">Nipistämällä skaalaaminen</translation> <translation id="5710406368443808765">Hups! Järjestelmä ei voinut tallentaa laitteen tunnistetta ja tunnusta.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> ei vastaa. Suoratoisto ei onnistu.</translation> <translation id="5711983031544731014">Avaaminen ei onnistu. Anna salasana.</translation> <translation id="5712966208980506909">Jos toiminto on käytössä, osoite chrome://md-policy avaa Material Design -käytäntösivun.</translation> <translation id="5715711091495208045">Laajennuksen välittäjä: <ph name="PLUGIN_NAME" /></translation> @@ -3482,7 +3484,6 @@ <translation id="6111974609785983504">Sallittu oletuksena</translation> <translation id="6113134669445407638">Poista käytöstä Delay Agnostic AEC WebRTC:ssä. Käytä, jos ilmoitetut järjestelmän viiveet ovat hyvin luotettuja tai laitteesi aiheuttaa kaikua muille.</translation> <translation id="6116921718742659598">Vaihda kielen ja syöttötavan asetuksia</translation> -<translation id="6117536376248197233">Poista sommitellut animaatioaikajanat käytöstä hahmontajissa</translation> <translation id="6120205520491252677">Kiinnitä tämä sivu aloitusruutuun...</translation> <translation id="6122081475643980456">Internetyhteyttäsi hallinnoidaan</translation> <translation id="6122093587541546701">Sähköpostiosoite (valinnainen):</translation> @@ -3516,6 +3517,7 @@ pysyvästi, kun tämä valvottu käyttäjä poistetaan. Vieraillut verkkosivustot ja valvotun käyttäjän asetukset saattavat silti vielä näkyä hallinnoijalle osoitteessa <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Lisätietoja</translation> +<translation id="6167008112175207002">Kirjanmerkkisi, historiasi, salasanasi ja muut asetuksesi synkronoidaan Google-tilillesi, joten voit käyttää niitä kaikilla laitteillasi. Voit muokata tätä asetusta täällä: <ph name="BEGIN_LINK" />.</translation> <translation id="6171550060231646388">Simuloidun laitteiston Ok Google -toiminnot</translation> <translation id="6175314957787328458">Microsoftin toimialueen GUID-tunnus</translation> <translation id="6178664161104547336">Valitse varmenne</translation> @@ -3761,7 +3763,6 @@ <translation id="6555432686520421228">Poista kaikki käyttäjätilit ja palauta <ph name="IDS_SHORT_PRODUCT_NAME" />-laitteeseesi tehdasasetukset.</translation> <translation id="6556866813142980365">Tee uudelleen</translation> <translation id="6557565812667414268">Otetaan käyttöön vain näytöillä, joissa on korkea DPI</translation> -<translation id="655845594391856372">Välilehti ei vastaa. Suoratoisto ei onnistu.</translation> <translation id="6559580823502247193">(on jo tässä laitteessa)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Puretaan palautusnäköistiedostoa...</translation> @@ -3862,6 +3863,7 @@ <translation id="6723354935081862304">Tulosta Google Docsiin ja muihin pilvikohteisiin. <ph name="BEGIN_LINK" />Kirjaudu sisään<ph name="END_LINK" /> ja tulosta Google Cloud Printin avulla.</translation> <translation id="6723661294526996303">Tuo kirjanmerkit ja asetukset...</translation> <translation id="6723839937902243910">Virta</translation> +<translation id="6725240607822645708">Suorita IME omassa säikeessään</translation> <translation id="6725970970008349185">Sivulla näytettävien ehdotusten lukumäärä</translation> <translation id="672609503628871915">Uudet ominaisuudet</translation> <translation id="6727005317916125192">Edellinen ruutu</translation> @@ -3991,12 +3993,11 @@ <translation id="6948736568813450284">Kehittäjät: käyttäkää Google Payments -sovellusliittymän kutsuissa hiekkalaatikkopalvelua.</translation> <translation id="6949306908218145636">Aseta avoimet sivut kirjanmerkeiksi…</translation> <translation id="695164542422037736">Jos tämä asetus on käytössä ja body-osa käyttää tyyliä background-attachment:fixed, taustakuvalle luodaan oma koostamistaso.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> muistaa salasanasi ja kirjaa sinut sivustoille tällä laitteella automaattisesti.</translation> <translation id="6955446738988643816">Näytä ponnahdusikkuna</translation> <translation id="695755122858488207">Ei-valittu valintanappi</translation> +<translation id="6960277925159781810">Kirjaudu automaattisesti sisään tällä laitteella</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Ota käyttöön synkronointi mobiilitiedonsiirron kautta</translation> -<translation id="6964308487066031935">Lisätäänkö kansiot laajennukseen <ph name="EXTENSION" />?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Portti</translation> <translation id="6965978654500191972">Laite</translation> @@ -4094,7 +4095,6 @@ <translation id="7076293881109082629">Kirjautuminen</translation> <translation id="7077829361966535409">Kirjautumissivun lataaminen epäonnistui nykyisillä välityspalvelimen asetuksilla. <ph name="GAIA_RELOAD_LINK_START" />Kirjaudu sisään uudelleen<ph name="GAIA_RELOAD_LINK_END" /> tai muokkaa <ph name="PROXY_SETTINGS_LINK_START" />välityspalvelimen asetuksia<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ohitetut protokollan käsittelijät</translation> -<translation id="7079038783243627996"><ph name="EXTENSION" /> voi lukea ja poistaa kuvia, videoita ja äänitiedostoja valituista kansioista.</translation> <translation id="708060913198414444">K&opioi äänen osoite</translation> <translation id="708187310695946552">Istunnon palauttamisen kehotekupla</translation> <translation id="7082055294850503883">Ohita CapsLock-näppäimen tila ja syötä oletuksena pieniä kirjaimia</translation> @@ -4465,7 +4465,6 @@ <translation id="7650511557061837441"><ph name="TRIGGERING_EXTENSION_NAME" /> haluaa poistaa laajennuksen <ph name="EXTENSION_NAME" />.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> näytetään tällä kielellä</translation> <translation id="7654941827281939388">Tämä tili on jo käytössä tässä tietokoneessa.</translation> -<translation id="7655165758820095116">MediaSource-objektin avulla JavaScript voi lähettää mediatietoja suoraan videoelementtiin.</translation> <translation id="7658239707568436148">Peruuta</translation> <translation id="7659584679870740384">Sinulla ei ole tämän laitteen käyttölupaa. Pyydä järjestelmänvalvojalta kirjautumislupa.</translation> <translation id="7664620655576155379">Tukematon Bluetooth-laite: <ph name="DEVICE_NAME" />.</translation> @@ -4596,6 +4595,7 @@ <translation id="7861215335140947162">&Lataukset</translation> <translation id="7864539943188674973">Poista Bluetooth käytöstä</translation> <translation id="7868891395842935202">Ottaa käyttöön Experimental Framework -tilan, jolla hallitaan pääsyä sovellusliittymäkokeiluihin.</translation> +<translation id="7870576007982733437">Käytä järjestelmän latauksienhallintaa, kun mahdollista</translation> <translation id="7870790288828963061">Ei löytynyt kioskisovelluksia, joiden versio on uudempi. Ei päivitettävää. Irrota USB-tikku.</translation> <translation id="787150342916295244">Luottokortin skannaus</translation> <translation id="7874357055309047713">Suorita aina kaikilla sivustoilla</translation> @@ -4638,7 +4638,6 @@ <translation id="7918257978052780342">Rekisteröidy</translation> <translation id="7920092496846849526">Pyysit vanhemmiltasi lupaa käydä tällä sivulla.</translation> <translation id="7925285046818567682">Odotetaan palvelinta osoitteessa <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> muistaa salasanasi ja kirjaa sinut sovelluksiin ja sivustoille automaattisesti kaikilla laitteilla.</translation> <translation id="7925686952655276919">Älä käytä mobiiliyhteyttä synkronointiin</translation> <translation id="7926906273904422255">Merkitse suojaamattomat alkuperät suojaamattomiksi tai ”epäilyttäviksi”.</translation> <translation id="7928710562641958568">Poista laite</translation> @@ -4700,7 +4699,6 @@ Tallenna avaintiedosto suojattuun sijaintiin. Tarvitset sitä, jos haluat luoda uusia laajennusversioita.</translation> <translation id="799923393800005025">Voi tarkastella</translation> <translation id="7999338963698132743">Uusi tehtävänhallinta</translation> -<translation id="8000004253404706714">Hahmontajien sommitelluissa animaatioissa käytetään vanhaa ja vähemmän huomaamatonta animaatioiden alijärjestelmää.</translation> <translation id="8004582292198964060">Selain</translation> <translation id="8007030362289124303">Akku on lähes tyhjä</translation> <translation id="8008356846765065031">Internetyhteys katkaistu. Tarkista internetyhteytesi.</translation> @@ -5222,6 +5220,7 @@ <translation id="8765985713192161328">Hallinnoi käsittelypalveluja...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Käyttäjät</translation> +<translation id="8768367823103160496">Hiiren osoittimen lukitus</translation> <translation id="8769662576926275897">Kortin tiedot</translation> <translation id="8770196827482281187">Persialainen syöttötapa (ISIRI 2901 -asettelu)</translation> <translation id="8774934320277480003">Yläreuna</translation> @@ -5241,6 +5240,7 @@ <translation id="8795668016723474529">Lisää luottokortti</translation> <translation id="8795916974678578410">Uusi ikkuna</translation> <translation id="8798099450830957504">Oletus</translation> +<translation id="8799127529310003270">Jos tämä merkintä on käytössä, InputConnection-kutsut suoritetaan IME:n säikeessä ja muokkausohjelman kopion käyttämisen sijaan kukin InputConnection-kutsu välitetään suoraan piirtäjälle.</translation> <translation id="8799839487311913894">Salli salasanan vaihtaminen hallintapalvelussa salasanan vaihtolomakkeen lähettämisen jälkeen.</translation> <translation id="8800004011501252845">Näytetään kohteita sähköpostiosoitteelle</translation> <translation id="8800420788467349919">Äänenvoimakkuus: <ph name="PRECENTAGE" /> %</translation> @@ -5266,6 +5266,7 @@ <translation id="8841142799574815336">Epäaktiivinen näkymä.</translation> <translation id="884264119367021077">Toimitusosoite</translation> <translation id="8844238624737526720">Käyttää Chromen tehtävänhallinnan uutta ja optimoitua toteutusta.</translation> +<translation id="8845001906332463065">Hae ohjeita</translation> <translation id="8846141544112579928">Näppäimistöä etsitään…</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Tilanvaihto vaihtonäppäimellä</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index aa2492b..66443e0bb 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Bookmark This Page...</translation> <translation id="1047956942837015229">Nagtatanggal ng <ph name="COUNT" /> (na) item...</translation> <translation id="1048597748939794622">Pwersahang naka-enable para sa lahat ng layer</translation> +<translation id="1049795001945932310">&Mga setting ng wika</translation> <translation id="1049926623896334335">Dokumento ng Word</translation> <translation id="1054153489933238809">Buksan ang Or&ihinal na Larawan sa Bagong Tab</translation> <translation id="1055806300943943258">Naghahanap ng mga Bluetooth at USB device...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliteration (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Mga awtomatikong server ng pangalan</translation> <translation id="1215411991991485844">Nadagdag ang bagong background na app</translation> +<translation id="1216954813581739968">I-enable ang tab para sa Pagbabahagi sa Desktop.</translation> <translation id="121827551500866099">Ipakita ang lahat ng mga pag-download...</translation> <translation id="122082903575839559">Certificate Signature Algorithm</translation> <translation id="1221024147024329929">PKCS #1 MD2 na May RSA Encryption</translation> @@ -191,6 +193,7 @@ <translation id="1290223615328246825">Nabigo ang awtomatikong pag-sign in</translation> <translation id="1293556467332435079">Mga File</translation> <translation id="1294298200424241932">I-edit ang mga setting ng pagtitiwala:</translation> +<translation id="1295794900245526845">Piliin ang iyong account na naka-save sa <ph name="PASSWORD_MANAGER_BRAND" /> upang mag-sign in</translation> <translation id="1297175357211070620">Destinasyon</translation> <translation id="1297922636971898492">Hindi available sa ngayon ang Google Drive. Awtomatikong magre-restart ang pag-a-upload sa sandaling bumalik na ang Google Drive.</translation> <translation id="1300861494336759522">Pagre-redirect ng paghahanap sa Windows desktop</translation> @@ -290,6 +293,7 @@ <translation id="1434696352799406980">Ire-reset nito ang iyong page sa pagsisimula, page ng bagong tab, search engine at mga naka-pin na tab. Idi-disable din nito ang lahat ng extension at iki-clear ang pansamantalang data tulad ng cookies. Hindi iki-clear ang iyong mga bookmark, history at naka-save na password.</translation> <translation id="1434886155212424586">Ang homepage ay ang pahina ng Bagong Tab</translation> <translation id="1435550882135542937">Pag-redesign ng toolbar ng extension</translation> +<translation id="1436402875660227532">Tandaan: Hindi na ginagamit ang mga setting na ito sa system na ito, ngunit maaari mo pa ring tingnan at i-edit ang mga ito.</translation> <translation id="1436784010935106834">Inalis</translation> <translation id="1438632560381091872">Mag-alis ng mga tab sa pagkaka-mute</translation> <translation id="1441841714100794440">Vietnamese keyboard (Telex)</translation> @@ -320,6 +324,7 @@ <translation id="14720830734893704">I-enable ang suporta sa virtual keyboard.</translation> <translation id="1474079335130556426">I-enable ang background mode para sa Push API. Binibigyang-daan nito ang Chrome na patuloy na gumana pagkatapos maisara ang huling window, at upang ilunsad sa pagsisimula ng OS, kung kailangan ito ng Push API.</translation> <translation id="1474339897586437869">Hindi na-upload ang "<ph name="FILENAME" />." Walang sapat na bakanteng espasyo sa iyong Google Drive.</translation> +<translation id="1476607407192946488">&Mga Setting ng Wika</translation> <translation id="1476949146811612304">Itakda kung aling search engine ang gagamitin kapag naghahanap mula sa <ph name="BEGIN_LINK" />omnibox<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Identity API Token Cache</translation> <translation id="1478340334823509079">Mga detalye: <ph name="FILE_NAME" /></translation> @@ -650,6 +655,7 @@ <translation id="1962233722219655970">Gumagamit ang pahinang ito ng Native Client app na hindi gumagana sa iyong computer.</translation> <translation id="1965328510789761112">Pribadong memory</translation> <translation id="1965624977906726414">Walang espesyal na pahintulot.</translation> +<translation id="1968720524450620475">I-enable ang mga icon ng pagkilos para sa Mga Notification sa Web.</translation> <translation id="1970746430676306437">Tingnan ang &impormasyon ng page</translation> <translation id="197288927597451399">Panatilihin</translation> <translation id="1973491249112991739">Nabigo ang pag-download ng <ph name="PLUGIN_NAME" />.</translation> @@ -911,6 +917,7 @@ <translation id="2344262275956902282">Gamitin ang - at = na mga key upang ilagay sa pahina ang isang listahan ng kandidato</translation> <translation id="2347476388323331511">Hindi ma-sync</translation> <translation id="2347991999864119449">Hayaan akong pumili kung kailan gagamit ng content ng plugin</translation> +<translation id="2348165084656290171">Upang ibahagi ang audio, pumili ng tab o buong screen.</translation> <translation id="2350182423316644347">Sinisimulan ang application...</translation> <translation id="2350796302381711542">Papayagan ang <ph name="HANDLER_HOSTNAME" /> na buksan ang lahat ng <ph name="PROTOCOL" /> (na) link sa halip na ang <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Wika at input</translation> @@ -998,6 +1005,7 @@ <translation id="247772113373397749">Canadian na Multilingual keyboard</translation> <translation id="2478176599153288112">Mga Pahintulot sa Media-File para sa "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">I-unlock lang ang <ph name="DEVICE_TYPE" /> na ito kapag saklaw ng naaabot ng braso ang iyong telepono.</translation> +<translation id="247949520305900375">Ibahagi ang audio</translation> <translation id="2479780645312551899">Patakbuhin ang lahat ng plugin sa oras na ito</translation> <translation id="2480626392695177423">I-toggle ang full/half width punctuation mode</translation> <translation id="2481332092278989943">Idagdag sa shelf</translation> @@ -1312,6 +1320,7 @@ <translation id="2889064240420137087">Buksan ang link gamit ang...</translation> <translation id="2889925978073739256">Patuloy na i-block ang mga hindi naka-sandbox na plugin</translation> <translation id="2890624088306605051">Bawiin lamang ang mga naka-sync na setting at data</translation> +<translation id="2890678560483811744">Lampas sa hangganan ang tinukoy na page</translation> <translation id="2893168226686371498">Default na browser</translation> <translation id="289426338439836048">Ibang mobile network...</translation> <translation id="2894745200702272315">Nag-e-enable ng pang-eksperimentong bersyon ng mga feature sa pagtukoy ng hotword na 'Ok Google' na umaasa sa hardware.</translation> @@ -1340,7 +1349,6 @@ <translation id="2925966894897775835">Sheets</translation> <translation id="2927017729816812676">Storage ng Cache</translation> <translation id="2927657246008729253">Baguhin...</translation> -<translation id="2928415919076124714">Itago ang Toolbar sa Full Screen</translation> <translation id="2928526264833629376">Magpatuloy sa Hangouts</translation> <translation id="2930644991850369934">Nagkaproblema habang dina-download ang larawan ng pagbawi. Nawala ang koneksyon sa network.</translation> <translation id="293111069139560936">Nagbibigay-daan sa shelf na mag-minimize ng window kung iki-click ang isang item sa shelf kung saan mayroon nang nauugnay na iisa at aktibo nang window.</translation> @@ -1464,6 +1472,7 @@ <translation id="3117812041123364382">I-enable/I-disable ang lumulutang na virtual na keyboard.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> Help</translation> <translation id="3120430004221004537">Hindi sapat ang pag-encrypt para sa isang partikular na operation sa: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">I-enable ang mga icon sa mga action button para sa Mga Notification sa Web.</translation> <translation id="3121793941267913344">I-reset ang <ph name="IDS_SHORT_PRODUCT_NAME" /> device na ito</translation> <translation id="3122162841865761901">Mga eksperimento sa Mga Tool ng Developer</translation> <translation id="3122464029669770682">CPU</translation> @@ -1584,7 +1593,6 @@ <translation id="3289566588497100676">Madaling pag-input ng simbolo</translation> <translation id="3289856944988573801">Upang tumingin ng mga update, mangyaring gumamit ng Ethernet o Wi-Fi.</translation> <translation id="3293325348208285494">Mabilis na simula</translation> -<translation id="3293894718455402932">Ang "<ph name="EXTENSION" />" ay makakapagbasa at makakapagsulat ng mga file ng larawan, video at tunog sa mga may check na folder.</translation> <translation id="3294437725009624529">Bisita</translation> <translation id="329650768420594634">Babala sa Extension ng Pack</translation> <translation id="3296763833017966289">Georgian</translation> @@ -1642,6 +1650,7 @@ <translation id="3338239663705455570">Slovenian na keyboard</translation> <translation id="3340978935015468852">mga setting</translation> <translation id="3341703758641437857">Payagan ang access na mag-file ng mga URL</translation> +<translation id="3343813173145836998">Mag-sign in nang madali sa device na ito</translation> <translation id="3344786168130157628">Pangalan ng access point:</translation> <translation id="3345135638360864351">Hindi maipadala kay <ph name="NAME" /> ang iyong kahilingang i-access ang site na ito. Pakisubukang muli.</translation> <translation id="3345886924813989455">Walang natagpuang suportadong browser</translation> @@ -2122,6 +2131,7 @@ <translation id="3996912167543967198">Inire-reset...</translation> <translation id="3997015411467176489">Mga pang-eksperimentong feature ng canvas</translation> <translation id="40027638859996362">Ilipat ang salita</translation> +<translation id="400554499662786523">Upang ibahagi ang audio, pumili ng tab.</translation> <translation id="4012550234655138030">I-set up o pamahalaan ang mga printer sa <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Ayusin ang "<ph name="EXTENSION_NAME" />"?</translation> <translation id="4018133169783460046">Ipakita ang <ph name="PRODUCT_NAME" /> sa wikang ito</translation> @@ -2224,6 +2234,7 @@ <translation id="4180788401304023883">Tanggalin ang CA certificate na "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">Russian Phonetic (YaZHert) keyboard</translation> <translation id="4181841719683918333">Mga Wika</translation> +<translation id="4187248015940562149">Ine-enable ang Web Bluetooth na maaaring magbigay-daan sa mga website na kumonekta sa at kontrolin ang mga Bluetooth device na nasa paligid mo.</translation> <translation id="4188026131102273494">Keyword:</translation> <translation id="4189406272289638749">Kinokontrol ng isang extension na <b><ph name="EXTENSION_NAME" /></b> ang setting na ito.</translation> <translation id="4193154014135846272">Dokumento ng Google</translation> @@ -2280,6 +2291,7 @@ <translation id="4268025649754414643">Pag-encipher ng Key</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Bersyon <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Walang mga pagtutugma</translation> <translation id="4274187853770964845">Error sa Pag-sync: Mangyaring ihinto at i-restart ang Pag-sync.</translation> <translation id="4275830172053184480">I-restart ang iyong device</translation> <translation id="4276796043975446927">Welcome sa Chromebox for meetings</translation> @@ -2349,6 +2361,7 @@ <translation id="4378551569595875038">Kumokonekta...</translation> <translation id="438122767399415311">Sapilitang kontrolin ang direksyon ng UI</translation> <translation id="4381849418013903196">Tutuldok</translation> +<translation id="4383192539467954373">Awtomatikong mag-sign in sa lahat ng device</translation> <translation id="4384652540891215547">I-activate ang extension</translation> <translation id="438503109373656455">Petra</translation> <translation id="4387554346626014084">I-enable ang pag-sync ng App Launcher. Ine-enable din nito ang Mga Folder kung saan available (hindi OSX).</translation> @@ -2366,6 +2379,7 @@ <translation id="4421932782753506458">Mingming</translation> <translation id="4422347585044846479">I-edit ang bookmark para sa pahinang ito</translation> <translation id="4422428420715047158">Domain:</translation> +<translation id="4423482519432579560">&Spellcheck</translation> <translation id="442477792133831654">Makipag-ugnayan sa mga kalapit na device</translation> <translation id="4425149324548788773">Aking Drive</translation> <translation id="4428582326923056538">Magkakaiba ang mga exception ng camera sa Adobe Flash Player.</translation> @@ -2380,6 +2394,7 @@ <translation id="444267095790823769">Mga pagbubukod sa pinoprotektahang nilalaman</translation> <translation id="4443536555189480885">&Tulong</translation> <translation id="4444304522807523469">I-access ang mga scanner ng dokumento na naka-attach sa pamamagitan ng USB o sa lokal na network</translation> +<translation id="4445559854264555037">Hindi mo ba nakikita ang iyong device? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Naka-mirror</translation> <translation id="4447465454292850432">Baterya:</translation> <translation id="4449935293120761385">Tungkol sa AutoFill</translation> @@ -2638,6 +2653,7 @@ <translation id="485316830061041779">German</translation> <translation id="4856478137399998590">Na-activate na ang iyong serbisyo ng data ng mobile at handa nang magamit</translation> <translation id="4858913220355269194">Azkals</translation> +<translation id="4860565041166337978">Payagan ang system download manager na pangasiwaan ang mga download kapag naaangkop.</translation> <translation id="48607902311828362">Airplane mode</translation> <translation id="4861833787540810454">I-&play</translation> <translation id="4862050643946421924">Nagdaragdag ng device...</translation> @@ -2721,7 +2737,6 @@ <translation id="4977942889532008999">Kumpirmahin ang Pag-access</translation> <translation id="4982718461356080574">Pagtatago ng mga button para sa pagsara kapag naka-stack ang mga hindi aktibong tab</translation> <translation id="498294082491145744">Baguhin ang iyong mga setting na nagkokontrol sa access ng mga website sa mga feature gaya ng cookies, JavaScript, mga plugin, geolocation, mikropono, camera atbp.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Mga Page</translation> <translation id="4988792151665380515">Nabigong i-export ang pampublikong key.</translation> <translation id="49896407730300355">I-rotate p&akaliwa</translation> @@ -2910,7 +2925,6 @@ <translation id="5268606875983318825">PPAPI (wala sa proseso)</translation> <translation id="526926484727016706">Nagsasanhi ng hindi pagbibigay ng lahat ng pahintulot sa lahat ng iframe bilang default. Ang pagpayag sa ilang partikular na pahintulot para sa isang iframe ay maaaring magsangkot ng paglilista sa mga pangalan ng mga pahintulot na ito bilang mga value ng mga bagong attribute ng iframe.</translation> <translation id="5269977353971873915">Nabigo ang Pag-print</translation> -<translation id="5270884342523754894">Ang "<ph name="EXTENSION" />" ay makakapagbasa ng mga file ng larawan, video at tunog sa mga may check na folder.</translation> <translation id="5271247532544265821">I-toggle ang Simplified/Traditional Chinese mode</translation> <translation id="5271549068863921519">I-save ang password</translation> <translation id="5273628206174272911">Pang-eksperimentong pag-navigate sa kasaysayan bilang tugon sa horizontal na overscroll.</translation> @@ -2947,6 +2961,7 @@ <translation id="5316716239522500219">I-mirror ang mga monitor</translation> <translation id="5317780077021120954">I-save</translation> <translation id="5319782540886810524">Latvian na keyboard</translation> +<translation id="532247166573571973">Maaaring hindi makakonekta sa server. Subukang muli sa ibang pagkakataon.</translation> <translation id="5323213332664049067">Latin American</translation> <translation id="532360961509278431">Hindi mabuksan ang "$1": $2</translation> <translation id="5324674707192845912">Ia-unenroll mo na ang <ph name="DEVICE_TYPE" /> na ito sa Google upang ma-disable ang kakayahang mahanap, ma-wipe at ma-lock ang device nang malayuan. Mangangailangan ito ng pag-reboot. Gusto mo bang magpatuloy?</translation> @@ -2999,11 +3014,11 @@ <translation id="5390284375844109566">Naka-index na database</translation> <translation id="5392544185395226057">Paganahin ang suporta para sa Native Client.</translation> <translation id="5393125431335030955">Gumagana lang ang plugin na ito sa desktop.</translation> -<translation id="5393559999218790205">I-disable ang mga timeline sa animation ng compositor ng UI</translation> <translation id="5396126354477659676">Gustong i-access ng <ph name="PEPPER_PLUGIN_NAME" /> sa <ph name="PEPPER_PLUGIN_DOMAIN" /> ang iyong computer.</translation> <translation id="539755880180803351">Ina-annotate ang mga web form na may mga hula sa uri ng field ng Autofill bilang teksto na placeholder.</translation> <translation id="5397578532367286026">Ang paggamit at kasaysayan ng user na ito ay maaaring suriin ng manager (<ph name="MANAGER_EMAIL" />) sa chrome.com.</translation> <translation id="5397794290049113714">Ikaw</translation> +<translation id="5398572795982417028">Lampas sa hangganan ang tinukoy na page, ang limitasyon ay <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> mula sa iba pang mga site</translation> <translation id="5399158067281117682">Hindi nagtutugma ang mga PIN!</translation> <translation id="5400640815024374115">Hindi pinagana o wala ang Trusted Platform Module (TPM) chip.</translation> @@ -3023,7 +3038,7 @@ <translation id="5423849171846380976">Na-activate</translation> <translation id="5425470845862293575">Ine-enable ang paggamit ng pang-eksperimentong sistema sa pag-render ng font ng DirectWrite.</translation> <translation id="5425722269016440406">Online ka dapat upang i-off ang Smart Lock dahil naka-sync ang setting na ito sa iyong telepono at iba pang mga device. Mangyaring kumonekta muna sa isang network.</translation> -<translation id="5426623592374109001">Gumamit ng luma at mapanghimasok na animation subsystem para sa mga composited na animation sa UI.</translation> +<translation id="5425863515030416387">Mag-sign in nang madali sa lahat ng device</translation> <translation id="5427459444770871191">I-rotate &Pakanan</translation> <translation id="5428105026674456456">Espanyol</translation> <translation id="542872847390508405">Nagba-browse ka bilang isang Bisita</translation> @@ -3048,6 +3063,7 @@ <translation id="5451646087589576080">Tingnan ang &Impormasyon ng Frame</translation> <translation id="5453029940327926427">Isara ang mga tab</translation> <translation id="5453632173748266363">Cyrillic</translation> +<translation id="5454166040603940656">sa <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Di-wasto</translation> <translation id="5457459357461771897">Basahin at i-delete ang mga larawan, musika at iba pang media sa iyong computer</translation> <translation id="5457599981699367932">Mag-browse bilang Bisita</translation> @@ -3217,7 +3233,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">Pinch scale</translation> <translation id="5710406368443808765">Oops! Hindi naimbak ng system ang device token at ID.</translation> -<translation id="571161420693302741">Hindi tumutugon ang <ph name="HOST_NAME" />. Hindi makapag-cast.</translation> <translation id="5711983031544731014">Hindi mai-unlock. Ilagay ang iyong password.</translation> <translation id="5712966208980506909">Kung naka-enable, ilo-load ng chrome://md-policy URL ang page ng patakaran ng Material Design.</translation> <translation id="5715711091495208045">Broker ng plugin: <ph name="PLUGIN_NAME" /></translation> @@ -3486,7 +3501,6 @@ <translation id="6111974609785983504">Pinapayagan bilang default</translation> <translation id="6113134669445407638">I-disable ang Delay Agnostic AEC sa WebRTC. Gamitin kung ang mga naiulat na pagkaantala sa system ay lubos na pinagkakatiwalaan, o kung nakakarinig ang ibang tao ng echo mula sa iyong makina.</translation> <translation id="6116921718742659598">Baguhin ang mga setting ng wika at input</translation> -<translation id="6117536376248197233">I-disable ang mga timeline sa animation ng compositor sa mga tagapag-render.</translation> <translation id="6120205520491252677">I-pin ang pahinang ito screen ng Simula...</translation> <translation id="6122081475643980456">Kinokontrol ang iyong koneksyon sa Internet</translation> <translation id="6122093587541546701">Email (opsyonal):</translation> @@ -3518,6 +3532,7 @@ <translation id="6163522313638838258">Palawakin lahat...</translation> <translation id="6164005077879661055">Permanenteng matatanggal ang lahat ng file at lokal na data na kaugnay ng pinangangasiwaang user sa oras na alisin ang pinangangasiwaang user na ito. Maaari pa ring makita ng manager ang mga nabisitang website at setting para sa pinangangasiwaang user na ito sa <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Matuto nang higit pa</translation> +<translation id="6167008112175207002">Isi-sync sa iyong Google Account ang iyong mga bookmark, history, mga password at iba pang mga setting upang magamit mo ang mga ito sa lahat ng iyong device. Mababago mo ito sa <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Mga simulated na feature ng hardware para sa 'Ok Google'</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">Pumili ng certificate</translation> @@ -3721,6 +3736,7 @@ <translation id="648927581764831596">Walang available</translation> <translation id="6490936204492416398">Mag-install ng bago mula sa webstore</translation> <translation id="6492313032770352219">Laki sa disk:</translation> +<translation id="6498249116389603658">&Lahat ng iyong wika</translation> <translation id="6499143127267478107">Nireresolba ang host sa proxy script...</translation> <translation id="6503077044568424649">Pinaka-nabisita</translation> <translation id="6503256918647795660">Swiss (French) na keyboard</translation> @@ -3762,7 +3778,6 @@ <translation id="6555432686520421228">Alisin ang lahat ng account ng user at i-reset ang iyong <ph name="IDS_SHORT_PRODUCT_NAME" /> na device upang maging parang bago.</translation> <translation id="6556866813142980365">Redo</translation> <translation id="6557565812667414268">Pinagana lang para sa mga high-DPI na display</translation> -<translation id="655845594391856372">Hindi tumutugon ang tab. Hindi makapag-cast.</translation> <translation id="6559580823502247193">(nasa device na ito na)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Ini-extract ang larawan ng pagbawi...</translation> @@ -3863,6 +3878,7 @@ <translation id="6723354935081862304">Mag-print sa Google Docs at iba pang mga patutunguhan sa cloud. <ph name="BEGIN_LINK" />Mag-sign in<ph name="END_LINK" /> upang mag-print sa Google Cloud Print.</translation> <translation id="6723661294526996303">Mag-import ng mga bookmark at setting...</translation> <translation id="6723839937902243910">Power</translation> +<translation id="6725240607822645708">Patakbuhin ang IME sa sarili nitong thread.</translation> <translation id="6725970970008349185">Bilang ng mga kandidatong ipapakita sa bawat pahina</translation> <translation id="672609503628871915">Tingnan kung ano'ng bago</translation> <translation id="6727005317916125192">Nakaraang pane</translation> @@ -3994,12 +4010,11 @@ <translation id="6948736568813450284">Para sa mga developer: gamitin ang serbisyo ng sandbox para sa mga pag-call ng Google Payments API.</translation> <translation id="6949306908218145636">I-bookmark ang Mga Nakabukas na Pahina...</translation> <translation id="695164542422037736">Kung naka-enable ang pagpipiliang ito, at kung naka-istilo ang nilalaman gamit ang background-attachment:fixed, magkakaroon ang background ng sariling na-composite na layer.</translation> -<translation id="6952626679169241027">Tinatandaan ng <ph name="PASSWORD_MANAGER_BRAND" /> ang iyong mga password at awtomatiko kang sina-sign in sa mga site sa device na ito.</translation> <translation id="6955446738988643816">Siyasatin ang Popup</translation> <translation id="695755122858488207">Di-piniling radio button</translation> +<translation id="6960277925159781810">Awtomatikong mag-sign in sa device na ito</translation> <translation id="696036063053180184">3 Set (Walang shift)</translation> <translation id="696203921837389374">I-enable ang pagsi-sync gamit ang mobile data</translation> -<translation id="6964308487066031935">Magdagdag ng mga folder sa "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Device</translation> @@ -4100,7 +4115,6 @@ <translation id="7076293881109082629">Nagsa-sign in</translation> <translation id="7077829361966535409">Nabigong ma-load ang pahina sa pag-sign in gamit ang mga kasalukuyang setting ng proxy. Mangyaring <ph name="GAIA_RELOAD_LINK_START" />subukang mag-sign in muli<ph name="GAIA_RELOAD_LINK_END" />, o gumamit ng ibang <ph name="PROXY_SETTINGS_LINK_START" />mga setting ng proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Mga hindi pinansing handler ng protocol</translation> -<translation id="7079038783243627996">Ang "<ph name="EXTENSION" />" ay makakapagbasa at makakapagtanggal ng mga file ng larawan, video at tunog sa mga may check na folder.</translation> <translation id="708060913198414444">K&opyahin ang address ng audio</translation> <translation id="708187310695946552">Bubble UI para sa pag-restore ng session</translation> <translation id="7082055294850503883">Balewalain ang katayuang CapsLock at mag-input ng lowercase bilang default</translation> @@ -4244,6 +4258,8 @@ <translation id="7313804056609272439">Paraan ng pag-input na Vietnamese (VNI)</translation> <translation id="7314244761674113881">SOCKS host</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (kasalukuyan)</translation> +<translation id="7321545336522791733">Hindi makakonekta sa server</translation> +<translation id="7324841169865301118">Nagbibigay-daan sa user na pumili ng tab para sa pagbabahagi sa desktop.</translation> <translation id="7325437708553334317">Extension ng Mataas na Contrast</translation> <translation id="7326565110843845436">Pag-click sa touchpad gamit ang tatlong daliri</translation> <translation id="73289266812733869">Hindi pinili</translation> @@ -4470,7 +4486,6 @@ <translation id="7650511557061837441">Gustong alisin ng "<ph name="TRIGGERING_EXTENSION_NAME" />" ang "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772">Ipinapakita ang <ph name="PRODUCT_NAME" /> sa wikang ito</translation> <translation id="7654941827281939388">Ginagamit na ang account na ito sa computer na ito.</translation> -<translation id="7655165758820095116">Ang MediaSource object ay nagbibigay-daan sa JavaScript na direktang magpadala ng data ng media sa isang elemento ng video.</translation> <translation id="7658239707568436148">Ikansela</translation> <translation id="7659584679870740384">Wala kang pahintulot na gamitin ang device na ito. Mangyaring makipag-ugnayan sa administrator upang makakuha ng pahintulot sa pag-sign in.</translation> <translation id="7664620655576155379">Hindi sinusuportahang Bluetooth device: "<ph name="DEVICE_NAME" />".</translation> @@ -4601,6 +4616,7 @@ <translation id="7861215335140947162">&Mga download</translation> <translation id="7864539943188674973">Huwag Paganahin ang Bluetooth</translation> <translation id="7868891395842935202">Ine-enable ang Pang-eksperimentong Framework para sa pagkontrol sa access sa mga eksperimento sa API.</translation> +<translation id="7870576007982733437">Gamitin ang system download manager kapag naaangkop.</translation> <translation id="7870790288828963061">Walang nahanap na mga Kiosk app na may mas bagong bersyon. Walang ia-update. Mangyaring alisin ang USB stick.</translation> <translation id="787150342916295244">Pagsa-scan ng credit card</translation> <translation id="7874357055309047713">Patakbuhin sa lahat ng site sa lahat ng pagkakataon</translation> @@ -4643,7 +4659,6 @@ <translation id="7918257978052780342">Magpatala</translation> <translation id="7920092496846849526">Tinanong mo ang iyong magulang kung maaari mong bisitahin ang page na ito.</translation> <translation id="7925285046818567682">Naghihintay para sa <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824">Tinatandaan ng <ph name="PASSWORD_MANAGER_BRAND" /> ang iyong mga password at awtomatiko kang sina-sign in sa mga app at site sa lahat ng device.</translation> <translation id="7925686952655276919">Huwag gumamit ng data sa mobile para sa pag-sync</translation> <translation id="7926906273904422255">Markahan ang mga hindi secure na pinagmulan bilang hindi secure o bilang "kahina-hinala."</translation> <translation id="7928710562641958568">I-eject ang device</translation> @@ -4705,7 +4720,6 @@ Ilagay ang iyong key file sa ligtas na lugar. Kailangan mo ito upang lumikha ng mga bagong bersyon ng iyong extension.</translation> <translation id="799923393800005025">Makakatingin</translation> <translation id="7999338963698132743">Bagong task manager</translation> -<translation id="8000004253404706714">Gumamit ng luma at mapanghimasok na animation subsystem para sa mga composited na animation sa mga tagapag-render.</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8007030362289124303">Mahina na ang Baterya</translation> <translation id="8008356846765065031">Nadiskonekta ang Internet. Pakisuri ang iyong koneksyon sa internet.</translation> @@ -4835,6 +4849,7 @@ <translation id="8185331656081929126">Magpakita ng mga notification kapag may nakitang mga bagong printer sa network</translation> <translation id="8186609076106987817">Hindi makita ng server ang file.</translation> <translation id="8186706823560132848">Software</translation> +<translation id="8188120771410500975">&Tingnan ang spelling ng mga field ng text</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" />, at <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> (na) iba pa</translation> <translation id="8190193592390505034">Kumukonekta sa <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Pamahalaan ang iyong apps, mga extension, at tema</translation> @@ -5230,6 +5245,7 @@ <translation id="8765985713192161328">Pamahalaan ang mga handler...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Mga User</translation> +<translation id="8768367823103160496">Lock para sa cursor ng mouse</translation> <translation id="8769662576926275897">Mga detalye ng card</translation> <translation id="8770196827482281187">Paraan ng pag-input na Persian (ISIRI 2901 na layout)</translation> <translation id="8774934320277480003">Tuktok na margin</translation> @@ -5249,6 +5265,7 @@ <translation id="8795668016723474529">Magdagdag ng credit card</translation> <translation id="8795916974678578410">New Window</translation> <translation id="8798099450830957504">Default</translation> +<translation id="8799127529310003270">Kung naka-enable, tumatakbo ang mga InputConnection call sa thread ng IME, at sa halip na magpanatili ng replica ng editor, direktang makikipag-usap ang bawat InputConnection call sa tagapag-render.</translation> <translation id="8799839487311913894">I-enable ang pag-a-update ng password sa password manager pagkatapos ng pagsusumite ng isang form sa "pagpapalit ng password."</translation> <translation id="8800004011501252845">Nagpapakita ng mga patutunguhan para sa</translation> <translation id="8800420788467349919">Volume: <ph name="PRECENTAGE" />%</translation> @@ -5274,6 +5291,7 @@ <translation id="8841142799574815336">Maglagay ng visual na viewport.</translation> <translation id="884264119367021077">Shipping address</translation> <translation id="8844238624737526720">Gamitin ang bago at naka-optimize na pagpapatupad ng chrome task manager.</translation> +<translation id="8845001906332463065">Humingi ng tulong</translation> <translation id="8846141544112579928">Naghahanap ng keyboard...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Switch ng mode ng pindutang shift</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index a261d50..b8e13ec3 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Ajouter cette page aux favoris</translation> <translation id="1047956942837015229">Suppression de <ph name="COUNT" /> éléments en cours…</translation> <translation id="1048597748939794622">Activation forcée pour toutes les couches</translation> +<translation id="1049795001945932310">&Paramètres linguistiques</translation> <translation id="1049926623896334335">Document Word</translation> <translation id="1054153489933238809">Ouvrir l'&image originale dans un nouvel onglet</translation> <translation id="1055806300943943258">Recherche des périphériques Bluetooth et USB en cours…</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Translittération (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Serveurs de noms automatiques</translation> <translation id="1215411991991485844">Nouvelle application en arrière-plan ajoutée</translation> +<translation id="1216954813581739968">Activer l'onglet lors du partage du Bureau.</translation> <translation id="121827551500866099">Afficher tous les téléchargements...</translation> <translation id="122082903575839559">Algorithme de signature du certificat</translation> <translation id="1221024147024329929">PKCS #1 MD2 avec chiffrement RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Échec de la connexion automatique.</translation> <translation id="1293556467332435079">Fichiers</translation> <translation id="1294298200424241932">Modifier les paramètres de confiance :</translation> +<translation id="1295794900245526845">Sélectionner votre compte enregistré avec <ph name="PASSWORD_MANAGER_BRAND" /> pour vous connecter</translation> <translation id="1297175357211070620">Destination</translation> <translation id="1297922636971898492">Google Drive n'est pas disponible pour le moment. L'importation reprendra lorsque Google Drive sera à nouveau disponible.</translation> <translation id="1300861494336759522">Redirection des recherches sur le bureau Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Cette fonctionnalité réinitialise la page de démarrage, la page Nouvel onglet, le moteur de recherche et les onglets épinglés. Elle désactive en outre toutes les extensions, et efface les données temporaires telles que les cookies. Vos favoris, votre historique et vos mots de passe enregistrés ne sont pas supprimés.</translation> <translation id="1434886155212424586">La page Nouvel onglet est la page d'accueil.</translation> <translation id="1435550882135542937">Refonte de la barre d'outils des extensions</translation> +<translation id="1436402875660227532">Remarque : Ces paramètres ne sont plus utilisés sur ce système, mais vous pouvez toujours les afficher et les modifier.</translation> <translation id="1436784010935106834">Supprimé</translation> <translation id="1438632560381091872">Réactiver le son des onglets</translation> <translation id="1441841714100794440">Clavier vietnamien (Télex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Activer la compatibilité avec le clavier virtuel</translation> <translation id="1474079335130556426">Active le mode arrière-plan pour l'API Push. Chrome continue de s'exécuter après la fermeture de la dernière fenêtre et se lance au démarrage du système d'exploitation (en fonction des besoins de l'API Push).</translation> <translation id="1474339897586437869">Le fichier "<ph name="FILENAME" />" n'a pas été importé, car l'espace disponible sur Google Drive est insuffisant.</translation> +<translation id="1476607407192946488">&Paramètres linguistiques</translation> <translation id="1476949146811612304">Définir le moteur de recherche à utiliser pour les recherches effectuées depuis l'<ph name="BEGIN_LINK" />Omnibox<ph name="END_LINK" /> (barre d'adresse et de recherche)</translation> <translation id="1477301030751268706">Cache du jeton de l'API Identity</translation> <translation id="1478340334823509079">Détails : <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Cette page utilise une application cliente native qui ne fonctionne pas sur votre ordinateur.</translation> <translation id="1965328510789761112">Mémoire privée</translation> <translation id="1965624977906726414">Ne dispose d'aucune autorisation spéciale.</translation> +<translation id="1968720524450620475">Activer les icônes d'action pour les notifications Web.</translation> <translation id="1970746430676306437">Afficher les &infos sur la page</translation> <translation id="197288927597451399">Enregistrer</translation> <translation id="1973491249112991739">Échec du téléchargement de <ph name="PLUGIN_NAME" />.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">Utiliser les touches - et = pour paginer une liste d'entrées</translation> <translation id="2347476388323331511">Impossible de synchroniser</translation> <translation id="2347991999864119449">Me laisser choisir quand exécuter le contenu du plug-in</translation> +<translation id="2348165084656290171">Pour partager un contenu audio, sélectionnez un onglet ou tout l'écran.</translation> <translation id="2350182423316644347">Initialisation de l'application en cours…</translation> <translation id="2350796302381711542">Autoriser <ph name="HANDLER_HOSTNAME" /> à ouvrir tous les liens <ph name="PROTOCOL" /> à la place de <ph name="REPLACED_HANDLER_TITLE" /> ?</translation> <translation id="2351266942280602854">Langue et mode de saisie</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">Clavier canadien multilingue</translation> <translation id="2478176599153288112">Autorisations de fichier média pour "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">Uniquement déverrouiller ce <ph name="DEVICE_TYPE" /> lorsque votre téléphone est à portée de main</translation> +<translation id="247949520305900375">Partager le contenu audio</translation> <translation id="2479780645312551899">Exécuter tous les plug-ins de cette page</translation> <translation id="2480626392695177423">Basculer en mode ponctuation pleine chasse ou demi-chasse</translation> <translation id="2481332092278989943">Ajouter à l'étagère</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">Ouvrir le lien avec...</translation> <translation id="2889925978073739256">Continuer à bloquer l'exécution hors bac à sable des plug-ins</translation> <translation id="2890624088306605051">Ne récupérer que les paramètres et les données synchronisés</translation> +<translation id="2890678560483811744">Plage de pages hors limite</translation> <translation id="2893168226686371498">Navigateur par défaut</translation> <translation id="289426338439836048">Autre réseau mobile...</translation> <translation id="2894745200702272315">Active une version expérimentale des fonctionnalités de détection de mot clé "Ok Google" qui présentent une dépendance matérielle.</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">Feuilles de calcul</translation> <translation id="2927017729816812676">Espace de stockage du cache</translation> <translation id="2927657246008729253">Changer...</translation> -<translation id="2928415919076124714">Masquer la barre d'outils en mode plein écran</translation> <translation id="2928526264833629376">Continuer vers Hangouts</translation> <translation id="2930644991850369934">Un problème est survenu lors du téléchargement de l'image de récupération. La connexion réseau a été perdue.</translation> <translation id="293111069139560936">Cette option autorise la réduction d'une fenêtre en cas de clic sur un élément de l'étagère auquel une seule fenêtre déjà active est associée.</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">Activer ou désactiver le clavier virtuel flottant</translation> <translation id="3118319026408854581">Aide <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Chiffrement insuffisant pour une opération donnée sur l'appareil <ph name="DEVICE_NAME" />.</translation> +<translation id="3121260210578524273">Activer les icônes dans les boutons d'action pour les notifications Web.</translation> <translation id="3121793941267913344">Réinitialiser cet appareil <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Tests au niveau des outils de développement</translation> <translation id="3122464029669770682">UC</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">Entrée de symboles simplifiée</translation> <translation id="3289856944988573801">Pour rechercher des mises à jour, veuillez utiliser une connexion Ethernet ou Wi-Fi.</translation> <translation id="3293325348208285494">Démarrage rapide</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" pourra accéder en lecture et en écriture aux fichiers images, vidéo et audio dans les dossiers sélectionnés.</translation> <translation id="3294437725009624529">Invité</translation> <translation id="329650768420594634">Avertissement relatif à l'empaquetage d'extensions</translation> <translation id="3296763833017966289">Géorgien</translation> @@ -1639,6 +1647,7 @@ <translation id="3338239663705455570">Clavier slovène</translation> <translation id="3340978935015468852">paramètres</translation> <translation id="3341703758641437857">Autoriser l'accès aux URL de fichier</translation> +<translation id="3343813173145836998">Se connecter facilement sur cet appareil</translation> <translation id="3344786168130157628">Nom du point d'accès :</translation> <translation id="3345135638360864351">Impossible d'envoyer votre demande d'accès au site à <ph name="NAME" />. Veuillez réessayer.</translation> <translation id="3345886924813989455">Impossible de trouver un navigateur pris en charge.</translation> @@ -2118,6 +2127,7 @@ <translation id="3996912167543967198">Réinitialisation en cours…</translation> <translation id="3997015411467176489">Fonctionnalités canvas expérimentales</translation> <translation id="40027638859996362">Déplacer un mot</translation> +<translation id="400554499662786523">Pour partager un contenu audio, sélectionnez un onglet.</translation> <translation id="4012550234655138030">Configurer ou gérer les imprimantes sur <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="4014432863917027322">Réparer "<ph name="EXTENSION_NAME" />" ?</translation> <translation id="4018133169783460046">Afficher <ph name="PRODUCT_NAME" /> dans cette langue</translation> @@ -2220,6 +2230,7 @@ <translation id="4180788401304023883">Supprimer le certificat "<ph name="CERTIFICATE_NAME" />" émis par l'autorité de certification ?</translation> <translation id="418179967336296930">Clavier russe phonétique (YaZHert)</translation> <translation id="4181841719683918333">Langues</translation> +<translation id="4187248015940562149">Active Web Bluetooth, qui permet aux sites Web de se connecter aux appareils Bluetooth à proximité et de les contrôler.</translation> <translation id="4188026131102273494">Mot clé :</translation> <translation id="4189406272289638749">L'extension <b><ph name="EXTENSION_NAME" /></b> contrôle ce paramètre.</translation> <translation id="4193154014135846272">Document Google</translation> @@ -2276,6 +2287,7 @@ <translation id="4268025649754414643">Chiffrement de la clé</translation> <translation id="4268574628540273656">URL :</translation> <translation id="4270393598798225102">Version <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Aucune correspondance</translation> <translation id="4274187853770964845">Erreur de synchronisation. Veuillez interrompre la synchronisation, puis la relancer.</translation> <translation id="4275830172053184480">Redémarrer l'appareil</translation> <translation id="4276796043975446927">Bienvenue dans Chromebox pour la visioconférence</translation> @@ -2345,6 +2357,7 @@ <translation id="4378551569595875038">Connexion</translation> <translation id="438122767399415311">Forcer la direction de l'interface utilisateur</translation> <translation id="4381849418013903196">Deux-points</translation> +<translation id="4383192539467954373">Se connecter automatiquement sur tous les appareils</translation> <translation id="4384652540891215547">Activer l'extension</translation> <translation id="438503109373656455">Longchamp</translation> <translation id="4387554346626014084">Activer la synchronisation du lanceur d'applications. Cette action active également la synchronisation des dossiers, lorsqu'ils sont disponibles (pas sur OS X).</translation> @@ -2362,6 +2375,7 @@ <translation id="4421932782753506458">Félix</translation> <translation id="4422347585044846479">Modifier le favori de cette page</translation> <translation id="4422428420715047158">Domaine :</translation> +<translation id="4423482519432579560">&Vérification orthographique</translation> <translation id="442477792133831654">Communiquer avec les appareils à proximité</translation> <translation id="4425149324548788773">Mon Drive</translation> <translation id="4428582326923056538">Les exceptions Adobe Flash Player utilisées pour l'appareil photo sont différentes.</translation> @@ -2376,6 +2390,7 @@ <translation id="444267095790823769">Exceptions relatives au contenu protégé</translation> <translation id="4443536555189480885">&Aide</translation> <translation id="4444304522807523469">Accéder aux scanners de documents connectés via USB ou sur le réseau local</translation> +<translation id="4445559854264555037">Votre appareil n'est pas affiché ? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Écran dupliqué</translation> <translation id="4447465454292850432">Batterie :</translation> <translation id="4449935293120761385">À propos de la saisie automatique</translation> @@ -2633,6 +2648,7 @@ <translation id="485316830061041779">Allemand</translation> <translation id="4856478137399998590">Votre service Internet mobile est activé et prêt à l'emploi.</translation> <translation id="4858913220355269194">Foot</translation> +<translation id="4860565041166337978">Autoriser le traitement des téléchargements par le gestionnaire des téléchargements du système le cas échéant</translation> <translation id="48607902311828362">Mode Avion</translation> <translation id="4861833787540810454">&Lire</translation> <translation id="4862050643946421924">Ajout d'un appareil</translation> @@ -2716,7 +2732,6 @@ <translation id="4977942889532008999">Confirmer l'accès</translation> <translation id="4982718461356080574">Masquage du bouton de fermeture des onglets inactifs en mode empilé</translation> <translation id="498294082491145744">Modifier les paramètres qui contrôlent l'accès des sites Web à des fonctionnalités telles que les cookies, le code JavaScript, les plug-ins, la géolocalisation, le micro, la caméra, etc.</translation> -<translation id="4984329823325527157">API Media Source</translation> <translation id="4988526792673242964">Pages</translation> <translation id="4988792151665380515">Échec d'exportation de la clé publique</translation> <translation id="49896407730300355">Rotation d&ans le sens contraire des aiguilles d'une montre</translation> @@ -2905,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (hors processus)</translation> <translation id="526926484727016706">Entraîne le refus par défaut de toutes les autorisations aux cadres iFrame. Pour accorder certaines autorisations à un cadre iFrame, vous devrez peut-être indiquer leurs noms en tant que valeurs de nouveaux attributs iFrame.</translation> <translation id="5269977353971873915">Échec de l'impression</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" pourra accéder en lecture aux fichiers images, vidéo et audio dans les dossiers sélectionnés.</translation> <translation id="5271247532544265821">Basculer en mode chinois simplifié/traditionnel</translation> <translation id="5271549068863921519">Enregistrer le mot de passe</translation> <translation id="5273628206174272911">Fonctionnalité expérimentale de défilement tactile horizontal dans l'historique</translation> @@ -2942,6 +2956,7 @@ <translation id="5316716239522500219">Mettre en miroir les moniteurs</translation> <translation id="5317780077021120954">Enregistrer</translation> <translation id="5319782540886810524">Clavier letton</translation> +<translation id="532247166573571973">Le serveur peut être inaccessible. Veuillez réessayer plus tard.</translation> <translation id="5323213332664049067">Espagnol d'Amérique latine</translation> <translation id="532360961509278431">Impossible d'ouvrir "$1" : $2</translation> <translation id="5324674707192845912">Vous allez annuler l'enregistrement de ce <ph name="DEVICE_TYPE" /> auprès de Google afin de désactiver la possibilité de localiser l'appareil, de le verrouiller et d'effacer les données qu'il contient à distance. Cette opération requiert un redémarrage. Souhaitez-vous continuer ?</translation> @@ -2994,11 +3009,11 @@ <translation id="5390284375844109566">Base de données indexée</translation> <translation id="5392544185395226057">Assure la compatibilité avec Native Client.</translation> <translation id="5393125431335030955">Ce plug-in ne fonctionne que sur le bureau.</translation> -<translation id="5393559999218790205">Désactiver les timelines des animations du compositeur dans l'interface utilisateur</translation> <translation id="5396126354477659676">Le plug-in <ph name="PEPPER_PLUGIN_NAME" /> provenant du domaine <ph name="PEPPER_PLUGIN_DOMAIN" /> demande l'accès à votre ordinateur.</translation> <translation id="539755880180803351">Annote les formulaires Web avec des prédictions de saisie automatique sous forme de texte d'espace réservé dans les champs.</translation> <translation id="5397578532367286026">Le gestionnaire (<ph name="MANAGER_EMAIL" />) peut consulter les actions effectuées cet utilisateur, ainsi que son historique, sur chrome.com.</translation> <translation id="5397794290049113714">Vous</translation> +<translation id="5398572795982417028">Plage de pages hors limites. Le nombre maximal de pages est <ph name="MAXIMUM_PAGE" />.</translation> <translation id="5398824043967640339"><ph name="COUNT" /> d'autres sites</translation> <translation id="5399158067281117682">Les codes PIN sont différents !</translation> <translation id="5400640815024374115">La puce du module de plate-forme sécurisée (TPM) est désactivée ou inexistante.</translation> @@ -3018,7 +3033,7 @@ <translation id="5423849171846380976">Activé</translation> <translation id="5425470845862293575">Active l'utilisation du système expérimental DirectWrite de rendu des polices.</translation> <translation id="5425722269016440406">Vous devez être en ligne pour pouvoir désactiver Smart Lock, car ce paramètre est synchronisé avec votre téléphone et d'autres appareils. Pour commencer, veuillez vous connecter à un réseau.</translation> -<translation id="5426623592374109001">Utiliser un ancien sous-système d'animations intrusives pour les animations composées dans l'interface utilisateur.</translation> +<translation id="5425863515030416387">Se connecter facilement sur tous les appareils</translation> <translation id="5427459444770871191">Rotation &dans le sens des aiguilles d'une montre</translation> <translation id="5428105026674456456">Espagnol</translation> <translation id="542872847390508405">Vous naviguez en tant qu'invité</translation> @@ -3043,6 +3058,7 @@ <translation id="5451646087589576080">Afficher les &infos sur le cadre</translation> <translation id="5453029940327926427">Fermer les onglets</translation> <translation id="5453632173748266363">Cyrillique</translation> +<translation id="5454166040603940656">avec <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Non valide</translation> <translation id="5457459357461771897">Accéder aux photos, à la musique et aux autres fichiers multimédias stockés sur votre ordinateur et les supprimer</translation> <translation id="5457599981699367932">Naviguer en tant qu'invité</translation> @@ -3213,7 +3229,6 @@ <translation id="5708171344853220004">Nom Microsoft principal</translation> <translation id="5709885306771508267">Pincer pour redimensionner</translation> <translation id="5710406368443808765">Petit problème…Le jeton et l'ID de l'appareil n'ont pas pu être stockés par le système.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> ne répond pas. Impossible de diffuser.</translation> <translation id="5711983031544731014">Déverrouillage impossible. Veuillez saisir votre mot de passe.</translation> <translation id="5712966208980506909">Si l'option est activée, l'URL "chrome://md-policy" charge la page des règles Material Design.</translation> <translation id="5715711091495208045">Gestionnaire de plug-ins : "<ph name="PLUGIN_NAME" />"</translation> @@ -3482,7 +3497,6 @@ <translation id="6111974609785983504">Autorisée par défaut</translation> <translation id="6113134669445407638">Désactiver Delay Agnostic AEC dans WebRTC. Cette option peut être utilisée si les retards du système signalés sont très fiables ou si d'autres utilisateurs rencontrent un problème d'écho provenant de votre ordinateur.</translation> <translation id="6116921718742659598">Modifier les paramètres de langue et de saisie</translation> -<translation id="6117536376248197233">Désactiver les timelines des animations du compositeur dans les moteurs de rendu</translation> <translation id="6120205520491252677">Épingler cette page à l'écran de démarrage…</translation> <translation id="6122081475643980456">Une extension a pris le contrôle de votre connexion Internet</translation> <translation id="6122093587541546701">E-mail (facultatif) :</translation> @@ -3514,6 +3528,7 @@ <translation id="6163522313638838258">Tout développer...</translation> <translation id="6164005077879661055">Tous les fichiers et les données locales associés à l'utilisateur supervisé seront définitivement supprimés en même temps que cet utilisateur. Le gestionnaire peut toujours accéder aux sites Web consultés par l'utilisateur supervisé et aux paramètres de celui-ci à l'adresse <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">En savoir plus</translation> +<translation id="6167008112175207002">Vos favoris, votre historique, vos mots de passe et d'autres paramètres seront synchronisés avec votre compte Google afin que vous puissiez les utiliser sur tous vos appareils. Vous pouvez modifier ce paramètre dans <ph name="BEGIN_LINK" />.</translation> <translation id="6171550060231646388">Fonctionnalités "Ok Google" de matériel simulé</translation> <translation id="6175314957787328458">GUID de domaine Microsoft</translation> <translation id="6178664161104547336">Sélectionner un certificat</translation> @@ -3717,6 +3732,7 @@ <translation id="648927581764831596">Aucun média disponible</translation> <translation id="6490936204492416398">Installer de nouvelles extensions depuis le Chrome Web Store</translation> <translation id="6492313032770352219">Taille sur le disque :</translation> +<translation id="6498249116389603658">&Toutes vos langues</translation> <translation id="6499143127267478107">Résolution de l'hôte du script de proxy…</translation> <translation id="6503077044568424649">Les + visités</translation> <translation id="6503256918647795660">Clavier franco-suisse</translation> @@ -3758,7 +3774,6 @@ <translation id="6555432686520421228">Supprime tous les comptes utilisateur et réinitialise votre appareil <ph name="IDS_SHORT_PRODUCT_NAME" /> qui devient comme neuf.</translation> <translation id="6556866813142980365">Rétablir</translation> <translation id="6557565812667414268">Activé uniquement pour les écrans à résolution élevée (PPP)</translation> -<translation id="655845594391856372">L'onglet ne répond pas. Impossible de diffuser.</translation> <translation id="6559580823502247193">(déjà sur cet appareil)</translation> <translation id="6561726789132298588">entrée</translation> <translation id="6562437808764959486">Extraction de l'image de récupération...</translation> @@ -3859,6 +3874,7 @@ <translation id="6723354935081862304">Imprimer depuis Google Docs et d'autres emplacements de destination dans le cloud. <ph name="BEGIN_LINK" />Connectez-vous<ph name="END_LINK" /> pour imprimer depuis Google Cloud Print.</translation> <translation id="6723661294526996303">Importer les favoris et les paramètres...</translation> <translation id="6723839937902243910">Alimentation</translation> +<translation id="6725240607822645708">Exécuter l'éditeur de mode de saisie sur son propre fil de discussion</translation> <translation id="6725970970008349185">Nombre de suggestions par page</translation> <translation id="672609503628871915">Voir les nouveautés</translation> <translation id="6727005317916125192">Volet précédent</translation> @@ -3989,12 +4005,11 @@ <translation id="6948736568813450284">Pour les développeurs : utilisez le service de bac à sable pour les appels à l'API Google Payments.</translation> <translation id="6949306908218145636">Ajouter les pages ouvertes aux favoris…</translation> <translation id="695164542422037736">Si cette option est activée et que le corps est mis en forme avec le style "background-attachment:fixed", une couche composée spécifique à l'image de fond est appliquée.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> mémorise vos mots de passe et vous connecte automatiquement aux sites sur cet appareil.</translation> <translation id="6955446738988643816">Inspecter le pop-up</translation> <translation id="695755122858488207">Case d'option décochée</translation> +<translation id="6960277925159781810">Se connecter automatiquement sur cet appareil</translation> <translation id="696036063053180184">Sebeol-sik No-shift</translation> <translation id="696203921837389374">Activer la synchronisation via les données mobiles</translation> -<translation id="6964308487066031935">Ajouter les dossiers à "<ph name="EXTENSION" />" ?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Périphérique</translation> @@ -4092,7 +4107,6 @@ <translation id="7076293881109082629">Connexion</translation> <translation id="7077829361966535409">Échec du chargement de la page de connexion avec les paramètres de proxy actuels. Veuillez <ph name="GAIA_RELOAD_LINK_START" />essayer de vous reconnecter<ph name="GAIA_RELOAD_LINK_END" /> ou utiliser d'autres <ph name="PROXY_SETTINGS_LINK_START" />paramètres de proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Gestionnaires de protocole ignorés</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" pourra accéder en lecture aux fichiers images, vidéo et audio dans les dossiers sélectionnés et les supprimer.</translation> <translation id="708060913198414444">C&opier l'adresse audio</translation> <translation id="708187310695946552">Info-bulle de restauration de session</translation> <translation id="7082055294850503883">Ignorer le verrouillage des majuscules et saisir des minuscules par défaut</translation> @@ -4236,6 +4250,8 @@ <translation id="7313804056609272439">Mode de saisie du vietnamien (VNI)</translation> <translation id="7314244761674113881">Hôte SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (profil actuel)</translation> +<translation id="7321545336522791733">Serveur inaccessible</translation> +<translation id="7324841169865301118">Permet à l'utilisateur de sélectionner un onglet pour le partage du Bureau.</translation> <translation id="7325437708553334317">Extension Contraste élevé</translation> <translation id="7326565110843845436">Clic à trois doigts sur le pavé tactile</translation> <translation id="73289266812733869">Désélectionné</translation> @@ -4462,7 +4478,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" souhaite supprimer "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> est affiché dans cette langue.</translation> <translation id="7654941827281939388">Ce compte est déjà utilisé sur cet ordinateur.</translation> -<translation id="7655165758820095116">L'objet MediaSource permet d'envoyer directement des données multimédias à un élément vidéo via JavaScript.</translation> <translation id="7658239707568436148">Annuler</translation> <translation id="7659584679870740384">Vous n'êtes pas autorisé à utiliser cet appareil. Pour obtenir l'autorisation de vous y connecter, veuillez contacter l'administrateur.</translation> <translation id="7664620655576155379">Appareil Bluetooth non compatible : "<ph name="DEVICE_NAME" />"</translation> @@ -4593,6 +4608,7 @@ <translation id="7861215335140947162">&Téléchargements</translation> <translation id="7864539943188674973">Désactiver le Bluetooth</translation> <translation id="7868891395842935202">Active le cadre expérimental permettant de contrôler l'accès aux expériences de l'API.</translation> +<translation id="7870576007982733437">Utiliser le gestionnaire des téléchargements du système le cas échéant</translation> <translation id="7870790288828963061">Aucune nouvelle version d'une application kiosque n'a été trouvée. Aucune mise à jour n'est disponible. Veuillez débrancher la clé USB.</translation> <translation id="787150342916295244">Lecture de cartes de paiement</translation> <translation id="7874357055309047713">Toujours exécuter pour tous les sites</translation> @@ -4635,7 +4651,6 @@ <translation id="7918257978052780342">Enregistrer</translation> <translation id="7920092496846849526">Une demande d'autorisation a été envoyée à tes parents pour la consultation de cette page.</translation> <translation id="7925285046818567682">En attente de <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> mémorise vos mots de passe et vous connecte automatiquement aux applications et aux sites sur tous vos appareils.</translation> <translation id="7925686952655276919">Ne pas utiliser les données mobiles pour la synchronisation</translation> <translation id="7926906273904422255">Marquer les origines non sécurisées comme non sécurisées ou douteuses</translation> <translation id="7928710562641958568">Éjecter l'appareil</translation> @@ -4697,7 +4712,6 @@ Conservez votre fichier de clé en lieu sûr. Vous en aurez besoin lors de la création de nouvelles versions de l'extension.</translation> <translation id="799923393800005025">Lecteur</translation> <translation id="7999338963698132743">Nouveau gestionnaire de tâches</translation> -<translation id="8000004253404706714">Utiliser un ancien sous-système d'animations intrusives pour les animations composées dans les moteurs de rendu.</translation> <translation id="8004582292198964060">Navigateur</translation> <translation id="8007030362289124303">Batterie faible</translation> <translation id="8008356846765065031">Connexion Internet interrompue. Veuillez vérifier votre connexion.</translation> @@ -4827,6 +4841,7 @@ <translation id="8185331656081929126">Afficher des notifications lorsque de nouvelles imprimantes sont détectées sur le réseau</translation> <translation id="8186609076106987817">Impossible de trouver le fichier sur le serveur.</translation> <translation id="8186706823560132848">Logiciel</translation> +<translation id="8188120771410500975">&Vérifier l'orthographe des zones de texte</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> et <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> autres</translation> <translation id="8190193592390505034">Connexion à <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Gérer vos applications, vos extensions et vos thèmes</translation> @@ -5219,6 +5234,7 @@ <translation id="8765985713192161328">Gérer les gestionnaires...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Utilisateurs</translation> +<translation id="8768367823103160496">Verrouillage du curseur de la souris</translation> <translation id="8769662576926275897">Informations relatives à la carte</translation> <translation id="8770196827482281187">Mode de saisie du persan (clavier ISIRI 2901)</translation> <translation id="8774934320277480003">Marge supérieure</translation> @@ -5238,6 +5254,7 @@ <translation id="8795668016723474529">Ajouter une carte de paiement</translation> <translation id="8795916974678578410">Nouvelle fenêtre</translation> <translation id="8798099450830957504">Par défaut</translation> +<translation id="8799127529310003270">Si ce paramètre activé, les appels InputConnection sont exécutés sur le fil de discussion IME, et au lieu de garder un éditeur dupliqué, chaque appel InputConnection communique directement avec le moteur de rendu.</translation> <translation id="8799839487311913894">Activer la modification d'un mot de passe dans le gestionnaire de mots de passe après avoir envoyé un formulaire de modification de mot de passe</translation> <translation id="8800004011501252845">Affichage des emplacements de destination pour</translation> <translation id="8800420788467349919">Volume : <ph name="PRECENTAGE" /> %</translation> @@ -5263,6 +5280,7 @@ <translation id="8841142799574815336">Fenêtre d'affichage visuel inerte</translation> <translation id="884264119367021077">Adresse de livraison</translation> <translation id="8844238624737526720">Cette option permet d'utiliser la nouvelle configuration optimisée du gestionnaire de tâches Chrome.</translation> +<translation id="8845001906332463065">Obtenir de l'aide</translation> <translation id="8846141544112579928">Recherche du clavier en cours…</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Changement de mode via la touche Maj</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 4a640e96..5d289bd 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">આ પૃષ્ઠને બુકમાર્ક કરો...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> આઇટમ્સ કાઢી નાખી રહ્યું છે...</translation> <translation id="1048597748939794622">બધા સ્તરો માટે દબાણ-સક્ષમ</translation> +<translation id="1049795001945932310">&ભાષા સેટિંગ્સ</translation> <translation id="1049926623896334335">Word દસ્તાવેજ</translation> <translation id="1054153489933238809">નવા ટેબમાં મૂળ &છબી ખોલો</translation> <translation id="1055806300943943258">Bluetooth અને USB ઉપકરણો માટે શોધી રહ્યું છે...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">લિવ્યંતરણ (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">સ્વયંચાલિત નામ સર્વર્સ</translation> <translation id="1215411991991485844">નવી પૃષ્ઠભૂમિ એપ્લિકેશન ઉમેરી છે</translation> +<translation id="1216954813581739968">ડેસ્કટૉપ શેર માટે ટૅબ સક્ષમ કરો.</translation> <translation id="121827551500866099">બધા ડાઉનલોડ્સ બતાવો...</translation> <translation id="122082903575839559">પ્રમાણપત્ર હસ્તાક્ષર અલ્ગોરિધમ</translation> <translation id="1221024147024329929">RSA એન્ક્રિપ્શનવાળું PKCS #1 MD2 </translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">સ્વયંચાલિત સાઇન ઇન નિષ્ફળ થયું</translation> <translation id="1293556467332435079">ફાઇલો</translation> <translation id="1294298200424241932">વિશ્વનીય સેટિંગ્સ સંપાદિત કરો:</translation> +<translation id="1295794900245526845">સાઇન ઇન કરવા માટે <ph name="PASSWORD_MANAGER_BRAND" /> સાથે સાચવવામાં આવેલ તમારું એકાઉન્ટ પસંદ કરો</translation> <translation id="1297175357211070620">લક્ષ્યસ્થાન</translation> <translation id="1297922636971898492">Google ડ્રાઇવ હાલમાં ઉપલબ્ધ નથી. Google ડ્રાઇવ પાછું આવી જાય તે પછી અપલોડિંગ આપમેળે ફરીથી પ્રારંભ થશે.</translation> <translation id="1300861494336759522">Windows ડેસ્કટૉપ શોધ રીડાયરેક્શન</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">આ તમારા સ્ટાર્ટઅપ પૃષ્ઠ, નવું ટેબ પૃષ્ઠ, શોધ એંજિન અને પિન કરેલ ટેબને ફરીથી સેટ કરશે. તે તમામ એક્સટેન્શન્સને પણ અક્ષમ કરશે અને કુકીઝ જેવો અસ્થાયી ડેટા પણ સાફ કરશે. તમારા બુકમાર્ક્સ, ઇતિહાસ અને સાચવેલ પાસવર્ડ્સ સાફ કરવામાં આવશે નહીં.</translation> <translation id="1434886155212424586">હોમપેજ એ નવું ટેબ પૃષ્ઠ છે</translation> <translation id="1435550882135542937">એક્સ્ટેન્શન ટુલબાર ફરીથી ડિઝાઇન</translation> +<translation id="1436402875660227532">નોંધ: આ સેટિંગ્સનો હવે આ સિસ્ટમ પર ઉપયોગ થતો નથી, પરંતુ તમે હજુ પણ તેમને જોઇ અને સંપાદિત કરી શકો છો.</translation> <translation id="1436784010935106834">દૂર કરેલું</translation> <translation id="1438632560381091872">ટૅબ્સને અનમ્યૂટ કરો</translation> <translation id="1441841714100794440">વિયેતનામીસ કીબોર્ડ (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">વર્ચ્યુઅલ કીબોર્ડ સમર્થનને સક્ષમ કરો</translation> <translation id="1474079335130556426">પુશ API માટે પૃષ્ઠભૂમિ મોડ સક્ષમ કરો. આ Chrome ને છેલ્લી વિંડો બંધ થઈ જાય તે પછી ચાલતાં રહેવાની અને OS સ્ટાર્ટઅપ પર લોંચ કરવાની મંજૂરી આપે છે, જો પુશ API ને તેની જરૂર હોય તો.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" ને અપલોડ કરવામાં આવી ન હતી. તમારી Google ડ્રાઇવમાં પૂરતી ખાલી જગ્યા નથી.</translation> +<translation id="1476607407192946488">&ભાષા સેટિંગ્સ</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />omnibox<ph name="END_LINK" /> થી શોધ કરતી વખતે કયા શોધ એંજીનનો ઉપયોગ કરવો તે સેટ કરો.</translation> <translation id="1477301030751268706">ઓળખ API ટોકન કેશ</translation> <translation id="1478340334823509079">વિગતો: <ph name="FILE_NAME" /></translation> @@ -645,6 +650,7 @@ <translation id="1962233722219655970">આ પૃષ્ઠ મૂળ ક્લાયન્ટ એપ્લિકેશનનો ઉપયોગ કરે છે જે તમારા કમ્પ્યુટર પર કામ કરતી નથી.</translation> <translation id="1965328510789761112">ખાનગી મેમરી</translation> <translation id="1965624977906726414">તેને કોઈ વિશેષ પરવાનગીઓ નથી.</translation> +<translation id="1968720524450620475">વેબ સૂચનાઓ માટે ઍક્શન આઇકન્સ સક્ષમ કરો.</translation> <translation id="1970746430676306437">પૃષ્ઠ &માહિતી જુઓ</translation> <translation id="197288927597451399">રાખો</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> ડાઉનલોડ નિષ્ફળ થયું.</translation> @@ -905,6 +911,7 @@ <translation id="2344262275956902282">ઉમેદવારોની સૂચિ પૃષ્ઠબદ્ધ કરવા માટે - અને = કીઝનો ઉપયોગ કરો. </translation> <translation id="2347476388323331511">સમન્વયન કરી શકાયું નથી</translation> <translation id="2347991999864119449">પ્લગિન સામગ્રી ક્યારે શરૂ કરવી તે મને પસંદ કરવા દો</translation> +<translation id="2348165084656290171">ઑડિઓ શેર કરવા માટે, ટૅબ અથવા સમગ્ર સ્ક્રીન પસંદ કરો.</translation> <translation id="2350182423316644347">એપ્લિકેશન શરૂ કરી રહ્યું છે...</translation> <translation id="2350796302381711542"><ph name="REPLACED_HANDLER_TITLE" /> ના બદલે <ph name="HANDLER_HOSTNAME" /> ને બધી <ph name="PROTOCOL" /> લિંક્સ ખોલવાની મંજૂરી આપીએ?</translation> <translation id="2351266942280602854">ભાષા અને ઇનપુટ</translation> @@ -992,6 +999,7 @@ <translation id="247772113373397749">કેનેડિયન આંતરભાષીય કીબોર્ડ</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" માટે મીડિયા-ફાઇલ પરવાનગીઓ</translation> <translation id="2478830106132467213">જ્યારે તમારો ફોન એક હાથના અંતરે હોય માત્ર ત્યારે જ આ <ph name="DEVICE_TYPE" /> ને અનલૉક કરો.</translation> +<translation id="247949520305900375">ઑડિઓ શેર કરો</translation> <translation id="2479780645312551899">આ વખતે તમામ પ્લગિન્સ ચલાવો</translation> <translation id="2480626392695177423">પૂર્ણ/અર્ધ પહોળાઈ વિરામચિહ્ન મોડને ટૉગલ કરો</translation> <translation id="2481332092278989943">શેલ્ફ પર ઉમેરો</translation> @@ -1306,6 +1314,7 @@ <translation id="2889064240420137087">આની સાથે લિંક ખોલો...</translation> <translation id="2889925978073739256">અનસેન્ડબૉક્સ્ડ પ્લગિન્સ અવરોધિત કરવાનું ચાલુ રાખો</translation> <translation id="2890624088306605051">ફક્ત સમન્વયિત સેટિંગ્સ અને ડેટા પ્રાપ્ત કરો</translation> +<translation id="2890678560483811744">વધુ પડતો મોટો પૃષ્ઠ સંદર્ભ</translation> <translation id="2893168226686371498">ડિફૉલ્ટ બ્રાઉઝર</translation> <translation id="289426338439836048">અન્ય મોબાઇલ નેટવર્ક...</translation> <translation id="2894745200702272315">'Ok Google' પ્રચલિત શબ્દ શોધ સુવિધાનું પ્રાયોગિક સંસ્કરણ સક્ષમ કરે છે જેની પાસે હાર્ડવેર નિર્ભરતા છે.</translation> @@ -1334,7 +1343,6 @@ <translation id="2925966894897775835">શીટ્સ</translation> <translation id="2927017729816812676">કેશ સ્ટોરેજ</translation> <translation id="2927657246008729253">બદલો...</translation> -<translation id="2928415919076124714">પૂર્ણ સ્ક્રીનમાં ટુલબારને છુપાવો</translation> <translation id="2928526264833629376">Hangouts પર ચાલુ રાખો</translation> <translation id="2930644991850369934">છબી ડાઉનલોડની પુનર્પ્રાપ્તિ દરમિયાન એક સમસ્યા આવી હતી. નેટવર્ક કનેક્શન જતું રહ્યું હતું.</translation> <translation id="293111069139560936">જો ક્લિક થનાર શેલ્ફ આઇટમમાં માત્ર એક, પહેલાંથી સક્રિય કરેલ તેની સાથે સંકળાયેલ વિંડો છે તો વિંડોને નાની કરવા માટે શેલ્ફને મંજૂર કરે છે.</translation> @@ -1458,6 +1466,7 @@ <translation id="3117812041123364382">ફ્લોટિંગ વર્ચ્યુઅલ કીબોર્ડને સક્ષમ/અક્ષમ કરો.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> સહાય</translation> <translation id="3120430004221004537">આના પર આપેલ ઓપરેશન માટે અપૂરતું એન્ક્રિપ્શન: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">વેબ સૂચનાઓ માટે ઍક્શન બટન્સમાં આઇકન્સ સક્ષમ કરો.</translation> <translation id="3121793941267913344">આ <ph name="IDS_SHORT_PRODUCT_NAME" /> ઉપકરણ ફરીથી સેટ કરો</translation> <translation id="3122162841865761901">વિકાસકર્તા સાધનોના પ્રયોગો</translation> <translation id="3122464029669770682">CPU</translation> @@ -1578,7 +1587,6 @@ <translation id="3289566588497100676">સરળ પ્રતીક ઇનપુટ</translation> <translation id="3289856944988573801">અપડેટ્સ તપાસવા માટે, કૃપા કરીને ઇથરનેટ અથવા Wi-Fi નો ઉપયોગ કરો.</translation> <translation id="3293325348208285494">ઝડપી શરૂઆત</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" તપાસાયેલ ફોલ્ડર્સમાં છબીઓ, વિડિઓ, અને સાઉન્ડ ફાઇલો વાંચી અને લખી શકવા સમર્થ હશે.</translation> <translation id="3294437725009624529">અતિથિ</translation> <translation id="329650768420594634">પૅક એક્સ્ટેંશન ચેતવણી</translation> <translation id="3296763833017966289">જ્યોર્જિઅન</translation> @@ -1636,6 +1644,7 @@ <translation id="3338239663705455570">સ્લોવેનિયન કીબોર્ડ</translation> <translation id="3340978935015468852">સેટિંગ્સ</translation> <translation id="3341703758641437857">URL ફાઇલ કરવા ઍક્સેસની મંજૂરી આપો</translation> +<translation id="3343813173145836998">આ ઉપકરણ પર સરળતાથી સાઇન ઇન કરો</translation> <translation id="3344786168130157628">ઍક્સેસ પોઇન્ટનું નામ:</translation> <translation id="3345135638360864351">આ સાઇટને ઍક્સેસ કરવાની તમારી વિનંતી <ph name="NAME" /> ને મોકલી શકાઈ નથી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation> <translation id="3345886924813989455">સપોર્ટેડ બ્રાઉઝર મળ્યું નથી</translation> @@ -2115,6 +2124,7 @@ <translation id="3996912167543967198">ફરીથી સેટ કરી રહ્યું છે...</translation> <translation id="3997015411467176489">પ્રાયોગિક કૅન્વાસ સુવિધાઓ</translation> <translation id="40027638859996362">શબ્દ ખસેડો</translation> +<translation id="400554499662786523">ઑડિઓ શેર કરવા માટે, એક ટૅબ પસંદ કરો.</translation> <translation id="4012550234655138030">પ્રિંટર્સને <ph name="CLOUD_PRINT_NAME" /> માં સેટ અથવા સંચાલિત કરો.</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />" ને સુધારીએ?</translation> <translation id="4018133169783460046">આ ભાષામાં <ph name="PRODUCT_NAME" /> પ્રદર્શિત કરો</translation> @@ -2217,6 +2227,7 @@ <translation id="4180788401304023883">CA પ્રમાણપત્ર "<ph name="CERTIFICATE_NAME" />" ને કાઢીએ?</translation> <translation id="418179967336296930">રશિયન ધ્વન્યાત્મક (YaZHert) કીબોર્ડ</translation> <translation id="4181841719683918333">ભાષાઓ</translation> +<translation id="4187248015940562149">વેબ Bluetooth ને સક્ષમ કરે છે જે વેબસાઇટ્સને તમારી આસપાસના Bluetooth ઉપકરણો સાથે કનેક્ટ થવાની અને તેઓને નિયંત્રિત કરવાની મંજૂરી આપી શકે છે.</translation> <translation id="4188026131102273494">કીવર્ડ:</translation> <translation id="4189406272289638749">એક એક્સ્ટેન્શન, <b><ph name="EXTENSION_NAME" /></b> આ સેટિંગનું નિયંત્રણ કરે છે.</translation> <translation id="4193154014135846272">Google દસ્તાવેજ</translation> @@ -2273,6 +2284,7 @@ <translation id="4268025649754414643">કી ચિહ્નિકરણ</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">સંસ્કરણ <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">કોઇ મેળ મળ્યાં નથી</translation> <translation id="4274187853770964845">સમન્વયન ભૂલ: કૃપા કરી રોકો અને સમન્વયનને ફરી શરૂ કરો.</translation> <translation id="4275830172053184480">તમારું ઉપકરણ પુનઃપ્રારંભ કરો</translation> <translation id="4276796043975446927">મીટિંગ સાથે Chromebox પર સ્વાગત છે</translation> @@ -2342,6 +2354,7 @@ <translation id="4378551569595875038">કનેક્ટિંગ...</translation> <translation id="438122767399415311">UI દિશાને ફરજ પાડવી</translation> <translation id="4381849418013903196">મહાવિરામ</translation> +<translation id="4383192539467954373">સમગ્ર ઉપકરણોમાં આપમેળે સાઇન ઇન કરો</translation> <translation id="4384652540891215547">એક્સટેન્શન સક્રિય કરો</translation> <translation id="438503109373656455">સારાતોગા</translation> <translation id="4387554346626014084">એપ લૉન્ચર સમન્વયન સક્ષમ કરો. આ જ્યાં ઉપલબ્ધ હોય ત્યાં ફોલ્ડર્સ પણ સક્ષમ કરે છે (બિન OSX).</translation> @@ -2359,6 +2372,7 @@ <translation id="4421932782753506458">ફ્લફી</translation> <translation id="4422347585044846479">આ પૃષ્ઠ માટે બુકમાર્ક સંપાદિત કરો</translation> <translation id="4422428420715047158">DOMAIN:</translation> +<translation id="4423482519432579560">&જોડણી તપાસો</translation> <translation id="442477792133831654">નજીકના ઉપકરણો સાથે સંચાર કરો</translation> <translation id="4425149324548788773">મારી ડ્રાઇવ</translation> <translation id="4428582326923056538">Adobe Flash Player કૅમેરા અપવાદો જુદાં છે.</translation> @@ -2373,6 +2387,7 @@ <translation id="444267095790823769">સંરક્ષિત સામગ્રી અપવાદો</translation> <translation id="4443536555189480885">&Help</translation> <translation id="4444304522807523469">USB અથવા સ્થાનિક નેટવર્ક મારફતે જોડાયેલ દસ્તાવેજ સ્કેનર્સની ઍક્સેસ</translation> +<translation id="4445559854264555037">તમારું ઉપકરણ દેખાતું નથી? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">પ્રતિબિંબિત</translation> <translation id="4447465454292850432">બૅટરી:</translation> <translation id="4449935293120761385">સ્વતઃભરો વિશે</translation> @@ -2630,6 +2645,7 @@ <translation id="485316830061041779">જર્મન</translation> <translation id="4856478137399998590">તમારી મોબાઇલ ડેટા સેવા સક્રિય થઈ છે અને ઉપયોગ માટે તૈયાર છે</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">લાગુ હોય ત્યારે સિસ્ટમ ડાઉનલોડ સંચાલક દ્વારા ડાઉનલોડ્સને નિયંત્રિત કરવાની મંજૂરી આપો.</translation> <translation id="48607902311828362">એરપ્લેન મોડ</translation> <translation id="4861833787540810454">&ચલાવો</translation> <translation id="4862050643946421924">ઉપકરણ ઉમેરી રહ્યું છે...</translation> @@ -2713,7 +2729,6 @@ <translation id="4977942889532008999">ઍક્સેસની પુષ્ટિ કરો</translation> <translation id="4982718461356080574">સ્ટૅક કરેલ હોય ત્યારે નિષ્ક્રિય ટેબ્સ પર બંધ કરો બટનોને છુપાવવું</translation> <translation id="498294082491145744">તમારી તે સેટિંગ્સને બદલો કે જે કૂકીઝ, JavaScript, પ્લગિન્સ, ભૌગોલિક સ્થાન, માઇક્રોફોન, કૅમેરા, વગેરે જેવી સુવિધાઓની વેબસાઇટ્સની ઍક્સેસને નિયંત્રિત કરે છે</translation> -<translation id="4984329823325527157">મીડિયા સ્રોત API</translation> <translation id="4988526792673242964">પૃષ્ઠો</translation> <translation id="4988792151665380515">ખાનગી કી નિકાસ કરવામાં નિષ્ફળ.</translation> <translation id="49896407730300355">ઘ&ડિયાળની વિપરિત દિશામાં ફેરવો</translation> @@ -2900,7 +2915,6 @@ <translation id="5268606875983318825">PPAPI (પ્રક્રિયામાં નથી)</translation> <translation id="526926484727016706">તેના કારણે બધી iframes ડિફોલ્ટ રૂપે બધી પરવાનગીઓ નકારી શકે છે. iframe માટે ચોક્કસ પરવાનગીઓને મંજૂરી આપવામાં નવા iframe એટ્રિબ્યુટ્સના મૂલ્યો તરીકે આ પરવાનગીઓના નામને સૂચિબદ્ધ કરવું શામેલ હોઈ શકે છે.</translation> <translation id="5269977353971873915">છાપો નિષ્ફળ થયું</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" તપાસાયેલ ફોલ્ડર્સમાં છબીઓ, વિડિઓ, અને સાઉન્ડ ફાઇલો વાંચવામાં સમર્થ હશે.</translation> <translation id="5271247532544265821">સરળીકૃત/પરંપરાગત ચાઇનીઝ મોડને ટૉગલ કરો</translation> <translation id="5271549068863921519">પાસવર્ડ સાચવો</translation> <translation id="5273628206174272911">આડા ઑવરસ્ક્રોલના જવાબમાં પ્રાયોગિક ઇતિહાસ નેવિગેશન.</translation> @@ -2937,6 +2951,7 @@ <translation id="5316716239522500219">મિરર મૉનિટર્સ</translation> <translation id="5317780077021120954">સાચવો</translation> <translation id="5319782540886810524">લાતવિયન કીબોર્ડ</translation> +<translation id="532247166573571973">સર્વર પહોંચની બહાર હોઇ શકે છે. પછીથી ફરી પ્રયાસ કરો.</translation> <translation id="5323213332664049067">લેટિન અમેરિકન</translation> <translation id="532360961509278431">"$1" ખોલવામાં અક્ષમ છીએ: $2</translation> <translation id="5324674707192845912">ઉપકરણને રિમોટલી સ્થિત કરવા, વાઇપ કરવા અને લૉક કરવાની ક્ષમતાને અક્ષમ કરવા માટે Google સાથે આ <ph name="DEVICE_TYPE" /> ની નોંધણી રદ કરવાના છો. આને રીબૂટની જરૂર પડશે. શું તમે ચાલુ રાખવા માગો છો?</translation> @@ -2989,11 +3004,11 @@ <translation id="5390284375844109566">અનુક્રમિત ડેટાબેસ</translation> <translation id="5392544185395226057">મૂળ ક્લાઇન્ટ માટે સપોર્ટ સક્ષમ કરો.</translation> <translation id="5393125431335030955">આ પ્લગિનન ફ઼ક્ત ડેસ્કટોપ પર કામ કરે છે.</translation> -<translation id="5393559999218790205">UI સંમિશ્ર એનિમેશન સમયરેખા અક્ષમ કરો</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> પરનું <ph name="PEPPER_PLUGIN_NAME" /> તમારા કમ્પ્યુટરને ઍક્સેસ કરવા માગે છે.</translation> <translation id="539755880180803351">સ્વતઃભરો ફીલ્ડ પ્રકાર અનુમાનોવાળા વેબ ફોર્મ્સને પ્લેસહોલ્ડર ટેક્સ્ટ તરીકે એનોટેટ કરે છે.</translation> <translation id="5397578532367286026">આ વપરાશકર્તાના ઉપયોગ અને ઇતિહાસની chrome.com પર સંચાલક (<ph name="MANAGER_EMAIL" />) દ્વારા સમીક્ષા કરવામાં આવી શકે છે.</translation> <translation id="5397794290049113714">તમે</translation> +<translation id="5398572795982417028">વધુ પડતો મોટો પૃષ્ઠ સંદર્ભ, મર્યાદા <ph name="MAXIMUM_PAGE" /> છે</translation> <translation id="5398824043967640339">અન્ય સાઇટ્સ પરથી <ph name="COUNT" /></translation> <translation id="5399158067281117682">PIN મેળ ખાતો નથી!</translation> <translation id="5400640815024374115">ટ્રસ્ટેડ પ્લેટફોર્મ મૉડ્યૂલ (TPM) ચિપ અક્ષમ અથવા ગેરહાજર છે.</translation> @@ -3013,7 +3028,7 @@ <translation id="5423849171846380976">સક્રિય કર્યું</translation> <translation id="5425470845862293575">પ્રાયોગિક DirectWrite ફોન્ટ રેંડરિંગ સિસ્ટમના ઉપયોગને સક્ષમ કરે છે.</translation> <translation id="5425722269016440406">Smart Lock બંધ કરવા માટે તમારે ઓનલાઇન થવું આવશ્યક છે કારણ કે આ સેટિંગ તમારા ફોન અને અન્ય ઉપકરણો પર સમન્વયિત થાય છે. કૃપા કરીને પહેલા એક નેટવર્કથી કનેક્ટ કરો.</translation> -<translation id="5426623592374109001">UI માં સંમિશ્રિત એનિમેશન્સ માટે જૂની ખલેલદાયક એનિમેશન સબસિસ્ટમનો ઉપયોગ કરો.</translation> +<translation id="5425863515030416387">સમગ્ર ઉપકરણોમાં સરળતાથી સાઇન ઇન કરો</translation> <translation id="5427459444770871191">&ઘડિયાળની દિશામાં ફેરવો</translation> <translation id="5428105026674456456">સ્પેનિશ</translation> <translation id="542872847390508405">તમે અતિથિ તરીકે બ્રાઉઝ કરી રહ્યાં છો</translation> @@ -3038,6 +3053,7 @@ <translation id="5451646087589576080">ફ્રેમ &માહિતી જુઓ</translation> <translation id="5453029940327926427">ટૅબ્સ બંધ કરો</translation> <translation id="5453632173748266363">સિરિલિક</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> સાથે</translation> <translation id="5457113250005438886">અમાન્ય</translation> <translation id="5457459357461771897">વાંચો અને તમારા કમ્પ્યુટરમાંથી ફોટા, સંગીત અને અન્ય મીડિયા કાઢી નાખો</translation> <translation id="5457599981699367932">અતિથિ તરીકે બ્રાઉઝ કરો</translation> @@ -3208,7 +3224,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">પિંચ સ્કેલ</translation> <translation id="5710406368443808765">અરેરે! ઉપકરણ ટોકન અને ID સ્ટોર કરવામાં સિસ્ટમ નિષ્ફળ ગયું.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> પ્રતિસાદ આપી રહ્યું નથી. કાસ્ટ કરવા માટે અસમર્થ.</translation> <translation id="5711983031544731014">અનલૉક કરવામાં અસમર્થ છે. તમારો પાસવર્ડ દાખલ કરો.</translation> <translation id="5712966208980506909">જો સક્ષમ કરેલ હોય તો, chrome://md-policy URL, સામગ્રી ડિઝાઇન નીતિ પૃષ્ઠને લોડ કરે છે.</translation> <translation id="5715711091495208045">પ્લગિન બ્રોકર: <ph name="PLUGIN_NAME" /></translation> @@ -3475,7 +3490,6 @@ <translation id="6111974609785983504">ડિફોલ્ટ દ્વારા મંજૂર</translation> <translation id="6113134669445407638">WebRTC માં વિલંબ Agnostic AEC અક્ષમ કરો. જો જાણ કરેલ સિસ્ટમ વિલંબ અત્યંત વિશ્વસનીય હોય અથવા અન્યોને તમારા મશીનમાં પડઘાનો અનુભવ થતો હોય તો ઉપયોગ કરો.</translation> <translation id="6116921718742659598">ભાષા અને ઇનપુટ સેટિંગ્સ બદલો</translation> -<translation id="6117536376248197233">રેન્ડરર્સમાં સંમિશ્ર એનિમેશન સમયરેખા અક્ષમ કરો.</translation> <translation id="6120205520491252677">પ્રારંભ સ્ક્રીન પર આ પૃષ્ઠ પિન કરો...</translation> <translation id="6122081475643980456">તમારું ઇન્ટરનેટ કનેક્શન નિયંત્રિત કરવામાં આવી રહ્યું છે</translation> <translation id="6122093587541546701">ઇમેઇલ (વૈકલ્પિક):</translation> @@ -3507,6 +3521,7 @@ <translation id="6163522313638838258">તમામ વિસ્તૃત કરો...</translation> <translation id="6164005077879661055">એકવાર આ નિરીક્ષણ કરેલ વપરાશકર્તાને દૂર કરવામાં આવે પછી નિરીક્ષણ કરેલ વપરાશકર્તા સાથે સંકળાયેલી બધી ફાઇલો અને સ્થાનિક ડેટા કાયમી રૂપે કાઢી નાંખવામાં આવશે. નિરીક્ષણ કરેલ વપરાશકર્તા માટે મુલાકાત લીધેલી વેબસાઇટ્સ અને સેટિંગ્સ <ph name="MANAGEMENT_URL" /> પરના સંચાલકને હજી પણ દૃશ્યમાન હોઈ શકે છે.</translation> <translation id="6165508094623778733">વધુ જાણો</translation> +<translation id="6167008112175207002">તમારા Google એકાઉન્ટ પર તમારા બુકમાર્ક્સ, ઇતિહાસ, પાસવર્ડ્સ અને અન્ય સેટિંગ્સ સમન્વયિત કરવામાં આવશે જેથી તમારા બધા ઉપકરણોમાં તેમનો ઉપયોગ કરી શકો છો. તમે આને <ph name="BEGIN_LINK" /> માં બદલી શકો છો</translation> <translation id="6171550060231646388">સિમ્યુલેટ કરેલ હાર્ડવેર 'Ok Google' સુવિધાઓ</translation> <translation id="6175314957787328458">Microsoft ડોમેન GUID</translation> <translation id="6178664161104547336">એક પ્રમાણપત્ર પસંદ કરો</translation> @@ -3710,6 +3725,7 @@ <translation id="648927581764831596">કંઈપણ ઉપલબ્ધ નથી</translation> <translation id="6490936204492416398">વેબદુકાનમાંથી નવા ઇન્સ્ટોલ કરો</translation> <translation id="6492313032770352219">ડિસ્ક પરનું કદ:</translation> +<translation id="6498249116389603658">&તમારી બધી ભાષાઓ</translation> <translation id="6499143127267478107">પ્રોક્સી સ્ક્રિપ્ટમાં હોસ્ટને રિઝોલ્વ કરી રહ્યું છે...</translation> <translation id="6503077044568424649">સૌથી વધુ જોવાયેલ</translation> <translation id="6503256918647795660">સ્વીસ ફ્રેંચ કીબોર્ડ</translation> @@ -3752,7 +3768,6 @@ <translation id="6555432686520421228">બધા વપરાશકર્તા એકાઉન્ટ્સ દૂર કરો અને તમારા <ph name="IDS_SHORT_PRODUCT_NAME" /> ઉપકરણને નવાની જેમ ફરીથી સેટ કરો.</translation> <translation id="6556866813142980365">ફરી કરો</translation> <translation id="6557565812667414268">ફક્ત ઉચ્ચ-DPI પ્રદર્શનો માટે જ સક્ષમ કરેલ છે</translation> -<translation id="655845594391856372">ટેબ પ્રતિસાદ આપી રહી નથી. કાસ્ટ કરવા માટે અસમર્થ.</translation> <translation id="6559580823502247193">(પહેલાંથી જ આ ઉપકરણ પર છે)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="6562437808764959486">પુનઃપ્રાપ્તિ છબીને એક્સ્ટ્રેક્ટ કરી રહ્યું છે...</translation> @@ -3853,6 +3868,7 @@ <translation id="6723354935081862304">Google દસ્તાવેજ અને અન્ય મેઘ ગંતવ્યો પર છાપો. Google મેઘ મુદ્રણમાં છાપવા માટે <ph name="BEGIN_LINK" />સાઇન ઇન<ph name="END_LINK" /> કરો.</translation> <translation id="6723661294526996303">બુકમાર્ક્સ અને સેટિંગ્સ આયાત કરો...</translation> <translation id="6723839937902243910">પાવર</translation> +<translation id="6725240607822645708">IME ને તેના પોતાના થ્રેડ પર શરૂ કરો.</translation> <translation id="6725970970008349185">પૃષ્ઠ દીઠ પ્રદર્શિત કરવાના ઉમેદવારોની સંખ્યા</translation> <translation id="672609503628871915">શું નવું છે તે જુઓ</translation> <translation id="6727005317916125192">પહેલાંની પેન</translation> @@ -3983,12 +3999,11 @@ <translation id="6948736568813450284">વિકાસકર્તાઓ માટે: Google Payments API કૉલ્સ માટે સેન્ડબોક્સ સેવાનો ઉપયોગ કરો.</translation> <translation id="6949306908218145636">ખુલ્લા પૃષ્ઠોને બુકમાર્ક કરો...</translation> <translation id="695164542422037736">જો આ વિકલ્પ સક્રિય કરેલ હોય, અને જો મુખ્ય ભાગની શૈલી પૃષ્ઠભૂમિ-જોડાણ:સ્થિર હોય, તો પૃષ્ઠભૂમિ પાસે તેનું પોતાનું સંમિશ્રિત સ્તર હશે.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" />, તમારા પાસવર્ડ્સ યાદ રાખે છે અને આ ઉપકરણ પર તમને સાઇટ્સ પર આપમેળે સાઇન ઇન કરે છે.</translation> <translation id="6955446738988643816">પૉપઅપની તપાસ કરો</translation> <translation id="695755122858488207">પસંદ ન કરેલું રેડિઓ બટન</translation> +<translation id="6960277925159781810">આ ઉપકરણ પર આપમેળે સાઇન ઇન કરો</translation> <translation id="696036063053180184">3 સેટ (શિફ્ટ નહીં)</translation> <translation id="696203921837389374">મોબાઇલ ડેટા પર સમન્વયન કરવાનું સક્ષમ કરો</translation> -<translation id="6964308487066031935">"<ph name="EXTENSION" />" પર ફોલ્ડર્સ ઉમેરીએ?</translation> <translation id="6965382102122355670">ઓકે</translation> <translation id="6965648386495488594">પોર્ટ</translation> <translation id="6965978654500191972">ઉપકરણ</translation> @@ -4087,7 +4102,6 @@ <translation id="7076293881109082629">સાઇન ઇન કરી રહ્યું છે</translation> <translation id="7077829361966535409">સાઇન-ઇન પૃષ્ઠ વર્તમાન પ્રોક્સી સેટિંગ્સનો ઉપયોગ કરીને લોડ થવામાં નિષ્ફળ થયું. કૃપા કરીને <ph name="GAIA_RELOAD_LINK_START" />ફરીથી સાઇન ઇન કરવાનો પ્રયાસ કરો<ph name="GAIA_RELOAD_LINK_END" /> અથવા ભિન્ન <ph name="PROXY_SETTINGS_LINK_START" />પ્રોક્સી સેટિંગ્સ<ph name="PROXY_SETTINGS_LINK_END" />નો ઉપયોગ કરો.</translation> <translation id="7077872827894353012">ધ્યાન ન આપેલ પ્રોટોકૉલ હેન્ડલર્સ</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" તપાસાયેલ ફોલ્ડર્સમાં છબીઓ, વિડિઓ, અને સાઉન્ડ ફાઇલો વાંચી અને કાઢી નાખવા સમર્થ હશે.</translation> <translation id="708060913198414444">ઑડિઓ સરનામું કૉ&પિ કરો</translation> <translation id="708187310695946552">સત્ર પુનર્સ્થાપન બબલ UI</translation> <translation id="7082055294850503883">CapsLock સ્થિતિને અવગણો અને ડિફૉલ્ટ રૂપે લોવરકેસ ઇનપુટ કરો</translation> @@ -4231,6 +4245,8 @@ <translation id="7313804056609272439">વિયતાનામી ઇનપુટ મેથડ ((વીએનઆય))</translation> <translation id="7314244761674113881">સૉક્સ હોસ્ટ</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (ચાલુ)</translation> +<translation id="7321545336522791733">સર્વર પહોંચની બહાર છે</translation> +<translation id="7324841169865301118">ડેસ્કટૉપ શેર માટે એક ટૅબ પસંદ કરવા વપરાશકર્તાને સક્ષમ કરે છે.</translation> <translation id="7325437708553334317">હાઇ કોન્ટ્રાસ્ટ એક્સ્ટેંશન</translation> <translation id="7326565110843845436">ટચપેડ થ્રી-ફિંગર ક્લિક</translation> <translation id="73289266812733869">પસંદ ન કરેલું</translation> @@ -4457,7 +4473,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />", "<ph name="EXTENSION_NAME" />" ને દૂર કરવા માગે છે.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> ને આ ભાષામાં પ્રદર્શિત કરવામાં આવ્યું છે</translation> <translation id="7654941827281939388">આ એકાઉન્ટ પહેલાથીજ આ કમ્પ્યુટર પર ઉપયોગમાં લેવાઈ રહ્યું છે.</translation> -<translation id="7655165758820095116">MediaSource ઑબ્જેક્ટ, JavaScript ને સીધા જ વિડિઓ ઘટક પર મીડિયા ડેટા મોકલવાની મંજૂરી આપે છે.</translation> <translation id="7658239707568436148">રદ કરો</translation> <translation id="7659584679870740384">તમે આ ઉપકરણ વાપરવા માટે અધિકૃત નથી. કૃપા કરીને સાઇન ઇન કરવાની પરવાનગી માટે વ્યવસ્થાપકનો સંપર્ક કરો.</translation> <translation id="7664620655576155379">અસમર્થિત Bluetooth ઉપકરણ: "<ph name="DEVICE_NAME" />".</translation> @@ -4588,6 +4603,7 @@ <translation id="7861215335140947162">&ડાઉનલોડ્સ</translation> <translation id="7864539943188674973">Bluetooth અક્ષમ કરો</translation> <translation id="7868891395842935202">API પ્રયોગો પર ઍક્સેસને નિયંત્રિત કરવા માટે પ્રાયોગિક ફ્રેમવર્કને સક્ષમ કરે છે.</translation> +<translation id="7870576007982733437">લાગુ હોય ત્યારે સિસ્ટમ ડાઉનલોડ સંચાલકનો ઉપયોગ કરો.</translation> <translation id="7870790288828963061">નવા સંસ્કરણ સાથેની કોઇ કિઓસ્ક એપ્લિકેશનો મળી નથી. અપડેટ કરવા માટે કંઇ નથી. કૃપા કરીને USB સ્ટીક દૂર કરો.</translation> <translation id="787150342916295244">ક્રેડિટ કાર્ડ સ્કેન કરી રહ્યાં છે</translation> <translation id="7874357055309047713">હંમેશાં બધી સાઇટ્સ પર ચલાવો</translation> @@ -4630,7 +4646,6 @@ <translation id="7918257978052780342">નોંધણી કરો</translation> <translation id="7920092496846849526">આ પૃષ્ઠી મુલાકાત લો તે ઠીક છે તેવું તમે તમારા માતાપિતાને પૂછ્યું છે કે કેમ.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> ની પ્રતીક્ષા કરે છે...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" />, તમારા પાસવર્ડ્સ યાદ રાખે છે અને સમગ્ર ઉપકરણો પર તમને ઍપ્લિકેશનો અને સાઇટ્સ પર આપમેળે સાઇન ઇન કરે છે.</translation> <translation id="7925686952655276919">સમન્વયન માટે ડેટા માહિતીની ઉપયોગ કરશો નહીં</translation> <translation id="7926906273904422255">બિન-સુરક્ષિત મૂળને બિન-સુરક્ષિત તરીકે અથવા "શંકાસ્પદ" તરીકે ચિહ્નિત કરો.</translation> <translation id="7928710562641958568">ઉપકરણ હટાવો</translation> @@ -4687,7 +4702,6 @@ <translation id="7999229196265990314">નીચેની ફાઇલો બનાવાઈ: એક્સટેન્શન: <ph name="EXTENSION_FILE" />કી ફાઇલ: <ph name="KEY_FILE" />તમારી કી ફાઇલને સુરક્ષિત સ્થાન પર મૂકો. તમને તેની જરૂરિયાત તમારા એક્સટેન્શનના નવા સંસ્કરણ બનાવવા માટે પડશે.</translation> <translation id="799923393800005025">જોઇ શકે છે</translation> <translation id="7999338963698132743">નવો કાર્ય વ્યવસ્થાપક</translation> -<translation id="8000004253404706714">રેન્ડરર્સમાં સંમિશ્રિત એનિમેશન્સ માટે જૂની ખલેલદાયક એનિમેશન સબસિસ્ટમનો ઉપયોગ કરો.</translation> <translation id="8004582292198964060">બ્રાઉઝર</translation> <translation id="8007030362289124303">બૅટરી ઓછી</translation> <translation id="8008356846765065031">ઇન્ટરનેટ ડિસ્કનેક્ટ કર્યું. કૃપા કરીને તમારું ઇન્ટરનેટ કનેક્શન તપાસો.</translation> @@ -4817,6 +4831,7 @@ <translation id="8185331656081929126">નેટવર્ક પર નવા પ્રિન્ટર્સ શોધવામાં આવે ત્યારે સૂચનાઓ બતાવો</translation> <translation id="8186609076106987817">સર્વર ફાઇલને શોધી શક્યું નથી.</translation> <translation id="8186706823560132848">સૉફ્ટવેર</translation> +<translation id="8188120771410500975">&ટેક્સ્ટ ફીલ્ડ્સની જોડણી તપાસો</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> અને <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> અન્ય</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> થી કનેક્ટ કરે છે</translation> <translation id="8191230140820435481">તમારી એપ્લિકેશનો, એક્સ્ટેન્શન અને થીમ્સ મેનેજ કરો</translation> @@ -5211,6 +5226,7 @@ <translation id="8765985713192161328">હેન્ડલર્સ મેનેજ કરો...</translation> <translation id="8766796754185931010">કોતોએરી</translation> <translation id="8767072502252310690">વપરાશકર્તાઓ</translation> +<translation id="8768367823103160496">માઉસ કર્સર લૉક</translation> <translation id="8769662576926275897">કાર્ડ વિગતો</translation> <translation id="8770196827482281187">પર્શિયન ઇનપુટ મેથડ (ISIRI 2901 લેઆઉટ)</translation> <translation id="8774934320277480003">ઉપરી હાંસિયો</translation> @@ -5230,6 +5246,7 @@ <translation id="8795668016723474529">ક્રેડિટ કાર્ડ ઉમેરો </translation> <translation id="8795916974678578410">નવી વિંડો</translation> <translation id="8798099450830957504">ડિફૉલ્ટ</translation> +<translation id="8799127529310003270">જો સક્ષમ હોય, તો InputConnection કૉલ્સ IME થ્રેડ પર ચાલે છે અને આબેહૂબ સંપાદક રાખવાને બદલે, દરેક InputConnection કૉલ સીધો રેન્ડરરને વાત કરશે.</translation> <translation id="8799839487311913894">“પાસવર્ડ બદલો” ફોર્મ સબમિટ કર્યા પછી પાસવર્ડ સંચાલકમાં પાસવર્ડ અપડેટ કરવાનું સક્ષમ કરો.</translation> <translation id="8800004011501252845">આના માટે ગંતવ્યો બતાવી રહ્યું છે</translation> <translation id="8800420788467349919">વોલ્યુમ: <ph name="PRECENTAGE" />%</translation> @@ -5255,6 +5272,7 @@ <translation id="8841142799574815336">દૃશ્યક્ષમ વ્યૂપોર્ટ શામેલ કરો</translation> <translation id="884264119367021077">શિપિંગ સરનામું</translation> <translation id="8844238624737526720">chrome કાર્ય વ્યવસ્થાપકના નવા અને ઓપ્ટિમાઇઝ કરેલ અમલીકરણનો ઉપયોગ કરો.</translation> +<translation id="8845001906332463065">સહાય મેળવો</translation> <translation id="8846141544112579928">કીબોર્ડ માટે શોધ કરી રહ્યું છે...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">શિફ્ટ કી મોડ સ્વિચ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 0dddab4..5c39831 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">इस पृष्ठ को बुकमार्क करें...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> आइटम हटा रहा है...</translation> <translation id="1048597748939794622">सभी परतों के लिए बलपूर्वक सक्षम करें</translation> +<translation id="1049795001945932310">&भाषा सेटिंग</translation> <translation id="1049926623896334335">Word दस्तावेज़</translation> <translation id="1054153489933238809">मूल &चित्र को नए टैब में खोलें</translation> <translation id="1055806300943943258">ब्लूटूथ और USB डिवाइस खोजे जा रहे हैं...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">लिप्यंतरण (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">स्वचालित नाम सर्वर</translation> <translation id="1215411991991485844">नया पृष्ठभूमि ऐप्स जोड़ा गया</translation> +<translation id="1216954813581739968">डेस्कटॉप साझा के लिए टैब सक्षम करें.</translation> <translation id="121827551500866099">सभी डाउनलोड दिखाएं...</translation> <translation id="122082903575839559">प्रमाणपत्र हस्ताक्षर कलन विधि</translation> <translation id="1221024147024329929">RSA सुरक्षित तरीका के साथ PKCS #1 MD2</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">स्वत: प्रवेश विफल रहा</translation> <translation id="1293556467332435079">फ़ाइल</translation> <translation id="1294298200424241932">विश्वास सेटिंग संपादित करें:</translation> +<translation id="1295794900245526845">प्रवेश करने के लिए <ph name="PASSWORD_MANAGER_BRAND" /> के साथ सहेजा गया अपना खाता चुनें</translation> <translation id="1297175357211070620">गंतव्य</translation> <translation id="1297922636971898492">Google डिस्क इस समय उपलब्ध नहीं है. Google डिस्क के वापस आ जाने पर अपलोडिंग अपने आप पुन: प्रारंभ हो जाएगी.</translation> <translation id="1300861494336759522">Windows डेस्कटॉप खोज रीडायरेक्शन</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">यह आपके स्टार्टअप पृष्ठ, नया टैब पृष्ठ, खोज इंजन और पिन किए गए टैब को रीसेट करेगा. यह सभी एक्सटेंशन को भी अक्षम करेगा और कुकी जैसे अस्थायी डेटा को साफ़ करेगा. आपके बुकमार्क, इतिहास और सहेजे गए पासवर्ड साफ़ नहीं किए जाएंगे.</translation> <translation id="1434886155212424586">मुख्यपृष्ठ, नया टैब पृष्ठ है</translation> <translation id="1435550882135542937">एक्सटेंशन टूलबार रीडिज़ाइन</translation> +<translation id="1436402875660227532">ध्यान दें: इन सेटिंग का उपयोग अब इस सिस्टम पर नहीं किया जाता, लेकिन आप अब भी उन्हें देख और संपादित कर सकते हैं.</translation> <translation id="1436784010935106834">निकाला गया</translation> <translation id="1438632560381091872">टैब अनम्यूट करें</translation> <translation id="1441841714100794440">वियतनामी कीबोर्ड (टेलेक्स)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">आभासी कीबोर्ड सहायता सक्षम करें.</translation> <translation id="1474079335130556426">Push API के लिए पृष्ठभूमि मोड सक्षम करें. इससे Push API को आवश्यकता होने पर, Chrome को पिछली विंडो बंद होने के बाद चलते रहने में, OS स्टार्टअप पर लॉन्च होने में सहायता मिलती है.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" को अपलोड नहीं किया गया. आपकी Google डिस्क में पर्याप्त जगह नहीं है.</translation> +<translation id="1476607407192946488">&भाषा सेटिंग</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />ऑम्निबॉक्स<ph name="END_LINK" /> से खोजते समय उपयोग किया जाने वाला खोज इंजन सेट करें.</translation> <translation id="1477301030751268706">पहचान API टोकन संचय</translation> <translation id="1478340334823509079">विवरण: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">यह पृष्ठ एक ऐसे स्थानीय क्लाइंट का उपयोग करता है जो आपके कंप्यूटर पर काम नहीं करता.</translation> <translation id="1965328510789761112">गोपनीय मेमोरी</translation> <translation id="1965624977906726414">कोई विशेष अनुमति नहीं है.</translation> +<translation id="1968720524450620475">वेब नोटिफिकेशन के लिए कार्रवाई आइकन सक्षम करें.</translation> <translation id="1970746430676306437">पृष्ठ &जानकारी देखें</translation> <translation id="197288927597451399">रखें</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> डाउनलोड विफल रहा.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">उम्मीदवार सूची पृष्ठांकित करने के लिए - और = कुंजियों का उपयोग करें</translation> <translation id="2347476388323331511">समन्वयित नहीं कर सका</translation> <translation id="2347991999864119449">प्लग इन सामग्री चलाने का समय मुझे चुनने दें</translation> +<translation id="2348165084656290171">ऑडियो साझा करने के लिए, कोई टैब या पूरी स्क्रीन चुनें.</translation> <translation id="2350182423316644347">ऐप्स आरंभ किया जा रहा है...</translation> <translation id="2350796302381711542"><ph name="HANDLER_HOSTNAME" /> को <ph name="REPLACED_HANDLER_TITLE" /> के बजाय सभी <ph name="PROTOCOL" /> लिंक खोलने दें?</translation> <translation id="2351266942280602854">भाषा और इनपुट</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">कनाडियाई बहुभाषी कीबोर्ड</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" के लिए मीडिया-फ़ाइल अनुमतियां</translation> <translation id="2478830106132467213">इस <ph name="DEVICE_TYPE" /> को तभी अनलॉक करें जब आपका फ़ोन एक हाथ की दूरी पर हो.</translation> +<translation id="247949520305900375">ऑडियो साझा करें</translation> <translation id="2479780645312551899">इस बार सभी प्लग इन चलाएं</translation> <translation id="2480626392695177423">पूरी/आधी चौड़ाई वाला विराम चिह्न मोड टॉगल करें</translation> <translation id="2481332092278989943">शेल्फ़ में जोड़ें</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">इनके साथ लिंक खोलें...</translation> <translation id="2889925978073739256">सैंडबॉक्स नहीं किए गए प्लग इन अवरोधित करते रहें</translation> <translation id="2890624088306605051">केवल समन्वयित सेटिंग और डेटा पुनर्प्राप्त करें</translation> +<translation id="2890678560483811744">सीमा से बाहर के पृष्ठ का संदर्भ</translation> <translation id="2893168226686371498">सामान्य ब्राउज़र</translation> <translation id="289426338439836048">अन्य मोबाइल नेटवर्क...</translation> <translation id="2894745200702272315">'Ok Google' हॉटवर्ड पहचान सुविधाओं के ऐसे प्रयोगात्मक वर्शन को सक्षम करता है जिसमें हार्डवेयर निर्भरता होती है.</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">पत्रक</translation> <translation id="2927017729816812676">संचय मेमोरी</translation> <translation id="2927657246008729253">बदलें...</translation> -<translation id="2928415919076124714">पूर्ण स्क्रीन में टूलबार छिपाएं</translation> <translation id="2928526264833629376">Hangouts पर जारी रखें</translation> <translation id="2930644991850369934">पुनर्प्राप्ति चित्र डाउनलोड करते समय समस्या आई थी. नेटवर्क कनेक्शन टूट गया है.</translation> <translation id="293111069139560936">जब कोई ऐसा शेल्फ़ आइटम क्लिक किया जाता है जिसके साथ कोई एकल, पहले से सक्रिय, विंडो संबद्ध है, तो शेल्फ़ को विंडो को छोटा करने की अनुमति देता है.</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">गतिशील वर्चुअल कीबोर्ड को सक्षम/अक्षम करें.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" />सहायता</translation> <translation id="3120430004221004537">दिए गए संचालन के लिए इस पर अपर्याप्त एन्क्रिप्शन: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">वेब नोटिफिकेशन के लिए कार्रवाई बटन में आइकन सक्षम करें.</translation> <translation id="3121793941267913344">इस <ph name="IDS_SHORT_PRODUCT_NAME" /> डिवाइस को रीसेट करें</translation> <translation id="3122162841865761901">डेवलपर टूल प्रयोग</translation> <translation id="3122464029669770682">CPU</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">आसान प्रतीक इनपुट</translation> <translation id="3289856944988573801">अपडेट की जांच करने के लिए, कृपया Ethernet या वाई-फ़ाई उपयोग करें.</translation> <translation id="3293325348208285494">तेज़ी से प्रारंभ</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" चेक किए हुए फ़ोल्डर में चित्र, वीडियो और ध्वनि फ़ाइलों को पढ़ने और लिखने में सक्षम हो जाएगा.</translation> <translation id="3294437725009624529">अतिथि</translation> <translation id="329650768420594634">पैक एक्सटेंशन चेतावनी</translation> <translation id="3296763833017966289">जॉर्जियाई</translation> @@ -1639,6 +1647,7 @@ <translation id="3338239663705455570">स्लोवेनियाई कीबोर्ड</translation> <translation id="3340978935015468852">सेटिंग</translation> <translation id="3341703758641437857">फ़ाइल URL तक पहुंचने की अनुमति दें</translation> +<translation id="3343813173145836998">इस डिवाइस पर आसानी से प्रवेश करें</translation> <translation id="3344786168130157628">पहुंच बिंदु नाम:</translation> <translation id="3345135638360864351">इस साइट को ऐक्सेस करने का आपका अनुरोध <ph name="NAME" /> को नहीं भेजा जा सका. कृपया पुन: प्रयास करें.</translation> <translation id="3345886924813989455">कोई समर्थित ब्राउज़र नहीं मिला</translation> @@ -2117,6 +2126,7 @@ <translation id="3996912167543967198">रीसेट हो रही हैं...</translation> <translation id="3997015411467176489">प्रयोगात्मक कैनवस सुविधाएं</translation> <translation id="40027638859996362">शब्द स्थानांतरण</translation> +<translation id="400554499662786523">ऑडियो साझा करने के लिए, कोई टैब चुनें.</translation> <translation id="4012550234655138030">Set up or manage printers in <ph name="CLOUD_PRINT_NAME" /> में प्रिंटर सेट अप करें या प्रबंधित करें.</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />" को ठीक करें?</translation> <translation id="4018133169783460046"><ph name="PRODUCT_NAME" /> को इस भाषा में दिखाएं</translation> @@ -2219,6 +2229,7 @@ <translation id="4180788401304023883">CA प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" हटाएं?</translation> <translation id="418179967336296930">रूसी फ़ोनेटिक (YaZHert) कीबोर्ड</translation> <translation id="4181841719683918333">भाषाएं</translation> +<translation id="4187248015940562149">वेब ब्लूटूथ को सक्षम करता है जो वेबसाइट को आपके आस-पास के ब्लूटूथ डिवाइस से कनेक्ट करने और उन्हें नियंत्रित करने दे सकता है.</translation> <translation id="4188026131102273494">कीवर्ड:</translation> <translation id="4189406272289638749">कोई एक्सटेंशन, <b><ph name="EXTENSION_NAME" /></b>, इस सेटिंग को नियंत्रित कर रहा है.</translation> <translation id="4193154014135846272">Google दस्तावेज़</translation> @@ -2275,6 +2286,7 @@ <translation id="4268025649754414643">कुंजी कूटलेखन</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">वर्शन <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">कोई मिलान नहीं</translation> <translation id="4274187853770964845">समन्वयन त्रुटि: कृपया रोकें और समन्वयन पुन: प्रारंभ करें.</translation> <translation id="4275830172053184480">अपना डिवाइस पुन: प्रारंभ करें</translation> <translation id="4276796043975446927">मीटिंग के लिए Chromebox में आपका स्वागत है</translation> @@ -2344,6 +2356,7 @@ <translation id="4378551569595875038">कनेक्ट हो रहा है...</translation> <translation id="438122767399415311">UI दिशा लागू करें</translation> <translation id="4381849418013903196">विरामचिह्न</translation> +<translation id="4383192539467954373">सभी डिवाइस में अपने आप प्रवेश करें</translation> <translation id="4384652540891215547">एक्सटेंशन सक्रिय करें</translation> <translation id="438503109373656455">साराटोगा</translation> <translation id="4387554346626014084">ऐप्लिकेशन लॉन्चर समन्वयन सक्षम करें. यह उपलब्ध होने पर फ़ोल्डर भी सक्षम करता है (गैर OSX).</translation> @@ -2361,6 +2374,7 @@ <translation id="4421932782753506458">फ्लफ़ी</translation> <translation id="4422347585044846479">इस पृष्ठ के लिए बुकमार्क संपादित करें</translation> <translation id="4422428420715047158">डोमेन:</translation> +<translation id="4423482519432579560">&वर्तनीजांच</translation> <translation id="442477792133831654">आस-पास के डिवाइस से संचार करें</translation> <translation id="4425149324548788773">मेरी डिस्क</translation> <translation id="4428582326923056538">Adobe Flash Player के कैमरा अपवाद अलग हैं.</translation> @@ -2375,6 +2389,7 @@ <translation id="444267095790823769">संरक्षित सामग्री अपवाद</translation> <translation id="4443536555189480885">&मदद</translation> <translation id="4444304522807523469">USB के द्वारा संलग्न किए गए या स्थानीय नेटवर्क पर मौजूद दस्तावेज़ स्कैनर ऐक्सेस करें</translation> +<translation id="4445559854264555037">अपना डिवाइस नहीं दिखाई दे रहा है? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">मिरर किया गया</translation> <translation id="4447465454292850432">बैटरी:</translation> <translation id="4449935293120761385">स्वत: भरण के बारे में</translation> @@ -2633,6 +2648,7 @@ <translation id="485316830061041779">जर्मन</translation> <translation id="4856478137399998590">आपकी मोबाइल डेटा सेवा सक्रिय कर दी गई है और उपयोग के लिए तैयार है</translation> <translation id="4858913220355269194">फ्रिट्ज़</translation> +<translation id="4860565041166337978">लागू होने पर, सिस्टम डाउनलोड प्रबंधक को डाउनलोड का प्रबंधन करने की अनुमति दें.</translation> <translation id="48607902311828362">हवाई जहाज़ मोड</translation> <translation id="4861833787540810454">&चलाएं</translation> <translation id="4862050643946421924">डिवाइस जोड़ा जा रहा है...</translation> @@ -2716,7 +2732,6 @@ <translation id="4977942889532008999">एक्सेस की दुबारा पूछें</translation> <translation id="4982718461356080574">स्टैक किए जाने पर निष्क्रिय टैब पर बटनों को छिपाना</translation> <translation id="498294082491145744">कुकी, JavaScript, प्लग इन, भू-स्थान, माइक्रोफ़ोन, कैमरा आदि जैसी सुविधाओं तक वेबसाइट की ऐक्सेस नियंत्रित करने वाली सेटिंग में बदलाव करें.</translation> -<translation id="4984329823325527157">मीडिया स्रोत API</translation> <translation id="4988526792673242964">पृष्ठ</translation> <translation id="4988792151665380515">सार्वजनिक कुंजी निर्यात करने में विफल.</translation> <translation id="49896407730300355">घड़ी की &विपरीत दिशा में घुमाएं</translation> @@ -2905,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (प्रक्रिया से बाहर)</translation> <translation id="526926484727016706">इसके कारण सभी iframe के लिए सभी अनुमतियां डिफ़ॉल्ट रूप से अस्वीकृत हो जाती हैं. किसी iframe के लिए विशिष्ट अनुमतियां देने से उन अनुमतियों के नामों की सूची को नई iframe विशेषताओं के मानों के रूप में शामिल किया जा सकता है.</translation> <translation id="5269977353971873915">प्रिंट विफल</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" चेक किए हुए फ़ोल्डर में चित्र, वीडियो और ध्वनि फ़ाइलों को पढ़ने में सक्षम हो जाएगा.</translation> <translation id="5271247532544265821">सरलीकृत/पारंपरिक चीनी मोड टॉगल करें</translation> <translation id="5271549068863921519">पासवर्ड सहेजें</translation> <translation id="5273628206174272911">क्षैतिज ओवरस्क्रॉल के उत्तर में प्रयोगात्मक इतिहास मार्गदर्शक.</translation> @@ -2942,6 +2956,7 @@ <translation id="5316716239522500219">मॉनीटर मिरर करें</translation> <translation id="5317780077021120954">सहेजें</translation> <translation id="5319782540886810524">लातवियाई कीबोर्ड</translation> +<translation id="532247166573571973">हो सकता है कि सर्वर तक पहुंचा नहीं जा सकता हो. बाद में पुन: प्रयास करें.</translation> <translation id="5323213332664049067">लैटिन अमेरिकी</translation> <translation id="532360961509278431">"$1": $2 खोलने में असमर्थ</translation> <translation id="5324674707192845912">डिवाइस का दूरस्थ रूप से पता लगाने, वाइप करने और उसे लॉक करने की क्षमता को अक्षम करने के लिए आप Google से इस <ph name="DEVICE_TYPE" /> का नामांकन रद्द करने वाले हैं. इसके लिए पुन: बूट करने की आवश्यकता होगी. क्या आप जारी रखना चाहते हैं?</translation> @@ -2994,11 +3009,11 @@ <translation id="5390284375844109566">अनुक्रमित डेटाबेस</translation> <translation id="5392544185395226057">स्थानीय क्लाइंट के लिए समर्थन सक्षम करें.</translation> <translation id="5393125431335030955">यह प्लग इन केवल डेस्कटॉप पर काम करता है.</translation> -<translation id="5393559999218790205">UI कंपोज़िटर ऐनिमेशन टाइमलाइन अक्षम करें</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> पर <ph name="PEPPER_PLUGIN_NAME" /> आपके कंप्यूटर की पहुंच चाहता है.</translation> <translation id="539755880180803351">वेब फ़ॉर्म पर स्वतः-भरण फ़ील्ड प्रकार के पूर्वानुमानों के साथ प्लेसहोल्डर टेक्स्ट के रूप में टिप्पणी करता है.</translation> <translation id="5397578532367286026">इस उपयोगकर्ता के उपयोग और इतिहास की प्रबंधक (<ph name="MANAGER_EMAIL" />) द्वारा chrome.com पर समीक्षा की जा सकती है.</translation> <translation id="5397794290049113714">आप</translation> +<translation id="5398572795982417028">सीमा से बाहर के पृष्ठ का संदर्भ, सीमा <ph name="MAXIMUM_PAGE" /> की है</translation> <translation id="5398824043967640339">अन्य साइटों से <ph name="COUNT" /></translation> <translation id="5399158067281117682">पिन मेल नहीं खाते!</translation> <translation id="5400640815024374115">विश्वसनीय प्लेटफ़ॉर्म मॉड्यूल (TPM) चिप अक्षम या अनुपस्थित है.</translation> @@ -3018,7 +3033,7 @@ <translation id="5423849171846380976">सक्रिय हुआ</translation> <translation id="5425470845862293575">प्रयोगात्मक DirectWrite फ़ॉन्ट रेंडरिंग सिस्टम का उपयोग सक्षम करता है.</translation> <translation id="5425722269016440406">Smart Lock बंद करने के लिए आपको ऑनलाइन होना होगा क्योंकि यह सेटिंग आपके फ़ोन और अन्य डिवाइस से समन्वयित की जाती है. कृपया पहले किसी नेटवर्क से कनेक्ट करें.</translation> -<translation id="5426623592374109001">UI में कंपोज़िट किए गए ऐनिमेशन के पुराने हस्तक्षेप करने वाले ऐनिमेशन सबसिस्टम का उपयोग करें.</translation> +<translation id="5425863515030416387">सभी डिवाइस पर आसानी से प्रवेश करें</translation> <translation id="5427459444770871191">&घड़ी की दिशा में घुमाएं</translation> <translation id="5428105026674456456">स्पैनिश</translation> <translation id="542872847390508405">आप एक अतिथि के रूप में ब्राउज़ कर रहे हैं</translation> @@ -3043,6 +3058,7 @@ <translation id="5451646087589576080">फ़्रेम &जानकारी देखें</translation> <translation id="5453029940327926427">टैब बंद करें</translation> <translation id="5453632173748266363">सिरिलिक</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> के साथ</translation> <translation id="5457113250005438886">अमान्य</translation> <translation id="5457459357461771897">अपने कंप्यूटर से फ़ोटो, संगीत और अन्य मीडिया पढ़ें और हटाएं</translation> <translation id="5457599981699367932">अतिथि के रूप में ब्राउज़ करें</translation> @@ -3212,7 +3228,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">पिंच स्केल</translation> <translation id="5710406368443808765">ओह! डिवाइस टोकन और आईडी संग्रहीत करने में सिस्टम विफल रहा.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> प्रतिसाद नहीं दे रहा है. कास्ट करने में असमर्थ.</translation> <translation id="5711983031544731014">अनलॉक करने में असमर्थ है. अपना पासवर्ड डालें.</translation> <translation id="5712966208980506909">यदि सक्षम हो, तो chrome://md-policy URL मटीरियल डिज़ाइन पॉलिसी पृष्ठ को लोड करता है.</translation> <translation id="5715711091495208045">प्लग इन ब्रोकर: <ph name="PLUGIN_NAME" /></translation> @@ -3481,7 +3496,6 @@ <translation id="6111974609785983504">डिफ़ॉल्ट रूप से अनुमत</translation> <translation id="6113134669445407638">WebRTC में Delay Agnostic AEC को अक्षम करें. यदि रिपोर्ट किए गए सिस्टम विलंब बहुत विश्वसनीय हों या यदि आपकी मशीन से अन्य अनुभव सामने आते हों तो इसका उपयोग करें.</translation> <translation id="6116921718742659598">भाषा और अक्षर सेटिंग बदलें</translation> -<translation id="6117536376248197233">रेंडरर में कंपोज़िटर ऐनिमेशन टाइमलाइन अक्षम करें.</translation> <translation id="6120205520491252677">इस पृष्ठ को प्रारंभ स्क्रीन में पिन करें...</translation> <translation id="6122081475643980456">आपका इंटरनेट कनेक्शन नियंत्रित किया जा रहा है</translation> <translation id="6122093587541546701">ईमेल (वैकल्पिक):</translation> @@ -3513,6 +3527,7 @@ <translation id="6163522313638838258">सभी को विस्तृत करें...</translation> <translation id="6164005077879661055">इस पर्यवेक्षित उपयोगकर्ता को निकाले जाने के बाद, पर्यवेक्षित उपयोगकर्ता से संबद्ध सभी फ़ाइलें और स्थानीय डेटा को स्थायी रूप से हटा दिया जाएगा. प्रबंधक द्वारा अब भी इस पर्यवेक्षित उपयोगकर्ता द्वारा देखी गईं वेबसाइटें और सेटिंग <ph name="MANAGEMENT_URL" /> पर देखी जा सकेंगी.</translation> <translation id="6165508094623778733">अधिक जानें</translation> +<translation id="6167008112175207002">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग आपके Google खाते में समन्वयित की जाएंगी ताकि आप उनका उपयोग अपने सभी डिवाइस पर कर सकें. आप <ph name="BEGIN_LINK" /> में इसे बदल सकते हैं</translation> <translation id="6171550060231646388">सिम्युलेट की गईं हार्डवेयर 'Ok Google' सुविधाएं</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">किसी प्रमाणपत्र को चुनें</translation> @@ -3716,6 +3731,7 @@ <translation id="648927581764831596">कोई भी उपलब्ध नहीं</translation> <translation id="6490936204492416398">वेबस्टोर से नया इंस्टॉल करें</translation> <translation id="6492313032770352219">डिस्क पर आकार:</translation> +<translation id="6498249116389603658">&आपकी सभी भाषाएं</translation> <translation id="6499143127267478107">प्रॉक्सी स्क्रिप्ट में होस्ट का समाधान किया जा रहा है...</translation> <translation id="6503077044568424649">सबसे अधिक देखे गए</translation> <translation id="6503256918647795660">स्विस फ़्रेंच कीबोर्ड</translation> @@ -3757,7 +3773,6 @@ <translation id="6555432686520421228">सभी उपयोगकर्ता खातों को निकालें और अपने <ph name="IDS_SHORT_PRODUCT_NAME" /> डिवाइस को बिल्कुल नए जैसा बनाने के लिए रीसेट करें.</translation> <translation id="6556866813142980365">पुन: करें</translation> <translation id="6557565812667414268">केवल उच्च-DPI प्रदर्शनों के लिए सक्षम</translation> -<translation id="655845594391856372">टैब प्रतिसाद नहीं दे रहा है. कास्ट करने में असमर्थ.</translation> <translation id="6559580823502247193">(पहले से ही इस डिवाइस पर)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">पुनर्प्राप्ति चित्र निष्कर्षित की जा रही है...</translation> @@ -3858,6 +3873,7 @@ <translation id="6723354935081862304">Google दस्तावेज़ और अन्य क्लाउड गंतव्यों पर प्रिंट करें. Google क्लाउड प्रिंट पर प्रिंट करने के लिए <ph name="BEGIN_LINK" />प्रवेश<ph name="END_LINK" /> करें.</translation> <translation id="6723661294526996303">बुकमार्क और सेटिंग आयात करें...</translation> <translation id="6723839937902243910">पावर</translation> +<translation id="6725240607822645708">IME को इसके स्वयं के थ्रेड पर चलाएं.</translation> <translation id="6725970970008349185">प्रति पृष्ठ प्रदर्शित किए जाने वाले उम्मीदवारों की संख्या</translation> <translation id="672609503628871915">देखें कि नया क्या है</translation> <translation id="6727005317916125192">पिछला फलक</translation> @@ -3988,12 +4004,11 @@ <translation id="6948736568813450284">डेवलपर के लिए: Google पेमेंट्स API कॉल की सैंडबॉक्स सेवा का उपयोग करें.</translation> <translation id="6949306908218145636">खुले पृष्ठों को बुकमार्क करें...</translation> <translation id="695164542422037736">यदि यह विकल्प सक्षम है, और यदि मुख्यभाग की शैली को background-attachment:fixed के अनुसार रखा गया है, तो पृष्ठभूमि की अपनी स्वयं की सम्मिश्रित परत होगी.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> आपके पासवर्ड को याद करता है और इस डिवाइस में साइटों पर आपको अपने आप प्रवेश कराता है.</translation> <translation id="6955446738988643816">पॉपअप का निरीक्षण करें</translation> <translation id="695755122858488207">अचयनित रेडियो बटन</translation> +<translation id="6960277925159781810">इस डिवाइस पर अपने आप प्रवेश करें</translation> <translation id="696036063053180184">3 सेट (कोई शिफ़्ट नहीं)</translation> <translation id="696203921837389374">मोबाइल डेटा पर समन्वयन सक्षम करें</translation> -<translation id="6964308487066031935">फ़ोल्डर "<ph name="EXTENSION" />" में जोड़ें?</translation> <translation id="6965382102122355670">ठीक</translation> <translation id="6965648386495488594">पोर्ट</translation> <translation id="6965978654500191972">डिवाइस</translation> @@ -4094,7 +4109,6 @@ <translation id="7076293881109082629">प्रवेश किया जा रहा है...</translation> <translation id="7077829361966535409">साइन-इन पृष्ठ वर्तमान प्रॉक्सी सेटिंग का उपयोग करके लोड होने में विफल रहा. कृपया <ph name="GAIA_RELOAD_LINK_START" />पुन: प्रवेश करने का प्रयास करें<ph name="GAIA_RELOAD_LINK_END" />, या अलग-अलग <ph name="PROXY_SETTINGS_LINK_START" />प्रॉक्सी सेटिंग<ph name="PROXY_SETTINGS_LINK_END" /> का उपयोग करें.</translation> <translation id="7077872827894353012">उपेक्षित प्रोटोकॉल हैंडलर</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" चेक किए हुए फ़ोल्डर में चित्र, वीडियो और ध्वनि फ़ाइलों को पढ़ने और हटाने में सक्षम हो जाएगा.</translation> <translation id="708060913198414444">ऑडियो के पते को कॉ&पी करें</translation> <translation id="708187310695946552">सत्र पुनः स्थापन बबल UI</translation> <translation id="7082055294850503883">डिफ़ॉल्ट रूप से CapsLock स्थिति और इनपुट लोअरकेस को अनदेखा करें</translation> @@ -4238,6 +4252,8 @@ <translation id="7313804056609272439">वियतनामी इनपुट पद्धति (VNI)</translation> <translation id="7314244761674113881">सॉक्स होस्ट</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (वर्तमान)</translation> +<translation id="7321545336522791733">सर्वर पहुंच योग्य नहीं है</translation> +<translation id="7324841169865301118">डेस्कटॉप साझा के लिए उपयोगकर्ता को टैब चुनने के लिए सक्षम बनाता है.</translation> <translation id="7325437708553334317">उच्च कंट्रास्ट एक्सटेंशन</translation> <translation id="7326565110843845436">टचपैड तीन-अंगुली-क्लिक</translation> <translation id="73289266812733869">अचयनित</translation> @@ -4464,7 +4480,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" "<ph name="EXTENSION_NAME" />" को निकालना चाहता है.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> इस भाषा में प्रदर्शित है</translation> <translation id="7654941827281939388">यह खाता पहले से ही इस कंप्यूटर पर उपयोग किया जा रहा है.</translation> -<translation id="7655165758820095116">MediaSource ऑब्जेक्ट JavaScript को मीडिया डेटा को सीधे किसी वीडियो तत्व पर भेजने देता है.</translation> <translation id="7658239707568436148">अभी नहीं</translation> <translation id="7659584679870740384">आप इस डिवाइस का उपयोग करने के लिए अधिकृत नहीं हैं. कृपया प्रवेश अनुमति के लिए नियंत्रक से संपर्क करें.</translation> <translation id="7664620655576155379">असमर्थित ब्लूटूथ डिवाइस: "<ph name="DEVICE_NAME" />".</translation> @@ -4595,6 +4610,7 @@ <translation id="7861215335140947162">&डाउनलोड</translation> <translation id="7864539943188674973">ब्लूटूथ अक्षम करें</translation> <translation id="7868891395842935202">API प्रयोगों का एक्सेस नियंत्रित करने के लिए प्रयोगात्मक फ़्रेमवर्क सक्षम करता है.</translation> +<translation id="7870576007982733437">लागू होने पर सिस्टम डाउनलोड प्रबंधक का उपयोग करें.</translation> <translation id="7870790288828963061">अधिक नए वर्शन वाला कोई भी कियोस्क ऐप नहीं मिला. अपडेट करने के लिए कुछ नहीं है. कृपया USB स्टिक को निकालें.</translation> <translation id="787150342916295244">क्रेडिट कार्ड स्कैन करना</translation> <translation id="7874357055309047713">हमेशा सभी साइटों पर चलाएं</translation> @@ -4637,7 +4653,6 @@ <translation id="7918257978052780342">नामांकित करें</translation> <translation id="7920092496846849526">आपने अपने अभिभावक से पूछा था कि इस पृष्ठ पर जाना ठीक है या नहीं.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> की प्रतीक्षा कर रहा है...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> आपके पासवर्ड को याद करता है और संपूर्ण डिवाइसों पर ऐप्स और साइटों में आपको अपने आप प्रवेश कराता है.</translation> <translation id="7925686952655276919">समन्वयन के लिए मोबाइल डेटा का उपयोग न करें</translation> <translation id="7926906273904422255">गैर-सुरक्षित मूल को गैर-सुरक्षित के रूप में या "संदिग्ध" के रूप में चिह्नित करें.</translation> <translation id="7928710562641958568">डिवाइस निकालें</translation> @@ -4699,7 +4714,6 @@ अपनी मुख्य फ़ाइल को किसी सुरक्षित स्थान पर रखें. आपको अपने एक्सटेंशन के नए वर्शन बनाने के लिए इसकी आवश्यकता होगी.</translation> <translation id="799923393800005025">देख सकते हैं</translation> <translation id="7999338963698132743">नया कार्य प्रबंधक</translation> -<translation id="8000004253404706714">रेंडरर में कंपोज़िट किए गए ऐनिमेशन के पुराने हस्तक्षेप करने वाले ऐनिमेशन सबसिस्टम का उपयोग करें.</translation> <translation id="8004582292198964060">ब्राउज़र</translation> <translation id="8007030362289124303">बैटरी कम</translation> <translation id="8008356846765065031">इंटरनेट डिस्कनेक्ट हो गया है. कृपया अपना इंटरनेट कनेक्शन जांचें.</translation> @@ -4828,6 +4842,7 @@ <translation id="8185331656081929126">नेटवर्क पर नए प्रिंटर का पता लगाए जाने पर सूचनाएं दिखाएं</translation> <translation id="8186609076106987817">सर्वर को फ़ाइल नहीं मिल सकी.</translation> <translation id="8186706823560132848">सॉफ़्टवेयर</translation> +<translation id="8188120771410500975">&लेख फ़ील्ड की वर्तनी जांचें</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" />, और <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> अन्य</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> से कनेक्ट हो रहा है</translation> <translation id="8191230140820435481">अपने ऐप्स , एक्सटेंशन, और थीम प्रबंधित करें</translation> @@ -5220,6 +5235,7 @@ <translation id="8765985713192161328">हैंडलर प्रबंधित करें...</translation> <translation id="8766796754185931010">कोटोएरी</translation> <translation id="8767072502252310690">उपयोगकर्ता</translation> +<translation id="8768367823103160496">माउस कर्सर लॉक</translation> <translation id="8769662576926275897">कार्ड के विवरण</translation> <translation id="8770196827482281187">पारसी इनपुट पद्धति (ISIRI 2901 लेआउट)</translation> <translation id="8774934320277480003">शीर्ष हाशिया</translation> @@ -5239,6 +5255,7 @@ <translation id="8795668016723474529">कोई क्रेडिट कार्ड जोड़ें</translation> <translation id="8795916974678578410">नई विंडो</translation> <translation id="8798099450830957504">सामान्य</translation> +<translation id="8799127529310003270">सक्षम होने पर, InputConnection कॉल IME थ्रेड पर चलाए जाते हैं और कोई प्रतिलिपि संपादक रखने के बजाय, प्रत्येक InputConnection कॉल सीधे रेंडरर से बात करेगा.</translation> <translation id="8799839487311913894">"पासवर्ड बदलें" फ़ॉर्म सबमिट करने के बाद पासवर्ड प्रबंधक में पासवर्ड को अपडेट करना सक्षम करें.</translation> <translation id="8800004011501252845">इसके लिए गंतव्य दिखा रहा है:</translation> <translation id="8800420788467349919">आवाज़: <ph name="PRECENTAGE" />%</translation> @@ -5264,6 +5281,7 @@ <translation id="8841142799574815336">विज़ुअल व्यूपोर्ट निष्क्रिय करें.</translation> <translation id="884264119367021077">शिपिंग पता</translation> <translation id="8844238624737526720">chrome कार्य प्रबंधक के नए और ऑप्टिमाइज़ किए गए कार्यान्वयन का उपयोग करें.</translation> +<translation id="8845001906332463065">सहायता प्राप्त करें</translation> <translation id="8846141544112579928">कीबोर्ड खोजा जा रहा है...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift कुंजी मोड स्विच</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index a90fd747..1b985c6 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">Polazna stranica, web-stranica nove kartice, tražilica i prikvačene kartice vratit će se na zadano. Onemogućit će se sva proširenja i izbrisati privremeni podaci kao što su kolačići. Vaše oznake, povijest i spremljene zaporke neće se izbrisati.</translation> <translation id="1434886155212424586">Početna je stranica web-stranica nove kartice</translation> <translation id="1435550882135542937">Redizajn alatne trake proširenja</translation> +<translation id="1436402875660227532">Napomena: te se postavke više ne upotrebljavaju u ovom sustavu, ali ih i dalje možete pregledavati i uređivati.</translation> <translation id="1436784010935106834">Uklonjeno</translation> <translation id="1438632560381091872">Uključi zvuk na karticama</translation> <translation id="1441841714100794440">vijetnamska tipkovnica (teleks)</translation> @@ -1316,6 +1317,7 @@ <translation id="2889064240420137087">Otvori vezu sa...</translation> <translation id="2889925978073739256">Nastavi blokirati dodatke izvan testnog okruženja</translation> <translation id="2890624088306605051">Dohvati samo sinkronizirane postavke i podatke</translation> +<translation id="2890678560483811744">Referenca na stranicu izvan je granica</translation> <translation id="2893168226686371498">Zadani preglednik</translation> <translation id="289426338439836048">Druga mobilna mreža...</translation> <translation id="2894745200702272315">Omogućuje eksperimentalnu verziju značajki otkrivanja pokretača značajke "OK Google" ovisnih o hardveru.</translation> @@ -1344,7 +1346,6 @@ <translation id="2925966894897775835">Tablice</translation> <translation id="2927017729816812676">Pohrana predmemorije</translation> <translation id="2927657246008729253">Promijeni...</translation> -<translation id="2928415919076124714">Sakrij alatnu traku na prikazu na cijelom zaslonu</translation> <translation id="2928526264833629376">Nastavi na Hangouts</translation> <translation id="2930644991850369934">Došlo je do pogreške tijekom preuzimanja slike za oporavak sustava. Izgubljena je mrežna veza.</translation> <translation id="293111069139560936">Polici omogućuje minimiziranje prozora ako se na polici klikne stavka s kojom je povezan samo jedan prozor koji je već aktivan.</translation> @@ -1589,7 +1590,6 @@ <translation id="3289566588497100676">Unos jednostavnih simbola</translation> <translation id="3289856944988573801">Da biste provjerili ima li ažuriranja, upotrijebite Ethernet ili Wi-Fi.</translation> <translation id="3293325348208285494">Brzi početak</translation> -<translation id="3293894718455402932">Proširenje "<ph name="EXTENSION" />" moći će čitati i upisivati slikovne, zvučne i datoteke videozapisa u označene mape.</translation> <translation id="3294437725009624529">Gost</translation> <translation id="329650768420594634">Upozorenje proširenja paketa</translation> <translation id="3296763833017966289">Gruzijski</translation> @@ -1646,6 +1646,7 @@ <translation id="3338239663705455570">Slovenska tipkovnica</translation> <translation id="3340978935015468852">postavke</translation> <translation id="3341703758641437857">Dozvoli pristup URL-ovima datoteke</translation> +<translation id="3343813173145836998">Jednostavna prijava na ovom uređaju</translation> <translation id="3344786168130157628">Naziv pristupne točke:</translation> <translation id="3345135638360864351">Slanje zahtjeva za pristup ovoj web-lokaciji korisniku <ph name="NAME" /> nije uspjelo. Pokušaj ponovo.</translation> <translation id="3345886924813989455">Nije pronađen podržani preglednik</translation> @@ -2285,6 +2286,7 @@ <translation id="4268025649754414643">Šifriranje ključa</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Verzija <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Nema rezultata</translation> <translation id="4274187853770964845">Pogreška u sinkronizaciji: zaustavite i ponovo pokrenite sinkronizaciju.</translation> <translation id="4275830172053184480">Ponovo pokrenite svoj uređaj</translation> <translation id="4276796043975446927">Dobro došli u Chromebox za videokonferencije</translation> @@ -2354,6 +2356,7 @@ <translation id="4378551569595875038">Povezivanje...</translation> <translation id="438122767399415311">Nametni smjer sučelja</translation> <translation id="4381849418013903196">Dvotočka</translation> +<translation id="4383192539467954373">Automatska prijava na različitim uređajima</translation> <translation id="4384652540891215547">Aktiviranje proširenja</translation> <translation id="438503109373656455">Vihor</translation> <translation id="4387554346626014084">Omogući sinkronizaciju pokretača aplikacija. Ovime se omogućuju i Mape ondje gdje su dostupne (sustav koji nije OSX).</translation> @@ -2386,6 +2389,7 @@ <translation id="444267095790823769">Iznimke za zaštićeni sadržaj</translation> <translation id="4443536555189480885">&Help (Pomoć)</translation> <translation id="4444304522807523469">pristupiti skenerima dokumenata priključenim preko USB-a ili na lokalnu mrežu</translation> +<translation id="4445559854264555037">Ne vidite svoj uređaj? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Zrcaljeno</translation> <translation id="4447465454292850432">Baterija:</translation> <translation id="4449935293120761385">O Automatskom popunjavanju</translation> @@ -2644,6 +2648,7 @@ <translation id="485316830061041779">Njemački</translation> <translation id="4856478137399998590">Vaša mobilna podatkovna usluga aktivirana je i spremna za upotrebu</translation> <translation id="4858913220355269194">Zvone</translation> +<translation id="4860565041166337978">Preuzimanjima rukuje upravitelj preuzimanja sustava kada je to primjenjivo.</translation> <translation id="48607902311828362">Način rada u zrakoplovu</translation> <translation id="4861833787540810454">&Reproduciraj</translation> <translation id="4862050643946421924">Dodavanje uređaja...</translation> @@ -2727,7 +2732,6 @@ <translation id="4977942889532008999">Potvrdite pristup</translation> <translation id="4982718461356080574">Skrivanje gumba za zatvaranje na nanizanim neaktivnim karticama</translation> <translation id="498294082491145744">Mijenja postavke koje upravljaju pristupom web-lokacija značajkama kao što su kolačići, JavaScript, priključci, geolokacija, mikrofon, fotoaparat itd.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Stranice</translation> <translation id="4988792151665380515">Izvoz javnog ključa nije uspio.</translation> <translation id="49896407730300355">Zakreni u smjeru suprotnom od &kretanja kazaljke na satu</translation> @@ -2916,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (izvan procesa)</translation> <translation id="526926484727016706">Prema zadanim postavkama odbija sva dopuštenja za sve iframeove. Odobravanje određenih dopuštenja za određeni iframe može uključivati navođenje naziva tih dopuštenja kao vrijednosti atributa novog iframea.</translation> <translation id="5269977353971873915">Ispis nije uspio</translation> -<translation id="5270884342523754894">Proširenje "<ph name="EXTENSION" />" moći će čitati slikovne, zvučne i datoteke videozapisa u označenim mapama.</translation> <translation id="5271247532544265821">Sakrij način pojednostavljenog/tradicionalnog kineskog</translation> <translation id="5271549068863921519">Spremi zaporku</translation> <translation id="5273628206174272911">Eksperimentalna navigacija po povijesti kao odgovor na vodoravno pomicanje preko ruba.</translation> @@ -3006,11 +3009,11 @@ <translation id="5390284375844109566">Indeksirana baza podataka</translation> <translation id="5392544185395226057">Omogući podršku za lokalni klijent.</translation> <translation id="5393125431335030955">Taj dodatak funkcionira samo na računalu.</translation> -<translation id="5393559999218790205">Onemogući vremenske trake animacije alata za slaganje (compositing) na korisničkom sučelju</translation> <translation id="5396126354477659676">Dodatak <ph name="PEPPER_PLUGIN_NAME" /> na domeni <ph name="PEPPER_PLUGIN_DOMAIN" /> želi pristupiti vašem računalu.</translation> <translation id="539755880180803351">U web-obrasce postavlja bilješku o vrsti predviđanja polja s automatskim popunjavanjem kao tekst rezerviranog mjesta.</translation> <translation id="5397578532367286026">Upravitelj (<ph name="MANAGER_EMAIL" />) može pregledavati upotrebu i povijest tog korisnika na web-lokaciji chrome.com.</translation> <translation id="5397794290049113714">Vi</translation> +<translation id="5398572795982417028">Referenca na stranicu izvan je granica, a granica je <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> s drugih web-lokacija</translation> <translation id="5399158067281117682">PIN-ovi se ne podudaraju!</translation> <translation id="5400640815024374115">Čip modula pouzdane platforme onemogućen je ili ga nema.</translation> @@ -3030,7 +3033,7 @@ <translation id="5423849171846380976">Aktivirano</translation> <translation id="5425470845862293575">Omogućuje upotrebu eksperimentalnog sustava za generiranje fontova DirectWrite.</translation> <translation id="5425722269016440406">Morate biti online da biste isključili Smart Lock jer se ta postavka sinkronizira s vašim telefonom i drugim uređajima. Prvo se povežite s mrežom.</translation> -<translation id="5426623592374109001">Koristi stari intruzivni podsustav za animacije nastale slaganjem (compositingom) na korisničkom sučelju.</translation> +<translation id="5425863515030416387">Jednostavna prijava na različitim uređajima</translation> <translation id="5427459444770871191">Zakreni u &smjeru kretanja kazaljke na satu</translation> <translation id="5428105026674456456">Španjolski</translation> <translation id="542872847390508405">Pregledavate kao gost</translation> @@ -3225,7 +3228,6 @@ <translation id="5708171344853220004">Microsoftov glavni naziv</translation> <translation id="5709885306771508267">Skaliranje spajanjem prstiju</translation> <translation id="5710406368443808765">Ups! Sustav nije uspio pohraniti token i ID uređaja.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> ne odgovara. Emitiranje nije uspjelo.</translation> <translation id="5711983031544731014">Otključavanje nije moguće. Unesite svoju zaporku.</translation> <translation id="5712966208980506909">Ako je to omogućeno, URL chrome://md-policy učitava stranicu pravila materijalnog dizajna.</translation> <translation id="5715711091495208045">Broker dodatka: <ph name="PLUGIN_NAME" /></translation> @@ -3492,7 +3494,6 @@ <translation id="6111974609785983504">Dopušteno prema zadanim postavkama</translation> <translation id="6113134669445407638">Onemogućuje Delay Agnostic AEC u WebRTC-u. Upotrijebite ako su prijavljena kašnjenja sustava vrlo pouzdana ili ako drugi primaju odjek s vašeg uređaja.</translation> <translation id="6116921718742659598">Promijenite postavke jezika i unosa</translation> -<translation id="6117536376248197233">Onemogući vremenske trake animacije alata za slaganje (compositing) u ispunjivačima.</translation> <translation id="6120205520491252677">Prikvači ovu stranicu na zaslon Start...</translation> <translation id="6122081475643980456">Internetskom vezom upravlja proširenje</translation> <translation id="6122093587541546701">E-adresa (nije obavezno):</translation> @@ -3524,6 +3525,7 @@ <translation id="6163522313638838258">Proširi sve...</translation> <translation id="6164005077879661055">Sve datoteke i lokalni podaci povezani sa zaštićenim korisnikom trajno će se izbrisati kada se taj korisnik ukloni. Web-lokacije koje je taj korisnik posjetio i njegove postavke mogu i dalje biti vidljive upravitelju na adresi <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Saznajte više</translation> +<translation id="6167008112175207002">Vaše oznake, povijest, zaporke i ostale postavke sinkronizirat će se s vašim Google računom kako biste ih mogli upotrebljavati na svim svojim uređajima. To možete promijeniti ovdje: <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Simulirane hardverske značajke za "OK Google"</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">Odabir certifikata</translation> @@ -3769,7 +3771,6 @@ <translation id="6555432686520421228">Uklonite sve korisničke račune i ponovo postavite svoj uređaj <ph name="IDS_SHORT_PRODUCT_NAME" /> kao da je novi.</translation> <translation id="6556866813142980365">Ponovi</translation> <translation id="6557565812667414268">Omogućeno samo za zaslone s visokom razlučivosti</translation> -<translation id="655845594391856372">Kartica ne odgovara. Emitiranje nije uspjelo.</translation> <translation id="6559580823502247193">(već na ovom uređaju)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Izdvajanje slike za oporavak...</translation> @@ -3870,6 +3871,7 @@ <translation id="6723354935081862304">Ispisujte u Google dokumente i druga odredišta u oblaku. <ph name="BEGIN_LINK" />Prijavite se<ph name="END_LINK" /> za ispis u Google Cloud Print.</translation> <translation id="6723661294526996303">Uvoz oznaka i postavki...</translation> <translation id="6723839937902243910">Napajanje</translation> +<translation id="6725240607822645708">Pokreni način unosa na njegovoj vlastitoj niti.</translation> <translation id="6725970970008349185">Broj kandidata za prikazivanje po stranici</translation> <translation id="672609503628871915">Pogledajte što je novo</translation> <translation id="6727005317916125192">Prethodno okno</translation> @@ -3999,12 +4001,11 @@ <translation id="6948736568813450284">Za razvojne programere: upotrijebite uslugu testnog okruženja za pozive API-ja Google Paymentsa.</translation> <translation id="6949306908218145636">Označavanje otvorenih stranica...</translation> <translation id="695164542422037736">Ako je ta opcija omogućena i ako je stil tijela "background-attachment:fixed", pozadina će imati vlastiti kompozitni sloj.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> pamti vaše zaporke i automatski vas prijavljuje na web-lokacije na ovom uređaju.</translation> <translation id="6955446738988643816">Provjeri skočni prozor</translation> <translation id="695755122858488207">Neoznačeni izborni gumb</translation> +<translation id="6960277925159781810">Automatska prijava na ovom uređaju</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Omogući sinkronizaciju putem mobilnih podataka</translation> -<translation id="6964308487066031935">Želite li dodati mape u proširenje "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">U redu</translation> <translation id="6965648386495488594">Priključak</translation> <translation id="6965978654500191972">Uređaj</translation> @@ -4102,7 +4103,6 @@ <translation id="7076293881109082629">Prijava</translation> <translation id="7077829361966535409">Nije uspjelo učitavanje stranice za prijavu pomoću trenutačnih postavki proxy poslužitelja. <ph name="GAIA_RELOAD_LINK_START" />Pokušajte se ponovo prijaviti<ph name="GAIA_RELOAD_LINK_END" /> ili upotrijebite druge <ph name="PROXY_SETTINGS_LINK_START" />postavke proxy poslužitelja<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Zanemareni rukovatelje protokolom</translation> -<translation id="7079038783243627996">Proširenje "<ph name="EXTENSION" />" moći će čitati i brisati slikovne, zvučne i datoteke videozapisa u označenim mapama.</translation> <translation id="708060913198414444">K&opiraj adresu audiozapisa</translation> <translation id="708187310695946552">Korisničko sučelje za obnovu sesije u oblačićima</translation> <translation id="7082055294850503883">Zanemari status "CapsLock" i prema zadanim postavkama unosi mala slova</translation> @@ -4473,7 +4473,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" želi ukloniti proširenje "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772">Proizvod <ph name="PRODUCT_NAME" /> prikazan je na ovom jeziku</translation> <translation id="7654941827281939388">Ovaj se račun već upotrebljava na ovom računalu.</translation> -<translation id="7655165758820095116">Objekt MediaSource omogućuje JavaScriptu slanje medijskih podataka izravno u videoelement.</translation> <translation id="7658239707568436148">Odustani</translation> <translation id="7659584679870740384">Niste ovlašteni za upotrebu ovog uređaja. Zamolite administratora da vam dopusti prijavu.</translation> <translation id="7664620655576155379">Nepodržani Bluetooth uređaj: "<ph name="DEVICE_NAME" />".</translation> @@ -4604,6 +4603,7 @@ <translation id="7861215335140947162">&Preuzimanje</translation> <translation id="7864539943188674973">Onemogući Bluetooth</translation> <translation id="7868891395842935202">Omogućuje eksperimentalni okvir za kontrolu pristupa eksperimentima API-ja.</translation> +<translation id="7870576007982733437">Upotrijebi upravitelj preuzimanja sustava kada je to primjenjivo</translation> <translation id="7870790288828963061">Nisu pronađene aplikacije kioska s novijom verzijom. Nema ažuriranja. Uklonite USB privjesak.</translation> <translation id="787150342916295244">Skeniranje kreditne kartice</translation> <translation id="7874357055309047713">Uvijek pokreni na svim web-lokacijama</translation> @@ -4646,7 +4646,6 @@ <translation id="7918257978052780342">Registriraj</translation> <translation id="7920092496846849526">Pitao si roditelja smiješ li otvoriti tu stranicu.</translation> <translation id="7925285046818567682">Čekanje <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> pamti vaše zaporke i automatski vas prijavljuje u aplikacije i na web-lokacije na svim uređajima.</translation> <translation id="7925686952655276919">Ne upotrebljavaj mobilne podatke za sinkronizaciju</translation> <translation id="7926906273904422255">Označi nesigurne izvore kao nesigurne ili "sumnjive".</translation> <translation id="7928710562641958568">Izbaci uređaj</translation> @@ -4708,7 +4707,6 @@ Ključnu datoteku čuvajte na sigurnom mjestu. Trebat će vam za stvaranje novih verzija proširenja.</translation> <translation id="799923393800005025">Može pregledavati</translation> <translation id="7999338963698132743">Novi upravitelj zadataka</translation> -<translation id="8000004253404706714">Koristi stari intruzivni podsustav za animacije nastale slaganjem (compositingom) u ispunjivačima.</translation> <translation id="8004582292198964060">Preglednik</translation> <translation id="8007030362289124303">Baterija skoro prazna</translation> <translation id="8008356846765065031">Prekinuta je veza s internetom. Provjerite internetsku vezu.</translation> @@ -5230,6 +5228,7 @@ <translation id="8765985713192161328">Upravljanje rukovateljima...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Broj korisnika:</translation> +<translation id="8768367823103160496">Zaključavanje pokazivača miša</translation> <translation id="8769662576926275897">Podaci o kartici</translation> <translation id="8770196827482281187">Perzijski način unosa (izgled ISIRI 2901)</translation> <translation id="8774934320277480003">Gornja margina</translation> @@ -5249,6 +5248,7 @@ <translation id="8795668016723474529">Dodaj kreditnu karticu</translation> <translation id="8795916974678578410">Novi prozor</translation> <translation id="8798099450830957504">Zadano</translation> +<translation id="8799127529310003270">Ako je omogućeno, InputConnection poziva pokretanje na niti načina unosa pri čemu svaki poziv InputConnectiona komunicira izravno s ispunjivačem, a ne zadržava replikacijski uređivač.</translation> <translation id="8799839487311913894">Omogućuje ažuriranje zaporke u upravitelju zaporki nakon slanja obrasca za promjenu zaporke.</translation> <translation id="8800004011501252845">Prikazuju se odredišta za korisnika</translation> <translation id="8800420788467349919">Glasnoća: <ph name="PRECENTAGE" />%</translation> @@ -5274,6 +5274,7 @@ <translation id="8841142799574815336">Inertni vidljivi dio.</translation> <translation id="884264119367021077">Adresa za dostavu</translation> <translation id="8844238624737526720">Upotreba nove i optimizirane implementacije Chromeovog upravitelja zadataka.</translation> +<translation id="8845001906332463065">Zatražite pomoć</translation> <translation id="8846141544112579928">Traženje tipkovnice...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Prijelaz na način tipke "Shift"</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 1a59c263..9e33d6f4 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Könyvjelző hozzáadása ehhez az oldalhoz...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> elem törlése...</translation> <translation id="1048597748939794622">Kötelezően engedélyezve van az összes rétegen</translation> +<translation id="1049795001945932310">&Nyelvi beállítások</translation> <translation id="1049926623896334335">Word-dokumentum</translation> <translation id="1054153489933238809">Az eredeti &kép megnyitása új lapon</translation> <translation id="1055806300943943258">Bluetooth- és USB-eszközök keresése…</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Átírás (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automatikus névszerverek</translation> <translation id="1215411991991485844">Új háttéralkalmazás hozzáadva</translation> +<translation id="1216954813581739968">Lap engedélyezése az asztal megosztásánál</translation> <translation id="121827551500866099">Összes letöltés megjelenítése...</translation> <translation id="122082903575839559">Tanúsítvány aláírási algoritmusa</translation> <translation id="1221024147024329929">PKCS #1 MD2 RSA titkosítással</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Az automatikus bejelentkezés nem sikerült</translation> <translation id="1293556467332435079">Fájlok</translation> <translation id="1294298200424241932">Bizalmi beállítások szerkesztése:</translation> +<translation id="1295794900245526845">Válassza ki a(z) <ph name="PASSWORD_MANAGER_BRAND" /> szolgáltatással mentett fiókját a bejelentkezéshez</translation> <translation id="1297175357211070620">Cél</translation> <translation id="1297922636971898492">A Google Drive jelenleg nem érhető el. A feltöltés automatikusan újrakezdődik, amint a Google Drive elérhetővé válik.</translation> <translation id="1300861494336759522">Windows asztali keresés átirányítása</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Ez a művelet visszaállítja a kezdőoldalt, az új lap oldalt, a keresőmotort és a rögzített lapokat. Kikapcsol továbbá minden bővítményt, és törli az ideiglenes adatokat, például a cookie-kat. Könyvjelzői, előzményei és mentett jelszavai megmaradnak.</translation> <translation id="1434886155212424586">Az Új lap oldal a kezdőoldal</translation> <translation id="1435550882135542937">Új kialakítású eszköztár</translation> +<translation id="1436402875660227532">Megjegyzés: Ezeket a beállításokat a továbbiakban nem használja ezen a rendszeren, de továbbra is megtekintheti és szerkesztheti őket.</translation> <translation id="1436784010935106834">Eltávolítva</translation> <translation id="1438632560381091872">Lapok némításának feloldása</translation> <translation id="1441841714100794440">Vietnami billentyűzet (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Virtuális billentyűzet támogatásának engedélyezése.</translation> <translation id="1474079335130556426">Háttérmód engedélyezése a Push API számára. Ez lehetővé teszi a Chrome számára, hogy az utolsó ablak bezárása után is fusson, illetve, hogy elinduljon az operációs rendszer indulásakor, ha a Push API ezt igényli.</translation> <translation id="1474339897586437869">A(z) „<ph name="FILENAME" />” feltöltése nem történt meg. Nincs elegendő szabad terület a Google Drive-on.</translation> +<translation id="1476607407192946488">&Nyelvi beállítások</translation> <translation id="1476949146811612304">Állítsa be, hogy a böngésző melyik keresőmotort használja, amikor Ön a <ph name="BEGIN_LINK" />cím- és keresősávból<ph name="END_LINK" /> keres.</translation> <translation id="1477301030751268706">Azonosítási API token-gyorsítótára</translation> <translation id="1478340334823509079">Részletek: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Az oldal olyan Natív kliensalkalmazást használ, amely nem működik a számítógépén.</translation> <translation id="1965328510789761112">Saját memória</translation> <translation id="1965624977906726414">Nem rendelkezik speciális engedélyekkel.</translation> +<translation id="1968720524450620475">A műveleti ikonok engedélyezése a webes értesítéseknél.</translation> <translation id="1970746430676306437">Oldal &információinak megtekintése</translation> <translation id="197288927597451399">Megőrzés</translation> <translation id="1973491249112991739">A(z) <ph name="PLUGIN_NAME" /> plug-in letöltése sikertelen volt.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">Használja a - és az = billentyűt a jelöltlista lapozásához</translation> <translation id="2347476388323331511">A szinkronizálás sikertelen</translation> <translation id="2347991999864119449">Én akarom kiválasztani, hogy mikor futtassak beépülő modulokat használó tartalmat</translation> +<translation id="2348165084656290171">A hang megosztásához válassza ki a kívánt lapfület, vagy pedig a teljes képernyőt.</translation> <translation id="2350182423316644347">Alkalmazás indítása...</translation> <translation id="2350796302381711542">Engedélyezi az összes <ph name="PROTOCOL" /> link megnyitását a(z) <ph name="HANDLER_HOSTNAME" /> számára a(z) <ph name="REPLACED_HANDLER_TITLE" /> helyett?</translation> <translation id="2351266942280602854">Nyelv és bevitel</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">Kanadai többnyelvű billentyűzet</translation> <translation id="2478176599153288112">Médiafájl-engedélyek a következőnek: „<ph name="EXTENSION" />”</translation> <translation id="2478830106132467213">Csak akkor oldja fel ezen <ph name="DEVICE_TYPE" /> eszköz lezárását, ha a telefon karnyújtásnyi távolságon belül van.</translation> +<translation id="247949520305900375">Hang megosztása</translation> <translation id="2479780645312551899">Összes beépülő modul futtatása ez alkalommal</translation> <translation id="2480626392695177423">Fél/teljes szélességű központozási mód váltása</translation> <translation id="2481332092278989943">Hozzáadás a polchoz</translation> @@ -1310,6 +1318,7 @@ <translation id="2889064240420137087">Link megnyitása...</translation> <translation id="2889925978073739256">Sandbox-technológiát nem alkalmazó beépülő modulok tiltásának fenntartása</translation> <translation id="2890624088306605051">Csak a szinkronizált beállítások és adatok lekérése</translation> +<translation id="2890678560483811744">Tartományon kívüli oldalra való hivatkozás</translation> <translation id="2893168226686371498">Alapértelmezett böngésző</translation> <translation id="289426338439836048">Egyéb mobilhálózat...</translation> <translation id="2894745200702272315">Engedélyezi az „Ok Google” hotwordérzékelési funkcióinak hardverhez kötött, kísérleti verzióját.</translation> @@ -1338,7 +1347,6 @@ <translation id="2925966894897775835">Táblázatok</translation> <translation id="2927017729816812676">Gyorsítótár</translation> <translation id="2927657246008729253">Módosítás...</translation> -<translation id="2928415919076124714">Eszköztár elrejtése teljes képernyős módban</translation> <translation id="2928526264833629376">Tovább a Hangouts szolgáltatásba</translation> <translation id="2930644991850369934">Probléma lépett fel a helyreállító képfájl letöltése során. A hálózati kapcsolat megszakadt.</translation> <translation id="293111069139560936">Lehetővé teszi a polc számára az ablakok kis méretre váltását, amennyiben olyan polcelemre kattintanak, amelyhez csak egy, már aktív ablak kapcsolódik.</translation> @@ -1462,6 +1470,7 @@ <translation id="3117812041123364382">Lebegő virtuális billentyűzet be-/kikapcsolása</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> Súgó</translation> <translation id="3120430004221004537">Elégtelen titkosítás egy adott művelet esetében a következőn: „<ph name="DEVICE_NAME" />”.</translation> +<translation id="3121260210578524273">A műveleti gombok engedélyezése a webes értesítéseknél.</translation> <translation id="3121793941267913344">A(z) <ph name="IDS_SHORT_PRODUCT_NAME" /> eszköz visszaállítása</translation> <translation id="3122162841865761901">Fejlesztői eszközök – Kísérletek</translation> <translation id="3122464029669770682">CPU</translation> @@ -1582,7 +1591,6 @@ <translation id="3289566588497100676">Egyszerű szimbólumbevitel</translation> <translation id="3289856944988573801">Kérjük, frissítések kereséséhez Ethernetet vagy Wi-Fit használjon.</translation> <translation id="3293325348208285494">Gyors indítás</translation> -<translation id="3293894718455402932">A(z) „<ph name="EXTENSION" />” képeket, videókat és hangfájlokat olvashat és írhat a megjelölt mappákban.</translation> <translation id="3294437725009624529">Vendég</translation> <translation id="329650768420594634">Csomagbővítmény figyelmeztetés</translation> <translation id="3296763833017966289">grúz</translation> @@ -1640,6 +1648,7 @@ <translation id="3338239663705455570">Szlovén billentyűzet</translation> <translation id="3340978935015468852">beállítások</translation> <translation id="3341703758641437857">Fájl URL-ekhez való hozzáférés engedélyezése</translation> +<translation id="3343813173145836998">Jelentkezzen be egyszerűen ezen az eszközön</translation> <translation id="3344786168130157628">Hozzáférési pont neve:</translation> <translation id="3345135638360864351">A webhelyhez való hozzáférésre irányuló kérelme nem jutott el <ph name="NAME" /> felhasználóhoz. Kérjük, próbálkozzon újra.</translation> <translation id="3345886924813989455">Nem található támogatott böngésző</translation> @@ -2118,6 +2127,7 @@ <translation id="3996912167543967198">Visszaállítás...</translation> <translation id="3997015411467176489">Kísérleti vászonfunkciók</translation> <translation id="40027638859996362">Szómozgatás</translation> +<translation id="400554499662786523">Hang megosztásához válassza ki a kívánt lapfület.</translation> <translation id="4012550234655138030">Nyomtatók beállítása és kezelése itt: <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Javítja a következőt: „<ph name="EXTENSION_NAME" />”?</translation> <translation id="4018133169783460046">A <ph name="PRODUCT_NAME" /> megjelenítése ezen a nyelven</translation> @@ -2220,6 +2230,7 @@ <translation id="4180788401304023883">"<ph name="CERTIFICATE_NAME" />" tanúsítványkibocsátói (CA) tanúsítvány törlése?</translation> <translation id="418179967336296930">Orosz fonetikus (YaZHert) billentyűzet</translation> <translation id="4181841719683918333">Nyelvek</translation> +<translation id="4187248015940562149">Engedélyezi a Web Bluetooth funkciót, amely lehetővé teszi a webhelyek számára a Bluetooth-eszközökhöz való csatlakozást, valamint az eszközök vezérlését.</translation> <translation id="4188026131102273494">Kulcsszó:</translation> <translation id="4189406272289638749">Egy bővítmény (<b><ph name="EXTENSION_NAME" /></b>) vezérli ezt a beállítást.</translation> <translation id="4193154014135846272">Google-dokumentum</translation> @@ -2276,6 +2287,7 @@ <translation id="4268025649754414643">Kulcstitkosítás</translation> <translation id="4268574628540273656">URL-cím:</translation> <translation id="4270393598798225102">Verzió <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Nincs találat</translation> <translation id="4274187853770964845">Szinkronizálási hiba: kérjük, állítsa le, majd indítsa újra a szinkronizálást.</translation> <translation id="4275830172053184480">Indítsa újra az eszközt</translation> <translation id="4276796043975446927">Üdvözli a videokonferenciákhoz készült Chromebox!</translation> @@ -2344,6 +2356,7 @@ <translation id="4378551569595875038">Kapcsolódás folyamatban…</translation> <translation id="438122767399415311">Kezelőfelület irányának kényszerítése</translation> <translation id="4381849418013903196">Kettőspont</translation> +<translation id="4383192539467954373">Automatikus bejelentkezés az összes eszközön.</translation> <translation id="4384652540891215547">Bővítmény aktiválása</translation> <translation id="438503109373656455">Ló</translation> <translation id="4387554346626014084">Az Alkalmazásindító szinkronizálásának bekapcsolása. Ezzel bekapcsolja a Mappák szolgáltatást is, ha elérhető (OSX esetében nem).</translation> @@ -2361,6 +2374,7 @@ <translation id="4421932782753506458">Bolyhos</translation> <translation id="4422347585044846479">Könyvjelző szerkesztése ehhez az oldalhoz</translation> <translation id="4422428420715047158">Domain:</translation> +<translation id="4423482519432579560">&Helyesírás-ellenőrzés</translation> <translation id="442477792133831654">Kommunikáció közeli eszközökkel</translation> <translation id="4425149324548788773">Saját meghajtó</translation> <translation id="4428582326923056538">Az Adobe Flash Player kamerával kapcsolatos kivételei eltérőek.</translation> @@ -2375,6 +2389,7 @@ <translation id="444267095790823769">Védett tartalom – kivételek</translation> <translation id="4443536555189480885">&Súgó</translation> <translation id="4444304522807523469">USB-kapcsolaton vagy a helyi hálózaton keresztül csatlakoztatott szkennerek elérése</translation> +<translation id="4445559854264555037">Nem látja az eszközét? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Tükrözött</translation> <translation id="4447465454292850432">Akkumulátor:</translation> <translation id="4449935293120761385">Az Automatikus kitöltésről</translation> @@ -2633,6 +2648,7 @@ <translation id="485316830061041779">német</translation> <translation id="4856478137399998590">Adatszolgáltatását aktiválta, és az használatra kész</translation> <translation id="4858913220355269194">Foci</translation> +<translation id="4860565041166337978">A rendszer letöltéskezelője kezelheti a letöltéseket, amikor alkalmazható.</translation> <translation id="48607902311828362">Repülőgép üzemmód</translation> <translation id="4861833787540810454">&Lejátszás</translation> <translation id="4862050643946421924">Eszköz hozzáadása…</translation> @@ -2716,7 +2732,6 @@ <translation id="4977942889532008999">Hozzáférés megerősítése</translation> <translation id="4982718461356080574">A bezárás gombok elrejtése az inaktív lapokon halmozás esetén</translation> <translation id="498294082491145744">A weboldalak cookie-khoz, JavaScripthez, beépülő modulokhoz, tartózkodási helyhez, mikrofonhoz, kamerához stb. való hozzáférését vezérlő beállítások módosítása.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Oldal</translation> <translation id="4988792151665380515">Nem sikerült a nyilvános kulcs exportálása.</translation> <translation id="49896407730300355">Forgatás &balra</translation> @@ -2905,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (folyamaton kívüli)</translation> <translation id="526926484727016706">Beállításával alapértelmezés szerint az összes iframe-től meg lesz tagadva minden engedély. Ha meg szeretne adni egyes engedélyeket egy adott iframe számára, akkor az új iframe attribútumainak értékeiként fel kell vennie a listára az adott engedélyek nevét.</translation> <translation id="5269977353971873915">A nyomtatás nem sikerült</translation> -<translation id="5270884342523754894">A(z) „<ph name="EXTENSION" />” olvashat képeket, videókat és hangfájlokat a megjelölt mappákban.</translation> <translation id="5271247532544265821">Váltás az egyszerű/hagyományos kínai mód között</translation> <translation id="5271549068863921519">Jelszó mentése</translation> <translation id="5273628206174272911">Kísérleti előzménynavigáció a vízszintes túlgörgetésre válaszul.</translation> @@ -2942,6 +2956,7 @@ <translation id="5316716239522500219">Monitorok tükrözése</translation> <translation id="5317780077021120954">Mentés</translation> <translation id="5319782540886810524">Lett billentyűzet</translation> +<translation id="532247166573571973">Lehet, hogy nem áll rendelkezésre a szerver. Próbálja újra később.</translation> <translation id="5323213332664049067">latin-amerikai</translation> <translation id="532360961509278431">"$1" megnyitása sikertelen: $2</translation> <translation id="5324674707192845912">A <ph name="DEVICE_TYPE" /> Google-regisztrációjának visszavonására készül, amivel letiltja az eszköz távoli helymeghatározásának, törlésének és zárolásának lehetőségét. A művelet végrehajtásához újra kell indítania az eszközt. Folytatja?</translation> @@ -2994,11 +3009,11 @@ <translation id="5390284375844109566">Indexelt adatbázis</translation> <translation id="5392544185395226057">Natív kliens támogatásának engedélyezése.</translation> <translation id="5393125431335030955">Ez a beépülő modul csak az asztalon működik.</translation> -<translation id="5393559999218790205">A kezelőfelület összeállított animációihoz tartozó idővonalak kikapcsolása</translation> <translation id="5396126354477659676">A(z) <ph name="PEPPER_PLUGIN_NAME" /> webhelyen található <ph name="PEPPER_PLUGIN_DOMAIN" /> bővítmény hozzá akar férni a számítógéphez.</translation> <translation id="539755880180803351">Az internetes űrlapokat automatikus kitöltési következtetésekkel mint helyőrző szöveggel látja el.</translation> <translation id="5397578532367286026">A felhasználó használati adatait és előzményeit a kezelő (<ph name="MANAGER_EMAIL" />) a chrome.com webhelyen tekintheti meg.</translation> <translation id="5397794290049113714">Ön</translation> +<translation id="5398572795982417028">Tartományon kívüli oldalra való hivatkozás; a maximális érték <ph name="MAXIMUM_PAGE" />.</translation> <translation id="5398824043967640339"><ph name="COUNT" /> elem más webhelyekről</translation> <translation id="5399158067281117682">A PIN kódok nem egyeznek!</translation> <translation id="5400640815024374115">Megbízható platform modul (TPM) chip letiltva vagy hiányzik.</translation> @@ -3018,7 +3033,7 @@ <translation id="5423849171846380976">Aktiválva</translation> <translation id="5425470845862293575">Letiltja a kísérleti DirectWrite betűmegjelenítő rendszert.</translation> <translation id="5425722269016440406">Online állapotban kell lennie a Smart Lock kikapcsolásához, mivel ezt a beállítást a rendszer szinkronizálja telefonjával és egyéb eszközeivel. Előbb csatlakozzon egy hálózathoz.</translation> -<translation id="5426623592374109001">A régi, tolakodó animált alrendszer használata az összeállított animációknál a kezelőfelületen.</translation> +<translation id="5425863515030416387">Könnyedén bejelentkezhet a különböző eszközein</translation> <translation id="5427459444770871191">Forgatás &jobbra</translation> <translation id="5428105026674456456">spanyol</translation> <translation id="542872847390508405">Vendégként böngészik</translation> @@ -3043,6 +3058,7 @@ <translation id="5451646087589576080">Keret adata&inak megtekintése</translation> <translation id="5453029940327926427">Lapok bezárása</translation> <translation id="5453632173748266363">Cirill</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> szolgáltatóval</translation> <translation id="5457113250005438886">Érvénytelen</translation> <translation id="5457459357461771897">Fotók, zeneszámok és más médiatartalmak olvasása és törlése a számítógépről</translation> <translation id="5457599981699367932">Böngészés vendégként</translation> @@ -3213,7 +3229,6 @@ <translation id="5708171344853220004">Microsoft elsődleges név</translation> <translation id="5709885306771508267">Összehúzással történő méretezés</translation> <translation id="5710406368443808765">Hoppá! A rendszer nem tudta tárolni az eszköz tokenjét és azonosítóját.</translation> -<translation id="571161420693302741">A(z) <ph name="HOST_NAME" /> nem válaszol, ezért az átküldés nem lehetséges.</translation> <translation id="5711983031544731014">Nem lehet végrehajtani a feloldást. Adja meg jelszavát.</translation> <translation id="5712966208980506909">Ha engedélyezve van, a chrome://md-policy URL betölti a Material Design házirend oldalát.</translation> <translation id="5715711091495208045">Beépülő modul közvetítője: <ph name="PLUGIN_NAME" /></translation> @@ -3480,7 +3495,6 @@ <translation id="6111974609785983504">Alapértelmezés szerint engedélyezett</translation> <translation id="6113134669445407638">Agnosztikus AEC-késleltetés kikapcsolása a WebRTC-ben. Akkor használja, ha a jelentett rendszerkésések teljesen megbízhatók, vagy ha mások visszhangot hallanak az Ön gépéből.</translation> <translation id="6116921718742659598">Nyelvi és beviteli beállítások módosítása</translation> -<translation id="6117536376248197233">Az összeállított animációk idővonalainak kikapcsolása a megjelenítőkben.</translation> <translation id="6120205520491252677">Az oldal rögzítése a kezdőképernyőn...</translation> <translation id="6122081475643980456">Internetkapcsolata felett más vette át az irányítást</translation> <translation id="6122093587541546701">E-mail cím (nem kötelező):</translation> @@ -3512,6 +3526,7 @@ <translation id="6163522313638838258">Összes részletes nézete...</translation> <translation id="6164005077879661055">Amikor ezt a felügyelt felhasználót eltávolítják, minden hozzá tartozó fájl és helyi adat véglegesen törlődik. A felügyelt felhasználó felkeresett webhelyeit és beállításait a kezelő továbbra is láthatja a következő címen: <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">További információ</translation> +<translation id="6167008112175207002">A böngésző szinkronizálni fogja a könyvjelzőket, az előzményeket, a jelszavakat és az egyéb beállításokat Google-fiókjával, hogy bármelyik eszközén hozzájuk férjen. Ezt a következő helyen tudja módosítani: <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Szimulált hardver „Ok Google” funkciói</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">Tanúsítvány kiválasztása</translation> @@ -3715,6 +3730,7 @@ <translation id="648927581764831596">Nincs elérhető</translation> <translation id="6490936204492416398">Új bővítmény telepítése az internetes áruházból</translation> <translation id="6492313032770352219">A lemezen elfoglalt hely:</translation> +<translation id="6498249116389603658">&Minden kiválasztott nyelv</translation> <translation id="6499143127267478107">A proxyszkriptben lévő gazdagép feloldása...</translation> <translation id="6503077044568424649">Gyakori</translation> <translation id="6503256918647795660">Svájci francia billentyűzet</translation> @@ -3756,7 +3772,6 @@ <translation id="6555432686520421228">Eltávolít minden felhasználói fiókot, és visszaállítja <ph name="IDS_SHORT_PRODUCT_NAME" /> eszközét a használat kezdetén fennálló állapotába.</translation> <translation id="6556866813142980365">Újra</translation> <translation id="6557565812667414268">Csak nagy képpontsűrűségű kijelzők számára engedélyezett</translation> -<translation id="655845594391856372">A lap nem válaszol, ezért az átküldés nem lehetséges.</translation> <translation id="6559580823502247193">(már az eszközön van)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Helyreállító képfájl kibontása...</translation> @@ -3857,6 +3872,7 @@ <translation id="6723354935081862304">Nyomtatás a Google Dokumentumokba és más, a felhőben lévő helyekre. <ph name="BEGIN_LINK" />Jelentkezzen be<ph name="END_LINK" /> a Google Cloud Printben történő nyomtatáshoz.</translation> <translation id="6723661294526996303">Könyvjelzők és beállítások importálása...</translation> <translation id="6723839937902243910">Energiaellátás</translation> +<translation id="6725240607822645708">IME futtatása a saját szálán.</translation> <translation id="6725970970008349185">Az egy oldalon megjelenített jelöltek száma</translation> <translation id="672609503628871915">Újdonságok</translation> <translation id="6727005317916125192">Előző ablaktábla</translation> @@ -3987,12 +4003,11 @@ <translation id="6948736568813450284">Fejlesztők figyelmébe: a Google Payments API hívásaihoz használja a tesztkörnyezet szolgáltatást.</translation> <translation id="6949306908218145636">Megnyitott oldalak felvétele a könyvjelzők közé...</translation> <translation id="695164542422037736">Ha ez a beállítás aktiválva van, és a törzs stílusa background-attachment:fixed, akkor a háttér saját, összetett réteggel fog rendelkezni.</translation> -<translation id="6952626679169241027">A <ph name="PASSWORD_MANAGER_BRAND" /> megjegyzi a jelszavait, és ezen az eszközön automatikusan bejelentkezteti Önt a webhelyekre.</translation> <translation id="6955446738988643816">Pop-up vizsgálata</translation> <translation id="695755122858488207">Üres választógomb</translation> +<translation id="6960277925159781810">Automatikus bejelentkezés ezen az eszközön</translation> <translation id="696036063053180184">3 készletes (nincs shift)</translation> <translation id="696203921837389374">Szinkronizálás engedélyezése mobiladat-kapcsolaton</translation> -<translation id="6964308487066031935">Hozzáad mappákat a következőhöz: „<ph name="EXTENSION" />”?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Készülék</translation> @@ -4090,7 +4105,6 @@ <translation id="7076293881109082629">Bejelentkezés</translation> <translation id="7077829361966535409">A bejelentkezési oldalt a jelenlegi proxybeállítások mellett nem lehetett betölteni. Kérjük, <ph name="GAIA_RELOAD_LINK_START" />próbáljon újra bejelentkezni<ph name="GAIA_RELOAD_LINK_END" />, vagy használjon más <ph name="PROXY_SETTINGS_LINK_START" />proxybeállításokat<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Figyelmen kívül hagyott protokollkezelők</translation> -<translation id="7079038783243627996">A(z) „<ph name="EXTENSION" />” olvashat és törölhet képeket, videókat és hangfájlokat a megjelölt mappákban.</translation> <translation id="708060913198414444">Audi&ocím másolása</translation> <translation id="708187310695946552">Munkamenet-helyreállítási buborék kezelőfelülete</translation> <translation id="7082055294850503883">Kisbetűk használatának alapértelmezett beállítása</translation> @@ -4234,6 +4248,8 @@ <translation id="7313804056609272439">Vietnami beviteli mód (VNI)</translation> <translation id="7314244761674113881">SOCKS-szerver</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (jelenlegi)</translation> +<translation id="7321545336522791733">A szerver nem áll rendelkezésre</translation> +<translation id="7324841169865301118">Lehetővé teszi a felhasználó számára, hogy kiválasszon egy lapot az asztali megosztáshoz.</translation> <translation id="7325437708553334317">Kontrasztos megjelenítés bővítmény</translation> <translation id="7326565110843845436">Háromujjas kattintás az érintőpadon</translation> <translation id="73289266812733869">Nincs kijelölve</translation> @@ -4460,7 +4476,6 @@ <translation id="7650511557061837441">A(z) „<ph name="TRIGGERING_EXTENSION_NAME" />” el szeretné távolítani a következőt: „<ph name="EXTENSION_NAME" />”.</translation> <translation id="7650701856438921772">A <ph name="PRODUCT_NAME" /> ezen a nyelven jelenik meg</translation> <translation id="7654941827281939388">Ezt a fiókot már használják ezen a számítógépen.</translation> -<translation id="7655165758820095116">A MediaSource objektum lehetővé teszi, hogy a JavaScript közvetlenül küldjön médiaadatokat a videoelemeknek.</translation> <translation id="7658239707568436148">Mégse</translation> <translation id="7659584679870740384">Nem jogosult ennek az eszköznek a használatára. Bejelentkezési engedély kéréséhez vegye fel a kapcsolatot a rendszergazdával.</translation> <translation id="7664620655576155379">Nem támogatott Bluetooth-eszköz: „<ph name="DEVICE_NAME" />”.</translation> @@ -4591,6 +4606,7 @@ <translation id="7861215335140947162">&Letöltések</translation> <translation id="7864539943188674973">Bluetooth letiltása</translation> <translation id="7868891395842935202">Engedélyezi a kísérleti keretrendszert, amellyel szabályozható az API-kísérletekhez történő hozzáférés.</translation> +<translation id="7870576007982733437">A rendszer letöltéskezelőjének használata, amikor alkalmazható.</translation> <translation id="7870790288828963061">Nem található újabb verziójú kioszkalkalmazás, ezért nincs mit frissíteni. Kérjük, távolítsa el az USB-meghajtót.</translation> <translation id="787150342916295244">Hitelkártya beolvasása</translation> <translation id="7874357055309047713">Mindig fut minden webhelyen</translation> @@ -4633,7 +4649,6 @@ <translation id="7918257978052780342">Feliratkozás</translation> <translation id="7920092496846849526">Megkérdezted a szülőt, hogy meg szabad-e látogatnod ezt az oldalt.</translation> <translation id="7925285046818567682">Várakozás a szerverre: <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824">A <ph name="PASSWORD_MANAGER_BRAND" /> megjegyzi a jelszavait, és az összes eszközén automatikusan bejelentkezteti Önt az alkalmazásokba és a webhelyekre.</translation> <translation id="7925686952655276919">Ne használjon mobiladatokat a szinkronizáláshoz</translation> <translation id="7926906273904422255">A nem biztonságos eredet megjelölése nem biztonságosként vagy „gyanúsként”.</translation> <translation id="7928710562641958568">Eszköz kiadása</translation> @@ -4695,7 +4710,6 @@ A kulcsfájlt tartsa biztonságos helyen. Szüksége lesz rá ahhoz, hogy új verziókat készítsen bővítményéből.</translation> <translation id="799923393800005025">Megtekinthető</translation> <translation id="7999338963698132743">Új feladatkezelő</translation> -<translation id="8000004253404706714">A régi, tolakodó animált alrendszer használata az összeállított animációknál a megjelenítőkben.</translation> <translation id="8004582292198964060">Böngésző</translation> <translation id="8007030362289124303">Alacsony töltöttségi szint</translation> <translation id="8008356846765065031">Az internetkapcsolat megszűnt. Kérjük, ellenőrizze az internetkapcsolatot.</translation> @@ -4824,6 +4838,7 @@ <translation id="8185331656081929126">Értesítést kérek, ha a rendszer új nyomtatót észlel a hálózaton</translation> <translation id="8186609076106987817">A szerver nem találta a fájlt.</translation> <translation id="8186706823560132848">Szoftver</translation> +<translation id="8188120771410500975">&Szövegmezők helyesírás-ellenőrzése</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> és még <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> másik</translation> <translation id="8190193592390505034">Csatlakozás a következő hálózathoz: <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Alkalmazások, bővítmények és témák kezelése</translation> @@ -5217,6 +5232,7 @@ <translation id="8765985713192161328">Kezelők kezelése...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Felhasználók</translation> +<translation id="8768367823103160496">Egérmutató zárolása</translation> <translation id="8769662576926275897">Kártyaadatok</translation> <translation id="8770196827482281187">Perzsa beviteli mód (ISIRI 2901 kiosztás)</translation> <translation id="8774934320277480003">Felső margó</translation> @@ -5236,6 +5252,7 @@ <translation id="8795668016723474529">Hitelkártya hozzáadása</translation> <translation id="8795916974678578410">Új ablak</translation> <translation id="8798099450830957504">Alapértelmezett</translation> +<translation id="8799127529310003270">Engedélyezése esetén az InputConnection hívások az IME-szálon futnak, és újabb azonos szerkesztő megnyitása helyett mindegyik InputConnection hívás közvetlenül a megjelenítővel kommunikál.</translation> <translation id="8799839487311913894">A jelszómódosítás engedélyezése a jelszókezelőben a „jelszó módosítása” űrlap beküldése után.</translation> <translation id="8800004011501252845">Célhelyek megjelenítése a következőhöz:</translation> <translation id="8800420788467349919">Hangerő: <ph name="PRECENTAGE" />%</translation> @@ -5261,6 +5278,7 @@ <translation id="8841142799574815336">Semleges vizuális látható terület</translation> <translation id="884264119367021077">Szállítási cím</translation> <translation id="8844238624737526720">A Chrome-feladatkezelő új és optimalizált megvalósításának használata.</translation> +<translation id="8845001906332463065">Súgó</translation> <translation id="8846141544112579928">Billentyűzet keresése…</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift billentyűmód kapcsolója</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 14d1781..10f8e42 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">Fitur ini akan menyetel ulang laman mulai, laman tab baru, mesin telusur, dan tab terpasang. Fitur ini juga akan menonaktifkan semua ekstensi dan menghapus data sementara seperti cookie. Bookmark, riwayat, dan sandi yang tersimpan tidak akan dihapus.</translation> <translation id="1434886155212424586">Beranda adalah laman Tab Baru</translation> <translation id="1435550882135542937">Desain ulang bilah alat ekstensi</translation> +<translation id="1436402875660227532">Catatan: Setelan ini tidak lagi digunakan di sistem ini, namun Anda masih dapat melihat dan mengeditnya.</translation> <translation id="1436784010935106834">Dihapus</translation> <translation id="1438632560381091872">Nonaktifkan tab</translation> <translation id="1441841714100794440">Keyboard Vietnam (Telex)</translation> @@ -1316,6 +1317,7 @@ <translation id="2889064240420137087">Buka tautan dengan...</translation> <translation id="2889925978073739256">Lanjutkan pemblokiran plugin yang tidak dimasukkan kotak pasir</translation> <translation id="2890624088306605051">Hanya mengembalikan data dan setelan yang disinkronkan</translation> +<translation id="2890678560483811744">Di luar referensi laman batas</translation> <translation id="2893168226686371498">Browser default</translation> <translation id="289426338439836048">Jaringan seluler lainnya...</translation> <translation id="2894745200702272315">Mengaktifkan fitur deteksi kata cepat 'Ok Google' versi eksperimen yang terikat dengan perangkat lunak.</translation> @@ -1344,7 +1346,6 @@ <translation id="2925966894897775835">Spreadsheet</translation> <translation id="2927017729816812676">Penyimpanan Cache</translation> <translation id="2927657246008729253">Ubah...</translation> -<translation id="2928415919076124714">Sembunyikan Bilah Alat Saat Menggunakan Layar Penuh</translation> <translation id="2928526264833629376">Lanjutkan ke Hangouts</translation> <translation id="2930644991850369934">Ada masalah saat mengunduh citra pemulihan. Sambungan jaringan terputus.</translation> <translation id="293111069139560936">Memungkinkan rak meminimalkan jendela jika item rak diklik, yang hanya memiliki satu jendela yang sudah aktif dan terkait dengan rak tersebut.</translation> @@ -1589,7 +1590,6 @@ <translation id="3289566588497100676">Masukan simbol mudah</translation> <translation id="3289856944988573801">Untuk memeriksa pembaruan, gunakan Ethernet atau Wi-Fi.</translation> <translation id="3293325348208285494">Mulai cepat</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" dapat membaca dan menulis file gambar, video, dan suara di folder yang dicentang.</translation> <translation id="3294437725009624529">Tamu</translation> <translation id="329650768420594634">Peringatan "Kemas Ekstensi"</translation> <translation id="3296763833017966289">Georgian</translation> @@ -1647,6 +1647,7 @@ <translation id="3338239663705455570">Keyboard untuk bahasa Sloven</translation> <translation id="3340978935015468852">setelan</translation> <translation id="3341703758641437857">Izinkan akses ke URL file</translation> +<translation id="3343813173145836998">Masuk ke perangkat ini dengan mudah</translation> <translation id="3344786168130157628">Nama titik akses (APN):</translation> <translation id="3345135638360864351">Permintaan Anda untuk mengakses situs ini tidak dapat dikirimkan ke <ph name="NAME" />. Coba lagi.</translation> <translation id="3345886924813989455">Tidak ditemukan browser yang didukung</translation> @@ -2229,7 +2230,7 @@ <translation id="4180788401304023883">Hapus sertifikat CA "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">Keyboard Fonetik Rusia (YaZHert)</translation> <translation id="4181841719683918333">Bahasa</translation> -<translation id="4187248015940562149">Mengaktifkan Bluetooth Web yang memungkinkan situs web menyambung ke dan mengontrol perangkat Bluetooth di sekitar Anda.</translation> +<translation id="4187248015940562149">Mengaktifkan Bluetooth Web agar situs web dapat terhubung ke dan mengontrol perangkat Bluetooth di sekitar Anda.</translation> <translation id="4188026131102273494">Kata kunci:</translation> <translation id="4189406272289638749">Ekstensi, <b><ph name="EXTENSION_NAME" /></b>, mengontrol setelan ini.</translation> <translation id="4193154014135846272">Dokumen Google</translation> @@ -2286,6 +2287,7 @@ <translation id="4268025649754414643">Penyandian Kunci</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versi <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Tidak ada yang cocok</translation> <translation id="4274187853770964845">Kesalahan Sinkronisasi: Hentikan dan mulai ulang Sinkronisasi.</translation> <translation id="4275830172053184480">Mulai ulang perangkat Anda</translation> <translation id="4276796043975446927">Selamat datang di Chromebox untuk rapat</translation> @@ -2355,6 +2357,7 @@ <translation id="4378551569595875038">Menyambung...</translation> <translation id="438122767399415311">Paksa arah antarmuka</translation> <translation id="4381849418013903196">Titik Dua</translation> +<translation id="4383192539467954373">Otomatis masuk ke seluruh perangkat</translation> <translation id="4384652540891215547">Aktifkan ekstensi</translation> <translation id="438503109373656455">Sembrani</translation> <translation id="4387554346626014084">Mengaktifkan sinkronisasi Peluncur Aplikasi. Tindakan ini juga mengaktifkan Folder apabila tersedia (bukan OSX).</translation> @@ -2387,6 +2390,7 @@ <translation id="444267095790823769">Pengecualian konten yang dilindungi</translation> <translation id="4443536555189480885">&Bantuan</translation> <translation id="4444304522807523469">Mengakses pemindai dokumen yang terpasang melalui USB atau pada jaringan lokal</translation> +<translation id="4445559854264555037">Tidak melihat perangkat? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Dicerminkan</translation> <translation id="4447465454292850432">Baterai:</translation> <translation id="4449935293120761385">Tentang IsiOtomatis</translation> @@ -2645,6 +2649,7 @@ <translation id="485316830061041779">Jerman</translation> <translation id="4856478137399998590">Layangan data seluler Anda diaktifkan dan siap untuk digunakan</translation> <translation id="4858913220355269194">Ronaldo</translation> +<translation id="4860565041166337978">Memungkinan pengunduhan ditangani oleh pengelola unduhan sistem jika berlaku.</translation> <translation id="48607902311828362">Mode pesawat</translation> <translation id="4861833787540810454">&Mulai</translation> <translation id="4862050643946421924">Menambahkan perangkat...</translation> @@ -2728,7 +2733,6 @@ <translation id="4977942889532008999">Konfirmasi Akses</translation> <translation id="4982718461356080574">Sembunyikan tombol tutup di tab yang tidak aktif saat tertumpuk</translation> <translation id="498294082491145744">Mengubah setelan yang mengontrol akses situs web ke fitur seperti cookie, JavaScript, plugin, geolokasi, mikrofon, kamera, dll.</translation> -<translation id="4984329823325527157">API Sumber Media</translation> <translation id="4988526792673242964">Laman</translation> <translation id="4988792151665380515">Gagal mengekspor kunci publik.</translation> <translation id="49896407730300355">Putar &berlawanan arah jarum jam</translation> @@ -2917,7 +2921,6 @@ <translation id="5268606875983318825">PPAPI (tidak diproses bersamaan)</translation> <translation id="526926484727016706">Menyebabkan semua iframe ditolak oleh semua jenis izin secara default. Memungkinkan izin tertentu untuk iframe dapat mencakup pencantuman nama izin ini sebagai nilai atribut iframe yang baru.</translation> <translation id="5269977353971873915">Gagal Mencetak</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" dapat membaca file gambar, video, dan suara di folder yang dicentang.</translation> <translation id="5271247532544265821">Mode China Aksara Modern/Tradisional</translation> <translation id="5271549068863921519">Simpan sandi</translation> <translation id="5273628206174272911">Navigasi riwayat eksperimental saat menanggapi gulir horizontal.</translation> @@ -3007,11 +3010,11 @@ <translation id="5390284375844109566">Basis data yang diindeks</translation> <translation id="5392544185395226057">Mengaktifkan dukungan untuk Native Client.</translation> <translation id="5393125431335030955">Plugin ini hanya bekerja di desktop.</translation> -<translation id="5393559999218790205">Nonaktifkan linimasa animasi gabungan antarmuka</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> pada <ph name="PEPPER_PLUGIN_DOMAIN" /> ingin mengakses komputer Anda.</translation> <translation id="539755880180803351">Menambahkan pada formulir web dengan prediksi jenis bidang IsiOtomatis sebagai teks placeholder.</translation> <translation id="5397578532367286026">Penggunaan dan riwayat pengguna ini dapat ditinjau oleh pengelola (<ph name="MANAGER_EMAIL" />) di chrome.com.</translation> <translation id="5397794290049113714">Anda</translation> +<translation id="5398572795982417028">Di luar referensi laman batas, batasannya adalah <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> dari situs lain</translation> <translation id="5399158067281117682">PIN tidak cocok!</translation> <translation id="5400640815024374115">Chip Modul Platform Tepercaya (Trusted Platform Module/TPM) dinonaktifkan atau tidak ada.</translation> @@ -3031,7 +3034,7 @@ <translation id="5423849171846380976">Diaktifkan</translation> <translation id="5425470845862293575">Mengaktifkan penggunaan sistem perenderan font DirectWrite eksperimental.</translation> <translation id="5425722269016440406">Anda harus tersambung ke internet untuk menonaktifkan Smart Lock karena setelan ini disinkronkan ke ponsel dan perangkat lain. Sambungkan ke jaringan terlebih dahulu.</translation> -<translation id="5426623592374109001">Menggunakan subsistem animasi intrusif lawas untuk animasi gabungan dalam antarmuka.</translation> +<translation id="5425863515030416387">Masuk ke seluruh perangkat dengan mudah</translation> <translation id="5427459444770871191">Putar &Searah Jarum Jam</translation> <translation id="5428105026674456456">Spanyol</translation> <translation id="542872847390508405">Anda menjelajah sebagai Tamu</translation> @@ -3226,7 +3229,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">Skala cubit</translation> <translation id="5710406368443808765">Ups! Sistem gagal menyimpan token dan ID perangkat.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> tidak merespons. Tidak dapat mentransmisi.</translation> <translation id="5711983031544731014">Tidak dapat membuka. Masukkan sandi Anda.</translation> <translation id="5712966208980506909">Jika diaktifkan, URL chrome://md-policy akan memuat laman kebijakan Desain Material.</translation> <translation id="5715711091495208045">Pialang Plugin: <ph name="PLUGIN_NAME" /></translation> @@ -3493,7 +3495,6 @@ <translation id="6111974609785983504">Diizinkan secara default</translation> <translation id="6113134669445407638">Nonaktifkan Delay Agnostic AEC di WebRTC. Gunakan jika penundaan sistem yang dilaporkan sangat tepercaya, atau jika ada hal lain yang ditunjukkan komputer Anda.</translation> <translation id="6116921718742659598">Ubah setelan masukan dan bahasa</translation> -<translation id="6117536376248197233">Nonaktifkan linimasa animasi gabungan dalam perender.</translation> <translation id="6120205520491252677">Pasang pin laman ini ke layar Awal...</translation> <translation id="6122081475643980456">Koneksi internet Anda sedang dikendalikan</translation> <translation id="6122093587541546701">Email (opsional):</translation> @@ -3525,6 +3526,7 @@ <translation id="6163522313638838258">Luaskan semua...</translation> <translation id="6164005077879661055">Semua file dan data lokal yang terkait dengan pengguna yang dilindungi akan dihapus secara permanen setelah pengguna yang dilindungi ini dihapus. Situs web yang dikunjungi dan setelan untuk pengguna yang dilindungi ini mungkin tetap dapat dilihat oleh pengelola di <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Pelajari lebih lanjut</translation> +<translation id="6167008112175207002">Bookmark, riwayat, sandi, dan setelan lainnya akan disinkronkan ke Akun Google agar Anda dapat menggunakannya di seluruh perangkat. Anda dapat mengubah ini di <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Simulasi fitur 'Ok Google' perangkat keras</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">Pilih sertifikat</translation> @@ -3770,7 +3772,6 @@ <translation id="6555432686520421228">Hapus semua akun pengguna dan setel ulang perangkat <ph name="IDS_SHORT_PRODUCT_NAME" /> Anda agar menjadi seperti baru.</translation> <translation id="6556866813142980365">Urungkan</translation> <translation id="6557565812667414268">Aktifkan hanya untuk tampilan DPI tinggi</translation> -<translation id="655845594391856372">Tab tidak merespons. Tidak dapat mentransmisi.</translation> <translation id="6559580823502247193">(sudah ada di perangkat ini)</translation> <translation id="6561726789132298588">masuk</translation> <translation id="6562437808764959486">Mengekstrak citra pemulihan...</translation> @@ -3871,6 +3872,7 @@ <translation id="6723354935081862304">Cetak ke Google Dokumen dan tujuan awan lainnya. <ph name="BEGIN_LINK" />Masuk<ph name="END_LINK" /> untuk mencetak ke Google Cloud Print.</translation> <translation id="6723661294526996303">Impor bookmark dan setelan...</translation> <translation id="6723839937902243910">Daya</translation> +<translation id="6725240607822645708">Jalankan IME di untaiannya sendiri.</translation> <translation id="6725970970008349185">Jumlah calon yang akan ditampilkan per laman</translation> <translation id="672609503628871915">Lihat apa saja yang baru</translation> <translation id="6727005317916125192">Panel sebelumnya</translation> @@ -4001,12 +4003,11 @@ <translation id="6948736568813450284">Untuk pengembang: gunakan layanan kotak pasir untuk panggilan API Google Payments.</translation> <translation id="6949306908218145636">Bookmark Laman Aktif...</translation> <translation id="695164542422037736">Jika opsi ini diaktifkan, dan badan disesuaikan dengan background-attachment:fixed, latar belakang akan memiliki lapisan penggabungan sendiri.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> akan mengingat sandi dan membuat Anda masuk ke situs secara otomatis di perangkat ini.</translation> <translation id="6955446738988643816">Periksa Munculan</translation> <translation id="695755122858488207">Tombol radio yang tidak dipilih</translation> +<translation id="6960277925159781810">Otomatis masuk ke perangkat ini</translation> <translation id="696036063053180184">3 Himpunan (Tanpa shift)</translation> <translation id="696203921837389374">Aktifkan sinkronisasi melalui data seluler</translation> -<translation id="6964308487066031935">Tambahkan folder ke "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">Oke</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Perangkat</translation> @@ -4104,7 +4105,6 @@ <translation id="7076293881109082629">Sedang masuk</translation> <translation id="7077829361966535409">Laman proses masuk gagal dimuat menggunakan setelan proxy saat ini. <ph name="GAIA_RELOAD_LINK_START" />Coba masuk lagi nanti<ph name="GAIA_RELOAD_LINK_END" />, atau gunakan <ph name="PROXY_SETTINGS_LINK_START" />setelan proxy yang lain<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Protokol penanganan yang diabaikan</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" dapat membaca dan menghapus file gambar, video, dan suara di folder yang dicentang.</translation> <translation id="708060913198414444">S&alin alamat audio</translation> <translation id="708187310695946552">Antarmuka gelembung pemulihan sesi</translation> <translation id="7082055294850503883">Abaikan status CapsLock dan huruf kecil masukkan jika tidak diubah</translation> @@ -4476,7 +4476,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" ingin menghapus "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> ditampilkan dalam bahasa ini</translation> <translation id="7654941827281939388">Akun ini sudah digunakan di komputer ini.</translation> -<translation id="7655165758820095116">Objek MediaSource memungkinkan JavaScript mengirim data media langsung ke elemen video.</translation> <translation id="7658239707568436148">Batal</translation> <translation id="7659584679870740384">Anda tidak diizinkan untuk menggunakan perangkat ini. Untuk izin masuk, hubungi administrator perangkat.</translation> <translation id="7664620655576155379">Perangkat Bluetooth tidak didukung: "<ph name="DEVICE_NAME" />".</translation> @@ -4607,6 +4606,7 @@ <translation id="7861215335140947162">Un&duhan</translation> <translation id="7864539943188674973">Nonaktifkan Bluetooth</translation> <translation id="7868891395842935202">Mengaktifkan Kerangka Kerja Eksperimental untuk mengontrol akses ke eksperimen API.</translation> +<translation id="7870576007982733437">Gunakan pengelola unduhan sistem jika berlaku.</translation> <translation id="7870790288828963061">Tidak ada aplikasi Kios dengan versi lebih baru yang ditemukan. Tidak ada yang akan diperbarui. Lepaskan stik USB.</translation> <translation id="787150342916295244">Pemindaian kartu kredit</translation> <translation id="7874357055309047713">Selalu jalankan di semua situs</translation> @@ -4649,7 +4649,6 @@ <translation id="7918257978052780342">Daftarkan</translation> <translation id="7920092496846849526">Anda telah meminta izin kepada orang tua untuk mengunjungi laman ini.</translation> <translation id="7925285046818567682">Menunggu <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> akan mengingat sandi dan membuat Anda masuk ke aplikasi dan situs secara otomatis di semua perangkat.</translation> <translation id="7925686952655276919">Jangan gunakan data seluler untuk sinkronisasi</translation> <translation id="7926906273904422255">Menandai asal tidak aman sebagai tidak aman, atau sebagai "meragukan".</translation> <translation id="7928710562641958568">Keluarkan perangkat</translation> @@ -4711,7 +4710,6 @@ Simpan file kunci Anda di tempat yang aman. Anda akan membutuhkannya untuk membuat versi baru ekstensi.</translation> <translation id="799923393800005025">Dapat melihat</translation> <translation id="7999338963698132743">Pengelola tugas baru</translation> -<translation id="8000004253404706714">Menggunakan subsistem animasi intrusif lawas untuk animasi gabungan dalam perender.</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8007030362289124303">Baterai Lemah</translation> <translation id="8008356846765065031">Internet terputus. Periksa sambungan internet Anda.</translation> @@ -5233,6 +5231,7 @@ <translation id="8765985713192161328">Kelola penangan...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Pengguna</translation> +<translation id="8768367823103160496">Kunci kursor mouse</translation> <translation id="8769662576926275897">Detail kartu</translation> <translation id="8770196827482281187">Metode masukan Persia (Tata letak ISIRI 2901)</translation> <translation id="8774934320277480003">Batas atas</translation> @@ -5252,6 +5251,7 @@ <translation id="8795668016723474529">Tambahkan kartu kredit</translation> <translation id="8795916974678578410">Jendela Baru</translation> <translation id="8798099450830957504">Default</translation> +<translation id="8799127529310003270">Jika diaktifkan, panggilan MasukanSambungan dijalankan di untaian IME, dan alih-alih menyimpan editor replika, setiap panggilan SambunganMasukan akan secara langsung disiarkan ke perender.</translation> <translation id="8799839487311913894">Memungkinkan Anda untuk memperbarui sandi di pengelola sandi, setelah mengirimkan formulir "ubah sandi".</translation> <translation id="8800004011501252845">Menunjukkan tujuan untuk</translation> <translation id="8800420788467349919">Volume: <ph name="PRECENTAGE" />%</translation> @@ -5277,6 +5277,7 @@ <translation id="8841142799574815336">Area pandang visual tidak aktif.</translation> <translation id="884264119367021077">Alamat pengiriman</translation> <translation id="8844238624737526720">Menggunakan penerapan baru dan yang dioptimalkan dari pengelola tugas Chrome.</translation> +<translation id="8845001906332463065">Dapatkan bantuan</translation> <translation id="8846141544112579928">Mencari keyboard...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Sakelar mode tombol shift</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 2e4399f..3f535ad 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">L'operazione reimposterà la pagina iniziale, la pagina Nuova scheda, il motore di ricerca e le schede bloccate. Inoltre, disattiverà tutte le estensioni e rimuoverà i dati temporanei, come i cookie. La cronologia, le password salvate e i preferiti non saranno invece cancellati.</translation> <translation id="1434886155212424586">La pagina iniziale è la pagina Nuova scheda</translation> <translation id="1435550882135542937">Nuovo design della barra degli strumenti di estensioni</translation> +<translation id="1436402875660227532">Nota. Queste impostazioni non sono più utilizzate su questo sistema, ma è ancora possibile visualizzarle e modificarle.</translation> <translation id="1436784010935106834">Rimosso</translation> <translation id="1438632560381091872">Riattiva audio schede</translation> <translation id="1441841714100794440">Tastiera Vietnamita (Telex)</translation> @@ -865,7 +866,7 @@ <ph name="MARKUP_7" />Condividi, crea e realizza in collaborazione<ph name="MARKUP_8" /> file con altre persone, il tutto in un'unica posizione.<ph name="MARKUP_9" /></translation> <translation id="2270450558902169558">Scambiare dati con qualsiasi dispositivo nel dominio <ph name="DOMAIN" /></translation> <translation id="2270484714375784793">Numero di telefono</translation> -<translation id="2270627217422354837">Scambio di dati con qualsiasi dispositivo nei domini: <ph name="DOMAINS" /></translation> +<translation id="2270627217422354837">Scambiare dati con qualsiasi dispositivo nei domini: <ph name="DOMAINS" /></translation> <translation id="2273562597641264981">Operatore:</translation> <translation id="2275694568175246751">Da destra a sinistra</translation> <translation id="2276503375879033601">Aggiungi altre applicazioni</translation> @@ -1314,6 +1315,7 @@ <translation id="2889064240420137087">Apri link con...</translation> <translation id="2889925978073739256">Continua a bloccare i plug-in senza sandbox</translation> <translation id="2890624088306605051">Recupera solo impostazioni e dati sincronizzati</translation> +<translation id="2890678560483811744">Riferimento pagina oltre i limiti</translation> <translation id="2893168226686371498">Browser predefinito</translation> <translation id="289426338439836048">Altra rete mobile...</translation> <translation id="2894745200702272315">Consente di attivare una versione sperimentale delle funzioni di rilevamento dell'hotword "Ok Google" che dipendono dall'hardware.</translation> @@ -1342,7 +1344,6 @@ <translation id="2925966894897775835">Fogli</translation> <translation id="2927017729816812676">Spazio di archiviazione cache</translation> <translation id="2927657246008729253">Modifica...</translation> -<translation id="2928415919076124714">Nascondi la barra degli strumenti in modalità a schermo intero</translation> <translation id="2928526264833629376">Continua su Hangouts</translation> <translation id="2930644991850369934">Si è verificato un problema durante il download dell'immagine di ripristino. Connessione di rete persa.</translation> <translation id="293111069139560936">Permette di consentire di ridurre a icona una finestra della shelf, se viene fatto clic su un elemento della shelf associato a un'unica finestra già attiva.</translation> @@ -1587,7 +1588,6 @@ <translation id="3289566588497100676">Immissione facile dei simboli</translation> <translation id="3289856944988573801">Per verificare la disponibilità di aggiornamenti, utilizza una rete Ethernet o Wi-Fi.</translation> <translation id="3293325348208285494">Avvio veloce</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" potrà leggere e modificare le immagini, i video e i file audio delle cartelle selezionate.</translation> <translation id="3294437725009624529">Ospite</translation> <translation id="329650768420594634">Avviso sull'estensione Pack</translation> <translation id="3296763833017966289">Georgiano</translation> @@ -1643,6 +1643,7 @@ <translation id="3338239663705455570">Tastiera slovena</translation> <translation id="3340978935015468852">impostazioni</translation> <translation id="3341703758641437857">Consenti l'accesso agli URL dei file</translation> +<translation id="3343813173145836998">Accedi facilmente su questo dispositivo</translation> <translation id="3344786168130157628">Nome punto di accesso:</translation> <translation id="3345135638360864351">Impossibile inviare a <ph name="NAME" /> la richiesta di accesso a questo sito. Riprova.</translation> <translation id="3345886924813989455">Non è stato trovato nessun browser supportato</translation> @@ -2282,6 +2283,7 @@ <translation id="4268025649754414643">Crittografia chiave</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versione <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Nessuna corrispondenza</translation> <translation id="4274187853770964845">Errore di sincronizzazione. Interrompi e riavvia la sincronizzazione.</translation> <translation id="4275830172053184480">Riavvia il dispositivo</translation> <translation id="4276796043975446927">Benvenuto in Chromebox per videoconferenze</translation> @@ -2351,6 +2353,7 @@ <translation id="4378551569595875038">Connessione...</translation> <translation id="438122767399415311">Forza la direzione nell'interfaccia utente</translation> <translation id="4381849418013903196">Due punti</translation> +<translation id="4383192539467954373">Accedi automaticamente da tutti i dispositivi.</translation> <translation id="4384652540891215547">Attiva l'estensione</translation> <translation id="438503109373656455">Furia</translation> <translation id="4387554346626014084">Consente di attivare la sincronizzazione di Avvio applicazioni. Consente anche di attivare cartelle ove disponibili (non OS X).</translation> @@ -2383,6 +2386,7 @@ <translation id="444267095790823769">Eccezioni di contenuti protetti</translation> <translation id="4443536555189480885">&Guida</translation> <translation id="4444304522807523469">Accesso a scanner di documenti aggiunti tramite USB o sulla rete locale</translation> +<translation id="4445559854264555037">Non trovi il tuo dispositivo? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Speculare</translation> <translation id="4447465454292850432">Batteria:</translation> <translation id="4449935293120761385">Informazioni su Compilazione automatica</translation> @@ -2638,6 +2642,7 @@ <translation id="485316830061041779">Tedesco</translation> <translation id="4856478137399998590">Il servizio dati mobile è attivo e pronto all'uso</translation> <translation id="4858913220355269194">Holly</translation> +<translation id="4860565041166337978">Quando possibile, consenti alla gestione dei download del sistema di gestire i download.</translation> <translation id="48607902311828362">Modalità aereo</translation> <translation id="4861833787540810454">&Riproduci</translation> <translation id="4862050643946421924">Aggiunta del dispositivo...</translation> @@ -2721,7 +2726,6 @@ <translation id="4977942889532008999">Conferma accesso</translation> <translation id="4982718461356080574">Opzioni per nascondere i pulsanti di chiusura delle schede non attive quando sono sovrapposte</translation> <translation id="498294082491145744">Modifica delle impostazioni che controllano l'accesso dei siti web a funzioni quali cookie, JavaScript, plug-in, geolocalizzazione, microfono, videocamera ecc.</translation> -<translation id="4984329823325527157">API Media Source</translation> <translation id="4988526792673242964">Pagine</translation> <translation id="4988792151665380515">Operazione di esportazione della chiave pubblica non riuscita.</translation> <translation id="49896407730300355">Ruota in senso anti&orario</translation> @@ -2910,7 +2914,6 @@ <translation id="5268606875983318825">PPAPI (out-of-process)</translation> <translation id="526926484727016706">Per impostazione predefinita, a tutti gli iframe vengono negate tutte le autorizzazioni. Il riconoscimento di determinate autorizzazioni per un iframe può interessare un elenco di nomi di tali autorizzazioni come valori dei nuovi attributi iframe.</translation> <translation id="5269977353971873915">Stampa non riuscita</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" potrà leggere le immagini, i video e i file audio delle cartelle selezionate.</translation> <translation id="5271247532544265821">Attiva/disattiva modalità cinese tradizionale/cinese semplificato</translation> <translation id="5271549068863921519">Salva password</translation> <translation id="5273628206174272911">Navigazione sperimentale nella cronologia in risposta allo scorrimento orizzontale.</translation> @@ -3000,11 +3003,11 @@ <translation id="5390284375844109566">Database indicizzato</translation> <translation id="5392544185395226057">Attiva il supporto di Native Client.</translation> <translation id="5393125431335030955">Questo plug-in funziona solo sul desktop.</translation> -<translation id="5393559999218790205">Disattiva sequenze temporali di animazione compositore UI</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> su <ph name="PEPPER_PLUGIN_DOMAIN" /> chiede di accedere al tuo computer.</translation> <translation id="539755880180803351">Annota i moduli web con previsioni sul tipo di campi di Compilazione automatica sotto forma di testo segnaposto.</translation> <translation id="5397578532367286026">L'utilizzo e la cronologia di questo utente possono essere esaminati dal gestore (<ph name="MANAGER_EMAIL" />) su chrome.com.</translation> <translation id="5397794290049113714">Tu</translation> +<translation id="5398572795982417028">Riferimento pagina oltre i limiti, il limite è <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> da altri siti</translation> <translation id="5399158067281117682">I PIN non corrispondono.</translation> <translation id="5400640815024374115">Il chip TPM (Trusted Platform Module) non è attivo o è assente.</translation> @@ -3024,7 +3027,7 @@ <translation id="5423849171846380976">Attivato</translation> <translation id="5425470845862293575">Consente di attivare l'utilizzo del sistema sperimentale di visualizzazione dei caratteri DirectWrite.</translation> <translation id="5425722269016440406">Devi essere online per poter disattivare Smart Lock perché questa impostazione viene sincronizzata con il telefono e con altri dispositivi. Collegati prima a una rete.</translation> -<translation id="5426623592374109001">Utilizza sottosistema precedente di animazione interna per animazioni composte nell'interfaccia.</translation> +<translation id="5425863515030416387">Accedi facilmente da tutti i dispositivi</translation> <translation id="5427459444770871191">Ruota in senso o&rario</translation> <translation id="5428105026674456456">Spagnolo</translation> <translation id="542872847390508405">Stai navigando come ospite</translation> @@ -3219,7 +3222,6 @@ <translation id="5708171344853220004">Nome entità Microsoft</translation> <translation id="5709885306771508267">Pizzica per ridimensionare</translation> <translation id="5710406368443808765">Spiacenti. Impossibile memorizzare l'ID e il token del dispositivo.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> non risponde. Impossibile trasmettere.</translation> <translation id="5711983031544731014">Impossibile sbloccare. Inserisci la password.</translation> <translation id="5712966208980506909">Se l'opzione viene attivata, l'URL chrome://md-policy carica la pagina delle norme di Material Design.</translation> <translation id="5715711091495208045">Plug-in Broker: <ph name="PLUGIN_NAME" /></translation> @@ -3486,7 +3488,6 @@ <translation id="6111974609785983504">Consentito per impostazione predefinita</translation> <translation id="6113134669445407638">Consente di disattivare Delay Agnostic AEC in WebRTC. Da utilizzare se i ritardi di sistema segnalati sono estremamente attendibili o se altri sentono echi provenienti dalla tua macchina.</translation> <translation id="6116921718742659598">Modifica impostazioni della lingua e di immissione</translation> -<translation id="6117536376248197233">Disattiva sequenze temporali di animazione compositore nei rendering.</translation> <translation id="6120205520491252677">Blocca questa pagina in schermata iniziale...</translation> <translation id="6122081475643980456">La tua connessione Internet è controllata</translation> <translation id="6122093587541546701">Email (facoltativo):</translation> @@ -3518,6 +3519,7 @@ <translation id="6163522313638838258">Espandi tutto...</translation> <translation id="6164005077879661055">Tutti i file e i dati locali associati all'utente controllato verranno eliminati definitivamente in seguito alla rimozione dell'utente. Le impostazioni e i siti web visitati relativi all'utente controllato potrebbero essere ancora visibili al gestore all'indirizzo <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Ulteriori informazioni</translation> +<translation id="6167008112175207002">I tuoi preferiti, la cronologia, le password e altre impostazioni verranno sincronizzati con il tuo account Google per consentirti di trovarli su tutti i tuoi dispositivi. Puoi modificare questa impostazione in <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Funzioni "Ok Google" per hardware simulato</translation> <translation id="6175314957787328458">GUID di dominio Microsoft</translation> <translation id="6178664161104547336">Seleziona un certificato</translation> @@ -3763,7 +3765,6 @@ <translation id="6555432686520421228">Rimuovi tutti gli account utente e reimposta il tuo dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /> come se fosse nuovo.</translation> <translation id="6556866813142980365">Ripeti</translation> <translation id="6557565812667414268">Attivato solo per display con valore DPI elevato</translation> -<translation id="655845594391856372">La scheda non risponde. Impossibile trasmettere.</translation> <translation id="6559580823502247193">(già presente su questo dispositivo)</translation> <translation id="6561726789132298588">invio</translation> <translation id="6562437808764959486">Estrazione dell'immagine di ripristino in corso...</translation> @@ -3864,6 +3865,7 @@ <translation id="6723354935081862304">Stampa con Google Documenti e altre destinazioni nella cloud. <ph name="BEGIN_LINK" />Accedi<ph name="END_LINK" /> per stampare con Google Cloud Print.</translation> <translation id="6723661294526996303">Importa Preferiti e impostazioni...</translation> <translation id="6723839937902243910">Alimentazione</translation> +<translation id="6725240607822645708">Esegui IME nel proprio thread.</translation> <translation id="6725970970008349185">Numero di candidati da visualizzare per pagina</translation> <translation id="672609503628871915">Scopri le novità</translation> <translation id="6727005317916125192">Riquadro precedente</translation> @@ -3995,12 +3997,11 @@ <translation id="6948736568813450284">Per gli sviluppatori. Consente di utilizzare il servizio sandbox per le chiamate all'API di Google Payments.</translation> <translation id="6949306908218145636">Aggiungi pagine aperte ai Preferiti...</translation> <translation id="695164542422037736">Se questa opzione viene attivata e al corpo viene applicato lo stile background-attachment:fixed, lo sfondo avrà il proprio livello composito.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> memorizza le tue password e ti permette di accedere automaticamente ai siti su questo dispositivo.</translation> <translation id="6955446738988643816">Ispeziona popup</translation> <translation id="695755122858488207">Pulsante di opzione non selezionato</translation> +<translation id="6960277925159781810">Accedi automaticamente su questo dispositivo</translation> <translation id="696036063053180184">3 set (Sebeolsik No shift)</translation> <translation id="696203921837389374">Attiva sincronizzazione tramite dati mobili</translation> -<translation id="6964308487066031935">Aggiungere le cartelle a "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Porta</translation> <translation id="6965978654500191972">Dispositivo</translation> @@ -4098,7 +4099,6 @@ <translation id="7076293881109082629">Accesso</translation> <translation id="7077829361966535409">Caricamento della pagina di accesso non riuscito utilizzando le impostazioni proxy correnti. <ph name="GAIA_RELOAD_LINK_START" />Prova ad accedere di nuovo<ph name="GAIA_RELOAD_LINK_END" /> o utilizza altre <ph name="PROXY_SETTINGS_LINK_START" />impostazioni proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Gestori di protocollo ignorati</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" potrà leggere ed eliminare le immagini, i video e i file audio delle cartelle selezionate.</translation> <translation id="708060913198414444">C&opia l'indirizzo dell'audio</translation> <translation id="708187310695946552">Interfaccia utente di fumetti per il ripristino delle sessioni</translation> <translation id="7082055294850503883">Ignora lo stato del tasto Bloc Maiusc e immetti il testo in minuscolo per impostazione predefinita</translation> @@ -4243,7 +4243,7 @@ <translation id="7314244761674113881">Host SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (corrente)</translation> <translation id="7321545336522791733">Server non raggiungibile</translation> -<translation id="7324841169865301118">Consente agli utenti di scegliere una scheda per la condivisione desktop.</translation> +<translation id="7324841169865301118">Consente agli utenti di scegliere una scheda per la condivisione del desktop.</translation> <translation id="7325437708553334317">Estensione Contrasto elevato</translation> <translation id="7326565110843845436">Clic con tre dita su touchpad</translation> <translation id="73289266812733869">Deselezionato</translation> @@ -4461,7 +4461,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" desidera rimuovere "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> è visualizzato in questa lingua</translation> <translation id="7654941827281939388">Questo account è già in uso su questo computer.</translation> -<translation id="7655165758820095116">L'oggetto MediaSource consente a JavaScript di inviare i dati multimediali direttamente a un elemento video.</translation> <translation id="7658239707568436148">Annulla</translation> <translation id="7659584679870740384">Non sei autorizzato a utilizzare questo dispositivo. Per ottenere l'autorizzazione di accesso contatta l'amministratore.</translation> <translation id="7664620655576155379">Dispositivo Bluetooth non supportato: "<ph name="DEVICE_NAME" />".</translation> @@ -4592,6 +4591,7 @@ <translation id="7861215335140947162">&Download</translation> <translation id="7864539943188674973">Disattiva Bluetooth</translation> <translation id="7868891395842935202">Consente di attivare il Framework sperimentale per controllare l'accesso agli esperimenti dell'API.</translation> +<translation id="7870576007982733437">Quando possibile, utilizza la gestione dei download del sistema.</translation> <translation id="7870790288828963061">Nessuna app kiosk con versione più recente trovata. Non c'è nulla da aggiornare. Rimuovi la chiavetta USB.</translation> <translation id="787150342916295244">Scansione di carte di credito</translation> <translation id="7874357055309047713">Esegui sempre su tutti i siti</translation> @@ -4634,7 +4634,6 @@ <translation id="7918257978052780342">Registrati</translation> <translation id="7920092496846849526">Hai chiesto ai tuoi genitori l'autorizzazione per visitare questa pagina.</translation> <translation id="7925285046818567682">In attesa di risposta da <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> memorizza le tue password e ti permette di accedere automaticamente ad app e siti su più dispositivi.</translation> <translation id="7925686952655276919">Non utilizzare dati mobili per la sincronizzazione</translation> <translation id="7926906273904422255">Contrassegna origini non sicure come "non sicure" o "dubbie".</translation> <translation id="7928710562641958568">Espelli dispositivo</translation> @@ -4696,7 +4695,6 @@ Conserva il file di chiave in un luogo sicuro. Ti servirà per creare nuove versioni dell'estensione.</translation> <translation id="799923393800005025">Può visualizzare</translation> <translation id="7999338963698132743">Nuovo Task Manager</translation> -<translation id="8000004253404706714">Utilizza sottosistema di animazione interna precedente per animazioni composte nei rendering.</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8007030362289124303">Batteria in esaurimento</translation> <translation id="8008356846765065031">Disconnesso da Internet. Controlla la tua connessione Internet.</translation> @@ -5218,6 +5216,7 @@ <translation id="8765985713192161328">Gestisci gestori...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Utenti</translation> +<translation id="8768367823103160496">Blocco del puntatore del mouse.</translation> <translation id="8769662576926275897">Dettagli della carta</translation> <translation id="8770196827482281187">Metodo di immissione persiano (layout ISIRI 2901)</translation> <translation id="8774934320277480003">Margine superiore</translation> @@ -5237,6 +5236,7 @@ <translation id="8795668016723474529">Aggiungi una carta di credito</translation> <translation id="8795916974678578410">Nuova finestra</translation> <translation id="8798099450830957504">Predefinito</translation> +<translation id="8799127529310003270">Se attivo, le chiamate InputConnection vengono eseguite sul thread IME e invece di mantenere un editor di repliche, ogni chiamata InputConnection dialogherà direttamente con il renderer.</translation> <translation id="8799839487311913894">Consente di attivare l'aggiornamento di una password in Gestione password dopo avere inviato un modulo per la modifica della password.</translation> <translation id="8800004011501252845">Destinazioni per</translation> <translation id="8800420788467349919">Volume: <ph name="PRECENTAGE" />%</translation> @@ -5262,6 +5262,7 @@ <translation id="8841142799574815336">Area visibile generale inerte.</translation> <translation id="884264119367021077">Indirizzo di spedizione</translation> <translation id="8844238624737526720">Consente di utilizzare la nuova implementazione ottimizzata del Task Manager di Chrome.</translation> +<translation id="8845001906332463065">Accedi al Centro assistenza</translation> <translation id="8846141544112579928">Ricerca tastiera in corso...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Passaggio a modalità tasto Maiusc</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 92e762e8..de040da 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">הוסף דף זה לסימניות...</translation> <translation id="1047956942837015229">מוחק <ph name="COUNT" /> פריטים...</translation> <translation id="1048597748939794622">מופעל באופן מאולץ עבור כל השכבות</translation> +<translation id="1049795001945932310">הגד&רות שפה</translation> <translation id="1049926623896334335">מסמך Word</translation> <translation id="1054153489933238809">פתח את ה&תמונה המקורית בכרטיסייה חדשה</translation> <translation id="1055806300943943258">מחפש מכשירי Bluetooth ו-USB...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">תעתוק (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">שרתי שמות אוטומטיים</translation> <translation id="1215411991991485844">נוסף יישום רקע חדש</translation> +<translation id="1216954813581739968">הפעלת כרטיסייה לשיתוף שולחן עבודה.</translation> <translation id="121827551500866099">הצג את כל ההורדות...</translation> <translation id="122082903575839559">אלגוריתם חתימה של אישור </translation> <translation id="1221024147024329929">PKCS #1 MD2 עם הצפנת RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">נכשל הניסיון לכניסה האוטומטית</translation> <translation id="1293556467332435079">קבצים</translation> <translation id="1294298200424241932">ערוך הגדרות אמון:</translation> +<translation id="1295794900245526845">בחר בחשבון שלך שנשמר ב-<ph name="PASSWORD_MANAGER_BRAND" /> כדי להיכנס</translation> <translation id="1297175357211070620">יעד</translation> <translation id="1297922636971898492">Google Drive אינו זמין כעת. ההעלאה תופעל מחדש באופן אוטומטי לאחר ש-Google Drive יחזור לפעול.</translation> <translation id="1300861494336759522">ניתוב מחדש של חיפוש בשולחן העבודה של Windows</translation> @@ -288,6 +291,7 @@ <translation id="1434696352799406980">פעולה זו תאפס את דף הפתיחה, את דף הכרטיסייה החדשה, את מנוע החיפוש ואת הכרטיסיות המוצמדות שלך. היא גם תשבית את כל התוספים ותמחק נתונים זמניים כגון קובצי Cookie. הסימניות, ההיסטוריה והסיסמאות השמורות לא יימחקו.</translation> <translation id="1434886155212424586">דף הבית הוא הדף 'כרטיסייה חדשה'</translation> <translation id="1435550882135542937">עיצוב מחדש לסרגל הכלים של התוסף</translation> +<translation id="1436402875660227532">שים לב: ההגדרות האלה אינן בשימוש עוד במערכת, אבל תוכל עדיין להציג ולערוך אותן.</translation> <translation id="1436784010935106834">הוסר</translation> <translation id="1438632560381091872">ביטול השתקת כרטיסיות</translation> <translation id="1441841714100794440">מקלדת וייטנאמית (Telex)</translation> @@ -318,6 +322,7 @@ <translation id="14720830734893704">הפעל תמיכה במקלדת וירטואלית.</translation> <translation id="1474079335130556426">הפעלת מצב רקע עבור Push API. פעולה זו מאפשרת ל-Chrome להמשיך לפעול לאחר סגירת החלון האחרון, ולהתחיל לפעול במהלך אתחול מערכת ההפעלה, אם Push API מחייב זאת.</translation> <translation id="1474339897586437869">הקובץ "<ph name="FILENAME" />" לא הועלה. אין לך מספיק שטח פנוי ב-Google Drive.</translation> +<translation id="1476607407192946488">הגד&רות שפה</translation> <translation id="1476949146811612304">הגדר איזה מנוע חיפוש יופעל בעת חיפוש ב<ph name="BEGIN_LINK" />סרגל הכתובות<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">קובץ שמור של אסימון ממשק API של זהות</translation> <translation id="1478340334823509079">פרטים: <ph name="FILE_NAME" /></translation> @@ -645,6 +650,7 @@ <translation id="1962233722219655970">דף זה משתמש ביישום Native Client שאינו פועל במחשב שלך.</translation> <translation id="1965328510789761112">זיכרון פרטי</translation> <translation id="1965624977906726414">אין הרשאות מיוחדות.</translation> +<translation id="1968720524450620475">הפעל סמלי פעולה להודעות אינטרנט.</translation> <translation id="1970746430676306437">צפה בפרטי הדף</translation> <translation id="197288927597451399">שמור</translation> <translation id="1973491249112991739">הורדת <ph name="PLUGIN_NAME" /> נכשלה.</translation> @@ -899,6 +905,7 @@ <translation id="2344262275956902282">השתמש במקשים - וכן = כדי ליצור רשימת מועמדים</translation> <translation id="2347476388323331511">הסנכרון נכשל</translation> <translation id="2347991999864119449">אני רוצה לבחור בעצמי מתי להריץ תוכן פלאגין</translation> +<translation id="2348165084656290171">כדי לשתף אודיו, בחר כרטיסייה או מסך שלם.</translation> <translation id="2350182423316644347">מאתחל את היישום...</translation> <translation id="2350796302381711542">האם לאפשר ל-<ph name="HANDLER_HOSTNAME" /> לפתוח את כל קישורי <ph name="PROTOCOL" /> במקום את <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">שפה וקלט</translation> @@ -986,6 +993,7 @@ <translation id="247772113373397749">מקלדת רב-לשונית קנדית</translation> <translation id="2478176599153288112">הרשאות של קובץ מדיה עבור "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">בטל את הנעילה של <ph name="DEVICE_TYPE" /> רק כשהטלפון שלך נמצא בהישג יד.</translation> +<translation id="247949520305900375">שתף אודיו</translation> <translation id="2479780645312551899">הפעל הפעם את כל יישומי הפלאגין</translation> <translation id="2480626392695177423">החלף מצב ניקוד ברוחב מלא/חלקי</translation> <translation id="2481332092278989943">הוספה למדף</translation> @@ -1300,6 +1308,7 @@ <translation id="2889064240420137087">פתח קישור באמצעות...</translation> <translation id="2889925978073739256">המשך לחסום יישומי פלאגין שאינם בארגז חול</translation> <translation id="2890624088306605051">אחזר רק הגדרות ונתונים שסונכרנו</translation> +<translation id="2890678560483811744">התייחסות לדף מחוץ לטווח</translation> <translation id="2893168226686371498">דפדפן ברירת מחדל</translation> <translation id="289426338439836048">רשת אחרת לנייד...</translation> <translation id="2894745200702272315">מאפשר גרסה ניסיונית של תכונות זיהוי מילות הפעלה ב-Ok Google בהתאם לחומרה.</translation> @@ -1328,7 +1337,6 @@ <translation id="2925966894897775835">גיליונות אלקטרוניים</translation> <translation id="2927017729816812676">אחסון קבצים שמורים</translation> <translation id="2927657246008729253">שנה...</translation> -<translation id="2928415919076124714">הסתר את סרגל הכלים במסך מלא</translation> <translation id="2928526264833629376">המשך ל-Hangouts</translation> <translation id="2930644991850369934">אירעה בעיה במהלך ההורדה של תמונת השחזור. החיבור לרשת נותק.</translation> <translation id="293111069139560936">מאפשר למדף למזער חלון אם במדף מתבצעת לחיצה על פריט שמשויך לו חלון יחיד ופעיל.</translation> @@ -1452,6 +1460,7 @@ <translation id="3117812041123364382">הפעל/השבת את המקלדת הווירטואלית הצפה.</translation> <translation id="3118319026408854581">עזרה של <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">ההצפנה לא מספיקה לפעולה נתונה במכשיר: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">הפעל סמלים בלחצני פעולה להודעות אינטרנט.</translation> <translation id="3121793941267913344">אפס את מכשיר <ph name="IDS_SHORT_PRODUCT_NAME" /> זה</translation> <translation id="3122162841865761901">ניסויים בכלים למפתחים</translation> <translation id="3122464029669770682">CPU</translation> @@ -1571,7 +1580,6 @@ <translation id="3289566588497100676">קלט סמלים קל</translation> <translation id="3289856944988573801">כדי לבדוק אם יש עדכונים, השתמש ב-Ethernet או ב-Wi-Fi.</translation> <translation id="3293325348208285494">התחלה מהירה</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" יוכל לקרוא ולכתוב תמונות, סרטונים וקובצי קול בתיקיות המסומנות.</translation> <translation id="3294437725009624529">אורח</translation> <translation id="329650768420594634">אזהרת 'ארוז תוסף'</translation> <translation id="3296763833017966289">גרוזינית</translation> @@ -1629,6 +1637,7 @@ <translation id="3338239663705455570">מקלדת סלובנית</translation> <translation id="3340978935015468852">הגדרות</translation> <translation id="3341703758641437857">אפשר גישה לכתובות אתרים של קבצים</translation> +<translation id="3343813173145836998">כניסה קלה לחשבון במכשיר הזה</translation> <translation id="3344786168130157628">שם נקודת הגישה:</translation> <translation id="3345135638360864351">לא ניתן היה לשלוח אל <ph name="NAME" /> את הבקשה שלך לגשת לאתר הזה. נסה שוב.</translation> <translation id="3345886924813989455">לא נמצא דפדפן נתמך</translation> @@ -2108,6 +2117,7 @@ <translation id="3996912167543967198">מאפס...</translation> <translation id="3997015411467176489">תכונות ניסיוניות של בד ציור</translation> <translation id="40027638859996362">העברת מילה</translation> +<translation id="400554499662786523">כדי לשתף אודיו, בחר כרטיסייה.</translation> <translation id="4012550234655138030">הגדר או נהל מדפסות ב-<ph name="CLOUD_PRINT_NAME" /></translation> <translation id="4014432863917027322">לתקן את '<ph name="EXTENSION_NAME" />'?</translation> <translation id="4018133169783460046">הצג את <ph name="PRODUCT_NAME" /> בשפה זו</translation> @@ -2210,6 +2220,7 @@ <translation id="4180788401304023883">למחוק את אישור CA של "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">מקלדת רוסית פונטית (YaZHert)</translation> <translation id="4181841719683918333">שפות</translation> +<translation id="4187248015940562149">מפעיל Bluetooth באינטרנט. מצב זה יכול להתיר לאתרים להתחבר אל מכשירי Bluetooth בסביבתך ולשלוט בהם.</translation> <translation id="4188026131102273494">מילת מפתח:</translation> <translation id="4189406272289638749">ההגדרה הזו נמצאת בשליטה של תוסף - <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">מסמך Google</translation> @@ -2266,6 +2277,7 @@ <translation id="4268025649754414643">קידוד מפתח</translation> <translation id="4268574628540273656">כתובת אתר:</translation> <translation id="4270393598798225102">גרסה <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">אין התאמות</translation> <translation id="4274187853770964845">שגיאת סנכרון: הפסק והפעל מחדש את הסנכרון.</translation> <translation id="4275830172053184480">הפעלת המכשיר מחדש</translation> <translation id="4276796043975446927">ברוכים הבאים אל Chromebox לניהול פגישות</translation> @@ -2335,6 +2347,7 @@ <translation id="4378551569595875038">מתחבר...</translation> <translation id="438122767399415311">כפה כיוון בממשק המשתמש</translation> <translation id="4381849418013903196">נקודותיים</translation> +<translation id="4383192539467954373">כניסה אוטומטית לחשבון במכשירים שונים</translation> <translation id="4384652540891215547">הפעל את התוסף</translation> <translation id="438503109373656455">אביר</translation> <translation id="4387554346626014084">הפעל סנכרון של מפעיל היישומים. פעולה זו מפעילה את 'תיקיות' היכן שזמין (לא ל-OSX).</translation> @@ -2352,6 +2365,7 @@ <translation id="4421932782753506458">לקיק</translation> <translation id="4422347585044846479">ערוך סימניה עבור דף זה</translation> <translation id="4422428420715047158">דומיין:</translation> +<translation id="4423482519432579560">&בדיקת איות</translation> <translation id="442477792133831654">אפשר תקשורת עם מכשירים בקרבת מקום</translation> <translation id="4425149324548788773">האחסון שלי</translation> <translation id="4428582326923056538">חריגי המצלמה בשביל Adobe Flash Player הם שונים.</translation> @@ -2366,6 +2380,7 @@ <translation id="444267095790823769">חריגים בתוכן מוגן</translation> <translation id="4443536555189480885">&עזרה</translation> <translation id="4444304522807523469">גישה לסורקי מסמכים המחוברים באמצעות USB או ברשת המקומית</translation> +<translation id="4445559854264555037">לא רואה את המכשיר? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">שיקוף</translation> <translation id="4447465454292850432">סוללה:</translation> <translation id="4449935293120761385">על 'מילוי אוטומטי'</translation> @@ -2624,6 +2639,7 @@ <translation id="485316830061041779">גרמנית</translation> <translation id="4856478137399998590">שירות הנתונים הסלולריים פועל ומוכן לשימוש</translation> <translation id="4858913220355269194">מסי</translation> +<translation id="4860565041166337978">התר למנהל ההורדות של המערכת לטפל בהורדות כשניתן.</translation> <translation id="48607902311828362">מצב טיסה</translation> <translation id="4861833787540810454">הפ&על</translation> <translation id="4862050643946421924">מוסיף מכשיר...</translation> @@ -2707,7 +2723,6 @@ <translation id="4977942889532008999">אשר גישה</translation> <translation id="4982718461356080574">הסתרה של לחצני סגירה בכרטיסיות לא פעילות כשהן בערימה</translation> <translation id="498294082491145744">שינוי ההגדרות לגישה של אתרים לתכונות כמו קובצי cookie, JavaScript, יישומי פלאגין, מיקום גיאוגרפי, מיקרופון, מצלמה וכו'.</translation> -<translation id="4984329823325527157">API של מקור המדיה</translation> <translation id="4988526792673242964">דפים</translation> <translation id="4988792151665380515">נכשל ייצוא מפתח ציבורי.</translation> <translation id="49896407730300355">סובב נ&גד כיוון השעון</translation> @@ -2896,7 +2911,6 @@ <translation id="5268606875983318825">PPAPI (אינו בשימוש)</translation> <translation id="526926484727016706">גורם לדחייה של כל ההרשאות בכל ה-iframes כברירת מחדל. התרת הרשאות ספציפיות בשביל iframe ספציפי עשויה להיות כרוכה ברישום של שמות ההרשאות כערכים של מאפייני iframe חדשים.</translation> <translation id="5269977353971873915">ההדפסה נכשלה</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" יוכל לקרוא תמונות, סרטונים וקובצי קול בתיקיות המסומנות.</translation> <translation id="5271247532544265821">עבור בין מצבים של סינית פשוטה/מסורתית</translation> <translation id="5271549068863921519">שמור סיסמה</translation> <translation id="5273628206174272911">תכונה ניסיונית לניווט בהיסטוריה בתגובה לגלילת יתר אופקית.</translation> @@ -2933,6 +2947,7 @@ <translation id="5316716239522500219">שיקוף צגים</translation> <translation id="5317780077021120954">שמור</translation> <translation id="5319782540886810524">מקלדת לטבית</translation> +<translation id="532247166573571973">ייתכן שהשרת אינו נגיש. נסה שוב מאוחר יותר.</translation> <translation id="5323213332664049067">אמריקאית לטינית</translation> <translation id="532360961509278431">לא ניתן לפתוח את "$1" : $2</translation> <translation id="5324674707192845912">אתה עומד לבטל את רישום ה-<ph name="DEVICE_TYPE" /> הזה ב-Google כדי להשבית את היכולת לאיתור, מחיקה ונעילה של המכשיר מרחוק. לשם כך נדרש אתחול. האם ברצונך להמשיך?</translation> @@ -2985,11 +3000,11 @@ <translation id="5390284375844109566">מסד נתונים שנוסף לאינדקס</translation> <translation id="5392544185395226057">הפוך תמיכה ב-Native Client לפעילה.</translation> <translation id="5393125431335030955">הפלאגין הזה פועל רק בשולחן העבודה.</translation> -<translation id="5393559999218790205">השבתת קווי זמן של אנימציה במרכיב השכבות של ממשק המשתמש</translation> <translation id="5396126354477659676">הפלאגין <ph name="PEPPER_PLUGIN_NAME" /> ב-<ph name="PEPPER_PLUGIN_DOMAIN" /> מבקש גישה למחשב שלך.</translation> <translation id="539755880180803351">הוספת הערות לטופסי אינטרנט באמצעות השלמות מסוג השדה 'מילוי אוטומטי' כטקסט מציין מיקום.</translation> <translation id="5397578532367286026">המנהל (<ph name="MANAGER_EMAIL" />) יכול לבדוק את השימוש וההיסטוריה של משתמש זה ב-chrome.com.</translation> <translation id="5397794290049113714">אתה</translation> +<translation id="5398572795982417028">התייחסות לדף מחוץ לטווח, המגבלה היא <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> מאתרים אחרים</translation> <translation id="5399158067281117682">קודי ה-PIN אינם תואמים!</translation> <translation id="5400640815024374115">השבב של Trusted Platform Module (TPM) מושבת או חסר.</translation> @@ -3009,7 +3024,7 @@ <translation id="5423849171846380976">מופעל</translation> <translation id="5425470845862293575">מאפשר את השימוש במערכת עיבוד הגופן הניסיונית DirectWrite.</translation> <translation id="5425722269016440406">עליך להיות מחובר לאינטרנט כדי לכבות את Smart Lock, מפני שהגדרה זו מסונכרנת עם הטלפון שלך ועם מכשירים אחרים. תחילה התחבר לרשת.</translation> -<translation id="5426623592374109001">השתמש בתת-מערכת אנימציה ישנה הגורמת להפרעות עבור אנימציות עם שכבות מורכבות בממשק המשתמש.</translation> +<translation id="5425863515030416387">כניסה קלה לחשבון במכשירים שונים</translation> <translation id="5427459444770871191">סובב &בכיוון השעון</translation> <translation id="5428105026674456456">ספרדית</translation> <translation id="542872847390508405">אתה גולש כאורח</translation> @@ -3034,6 +3049,7 @@ <translation id="5451646087589576080">הצג מסגרת &ופרטים</translation> <translation id="5453029940327926427">סגור כרטיסיות</translation> <translation id="5453632173748266363">קירילית</translation> +<translation id="5454166040603940656">עם <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">לא חוקי</translation> <translation id="5457459357461771897">קריאה ומחיקה של קובצי תמונות, מוזיקה ומדיה מסוגים נוספים מהמחשב שלך</translation> <translation id="5457599981699367932">גלוש כאורח</translation> @@ -3203,7 +3219,6 @@ <translation id="5708171344853220004">שם ראשי של Microsoft</translation> <translation id="5709885306771508267">שינוי גודל באמצעות תנועת צביטה</translation> <translation id="5710406368443808765">אופס! המערכת לא הצליחה לאחסן את האסימון והמזהה של המכשיר.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> לא מגיב. לא ניתן להעביר.</translation> <translation id="5711983031544731014">לא ניתן לבטל את הנעילה. הזן את הסיסמה שלך.</translation> <translation id="5712966208980506909">אם התכונה תופעל, כתובת האתר chrome://md-policy תטען את דף המדיניות של עיצוב חדשני תלת ממדי.</translation> <translation id="5715711091495208045">מתווך פלאגין: <ph name="PLUGIN_NAME" /></translation> @@ -3470,7 +3485,6 @@ <translation id="6111974609785983504">מופעל כברירת מחדל</translation> <translation id="6113134669445407638">השבת Delay Agnostic AEC ב-WebRTC. לשימוש במקרה שבו עיכובי המערכת שדווחו הם מהימנים מאוד, או אם אחרים נתקלים ב"הד" מהמחשב שלך.</translation> <translation id="6116921718742659598">שנה את הגדרות הקלט והשפה</translation> -<translation id="6117536376248197233">השבתת קווי זמן של אנימציה במרכיב השכבות ביוצרי תמונות ממוחשבות.</translation> <translation id="6120205520491252677">הצמד דף זה למסך הפתיחה...</translation> <translation id="6122081475643980456">החיבור שלך לאינטרנט נשלט על ידי גורם כלשהו</translation> <translation id="6122093587541546701">אימייל (אופציונלי):</translation> @@ -3502,6 +3516,7 @@ <translation id="6163522313638838258">הרחב את הכל...</translation> <translation id="6164005077879661055">כל הקבצים והנתונים המקומיים המשויכים למשתמש בפיקוח יימחקו לצמיתות לאחר שמשתמש בפיקוח זה יוסר. המנהל עדיין יוכל לראות את האתרים שבהם משתמש בפיקוח זה ביקר, ואת ההגדרות שלו, בכתובת <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">למידע נוסף</translation> +<translation id="6167008112175207002">הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות יסונכרנו עם חשבון Google שלך, כך שתוכל להשתמש בהם בכל המכשירים שלך. תוכל לשנות הגדרה זו ב-<ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">הדמיית תכונות החומרה של Ok Google</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">בחר אישור</translation> @@ -3705,6 +3720,7 @@ <translation id="648927581764831596">לא זמין</translation> <translation id="6490936204492416398">התקן תוספים חדשים מחנות האינטרנט</translation> <translation id="6492313032770352219">גודל בדיסק:</translation> +<translation id="6498249116389603658">&כל השפות שלך</translation> <translation id="6499143127267478107">מברר כתובת של שרת מארח בסקריפט של שרת Proxy...</translation> <translation id="6503077044568424649">הכי פופולריים</translation> <translation id="6503256918647795660">מקלדת צרפתית (שוויץ)</translation> @@ -3746,7 +3762,6 @@ <translation id="6555432686520421228">הסר את כל חשבונות המשתמשים ואפס את המכשיר <ph name="IDS_SHORT_PRODUCT_NAME" /> כך שיהיה כמו חדש.</translation> <translation id="6556866813142980365">בצע מחדש</translation> <translation id="6557565812667414268">הפעל רק עבור מסכים עם DPI גבוה</translation> -<translation id="655845594391856372">הכרטיסייה לא מגיבה. לא ניתן להעביר.</translation> <translation id="6559580823502247193">(כבר מוגדר במכשיר זה)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="6562437808764959486">מחלץ תמונת שחזור...</translation> @@ -3847,6 +3862,7 @@ <translation id="6723354935081862304">הדפס ל-Google Docs ויעדי ענן אחרים. <ph name="BEGIN_LINK" />היכנס<ph name="END_LINK" /> כדי להדפיס אל Google Cloud Print.</translation> <translation id="6723661294526996303">ייבא סימניות והגדרות...</translation> <translation id="6723839937902243910">חשמל</translation> +<translation id="6725240607822645708">הפעלת IME בשרשור משלו.</translation> <translation id="6725970970008349185">מספר המועמדים לתצוגה בדף</translation> <translation id="672609503628871915">מה חדש</translation> <translation id="6727005317916125192">החלונית הקודמת</translation> @@ -3976,12 +3992,11 @@ <translation id="6948736568813450284">אם אתה מפתח: השתמש בשירות ארגז החול לקריאות ממשק ה-API של Google Payments.</translation> <translation id="6949306908218145636">הוספת דפים פתוחים לסימניות...</translation> <translation id="695164542422037736">אם אפשרות זו מופעלת, ואם גוף הטקסט מעוצב עם background-attachment:fixed, לרקע תהיה שכבה מורכבת משלו.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> זוכר את הסיסמאות שלך ומכניס אותך לאתרים באופן אוטומטי במכשיר הזה.</translation> <translation id="6955446738988643816">בדוק חלון מוקפץ</translation> <translation id="695755122858488207">לחצן בחירה שלא נבחר</translation> +<translation id="6960277925159781810">כניסה אוטומטית במכשיר זה</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">הפעל סנכרון של נתונים לנייד</translation> -<translation id="6964308487066031935">להוסיף תיקיות אל "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">אישור</translation> <translation id="6965648386495488594">יציאה</translation> <translation id="6965978654500191972">התקן</translation> @@ -4079,7 +4094,6 @@ <translation id="7076293881109082629">כניסה</translation> <translation id="7077829361966535409">טעינת דף הכניסה באמצעות הגדרות שרת ה-proxy הנוכחיות נכשלה. <ph name="GAIA_RELOAD_LINK_START" />נסה להיכנס שוב<ph name="GAIA_RELOAD_LINK_END" /> או השתמש ב<ph name="PROXY_SETTINGS_LINK_START" />הגדרות שונות לשרת ה-proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">תוכניות לטיפול בפרוטוקולים שהתעלמו מהן</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" יוכל לקרוא ולמחוק תמונות, סרטונים וקובצי קול בתיקיות המסומנות.</translation> <translation id="708060913198414444">העתק כתובת &אודיו</translation> <translation id="708187310695946552">ממשק הבועות לשחזור הפעלה</translation> <translation id="7082055294850503883">התעלם ממצב CapsLock וקלוט אותיות קטנות כברירת מחדל</translation> @@ -4223,6 +4237,8 @@ <translation id="7313804056609272439">שיטת קלט וייטנאמית (VNI)</translation> <translation id="7314244761674113881">מארח SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (הנוכחי)</translation> +<translation id="7321545336522791733">השרת אינו נגיש</translation> +<translation id="7324841169865301118">מאפשר למשתמש לבחור כרטיסייה לשיתוף שולחן עבודה.</translation> <translation id="7325437708553334317">תוסף ניגודיות גבוהה</translation> <translation id="7326565110843845436">לחיצה בשלוש אצבעות על לוח המגע</translation> <translation id="73289266812733869">לא נבחר</translation> @@ -4441,7 +4457,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" רוצה להסיר את "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> מוצג בשפה זו</translation> <translation id="7654941827281939388">חשבון זה כבר נמצא בשימוש במחשב זה.</translation> -<translation id="7655165758820095116">אובייקט MediaSource מאפשר ל-JavaScript לשלוח נתוני מדיה ישירות לרכיב וידאו.</translation> <translation id="7658239707568436148">ביטול</translation> <translation id="7659584679870740384">אין לך אישור להשתמש במכשיר הזה. צור קשר עם מנהל המערכת כדי לקבל הרשאה לכניסה.</translation> <translation id="7664620655576155379">מכשיר Bluetooth שאינו נתמך: "<ph name="DEVICE_NAME" />".</translation> @@ -4572,6 +4587,7 @@ <translation id="7861215335140947162">&הורדות</translation> <translation id="7864539943188674973">השבת Bluetooth</translation> <translation id="7868891395842935202">מפעיל את 'המסגרת הניסיונית' לקביעת גישה לניסויי API.</translation> +<translation id="7870576007982733437">שימוש במנהל ההורדות של המערכת כשניתן.</translation> <translation id="7870790288828963061">לא נמצאו אפליקציות קיוסק בגרסה חדשה יותר. אין צורך בעדכון. הסר את הדיסק און קי.</translation> <translation id="787150342916295244">סריקת כרטיס אשראי</translation> <translation id="7874357055309047713">הרץ תמיד בכל האתרים</translation> @@ -4614,7 +4630,6 @@ <translation id="7918257978052780342">הירשם</translation> <translation id="7920092496846849526">שאלת את ההורים אם זה בסדר לבקר בדף זה.</translation> <translation id="7925285046818567682">ממתין ל- <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> זוכר את הסיסמאות שלך ומכניס אותך לאפליקציות ולאתרים באופן אוטומטי בכל המכשירים.</translation> <translation id="7925686952655276919">אין להשתמש בנתונים ניידים עבור סנכרון</translation> <translation id="7926906273904422255">סמן מקורות לא מאובטחים כ'לא מאובטחים' או כ'מפוקפקים'.</translation> <translation id="7928710562641958568">הוצא את המכשיר</translation> @@ -4676,7 +4691,6 @@ שמור על קובץ המפתח שלך במקום בטוח. תצטרך אותו כדי ליצור גרסאות חדשות של התוסף שלך.</translation> <translation id="799923393800005025">יכול להציג</translation> <translation id="7999338963698132743">מנהל משימות חדש</translation> -<translation id="8000004253404706714">השתמש בתת-מערכת אנימציה ישנה הגורמת להפרעות עבור אנימציות עם שכבות מורכבות ביוצרי תמונות ממוחשבות.</translation> <translation id="8004582292198964060">דפדפן</translation> <translation id="8007030362289124303">סוללה חלשה</translation> <translation id="8008356846765065031">האינטרנט מנותק. בדוק את חיבור האינטרנט.</translation> @@ -4805,6 +4819,7 @@ <translation id="8185331656081929126">הצג הודעות כאשר מזוהות מדפסות חדשות ברשת</translation> <translation id="8186609076106987817">השרת לא הצליח למצוא את הקובץ.</translation> <translation id="8186706823560132848">תוכנה</translation> +<translation id="8188120771410500975">בדוק את האיות של &שדות הטקסט</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> ו-<ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> נוספות</translation> <translation id="8190193592390505034">מתחבר אל <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">לנהל את היישומים, התוספים והעיצובים שלך</translation> @@ -5197,6 +5212,7 @@ <translation id="8765985713192161328">נהל מטפלים...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">משתמשים</translation> +<translation id="8768367823103160496">נעילה של סמן העכבר</translation> <translation id="8769662576926275897">פרטי כרטיס</translation> <translation id="8770196827482281187">פריסת מקלדת פרסית (פריסת ISIRI 2901)</translation> <translation id="8774934320277480003">שוליים עליונים</translation> @@ -5216,6 +5232,7 @@ <translation id="8795668016723474529">הוסף כרטיס אשראי</translation> <translation id="8795916974678578410">חלון חדש</translation> <translation id="8798099450830957504">ברירת מחדל</translation> +<translation id="8799127529310003270">אם התכונה מופעלת, InputConnection קורא להפעלה בשרשור IME, ובמקום לשמור עורך עותק, כל קריאת InputConnection תתקשר באופן ישיר עם הכלי לעיבוד.</translation> <translation id="8799839487311913894">הפעל עדכון סיסמה במנהל הסיסמאות לאחר שליחת טופס ’שנה סיסמה’.</translation> <translation id="8800004011501252845">מציג יעדים עבור</translation> <translation id="8800420788467349919">נפח: %<ph name="PRECENTAGE" /></translation> @@ -5241,6 +5258,7 @@ <translation id="8841142799574815336">אזור תצוגה חזותי קבוע</translation> <translation id="884264119367021077">כתובת למשלוח</translation> <translation id="8844238624737526720">השתמש ביישום החדש והמשופר של מנהל המשימות של Chrome.</translation> +<translation id="8845001906332463065">קבל עזרה</translation> <translation id="8846141544112579928">מחפש מקלדת...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">החלפת מצב של מקש ה-Shift</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 1acba42..2a016d00 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">ブックマークに追加...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> 件の項目を削除しています...</translation> <translation id="1048597748939794622">すべてのレイヤーに対して強制的に有効になります</translation> +<translation id="1049795001945932310">言語設定(&L)</translation> <translation id="1049926623896334335">Word ドキュメント</translation> <translation id="1054153489933238809">元の画像を新しいタブで開く(&I)</translation> <translation id="1055806300943943258">Bluetooth デバイスと USB デバイスを検索しています...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">文字変換(namaste → નમસ્તે)</translation> <translation id="1209796539517632982">自動ネーム サーバー</translation> <translation id="1215411991991485844">新しいバックグラウンド アプリが追加されました</translation> +<translation id="1216954813581739968">デスクトップ共有用にタブを有効にする。</translation> <translation id="121827551500866099">すべてのダウンロードを表示</translation> <translation id="122082903575839559">証明書の署名アルゴリズム</translation> <translation id="1221024147024329929">PKCS #1 MD2 with RSA 暗号化</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">自動ログインに失敗しました</translation> <translation id="1293556467332435079">ファイル</translation> <translation id="1294298200424241932">信頼の設定を変更:</translation> +<translation id="1295794900245526845"><ph name="PASSWORD_MANAGER_BRAND" /> で保存されたアカウントからログインするアカウントを選択</translation> <translation id="1297175357211070620">送信先</translation> <translation id="1297922636971898492">Google ドライブは現在ご利用いただけません。Google ドライブが利用可能になったときに、自動的にアップロードを再開します。</translation> <translation id="1300861494336759522">Windows デスクトップ検索のリダイレクト</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">起動ページ、新しいタブページ、検索エンジン、固定タブをリセットします。また、すべての拡張機能を無効にし、Cookie などの一時データを消去します。ただし、ブックマーク、履歴、保存したパスワードはそのまま残ります。</translation> <translation id="1434886155212424586">ホームページは新しいタブのページです</translation> <translation id="1435550882135542937">拡張機能ツールバーのデザイン変更</translation> +<translation id="1436402875660227532">注: これらの設定はこのシステムでは現在使われていません。ただし、設定の表示と編集は可能です。</translation> <translation id="1436784010935106834">削除しました</translation> <translation id="1438632560381091872">タブのミュートを解除</translation> <translation id="1441841714100794440">ベトナム語キーボード(テレックス)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">仮想キーボードのサポートを有効にします。</translation> <translation id="1474079335130556426">Push API 用のバックグラウンド モードを有効にします。このモードを有効にすると、Push API で必要な場合、Chrome は最後のウィンドウを閉じても引き続き実行され、また OS の起動時に一緒に起動します。</translation> <translation id="1474339897586437869">「<ph name="FILENAME" />」はアップロードされていません。Google ドライブに十分な空き容量がありません。</translation> +<translation id="1476607407192946488">言語設定(&L)</translation> <translation id="1476949146811612304"> <ph name="BEGIN_LINK" />アドレスバー<ph name="END_LINK" /> から検索するときに使用する検索エンジンを設定します。</translation> <translation id="1477301030751268706">Identity API トークン キャッシュ</translation> @@ -650,6 +655,7 @@ <translation id="1962233722219655970">このページは、お使いのパソコンでは動作しないネイティブ クライアント アプリを使用しています。</translation> <translation id="1965328510789761112">専有メモリ</translation> <translation id="1965624977906726414">特別な権限はありません。</translation> +<translation id="1968720524450620475">ウェブ通知の操作アイコンを有効にする。</translation> <translation id="1970746430676306437">ページ情報を表示(&I)</translation> <translation id="197288927597451399">保存</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> のダウンロードに失敗しました。</translation> @@ -909,6 +915,7 @@ <translation id="2344262275956902282">- キーと = キーで候補リストのページを切り替える</translation> <translation id="2347476388323331511">同期できませんでした</translation> <translation id="2347991999864119449">プラグイン コンテンツをいつ実行するかを選択する</translation> +<translation id="2348165084656290171">音声を共有するには、タブまたは画面全体を選択します。</translation> <translation id="2350182423316644347">アプリケーションを初期化しています...</translation> <translation id="2350796302381711542">すべての <ph name="PROTOCOL" /> リンクを <ph name="REPLACED_HANDLER_TITLE" /> ではなく <ph name="HANDLER_HOSTNAME" /> で開きますか?</translation> <translation id="2351266942280602854">言語と入力</translation> @@ -996,6 +1003,7 @@ <translation id="247772113373397749">カナダ多言語キーボード</translation> <translation id="2478176599153288112">「<ph name="EXTENSION" />」のメディアファイル権限</translation> <translation id="2478830106132467213">手の届く範囲にスマートフォンがある場合のみ、この <ph name="DEVICE_TYPE" /> のロックを解除します。</translation> +<translation id="247949520305900375">音声を共有する</translation> <translation id="2479780645312551899">今回はすべてのプラグインを実行</translation> <translation id="2480626392695177423">句読記号の全角/半角モードを切り替える</translation> <translation id="2481332092278989943">シェルフに追加</translation> @@ -1310,6 +1318,7 @@ <translation id="2889064240420137087">次のプログラムでリンクを開く...</translation> <translation id="2889925978073739256">サンドボックスの無効化プラグインを引き続きブロックする</translation> <translation id="2890624088306605051">同期された設定とデータのみを取得する</translation> +<translation id="2890678560483811744">範囲外のページを参照しています</translation> <translation id="2893168226686371498">既定のブラウザ</translation> <translation id="289426338439836048">他のモバイル ネットワーク...</translation> <translation id="2894745200702272315">試験運用版の「OK Google」注目ワード検出機能(ハードウェア使用)を有効にします。</translation> @@ -1338,7 +1347,6 @@ <translation id="2925966894897775835">スプレッドシート</translation> <translation id="2927017729816812676">キャッシュ ストレージ</translation> <translation id="2927657246008729253">変更...</translation> -<translation id="2928415919076124714">全画面表示でツールバーを非表示にする</translation> <translation id="2928526264833629376">ハングアウトに進む</translation> <translation id="2930644991850369934">リカバリ イメージのダウンロード中に問題が発生しました。ネットワーク接続が切断されました。</translation> <translation id="293111069139560936">アクティブなウィンドウが 1 つだけ関連付けられているシェルフ アイテムがクリックされた場合に、ウィンドウを最小化できるようにします。</translation> @@ -1462,6 +1470,7 @@ <translation id="3117812041123364382">フローティング仮想キーボードを有効または無効にします。</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> ヘルプ</translation> <translation id="3120430004221004537">「<ph name="DEVICE_NAME" />」で、指定された操作に必要な暗号化が行われていません。</translation> +<translation id="3121260210578524273">操作ボタンでウェブ通知のアイコンを有効にする</translation> <translation id="3121793941267913344">この <ph name="IDS_SHORT_PRODUCT_NAME" /> 搭載デバイスをリセットします</translation> <translation id="3122162841865761901">デベロッパー ツールの試験運用版機能</translation> <translation id="3122464029669770682">CPU</translation> @@ -1582,7 +1591,6 @@ <translation id="3289566588497100676">簡単な記号入力</translation> <translation id="3289856944988573801">アップデートの有無を確認するには、イーサネットまたは Wi-Fi を使用してください。</translation> <translation id="3293325348208285494">高速スタート</translation> -<translation id="3293894718455402932">「<ph name="EXTENSION" />」は、選択されたフォルダ内の画像、動画、音声ファイルの読み取りと書き込みを行うことができます。</translation> <translation id="3294437725009624529">ゲスト</translation> <translation id="329650768420594634">拡張機能のパッケージ化に関する警告</translation> <translation id="3296763833017966289">グルジア語</translation> @@ -1640,6 +1648,7 @@ <translation id="3338239663705455570">スロベニア語のキーボード</translation> <translation id="3340978935015468852">設定</translation> <translation id="3341703758641437857">ファイルの URL へのアクセスを許可する</translation> +<translation id="3343813173145836998">このデバイスで簡単ログイン</translation> <translation id="3344786168130157628">アクセス ポイント名:</translation> <translation id="3345135638360864351">このサイトにアクセスするためのリクエストを <ph name="NAME" /> に送信できませんでした。もう一度お試しください。</translation> <translation id="3345886924813989455">サポートされているブラウザが見つかりませんでした</translation> @@ -2119,6 +2128,7 @@ <translation id="3996912167543967198">リセットしています...</translation> <translation id="3997015411467176489">試験運用版の canvas 機能</translation> <translation id="40027638859996362">1 語移動する</translation> +<translation id="400554499662786523">音声を共有するには、タブを選択します。</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" /> でのプリンタの設定と管理。</translation> <translation id="4014432863917027322">「<ph name="EXTENSION_NAME" />」を修復しますか?</translation> <translation id="4018133169783460046"><ph name="PRODUCT_NAME" /> をこの言語で表示</translation> @@ -2221,6 +2231,7 @@ <translation id="4180788401304023883">CA 証明書「<ph name="CERTIFICATE_NAME" />」を削除しますか?</translation> <translation id="418179967336296930">ロシア語表音(YaZHert)キーボード</translation> <translation id="4181841719683918333">言語</translation> +<translation id="4187248015940562149">ウェブ Bluetooth を有効にします。ウェブ Bluetooth により、ウェブサイトはユーザーの近くにある Bluetooth デバイスに接続し、そのデバイスを制御することができます。</translation> <translation id="4188026131102273494">キーワード:</translation> <translation id="4189406272289638749">拡張機能 <b><ph name="EXTENSION_NAME" /></b> がこの設定を制御しています。</translation> <translation id="4193154014135846272">Google ドキュメント</translation> @@ -2277,6 +2288,7 @@ <translation id="4268025649754414643">キーの暗号化</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">バージョン <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">一致する結果は見つかりませんでした</translation> <translation id="4274187853770964845">同期エラー: 同期を停止してからもう一度開始してください。</translation> <translation id="4275830172053184480">デバイスの再起動</translation> <translation id="4276796043975446927">Chromebox for meetings へようこそ</translation> @@ -2346,6 +2358,7 @@ <translation id="4378551569595875038">接続中...</translation> <translation id="438122767399415311">ユーザー インターフェ-ース言語の方向を強制的に適用する</translation> <translation id="4381849418013903196">コロン</translation> +<translation id="4383192539467954373">すべてのデバイスで自動ログイン</translation> <translation id="4384652540891215547">拡張機能を有効にする</translation> <translation id="438503109373656455">サラトガ</translation> <translation id="4387554346626014084">アプリ ランチャーの同期を有効にします。使用できるフォルダがあれば有効になります(OSX 以外)。</translation> @@ -2363,6 +2376,7 @@ <translation id="4421932782753506458">フワフワ</translation> <translation id="4422347585044846479">このページのブックマークを編集します</translation> <translation id="4422428420715047158">ドメイン:</translation> +<translation id="4423482519432579560">スペルチェック(&S)</translation> <translation id="442477792133831654">近くのデバイスとの通信</translation> <translation id="4425149324548788773">マイドライブ</translation> <translation id="4428582326923056538">Adobe Flash Player のカメラの例外が異なります。</translation> @@ -2377,6 +2391,7 @@ <translation id="444267095790823769">保護されたコンテンツの例外</translation> <translation id="4443536555189480885">ヘルプ(&H)</translation> <translation id="4444304522807523469">USB 接続またはローカル ネットワーク上のドキュメント スキャナーへのアクセス</translation> +<translation id="4445559854264555037">お使いのデバイスが表示されない場合は、<ph name="GET_HELP_LINK" /> をご覧ください。</translation> <translation id="4446933390699670756">ミラーリング</translation> <translation id="4447465454292850432">バッテリー:</translation> <translation id="4449935293120761385">自動入力について</translation> @@ -2635,6 +2650,7 @@ <translation id="485316830061041779">ドイツ語</translation> <translation id="4856478137399998590">モバイル データ サービスがご利用いただけるようになりました</translation> <translation id="4858913220355269194">フリッツ</translation> +<translation id="4860565041166337978">可能な場合はシステムのダウンロード マネージャーでダウンロードを処理できるようにする。</translation> <translation id="48607902311828362">機内モード</translation> <translation id="4861833787540810454">再生(&P)</translation> <translation id="4862050643946421924">デバイスを追加中...</translation> @@ -2718,7 +2734,6 @@ <translation id="4977942889532008999">アクセスの確認</translation> <translation id="4982718461356080574">スタック時にアクティブでないタブの [閉じる] ボタンを非表示にする</translation> <translation id="498294082491145744">Cookie、JavaScript、プラグイン、位置情報、マイク、カメラなどの機能へのウェブサイトからのアクセスを制御する設定を変更します。</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">ページ</translation> <translation id="4988792151665380515">公開鍵をエクスポートできませんでした。</translation> <translation id="49896407730300355">反時計回りに回転(&O)</translation> @@ -2907,7 +2922,6 @@ <translation id="5268606875983318825">PPAPI(プロセス外)</translation> <translation id="526926484727016706">すべての iframe ですべての権限が既定で拒否されます。iframe に対して特定の権限を許可した場合、その権限の名前が新しい iframe 属性の値として表示されることがあります。</translation> <translation id="5269977353971873915">印刷の失敗</translation> -<translation id="5270884342523754894">「<ph name="EXTENSION" />」は、選択されたフォルダ内の画像、動画、音声ファイルの読み取りを行うことができます。</translation> <translation id="5271247532544265821">中国語の簡体/繁体モードを切り替える</translation> <translation id="5271549068863921519">パスワードを保存</translation> <translation id="5273628206174272911">横方向のオーバースクロールに応じた履歴表示(試験運用版)。</translation> @@ -2944,6 +2958,7 @@ <translation id="5316716239522500219">モニターをミラーリングする</translation> <translation id="5317780077021120954">保存</translation> <translation id="5319782540886810524">ラトビア語のキーボード</translation> +<translation id="532247166573571973">サーバーへのアクセスに問題が起こっている可能性があります。しばらくしてからもう一度お試しください。</translation> <translation id="5323213332664049067">ラテン アメリカ</translation> <translation id="532360961509278431">「$1」を開くことができません: $2</translation> <translation id="5324674707192845912">Google に対するこの <ph name="DEVICE_TYPE" /> の登録を解除すると、リモートからのデバイスの検出、データ消去、ロックを行うことができなくなります。登録解除を完了するには再起動が必要です。続行しますか?</translation> @@ -2996,11 +3011,11 @@ <translation id="5390284375844109566">Indexed Database</translation> <translation id="5392544185395226057">ネイティブ クライアントに対応できるようにします。</translation> <translation id="5393125431335030955">このプラグインは、デスクトップでのみ使用できます。</translation> -<translation id="5393559999218790205">UI の合成アニメーション タイムラインを無効にする</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> の <ph name="PEPPER_PLUGIN_NAME" /> がお使いのパソコンへのアクセスを求めています。</translation> <translation id="539755880180803351">自動入力欄型の予測機能をプレースホルダ テキストとしてウェブ フォームに追加します。</translation> <translation id="5397578532367286026">このユーザーの利用状況や履歴は、chrome.com で管理者(<ph name="MANAGER_EMAIL" />)によって確認されます。</translation> <translation id="5397794290049113714">あなた</translation> +<translation id="5398572795982417028">範囲外のページを参照しています。上限は <ph name="MAXIMUM_PAGE" /> です。</translation> <translation id="5398824043967640339">他のサイトから <ph name="COUNT" /> 個</translation> <translation id="5399158067281117682">PIN が一致しません。</translation> <translation id="5400640815024374115">Trusted Platform Module(TPM)チップは、無効であるか、存在しません。</translation> @@ -3020,7 +3035,7 @@ <translation id="5423849171846380976">有効</translation> <translation id="5425470845862293575">試験運用版の DirectWrite フォント レンダリング システムの使用を有効にします。</translation> <translation id="5425722269016440406">Smart Lock 設定はスマートフォンおよび他のデバイスと同期しているため、オフにするにはインターネットに接続する必要があります。まずネットワークに接続してください。</translation> -<translation id="5426623592374109001">UI の合成アニメーションで滑らかさに欠ける旧式のアニメーション サブシステムを使用します。</translation> +<translation id="5425863515030416387">すべてのデバイスで簡単ログイン</translation> <translation id="5427459444770871191">時計回りに回転(&C)</translation> <translation id="5428105026674456456">スペイン語</translation> <translation id="542872847390508405">ゲスト モードでブラウジング中</translation> @@ -3045,6 +3060,7 @@ <translation id="5451646087589576080">フレーム情報を表示(&I)</translation> <translation id="5453029940327926427">複数のタブを閉じる</translation> <translation id="5453632173748266363">キリル文字</translation> +<translation id="5454166040603940656">- <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">無効</translation> <translation id="5457459357461771897">パソコンからの写真、音楽、その他のメディアの読み取りと削除</translation> <translation id="5457599981699367932">ゲストとしてブラウジング</translation> @@ -3214,7 +3230,6 @@ <translation id="5708171344853220004">Microsoft プリンシパル名</translation> <translation id="5709885306771508267">ピンチ操作で拡大 / 縮小</translation> <translation id="5710406368443808765">デバイスのトークンと ID をシステムに保存できませんでした。</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> は応答していないため、キャストできません。</translation> <translation id="5711983031544731014">ロックを解除できません。パスワードを入力してください。</translation> <translation id="5712966208980506909">有効にした場合、chrome://md-policy にマテリアル デザインのポリシーページが表示されます。</translation> <translation id="5715711091495208045">プラグイン ブローカー: <ph name="PLUGIN_NAME" /></translation> @@ -3481,7 +3496,6 @@ <translation id="6111974609785983504">デフォルトで許可</translation> <translation id="6113134669445407638">Delay Agnostic AEC in WebRTC を無効にします。この設定は、報告されたシステムの遅延が信頼できるものである場合、または自分のマシンでの反響音が他のユーザーに影響を及ぼす場合に使用します。</translation> <translation id="6116921718742659598">言語と入力の設定を変更</translation> -<translation id="6117536376248197233">レンダラの合成アニメーション タイムラインを無効にする</translation> <translation id="6120205520491252677">このページを起動画面に固定...</translation> <translation id="6122081475643980456">インターネット接続が制限されています</translation> <translation id="6122093587541546701">メール(省略可):</translation> @@ -3513,6 +3527,7 @@ <translation id="6163522313638838258">すべてを展開...</translation> <translation id="6164005077879661055">この監視対象ユーザーを削除すると、このユーザーに関連付けられたすべてのファイルとローカル データも完全に削除されます。この監視対象ユーザーがアクセスしたウェブサイトやこのユーザーの設定は引き続き、管理者が <ph name="MANAGEMENT_URL" /> で見ることができます。</translation> <translation id="6165508094623778733">詳しく見る</translation> +<translation id="6167008112175207002">ブックマーク、履歴、パスワード、その他の設定が Google アカウントに同期され、どのデバイスでも利用できるようになります。この設定は次の場所で変更できます: <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">ハードウェア シミュレーションを使った「OK Google」機能</translation> <translation id="6175314957787328458">Microsoft ドメイン GUID</translation> <translation id="6178664161104547336">証明書の選択</translation> @@ -3716,6 +3731,7 @@ <translation id="648927581764831596">使用できるものはありません</translation> <translation id="6490936204492416398">ウェブストアからインストール</translation> <translation id="6492313032770352219">ディスク上のサイズ:</translation> +<translation id="6498249116389603658">選択したすべての言語(&A)</translation> <translation id="6499143127267478107">プロキシ スクリプト内のホストを解決しています...</translation> <translation id="6503077044568424649">よくアクセスするページ</translation> <translation id="6503256918647795660">フランス語(スイス)のキーボード</translation> @@ -3757,7 +3773,6 @@ <translation id="6555432686520421228">すべてのユーザー アカウントを削除し、<ph name="IDS_SHORT_PRODUCT_NAME" /> デバイスを出荷時と同じ状態にリセットします。</translation> <translation id="6556866813142980365">やり直す</translation> <translation id="6557565812667414268">高解像度ディスプレイでのみ有効にします</translation> -<translation id="655845594391856372">タブは応答していないため、キャストできません。</translation> <translation id="6559580823502247193">(このデバイスの既存ユーザー)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="6562437808764959486">リカバリ イメージを展開しています...</translation> @@ -3858,6 +3873,7 @@ <translation id="6723354935081862304">Google ドキュメントなどのクラウド上で印刷します。Google クラウド プリントで印刷するには、<ph name="BEGIN_LINK" />ログイン<ph name="END_LINK" />が必要です。</translation> <translation id="6723661294526996303">ブックマークと設定をインポート...</translation> <translation id="6723839937902243910">電源</translation> +<translation id="6725240607822645708">該当スレッドで IME を実行する。</translation> <translation id="6725970970008349185">1 ページに表示する候補数</translation> <translation id="672609503628871915">新機能を確認する</translation> <translation id="6727005317916125192">前のウィンドウ</translation> @@ -3988,12 +4004,11 @@ <translation id="6948736568813450284">デベロッパー向け情報: Google Payments API の呼び出しにはサンドボックス サービスをご利用ください。</translation> <translation id="6949306908218145636">開いているページをブックマーク...</translation> <translation id="695164542422037736">このオプションが有効で、body に background-attachment:fixed のスタイルが設定されている場合、バックグラウンドには単独の合成レイヤーが適用されます。</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> にこのデバイスで使用されたパスワードを保存して、サイトに自動的にログインします。</translation> <translation id="6955446738988643816">ポップアップを検証</translation> <translation id="695755122858488207">選択されていないラジオボタン</translation> +<translation id="6960277925159781810">このデバイスで自動ログイン</translation> <translation id="696036063053180184">3 ボル式(Shift なし)</translation> <translation id="696203921837389374">モバイルデータとの同期を有効にする</translation> -<translation id="6964308487066031935">「<ph name="EXTENSION" />」にフォルダを追加しますか?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">ポート</translation> <translation id="6965978654500191972">デバイス</translation> @@ -4092,7 +4107,6 @@ <translation id="7076293881109082629">ログイン中</translation> <translation id="7077829361966535409">現在のプロキシ設定を使用してログイン ページを読み込むことができませんでした。<ph name="GAIA_RELOAD_LINK_START" />もう一度ログイン<ph name="GAIA_RELOAD_LINK_END" />してみるか、別の<ph name="PROXY_SETTINGS_LINK_START" />プロキシ設定<ph name="PROXY_SETTINGS_LINK_END" />を使用してみてください。</translation> <translation id="7077872827894353012">無視したプロトコル ハンドラ</translation> -<translation id="7079038783243627996">「<ph name="EXTENSION" />」は、選択されたフォルダ内の画像、動画、音声ファイルの読み取りと削除を行うことができます。</translation> <translation id="708060913198414444">オーディオ アドレスをコピー(&C)</translation> <translation id="708187310695946552">セッション復元のバブル ユーザー インターフェース</translation> <translation id="7082055294850503883">CapsLock キーの状態を無視し、デフォルトで小文字を入力する</translation> @@ -4236,6 +4250,8 @@ <translation id="7313804056609272439">ベトナム語の入力方法(VNI)</translation> <translation id="7314244761674113881">SOCKS ホスト</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" />(現在)</translation> +<translation id="7321545336522791733">サーバーにアクセスできません</translation> +<translation id="7324841169865301118">デスクトップ共有用のタブをユーザーが選択できるようにします。</translation> <translation id="7325437708553334317">ハイコントラスト用拡張機能</translation> <translation id="7326565110843845436">タッチパッドの 3 本指タップ</translation> <translation id="73289266812733869">選択されていません</translation> @@ -4464,7 +4480,6 @@ <translation id="7650511557061837441">「<ph name="TRIGGERING_EXTENSION_NAME" />」が「<ph name="EXTENSION_NAME" />」の削除をリクエストしています。</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> はこの言語で表示されています</translation> <translation id="7654941827281939388">このアカウントは既にこのパソコンで使用されています。</translation> -<translation id="7655165758820095116">MediaSource オブジェクトを使って、JavaScript でメディアデータを動画要素に直接送信できるようにします。</translation> <translation id="7658239707568436148">キャンセル</translation> <translation id="7659584679870740384">このデバイスを使用する権限がありません。ログイン権限については、デバイスの所有者にお問い合わせください。</translation> <translation id="7664620655576155379">サポートされていない Bluetooth デバイス: 「<ph name="DEVICE_NAME" />」</translation> @@ -4595,6 +4610,7 @@ <translation id="7861215335140947162">ダウンロード(&D)</translation> <translation id="7864539943188674973">Bluetooth を無効にする</translation> <translation id="7868891395842935202">API ウェブテストへのアクセスを制御するために試験運用版フレームワークを有効にします。</translation> +<translation id="7870576007982733437">可能な場合はシステムのダウンロード マネージャーを使用する。</translation> <translation id="7870790288828963061">新しいバージョンのキオスクアプリが見つかりませんでした。更新するものはありません。USB スティックを取り外してください。</translation> <translation id="787150342916295244">クレジット カードのスキャン</translation> <translation id="7874357055309047713">すべてのサイトで常に実行</translation> @@ -4637,7 +4653,6 @@ <translation id="7918257978052780342">登録</translation> <translation id="7920092496846849526">このページを開いてもよいか保護者にたずねました。</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> を待機しています...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> に複数のデバイスで使用されたパスワードを保存して、アプリやサイトに自動的にログインします。</translation> <translation id="7925686952655276919">モバイル データを使用して同期しない</translation> <translation id="7926906273904422255">保護されていない発行元に、「保護されていない発行元」または「保護されていない可能性のある発行元」のマークを付けます。</translation> <translation id="7928710562641958568">デバイスの取り出し</translation> @@ -4699,7 +4714,6 @@ 鍵ファイルは安全な場所に保管してください。拡張機能の新しいバージョンの作成時に必要となります。</translation> <translation id="799923393800005025">閲覧者</translation> <translation id="7999338963698132743">新しいタスク マネージャ</translation> -<translation id="8000004253404706714">レンダラの合成アニメーションで滑らかさに欠ける旧式のアニメーション サブシステムを使用します。</translation> <translation id="8004582292198964060">ブラウザ</translation> <translation id="8007030362289124303">バッテリー残量が少なくなりました</translation> <translation id="8008356846765065031">インターネットが切断されました。インターネット接続を確認してください。</translation> @@ -4828,6 +4842,7 @@ <translation id="8185331656081929126">ネットワーク上で新しいプリンタが検出されたときに通知を表示する</translation> <translation id="8186609076106987817">お探しのファイルはサーバーにはありません。</translation> <translation id="8186706823560132848">ソフトウェア</translation> +<translation id="8188120771410500975">テキスト フィールドのスペルチェック(&C)</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />、<ph name="UWS_NAME" />、他 <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> 個</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> に接続中</translation> <translation id="8191230140820435481">アプリ、拡張機能、テーマを管理する</translation> @@ -5220,6 +5235,7 @@ <translation id="8765985713192161328">ハンドラを管理...</translation> <translation id="8766796754185931010">ことえり</translation> <translation id="8767072502252310690">ユーザー</translation> +<translation id="8768367823103160496">マウスカーソル ロック</translation> <translation id="8769662576926275897">カード情報</translation> <translation id="8770196827482281187">ペルシャ語の入力方法(ISIRI 2901 レイアウト)</translation> <translation id="8774934320277480003">上余白</translation> @@ -5239,6 +5255,7 @@ <translation id="8795668016723474529">クレジットカードを追加</translation> <translation id="8795916974678578410">新規ウインドウ</translation> <translation id="8798099450830957504">既定</translation> +<translation id="8799127529310003270">有効にすると、IME スレッドで InputConnection 呼び出しを実行し、レプリカ エディタを保持する代わりに、InputConnection 呼び出しのたびにレンダラと直接通信します。</translation> <translation id="8799839487311913894">「パスワード変更」フォームを送信すると、パスワード マネージャでパスワードを更新できるようになります。</translation> <translation id="8800004011501252845">送信先を表示しています:</translation> <translation id="8800420788467349919">音量: <ph name="PRECENTAGE" />%</translation> @@ -5264,6 +5281,7 @@ <translation id="8841142799574815336">停止中のビジュアル ビューポート</translation> <translation id="884264119367021077">配送先住所</translation> <translation id="8844238624737526720">新しい最適化版 Chrome タスク マネージャを使用します。</translation> +<translation id="8845001906332463065">ヘルプ</translation> <translation id="8846141544112579928">キーボードを探しています...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift キー モードの切り替え</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index aa3e5d81..49a0a3e 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">ಈ ಪುಟವನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> ಐಟಂಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="1048597748939794622">ಎಲ್ಲಾ ಲೇಯರ್ಗಳಿಗಾಗಿ ಒತ್ತಾಯವಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> +<translation id="1049795001945932310">&ಭಾಷೆ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="1049926623896334335">Word ಡಾಕ್ಯುಮೆಂಟ್</translation> <translation id="1054153489933238809">ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ ಮೂಲ &ಚಿತ್ರವನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="1055806300943943258">ಬ್ಲೂಟೂತ್ ಮತ್ತು USB ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">ಲಿಪ್ಯಂತರಣ (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">ಸ್ವಯಂಚಾಲಿತ ಹೆಸರು ಸರ್ವರ್ಗಳು</translation> <translation id="1215411991991485844">ಹೊಸ ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸೇರಿಸಲಾಗಿದೆ</translation> +<translation id="1216954813581739968">ಡೆಸ್ಕ್ಟಾಪ್ ಹಂಚಿಕೆಗಾಗಿ ಟ್ಯಾಬ್ ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="121827551500866099">ಎಲ್ಲಾ ಡೌನ್ಲೋಡ್ಗಳನ್ನು ತೋರಿಸು...</translation> <translation id="122082903575839559">ಪ್ರಮಾಣಪತ್ರ ಸಹಿ ಅಲ್ಗಾರಿದಮ್</translation> <translation id="1221024147024329929">RSA ಎನ್ಕ್ರಿಪ್ಶನ್ನೊಂದಿಗೆ PKCS #1 MD2</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">ಸ್ವಯಂಚಾಲಿತ ಸೈನ್-ಇನ್ ವಿಫಲವಾಗಿದೆ</translation> <translation id="1293556467332435079">ಫೈಲ್ಗಳು</translation> <translation id="1294298200424241932">ವಿಶ್ವಾಸಾರ್ಹ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಸಂಪಾದಿಸಿ:</translation> +<translation id="1295794900245526845">ಸೈನ್ ಇನ್ ಮಾಡಲು <ph name="PASSWORD_MANAGER_BRAND" /> ಜೊತೆಗೆ ಉಳಿಸಲಾಗಿರುವ ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಆರಿಸಿಕೊಳ್ಳಿ</translation> <translation id="1297175357211070620">ಗಮ್ಯಸ್ಥಾನ</translation> <translation id="1297922636971898492">Google ಡ್ರೈವ್ ಇದೀಗ ಲಭ್ಯವಿಲ್ಲ. Google ಡ್ರೈವ್ ಒಮ್ಮೆ ಹಿಂತಿರುಗಿದರೆ ಅಪ್ಲೋಡ್ ಆಗುವುದು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ.</translation> <translation id="1300861494336759522">Windows ಡೆಸ್ಕ್ಟಾಪ್ ಹುಡುಕಾಟ ಮರುನಿರ್ದೇಶನ</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">ಇದು ನಿಮ್ಮ ಪ್ರಾರಂಭ ಪುಟ, ಹೊಸ ಟ್ಯಾಬ್ ಪುಟ, ಹುಡುಕಾಟ ಎಂಜಿನ್ ಮತ್ತು ಪಿನ್ ಮಾಡಲಾದ ಟ್ಯಾಬ್ಗಳನ್ನು ಮರುಹೊಂದಿಸುತ್ತದೆ. ಇದು ಎಲ್ಲ ವಿಸ್ತರಣೆಗಳು ಮತ್ತು ಕುಕೀಸ್ನಂತಹ ತಾತ್ಕಾಲಿಕ ಡೇಟಾವನ್ನು ಸಹ ತೆರವುಗೊಳಿಸುತ್ತದೆ. ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಉಳಿಸಿದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="1434886155212424586">ಮುಖಪುಟವು ಹೊಸ ಟ್ಯಾಬ್ ಪುಟವಾಗಿದೆ</translation> <translation id="1435550882135542937">ವಿಸ್ತರಣೆ ಪರಿಕರಪಟ್ಟಿ ಮರುವಿನ್ಯಾಸ</translation> +<translation id="1436402875660227532">ಗಮನಿಸಿ: ಈ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ಈ ಸಿಸ್ಟಂನಲ್ಲಿ ಬಳಸಲಾಗುವುದಿಲ್ಲ, ಆದರೆ ನೀವು ಈಗಲೂ ಅವುಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು ಅಥವಾ ಸಂಪಾದಿಸಬಹುದು.</translation> <translation id="1436784010935106834">ತೆಗೆದುಹಾಕಲಾಗಿದೆ</translation> <translation id="1438632560381091872">ಟ್ಯಾಬ್ಗಳನ್ನು ಅನ್ಮ್ಯೂಟ್ ಮಾಡಿ</translation> <translation id="1441841714100794440">ವಿಯೆಟ್ನಾಮೀಸ್ ಕೀಬೋರ್ಡ್ (ಟೆಲೆಕ್ಸ್)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">ವರ್ಚುಯಲ್ ಕೀಬೋರ್ಡ್ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="1474079335130556426">ಪುಶ್ API ಗೆ ಹಿನ್ನೆಲೆ ಮೋಡ್ ಸಕ್ರಿಯಗೊಳಿಸಿ. ಇದು ಕೊನೆಯ ವಿಂಡೋ ಮುಚ್ಚಿದ ನಂತರ ರನ್ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಲು ಮತ್ತು ಪುಶ್ API ಗೆ ಅಗತ್ಯವಿದ್ದಲ್ಲಿ OS ಸೆಟಪ್ನಲ್ಲಿ ಪ್ರಾರಂಭಿಸಲು Chrome ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಲಾಗಿಲ್ಲ. ನಿಮ್ಮ Google ಡ್ರೈವ್ನಲ್ಲಿ ಸಾಕಷ್ಟು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ.</translation> +<translation id="1476607407192946488">&ಭಾಷೆ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />ಓಮ್ನಿಬಾಕ್ಸ್<ph name="END_LINK" /> ಮೂಲಕ ಹುಡುಕಾಟ ನಡೆಸುತ್ತಿರುವಾಗ ಯಾವ ಹುಡುಕಾಟ ಎಂಜಿನ್ ಅನ್ನು ಬಳಸಬೇಕು ಎಂಬುದನ್ನು ಹೊಂದಿಸಿ.</translation> <translation id="1477301030751268706">ಗುರುತಿಸುವಿಕೆ API ಟೋಕನ್ ಕ್ಯಾಶ್</translation> <translation id="1478340334823509079">ವಿವರಗಳು: <ph name="FILE_NAME" /></translation> @@ -650,6 +655,7 @@ <translation id="1962233722219655970">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರುವಂತಹ ಸ್ಥಳೀಯ ಕ್ಲೈಂಟ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಈ ಪುಟವು ಬಳಸುತ್ತದೆ.</translation> <translation id="1965328510789761112">ಖಾಸಗಿ ಸ್ಮರಣೆ</translation> <translation id="1965624977906726414">ಯಾವುದೇ ವಿಶೇಷ ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಲ್ಲ.</translation> +<translation id="1968720524450620475">ವೆಬ್ ಅಧಿಸೂಚನೆಗಳಿಗೆ ಕ್ರಿಯೆ ಐಕಾನ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="1970746430676306437">ಪುಟ &ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಿ</translation> <translation id="197288927597451399">ಇರಿಸಿ</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> ಡೌನ್ಲೋಡ್ ವಿಫಲಗೊಂಡಿದೆ.</translation> @@ -909,6 +915,7 @@ <translation id="2344262275956902282">ಬಳಸಿ- ಮತ್ತು = ಅಭ್ಯರ್ಥಿಯ ಪಟ್ಟಿಯ ಪುಟಕ್ಕೆ ಕೀಲಿಗಳು</translation> <translation id="2347476388323331511">ಸಿಂಕ್ ಮಾಡಲಾಗಲಿಲ್ಲ</translation> <translation id="2347991999864119449">ಪ್ಲಗಿನ್ ವಿಷಯವನ್ನು ಯಾವಾಗ ರನ್ ಮಾಡಬೇಕು ಎಂದು ಆಯ್ಕೆಮಾಡಲು ನನಗೆ ಅನುಮತಿಸಿ</translation> +<translation id="2348165084656290171">ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳಲು, ಟ್ಯಾಬ್ ಅಥವಾ ಸಂಪೂರ್ಣ ಪರದೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation> <translation id="2350182423316644347">ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಆರಂಭಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="2350796302381711542"><ph name="REPLACED_HANDLER_TITLE" /> ನ ಬದಲಿಗೆ ಎಲ್ಲಾ <ph name="PROTOCOL" /> ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಲು <ph name="HANDLER_HOSTNAME" /> ಗೆ ಅನುಮತಿಸುವುದೇ?</translation> <translation id="2351266942280602854">ಭಾಷೆ ಹಾಗೂ ಇನ್ಪುಟ್</translation> @@ -996,6 +1003,7 @@ <translation id="247772113373397749">ಕೆನಡಾದ ಬಹುಭಾಷಾ ಕೀಬೋರ್ಡ್</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" ಗಾಗಿ ಮಾಧ್ಯಮ-ಫೈಲ್ ಒಪ್ಪಿಗೆಗಳು</translation> <translation id="2478830106132467213">ನಿಮ್ಮ ಫೋನ್ ತೋಳಿನ ವ್ಯಾಪ್ತಿಯಲ್ಲಿರುವಾಗ ಮಾತ್ರ ಈ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ.</translation> +<translation id="247949520305900375">ಆಡಿಯೊ ಹಂಚಿಕೊಳ್ಳಿ</translation> <translation id="2479780645312551899">ಈ ಸಮಯದಲ್ಲಿ ಎಲ್ಲಾ ಪ್ಲಗ್ಇನ್ಗಳನ್ನು ರನ್ ಮಾಡಿ</translation> <translation id="2480626392695177423">ಪೂರ್ಣ/ಅರ್ಧ ಅಗಲ ವಿರಾಮಚಿಹ್ನೆ ಮೋಡ್</translation> <translation id="2481332092278989943">ಶೆಲ್ಫ್ಗೆ ಸೇರಿಸು</translation> @@ -1310,6 +1318,7 @@ <translation id="2889064240420137087">ಇದರೊಂದಿಗೆ Open Link...</translation> <translation id="2889925978073739256">ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್ ರದ್ದುಗೊಳಿಸಲಾಗಿರುವ ಪ್ಲಗ್-ಇನ್ಗಳ ನಿರ್ಬಂಧಿಸುವಿಕೆಯನ್ನು ಮುಂದುವರಿಸಿ</translation> <translation id="2890624088306605051">ಸಿಂಕ್ ಮಾಡಿದ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮಾತ್ರ ಹಿಂಪಡೆಯಿರಿ</translation> +<translation id="2890678560483811744">ಪರಿಮಿತಿಗಳಿಂದ ಹೊರಗಿರುವ ಪುಟದ ಉಲ್ಲೇಖ</translation> <translation id="2893168226686371498">ಡೀಫಾಲ್ಟ್ ಬ್ರೌಸರ್</translation> <translation id="289426338439836048">ಇತರೆ ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್...</translation> <translation id="2894745200702272315">ಹಾರ್ಡ್ವೇರ್ ಅನ್ನು ಅವಲಂಬಿಸಿರುವ, ಪ್ರಯೋಗಾತ್ಮಕ ಹಾಟ್ವರ್ಡ್ ಗುರುತಿಸುವ ವೈಶಿಷ್ಟ್ಯ 'Ok Google' ನ ಆವೃತ್ತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ</translation> @@ -1338,7 +1347,6 @@ <translation id="2925966894897775835">ಶೀಟ್ಗಳು</translation> <translation id="2927017729816812676">ಕ್ಯಾಶ್ ಸಂಗ್ರಹಣೆ</translation> <translation id="2927657246008729253">ಬದಲಿಸು...</translation> -<translation id="2928415919076124714">ಪರಿಕರಪಟ್ಟಿಯನ್ನು ಪೂರ್ಣ ಪರದೆಯಿಂದ ಮರೆಮಾಡಿ</translation> <translation id="2928526264833629376">Hangouts ಗೆ ಮುಂದುವರಿಸಿ</translation> <translation id="2930644991850369934">ಪುನರ್ಪ್ರಾಪ್ತಿ ಇಮೇಜ್ ಡೌನ್ಲೋಡ್ ಸಮಯದಲ್ಲಿ ಒಂದು ಸಮಸ್ಯೆ ಕಂಡುಬಂದಿದೆ. ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಕಳೆದುಕೊಂಡಿದೆ.</translation> <translation id="293111069139560936">ಏಕೈಕ, ಈಗಾಗಲೇ ಸಕ್ರಿಯವಾಗಿರುವ, ಅದರೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ವಿಂಡೋವನ್ನು ಹೊಂದಿರುವ ಶೆಲ್ಫ್ ಐಟಂ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದಲ್ಲಿ ವಿಂಡೋವನ್ನು ಕನಿಷ್ಠಗೊಳಿಸಲು ಶೆಲ್ಫ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ.</translation> @@ -1462,6 +1470,7 @@ <translation id="3117812041123364382">ಫ್ಲೋಟಿಂಗ್ ವರ್ಚುವಲ್ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ/ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> ಸಹಾಯ</translation> <translation id="3120430004221004537">ನೀಡಿರುವ ಕಾರ್ಯಾಚರಣೆಗೆ ಈ ಸಾಧನದಲ್ಲಿ ಎನ್ಕ್ರಿಪ್ಶನ್ ಸಾಕಷ್ಟಿಲ್ಲ: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">ವೆಬ್ ಅಧಿಸೂಚನೆಗಳಿಗೆ ಕ್ರಿಯೆ ಬಟನ್ಗಳಲ್ಲಿ ಐಕಾನ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="3121793941267913344">ಈ <ph name="IDS_SHORT_PRODUCT_NAME" /> ಸಾಧನವನ್ನು ಮರುಹೊಂದಿಸಿ</translation> <translation id="3122162841865761901">ಡೆವಲಪರ್ ಪರಿಕರಗಳ ಪ್ರಯೋಗಗಳು</translation> <translation id="3122464029669770682">CPU</translation> @@ -1582,7 +1591,6 @@ <translation id="3289566588497100676">ಸುಲಭ ಚಿಹ್ನೆಯ ಇನ್ಪುಟ್</translation> <translation id="3289856944988573801">ನವೀಕರಣಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಲು, ದಯವಿಟ್ಟು Ethernet ಅಥವಾ Wi-Fi ಬಳಸಿ.</translation> <translation id="3293325348208285494">ವೇಗದ ಪ್ರಾರಂಭ</translation> -<translation id="3293894718455402932">ಗುರುತಿಸಲಾದ ಫೋಲ್ಡರ್ಗಳಲ್ಲಿ ಚಿತ್ರಗಳು, ವೀಡಿಯೊ ಮತ್ತು ಧ್ವನಿ ಫೈಲ್ಗಳನ್ನು ಓದಲು ಮತ್ತು ಬರೆಯಲು "<ph name="EXTENSION" />" ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation> <translation id="3294437725009624529">ಅತಿಥಿ</translation> <translation id="329650768420594634">ಪ್ಯಾಕ್ ವಿಸ್ತರಣೆಯ ಎಚ್ಚರಿಕೆ</translation> <translation id="3296763833017966289">ಜಾರ್ಜಿಯನ್</translation> @@ -1638,6 +1646,7 @@ <translation id="3338239663705455570">ಸ್ಲೋವೆನಿಯನ್ ಕೀಬೋರ್ಡ್</translation> <translation id="3340978935015468852">ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="3341703758641437857">URL ಗಳನ್ನು ಫೈಲ್ಗಳಿಗೆ ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸಿ</translation> +<translation id="3343813173145836998">ಈ ಸಾಧನದಲ್ಲಿ ಸುಲಭವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="3344786168130157628">ಪ್ರವೇಶ ಬಿಂದುವಿನ ಹೆಸರು:</translation> <translation id="3345135638360864351">ಈ ಸೈಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಸಲ್ಲಿಸಿದ ವಿನಂತಿಯನ್ನು <ph name="NAME" /> ಗೆ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="3345886924813989455">ಯಾವುದೇ ಬೆಂಬಲಿತ ಬ್ರೌಸರ್ ಕಂಡುಬಂದಿಲ್ಲ</translation> @@ -2117,6 +2126,7 @@ <translation id="3996912167543967198">ಮರುಹೊಂದಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="3997015411467176489">ಪ್ರಾಯೋಗಿಕ ಕ್ಯಾನ್ವಾಸ್ ವೈಶಿಷ್ಟ್ಯಗಳು</translation> <translation id="40027638859996362">ಪದ ಚಲನೆ</translation> +<translation id="400554499662786523">ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳಲು, ಟ್ಯಾಬ್ ಆಯ್ಕೆಮಾಡಿ.</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" />ದಲ್ಲಿ ಪ್ರಿಂಟರ್ಗಳನ್ನು ಹೊಂದಿಸು ಅಥವಾ ನಿರ್ವಹಿಸು.</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />" ಸರಿಪಡಿಸಬೇಕೆ?</translation> <translation id="4018133169783460046">ಈ ಭಾಷೆಯಲ್ಲಿ <ph name="PRODUCT_NAME" /> ಅನ್ನು ಪ್ರದರ್ಶಿಸಿ</translation> @@ -2219,6 +2229,7 @@ <translation id="4180788401304023883">CA ಪ್ರಮಾಣಪತ್ರ "<ph name="CERTIFICATE_NAME" />" ವನ್ನು ಅಳಿಸುವುದೆ?</translation> <translation id="418179967336296930">ರಷ್ಯನ್ ಫೋನೆಟಿಕ್ (YaZHert) ಕೀಬೋರ್ಡ್</translation> <translation id="4181841719683918333">ಭಾಷೆಗಳು</translation> +<translation id="4187248015940562149">ವೆಬ್ ಬ್ಲೂಟೂತ್ ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ, ಇದು ನಿಮ್ಮ ಸುತ್ತಲಿನ ಬ್ಲೂಟೂತ್ಗೆ ಸಂಪರ್ಕಗೊಳ್ಳಲು ಮತ್ತು ಅವುಗಳನ್ನು ನಿಯಂತ್ರಿಸಲು ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಬಹುದು.</translation> <translation id="4188026131102273494">ಕೀವರ್ಡ್:</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> ವಿಸ್ತರಣೆಯೊಂದು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಯಂತ್ರಿಸುತ್ತಿದೆ.</translation> <translation id="4193154014135846272">Google ಡಾಕ್ಯುಮೆಂಟ್</translation> @@ -2275,6 +2286,7 @@ <translation id="4268025649754414643">ಕೀ ಎನ್ಸಿಫರ್ಮೆಂಟ್</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">ಆವೃತ್ತಿ <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಗಳಿಲ್ಲ</translation> <translation id="4274187853770964845">ಸಿಂಕ್ ದೋಷ: ದಯವಿಟ್ಟು ನಿಲ್ಲಿಸಿ ಮತ್ತು ಸಿಂಕ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation> <translation id="4275830172053184480">ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="4276796043975446927">ಸಭೆಗಳಿಗಾಗಿ Chromebox ಗೆ ಸುಸ್ವಾಗತ</translation> @@ -2344,6 +2356,7 @@ <translation id="4378551569595875038">ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="438122767399415311">UI ದಿಕ್ಕನ್ನು ಬಲವಂತಪಡಿಸು</translation> <translation id="4381849418013903196">ಕೋಲನ್</translation> +<translation id="4383192539467954373">ಸಾಧನಗಳಾದ್ಯಂತ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="4384652540891215547">ವಿಸ್ತರಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="438503109373656455">ಸರಾಟೊಗಾ</translation> <translation id="4387554346626014084">ಅಪ್ಲಿಕೇಶನ್ ಲಾಂಚರ್ ಸಿಂಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು. ಲಭ್ಯವಿರುವಲ್ಲಿ ಫೋಲ್ಡರ್ಗಳನ್ನು ಸಹ ಇದು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ (OSX ಅಲ್ಲದ).</translation> @@ -2361,6 +2374,7 @@ <translation id="4421932782753506458">ಫ್ಲುಫಿ</translation> <translation id="4422347585044846479">ಈ ಪುಟಕ್ಕಾಗಿ ಬುಕ್ಮಾರ್ಕ್ ಅನ್ನು ಸಂಪಾದಿಸಿ</translation> <translation id="4422428420715047158">DOMAIN:</translation> +<translation id="4423482519432579560">&ಕಾಗುಣಿತಪರೀಕ್ಷೆ</translation> <translation id="442477792133831654">ಹತ್ತಿರದ ಸಾಧನಗಳೊಂದಿಗೆ ಸಂವಹಿಸು</translation> <translation id="4425149324548788773">ನನ್ನ ಡ್ರೈವ್</translation> <translation id="4428582326923056538">Adobe ಫ್ಲ್ಯಾಶ್ ಪ್ಲೇಯರ್ ಕ್ಯಾಮರಾ ವಿನಾಯಿತಿಗಳು ವಿಭಿನ್ನವಾಗಿವೆ.</translation> @@ -2375,6 +2389,7 @@ <translation id="444267095790823769">ಸಂರಕ್ಷಿತ ವಿಷಯ ವಿನಾಯತಿಗಳು</translation> <translation id="4443536555189480885">&ಸಹಾಯ</translation> <translation id="4444304522807523469">USB ಅಥವಾ ಸ್ಥಳೀಯ ನೆಟ್ವರ್ಕ್ ಮೂಲಕ ಲಗತ್ತಿಸಲಾದ ಡಾಕ್ಯುಮೆಂಟ್ ಸ್ಕ್ಯಾನರ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation> +<translation id="4445559854264555037">ನಿಮ್ಮ ಸಾಧನ ಕಾಣುತ್ತಿಲ್ಲವೇ? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">ಪ್ರತಿಬಿಂಬಿತ</translation> <translation id="4447465454292850432">ಬ್ಯಾಟರಿ:</translation> <translation id="4449935293120761385">ಸ್ವಯಂತುಂಬುವಿಕೆ ಬಗ್ಗೆ</translation> @@ -2634,6 +2649,7 @@ <translation id="485316830061041779">ಜರ್ಮನ್</translation> <translation id="4856478137399998590">ನಿಮ್ಮ ಮೊಬೈಲ್ ಡೇಟಾ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಮತ್ತು ಬಳಕೆಗೆ ಸಿದ್ಧವಾಗಿದೆ</translation> <translation id="4858913220355269194">ಫ್ರಿಟ್ಜ್</translation> +<translation id="4860565041166337978">ಅನ್ವಯವಾಗುವಾಗ ಸಿಸ್ಟಂ ಡೌನ್ಲೋಡ್ ಮ್ಯಾನೇಜರ್ ಮೂಲಕ ನಿರ್ವಹಿಸಲು ಡೌನ್ಲೋಡ್ಗಳನ್ನು ಅನುಮತಿಸಿ.</translation> <translation id="48607902311828362">ಏರ್ಪ್ಲೇನ್ ಮೋಡ್</translation> <translation id="4861833787540810454">&ಪ್ಲೇ ಮಾಡಿ</translation> <translation id="4862050643946421924">ಸಾಧನವನ್ನು ಸೇರಿಸಲಾಗುತ್ತಿದೆ...</translation> @@ -2717,7 +2733,6 @@ <translation id="4977942889532008999">ಪ್ರವೇಶ ದೃಢೀಕರಿಸಿ</translation> <translation id="4982718461356080574">ಸ್ಟ್ಯಾಕ್ ಮಾಡಿದಾಗ ನಿಷ್ಕ್ರಿಯ ಟ್ಯಾಬ್ಗಳಲ್ಲಿ ಮುಚ್ಚುವ ಬಟನ್ಗಳನ್ನು ಮರೆಮಾಡುವಿಕೆ</translation> <translation id="498294082491145744">ಕುಕೀಗಳು, JavaScript, ಪ್ಲಗ್ಇನ್ಗಳು, ಜಿಯೊಲೊಕೇಶನ್, ಮೈಕ್ರೊಫೋನ್, ಕ್ಯಾಮರಾ ಇತ್ಯಾದಿಗಳಂತಹ ವೈಶಿಷ್ಟ್ಯಗಳಿಗೆ ವೆಬ್ಸೈಟ್ಗಳ ಪ್ರವೇಶವನ್ನು ನಿಯಂತ್ರಿಸುವ ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ.</translation> -<translation id="4984329823325527157">ಮಾಧ್ಯಮ ಮೂಲ API</translation> <translation id="4988526792673242964">ಪುಟಗಳು</translation> <translation id="4988792151665380515">ಸಾರ್ವಜನಿಕ ಕೀಲಿಯನ್ನು ರಫ್ತು ಮಾಡಲು ವಿಫಲವಾಗಿದೆ.</translation> <translation id="49896407730300355">ಅಪ್ರ&ದಕ್ಷಿಣೆಯಂತೆ ತಿರುಗಿಸಿ</translation> @@ -2908,7 +2923,6 @@ <translation id="5268606875983318825">PPAPI (ಪ್ರಕ್ರಿಯೆಯಿಂದ ದೂರವಿದೆ)</translation> <translation id="526926484727016706">ಎಲ್ಲ iframe ಗಳನ್ನು ಡೀಫಾಲ್ಟ್ ಮೂಲಕ ಎಲ್ಲ ಅನುಮತಿಗಳನ್ನು ನಿರಾಕರಿಸುವಂತೆ ಮಾಡುತ್ತದೆ. iframe ಗೆ ನಿರ್ದಿಷ್ಟ ಅನುಮತಿಗಳನ್ನು ಅನುಮತಿಸುವುದರಿಂದ ಹೊಸ iframe ಲಕ್ಷಣಗಳ ಮೌಲ್ಯಗಳಾಗಿ ಈ ಅನುಮತಿಗಳ ಹೆಸರುಗಳು ಪಟ್ಟಿ ಮಾಡುವಿಕೆಯನ್ನು ಒಳಗೊಳ್ಳಬಹುದು.</translation> <translation id="5269977353971873915">ಮುದ್ರಣ ವಿಫಲಗೊಂಡಿದೆ</translation> -<translation id="5270884342523754894">ಗುರುತಿಸಲಾದ ಫೋಲ್ಡರ್ಗಳಲ್ಲಿ ಚಿತ್ರಗಳು, ವೀಡಿಯೊ ಮತ್ತು ಧ್ವನಿ ಫೈಲ್ಗಳನ್ನು ಓದಲು ಮತ್ತು ಬರೆಯಲು "<ph name="EXTENSION" />" ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation> <translation id="5271247532544265821">ಸರಳವಾದ ಟಾಗಲ್/ಸಾಂಪ್ರದಾಯಿಕ ಚೈನೀಸ್ ಮೋಡ್</translation> <translation id="5271549068863921519">ಪಾಸ್ವರ್ಡ್ ಉಳಿಸಿ</translation> <translation id="5273628206174272911">ಅಡ್ಡಲಾಗಿರುವ ಓವರ್ಸ್ಕ್ರೋಲ್ಗೆ ಪ್ರತಿಕ್ರಿಯೆಯಾಗಿ ಪ್ರಾಯೋಗಿಕ ಇತಿಹಾಸ ನ್ಯಾವಿಗೇಷನ್.</translation> @@ -2945,6 +2959,7 @@ <translation id="5316716239522500219">ಪ್ರತಿಬಿಂಬಿಸುವ ಮಾನೀಟರ್ಗಳು</translation> <translation id="5317780077021120954">ಉಳಿಸು</translation> <translation id="5319782540886810524">ಲ್ಯಾಟ್ವಿಯನ್ ಕೀಬೋರ್ಡ್</translation> +<translation id="532247166573571973">ಸರ್ವರ್ ತಲುಪಲಾಗದೇ ಇರಬಹುದು. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="5323213332664049067">ಲ್ಯಾಟಿನ್ ಅಮೇರಿಕನ್</translation> <translation id="532360961509278431">ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ "$1": $2</translation> <translation id="5324674707192845912">ದೂರದಿಂದ ಗುರುತಿಸಲು, ನಾಶಪಡಿಸಲು ಮತ್ತು ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು Google ಜೊತೆಗೆ ಈ <ph name="DEVICE_TYPE" /> ಸಾಧನವನ್ನು ರದ್ದುಗೊಳಿಸಲಿರುವಿರಿ. ಇದಕ್ಕೆ ರೀಬೂಟ್ ಅಗತ್ಯವಿದೆ. ನೀವು ಮುಂದುವರಿಯಲು ಬಯಸುವಿರಾ?</translation> @@ -2997,11 +3012,11 @@ <translation id="5390284375844109566">ಸೂಚ್ಯಂಕಗೊಳಿಸಿದ ಡೇಟಾಬೇಸ್</translation> <translation id="5392544185395226057">ಸ್ಥಳೀಯ ಕ್ಲೈಂಟ್ಗಾಗಿ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="5393125431335030955">ಈ ಪ್ಲಗ್ಇನ್ ಡೆಸ್ಕ್ಟಾಪ್ನಲ್ಲಿ ಮಾತ್ರ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.</translation> -<translation id="5393559999218790205">UI ಸಂಯೋಜಕ ಅನಿಮೇಷನ್ ಟೈಮ್ಲೈನ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> ಅವರು <ph name="PEPPER_PLUGIN_DOMAIN" /> ನಲ್ಲಿ ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಬಯಸುತ್ತಾರೆ.</translation> <translation id="539755880180803351">ಸ್ವಯಂತುಂಬುವಿಕೆ ಕ್ಷೇತ್ರ ಪ್ರಕಾರದ ಪೂರ್ವಸೂಚನೆಗಳನ್ನು ಪ್ಲೇಸ್ಹೋಲ್ಡರ್ ಪಠ್ಯದೊಂದಿಗೆ ವೆಬ್ ಫಾರ್ಮ್ಗಳನ್ನು ಟಿಪ್ಪಣಿಮಾಡುತ್ತದೆ.</translation> <translation id="5397578532367286026">ಈ ಬಳಕೆದಾರರ ಬಳಕೆ ಮತ್ತು ಇತಿಹಾಸವನ್ನು chrome.com ನಲ್ಲಿ ನಿರ್ವಾಹಕರು (<ph name="MANAGER_EMAIL" />) ಪರಿಶೀಲಿಸಬಹುದು.</translation> <translation id="5397794290049113714">ನೀವು</translation> +<translation id="5398572795982417028">ಪರಿಮಿತಿಗಳಿಂದ ಹೊರಗಿರುವ ಪುಟದ ಉಲ್ಲೇಖ, ಮಿತಿ <ph name="MAXIMUM_PAGE" /> ಆಗಿದೆ</translation> <translation id="5398824043967640339">ಇತರ ಸೈಟ್ಗಳಿಂದ <ph name="COUNT" /></translation> <translation id="5399158067281117682">PIN ಗಳು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ!</translation> <translation id="5400640815024374115">ನಂಬಲರ್ಹ ಪ್ಲ್ಯಾಟ್ಫಾರ್ಮ್ ಮಾಡ್ಯೂಲ್ (TPM) ಚಿಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಅಥವಾ ಅದು ಅನುಪಸ್ಥಿತವಾಗಿದೆ.</translation> @@ -3021,7 +3036,7 @@ <translation id="5423849171846380976">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="5425470845862293575">ಪ್ರಾಯೋಗಿಕ DirectWrite ಫಾಂಟ್ ಸಲ್ಲಿಸುವಿಕೆಯ ವ್ಯವಸ್ಥೆಯ ಬಳಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="5425722269016440406">Smart Lock ಆಫ್ ಮಾಡಲು ನೀವು ಆನ್ಲೈನ್ನಲ್ಲಿರಬೇಕು. ಏಕೆಂದರೆ ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಮ್ಮ ಫೋನ್ ಮತ್ತು ಇತರ ಸಾಧನಗಳಿಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಮೊದಲು ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ.</translation> -<translation id="5426623592374109001">UI ನಲ್ಲಿರುವ ಸಂಯೋಜಿತ ಅನಿಮೇಷನ್ಗಳಿಗೆ ಹಳೆಯ ಅತಿಕ್ರಮಣಕಾರಿಯಾಗಿರುವ / ಗೊಂದಲಮಯ ಅನಿಮೇಷನ್ ಉಪವ್ಯವಸ್ಥೆಯನ್ನು ಬಳಸಿ.</translation> +<translation id="5425863515030416387">ಸಾಧನಗಳಾದ್ಯಂತ ಸುಲಭವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="5427459444770871191">&ಪ್ರದಕ್ಷಿಣೆಯಂತೆ ತಿರುಗಿಸಿ</translation> <translation id="5428105026674456456">ಸ್ಪ್ಯಾನಿಶ್</translation> <translation id="542872847390508405">ನೀವು ಒಬ್ಬ ಅತಿಥಿಯಂತೆ ಬ್ರೌಸ್ ಮಾಡುತ್ತಿರುವಿರಿ</translation> @@ -3046,6 +3061,7 @@ <translation id="5451646087589576080">ಫ್ರೇಮ್ &ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಿ</translation> <translation id="5453029940327926427">ಟ್ಯಾಬ್ಗಳನ್ನು ಮುಚ್ಚಿ </translation> <translation id="5453632173748266363">ಸಿರಿಲಿಕ್</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> ಜೊತೆಗೆ</translation> <translation id="5457113250005438886">ಅಮಾನ್ಯ</translation> <translation id="5457459357461771897">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಿಂದ ಫೋಟೋಗಳು, ಸಂಗೀತ, ಮತ್ತು ಇತರ ಮಾಧ್ಯಮವನ್ನು ಓದಿರಿ ಮತ್ತು ಅಳಿಸಿ</translation> <translation id="5457599981699367932">ಅತಿಥಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಿ</translation> @@ -3216,7 +3232,6 @@ <translation id="5708171344853220004">Microsoft Principal ಹೆಸರು</translation> <translation id="5709885306771508267">ಪಿಂಚ್ ಸ್ಕೇಲ್</translation> <translation id="5710406368443808765">ಓಹ್! ಸಾಧನ ಟೋಕನ್ ಮತ್ತು ID ಯನ್ನು ಸಂಗ್ರಹಿಸಲು ಸಿಸ್ಟಂ ವಿಫಲಗೊಂಡಿದೆ.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ. ಬಿತ್ತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="5711983031544731014">ಅನ್ಲಾಕ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ.</translation> <translation id="5712966208980506909">ಸಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ, chrome://md-policy URL ವಸ್ತು ವಿನ್ಯಾಸ ನೀತಿ ಪುಟವನ್ನು ಲೋಡ್ ಮಾಡುತ್ತದೆ.</translation> <translation id="5715711091495208045">ಪ್ಲಗಿನ್ ಬ್ರೋಕರ್: <ph name="PLUGIN_NAME" /></translation> @@ -3483,7 +3498,6 @@ <translation id="6111974609785983504">ಡೀಫಾಲ್ಟ್ ಮೂಲಕ ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="6113134669445407638">WebRTC ನಲ್ಲಿ ವಿಳಂಬ ಅಗ್ನೊಸ್ಟಿಕ್ AEC ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ. ವರದಿ ಮಾಡಲಾದ ಸಿಸ್ಟಂ ವಿಳಂಬಗಳು ತುಂಬಾ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿದ್ದಲ್ಲಿ ಅಥವಾ ನಿಮ್ಮ ಮೆಷಿನ್ನಿಂದ ಇತರ ಅನುಭವದ ಪ್ರತಿಧ್ವನಿಯಾದಲ್ಲಿ ಬಳಸಿ.</translation> <translation id="6116921718742659598">ಭಾಷೆ ಹಾಗೂ ಇನ್ಪುಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation> -<translation id="6117536376248197233">ರೆಂಡರ್ಗಳಲ್ಲಿ ಸಂಯೋಜಕ ಅನಿಮೇಷನ್ ಟೈಮ್ಲೈನ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="6120205520491252677">ಆರಂಭಿಕ ಪರದೆಗೆ ಈ ಪುಟವನ್ನು ಪಿನ್ ಮಾಡಿ...</translation> <translation id="6122081475643980456">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ನಿಯಂತ್ರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="6122093587541546701">ಇಮೇಲ್ (ಐಚ್ಛಿಕ):</translation> @@ -3515,6 +3529,7 @@ <translation id="6163522313638838258">ಎಲ್ಲವನ್ನೂ ಹಿಗ್ಗಿಸು...</translation> <translation id="6164005077879661055">ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು ಒಮ್ಮೆ ತೆಗೆದುಹಾಕಿದರೆ, ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಎಲ್ಲ ಫೈಲ್ಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ. ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರಿಗಾಗಿ ಭೇಟಿ ನೀಡಲಾದ ವೆಬ್ಸೈಟ್ಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್ಗಳು <ph name="MANAGEMENT_URL" /> ನಲ್ಲಿ ನಿರ್ವಾಹಕರಿಗೆ ಈಗಲೂ ಗೋಚರಿಸಬಹುದು.</translation> <translation id="6165508094623778733">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation> +<translation id="6167008112175207002">ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತದೆ ಈ ಮೂಲಕ ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನೀವು ಅವುಗಳನ್ನು ಬಳಸಬಹುದು. ಇದನ್ನು ನೀವು <ph name="BEGIN_LINK" /> ನಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು</translation> <translation id="6171550060231646388">ಸಿಮ್ಯುಲೇಟ್ ಮಾಡಲಾದ ಹಾರ್ಡ್ವೇರ್ 'Ok Google' ವೈಶಿಷ್ಟ್ಯಗಳು</translation> <translation id="6175314957787328458">Microsoft ಡೊಮೇನ್ GUID</translation> <translation id="6178664161104547336">ಒಂದು ಪ್ರಮಾಣಪತ್ರವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation> @@ -3717,6 +3732,7 @@ <translation id="648927581764831596">ಯಾವುದೂ ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="6490936204492416398">ವೆಬ್ ಅಂಗಡಿಯಿಂದ ಹೊಸದೊಂದು ಸ್ಥಾಪಿಸಿ</translation> <translation id="6492313032770352219">ಡಿಸ್ಕ್ನಲ್ಲಿನ ಗಾತ್ರ:</translation> +<translation id="6498249116389603658">&ನಿಮ್ಮ ಎಲ್ಲಾ ಭಾಷೆಗಳು</translation> <translation id="6499143127267478107">ಪ್ರಾಕ್ಸಿ ಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಹೋಸ್ಟ್ ಅನ್ನು ಪರಿಹರಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="6503077044568424649">ಅತಿಹೆಚ್ಚು ಬಾರಿ ಸಂದರ್ಶಿಸಿರುವುದು</translation> <translation id="6503256918647795660">ಸ್ವಿಸ್ ಫ್ರೆಂಚ್ ಕೀಬೋರ್ಡ್</translation> @@ -3758,7 +3774,6 @@ <translation id="6555432686520421228">ಎಲ್ಲಾ ಬಳಕೆದಾರರ ಖಾತೆಗಳನ್ನು ತೆಗೆದುಹಾಕಿ ಹಾಗೂ ನಿಮ್ಮ <ph name="IDS_SHORT_PRODUCT_NAME" /> ಸಾಧನವನ್ನು ಹೊಸ ರೀತಿಯಲ್ಲಿ ಮರುಹೊಂದಿಸಿ.</translation> <translation id="6556866813142980365">ಮತ್ತೆಮಾಡು</translation> <translation id="6557565812667414268">ಹೆಚ್ಚು-DPI ಪ್ರದರ್ಶನಗಳಿಗಾಗಿ ಮಾತ್ರ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> -<translation id="655845594391856372">ಟ್ಯಾಬ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ. ಬಿತ್ತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="6559580823502247193">(ಈಗಾಗಲೇ ಈ ಸಾಧನದಲ್ಲಿದ್ದಾರೆ)</translation> <translation id="6561726789132298588">ನಮೂದಿಸಿ</translation> <translation id="6562437808764959486">ಪುನರ್ಪ್ರಾಪ್ತಿ ಚಿತ್ರವನ್ನು ಬೇರ್ಪಡಿಸಲಾಗುತ್ತಿದೆ...</translation> @@ -3859,6 +3874,7 @@ <translation id="6723354935081862304">Google ಡಾಕ್ಸ್ ಮತ್ತು ಇತರ ಮೇಘ ಗಮ್ಯಸ್ಥಾನಗಳಿಗೆ ಮುದ್ರಿಸಿ. Google ಮೇಘ ಮುದ್ರಣಕ್ಕೆ ಮುದ್ರಿಸಲು <ph name="BEGIN_LINK" />ಸೈನ್ ಇನ್<ph name="END_LINK" /> ಮಾಡಿ.</translation> <translation id="6723661294526996303">ಬುಕ್ಮಾರ್ಕ್ಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಆಮದು ಮಾಡಿ...</translation> <translation id="6723839937902243910">ಪವರ್</translation> +<translation id="6725240607822645708">IME ನ ಸ್ವಂತ ಥ್ರೆಡ್ನಲ್ಲಿ ಅದನ್ನು ರನ್ ಮಾಡಿ.</translation> <translation id="6725970970008349185">ಪ್ರತಿ ಪುಟವನ್ನು ಪ್ರದರ್ಶಿಸಲು ಅಭ್ಯರ್ಥಿಗಳ ಸಂಖ್ಯೆ</translation> <translation id="672609503628871915">ಹೊಸದೇನಿದೆ ನೋಡಿ</translation> <translation id="6727005317916125192">ಹಿಂದಿನ ಫಲಕ</translation> @@ -3990,12 +4006,11 @@ <translation id="6948736568813450284">ಡೆವಲಪರ್ಗಳಿಗೆ: Google Payments API ಕರೆಗಳಿಗೆ ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್ ಸೇವೆಯನ್ನು ಬಳಸಿ.</translation> <translation id="6949306908218145636">ತೆರೆದ ಪುಟಗಳನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ...</translation> <translation id="695164542422037736">ಈ ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದಲ್ಲಿ ಮತ್ತು ರಚನೆಯು ಹಿನ್ನೆಲೆ-ಜೋಡಣೆ:ಸ್ಥಿರತೆಯೊಂದಿಗೆ ವಿನ್ಯಾಸಗೊಂಡಿದ್ದಲ್ಲಿ, ಹಿನ್ನೆಲೆಗೆ ಅದರ ಸ್ವಂತ ಸಂಯೋಜಿತ ಲೇಯರ್ ಇರಲಿದೆ.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನೆನಪಿನಲ್ಲಿರಿಸಿಕೊಳ್ಳುತ್ತದೆ ಮತ್ತು ಈ ಸಾಧನದಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈಟ್ಗಳಿಗೆ ನಿಮ್ಮನ್ನು ಸೈನ್ ಇನ್ ಮಾಡಿಸುತ್ತದೆ.</translation> <translation id="6955446738988643816">ಪಾಪ್ಅಪ್ ಪರೀಕ್ಷಿಸಿ</translation> <translation id="695755122858488207">ಆಯ್ಕೆಮಾಡದೆ ಇರುವ ರೇಡಿಯೊ ಬಟನ್</translation> +<translation id="6960277925159781810">ಈ ಸಾಧನದಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="696036063053180184">3 ಜೋಡಿ (ಶಿಪ್ಟ್ ಇಲ್ಲ)</translation> <translation id="696203921837389374">ಮೊಬೈಲ್ ಡೇಟಾ ಮೂಲಕ ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> -<translation id="6964308487066031935">"<ph name="EXTENSION" />" ಗೆ ಫೋಲ್ಟರ್ಗಳನ್ನು ಸೇರಿಸಬೇಕೆ?</translation> <translation id="6965382102122355670">ಸರಿ</translation> <translation id="6965648386495488594">ಪೋರ್ಟ್</translation> <translation id="6965978654500191972">ಸಾಧನ</translation> @@ -4094,7 +4109,6 @@ <translation id="7076293881109082629">ಸೈನ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="7077829361966535409">ಪ್ರಸ್ತುತ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ಸೈನ್-ಇನ್ ಪುಟವು ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು <ph name="GAIA_RELOAD_LINK_START" />ಮತ್ತೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ<ph name="GAIA_RELOAD_LINK_END" />, ಅಥವಾ ಬೇರೆಯ <ph name="PROXY_SETTINGS_LINK_START" />ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು<ph name="PROXY_SETTINGS_LINK_END" /> ಬಳಸಿ.</translation> <translation id="7077872827894353012">ನಿರ್ಲಕ್ಷಿಸಲಾದ ಪ್ರೊಟೊಕಾಲ್ ಹ್ಯಾಂಡಲರ್ಗಳು </translation> -<translation id="7079038783243627996">ಗುರುತಿಸಲಾದ ಫೋಲ್ಡರ್ಗಳಲ್ಲಿ ಚಿತ್ರಗಳು, ವೀಡಿಯೊ ಹಾಗೂ ಧ್ವನಿ ಫೈಲ್ಗಳನ್ನು ಓದಲು ಮತ್ತು ಅಳಿಸಲು "<ph name="EXTENSION" />" ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation> <translation id="708060913198414444">ಆಡಿಯೋ ವಿಳಾಸವನ್ನು ನ&ಕಲಿಸಿ</translation> <translation id="708187310695946552">ಸೆಷನ್ ಮರುಸ್ಥಾಪನೆ ಬಬಲ್ UI</translation> <translation id="7082055294850503883">ಡೀಫಾಲ್ಟ್ ಮೂಲಕ CapsLock ಸ್ಥಿತಿ ಮತ್ತು ಇನ್ಪುಟ್ ಚಿಕ್ಕ ಅಕ್ಷರವನ್ನು ನಿರ್ಲಕ್ಷಿಸು</translation> @@ -4238,6 +4252,8 @@ <translation id="7313804056609272439">ವಿಯೆಟ್ನಾಮಿಸ್ ಇನ್ಪುಟ್ ವಿಧಾನ (VNI)</translation> <translation id="7314244761674113881">SOCKS ಹೋಸ್ಟ್</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (ಪ್ರಸ್ತುತ)</translation> +<translation id="7321545336522791733">ಸರ್ವರ್ ತಲುಪಲಾಗುತ್ತಿಲ್ಲ</translation> +<translation id="7324841169865301118">ಡೆಸ್ಕ್ಟಾಪ್ ಹಂಚಿಕೆಗೆ ಟ್ಯಾಬ್ ಆರಿಸಿಕೊಳ್ಳಲು ಬಳಕೆದಾರರನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="7325437708553334317">ಉನ್ನತ ಕಾಂಟ್ರಾಸ್ಟ್ ವಿಸ್ತರಣೆ</translation> <translation id="7326565110843845436">ಟಚ್ಪ್ಯಾಡ್ ಮೂರು-ಬೆರಳು-ಕ್ಲಿಕ್</translation> <translation id="73289266812733869">ಆಯ್ಕೆ ಮಾಡಲಾಗಿಲ್ಲ</translation> @@ -4464,7 +4480,6 @@ <translation id="7650511557061837441">"<ph name="EXTENSION_NAME" />" ಅನ್ನು ತೆಗೆದುಹಾಕಲು "<ph name="TRIGGERING_EXTENSION_NAME" />" ಬಯಸುತ್ತದೆ.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> ಅನ್ನು ಈ ಭಾಷೆಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲಾಗುವುದು</translation> <translation id="7654941827281939388">ಈ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಈ ಖಾತೆಯನ್ನು ಈಗಾಗಲೇ ಬಳಸಲಾಗಿದೆ.</translation> -<translation id="7655165758820095116">ವೀಡಿಯೊ ಅಂಶವೊಂದಕ್ಕೆ ನೇರವಾಗಿ ಮಾಧ್ಯಮ ಡೇಟಾ ಕಳುಹಿಸಲು JavaScript ಗೆ MediaSource ಆಬ್ಜೆಕ್ಟ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ.</translation> <translation id="7658239707568436148">ರದ್ದುಮಾಡು</translation> <translation id="7659584679870740384">ನೀವು ಈ ಸಾಧನವನ್ನು ಬಳಸಲು ಪ್ರಮಾಣಿತರಾಗಿಲ್ಲ. ಸೈನ್-ಇನ್ ಅನುಮತಿಗಾಗಿ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> <translation id="7664620655576155379">ಬೆಂಬಲಿಸದಿರುವ Bluetooth ಸಾಧನ: "<ph name="DEVICE_NAME" />".</translation> @@ -4595,6 +4610,7 @@ <translation id="7861215335140947162">&ಡೌನ್ಲೋಡ್ಗಳು</translation> <translation id="7864539943188674973">bluetooth ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="7868891395842935202">API ಪ್ರಯೋಗಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ನಿಯಂತ್ರಿಸಲು ಪ್ರಾಯೋಗಿಕ ಫ್ರೇಮ್ವರ್ಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> +<translation id="7870576007982733437">ಅನ್ವಯವಾಗುವಾಗ ಸಿಸ್ಟಂ ಡೌನ್ಲೋಡ್ ಮ್ಯಾನೇಜರ್ ಬಳಸಿ.</translation> <translation id="7870790288828963061">ಹೊಸ ಆವೃತ್ತಿಯೊಂದಿಗೆ ಯಾವುದೇ ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ನವೀಕರಿಸಲು ಏನೂ ಇಲ್ಲ. ದಯವಿಟ್ಟು USB ಸ್ಟಿಕ್ ತೆಗೆದುಹಾಕಿ.</translation> <translation id="787150342916295244">ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="7874357055309047713">ಯಾವಾಗಲೂ ಎಲ್ಲಾ ಸೈಟ್ಗಳಲ್ಲಿ ರನ್ ಮಾಡು</translation> @@ -4637,7 +4653,6 @@ <translation id="7918257978052780342">ನೋಂದಾಯಿಸಿ</translation> <translation id="7920092496846849526">ಈ ಪುಟಕ್ಕೆ ಭೇಟಿ ನೀಡುವುದು ಸರಿಯೇ ಎಂದು ನೀವು ನಿಮ್ಮ ಪೋಷಕರನ್ನು ಕೇಳಿರುವಿರಿ</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> ಗಾಗಿ ಕಾಯುತ್ತಿದೆ...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನೆನಪಿನಲ್ಲಿಟ್ಟುಕೊಳ್ಳುತ್ತದೆ ಮತ್ತು ಸಾಧನಗಳಾದ್ಯಂತ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಮತ್ತು ಸೈಟ್ಗಳಿಗೆ ನಿಮ್ಮನ್ನು ಸೈನ್ ಇನ್ ಮಾಡಿಸುತ್ತದೆ.</translation> <translation id="7925686952655276919">ಸಿಂಕ್ ಮಾಡುವುದಕ್ಕಾಗಿ ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಬಳಸಬೇಡಿ</translation> <translation id="7926906273904422255">ಅಸುರಕ್ಷಿತ ಮೂಲಗಳನ್ನು ಅಸುರಕ್ಷಿತ ಅಥವಾ "ಸಂಶಯಾಸ್ಪದ" ಎಂದು ಗುರುತಿಸಿ.</translation> <translation id="7928710562641958568">ಸಾಧನ ತೆಗೆದುಹಾಕು</translation> @@ -4696,7 +4711,6 @@ ವಿಸ್ತರಣೆ: <ph name="EXTENSION_FILE" /> ಮುಖ್ಯ ಫೈಲ್: <ph name="KEY_FILE" /> ನಿಮ್ಮ ಮುಖ್ಯ ಫೈಲ್ ಅನ್ನು ಸುರಕ್ಷಿತ ಸ್ಥಳದಲ್ಲಿಡಿ. ನಿಮ್ಮ ವಿಸ್ತರಣೆಯ ಹೊಸ ಆವೃತ್ತಿಗಳನ್ನು ರಚಿಸುವ ಅಗತ್ಯತೆ ಇದೆ.</translation> <translation id="799923393800005025">ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="7999338963698132743">ಹೊಸ ಕಾರ್ಯ ನಿರ್ವಾಹಕ</translation> -<translation id="8000004253404706714">ರೆಂಡರ್ಗಳಲ್ಲಿ ಸಂಯೋಜಿತ ಅನಿಮೇಷನ್ಗಳಿಗೆ ಹಳೆಯ ಅತಿಕ್ರಮಣಕಾರಿಯಾಗಿರುವ / ಗೊಂದಲಮಯ ಅನಿಮೇಷನ್ ಉಪವ್ಯವಸ್ಥೆಯನ್ನು ಬಳಸಿ.</translation> <translation id="8004582292198964060">ಬ್ರೌಸರ್</translation> <translation id="8007030362289124303">ಬ್ಯಾಟರಿ ಕಡಿಮೆ</translation> <translation id="8008356846765065031">ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ.</translation> @@ -4825,6 +4839,7 @@ <translation id="8185331656081929126">ನೆಟ್ವರ್ಕ್ನಲ್ಲಿರುವ ಹೊಸ ಪ್ರಿಂಟರ್ಗಳನ್ನು ಪತ್ತೆ ಮಾಡಿದಾಗ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸು</translation> <translation id="8186609076106987817">ಸರ್ವರ್ಗೆ ಫೈಲ್ ಅನ್ನು ಕಂಡುಹಿಡಿಯಲಾಗಲಿಲ್ಲ.</translation> <translation id="8186706823560132848">ಸಾಫ್ಟ್ವೇರ್</translation> +<translation id="8188120771410500975">&ಪಠ್ಯ ಕ್ಷೇತ್ರಗಳ ಕಾಗುಣಿತ ಪರಿಶೀಲಿಸಿ</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" />, ಮತ್ತು <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> ಇತರೆ</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="8191230140820435481">ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ವಿಸ್ತರಣೆಗಳು, ಮತ್ತು ಥೀಮ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> @@ -5217,6 +5232,7 @@ <translation id="8765985713192161328">ನಿರ್ವಾಹಕರುಗಳನ್ನು ನಿರ್ವಹಿಸಿ...</translation> <translation id="8766796754185931010">ಕೊಟೇರಿ</translation> <translation id="8767072502252310690">ಬಳಕೆದಾರರು</translation> +<translation id="8768367823103160496">ಮೌಸ್ ಕರ್ಸರ್ ಲಾಕ್ ಮಾಡಿ</translation> <translation id="8769662576926275897">ಕಾರ್ಡ್ ವಿವರಗಳು</translation> <translation id="8770196827482281187">ಪರ್ಶಿಯನ್ ಇನ್ಪುಟ್ ವಿಧಾನ (ISIRI 2901 ಲೇಔಟ್)</translation> <translation id="8774934320277480003">ಮೇಲಿನ ಅಂಚು</translation> @@ -5236,6 +5252,7 @@ <translation id="8795668016723474529">ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸೇರಿಸಿ</translation> <translation id="8795916974678578410">ಹೊಸ ವಿಂಡೊ</translation> <translation id="8798099450830957504">ಡೀಫಾಲ್ಟ್</translation> +<translation id="8799127529310003270">ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದಲ್ಲಿ, InputConnection ಕರೆಗಳು IME ಥ್ರೆಡ್ನಲ್ಲಿ ರನ್ ಆಗುತ್ತವೆ ಮತ್ತು ರೆಪ್ಲಿಕಾ ಸಂಪಾದಕವನ್ನು ಇರಿಸುವ ಬದಲಿಗೆ, ಪ್ರತಿ InputConnection ಕರೆಯ ಮೂಲಕ ನೇರವಾಗಿ ರೆಂಡರರ್ಗೆ ಮಾತನಾಡಲಾಗುತ್ತದೆ.</translation> <translation id="8799839487311913894">"ಪಾಸ್ವರ್ಡ್ ಬದಲಾಯಿಸಿ" ಫಾರ್ಮ್ ಸಲ್ಲಿಸಿದ ನಂತರ ಪಾಸ್ವರ್ಡ್ ಮ್ಯಾನೇಜರ್ನಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ ಅಪ್ಡೇಟ್ ಮಾಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="8800004011501252845">ಇದಕ್ಕಾಗಿ ಗಮ್ಯಸ್ಥಾನಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="8800420788467349919">ವಾಲ್ಯೂಮ್: <ph name="PRECENTAGE" />%</translation> @@ -5261,6 +5278,7 @@ <translation id="8841142799574815336">ನಿಷ್ಕ್ರಿಯ ವಿಶುವಲ್ ವೀವ್ಪೋರ್ಟ್.</translation> <translation id="884264119367021077">ಶಿಪ್ಪಿಂಗ್ ವಿಳಾಸ</translation> <translation id="8844238624737526720">chrome ಟಾಸ್ಕ್ ನಿರ್ವಾಹಕದ ಹೊಸ ಮತ್ತು ಆಪ್ಟಿಮೈಸ್ ಮಾಡಿದ ಅನುಷ್ಠಾನವನ್ನು ಬಳಸಿ.</translation> +<translation id="8845001906332463065">ಸಹಾಯ ಪಡೆಯಿರಿ</translation> <translation id="8846141544112579928">ಕೀಬೋರ್ಡ್ಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">ಶಿಫ್ಟ್ ಕೀ ಮೋಡ್ ಸ್ವಿಚ್</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 205d90e..ce75afb 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">페이지 북마크...</translation> <translation id="1047956942837015229"><ph name="COUNT" />개 항목 삭제 중...</translation> <translation id="1048597748939794622">모든 레이어에 사용하도록 강제 설정합니다.</translation> +<translation id="1049795001945932310">언어 설정(&L)</translation> <translation id="1049926623896334335">Word 문서</translation> <translation id="1054153489933238809">새 탭에서 원본 이미지 열기</translation> <translation id="1055806300943943258">블루투스 및 USB 기기 검색 중...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">음역(namaste → નમસ્તે)</translation> <translation id="1209796539517632982">자동 이름 서버</translation> <translation id="1215411991991485844">새 백그라운드 앱을 추가함</translation> +<translation id="1216954813581739968">데스크톱 공유를 위해 탭 사용</translation> <translation id="121827551500866099">다운로드 항목 모두 표시...</translation> <translation id="122082903575839559">인증서 서명 알고리즘</translation> <translation id="1221024147024329929">PKCS #1 MD2(RSA 암호화 사용)</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">자동 로그인 실패</translation> <translation id="1293556467332435079">파일</translation> <translation id="1294298200424241932">신뢰 설정 수정:</translation> +<translation id="1295794900245526845">로그인하려면 <ph name="PASSWORD_MANAGER_BRAND" />(으)로 저장된 계정 선택</translation> <translation id="1297175357211070620">대상</translation> <translation id="1297922636971898492">현재 Google 드라이브를 사용할 수 없습니다. Google 드라이브를 다시 사용할 수 있게 되면 자동으로 업로드가 다시 시작됩니다.</translation> <translation id="1300861494336759522">Windows 데스크톱 검색 리디렉션</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">시작 페이지, 새 탭 페이지, 검색 엔진, 고정 탭이 재설정됩니다. 또한 모든 확장 프로그램이 사용 중지되고 쿠키와 같은 임시 데이터가 삭제됩니다. 북마크, 기록, 저장된 비밀번호는 삭제되지 않습니다.</translation> <translation id="1434886155212424586">홈페이지가 새 탭 페이지입니다.</translation> <translation id="1435550882135542937">확장 프로그램 툴바 재설계</translation> +<translation id="1436402875660227532">참고: 이 설정은 더 이상 이 시스템에서 사용되지 않지만 계속 보고 수정할 수 있습니다.</translation> <translation id="1436784010935106834">삭제됨</translation> <translation id="1438632560381091872">탭 음소거 해제</translation> <translation id="1441841714100794440">베트남어 키보드(텔렉스)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">가상 키보드 지원을 사용합니다.</translation> <translation id="1474079335130556426">Push API에 백그라운드 모드를 사용 설정합니다. 이렇게 하면 Push API에서 Chrome이 필요할 때 마지막 창이 닫힌 후에도 Chrome이 계속 실행되고 OS 시작 시 Chrome을 실행합니다.</translation> <translation id="1474339897586437869">'<ph name="FILENAME" />'이(가) 업로드되지 않았습니다. Google 드라이브에 충분한 여유 공간이 없습니다.</translation> +<translation id="1476607407192946488">언어 설정(&L)</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />검색주소창<ph name="END_LINK" />에서 검색할 때 사용할 검색엔진을 설정합니다.</translation> <translation id="1477301030751268706">Identity API 토큰 캐시</translation> @@ -650,6 +655,7 @@ <translation id="1962233722219655970">이 페이지에서 사용자 컴퓨터에서 작동하지 않는 Native Client 앱을 사용합니다.</translation> <translation id="1965328510789761112">개별 메모리</translation> <translation id="1965624977906726414">특별한 권한이 필요하지 않습니다.</translation> +<translation id="1968720524450620475">웹 알림에 작업 아이콘 사용</translation> <translation id="1970746430676306437">페이지 정보 보기(&I)</translation> <translation id="197288927597451399">계속</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" />을(를) 다운로드하지 못했습니다.</translation> @@ -910,6 +916,7 @@ <translation id="2344262275956902282">- 및 = 키를 사용하여 후보 목록을 페이지에 표시</translation> <translation id="2347476388323331511">동기화할 수 없음</translation> <translation id="2347991999864119449">플러그인 콘텐츠 실행 시기를 선택해주세요.</translation> +<translation id="2348165084656290171">오디오를 공유하려면 탭 또는 전체 화면을 선택합니다.</translation> <translation id="2350182423316644347">애플리케이션 초기화 중...</translation> <translation id="2350796302381711542"><ph name="HANDLER_HOSTNAME" />에서 <ph name="REPLACED_HANDLER_TITLE" /> 대신 모든 <ph name="PROTOCOL" /> 링크를 열도록 허용하시겠습니까?</translation> <translation id="2351266942280602854">언어 및 입력</translation> @@ -997,6 +1004,7 @@ <translation id="247772113373397749">캐나다 다국어 키보드</translation> <translation id="2478176599153288112">'<ph name="EXTENSION" />'의 미디어 파일 권한</translation> <translation id="2478830106132467213">휴대전화가 손이 닿는 거리에 있을 때에만 이 <ph name="DEVICE_TYPE" />을(를) 잠금 해제합니다.</translation> +<translation id="247949520305900375">오디오 공유</translation> <translation id="2479780645312551899">이번만 모든 플러그인 실행</translation> <translation id="2480626392695177423">전각/반각 문장부호 입력 모드 간 전환</translation> <translation id="2481332092278989943">실행기에 추가</translation> @@ -1311,6 +1319,7 @@ <translation id="2889064240420137087">다음으로 링크 열기...</translation> <translation id="2889925978073739256">샌드박스 처리되지 않은 플러그인 계속 차단</translation> <translation id="2890624088306605051">동기화된 설정 및 데이터만 검색</translation> +<translation id="2890678560483811744">페이지 범위를 벗어난 경우 참고사항</translation> <translation id="2893168226686371498">기본 브라우저</translation> <translation id="289426338439836048">기타 모바일 네트워크...</translation> <translation id="2894745200702272315">하드웨어 종속성이 있는 'Ok Google' 핫워드 감지 기능의 시험 버전을 사용 설정합니다.</translation> @@ -1339,7 +1348,6 @@ <translation id="2925966894897775835">스프레드시트</translation> <translation id="2927017729816812676">캐시 저장 공간</translation> <translation id="2927657246008729253">변경...</translation> -<translation id="2928415919076124714">전체화면에서 툴바 숨기기</translation> <translation id="2928526264833629376">계속해서 행아웃 사용</translation> <translation id="2930644991850369934">복구 이미지를 다운로드하는 중에 문제가 발생했습니다. 네트워크 연결이 끊어졌습니다.</translation> <translation id="293111069139560936">이미 활성화된 창을 하나만 보유한 실행기 항목을 클릭했을 때 실행기에서 창을 최소화하도록 허용합니다.</translation> @@ -1463,6 +1471,7 @@ <translation id="3117812041123364382">플로팅 가상 키보드를 사용 설정/사용 중지합니다.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> 도움말</translation> <translation id="3120430004221004537">기기(<ph name="DEVICE_NAME" />)에서 해당 작업에 필요한 암호화가 수행되지 않았습니다.</translation> +<translation id="3121260210578524273">웹 알림에 작업 버튼의 아이콘을 사용합니다.</translation> <translation id="3121793941267913344"><ph name="IDS_SHORT_PRODUCT_NAME" /> 기기 재설정</translation> <translation id="3122162841865761901">개발자 도구 실험</translation> <translation id="3122464029669770682">CPU</translation> @@ -1565,7 +1574,7 @@ <translation id="3258924582848461629">일본어 필기 입력 방법</translation> <translation id="3264544094376351444">Sans-serif</translation> <translation id="3264547943200567728">Chromebox 네트워크 설정 실패</translation> -<translation id="3265459715026181080">윈도우 닫기</translation> +<translation id="3265459715026181080">창 닫기</translation> <translation id="3267271790328635957">PDF만 해당</translation> <translation id="3267726687589094446">여러 파일을 자동으로 다운로드하도록 계속 허용</translation> <translation id="3269093882174072735">이미지 로드</translation> @@ -1583,7 +1592,6 @@ <translation id="3289566588497100676">쉬운 기호 입력</translation> <translation id="3289856944988573801">업데이트를 확인하려면 이더넷 또는 Wi-Fi를 사용하세요.</translation> <translation id="3293325348208285494">빠른 시작</translation> -<translation id="3293894718455402932">'<ph name="EXTENSION" />'에서 선택한 폴더의 이미지, 동영상, 사운드 파일을 읽고 쓸 수 있게 됩니다.</translation> <translation id="3294437725009624529">손님</translation> <translation id="329650768420594634">확장 프로그램 패키지 경고</translation> <translation id="3296763833017966289">그루지야어</translation> @@ -1641,6 +1649,7 @@ <translation id="3338239663705455570">슬로베니아어 키보드</translation> <translation id="3340978935015468852">설정</translation> <translation id="3341703758641437857">파일 URL에 대한 액세스 허용</translation> +<translation id="3343813173145836998">이 기기에서 간편하게 로그인</translation> <translation id="3344786168130157628">액세스 지점 이름:</translation> <translation id="3345135638360864351">이 사이트에 대한 액세스 요청을 <ph name="NAME" />님에게 보내지 못했습니다. 나중에 다시 시도해 주세요.</translation> <translation id="3345886924813989455">지원되는 브라우저를 찾을 수 없습니다.</translation> @@ -2121,6 +2130,7 @@ <translation id="3996912167543967198">재설정 중...</translation> <translation id="3997015411467176489">실험용 캔버스 기능</translation> <translation id="40027638859996362">단어 이동</translation> +<translation id="400554499662786523">오디오를 공유하려면 탭을 선택합니다.</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" />에서 프린터 설정 또는 관리</translation> <translation id="4014432863917027322">'<ph name="EXTENSION_NAME" />'을(를) 복구하시겠습니까?</translation> <translation id="4018133169783460046">이 언어로 <ph name="PRODUCT_NAME" /> 사용하기</translation> @@ -2221,6 +2231,7 @@ <translation id="4180788401304023883">CA 인증서 '<ph name="CERTIFICATE_NAME" />'을(를) 삭제하겠습니까?</translation> <translation id="418179967336296930">러시아 표음식(YaZHert) 키보드</translation> <translation id="4181841719683918333">언어</translation> +<translation id="4187248015940562149">웹사이트에서 내 주변의 블루투스 기기에 연결하여 제어하도록 할 수 있는 웹 블루투스를 사용하도록 설정합니다.</translation> <translation id="4188026131102273494">키워드:</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> 확장 프로그램에서 설정을 제어하고 있습니다.</translation> <translation id="4193154014135846272">Google 문서</translation> @@ -2277,6 +2288,7 @@ <translation id="4268025649754414643">키 암호화</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">버전 <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">일치하는 항목이 없습니다.</translation> <translation id="4274187853770964845">동기화 오류: 동기화를 중지한 다음 다시 시작하세요.</translation> <translation id="4275830172053184480">기기 다시 시작</translation> <translation id="4276796043975446927">Chromebox 화상회의 시스템에 오신 것을 환영합니다</translation> @@ -2346,6 +2358,7 @@ <translation id="4378551569595875038">연결 중...</translation> <translation id="438122767399415311">UI 방향 강제 설정</translation> <translation id="4381849418013903196">콜론</translation> +<translation id="4383192539467954373">모든 기기에서 자동 로그인</translation> <translation id="4384652540891215547">확장 프로그램 활성화</translation> <translation id="438503109373656455">말</translation> <translation id="4387554346626014084">앱 런처 동기화를 사용 설정합니다. 가능한 경우(OSX 외) 폴더도 사용 설정합니다.</translation> @@ -2363,6 +2376,7 @@ <translation id="4421932782753506458">복실이</translation> <translation id="4422347585044846479">이 페이지에 대한 북마크 편집</translation> <translation id="4422428420715047158">도메인:</translation> +<translation id="4423482519432579560">맞춤법 검사(&S)</translation> <translation id="442477792133831654">주변 기기와 통신</translation> <translation id="4425149324548788773">내 드라이브</translation> <translation id="4428582326923056538">Adobe Flash Player 카메라 예외가 다릅니다.</translation> @@ -2377,6 +2391,7 @@ <translation id="444267095790823769">보호된 콘텐츠 예외</translation> <translation id="4443536555189480885">도움말(&H)</translation> <translation id="4444304522807523469">USB나 로컬 네트워크에 포함된 문서 스캐너에 액세스</translation> +<translation id="4445559854264555037">기기가 표시되지 않나요? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">미러링</translation> <translation id="4447465454292850432">배터리:</translation> <translation id="4449935293120761385">자동완성 정보</translation> @@ -2635,6 +2650,7 @@ <translation id="485316830061041779">독일어</translation> <translation id="4856478137399998590">모바일 데이터 서비스가 활성화되었으며 사용할 준비가 되었습니다.</translation> <translation id="4858913220355269194">축구왕</translation> +<translation id="4860565041166337978">해당하는 경우 시스템 다운로드 관리자가 다운로드를 처리할 수 있도록 허용합니다.</translation> <translation id="48607902311828362">비행 모드</translation> <translation id="4861833787540810454">재생(&P)</translation> <translation id="4862050643946421924">기기 추가 중...</translation> @@ -2718,7 +2734,6 @@ <translation id="4977942889532008999">액세스 확인</translation> <translation id="4982718461356080574">비활성 탭이 겹친 경우 닫기 버튼 숨기기</translation> <translation id="498294082491145744">쿠키, 자바스크립트, 플러그인, 위치 정보, 마이크, 카메라 등과 같은 기능에 대한 웹사이트의 액세스 권한을 제어하는 설정을 변경합니다.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">페이지</translation> <translation id="4988792151665380515">공개 키를 내보내지 못했습니다.</translation> <translation id="49896407730300355">반시계 방향으로 회전(&O)</translation> @@ -2907,7 +2922,6 @@ <translation id="5268606875983318825">PPAPI(프로세스 외부)</translation> <translation id="526926484727016706">기본적으로 모든 iframe 권한이 거부되도록 설정되어 있습니다. 특정 iframe 권한을 허용하는 데 권한의 이름을 새 iframe 속성 값으로 설정하는 절차가 포함될 수도 있습니다.</translation> <translation id="5269977353971873915">인쇄 실패</translation> -<translation id="5270884342523754894">'<ph name="EXTENSION" />'에서 선택한 폴더의 이미지, 동영상, 사운드 파일을 읽을 수 있게 됩니다.</translation> <translation id="5271247532544265821">중국어 간체/번체 모드 전환</translation> <translation id="5271549068863921519">비밀번호 저장</translation> <translation id="5273628206174272911">가로 오버스크롤에 반응하는 기록 탐색(실험 기능)입니다.</translation> @@ -2944,6 +2958,7 @@ <translation id="5316716239522500219">모니터 미러</translation> <translation id="5317780077021120954">저장</translation> <translation id="5319782540886810524">라트비아어 키보드</translation> +<translation id="532247166573571973">서버 접속이 불가능할 수 있습니다. 나중에 다시 시도해 주세요.</translation> <translation id="5323213332664049067">남미 언어</translation> <translation id="532360961509278431">'$1'을(를) 열 수 없음: $2</translation> <translation id="5324674707192845912">Google에 <ph name="DEVICE_TYPE" />을(를) 등록 취소하면 기기를 원격으로 찾고, 기기의 데이터를 삭제하고, 기기를 잠그는 기능이 사용 중지됩니다. 취소한 후에는 재부팅해야 합니다. 계속하시겠습니까?</translation> @@ -2996,11 +3011,11 @@ <translation id="5390284375844109566">색인화된 데이터베이스</translation> <translation id="5392544185395226057">기본 클라이언트 지원을 사용하도록 설정합니다.</translation> <translation id="5393125431335030955">이 플러그인은 데스크톱에서만 작동합니다.</translation> -<translation id="5393559999218790205">UI 합성 애니메이션 타임라인 사용 중지</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" />의 <ph name="PEPPER_PLUGIN_NAME" />이(가) 사용자 컴퓨터에 액세스하려고 합니다.</translation> <translation id="539755880180803351">자리표시자 텍스트로 자동완성 필드 유형을 사용하여 웹 양식 메모를 답니다.</translation> <translation id="5397578532367286026">관리자(<ph name="MANAGER_EMAIL" />)는 chrome.com에서 해당 사용자의 사용 및 방문 기록을 검토할 수 있습니다.</translation> <translation id="5397794290049113714">나</translation> +<translation id="5398572795982417028">페이지가 범위를 벗어난 경우 참고하세요. 한도는 <ph name="MAXIMUM_PAGE" />페이지입니다.</translation> <translation id="5398824043967640339">다른 사이트에서 <ph name="COUNT" />개</translation> <translation id="5399158067281117682">PIN이 일치하지 않습니다.</translation> <translation id="5400640815024374115">TPM(신뢰할 수 있는 플랫폼 모듈) 칩을 사용하지 않거나 없습니다.</translation> @@ -3014,13 +3029,13 @@ <translation id="5417998409611691946"><ph name="DEVICE_TYPE" />의 새로운 기능:</translation> <translation id="5418923334382419584">미얀마어 키보드</translation> <translation id="5419294236999569767">시스템 시간</translation> -<translation id="5421136146218899937">인터넷 사용정보 삭제...</translation> +<translation id="5421136146218899937">인터넷 사용 기록 삭제...</translation> <translation id="5422781158178868512">죄송합니다. 외부 저장장치를 인식하지 못했습니다.</translation> <translation id="542318722822983047">커서를 다음 후보자로 자동 이동</translation> <translation id="5423849171846380976">활성화됨</translation> <translation id="5425470845862293575">실험용 DirectWrite 글꼴 렌더링 시스템을 사용하도록 설정합니다.</translation> <translation id="5425722269016440406">Smart Lock 설정은 휴대전화 및 다른 기기와 동기화되므로 Smart Lock을 사용 중지하려면 사용자가 온라인 상태여야 합니다. 먼저 네트워크에 연결하시기 바랍니다.</translation> -<translation id="5426623592374109001">UI의 합성 애니메이션에 이전 애니메이션 하위 시스템을 사용합니다.</translation> +<translation id="5425863515030416387">모든 기기에서 간편하게 로그인</translation> <translation id="5427459444770871191">시계 방향으로 회전(&C)</translation> <translation id="5428105026674456456">스페인어</translation> <translation id="542872847390508405">손님으로 로그인 중</translation> @@ -3045,6 +3060,7 @@ <translation id="5451646087589576080">프레임 정보(&I)</translation> <translation id="5453029940327926427">탭 닫기</translation> <translation id="5453632173748266363">키릴 문자</translation> +<translation id="5454166040603940656">제공업체: <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">잘못된 데이터</translation> <translation id="5457459357461771897">컴퓨터에서 사진, 음악, 기타 미디어 조회 및 삭제</translation> <translation id="5457599981699367932">손님으로 로그인</translation> @@ -3214,7 +3230,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">핀치 작업 시 확대/축소</translation> <translation id="5710406368443808765">시스템에서 기기 토큰과 ID를 저장하지 못했습니다.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" />이(가) 응답하지 않습니다. 전송할 수 없습니다.</translation> <translation id="5711983031544731014">잠금 해제할 수 없습니다. 비밀번호를 입력하세요.</translation> <translation id="5712966208980506909">사용 설정하면 chrome://md-policy URL에서 머티리얼 디자인 정책 페이지를 로드합니다.</translation> <translation id="5715711091495208045">플러그인 중개인: <ph name="PLUGIN_NAME" /></translation> @@ -3483,7 +3498,6 @@ <translation id="6111974609785983504">기본적으로 허용</translation> <translation id="6113134669445407638">WebRTC에서 DA-AEC를 사용 중지합니다. 보고된 시스템 지연의 신뢰도가 높거나 다른 사용자가 내 기기의 에코를 경험하는 경우 사용하세요.</translation> <translation id="6116921718742659598">언어 및 입력 설정 변경</translation> -<translation id="6117536376248197233">렌더기에 합성 애니메이션 타임라인 사용 중지</translation> <translation id="6120205520491252677">이 페이지를 시작 화면에 고정...</translation> <translation id="6122081475643980456">인터넷 연결이 제어되고 있습니다.</translation> <translation id="6122093587541546701">이메일(선택사항):</translation> @@ -3515,6 +3529,7 @@ <translation id="6163522313638838258">모두 펼치기...</translation> <translation id="6164005077879661055">관리 대상 사용자를 제거하면 해당 관리 대상 사용자와 연결되어 있는 모든 파일 및 로컬 데이터가 영구적으로 삭제됩니다. 하지만 관리자는 관리 대상 사용자의 방문한 웹사이트 및 설정을 <ph name="MANAGEMENT_URL" /> 페이지에서 계속 볼 수 있습니다.</translation> <translation id="6165508094623778733">자세히 알아보기</translation> +<translation id="6167008112175207002">북마크, 방문 기록, 비밀번호, 기타 설정이 Google 계정에 동기화되므로 모든 기기에서 사용할 수 있습니다. 이 설정은 <ph name="BEGIN_LINK" />에서 변경할 수 있습니다.</translation> <translation id="6171550060231646388">시뮬레이션된 하드웨어 'Ok Google' 기능</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">인증서 선택</translation> @@ -3718,6 +3733,7 @@ <translation id="648927581764831596">사용할 수 없음</translation> <translation id="6490936204492416398">웹스토어에서 새 항목 설치</translation> <translation id="6492313032770352219">디스크 크기:</translation> +<translation id="6498249116389603658">모든 언어(&A)</translation> <translation id="6499143127267478107">프록시 스크립트의 호스트 확인 중...</translation> <translation id="6503077044568424649">자주 방문한 페이지</translation> <translation id="6503256918647795660">스위스 프랑스어 키보드</translation> @@ -3759,7 +3775,6 @@ <translation id="6555432686520421228">모든 사용자 계정을 삭제하고 사용 중인 <ph name="IDS_SHORT_PRODUCT_NAME" /> 기기를 재설정하여 새것처럼 만듭니다.</translation> <translation id="6556866813142980365">다시실행</translation> <translation id="6557565812667414268">DPI가 높은 디스플레이에만 사용</translation> -<translation id="655845594391856372">탭이 응답하지 않습니다. 전송할 수 없습니다.</translation> <translation id="6559580823502247193">(기기에 이미 있음)</translation> <translation id="6561726789132298588">입력</translation> <translation id="6562437808764959486">복구 이미지 추출 중...</translation> @@ -3860,6 +3875,7 @@ <translation id="6723354935081862304">Google 문서도구 또는 기타 클라우드 대상으로 인쇄합니다. Google 클라우드 프린트로 인쇄하려면 <ph name="BEGIN_LINK" />로그인<ph name="END_LINK" />하세요.</translation> <translation id="6723661294526996303">북마크 및 설정 가져오기...</translation> <translation id="6723839937902243910">전원</translation> +<translation id="6725240607822645708">고유 대화목록에서 IME 실행</translation> <translation id="6725970970008349185">페이지당 표시할 후보자 수</translation> <translation id="672609503628871915">새로운 기능 알아보기</translation> <translation id="6727005317916125192">이전 창</translation> @@ -3990,12 +4006,11 @@ <translation id="6948736568813450284">개발자 전용: Google Payments API 호출에 샌드박스 서비스를 사용하세요.</translation> <translation id="6949306908218145636">열린 페이지를 북마크에 추가...</translation> <translation id="695164542422037736">이 옵션을 사용하고 본문 스타일을 background-attachment:fixed로 지정하면 배경에 합성된 레이어가 표시됩니다.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" />에서 비밀번호를 기억하고 이 기기에서 사이트에 자동으로 로그인합니다.</translation> <translation id="6955446738988643816">팝업 검사</translation> <translation id="695755122858488207">선택하지 않은 버튼</translation> +<translation id="6960277925159781810">이 기기에 자동 로그인</translation> <translation id="696036063053180184">세벌식(shift 없음)</translation> <translation id="696203921837389374">모바일 데이터를 이용한 동기화 사용 설정</translation> -<translation id="6964308487066031935">'<ph name="EXTENSION" />'에 폴더를 추가하시겠습니까?</translation> <translation id="6965382102122355670">확인</translation> <translation id="6965648386495488594">포트</translation> <translation id="6965978654500191972">기기</translation> @@ -4095,7 +4110,6 @@ <translation id="7076293881109082629">로그인</translation> <translation id="7077829361966535409">현재 프록시 설정을 사용하여 로그인 페이지를 로드하지 못했습니다. <ph name="GAIA_RELOAD_LINK_START" />다시 로그인<ph name="GAIA_RELOAD_LINK_END" />하거나 다른 <ph name="PROXY_SETTINGS_LINK_START" />프록시 설정<ph name="PROXY_SETTINGS_LINK_END" />을 사용합니다.</translation> <translation id="7077872827894353012">무시된 프로토콜 핸들러</translation> -<translation id="7079038783243627996">'<ph name="EXTENSION" />'에서 선택한 폴더의 이미지, 동영상, 사운드 파일을 읽고 삭제할 수 있게 됩니다.</translation> <translation id="708060913198414444">오디오 주소 복사(&O)</translation> <translation id="708187310695946552">세션 복원 풍선 UI</translation> <translation id="7082055294850503883">기본적으로 CapsLock 상태를 무시하고 소문자 입력</translation> @@ -4239,6 +4253,8 @@ <translation id="7313804056609272439">베트남어 입력 방법(VNI)</translation> <translation id="7314244761674113881">SOCKS 호스트</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" />(현재)</translation> +<translation id="7321545336522791733">서버에 연결할 수 없음</translation> +<translation id="7324841169865301118">사용자가 데스크톱 공유를 위해 탭을 선택할 수 있도록 합니다.</translation> <translation id="7325437708553334317">고대비 확장 프로그램</translation> <translation id="7326565110843845436">세 손가락으로 터치패드 클릭</translation> <translation id="73289266812733869">선택 안함</translation> @@ -4465,7 +4481,6 @@ <translation id="7650511557061837441">'<ph name="TRIGGERING_EXTENSION_NAME" />'에서 '<ph name="EXTENSION_NAME" />'을(를) 삭제하려고 합니다.</translation> <translation id="7650701856438921772">현재 <ph name="PRODUCT_NAME" /> 표시 언어로 사용 중입니다.</translation> <translation id="7654941827281939388">이 계정은 이미 이 컴퓨터에서 사용되고 있습니다.</translation> -<translation id="7655165758820095116">미디어 소스 개체를 사용하면 자바스크립트가 미디어 데이터를 직접 동영상 요소에 전송할 수 있습니다.</translation> <translation id="7658239707568436148">취소</translation> <translation id="7659584679870740384">더 이상 이 기기를 사용할 권한이 없습니다. 관리자에게 로그인 권한에 대해 문의하세요.</translation> <translation id="7664620655576155379">지원되지 않는 블루투스 기기(<ph name="DEVICE_NAME" />)입니다.</translation> @@ -4596,6 +4611,7 @@ <translation id="7861215335140947162">다운로드(&D)</translation> <translation id="7864539943188674973">블루투스 사용 안 함</translation> <translation id="7868891395842935202">API 실험에 대한 액세스를 제어하는 실험용 프레임워크를 사용합니다.</translation> +<translation id="7870576007982733437">해당하는 경우 시스템 다운로드 관리자 사용</translation> <translation id="7870790288828963061">새로운 버전의 Kiosk 앱을 찾을 수 없습니다. 업데이트할 대상이 없습니다. USB 메모리를 제거하세요.</translation> <translation id="787150342916295244">신용카드 스캐닝</translation> <translation id="7874357055309047713">항상 모든 사이트에서 실행</translation> @@ -4638,7 +4654,6 @@ <translation id="7918257978052780342">등록</translation> <translation id="7920092496846849526">이 페이지를 방문해도 괜찮은지 부모님께 문의했습니다.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" />의 응답을 기다리는 중...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" />에서 비밀번호를 기억하고 여러 기기에서 앱 및 사이트에 자동으로 로그인합니다.</translation> <translation id="7925686952655276919">모바일 데이터를 동기화에 사용하지 않습니다.</translation> <translation id="7926906273904422255">보안이 약한 출처를 비보안 또는 '의심스러운'으로 표시합니다.</translation> <translation id="7928710562641958568">기기 꺼내기</translation> @@ -4700,7 +4715,6 @@ 키 파일은 확장 프로그램의 새 버전을 만드는 데 필요하므로 안전한 장소에 보관하시기 바랍니다.</translation> <translation id="799923393800005025">보기 가능</translation> <translation id="7999338963698132743">새 작업 관리자</translation> -<translation id="8000004253404706714">렌더기의 합성 애니메이션에 이전 애니메이션 하위 시스템을 사용합니다.</translation> <translation id="8004582292198964060">브라우저</translation> <translation id="8007030362289124303">배터리 부족</translation> <translation id="8008356846765065031">인터넷 연결이 끊겼습니다. 인터넷 연결을 확인하세요.</translation> @@ -4713,7 +4727,7 @@ <translation id="8023801379949507775">지금 확장 프로그램 업데이트</translation> <translation id="8025789898011765392">작업</translation> <translation id="802597130941734897">배송지 주소 관리</translation> -<translation id="8026334261755873520">인터넷 사용정보 삭제</translation> +<translation id="8026334261755873520">인터넷 사용 기록 삭제</translation> <translation id="8026964361287906498">(엔터프라이즈 정책에 의해 관리됨)</translation> <translation id="8028060951694135607">Microsoft Key Recovery</translation> <translation id="8028993641010258682">크기</translation> @@ -4830,6 +4844,7 @@ <translation id="8185331656081929126">네트워크에 새 프린터가 감지되면 알림 표시</translation> <translation id="8186609076106987817">서버에서 파일을 찾을 수 없습니다.</translation> <translation id="8186706823560132848">소프트웨어</translation> +<translation id="8188120771410500975">입력란 맞춤법 확인(&C)</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> 외 <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" />개</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" />에 연결 중</translation> <translation id="8191230140820435481">앱, 확장 프로그램 및 테마 관리</translation> @@ -5223,6 +5238,7 @@ <translation id="8765985713192161328">핸들러 관리...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">사용자</translation> +<translation id="8768367823103160496">마우스 커서 잠금</translation> <translation id="8769662576926275897">카드 세부정보</translation> <translation id="8770196827482281187">페르시아어 입력 방법(ISIRI 2901 배열)</translation> <translation id="8774934320277480003">상단 여백</translation> @@ -5242,6 +5258,7 @@ <translation id="8795668016723474529">신용카드 추가</translation> <translation id="8795916974678578410">새 창</translation> <translation id="8798099450830957504">기본값</translation> +<translation id="8799127529310003270">사용하도록 설정한 경우 InputConnection이 IME 대화목록 실행을 호출하며 복제 편집기를 유지하는 대신 각 InputConnection 호출은 직접 렌더기에 요청합니다.</translation> <translation id="8799839487311913894">'비밀번호 변경' 양식을 제출한 후 비밀번호 관리자에서 비밀번호를 업데이트할 수 있도록 합니다.</translation> <translation id="8800004011501252845">해당 목적지 사용자 표시</translation> <translation id="8800420788467349919">볼륨: <ph name="PRECENTAGE" />%</translation> @@ -5267,6 +5284,7 @@ <translation id="8841142799574815336">시각 표시 영역 비활성</translation> <translation id="884264119367021077">배송지 주소</translation> <translation id="8844238624737526720">최적화된 방식으로 새롭게 구현된 Chrome 작업 관리자를 사용합니다.</translation> +<translation id="8845001906332463065">도움말 보기</translation> <translation id="8846141544112579928">키보드 검색 중...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift 키 모드 전환</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 27ab48a..05b46f5 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Įtraukti šį puslapį į žymes...</translation> <translation id="1047956942837015229">Ištrinama elementų: <ph name="COUNT" />...</translation> <translation id="1048597748939794622">Priverstinai įgalinta visuose sluoksniuose</translation> +<translation id="1049795001945932310">&Kalbos nustatymai</translation> <translation id="1049926623896334335">Rašyklės dokumentas</translation> <translation id="1054153489933238809">Atidaryti originalų &vaizdą naujame skirtuke</translation> <translation id="1055806300943943258">Ieškoma „Bluetooth“ ir USB įrenginių...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliteracija (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automatiniai pavadinimų serveriai</translation> <translation id="1215411991991485844">Pridėta nauja foninė programa</translation> +<translation id="1216954813581739968">Įgalinti darbalaukio bendrinimo skirtuką.</translation> <translation id="121827551500866099">Rodyti visus atsisiuntimus...</translation> <translation id="122082903575839559">Sertifikato parašo algoritmas</translation> <translation id="1221024147024329929">PKCS Nr. 1 MD2 su RSA šifruote</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Automatiškai prisijungiant įvyko klaida</translation> <translation id="1293556467332435079">Failai</translation> <translation id="1294298200424241932">Redaguoti patikimumo nustatymus:</translation> +<translation id="1295794900245526845">Pasirinkite paskyrą, išsaugotą naudojant „<ph name="PASSWORD_MANAGER_BRAND" />“, kad prisijungtumėte</translation> <translation id="1297175357211070620">Paskirties vieta</translation> <translation id="1297922636971898492">„Google“ diskas dabar nepasiekiamas. Įkėlimas bus iš naujo pradėtas automatiškai, kai „Google“ diskas bus vėl pasiekiamas.</translation> <translation id="1300861494336759522">„Windows Desktop Search“ paieškų peradresavimas</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Atlikus šį veiksmą paleidimo puslapis, naujo skirtuko puslapis, paieškos variklis ir prisegti skirtukai bus iš nustatyti naujo. Taip pat bus išjungti visi plėtiniai ir išvalyti laikini duomenys, pvz., slapukai. Žymės, istorija ir išsaugoti slaptažodžiai išvalyti nebus.</translation> <translation id="1434886155212424586">Pagrindinis puslapis yra naujo skirtuko puslapis</translation> <translation id="1435550882135542937">Plėtinio įrankių juostos perprojektavimas</translation> +<translation id="1436402875660227532">Pastaba: šie nustatymai nebenaudojami šioje sistemoje, bet juos vis tiek galite peržiūrėti ir redaguoti.</translation> <translation id="1436784010935106834">Pašalinta</translation> <translation id="1438632560381091872">Įjungti garsą skirtukuose</translation> <translation id="1441841714100794440">Vietnamietiška klaviatūra (telekso išdėstymas)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Įgalinamas virtualiosios klaviatūros palaikymas.</translation> <translation id="1474079335130556426">Įgalinti „Push“ API fono režimą. Taip „Chrome“ galės toliau veikti uždarius paskutinį langą ir bus paleista įkėlus OS, jei to reikės „Push“ API.</translation> <translation id="1474339897586437869">Failas „<ph name="FILENAME" />“ neįkeltas. „Google“ diske nepakanka vietos.</translation> +<translation id="1476607407192946488">&Kalbos nustatymai</translation> <translation id="1476949146811612304">Nustatyti, kuris paieškos variklis naudojamas ieškant <ph name="BEGIN_LINK" />„Omnibox“<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Tapatybės API prieigos rakto talpykla</translation> <translation id="1478340334823509079">Išsami informacija: „<ph name="FILE_NAME" />“</translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Šiame puslapyje naudojama programa „Native Client“, kuri neveikia jūsų kompiuteryje.</translation> <translation id="1965328510789761112">Privati atmintis</translation> <translation id="1965624977906726414">Nėra specialių leidimų.</translation> +<translation id="1968720524450620475">Įgalinti žiniatinklio pranešimų veiksmų piktogramas.</translation> <translation id="1970746430676306437">Rodyti puslapio &informaciją</translation> <translation id="197288927597451399">Palikti</translation> <translation id="1973491249112991739">Nepavyko atsisiųsti „<ph name="PLUGIN_NAME" />“.</translation> @@ -909,6 +915,7 @@ <translation id="2344262275956902282">Naudokite „-“ ir „=“·klavišus, jei norite peržiūrėti kandidatų sąrašą</translation> <translation id="2347476388323331511">Nepavyko sinchronizuoti</translation> <translation id="2347991999864119449">Leisti pasirinkti, kada paleisti papildinio turinį</translation> +<translation id="2348165084656290171">Kad bendrintumėte garsą, pasirinkite skirtuką arba visą ekraną.</translation> <translation id="2350182423316644347">Inicijuojama programa...</translation> <translation id="2350796302381711542">Leisti „<ph name="HANDLER_HOSTNAME" />“ atidaryti visas <ph name="PROTOCOL" /> nuorodas vietoje „<ph name="REPLACED_HANDLER_TITLE" />“?</translation> <translation id="2351266942280602854">Kalba ir įvestis</translation> @@ -996,6 +1003,7 @@ <translation id="247772113373397749">Kanadai skirta kelių kalbų klaviatūra</translation> <translation id="2478176599153288112">Medijos failo leidimai, susiję su plėtiniu „<ph name="EXTENSION" />“</translation> <translation id="2478830106132467213">Atrakinti tik šį „<ph name="DEVICE_TYPE" />“ įrenginį, kai telefonas yra rankos atstumu nuo jo.</translation> +<translation id="247949520305900375">Bendrinti garsą</translation> <translation id="2479780645312551899">Šį kartą paleisti visus priedus</translation> <translation id="2480626392695177423">Kaitalioti viso / pusės pločio skyrybos režimą</translation> <translation id="2481332092278989943">Pridėti prie lentynos</translation> @@ -1310,6 +1318,7 @@ <translation id="2889064240420137087">Atidaryti nuorodą naudojant...</translation> <translation id="2889925978073739256">Toliau blokuoti ne „smėlio dėžės“ papildinius</translation> <translation id="2890624088306605051">Gauti tik sinchronizuotus nustatymus ir duomenis</translation> +<translation id="2890678560483811744">Puslapio už diapazono ribų nuoroda</translation> <translation id="2893168226686371498">Numatytoji naršyklė</translation> <translation id="289426338439836048">Kitas mobilusis tinklas...</translation> <translation id="2894745200702272315">Įgalinamos aktyvinamojo žodžio „Ok Google“ aptikimo eksperimentinės versijos funkcijos, kurių veikimas priklauso nuo aparatinės įrangos.</translation> @@ -1338,7 +1347,6 @@ <translation id="2925966894897775835">Skaičiuoklės</translation> <translation id="2927017729816812676">Talpyklos saugykla</translation> <translation id="2927657246008729253">Pakeisti...</translation> -<translation id="2928415919076124714">Slėpti įrankių juostą, kai veikia viso ekrano režimas</translation> <translation id="2928526264833629376">Eiti į „Hangout“</translation> <translation id="2930644991850369934">Atsisiunčiant atkūrimo vaizdą iškilo problema. Nutrūko interneto ryšys.</translation> <translation id="293111069139560936">Leidžiama lentynai sumažinti langą, jei spustelėjamas lentynos elementas, kuris turi tik vieną su juo susietą jau aktyvų langą.</translation> @@ -1462,6 +1470,7 @@ <translation id="3117812041123364382">Įgalinama / išjungiama slankioji virtualioji klaviatūra.</translation> <translation id="3118319026408854581">„<ph name="PRODUCT_NAME" />“ pagalba</translation> <translation id="3120430004221004537">Nepakankama nurodytos operacijos šifruotė įrenginyje „<ph name="DEVICE_NAME" />“.</translation> +<translation id="3121260210578524273">Įgalinkite žiniatinklio pranešimų veiksmų mygtukų piktogramas.</translation> <translation id="3121793941267913344">Nustatyti iš naujo šį „<ph name="IDS_SHORT_PRODUCT_NAME" />“ įrenginį</translation> <translation id="3122162841865761901">Kūrėjo įrankių eksperimentai</translation> <translation id="3122464029669770682">Centrinis procesorius</translation> @@ -1582,7 +1591,6 @@ <translation id="3289566588497100676">Paprasta simbolių įvestis</translation> <translation id="3289856944988573801">Jei norite tikrinti, ar nėra naujinių, naudokite eternetą arba „Wi-Fi“.</translation> <translation id="3293325348208285494">Greitas paleidimas</translation> -<translation id="3293894718455402932">„<ph name="EXTENSION" />“ galės skaityti ir rašyti vaizdų, vaizdo įrašų ir garsų failus pažymėtuose aplankuose.</translation> <translation id="3294437725009624529">Svečias</translation> <translation id="329650768420594634">Įspėjimas dėl paketo plėtinio</translation> <translation id="3296763833017966289">Gruzinų</translation> @@ -1639,6 +1647,7 @@ <translation id="3338239663705455570">Slovėniška klaviatūra</translation> <translation id="3340978935015468852">nustatymų</translation> <translation id="3341703758641437857">Leisti pasiekti failo URL</translation> +<translation id="3343813173145836998">Paprastas prisijungimas šiame įrenginyje</translation> <translation id="3344786168130157628">Prieigos taško pavadinimas:</translation> <translation id="3345135638360864351">Nepavyko <ph name="NAME" /> išsiųsti jūsų prieigos prie šios svetainės užklausos. Bandykite dar kartą.</translation> <translation id="3345886924813989455">Rasta nepalaikoma naršyklė</translation> @@ -2118,6 +2127,7 @@ <translation id="3996912167543967198">Nustatoma iš naujo...</translation> <translation id="3997015411467176489">Eksperimentinės matomosios tinklalapio srities funkcijos</translation> <translation id="40027638859996362">Perkelti žodį</translation> +<translation id="400554499662786523">Kad bendrintumėte garsą, pasirinkite skirtuką.</translation> <translation id="4012550234655138030">Nustatyti arba valdyti profilius <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="4014432863917027322">Pataisyti „<ph name="EXTENSION_NAME" />“?</translation> <translation id="4018133169783460046">Pateikti „<ph name="PRODUCT_NAME" />“ šia kalba</translation> @@ -2220,6 +2230,7 @@ <translation id="4180788401304023883">Ištrinti „<ph name="CERTIFICATE_NAME" />“ sertifikavimo institucijos sertifikatą?</translation> <translation id="418179967336296930">Rusiška fonetinė (YaZHert) klaviatūra</translation> <translation id="4181841719683918333">Kalbos</translation> +<translation id="4187248015940562149">Įgalinama žiniatinklio „Bluetooth“ funkcija, kurią naudojant svetainėms leidžiama prisijungti prie netoliese esančių „Bluetooth“ įrenginių ir juos valdyti.</translation> <translation id="4188026131102273494">Raktinis žodis:</translation> <translation id="4189406272289638749">Plėtinys (<b><ph name="EXTENSION_NAME" /></b>) valdo šį nustatymą.</translation> <translation id="4193154014135846272">„Google“ dokumentas</translation> @@ -2276,6 +2287,7 @@ <translation id="4268025649754414643">Rakto kodavimas</translation> <translation id="4268574628540273656">URL adresas:</translation> <translation id="4270393598798225102"><ph name="NUMBER" /> versija</translation> +<translation id="4271396100647220620">Nėra atitikčių</translation> <translation id="4274187853770964845">Sinchronizavimo klaida: sustabdykite ir paleiskite sinchronizavimą iš naujo.</translation> <translation id="4275830172053184480">Iš naujo paleisti įrenginį</translation> <translation id="4276796043975446927">Sveiki, tai – „Chromebox“ susitikimams</translation> @@ -2345,6 +2357,7 @@ <translation id="4378551569595875038">Jungiamasi...</translation> <translation id="438122767399415311">Priverstinai nustatyti NS kryptį</translation> <translation id="4381849418013903196">Dvitaškis</translation> +<translation id="4383192539467954373">Automatinis prisijungimas keliuose įrenginiuose</translation> <translation id="4384652540891215547">Aktyvinti plėtinį</translation> <translation id="438503109373656455">Mūšis</translation> <translation id="4387554346626014084">Įgalinti programų paleidimo priemonės sinchronizavimą. Tai tai pat įgalina aplankus, kur tai galima padaryti (ne OSX).</translation> @@ -2362,6 +2375,7 @@ <translation id="4421932782753506458">Pūkuotasis</translation> <translation id="4422347585044846479">Redaguoti žymę šitam puslapiui</translation> <translation id="4422428420715047158">Sritis:</translation> +<translation id="4423482519432579560">&Rašybos tikrinimas</translation> <translation id="442477792133831654">Užmegzti ryšį su netoliese esančiais įrenginiais</translation> <translation id="4425149324548788773">Mano Diskas</translation> <translation id="4428582326923056538">„Adobe Flash Player“ fotoaparato išimtys skiriasi.</translation> @@ -2376,6 +2390,7 @@ <translation id="444267095790823769">Apsaugoto turinio išimtys</translation> <translation id="4443536555189480885">&Pagalba</translation> <translation id="4444304522807523469">Pasiekti dokumentų skaitytuvus, prijungtus per USB jungtį ar vietiniame tinkle</translation> +<translation id="4445559854264555037">Nematote savo įrenginio? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Veidrodinis</translation> <translation id="4447465454292850432">Akumuliatorius:</translation> <translation id="4449935293120761385">Apie automatinį pildymą</translation> @@ -2633,6 +2648,7 @@ <translation id="485316830061041779">Vokiečių</translation> <translation id="4856478137399998590">Duomenų mobiliesiems paslauga suaktyvinta ir paruošta naudoti</translation> <translation id="4858913220355269194">Šemberas</translation> +<translation id="4860565041166337978">Leisti atsisiuntimus apdoroti sistemos atsisiuntimų tvarkytuvei, kai tai įmanoma.</translation> <translation id="48607902311828362">Lėktuvo režimas</translation> <translation id="4861833787540810454">&Paleisti</translation> <translation id="4862050643946421924">Pridedamas įrenginys...</translation> @@ -2716,7 +2732,6 @@ <translation id="4977942889532008999">Patvirtinti prieigą</translation> <translation id="4982718461356080574">Neaktyvių krūvoje esančių skirtukų uždarymo mygtukų slėpimas</translation> <translation id="498294082491145744">Pakeisti nustatymus, pagal kuriuos tvarkoma svetainių prieiga prie funkcijų, pvz., slapukų, „JavaScript“, papildinių, geografinės vietovės, mikrofono, fotoaparato ir kt.</translation> -<translation id="4984329823325527157">Medijos šaltinio API</translation> <translation id="4988526792673242964">Psl.</translation> <translation id="4988792151665380515">Nepavyko eksportuoti viešojo rakto.</translation> <translation id="49896407730300355">Sukti prieš l&aikrodžio rodyklę</translation> @@ -2905,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (nevykdoma)</translation> <translation id="526926484727016706">Pagal numatytuosius nustatymus visų „iframe“ atributų leidimai bus išjungti. Kad galėtumėte įgalinti tam tikrą leidimą „iframe“ atributui, gali reikėti pateikti tuos leidimus kaip naujų „iframe“ atributų vertes.</translation> <translation id="5269977353971873915">Spausdinant įvyko klaida</translation> -<translation id="5270884342523754894">„<ph name="EXTENSION" />“ galės skaityti vaizdų, vaizdo įrašų ir garsų failus pažymėtuose aplankuose.</translation> <translation id="5271247532544265821">Įjungti supaprastintos / tradicinės kinų k. režimą</translation> <translation id="5271549068863921519">Išsaugoti slaptažodį</translation> <translation id="5273628206174272911">Eksperimentinis istorijos naršymas perslenkant horizontaliai.</translation> @@ -2942,6 +2956,7 @@ <translation id="5316716239522500219">Dubliuoti monitorius</translation> <translation id="5317780077021120954">Išsaugoti</translation> <translation id="5319782540886810524">Latviška klaviatūra</translation> +<translation id="532247166573571973">Serveris gali būti nepasiekiamas. Vėliau bandykite dar kartą.</translation> <translation id="5323213332664049067">Lotynų amerikiečių</translation> <translation id="532360961509278431">Nepavyksta atidaryti „$1“: $2</translation> <translation id="5324674707192845912">Ketinate išregistruoti šį „<ph name="DEVICE_TYPE" />“ iš sistemos „Google“. Tai atlikus nebus galima nuotoliniu būdu rasti ir užrakinti įrenginio bei ištrinti jo duomenų. Reikės iš naujo paleisti įrenginį. Ar norite tęsti?</translation> @@ -2994,11 +3009,11 @@ <translation id="5390284375844109566">Indeksuoti duomenys</translation> <translation id="5392544185395226057">Įgalinti „Native Client“ palaikymą.</translation> <translation id="5393125431335030955">Šis papildinys veikia tik darbalaukyje.</translation> -<translation id="5393559999218790205">Išjungti NS rengyklės animacijos laiko juostas</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> esantis papildinys „<ph name="PEPPER_PLUGIN_NAME" />“ nori pasiekti jūsų kompiuterį.</translation> <translation id="539755880180803351">Žiniatinklio formas užpildo automatinio pildymo spėjimais kaip rezervuotos vietos tekstu.</translation> <translation id="5397578532367286026">Šio naudotojo naudojimo duomenis ir istoriją valdytojas (<ph name="MANAGER_EMAIL" />) gali peržiūrėti adresu chrome.com.</translation> <translation id="5397794290049113714">Jūs</translation> +<translation id="5398572795982417028">Puslapio už diapazono ribų nuoroda (apribojimas :<ph name="MAXIMUM_PAGE" />)</translation> <translation id="5398824043967640339"><ph name="COUNT" /> iš kitų svetainių</translation> <translation id="5399158067281117682">PIN kodai neatitinka!</translation> <translation id="5400640815024374115">Patikimos platformos modulio (TPM) mikroschema neleidžiama arba jos nėra.</translation> @@ -3018,7 +3033,7 @@ <translation id="5423849171846380976">Suaktyvinta</translation> <translation id="5425470845862293575">Įgalinamas eksperimentinio „DirectWrite“ šrifto pateikimo sistemos naudojimas.</translation> <translation id="5425722269016440406">Kad išjungtumėte „Smart Lock“, turite būti prisijungę, nes šis nustatymas sinchronizuojamas su telefonu ir kitais įrenginiais. Pirmiausia prisijunkite prie tinklo.</translation> -<translation id="5426623592374109001">Naudoti seną nepageidaujamą animacijų posistemį NS sukurtoms animacijoms.</translation> +<translation id="5425863515030416387">Paprastas prisijungimas keliuose įrenginiuose</translation> <translation id="5427459444770871191">Sukti pagal &laikrodžio rodyklę</translation> <translation id="5428105026674456456">Ispanų</translation> <translation id="542872847390508405">Naršote kaip svečias</translation> @@ -3043,6 +3058,7 @@ <translation id="5451646087589576080">Žiūrėti rėmelio &informaciją</translation> <translation id="5453029940327926427">Uždaryti skirtukus</translation> <translation id="5453632173748266363">Kirilica</translation> +<translation id="5454166040603940656">naudojant <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Netinkama</translation> <translation id="5457459357461771897">Skaityti ir ištrinti nuotraukas, muziką ir kitą mediją iš kompiuterio</translation> <translation id="5457599981699367932">Naršyti kaip svečiui</translation> @@ -3213,7 +3229,6 @@ <translation id="5708171344853220004">Pagrindinis „Microsoft“ pavadinimas</translation> <translation id="5709885306771508267">Vaizdo suėmimo skalė</translation> <translation id="5710406368443808765">Oi, sistemai nepavyko išsaugoti įrenginio prieigos rakto ir ID.</translation> -<translation id="571161420693302741">„<ph name="HOST_NAME" />“ neatsako. Negalima perduoti.</translation> <translation id="5711983031544731014">Nepavyko atrakinti. Įveskite slaptažodį.</translation> <translation id="5712966208980506909">Įgalinus, URL chrome://md-policy įkelia trimačių objektų dizaino puslapį.</translation> <translation id="5715711091495208045">Papildinių tarpininkas: „<ph name="PLUGIN_NAME" />“</translation> @@ -3482,7 +3497,6 @@ <translation id="6111974609785983504">Leidžiama pagal numatytuosius nustatymus</translation> <translation id="6113134669445407638">„WebRTC“ išjungiamas delsos agnostinis AEC. Naudojama, jei pranešti sistemos vėlavimai yra labai patikimi arba jei kiti asmenys girdi aidą iš jūsų įrenginio.</translation> <translation id="6116921718742659598">Keisti kalbos ir įvesties nustatymus</translation> -<translation id="6117536376248197233">Išjungti rengyklės animacijos laiko juostas pateikimo priemonėse.</translation> <translation id="6120205520491252677">Prisegti šį puslapį prie pradžios ekrano...</translation> <translation id="6122081475643980456">Jūsų interneto ryšys yra kontroliuojamas</translation> <translation id="6122093587541546701">El. paštas (pasirenkama):</translation> @@ -3514,6 +3528,7 @@ <translation id="6163522313638838258">Išskleisti viską</translation> <translation id="6164005077879661055">Visi failai ir su prižiūrimu naudotoju susiję duomenys bus ištrinti visam laikui, kai bus pašalintas šis prižiūrimas naudotojas. Valdytojas vis tiek gali peržiūrėti šio prižiūrimo naudotojo aplankytas svetaines ir nustatymus adresu <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Sužinokite daugiau</translation> +<translation id="6167008112175207002">Žymės, istorija, slaptažodžiai ir kiti nustatymai bus sinchronizuojami su jūsų „Google“ paskyra, kad galėtumėte juos naudoti visuose įrenginiuose. Tai galite pakeisti apsilankę adresu <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Imituojamos aparatinės įrangos funkcijos „Ok Google“</translation> <translation id="6175314957787328458">„Microsoft“ domeno GUID</translation> <translation id="6178664161104547336">Pasirinkite sertifikatą</translation> @@ -3717,6 +3732,7 @@ <translation id="648927581764831596">Nėra</translation> <translation id="6490936204492416398">Įdiegti naują iš internetinės parduotuvės</translation> <translation id="6492313032770352219">Vieta diske:</translation> +<translation id="6498249116389603658">&Visos jūsų kalbos</translation> <translation id="6499143127267478107">Atnaujinama priegloba įgaliotojo serverio scenarijuje...</translation> <translation id="6503077044568424649">Dažniausiai lankomi</translation> <translation id="6503256918647795660">Šveicarijos prancūziška klaviatūra</translation> @@ -3758,7 +3774,6 @@ <translation id="6555432686520421228">Pašalinamos visos naudotojų paskyros ir „<ph name="IDS_SHORT_PRODUCT_NAME" />“ įrenginys nustatomas iš naujo, kad būtų kaip naujas.</translation> <translation id="6556866813142980365">Grąžinti</translation> <translation id="6557565812667414268">Įgalinta tik ekranuose, kurie turi daug taškų colyje</translation> -<translation id="655845594391856372">Skirtukas neatsako. Negalima perduoti.</translation> <translation id="6559580823502247193">(jau yra šiame įrenginyje)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Išarchyvuojamas atkūrimo vaizdas...</translation> @@ -3859,6 +3874,7 @@ <translation id="6723354935081862304">Spausdinkite „Google“ dokumentuose ir kitose debesų paskirties vietose. <ph name="BEGIN_LINK" />Prisijunkite<ph name="END_LINK" />, jei norite spausdinti naudodami „Google“ spausdinimą iš debesies.</translation> <translation id="6723661294526996303">Importuoti žymes ir nustatymus...</translation> <translation id="6723839937902243910">Maitinimas</translation> +<translation id="6725240607822645708">IME vykdyti atskiroje grupėje.</translation> <translation id="6725970970008349185">Kandidatų skaičius, rodomas puslapyje</translation> <translation id="672609503628871915">Sužinokite, kas naujo</translation> <translation id="6727005317916125192">Ankstesnis polangis</translation> @@ -3990,12 +4006,11 @@ <translation id="6948736568813450284">Kūrėjams: naudokite „sandbox“ (smėlio dėžės) paslaugą „Google Payments“ API iškvietoms.</translation> <translation id="6949306908218145636">Pažymėti atidarytus puslapius...</translation> <translation id="695164542422037736">Jei ši parinktis įgalinta ir naudojamas turinio stilius yra „background-attachment:fixed“, fone yra atskiras kūrimo sluoksnis.</translation> -<translation id="6952626679169241027">„<ph name="PASSWORD_MANAGER_BRAND" />“ įsimena jūsų slaptažodžius ir automatiškai prijungia jus prie svetainių naudojant šį įrenginį.</translation> <translation id="6955446738988643816">Tikrinti iššokantįjį langą</translation> <translation id="695755122858488207">Nepasirinktas radijo mygtukas</translation> +<translation id="6960277925159781810">Automatinis prisijungimas šiame įrenginyje</translation> <translation id="696036063053180184">3 rinkinys („No shift“)</translation> <translation id="696203921837389374">Įgalinti mobiliųjų duomenų sinchronizavimą</translation> -<translation id="6964308487066031935">Pridėti aplankus prie „<ph name="EXTENSION" />“?</translation> <translation id="6965382102122355670">Gerai</translation> <translation id="6965648386495488594">Prievadas</translation> <translation id="6965978654500191972">Įrenginys</translation> @@ -4096,7 +4111,6 @@ <translation id="7076293881109082629">Prisijungimas</translation> <translation id="7077829361966535409">Įkeliant prisijungimo puslapį naudojant dabartinius įgaliotojo serverio nustatymus įvyko klaida. <ph name="GAIA_RELOAD_LINK_START" />Bandykite prisijungti dar kartą<ph name="GAIA_RELOAD_LINK_END" /> arba nustatykite kitus <ph name="PROXY_SETTINGS_LINK_START" />įgaliotojo serverio nustatymus<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignoruojamos protokolo doroklės</translation> -<translation id="7079038783243627996">„<ph name="EXTENSION" />“ galės skaityti ir ištrinti vaizdų, vaizdo įrašų ir garsų failus pažymėtuose aplankuose.</translation> <translation id="708060913198414444">K&opijuoti garso įrašo adresą</translation> <translation id="708187310695946552">Sesijos atkūrimo debesėlio NS</translation> <translation id="7082055294850503883">Nepaisyti didžiųjų raidžių klavišo būsenos ir įvesti mažosiomis raidėmis pagal numatytuosius nustatymus</translation> @@ -4240,6 +4254,8 @@ <translation id="7313804056609272439">Įvesties vietnamiečių k. metodas (VNI)</translation> <translation id="7314244761674113881">SOCKS priegloba</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (esamas)</translation> +<translation id="7321545336522791733">Serveris nepasiekiamas</translation> +<translation id="7324841169865301118">Naudotojui leidžiama pasirinkti darbalaukio bendrinimo skirtuką.</translation> <translation id="7325437708553334317">Didelio kontrasto plėtinys</translation> <translation id="7326565110843845436">Jutiklinės dalies spustelėjimas trimis pirštais</translation> <translation id="73289266812733869">Nepasirinkta</translation> @@ -4466,7 +4482,6 @@ <translation id="7650511557061837441">„<ph name="TRIGGERING_EXTENSION_NAME" />“ norėtų pašalinti „<ph name="EXTENSION_NAME" />“.</translation> <translation id="7650701856438921772">„<ph name="PRODUCT_NAME" />“ pateikiama šia kalba</translation> <translation id="7654941827281939388">Ši paskyra jau naudojama šiame kompiuteryje.</translation> -<translation id="7655165758820095116">Taikant „MediaSource“ objektą leidžiama „JavaScript“ siųsti medijos duomenis tiesiogiai vaizdo įrašo elementui.</translation> <translation id="7658239707568436148">Atšaukti</translation> <translation id="7659584679870740384">Neturite leidimo naudoti šį įrenginį. Susisiekite su administratoriumi, kad gautumėte leidimą prisijungti.</translation> <translation id="7664620655576155379">Nepalaikomas „Bluetooth“ įrenginys: „<ph name="DEVICE_NAME" />“.</translation> @@ -4597,6 +4612,7 @@ <translation id="7861215335140947162">&Atsisiuntimai</translation> <translation id="7864539943188674973">Neleisti „Bluetooth“</translation> <translation id="7868891395842935202">Įgalinama eksperimentinė struktūra, skirta prieigai prie API eksperimentų valdyti.</translation> +<translation id="7870576007982733437">Naudoti sistemos atsisiuntimų tvarkytuvę, kai tai įmanoma.</translation> <translation id="7870790288828963061">Nerasta jokių naujesnių versijų viešojo terminalo programų. Naujinių nėra. Atjunkite USB atmintuką.</translation> <translation id="787150342916295244">Kredito kortelės nuskaitymas</translation> <translation id="7874357055309047713">Visada vykdyti visose svetainėse</translation> @@ -4639,7 +4655,6 @@ <translation id="7918257978052780342">Registruotis</translation> <translation id="7920092496846849526">Paprašėte vieno iš tėvų leidimo apsilankyti šiame puslapyje.</translation> <translation id="7925285046818567682">Laukiama <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824">„<ph name="PASSWORD_MANAGER_BRAND" />“ įsimena jūsų slaptažodžius ir automatiškai prijungia jus prie programų bei svetainių įrenginiuose.</translation> <translation id="7925686952655276919">Sinchronizuojant nenaudoti duomenų mobiliesiems</translation> <translation id="7926906273904422255">Pažymėkite nesaugius šaltinius kaip nesaugius ar „įtartinus“.</translation> <translation id="7928710562641958568">Išstumti įrenginį</translation> @@ -4701,7 +4716,6 @@ Rakto failą laikykite saugioje vietoje. Jo reikės, kai norėsite sukurti naujas plėtinio versijas.</translation> <translation id="799923393800005025">Galima peržiūrėti</translation> <translation id="7999338963698132743">Nauja užduočių tvarkytuvė</translation> -<translation id="8000004253404706714">Naudoti seną nepageidaujamą animacijų posistemį pateikimo priemonėse sukurtoms animacijoms.</translation> <translation id="8004582292198964060">Naršyklė</translation> <translation id="8007030362289124303">Baterija baigia išsikrauti</translation> <translation id="8008356846765065031">Internetas atjungtas. Patikrinkite interneto ryšį.</translation> @@ -4831,6 +4845,7 @@ <translation id="8185331656081929126">Rodyti pranešimus, kai nauji spausdintuvai aptinkami tinkle</translation> <translation id="8186609076106987817">Serveriui nepavyko rasti failo.</translation> <translation id="8186706823560132848">Programinė įranga</translation> +<translation id="8188120771410500975">&Tikrinti teksto laukų rašybą</translation> <translation id="8190192229604245067">„<ph name="UWS_NAME" />“, „<ph name="UWS_NAME" />“ ir dar <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Jungiamasi prie „<ph name="PROVIDER_NAME" />“</translation> <translation id="8191230140820435481">Valdyti programas, plėtinius ir temas</translation> @@ -5224,6 +5239,7 @@ <translation id="8765985713192161328">Valdyti apdorojimo programas...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Naudotojai</translation> +<translation id="8768367823103160496">Pelės žymeklio užraktas</translation> <translation id="8769662576926275897">Išsami kortelės informacija</translation> <translation id="8770196827482281187">Įvesties persų k. metodas (ISIRI 2901 išdėstymas)</translation> <translation id="8774934320277480003">Viršutinė paraštė</translation> @@ -5243,6 +5259,7 @@ <translation id="8795668016723474529">Pridėti kredito kortelę</translation> <translation id="8795916974678578410">Naujas langas</translation> <translation id="8798099450830957504">Numatytasis</translation> +<translation id="8799127529310003270">Jei ši parinktis įgalinta, „InputConnection“ iškvietimai bus vykdomi IME grupėje. Kopijų redagavimo priemonė nebus išlaikoma. Vietoje to, kiekvienas „InputConnection“ iškvietimas tiesiogiai sąveikaus su pateikėju.</translation> <translation id="8799839487311913894">Įgalinti slaptažodžio atnaujinimą slaptažodžių tvarkytuvėje pateikus „slaptažodžio keitimo“ formą.</translation> <translation id="8800004011501252845">Rodomos paskirties vietos</translation> <translation id="8800420788467349919">Garsis: <ph name="PRECENTAGE" /> %</translation> @@ -5268,6 +5285,7 @@ <translation id="8841142799574815336">Įterpti vaizdinę peržiūros sritį.</translation> <translation id="884264119367021077">Siuntimo adresas</translation> <translation id="8844238624737526720">Naudoti naują ir optimizuotą „Chrome“ užduočių tvarkytuvės diegimo versiją.</translation> +<translation id="8845001906332463065">Gauti pagalbos</translation> <translation id="8846141544112579928">Ieškoma klaviatūros...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Režimo perjungimas „Shift“ klavišu</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 234a9cb..47a5aaf 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Saglabāt šo lapu kā grāmatzīmi...</translation> <translation id="1047956942837015229">Notiek <ph name="COUNT" /> vienumu dzēšana...</translation> <translation id="1048597748939794622">Piespiedu kārtā iespējots visiem slāņiem</translation> +<translation id="1049795001945932310">&Valodas iestatījumi</translation> <translation id="1049926623896334335">Word dokuments</translation> <translation id="1054153489933238809">Atvērt sākotnējo &attēlu jaunā cilnē</translation> <translation id="1055806300943943258">Notiek Bluetooth un USB ierīču meklēšana...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliterācija (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automātiski nosaukumu serveri</translation> <translation id="1215411991991485844">Pievienota jauna fona lietotne</translation> +<translation id="1216954813581739968">Cilnes iespējošana darbvirsmas kopīgošanai.</translation> <translation id="121827551500866099">Rādīt visas lejupielādes...</translation> <translation id="122082903575839559">Sertifikāta paraksta algoritms</translation> <translation id="1221024147024329929">PKCS #1 MD2 ar RSA šifrējumu</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Automātiskā pierakstīšanās neizdevās.</translation> <translation id="1293556467332435079">Faili</translation> <translation id="1294298200424241932">Rediģēt uzticēšanās iestatījumus:</translation> +<translation id="1295794900245526845">Lai pierakstītos, izvēlieties kontu, kas saglabāts pakalpojumā <ph name="PASSWORD_MANAGER_BRAND" /></translation> <translation id="1297175357211070620">Printeris</translation> <translation id="1297922636971898492">Google disks pašlaik nav pieejams. Augšupielāde tiks automātiski atsākta, tiklīdz Google disks atkal būs pieejams.</translation> <translation id="1300861494336759522">Windows datoros veiktu meklēšanas vaicājumu novirzīšana</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Tādējādi tiks atiestatīta jūsu sākumlapa, jaunas cilnes lapa, meklētājprogramma un piespraustās cilnes. Turklāt tiks atspējoti visi paplašinājumi, kā arī tiks notīrīti pagaidu dati, piemēram, sīkfaili. Netiks notīrītas jūsu grāmatzīmes, vēsture un saglabātās paroles.</translation> <translation id="1434886155212424586">Sākumlapa ir jaunas cilnes lapa</translation> <translation id="1435550882135542937">Paplašinājuma rīkjoslas atkārtota dizaina izveide</translation> +<translation id="1436402875660227532">Piezīme. Šie iestatījumi vairs netiek izmantoti šajā sistēmā, taču jūs joprojām varat tos skatīt un rediģēt.</translation> <translation id="1436784010935106834">Noņemts</translation> <translation id="1438632560381091872">Ieslēgt ciļņu skaņu</translation> <translation id="1441841714100794440">Vjetnamiešu valodas tastatūra (telekss)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Iespējo virtuālās tastatūras atbalstu.</translation> <translation id="1474079335130556426">Tiek iespējots Push API fona režīms. Tādējādi Chrome varēs turpināt darboties pēc pēdējā loga aizvēršanas un tiks palaists pēc operētājsistēmas startēšanas, ja Push API tas būs nepieciešams.</translation> <translation id="1474339897586437869">Fails “<ph name="FILENAME" />” netika augšupielādēts. Jūsu Google diskā nepietiek vietas.</translation> +<translation id="1476607407192946488">&Valodas iestatījumi</translation> <translation id="1476949146811612304">Iestatīt, kura meklētājprogramma tiek izmantota, kad tiek meklēts no <ph name="BEGIN_LINK" />universālā lodziņa<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Identifikācijas datu API pilnvaru kešatmiņa</translation> <translation id="1478340334823509079">Detalizēta informācija: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Šajā lapā tiek izmantota Native Client lietotne, kas nedarbojas jūsu datorā.</translation> <translation id="1965328510789761112">Privāta atmiņa</translation> <translation id="1965624977906726414">Nav īpašu atļauju.</translation> +<translation id="1968720524450620475">Darbību ikonu iespējošana tīmekļa paziņojumiem.</translation> <translation id="1970746430676306437">Skatīt lapas informāciju</translation> <translation id="197288927597451399">Paturēt</translation> <translation id="1973491249112991739">Spraudņa <ph name="PLUGIN_NAME" /> lejupielāde neizdevās.</translation> @@ -909,6 +915,7 @@ <translation id="2344262275956902282">Lietot "-" un "=", lai pārskatītu kandidātu sarakstu</translation> <translation id="2347476388323331511">Nevarēja sinhronizēt</translation> <translation id="2347991999864119449">Ļaut izvēlēties, kad palaist spraudņu saturu</translation> +<translation id="2348165084656290171">Lai kopīgotu audio, atlasiet cilni vai visu ekrānu.</translation> <translation id="2350182423316644347">Notiek lietojumprogrammas inicializēšana...</translation> <translation id="2350796302381711542">Vai ļaut <ph name="HANDLER_HOSTNAME" /> atvērt visas <ph name="PROTOCOL" /> saites <ph name="REPLACED_HANDLER_TITLE" /> vietā?</translation> <translation id="2351266942280602854">Valoda un ievade</translation> @@ -996,6 +1003,7 @@ <translation id="247772113373397749">Kanādas vairākvalodu tastatūra</translation> <translation id="2478176599153288112">Multivides faila atļaujas paplašinājumam “<ph name="EXTENSION" />”</translation> <translation id="2478830106132467213">Atbloķēt šo ierīci <ph name="DEVICE_TYPE" /> tikai tad, kad tālrunis atrodas izstieptas rokas attālumā.</translation> +<translation id="247949520305900375">Kopīgot audio</translation> <translation id="2479780645312551899">Šoreiz palaist visus spraudņus</translation> <translation id="2480626392695177423">Pārslēgt pilna platuma/pusplatuma interpunkcijas režīmu</translation> <translation id="2481332092278989943">Pievienošana plauktam</translation> @@ -1310,6 +1318,7 @@ <translation id="2889064240420137087">Atvērt saiti ar...</translation> <translation id="2889925978073739256">Turpināt bloķēt spraudņus, kas nav ievietoti smilškastē</translation> <translation id="2890624088306605051">Izgūt tikai sinhronizētos iestatījumus un datus</translation> +<translation id="2890678560483811744">Lapas atsauce ārpus diapazona</translation> <translation id="2893168226686371498">Noklusējuma pārlūks</translation> <translation id="289426338439836048">Cits mobilais tīkls...</translation> <translation id="2894745200702272315">Iespējo īsinājumvārda “Ok Google” noteikšanas funkciju eksperimentālu versiju, kas ir atkarīga no aparatūras.</translation> @@ -1338,7 +1347,6 @@ <translation id="2925966894897775835">Izklājlapas</translation> <translation id="2927017729816812676">Kešatmiņas krātuve</translation> <translation id="2927657246008729253">Mainīt...</translation> -<translation id="2928415919076124714">Slēpt rīkjoslu pilnekrāna režīmā</translation> <translation id="2928526264833629376">Turpināt darbu pakalpojumā Hangout</translation> <translation id="2930644991850369934">Atkopšanas attēla lejupielādes laikā radās problēma. Zaudēts tīkla savienojums.</translation> <translation id="293111069139560936">Plauktam tiek atļauts minimizēt logu, ja tiek noklikšķināts uz plaukta vienuma, ar kuru ir saistīts tikai viens, jau aktīvs logs.</translation> @@ -1462,6 +1470,7 @@ <translation id="3117812041123364382">Iespējot/atspējot peldošo virtuālo tastatūru.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> palīdzība</translation> <translation id="3120430004221004537">Nepietiekams attiecīgās darbības šifrējums šajā ierīcē: “<ph name="DEVICE_NAME" />”.</translation> +<translation id="3121260210578524273">Ikonu iespējošana darbību pogās tīmekļa paziņojumiem.</translation> <translation id="3121793941267913344">Atiestatiet šo <ph name="IDS_SHORT_PRODUCT_NAME" /> ierīci.</translation> <translation id="3122162841865761901">Izstrādātāju rīku eksperimenti</translation> <translation id="3122464029669770682">Maksa par daļas vienību</translation> @@ -1583,7 +1592,6 @@ <translation id="3289566588497100676">Viegla simbolu ievade</translation> <translation id="3289856944988573801">Lai pārbaudītu, vai ir pieejami atjauninājumi, lūdzu, izmantojiet tīklu Ethernet vai Wi-Fi.</translation> <translation id="3293325348208285494">Ātrs sākums</translation> -<translation id="3293894718455402932">Paplašinājums “<ph name="EXTENSION" />” varēs lasīt un rakstīt attēlus, videoklipus un skaņas failus atzīmētajās mapēs.</translation> <translation id="3294437725009624529">Viesis</translation> <translation id="329650768420594634">Paplašinājuma pakošanas brīdinājums</translation> <translation id="3296763833017966289">Gruzīnu valoda</translation> @@ -1641,6 +1649,7 @@ <translation id="3338239663705455570">Slovēņu valodas tastatūra</translation> <translation id="3340978935015468852">Iestatījumi</translation> <translation id="3341703758641437857">Atļaut piekļuvi faila vietrāžiem URL</translation> +<translation id="3343813173145836998">Ērta pierakstīšanās šajā ierīcē</translation> <translation id="3344786168130157628">Piekļuves punkta nosaukums:</translation> <translation id="3345135638360864351">Lietotājam <ph name="NAME" /> nevarēja nosūtīt jūsu pieprasījumu piekļūt šai vietnei. Lūdzu, mēģiniet vēlreiz.</translation> <translation id="3345886924813989455">Netika atrastas atbalstītas pārlūkprogrammas</translation> @@ -2120,6 +2129,7 @@ <translation id="3996912167543967198">Atiestatīšana...</translation> <translation id="3997015411467176489">Eksperimentālās canvas elementu funkcijas</translation> <translation id="40027638859996362">Pārvietot vārdu</translation> +<translation id="400554499662786523">Lai kopīgotu audio, atlasiet cilni.</translation> <translation id="4012550234655138030">Iestatiet vai pārvaldiet printerus pakalpojumā <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Vai labot “<ph name="EXTENSION_NAME" />”?</translation> <translation id="4018133169783460046">Rādīt <ph name="PRODUCT_NAME" /> šajā valodā</translation> @@ -2222,6 +2232,7 @@ <translation id="4180788401304023883">Vai dzēst SI sertifikātu “<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="418179967336296930">Krievu fonētiskā (YaZHert) tastatūra</translation> <translation id="4181841719683918333">Valodas</translation> +<translation id="4187248015940562149">Iespējo Web Bluetooth, kas ļauj vietnēm izveidot savienojumu ar jūsu tuvumā esošajām Bluetooth ierīcēm un pārvaldīt tās.</translation> <translation id="4188026131102273494">Atslēgvārds:</translation> <translation id="4189406272289638749">Šo iestatījumu kontrolē paplašinājums <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Google dokuments</translation> @@ -2278,6 +2289,7 @@ <translation id="4268025649754414643">Atslēgas šifrēšana</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102"><ph name="NUMBER" /> versija</translation> +<translation id="4271396100647220620">Nav atbilstību</translation> <translation id="4274187853770964845">Sinhronizācijas kļūda: pārtrauciet un restartējiet sinhronizāciju.</translation> <translation id="4275830172053184480">Ierīces restartēšana</translation> <translation id="4276796043975446927">Laipni lūdzam sistēmā “Chromebox sapulcēm”!</translation> @@ -2347,6 +2359,7 @@ <translation id="4378551569595875038">Notiek pievienošana...</translation> <translation id="438122767399415311">Piespiedu kārtā mainīt lietotāja saskarnes virzienu</translation> <translation id="4381849418013903196">Kols</translation> +<translation id="4383192539467954373">Automātiska pierakstīšanās vairākās ierīcēs</translation> <translation id="4384652540891215547">Aktivizēt paplašinājumu</translation> <translation id="438503109373656455">Bucefals</translation> <translation id="4387554346626014084">Iespējot lietotņu palaidēja sinhronizāciju. Ja iespējams, tiek iespējotas arī mapes (izņemot OSX).</translation> @@ -2364,6 +2377,7 @@ <translation id="4421932782753506458">Minka</translation> <translation id="4422347585044846479">Rediģēt šīs lapas grāmatzīmes</translation> <translation id="4422428420715047158">Domēns:</translation> +<translation id="4423482519432579560">&Pareizrakstības pārbaudītājs</translation> <translation id="442477792133831654">Sazināties ar tuvumā esošām ierīcēm</translation> <translation id="4425149324548788773">Mans disks</translation> <translation id="4428582326923056538">Adobe Flash Player kameras izņēmumi atšķiras.</translation> @@ -2378,6 +2392,7 @@ <translation id="444267095790823769">Aizsargātā satura izņēmumi</translation> <translation id="4443536555189480885">&Palīdzība</translation> <translation id="4444304522807523469">Piekļūt dokumentu skeneriem, kas pievienoti, izmantojot USB vai lokālajā tīklā</translation> +<translation id="4445559854264555037">Vai jūsu ierīce netiek rādīta? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Spoguļots</translation> <translation id="4447465454292850432">Akumulators:</translation> <translation id="4449935293120761385">Par automātisko aizpildi</translation> @@ -2636,6 +2651,7 @@ <translation id="485316830061041779">Vācu valoda</translation> <translation id="4856478137399998590">Jūsu mobilo datu pakalpojums ir aktivizēts un gatavs lietošanai</translation> <translation id="4858913220355269194">Futbolbumba</translation> +<translation id="4860565041166337978">Sistēmas lejupielāžu pārvaldniekam tiek atļauta lejupielāžu apstrāde, kad tas ir iespējams.</translation> <translation id="48607902311828362">Lidmašīnas režīms</translation> <translation id="4861833787540810454">&Atskaņot</translation> <translation id="4862050643946421924">Ierīces pievienošana...</translation> @@ -2719,7 +2735,6 @@ <translation id="4977942889532008999">Piekļuves apstiprināšana</translation> <translation id="4982718461356080574">Neaktīvo ciļņu aizvēršanas pogu paslēpšana, ja tās ir sagrupētas kaskādē</translation> <translation id="498294082491145744">mainīt iestatījumus, ar kuriem tiek pārvaldīta vietņu piekļuve funkcijām, piemēram, sīkfailiem, JavaScript, spraudņiem, ģeogrāfiskajai atrašanās vietai, mikrofonam, kamerai u.c.</translation> -<translation id="4984329823325527157">Multivides avota API</translation> <translation id="4988526792673242964">Lapas</translation> <translation id="4988792151665380515">Neizdevās eksportēt publisko atslēgu.</translation> <translation id="49896407730300355">Pagriezt &pretēji pulksteņrādītāju kustības virzienam</translation> @@ -2908,7 +2923,6 @@ <translation id="5268606875983318825">PPAPI (ārpus procesa)</translation> <translation id="526926484727016706">Visiem iFrame tagiem pēc noklusējuma tiek noraidītas visas atļaujas. Sniedzot konkrētas atļaujas iFrame tagam, iespējams, šo atļauju nosaukumi būs jānorāda kā jaunu iFrame atribūtu vērtības.</translation> <translation id="5269977353971873915">Drukāšana neizdevās</translation> -<translation id="5270884342523754894">Paplašinājums “<ph name="EXTENSION" />” varēs lasīt attēlus, videoklipus un skaņas failus atzīmētajās mapēs.</translation> <translation id="5271247532544265821">Pārslēgt ķīniešu vienkāršotās/tradicionālās valodas režīmu</translation> <translation id="5271549068863921519">Saglabāt paroli</translation> <translation id="5273628206174272911">Eksperimentāla navigācija vēsturē, horizontāli ritinot pāri malai.</translation> @@ -2945,6 +2959,7 @@ <translation id="5316716239522500219">Spoguļot monitorus</translation> <translation id="5317780077021120954">Saglabāt</translation> <translation id="5319782540886810524">Latviešu valodas tastatūra</translation> +<translation id="532247166573571973">Iespējams, serveris nav sasniedzams. Vēlāk mēģiniet vēlreiz.</translation> <translation id="5323213332664049067">Latīņamerikas</translation> <translation id="532360961509278431">Nevar atvērt $1: $2</translation> <translation id="5324674707192845912">Jūs gatavojaties atcelt šīs <ph name="DEVICE_TYPE" /> ierīces reģistrāciju Google tīklā, lai nevarētu attālināti atrast un bloķēt ierīci, kā arī nevarētu attālināti dzēst tās datus. Lai to izdarītu, ierīce būs jārestartē. Vai vēlaties turpināt?</translation> @@ -2997,11 +3012,11 @@ <translation id="5390284375844109566">Rādītājā iekļautā datu bāze</translation> <translation id="5392544185395226057">Iespējo atbalstu modulim Native Client.</translation> <translation id="5393125431335030955">Šis spraudnis darbojas tikai darbvirsmas režīmā.</translation> -<translation id="5393559999218790205">Atspējot lietotāja saskarnes burtliča animāciju laika skalas</translation> <translation id="5396126354477659676">Spraudnim <ph name="PEPPER_PLUGIN_NAME" /> domēnā <ph name="PEPPER_PLUGIN_DOMAIN" /> ir nepieciešama piekļuve jūsu datoram.</translation> <translation id="539755880180803351">Anotē tīmekļa veidlapas ar Automātiskās aizpildes lauka tipa paredzējumiem kā viettura tekstu.</translation> <translation id="5397578532367286026">Šī lietotāja datu lietojumu un vēsturi var pārvaldīt pārzinis (<ph name="MANAGER_EMAIL" />) vietnē chrome.com.</translation> <translation id="5397794290049113714">Jūs</translation> +<translation id="5398572795982417028">Lapas atsauce ārpus diapazona, ierobežojums: <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> no citām vietnēm</translation> <translation id="5399158067281117682">PIN nav pareizs.</translation> <translation id="5400640815024374115">Uzticama platformas moduļa (TPM) mikroshēma ir atspējota, vai arī tās vispār nav.</translation> @@ -3021,7 +3036,7 @@ <translation id="5423849171846380976">Aktivizēts</translation> <translation id="5425470845862293575">Iespējo eksperimentālā DirectWrite fonta renderēšanas sistēmu.</translation> <translation id="5425722269016440406">Lai izslēgtu Smart Lock, jums ir jābūt tiešsaistē, jo šis iestatījums ir sinhronizēts ar jūsu tālruni un citām ierīcēm. Lūdzu, vispirms izveidojiet savienojumu ar tīklu.</translation> -<translation id="5426623592374109001">Saliktām animācijām lietotāja saskarnē tiek izmantota veca traucējošu animāciju apakšsistēma.</translation> +<translation id="5425863515030416387">Ērta pierakstīšanās vairākās ierīcēs</translation> <translation id="5427459444770871191">Pagriezt &pulksteņrādītāju kustības virzienā</translation> <translation id="5428105026674456456">Spāņu valoda</translation> <translation id="542872847390508405">Jūs veicat pārlūkošanu viesa režīmā</translation> @@ -3046,6 +3061,7 @@ <translation id="5451646087589576080">Skatīt rāmja &informāciju</translation> <translation id="5453029940327926427">Aizvērt cilnes</translation> <translation id="5453632173748266363">Kiriliska</translation> +<translation id="5454166040603940656">izmantojot <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Nav derīgi</translation> <translation id="5457459357461771897">Lasīt un dzēst fotoattēlus, mūziku un citu datorā esošu multivides saturu</translation> <translation id="5457599981699367932">Pārlūkot kā viesim</translation> @@ -3215,7 +3231,6 @@ <translation id="5708171344853220004">Microsoft pamatnosaukums</translation> <translation id="5709885306771508267">Mērogošana savelkot</translation> <translation id="5710406368443808765">Diemžēl sistēmai neizdevās saglabāt ierīces pilnvaru un ID.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> nereaģē. Nevar veikt apraidi.</translation> <translation id="5711983031544731014">Neizdevās atbloķēt. Ievadiet paroli.</translation> <translation id="5712966208980506909">Ja šī opcija ir iespējota, URL chrome://md-policy ielādē materiāla dizaina politikas lapu.</translation> <translation id="5715711091495208045">Spraudņa starpnieks: <ph name="PLUGIN_NAME" /></translation> @@ -3484,7 +3499,6 @@ <translation id="6111974609785983504">Atļauts pēc noklusējuma</translation> <translation id="6113134669445407638">Atspējot funkciju Delay Agnostic AEC definīcijā WebRTC. Izmantot, ja reģistrētās sistēmas aizkaves ir ļoti uzticamas vai jūsu ierīce izraisa atbalsi citās ierīcēs.</translation> <translation id="6116921718742659598">Mainīt valodas un ievades iestatījumus</translation> -<translation id="6117536376248197233">Atspējot burtliča animāciju laika skalas renderētājos.</translation> <translation id="6120205520491252677">Piespraust šo lapu sākuma ekrānam...</translation> <translation id="6122081475643980456">Jūsu interneta savienojums tiek pārvaldīts</translation> <translation id="6122093587541546701">E-pasta adrese (neobligāti):</translation> @@ -3516,6 +3530,7 @@ <translation id="6163522313638838258">Izvērst visu...</translation> <translation id="6164005077879661055">Visi faili un lokālie dati, kas ir saistīti ar uzraudzīto lietotāju, tiks neatgriezeniski dzēsti, tiklīdz uzraudzītais lietotājs tiks noņemts. Iespējams, pārzinis joprojām varēs skatīt šī uzraudzītā lietotāja apmeklētās vietnes un iestatījumus (vietnē <ph name="MANAGEMENT_URL" />).</translation> <translation id="6165508094623778733">Uzziniet vairāk</translation> +<translation id="6167008112175207002">Jūsu grāmatzīmes, vēsture, paroles un citi iestatījumi tiks sinhronizēti ar jūsu Google kontu, lai jūs varētu tos izmantot visās savās ierīcēs. Varat to mainīt šeit: <ph name="BEGIN_LINK" />.</translation> <translation id="6171550060231646388">Simulētās aparatūras “Ok Google” funkcijas</translation> <translation id="6175314957787328458">Microsoft domēna GUID</translation> <translation id="6178664161104547336">Sertifikāta atlasīšana</translation> @@ -3719,6 +3734,7 @@ <translation id="648927581764831596">Nav pieejama neviena ierīce</translation> <translation id="6490936204492416398">Instalēt jaunus paplašinājumus no interneta veikala</translation> <translation id="6492313032770352219">Lielums diskā:</translation> +<translation id="6498249116389603658">&Visas valodas</translation> <translation id="6499143127267478107">No starpniekservera skripta tiek noteikts saimniekdators...</translation> <translation id="6503077044568424649">Visapmeklētākais</translation> <translation id="6503256918647795660">Šveices franču valodas tastatūra</translation> @@ -3760,7 +3776,6 @@ <translation id="6555432686520421228">Noņemiet visus lietotāju kontus un atiestatiet savu <ph name="IDS_SHORT_PRODUCT_NAME" /> ierīci, lai izmantotu sākotnējos rūpnīcas iestatījumus.</translation> <translation id="6556866813142980365">Atcelt atsaukšanu</translation> <translation id="6557565812667414268">Iespējots tikai augsta DPI displejos</translation> -<translation id="655845594391856372">Cilne nereaģē. Nevar veikt apraidi.</translation> <translation id="6559580823502247193">(jau pastāv šajā ierīcē)</translation> <translation id="6561726789132298588">Ievadīt</translation> <translation id="6562437808764959486">Notiek atkopšanas attēla izvilkšana...</translation> @@ -3861,6 +3876,7 @@ <translation id="6723354935081862304">Drukāt pakalpojumā Google dokumenti un citos mākoņa galamērķos. <ph name="BEGIN_LINK" />Pierakstieties<ph name="END_LINK" />, lai drukātu, izmantojot Google mākoņdruku.</translation> <translation id="6723661294526996303">Importēt grāmatzīmes un iestatījumus...</translation> <translation id="6723839937902243910">Strāvas padeve</translation> +<translation id="6725240607822645708">IME izpilde savā pavedienā.</translation> <translation id="6725970970008349185">Vienā lapā attēlojamo kandidātu skaits</translation> <translation id="672609503628871915">Uzzināt jaunumus</translation> <translation id="6727005317916125192">Iepriekšējā rūts</translation> @@ -3992,12 +4008,11 @@ <translation id="6948736568813450284">Izstrādātājiem: Google Payments API izsaukumiem izmantojiet smilškastes pakalpojumu.</translation> <translation id="6949306908218145636">Saglabāt atvērtās lapas kā grāmatzīmes...</translation> <translation id="695164542422037736">Ja šī opcija ir iespējota un pamatteksta stils ir veidots, izmantojot rekvizītu background-attachment:fixed, fonam būs savs kompozicionētais slānis.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> atceras jūsu paroles un automātiski pieraksta jūs vietnēs šajā ierīcē.</translation> <translation id="6955446738988643816">Pārbaudīt uznirstošo elementu</translation> <translation id="695755122858488207">Neatlasītā poga</translation> +<translation id="6960277925159781810">Automātiska pierakstīšanās šajā ierīcē</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Iespējot mobilo datu sinhronizāciju</translation> -<translation id="6964308487066031935">Vai pievienot mapes paplašinājumam “<ph name="EXTENSION" />”?</translation> <translation id="6965382102122355670">Labi</translation> <translation id="6965648386495488594">Ports</translation> <translation id="6965978654500191972">Ierīce</translation> @@ -4097,7 +4112,6 @@ <translation id="7076293881109082629">Pierakstīšanās</translation> <translation id="7077829361966535409">Pierakstīšanās lapu neizdevās ielādēt, izmantojot pašreizējos starpniekservera iestatījumus. <ph name="GAIA_RELOAD_LINK_START" />Mēģiniet pierakstīties vēlreiz<ph name="GAIA_RELOAD_LINK_END" /> vai izmantojiet citus <ph name="PROXY_SETTINGS_LINK_START" />starpniekservera iestatījumus<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignorētie protokolu apdarinātāji</translation> -<translation id="7079038783243627996">Paplašinājums “<ph name="EXTENSION" />” varēs lasīt un dzēst attēlus, videoklipus un skaņas failus atzīmētajās mapēs.</translation> <translation id="708060913198414444">Kopēt audio adresi</translation> <translation id="708187310695946552">Sesijas atjaunošanas burbuļa lietotāja saskarne</translation> <translation id="7082055294850503883">Ignorēt taustiņa "CapsLock" statusu un ievadīt mazos burtus pēc noklusējuma</translation> @@ -4241,6 +4255,8 @@ <translation id="7313804056609272439">Vjetnamiešu valodas ievades metode (VNI)</translation> <translation id="7314244761674113881">SOCKS saimniekdators</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (pašreizējais)</translation> +<translation id="7321545336522791733">Serveris nav sasniedzams</translation> +<translation id="7324841169865301118">Ļauj lietotājam izvēlēties cilni darbvirsmas kopīgošanai.</translation> <translation id="7325437708553334317">Paplašinājums Augsts kontrasts</translation> <translation id="7326565110843845436">Skārienpaliktņa trīs pirkstu pārvilkšanas žests</translation> <translation id="73289266812733869">Neatlasīts</translation> @@ -4467,7 +4483,6 @@ <translation id="7650511557061837441">“<ph name="TRIGGERING_EXTENSION_NAME" />” vēlas noņemt paplašinājumu “<ph name="EXTENSION_NAME" />”.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> ir redzams šajā valodā</translation> <translation id="7654941827281939388">Šis konts jau tiek izmantots šajā datorā.</translation> -<translation id="7655165758820095116">Izmantojot MediaSource objektu, JavaScript var nosūtīt multivides datus tieši video elementam.</translation> <translation id="7658239707568436148">Atcelt</translation> <translation id="7659584679870740384">Jums nav atļaujas izmantot šo ierīci. Lūdzu, sazinieties ar administratoru, lai saņemtu pierakstīšanās atļauju.</translation> <translation id="7664620655576155379">Neatbalstīta Bluetooth ierīce: <ph name="DEVICE_NAME" />.</translation> @@ -4598,6 +4613,7 @@ <translation id="7861215335140947162">Lejupielādes</translation> <translation id="7864539943188674973">Atspējot Bluetooth</translation> <translation id="7868891395842935202">Iespējo eksperimentālo struktūru, lai pārvaldītu piekļuvi API eksperimentiem.</translation> +<translation id="7870576007982733437">Izmantot sistēmas lejupielāžu pārvaldnieku, kad tas ir iespējams.</translation> <translation id="7870790288828963061">Netika atrasta neviena Kioska lietotne ar jaunāku versiju. Nav jāatjaunina neviena lietotne. Lūdzu, izņemiet USB atmiņas karti.</translation> <translation id="787150342916295244">Kredītkartes skenēšana</translation> <translation id="7874357055309047713">Vienmēr palaist visās vietnēs</translation> @@ -4640,7 +4656,6 @@ <translation id="7918257978052780342">Reģistrēties</translation> <translation id="7920092496846849526">Jūs lūdzāt vienam no vecākiem atļauju apmeklēt šo lapu.</translation> <translation id="7925285046818567682">Gaida <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> atceras jūsu paroles un automātiski pieraksta jūs lietotnēs un vietnēs dažādās ierīcēs.</translation> <translation id="7925686952655276919">Nelietot mobilos datus sinhronizācijai</translation> <translation id="7926906273904422255">Atzīmēt nedrošus avotus kā nedrošus vai “apšaubāmus”.</translation> <translation id="7928710562641958568">Ierīces atvienošana</translation> @@ -4702,7 +4717,6 @@ Glabājiet atslēgas failu drošā vietā. Tas būs vajadzīgs, lai izveidotu jaunas paplašinājuma versijas.</translation> <translation id="799923393800005025">Var skatīt</translation> <translation id="7999338963698132743">Jauns uzdevumu pārvaldnieks</translation> -<translation id="8000004253404706714">Saliktajām animācijām renderētājos tiek izmantota veca traucējošu animāciju apakšsistēma.</translation> <translation id="8004582292198964060">Pārlūkprogramma</translation> <translation id="8007030362289124303">Baterija gandrīz tukša</translation> <translation id="8008356846765065031">Internets atvienots. Pārbaudiet interneta savienojumu.</translation> @@ -4832,6 +4846,7 @@ <translation id="8185331656081929126">Rādīt paziņojumus, kad tīklā tiek atrasti jauni printeri</translation> <translation id="8186609076106987817">Serveris nevarēja atrast failu.</translation> <translation id="8186706823560132848">Programmatūra</translation> +<translation id="8188120771410500975">&Pārbaudīt pareizrakstību teksta laukos</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> un vēl <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Savienojas ar <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Pārvaldīt jūsu lietotnes, paplašinājumus un motīvus</translation> @@ -5225,6 +5240,7 @@ <translation id="8765985713192161328">Pārvaldīt apdarinātājus...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Lietotāji</translation> +<translation id="8768367823103160496">Peles kursora bloķēšana</translation> <translation id="8769662576926275897">Kartes dati</translation> <translation id="8770196827482281187">Persiešu valodas ievades metode (ISIRI 2901 izkārtojums)</translation> <translation id="8774934320277480003">Augšējā piemale</translation> @@ -5244,6 +5260,7 @@ <translation id="8795668016723474529">Pievienot kredītkarti</translation> <translation id="8795916974678578410">Jauns logs</translation> <translation id="8798099450830957504">Noklusējums</translation> +<translation id="8799127529310003270">Ja šis karodziņš ir iespējots, InputConnection izsaukumi tiek izpildīti IME pavedienā, un visi InputConnection zvani tiek novirzīti tieši renderētājam (nevis tiek saglabāts dublikātu redaktors).</translation> <translation id="8799839487311913894">Iespējojiet paroles atjaunināšanu paroļu pārvaldniekā pēc veidlapas “Paroles maiņa” iesniegšanas.</translation> <translation id="8800004011501252845">Tiek rādīti printeri šim:</translation> <translation id="8800420788467349919">Skaļums: <ph name="PRECENTAGE" />%</translation> @@ -5269,6 +5286,7 @@ <translation id="8841142799574815336">Nemainīga vizuālā skatvieta</translation> <translation id="884264119367021077">Piegādes adrese</translation> <translation id="8844238624737526720">Tiek izmantota Chrome uzdevumu pārvaldnieka jauna un optimizēta ieviešana.</translation> +<translation id="8845001906332463065">Saņemt palīdzību</translation> <translation id="8846141544112579928">Notiek tastatūras meklēšana...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Taustiņa "Shift" režīma slēdzis</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index e188d1f..4a86057c 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">ഈ പേജ് ബുക്ക്മാര്ക്ക് ചെയ്യുക...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> ഇനങ്ങൾ ഇല്ലാതാക്കുന്നു...</translation> <translation id="1048597748939794622">എല്ലാ ലെയറുകൾക്കുമായി നിർബന്ധിതമായി പ്രവർത്തനക്ഷമമാക്കി</translation> +<translation id="1049795001945932310">&ഭാഷ ക്രമീകരണം</translation> <translation id="1049926623896334335">Word പ്രമാണം</translation> <translation id="1054153489933238809">യഥാർത്ഥ ചിത്രം പുതിയ ടാബിൽ തുറക്കുക</translation> <translation id="1055806300943943258">Bluetooth, USB ഉപകരണങ്ങൾക്കായി തിരയുന്നു...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">ലിപ്യന്തരണം (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">യാന്ത്രിക നാമ സെർവറുകൾ</translation> <translation id="1215411991991485844">പുതിയ പശ്ചാത്തല അപ്ലിക്കേഷൻ ചേർത്തു</translation> +<translation id="1216954813581739968">ഡെസ്ക്ടോപ്പ് പങ്കിടലിനായി ടാബ് പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="121827551500866099">എല്ലാ ഡൌണ്ലോഡുകളും കാണിക്കുക...</translation> <translation id="122082903575839559">സര്ട്ടിഫിക്കറ്റ് സിഗ്നേച്ചര് അല്ഗോരിതം</translation> <translation id="1221024147024329929">RSA എന്ക്രിപ്ഷനോടുകൂടിയ PKCS #1 MD2</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">യാന്ത്രിക സൈൻ ഇൻ പരാജയപ്പെട്ടു</translation> <translation id="1293556467332435079">ഫയലുകള്</translation> <translation id="1294298200424241932">വിശ്വസ്ത ക്രമീകരണങ്ങള് എഡിറ്റുചെയ്യുക:</translation> +<translation id="1295794900245526845">സൈൻ ഇൻ ചെയ്യാൻ, <ph name="PASSWORD_MANAGER_BRAND" /> ഉപയോഗിച്ച് സംരക്ഷിച്ച നിങ്ങളുടെ അക്കൗണ്ട് ഉപയോഗിക്കുക</translation> <translation id="1297175357211070620">ഉദ്ദിഷ്ടസ്ഥാനം</translation> <translation id="1297922636971898492">Google ഡ്രൈവ് ഇപ്പോൾ ലഭ്യമല്ല. Google ഡോക്സ് ലഭ്യമായിക്കഴിഞ്ഞാൽ, അപ്ലോഡുചെയ്യുന്നത് അത് യാന്ത്രികമായി പുനരാരംഭിക്കുന്നതിനിടയാക്കും.</translation> <translation id="1300861494336759522">Windows ഡെസ്ക്ടോപ്പ് തിരയൽ റീഡയറക്ഷൻ</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">ഇത് നിങ്ങളുടെ ആരംഭ പേജ്, പുതിയ ടാബ് പേജ്, തിരയൽ എഞ്ചിൻ, പിൻ ചെയ്ത ടാബുകൾ എന്നിവ റീസെറ്റുചെയ്യും. ഒപ്പം ഇത് എല്ലാ വിപുലീകരണങ്ങളെയും പ്രവർത്തനരഹിതമാക്കുകയും കുക്കികൾ പോലുള്ള താൽക്കാലിക ഡാറ്റ മായ്ക്കുകയും ചെയ്യും. നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ, ചരിത്രം, സംരക്ഷിച്ച പാസ്വേഡുകൾ എന്നിവ മായ്ക്കില്ല.</translation> <translation id="1434886155212424586">ഹോംപേജ് പുതിയ ടാബ് പേജാണ്</translation> <translation id="1435550882135542937">വിപുലീകരണ ടൂൾബാർ പുനർരൂപകൽപ്പന</translation> +<translation id="1436402875660227532">ശ്രദ്ധിക്കുക: ഈ ക്രമീകരണം ഇനി ഈ സിസ്റ്റത്തിൽ ഉപയോഗിക്കില്ലെങ്കിലും, തുടർന്നും നിങ്ങൾക്ക് അവ കാണാനും എഡിറ്റുചെയ്യാനുമാകും.</translation> <translation id="1436784010935106834">നീക്കംചെയ്തു</translation> <translation id="1438632560381091872">ടാബുകൾ അൺമ്യൂട്ട് ചെയ്യുക</translation> <translation id="1441841714100794440">വിയറ്റ്നാമീസ് കീബോർഡ് (ടെലക്സ്)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">വെർച്വൽ കീബോർഡ് പിന്തുണ പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="1474079335130556426">പുഷ് API-യ്ക്കായി പശ്ചാത്തല മോഡ് പ്രവർത്തനക്ഷമമാക്കുക. പുഷ് API-യ്ക്ക് ആവശ്യമെങ്കിൽ, അവസാന വിൻഡോ അടച്ചശേഷവും തുടർന്ന് പ്രവർത്തിക്കാനും ഒപ്പം OS സ്റ്റാർട്ടപ്പിൽ സമാരംഭിക്കുന്നതിനും ഇത് Chrome-നെ അനുവദിക്കുന്നു.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" അപ്ലോഡുചെയ്തില്ല. നിങ്ങളുടെ Google ഡ്രൈവിൽ മതിയായ ഇടമില്ല.</translation> +<translation id="1476607407192946488">&ഭാഷ ക്രമീകരണം</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />ഓമ്നിബോക്സിൽ<ph name="END_LINK" /> നിന്ന് തിരയുമ്പോൾ ഏത് തിരയൽ എഞ്ചിനാണ് ഉപയോഗിക്കുന്നതെന്ന് സജ്ജമാക്കുക.</translation> <translation id="1477301030751268706">ഐഡന്റിറ്റി API ടോക്കൺ കാഷെ</translation> @@ -647,6 +652,7 @@ <translation id="1962233722219655970">ഈ പേജ് നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ പ്രവർത്തിക്കാത്ത ഒരു നേറ്റീവ് ക്ലയന്റ് അപ്ലിക്കേഷൻ ഉപയോഗിക്കുന്നു.</translation> <translation id="1965328510789761112">സ്വകാര്യ മെമ്മറി</translation> <translation id="1965624977906726414">പ്രത്യേക അനുമതികളൊന്നുമില്ല.</translation> +<translation id="1968720524450620475">വെബ് അറിയിപ്പുകൾക്കായി പ്രവർത്തന ഐക്കണുകൾ പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="1970746430676306437">പേജ് &വിവരം കാണുക</translation> <translation id="197288927597451399">സൂക്ഷിക്കുക</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> ഡൗൺലോഡ് പരാജയപ്പെട്ടു.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">ഒരു കാന്ഡിഡേറ്റ് പട്ടിക പേജുചെയ്യുന്നതിന് - ഉം = ഉം ഉപയോഗിക്കുക</translation> <translation id="2347476388323331511">സമന്വയിപ്പിക്കാൻ കഴിഞ്ഞില്ല</translation> <translation id="2347991999864119449">പ്ലഗിൻ ഉള്ളടക്കം പ്രവർത്തിപ്പിക്കുമ്പോൾ തിരഞ്ഞെടുക്കാൻ എന്നെ അനുവദിക്കുക</translation> +<translation id="2348165084656290171">ഓഡിയോ പങ്കിടാൻ, ഒരു ടാബോ സ്ക്രീൻ പൂർണ്ണമായോ തിരഞ്ഞെടുക്കുക.</translation> <translation id="2350182423316644347">അപ്ലിക്കേഷൻ സമാരംഭിക്കുന്നു...</translation> <translation id="2350796302381711542"><ph name="REPLACED_HANDLER_TITLE" /> എന്നതിനുപകരം എല്ലാ <ph name="PROTOCOL" /> ലിങ്കുകളും തുറക്കാൻ <ph name="HANDLER_HOSTNAME" /> എന്നതിനെ അനുവദിക്കണോ?</translation> <translation id="2351266942280602854">ഭാഷയും ടൈപ്പുചെയ്യലും</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">കനേഡിയൻ ബഹുഭാഷാ കീബോർഡ്</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" എന്നതിനായുള്ള മീഡിയ-ഫയൽ അനുമതികൾ</translation> <translation id="2478830106132467213">നിങ്ങളുടെ ഫോൺ ഒരു കൈയ്യകലത്തിൽ ഉണ്ടെങ്കിൽ മാത്രം ഈ <ph name="DEVICE_TYPE" /> അൺലോക്കുചെയ്യുക.</translation> +<translation id="247949520305900375">ഓഡിയോ പങ്കിടുക</translation> <translation id="2479780645312551899">ഇപ്പോൾ സമയം എല്ലാ പ്ലഗിന്നുകളും പ്രവർത്തിപ്പിക്കുക</translation> <translation id="2480626392695177423">പൂര്ണ്ണ/അര്ദ്ധ വിഡ്ത്ത് വിരാമ മോഡില് ടോഗിള് ചെയ്യുക</translation> <translation id="2481332092278989943">ഷെൽഫിലേക്ക് ചേർക്കുക</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">ഇതുമായി ലിങ്ക് തുറക്കുക...</translation> <translation id="2889925978073739256">അൺസാൻഡ്ബോക്സ് ചെയ്ത പ്ലഗിന്നുകൾ തടയുന്നത് തുടരുക</translation> <translation id="2890624088306605051">സമന്വയിപ്പിച്ച ക്രമീകരണവും ഡാറ്റയും മാത്രം വീണ്ടെടുക്കുക</translation> +<translation id="2890678560483811744">പേജ് റഫറൻസ് പരിധി കവിഞ്ഞു</translation> <translation id="2893168226686371498">സ്ഥിരസ്ഥിതി ബ്രൌസര്</translation> <translation id="289426338439836048">മറ്റ് മൊബൈല് നെറ്റ്വര്ക്ക്...</translation> <translation id="2894745200702272315">ഹാർഡ്വയർ ആശ്രയത്വമുള്ള, 'Ok Google' ഹോട്ട്വേഡ് കണ്ടെത്തൽ ഫീച്ചറുകളുടെ ഒരു പരീക്ഷണാത്മക പതിപ്പ് പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">ഷീറ്റുകൾ</translation> <translation id="2927017729816812676">കാഷെ സ്റ്റോറേജ്</translation> <translation id="2927657246008729253">മാറ്റൂ...</translation> -<translation id="2928415919076124714">പൂർണ്ണ സ്ക്രീനിൽ ടൂൾബാർ മറയ്ക്കുക</translation> <translation id="2928526264833629376">Hangouts-ൽ തുടരുക</translation> <translation id="2930644991850369934">റിക്കവറി ഇമേജ് ഡൗൺലോഡ് ചെയ്യുന്നതിനിടെ ഒരു പ്രശ്നം ഉണ്ടായി. നെറ്റ്വര്ക്ക് ബന്ധം നഷ്ടപ്പെട്ടു.</translation> <translation id="293111069139560936">ഒരു ഷെൽഫ് ഇനത്തിന് അതുമായി ബന്ധപ്പെടുത്തിയിരിക്കുന്ന ഇതിനകം സജീവമായ ഒരൊറ്റ വിൻഡോ മാത്രമാണ് ഉള്ളതെങ്കിൽ, വിൻഡോ ചെറുതാക്കുന്നതിന് ഷെൽഫിനെ അനുവദിക്കുന്നു.</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">ഫ്ലോട്ടിംഗ് വെർച്വൽ കീബോർഡ് പ്രവർത്തനക്ഷമമാക്കുക/പ്രവർത്തനരഹിതമാക്കുക.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> സഹായം</translation> <translation id="3120430004221004537">ഇനി പറയുന്നതിൽ നൽകിയിരിക്കുന്ന പ്രവർത്തനത്തിന് എൻക്രിപ്ഷൻ അപര്യാപ്തമാണ്: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">വെബ് അറിയിപ്പുകൾക്കായി പ്രവർത്തന ബട്ടണുകളിലെ ഐക്കണുകൾ പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="3121793941267913344">ഈ <ph name="IDS_SHORT_PRODUCT_NAME" /> ഉപകരണം പുനഃസജ്ജീകരിക്കുക</translation> <translation id="3122162841865761901">ഡവലപ്പർ ഉപകരണങ്ങളുടെ പരീക്ഷണങ്ങൾ</translation> <translation id="3122464029669770682">CPU</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">ഈസി ചിഹ്ന ഇന്പുട്ട്</translation> <translation id="3289856944988573801">അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കാൻ, ഇതർനെറ്റ് അല്ലെങ്കിൽ Wi-Fi ഉപയോഗിക്കുക.</translation> <translation id="3293325348208285494">ദ്രുത ആരംഭം</translation> -<translation id="3293894718455402932">ചെക്കുചെയ്ത ഫോൾഡറുകളിലെ ചിത്രങ്ങളും വീഡിയോ, ശബ്ദ ഫയലുകളും "<ph name="EXTENSION" />" എന്നതിന് റീഡുചെയ്യാനും റൈറ്റുചെയ്യാനുമാകും.</translation> <translation id="3294437725009624529">അതിഥി</translation> <translation id="329650768420594634">പായ്ക്ക് വിപുലീകരണ മുന്നറിയിപ്പ്</translation> <translation id="3296763833017966289">ജോര്ജ്ജിയന്</translation> @@ -1639,6 +1647,7 @@ <translation id="3338239663705455570">സ്ലൊവേനിയന് കീബോര്ഡ്</translation> <translation id="3340978935015468852">ക്രമീകരണങ്ങൾ</translation> <translation id="3341703758641437857">URL കള് ഫയല് ചെയ്യുന്നതിന് ആക്സസ്സ് അനുവദിക്കുക</translation> +<translation id="3343813173145836998">ഈ ഉപകരണത്തിൽ എളുപ്പത്തിൽ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="3344786168130157628">ആക്സസ്സ് പോയിന്റിന്റെ പേര്:</translation> <translation id="3345135638360864351">ഈ സൈറ്റ് ആക്സസ്സ് ചെയ്യാനുള്ള നിങ്ങളുടെ അഭ്യർത്ഥന, <ph name="NAME" /> എന്നയാൾക്ക് അയയ്ക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="3345886924813989455">പിന്തുണയ്ക്കുന്ന ഒരു ബ്രൌസറും കണ്ടെത്തിയില്ല</translation> @@ -2117,6 +2126,7 @@ <translation id="3996912167543967198">പുനഃസജ്ജമാക്കുന്നു..</translation> <translation id="3997015411467176489">പരീക്ഷണാത്മക ക്യാൻവാസ് ഫീച്ചറുകൾ</translation> <translation id="40027638859996362">പദം നീക്കല്</translation> +<translation id="400554499662786523">ഓഡിയോ പങ്കിടാൻ, ഒരു ടാബ് തിരഞ്ഞെടുക്കുക.</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" /> എന്നതിൽ പ്രിന്ററുകൾ സജ്ജമാക്കുക അല്ലെങ്കിൽ നിയന്ത്രിക്കുക.</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />" റിപ്പയർ ചെയ്യണോ?</translation> <translation id="4018133169783460046">ഈ ഭാഷയില് <ph name="PRODUCT_NAME" /> പ്രദര്ശിപ്പിക്കുക</translation> @@ -2218,6 +2228,7 @@ <translation id="4180788401304023883">CA സാക്ഷ്യപത്രം"<ph name="CERTIFICATE_NAME" />" ഇല്ലാതാക്കണോ?</translation> <translation id="418179967336296930">റഷ്യൻ ഫൊണറ്റിക് (YaZHert) കീബോർഡ്</translation> <translation id="4181841719683918333">ഭാഷകള്</translation> +<translation id="4187248015940562149">നിങ്ങൾക്ക് ചുറ്റുമുള്ള Bluetooth ഉപകരണങ്ങളിലേക്ക് കണക്റ്റുചെയ്യാനും അവയെ നിയന്ത്രിക്കാനും, വെബ്സൈറ്റുകളെ അനുവദിക്കുന്ന വെബ് Bluetooth പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> <translation id="4188026131102273494">കീവേഡ്:</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> എന്ന വിപുലികരണത്തെ ഈ ക്രമീകരണം നിയന്ത്രിക്കുന്നു.</translation> <translation id="4193154014135846272">Google പ്രമാണം</translation> @@ -2274,6 +2285,7 @@ <translation id="4268025649754414643">കീ എന്സിഫെര്മെന്റ്</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102"><ph name="NUMBER" /> പതിപ്പ്</translation> +<translation id="4271396100647220620">ഒന്നും യോജിക്കുന്നില്ല</translation> <translation id="4274187853770964845">സമന്വയിപ്പിക്കൽ പിശക്: സമന്വയിപ്പിക്കൽ ദയവായി നിർത്തി പുനഃരാരംഭിക്കുക.</translation> <translation id="4275830172053184480">നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക</translation> <translation id="4276796043975446927">മീറ്റിംഗുകൾക്കുള്ള Chromebox-ലേക്ക് സ്വാഗതം</translation> @@ -2343,6 +2355,7 @@ <translation id="4378551569595875038">കണക്റ്റുചെയ്യുന്നു...</translation> <translation id="438122767399415311">UI ഡയറക്ഷന് നിർബന്ധിക്കുക</translation> <translation id="4381849418013903196">നിര</translation> +<translation id="4383192539467954373">ഉപകരണങ്ങളിലുടനീളം സ്വയം സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="4384652540891215547">വിപുലീകരണം സജീവമാക്കുക</translation> <translation id="438503109373656455">സാരറ്റോഗ</translation> <translation id="4387554346626014084">അപ്ലിക്കേഷൻ ലോഞ്ചർ സമന്വയം പ്രവർത്തനക്ഷമമാക്കുക. ഫോൾഡർ ലഭ്യമാകുന്നിടത്തും അത് പ്രവർത്തനക്ഷമമാകുന്നു (OSX ഇതരം).</translation> @@ -2360,6 +2373,7 @@ <translation id="4421932782753506458">ഫ്ലഫി</translation> <translation id="4422347585044846479">ഈ പേജിനായി ബുക്മാര്ക്ക് എഡിറ്റ് ചെയ്യുക</translation> <translation id="4422428420715047158">Domain:</translation> +<translation id="4423482519432579560">&അക്ഷരത്തെറ്റ് പരിശോധന</translation> <translation id="442477792133831654">സമീപമുള്ള ഉപകരണങ്ങളുമായി ആശയവിനിമയം നടത്തുക</translation> <translation id="4425149324548788773">എന്റെ ഡ്രൈവ്</translation> <translation id="4428582326923056538">Adobe Flash Player ക്യാമറ ഒഴിവാക്കലുകൾ വ്യത്യസ്തമാണ്.</translation> @@ -2374,6 +2388,7 @@ <translation id="444267095790823769">പരിരക്ഷിത ഉള്ളടക്കത്തിലെ ഒഴിവാക്കലുകൾ</translation> <translation id="4443536555189480885">&സഹായം</translation> <translation id="4444304522807523469">USB വഴിയോ പ്രാദേശിക നെറ്റ്വർക്കിലോ അറ്റാച്ചുചെയ്ത പ്രമാണ സ്കാനറുകൾ ആക്സസ്സുചെയ്യുക</translation> +<translation id="4445559854264555037">നിങ്ങളുടെ ഉപകരണം കാണുന്നില്ലേ? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">മിറർ ചെയ്തു</translation> <translation id="4447465454292850432">ബാറ്ററി:</translation> <translation id="4449935293120761385">ഓട്ടോഫില്ലിനെക്കുറിച്ച്</translation> @@ -2633,6 +2648,7 @@ <translation id="485316830061041779">ജര്മ്മന്</translation> <translation id="4856478137399998590">നിങ്ങളുടെ ഡാറ്റ സേവനം സജീവമാക്കി ഒപ്പം ഉപയോഗക്ഷമവുമായി</translation> <translation id="4858913220355269194">ഫ്രിറ്റ്സ്</translation> +<translation id="4860565041166337978">ബാധകമായിരിക്കുന്ന സമയത്ത്, ഡൗൺലോഡുകൾ കൈകാര്യം ചെയ്യാൻ സിസ്റ്റം ഡൗൺലോഡ് മാനേജറെ അനുവദിക്കുക.</translation> <translation id="48607902311828362">എയർപ്ലെയിൻ മോഡ്</translation> <translation id="4861833787540810454">&പ്ലേചെയ്യുക</translation> <translation id="4862050643946421924">ഉപകരണം ചേർക്കൽ...</translation> @@ -2716,7 +2732,6 @@ <translation id="4977942889532008999">ആക്സസ്സ് സ്ഥിരീകരിക്കുക</translation> <translation id="4982718461356080574">അടുക്കിയിരിക്കുമ്പോൾ നിഷ്ക്രിയ ടാബുകളിൽ 'അടയ്ക്കുക' ബട്ടണുകൾ മറയ്ക്കുന്നു</translation> <translation id="498294082491145744">കുക്കികൾ, JavaScript, പ്ലഗിന്നുകൾ, ജിയോലൊക്കേഷൻ, മൈക്രോഫോൺ, ക്യാമറ എന്നിവപോലുള്ള ഫീച്ചറുകളിലേക്കുള്ള വെബ്സൈറ്റിന്റെ ആക്സസ്സ് നിയന്ത്രിക്കാൻ നിങ്ങളുടെ ക്രമീകരണം മാറ്റുക.</translation> -<translation id="4984329823325527157">മീഡിയ ഉറവിട API</translation> <translation id="4988526792673242964">പേജുകള്</translation> <translation id="4988792151665380515">പൊതു കീ കയറ്റുമതി ചെയ്യുന്നതിന് പരാജയപ്പെട്ടു.</translation> <translation id="49896407730300355">എ&തിർ ഘടികാരദിശയിൽ തിരിക്കുക</translation> @@ -2905,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (പ്രോസസ്സ് ചെയ്യാൻ കഴിയാത്തത്)</translation> <translation id="526926484727016706">സ്ഥിരമായി എല്ലാ ഐഫ്രെയിമുകൾക്കും എല്ലാ അനുമതികളും നിരസിക്കാൻ കാരണമാകുന്നു. ഒരു ഐഫ്രെയിമിനായി നിർദ്ദിഷ്ട അനുമതികൾ അനുവദിക്കുന്നത് പുതിയ ഐഫ്രെയിം ആട്രിബ്യൂട്ടുകളുടെ മൂല്യമായി ഈ അനുമതികളുടെ പേരുകൾ ലിസ്റ്റുചെയ്യുന്നതിനിടയാക്കാം.</translation> <translation id="5269977353971873915">പ്രിന്റുചെയ്യൽ പരാജയപ്പെട്ടു</translation> -<translation id="5270884342523754894">ചെക്കുചെയ്ത ഫോൾഡറുകളിലെ ചിത്രങ്ങളും വീഡിയോകളും ശബ്ദ ഫയലുകളും "<ph name="EXTENSION" />" എന്നതിന് റീഡുചെയ്യാനാകും.</translation> <translation id="5271247532544265821">ലളിതവല്ക്കരിച്ച/പരമ്പരാഗത ചൈനീസ് മോഡ് ടോഗിള് ചെയ്യുക</translation> <translation id="5271549068863921519">പാസ്വേഡ് സംരക്ഷിക്കുക</translation> <translation id="5273628206174272911">തിരശ്ചീന ഓവർസ്ക്രോളിനുള്ള പ്രതികരണമായ പരീക്ഷണാത്മക ചരിത്ര നാവിഗേഷൻ.</translation> @@ -2942,6 +2956,7 @@ <translation id="5316716239522500219">മോണിറ്ററുകൾ മിറർ ചെയ്യുക</translation> <translation id="5317780077021120954">സംരക്ഷിക്കുക</translation> <translation id="5319782540886810524">ലാറ്റ്വിയന് കീബോര്ഡ്</translation> +<translation id="532247166573571973">സെർവർ ലഭ്യമല്ലായിരിക്കാം. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="5323213332664049067">ലാറ്റിന് അമേരിക്കന്</translation> <translation id="532360961509278431">"$1": $2 തുറക്കാൻ കഴിഞ്ഞില്ല</translation> <translation id="5324674707192845912">ഉപകരണം വിദൂരമായി കണ്ടെത്താനും മായ്ക്കാനും ലോക്കുചെയ്യാനുമുള്ള കഴിവ് പ്രവർത്തനരഹിതമാക്കാൻ, നിങ്ങൾ Google-ൽ ഈ <ph name="DEVICE_TYPE" /> അൺഎൻറോൾ ചെയ്യാൻ പോകുന്നു. ഇതിന് റീബൂട്ട് ചെയ്യേണ്ടിവരും. തുടരണോ?</translation> @@ -2994,11 +3009,11 @@ <translation id="5390284375844109566">ഇൻഡെക്സ് ചെയ്ത ഡാറ്റാബേസ്</translation> <translation id="5392544185395226057">നേറ്റീവ് ക്ലയന്റിനായി പിന്തുണ പ്രാപ്തമാക്കുക.</translation> <translation id="5393125431335030955">ഈ പ്ലഗിൻ ഡെസ്ക്ടോപ്പിൽ മാത്രമേ പ്രവർത്തിക്കൂ.</translation> -<translation id="5393559999218790205">UI കമ്പോസിറ്റർ ആനിമേഷൻ ടൈംലൈനുകൾ പ്രവർത്തനരഹിതമാക്കുക</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> എന്നതിലെ <ph name="PEPPER_PLUGIN_NAME" /> നിങ്ങളുടെ കമ്പ്യൂട്ടർ ആക്സസ്സുചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു.</translation> <translation id="539755880180803351">ഓട്ടോമാറ്റിക് ആയി പൂരിപ്പിച്ച ഫീൽഡ് ടൈപ്പ് പ്രവചനങ്ങളെ പ്ലേസ്ഹോൾഡർ വാചകത്തോട് കൂടി വെബ് ഫോമുകൾ വ്യാഖ്യാനിക്കുന്നു.</translation> <translation id="5397578532367286026">ഈ ഉപയോക്താവിന്റെ ഉപയോഗവും ചരിത്രവും chrome.com-ൽ മാനേജർക്ക് (<ph name="MANAGER_EMAIL" />) അവലോകനം ചെയ്യാനാകും.</translation> <translation id="5397794290049113714">നിങ്ങള്</translation> +<translation id="5398572795982417028">പേജ് റഫറൻസ് പരിധി കവിഞ്ഞു, <ph name="MAXIMUM_PAGE" /> പേജാണ് വേണ്ട പരിധി</translation> <translation id="5398824043967640339">മറ്റ് സൈറ്റുകളിൽ നിന്നും <ph name="COUNT" /> എണ്ണം</translation> <translation id="5399158067281117682">PIN-കള് പൊരുത്തപ്പെടുന്നില്ല!</translation> <translation id="5400640815024374115">ട്രസ്റ്റഡ് പ്ലാറ്റ്ഫോം മൊഡ്യൂള് (TPM) ചിപ്പ് അപ്രാപ്തമാക്കി അല്ലെങ്കില് ഹാജരല്ല.</translation> @@ -3018,7 +3033,7 @@ <translation id="5423849171846380976">സജീവമാക്കി</translation> <translation id="5425470845862293575">പരീക്ഷണാത്മക DirectWrite ഫോണ്ട് റെൻഡറിംഗ് സംവിധാനം ഉപയോഗിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> <translation id="5425722269016440406">ഈ ക്രമീകരണം നിങ്ങളുടെ ഫോണിലും മറ്റു ഉപകരണങ്ങളിലും സമന്വയിപ്പിച്ചിരിക്കുന്നതിനാൽ Smart Lock ഓഫാക്കാൻ നിങ്ങൾ ഓൺലൈനിലായിരിക്കണം. ആദ്യം ഒരു നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക.</translation> -<translation id="5426623592374109001">UI-യിലെ കമ്പോസിറ്റ് ചെയ്ത ആനിമേഷനുകൾക്കായി പഴയ ഇൻട്രൂസീവ് ആനിമേഷൻ സബ്സിസ്റ്റം ഉപയോഗിക്കുക.</translation> +<translation id="5425863515030416387">ഉപകരണങ്ങളിലുടനീളം എളുപ്പത്തിൽ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="5427459444770871191">&ഘടികാരദിശയില് തിരിക്കുക</translation> <translation id="5428105026674456456">സ്പാനിഷ്</translation> <translation id="542872847390508405">നിങ്ങൾ ഒരു അതിഥിയായി ബ്രൗസുചെയ്യുന്നു</translation> @@ -3043,6 +3058,7 @@ <translation id="5451646087589576080">ഫ്രെയിമിന്റെ &വിവരങ്ങള് കാണുക</translation> <translation id="5453029940327926427">ടാബുകള് അടയ്ക്കുക</translation> <translation id="5453632173748266363">സിറിലിക്</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> എന്നതിനൊപ്പം</translation> <translation id="5457113250005438886">അസാധുവാണ്</translation> <translation id="5457459357461771897">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്ന് ഫോട്ടോകളും സംഗീതവും മറ്റ് മീഡിയയും റീഡുചെയ്യുക, ഇല്ലാതാക്കുക</translation> <translation id="5457599981699367932">അതിഥിയായി ബ്രൌസുചെയ്യുക</translation> @@ -3212,7 +3228,6 @@ <translation id="5708171344853220004">Microsoft പ്രിന്സിപ്പല് നാമം</translation> <translation id="5709885306771508267">പിഞ്ച് സ്കെയിൽ</translation> <translation id="5710406368443808765">ക്ഷമിക്കണം! ഉപകരണ ടോക്കണും ഐഡിയും സംഭരിക്കുന്നതിൽ സിസ്റ്റം പരാജയപ്പെട്ടു.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> പ്രതികരിക്കുന്നില്ല. കാസ്റ്റുചെയ്യാനാവുന്നില്ല.</translation> <translation id="5711983031544731014">അൺലോക്കുചെയ്യാനായില്ല. നിങ്ങളുടെ പാസ്വേഡ് നൽകുക.</translation> <translation id="5712966208980506909">പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നെങ്കിൽ, chrome://md-policy URL മെറ്റീരിയൽ രൂപകൽപ്പന നയ പേജ് ലോഡുചെയ്യുന്നു.</translation> <translation id="5715711091495208045">പ്ലഗിൻ ബ്രോക്കർ: <ph name="PLUGIN_NAME" /></translation> @@ -3481,7 +3496,6 @@ <translation id="6111974609785983504">സ്ഥിരസ്ഥിതിയായി അനുവദിച്ചത്</translation> <translation id="6113134669445407638">WebRTC-യിൽ ഡിലേ ആഗ്ണോസ്റ്റിക് AEC പ്രവർത്തനരഹിതമാക്കുക. റിപ്പോർട്ടുചെയ്ത സിസ്റ്റം ഡിലേകൾ വിശ്വസനീയമാണെങ്കിലോ നിങ്ങളുടെ മെഷീനിൽ നിന്ന് മറ്റുള്ളവർക്ക് എക്കോ അനുഭവപ്പെടുന്നെങ്കിലോ ഉപയോഗിക്കുക.</translation> <translation id="6116921718742659598">ഭാഷയും ഇൻപുട്ട് ക്രമീകരണങ്ങളും മാറ്റുക</translation> -<translation id="6117536376248197233">റെൻഡറുകളിലെ കമ്പോസിറ്റർ ആനിമേഷൻ ടൈംലൈനുകൾ പ്രവർത്തനരഹിതമാക്കുക.</translation> <translation id="6120205520491252677">ഈ പേജ് ആരംഭ സ്ക്രീനിലേക്ക് പിൻ ചെയ്യുക...</translation> <translation id="6122081475643980456">നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ നിയന്ത്രിക്കുന്നു</translation> <translation id="6122093587541546701">ഇമെയിൽ (ഓപ്ഷണൽ):</translation> @@ -3513,6 +3527,7 @@ <translation id="6163522313638838258">എല്ലാം വികസിപ്പിക്കുക...</translation> <translation id="6164005077879661055">സൂപ്പർവൈസുചെയ്ത ഉപയോക്താവിനെ നീക്കംചെയ്താൽ, സൂപ്പർവൈസുചെയ്ത ഉപയോക്താവുമായി ബന്ധപ്പെടുത്തിയിട്ടുള്ള എല്ലാ ഫയലുകളും പ്രാദേശിക ഡാറ്റയും ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും. സൂപ്പർവൈസുചെയ്ത ഈ ഉപയോക്താവിനായി സന്ദർശിച്ച വെബ്സൈറ്റുകളും ക്രമീകരണങ്ങളും <ph name="MANAGEMENT_URL" />-ൽ മാനേജർക്ക് തുടർന്നും കാണാനായേക്കും.</translation> <translation id="6165508094623778733">കൂടുതൽ മനസിലാക്കുക</translation> +<translation id="6167008112175207002">നിങ്ങളുടെ എല്ലാ ഉപകണങ്ങളിലും ഉപയോഗിക്കുന്നതിന്, ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നതാണ്. നിങ്ങൾക്ക് ഇത് <ph name="BEGIN_LINK" /> ലിങ്കിൽ മാറ്റാനാകും</translation> <translation id="6171550060231646388">സിമുലേറ്റുചെയ്ത ഹാർഡ്വെയർ 'Ok Google' ഫീച്ചറുകൾ</translation> <translation id="6175314957787328458">Microsoft ഡൊമെയ്ന് GUID</translation> <translation id="6178664161104547336">ഒരു സര്ട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുക</translation> @@ -3716,6 +3731,7 @@ <translation id="648927581764831596">ഒന്നും ലഭ്യമല്ല</translation> <translation id="6490936204492416398">വെബ്സ്റ്റോറിൽ നിന്ന് പുതിയത് ഇൻസ്റ്റാൾ ചെയ്യുക</translation> <translation id="6492313032770352219">ഡിസ്കിലെ വലുപ്പം:</translation> +<translation id="6498249116389603658">&നിങ്ങളുടെ എല്ലാ ഭാഷകളും</translation> <translation id="6499143127267478107">പ്രോക്സി സ്ക്രിപ്റ്റിലെ ഹോസ്റ്റിനെ സ്പഷ്ടമാക്കുന്നു...</translation> <translation id="6503077044568424649">കൂടുതൽ സന്ദര്ശിച്ചത്</translation> <translation id="6503256918647795660">സ്വിസ്സ് ഫ്രഞ്ച് കീബോര്ഡ്</translation> @@ -3757,7 +3773,6 @@ <translation id="6555432686520421228">എല്ലാ ഉപയോക്തൃ അക്കൗണ്ടുകളും നീക്കം ചെയ്ത് നിങ്ങളുടെ <ph name="IDS_SHORT_PRODUCT_NAME" /> ഉപകരണം പുതിയതുപോലെ പുനഃസജ്ജമാക്കുക.</translation> <translation id="6556866813142980365">വീണ്ടുംചെയ്യുക</translation> <translation id="6557565812667414268">ഉയർന്ന-DPI ഡിസ്പ്ലേകൾക്ക് മാത്രമായി തയ്യാറാക്കിയിരിക്കുന്നു</translation> -<translation id="655845594391856372">ടാബ് പ്രതികരിക്കുന്നില്ല. കാസ്റ്റുചെയ്യാനാവുന്നില്ല.</translation> <translation id="6559580823502247193">(ഇതിനകം ഈ ഉപകരണത്തിലുണ്ട്)</translation> <translation id="6561726789132298588">എന്റർ</translation> <translation id="6562437808764959486">റിക്കവറി ഇമേജ് വേര്തിരിച്ചെടുക്കുന്നു...</translation> @@ -3858,6 +3873,7 @@ <translation id="6723354935081862304">Google ഡോക്സിലും മറ്റ് ക്ലൗഡ് ലക്ഷ്യസ്ഥാനങ്ങളിലും പ്രിന്റുചെയ്യുക. Google ക്ലൗഡ് പ്രിന്റിൽ പ്രിന്റുചെയ്യുന്നതിന് <ph name="BEGIN_LINK" />സൈൻ ഇൻ ചെയ്യുക<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">ബുക്ക്മാർക്കുകളും ക്രമീകരണവും ഇംപോർട്ട് ചെയ്യുക...</translation> <translation id="6723839937902243910">പവർ</translation> +<translation id="6725240607822645708">IME-യെ അതിന്റെ ത്രെഡിൽ റൺ ചെയ്യുക.</translation> <translation id="6725970970008349185">ഓരോ പേജിലും പ്രദര്ശിപ്പിക്കുന്നതിനുള്ള അംഗങ്ങളുടെ എണ്ണം</translation> <translation id="672609503628871915">പുതിയതെന്താണെന്ന് കാണുക</translation> <translation id="6727005317916125192">മുമ്പത്തെ പാൻ</translation> @@ -3988,12 +4004,11 @@ <translation id="6948736568813450284">ഡവലപ്പർമാർക്ക്: Google പേയ്മെന്റ് API കോളുകൾക്കായി സാൻഡ്ബോക്സ് സേവനം ഉപയോഗിക്കുക.</translation> <translation id="6949306908218145636">തുറന്ന പേജുകൾ ബുക്ക്മാർക്ക് ചെയ്യുക...</translation> <translation id="695164542422037736">ഈ ഓപ്ഷൻ പ്രവർത്തനക്ഷമമാക്കിയിരുന്നാൽ ബോഡി, പശ്ചാത്തല അറ്റാച്ചുമെന്റ്:പരിഹരിച്ചത്, ഉപയോഗിച്ച് ഭംഗിയാക്കിയാൽ പശ്ചാത്തലത്തിന് അതിന്റേതായ കമ്പോസിറ്റുചെയ്ത ലെയർ ഉണ്ടാകും.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" />, പാസ്വേഡുകൾ ഓർക്കുന്നതിനാൽ സ്വയമേവ ഈ ഉപകരണത്തിൽ സൈറ്റുകളിലേക്ക് നിങ്ങളെ സൈൻ ഇൻ ചെയ്യിക്കുന്നു.</translation> <translation id="6955446738988643816">പോപ്പ്അപ്പ് പരിശോധിക്കുക</translation> <translation id="695755122858488207">തിരഞ്ഞെടുക്കാത്ത റേഡിയോ ബട്ടണ്</translation> +<translation id="6960277925159781810">ഈ ഉപകരണത്തിൽ സ്വയം സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="696036063053180184">3 സെറ്റ് (ഷിഫ്റ്റ് ഇല്ല)</translation> <translation id="696203921837389374">മൊബൈൽ ഡാറ്റയിലൂടെയുള്ള സമന്വയം പ്രവർത്തനക്ഷമമാക്കുക</translation> -<translation id="6964308487066031935">"<ph name="EXTENSION" />" എന്നതിലേക്ക് ഫോൾഡറുകൾ ചേർക്കണോ?</translation> <translation id="6965382102122355670">ശരി</translation> <translation id="6965648386495488594">പോര്ട്ട്</translation> <translation id="6965978654500191972">ഉപാധി</translation> @@ -4094,7 +4109,6 @@ <translation id="7076293881109082629">സൈൻ ഇൻ ചെയ്യുന്നു</translation> <translation id="7077829361966535409">നിലവിലെ പ്രോക്സി ക്രമീകരണങ്ങൾ ഉപയോഗിച്ച് ലോഡുചെയ്യുന്നതിൽ സൈൻ-ഇൻ പേജ് പരാജയപ്പെട്ടു. <ph name="GAIA_RELOAD_LINK_START" />വീണ്ടും സൈൻ ഇൻ ചെയ്യാൻ ശ്രമിക്കുക<ph name="GAIA_RELOAD_LINK_END" />, അല്ലെങ്കിൽ മറ്റ് <ph name="PROXY_SETTINGS_LINK_START" />പ്രോക്സി ക്രമീകരണങ്ങൾ<ph name="PROXY_SETTINGS_LINK_END" /> ഉപയോഗിക്കുക.</translation> <translation id="7077872827894353012">അവഗണിച്ച പ്രോട്ടോകോൾ ഹാൻഡ്ലറുകൾ</translation> -<translation id="7079038783243627996">ചെക്കുചെയ്ത ഫോൾഡറുകളിലെ സന്ദേശ, വീഡിയോ, ശബ്ദ ഫയലുകൾ "<ph name="EXTENSION" />" എന്നതിന് റീഡുചെയ്യാനും ഇല്ലാതാക്കാനുമാകും.</translation> <translation id="708060913198414444">ഓഡിയോ വിലാസം പകർത്തുക</translation> <translation id="708187310695946552">സെഷൻ പുനഃസ്ഥാപിക്കൽ ബബിൾ UI</translation> <translation id="7082055294850503883">ക്യാപ്സ്ലോക്ക് നില ഒഴിവാക്കി ലോവര്കേസ് സ്ഥിരസ്ഥിതിയായി ഇന്പുട്ട് ചെയ്യുക</translation> @@ -4238,6 +4252,8 @@ <translation id="7313804056609272439">വിയറ്റ്നാമീസ് ഇന്പുട്ട് രീതി (VNI)</translation> <translation id="7314244761674113881">സോക്സ് ഹോസ്റ്റ്</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (നിലവിൽ)</translation> +<translation id="7321545336522791733">സെർവർ ലഭ്യമല്ല</translation> +<translation id="7324841169865301118">ഡെസ്ക്ടോപ്പ് പങ്കിടലിനായി ടാബ് തിരഞ്ഞെടുക്കാൻ ഉപയോക്താവിനെ അനുവദിക്കുന്നു.</translation> <translation id="7325437708553334317">ഉയർന്ന ദൃശ്യ തീവ്രത വിപുലീകരണം</translation> <translation id="7326565110843845436">ടച്ച്പാഡ് ത്രീ-ഫിംഗർ-ക്ലിക്ക്</translation> <translation id="73289266812733869">തിരഞ്ഞെടുത്തില്ല</translation> @@ -4464,7 +4480,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />", "<ph name="EXTENSION_NAME" />" നീക്കംചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> ഈ ഭാഷയില് പ്രദര്ശിപ്പിച്ചിരിക്കുന്നു</translation> <translation id="7654941827281939388">ഈ അക്കൗണ്ട് ഇതിനകം ഈ കമ്പ്യൂട്ടറിൽ ഉപയോഗിച്ചുകൊണ്ടിരിക്കുന്നു.</translation> -<translation id="7655165758820095116">MediaSource ഒബ്ജക്റ്റ് ഒരു വീഡിയോ ഘടകത്തിലേക്ക് മീഡിയ ഡാറ്റ നേരിട്ട് അയയ്ക്കാൻ JavaScript-നെ അനുവദിക്കുന്നു.</translation> <translation id="7658239707568436148">റദ്ദാക്കൂ</translation> <translation id="7659584679870740384">ഈ ഉപകരണം ഉപയോഗിക്കാൻ നിങ്ങൾക്ക് അനുമതിയില്ല. സൈൻ ഇൻ അനുമതിയ്ക്കായി അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക.</translation> <translation id="7664620655576155379">പിന്തുണയ്ക്കാത്ത Bluetooth ഉപകരണം: "<ph name="DEVICE_NAME" />".</translation> @@ -4595,6 +4610,7 @@ <translation id="7861215335140947162">&ഡൌണ്ലോഡുകള്</translation> <translation id="7864539943188674973">Bluetooth അപ്രാപ്തമാക്കുക</translation> <translation id="7868891395842935202">API പരീക്ഷണങ്ങളിലേക്കുള്ള ആക്സസ്സ് നിയന്ത്രിക്കാൻ പരീക്ഷണാത്മക ഫ്രെയിംവർക്ക് പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> +<translation id="7870576007982733437">ബാധകമായിരിക്കുന്ന സമയത്ത്, സിസ്റ്റം ഡൗൺലോഡ് മാനേജർ ഉപയോഗിക്കുക.</translation> <translation id="7870790288828963061">ഏറ്റവും പുതിയ പതിപ്പിലുള്ള കിയോസ്ക് അപ്ലിക്കേഷനുകളൊന്നുമില്ല. USB സ്റ്റിക്ക് നീക്കംചെയ്യുക.</translation> <translation id="787150342916295244">ക്രെഡിറ്റ് കാർഡ് സ്കാൻ ചെയ്യുന്നു</translation> <translation id="7874357055309047713">എല്ലായ്പ്പോഴും എല്ലാ സൈറ്റുകളിലും റൺ ചെയ്യുക</translation> @@ -4637,7 +4653,6 @@ <translation id="7918257978052780342">എൻറോൾ ചെയ്യുക</translation> <translation id="7920092496846849526">ഈ പേജ് സന്ദർശിക്കാൻ രക്ഷകർത്താക്കൾക്ക് സമ്മതമാണോയെന്ന് നിങ്ങൾ ചോദിച്ചു.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> നായി കാത്തിരിക്കുന്നു...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" />, പാസ്വേഡുകൾ ഓർക്കുന്നതിനാൽ ഉപകരണങ്ങളിലുടനീളമുള്ള ആപ്സിലും സൈറ്റുകളിലും നിങ്ങളെ സ്വയമേവ സൈൻ ഇൻ ചെയ്യിക്കുന്നു.</translation> <translation id="7925686952655276919">സമന്വയത്തിനായി മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കരുത്</translation> <translation id="7926906273904422255">സുരക്ഷിതമല്ലാത്ത ഉറവിടങ്ങളെ സുരക്ഷിതമല്ലാത്തത് അല്ലെങ്കിൽ "അവ്യക്തമായത്" എന്ന് അടയാളപ്പെടുത്തുക.</translation> <translation id="7928710562641958568">ഉപകരണം നീക്കംചെയ്യുക</translation> @@ -4699,7 +4714,6 @@ നിങ്ങളുടെ പ്രധാന ഫയല് ഒരു സുരക്ഷിത സ്ഥലത്ത് സൂക്ഷിക്കുക. നിങ്ങളുടെ വിപുലീകരണത്തിന്റെ പുതിയ പതിപ്പുകള് സൃഷ്ടിക്കുന്നതിന് നിങ്ങള്ക്ക് അത് ആവശ്യമാണ്.</translation> <translation id="799923393800005025">കാണാനാകുന്നത്</translation> <translation id="7999338963698132743">പുതിയ ടാസ്ക് മാനേജർ</translation> -<translation id="8000004253404706714">റെൻഡറുകളിലെ കമ്പോസിറ്റ് ചെയ്ത ആനിമേഷനുകൾക്കായി പഴയ ഇൻട്രൂസീവ് ആനിമേഷൻ സബ്സിസ്റ്റം ഉപയോഗിക്കുക.</translation> <translation id="8004582292198964060">ബ്രൌസര്</translation> <translation id="8007030362289124303">ബാറ്ററി കുറവാണ്</translation> <translation id="8008356846765065031">ഇന്റർനെറ്റ് വിച്ഛേദിച്ചു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക.</translation> @@ -4829,6 +4843,7 @@ <translation id="8185331656081929126">നെറ്റ്വർക്കിൽ പുതിയ പ്രിന്ററുകൾ കണ്ടെത്തുമ്പോൾ അറിയിപ്പുകൾ ദൃശ്യമാക്കുക</translation> <translation id="8186609076106987817">സെർവറിന് ഫയൽ കണ്ടെത്താൻ കഴിഞ്ഞില്ല.</translation> <translation id="8186706823560132848">സോഫ്റ്റ്വെയര്</translation> +<translation id="8188120771410500975">&ടെക്സ്റ്റ് ഫീൽഡുകളിലെ അക്ഷരത്തെറ്റ് പരിശോധിക്കുക</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> എന്നിവയും മറ്റ് <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> എണ്ണവും</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> ലേക്ക് ബന്ധിപ്പിക്കുന്നു</translation> <translation id="8191230140820435481">നിങ്ങളുടെ അപ്ലിക്കേഷനുകൾ, വിപുലീകരണങ്ങൾ, തീമുകൾ എന്നിവ നിയന്ത്രിക്കുക</translation> @@ -5221,6 +5236,7 @@ <translation id="8765985713192161328">ഹാന്ഡ്ലറുകള് കൈകാര്യം ചെയ്യുക...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">ഉപയോക്താക്കള്</translation> +<translation id="8768367823103160496">മൗസ് കഴ്സർ ലോക്ക്</translation> <translation id="8769662576926275897">കാർഡ് വിശദാംശങ്ങൾ</translation> <translation id="8770196827482281187">പേര്ഷ്യന് ഇന്പുട്ട് രീതി (ISIRI 2901 ലേഔട്ട്)</translation> <translation id="8774934320277480003">മുകൾഭാഗത്തെ മാർജിൻ</translation> @@ -5240,6 +5256,7 @@ <translation id="8795668016723474529">ഒരു ക്രെഡിറ്റ് കാര്ഡ് ചേര്ക്കുക</translation> <translation id="8795916974678578410">പുതിയ വിന്ഡോ</translation> <translation id="8798099450830957504">സ്ഥിരസ്ഥിതി</translation> +<translation id="8799127529310003270">പ്രവർത്തനക്ഷമമാക്കിയാൽ, InputConnection കോളുകൾ IME ത്രെഡിൽ റൺ ചെയ്യും, ഒപ്പം ഒരു റെപ്ലിക്ക എഡിറ്റർ സൂക്ഷിക്കുന്നതിന് പകരം ഓരോ InputConnection കോളും റെൻഡററുമായി നേരിട്ട് സംസാരിക്കുന്നതാണ്</translation> <translation id="8799839487311913894">"പാസ്വേഡ് മാറ്റുക" ഫോം സമർപ്പിച്ചതിനുശേഷം പാസ്വേഡ് മാനേജറിൽ പാസ്വേഡ് അപ്ഡേറ്റുചെയ്യുന്നത് പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="8800004011501252845">ഇതിനായി ലക്ഷ്യസ്ഥാനങ്ങൾ കാണിക്കുന്നു</translation> <translation id="8800420788467349919">ശബ്ദം: <ph name="PRECENTAGE" />%</translation> @@ -5265,6 +5282,7 @@ <translation id="8841142799574815336">ഇനേർട്ട് വിഷ്വൽ വ്യൂപോർട്ട്.</translation> <translation id="884264119367021077">ഷിപ്പിംഗ് വിലാസം</translation> <translation id="8844238624737526720">chrome ടാസ്ക് മാനേജറിന്റെ പുതിയതും ഒപ്റ്റിമൈസ് ചെയ്തതുമായ നടപ്പിലാക്കൽ ഉപയോഗിക്കുക.</translation> +<translation id="8845001906332463065">സഹായം സ്വീകരിക്കുക</translation> <translation id="8846141544112579928">കീബോർഡിനായി തിരയുന്നു...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">ഷിഫ്റ്റ് കീ മോഡ് സ്വിച്ച്</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 3846631..e6ce799 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">हे पृष्ठ बुकमार्क करा...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> आयटम हटवत आहे...</translation> <translation id="1048597748939794622">सर्वस्तरांसाठी सक्तीने सक्षम केलेले</translation> +<translation id="1049795001945932310">&भाषा सेटिंग्ज</translation> <translation id="1049926623896334335">Word दस्तऐवज</translation> <translation id="1054153489933238809">नवीन टॅबमध्ये मूळ &प्रतिमा उघडा</translation> <translation id="1055806300943943258">Bluetooth आणि USB डिव्हाइसेस शोधत आहे...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">लिप्यंतरण (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">स्वयंचलित नाव सर्व्हर</translation> <translation id="1215411991991485844">नवीन पार्श्वभूमी अनुप्रयोग जोडला</translation> +<translation id="1216954813581739968">डेस्कटॉप सामायिक करण्यासाठी टॅब सक्षम करा.</translation> <translation id="121827551500866099">सर्व डाउनलोड दर्शवा...</translation> <translation id="122082903575839559">प्रमाणपत्र स्वाक्षरी अल्गोरिदम</translation> <translation id="1221024147024329929">PKCS #1 RSA कूटबद्धीकरणासह MD2</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">स्वयंचलित साइन इन अयशस्वी झाले</translation> <translation id="1293556467332435079">फायली</translation> <translation id="1294298200424241932">विश्वास सेटिंग्ज संपादित करा:</translation> +<translation id="1295794900245526845">साइन इन करण्यासाठी <ph name="PASSWORD_MANAGER_BRAND" /> सह जतन केलेले आपले खाते निवडा</translation> <translation id="1297175357211070620">गंतव्य</translation> <translation id="1297922636971898492">Google ड्राइव्ह आत्ता उपलब्ध नाही. Google ड्राइव्ह एकदा परत आल्यानंतर अपलोड करणे स्वयंचलितपणे रीस्टार्ट होईल.</translation> <translation id="1300861494336759522">Windows डेस्कटॉप शोध पुनर्निर्देशन</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">हे आपले प्रारंभ पृष्ठ, नवीन टॅब पृष्ठ, शोध इंजिन आणि पिन केलेले टॅब रीसेट करेल. हे सर्व विस्तार अक्षम करेल आणि कुकीज सारखा तात्पुरता डेटा साफ करेल. आपले बुकमार्क, इतिहास आणि जतन केलेले संकेतशब्द साफ केले जाणार नाहीत.</translation> <translation id="1434886155212424586">मुख्यपृष्ठ हे नवीन टॅब पृष्ठ आहे</translation> <translation id="1435550882135542937">विस्तार टूलबार पुन्हा डिझाइन करणे</translation> +<translation id="1436402875660227532">टीप: या सेटिंग्ज यापुढे या सिस्टमवर वापरल्या जाणार नाहीत परंतु आपण अद्याप त्यांना पाहू आणि संपादित करू शकता.</translation> <translation id="1436784010935106834">काढली</translation> <translation id="1438632560381091872">टॅब सशब्द करा</translation> <translation id="1441841714100794440">व्हिएतनामी कीबोर्ड (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">व्हर्च्युअल कीबोर्ड समर्थन सक्षम करा.</translation> <translation id="1474079335130556426">Push API साठी पार्श्वभूमी मोड सक्षम करा. हे अखरेची विंडो बंद केल्यानंतर आणि OS प्रारंभ लाँच करताना Push API ला आवश्यक असल्यास, Chrome ला सुरु राहण्याची अनुमती देते.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" अपलोड केली नाही. आपल्या Google ड्राइव्हमध्ये पर्याप्त स्थान नाही.</translation> +<translation id="1476607407192946488">&भाषा सेटिंग्ज</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />विविधोपयोगी क्षेत्रातून<ph name="END_LINK" /> शोध घेत असताना कोणते शोध इंजिन वापरले जावे हे सेट करा.</translation> <translation id="1477301030751268706">ओळख API टोकन कॅशे</translation> <translation id="1478340334823509079">तपशील: <ph name="FILE_NAME" /></translation> @@ -648,6 +653,7 @@ <translation id="1962233722219655970">हे पृष्ठ एक मूळ क्लायंट अॅप वापरते जो आपल्या संगणकावर कार्य करत नाही.</translation> <translation id="1965328510789761112">खासगी मेमरी</translation> <translation id="1965624977906726414">यास विशेष परवानग्या नाहीत.</translation> +<translation id="1968720524450620475">वेब सूचनांसाठी क्रिया चिन्हे सक्षम करा.</translation> <translation id="1970746430676306437">पृष्ठ &माहिती पहा</translation> <translation id="197288927597451399">ठेवा</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> डाउनलोड अयशस्वी.</translation> @@ -907,6 +913,7 @@ <translation id="2344262275956902282">उमेदवार सूची एका पृष्ठावर करण्यासाठी - आणि = की वापरा</translation> <translation id="2347476388323331511">समक्रमित करणे शक्य झाले नाही</translation> <translation id="2347991999864119449">प्लगिन सामग्री केव्हा चालवावी हे मला निवडू द्या</translation> +<translation id="2348165084656290171">ऑडिओ सामायिक करण्यासाठी, टॅब किंवा संपूर्ण स्क्रीन निवडा.</translation> <translation id="2350182423316644347">अनुप्रयोग प्रारंभ करत आहे...</translation> <translation id="2350796302381711542"><ph name="HANDLER_HOSTNAME" /> ला <ph name="REPLACED_HANDLER_TITLE" /> ऐवजी सर्व <ph name="PROTOCOL" /> दुवे उघडण्यासाठी अनुमती द्यायची?</translation> <translation id="2351266942280602854">भाषा आणि इनपुट</translation> @@ -994,6 +1001,7 @@ <translation id="247772113373397749">कॅनडियन बहुभाषिक कीबोर्ड</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" साठी मीडिया-फाईल परवानग्या</translation> <translation id="2478830106132467213">आपला फोन हाताच्या अंतरावर असतो तेव्हा फक्त हे <ph name="DEVICE_TYPE" /> अनलॉक करा.</translation> +<translation id="247949520305900375">ऑडिओ सामायिक करा</translation> <translation id="2479780645312551899">यावेळी सर्व प्लगिन चालवा</translation> <translation id="2480626392695177423">पूर्ण/अर्धा रूंदी विरामचिन्ह मोड टॉगल करा</translation> <translation id="2481332092278989943">शेल्फमध्ये जोडा</translation> @@ -1308,6 +1316,7 @@ <translation id="2889064240420137087">यासह दुवा उघडा...</translation> <translation id="2889925978073739256">सॅन्डबॉक्स न केलेले प्लगिन अवरोधित करणे सुरू ठेवा</translation> <translation id="2890624088306605051">केवळ समक्रमित केलेली सेटिंग्ज आणि डेटा पुनर्प्राप्त करा</translation> +<translation id="2890678560483811744">निषिद्ध पृष्ठ संदर्भ</translation> <translation id="2893168226686371498">डीफॉल्ट ब्राउझर</translation> <translation id="289426338439836048">इतर मोबाइल नेटवर्क...</translation> <translation id="2894745200702272315">हार्डवेअर अवलंबित्व आहे अशी 'Ok Google' हॉटवर्ड शोध वैशिष्ट्यांची प्रायोगिक आवृत्ती सक्षम करते.</translation> @@ -1336,7 +1345,6 @@ <translation id="2925966894897775835">पत्रके</translation> <translation id="2927017729816812676">कॅशे संचय</translation> <translation id="2927657246008729253">बदला...</translation> -<translation id="2928415919076124714">पूर्ण स्क्रीन मध्ये टूलबार लपवा</translation> <translation id="2928526264833629376">Hangouts वर सुरु ठेवा</translation> <translation id="2930644991850369934">पुनर्प्राप्ती प्रतिमा डाउनलोड करताना एक समस्या आली. नेटवर्क कनेक्शन गमावले गेले आहे.</translation> <translation id="293111069139560936">शेल्फ आयटममध्ये संबद्ध असलेली केवळ एकल, आधीपासून सक्रिय, विंडो असलेला शेल्फ आयटम क्लिक झाल्यास, शेल्फला विंडो लहान करण्याची अनुमती देते.</translation> @@ -1460,6 +1468,7 @@ <translation id="3117812041123364382">अस्थायी व्हर्च्युअल कीबोर्ड सक्षम/अक्षम करा.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> मदत</translation> <translation id="3120430004221004537">दिलेल्या ऑपरेशनसाठी यावर अपुरे कूटबद्धीकरण: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">वेब सूचनांसाठी क्रिया बटणांमधील चिन्हे सक्षम करा.</translation> <translation id="3121793941267913344">हा <ph name="IDS_SHORT_PRODUCT_NAME" /> डिव्हाइस रीसेट करा</translation> <translation id="3122162841865761901">विकासक साधने प्रयोग</translation> <translation id="3122464029669770682">CPU</translation> @@ -1580,7 +1589,6 @@ <translation id="3289566588497100676">सोपे प्रतीक इनपुट</translation> <translation id="3289856944988573801">अद्यतने तपासण्यासाठी, कृपया इथरनेट किंवा Wi-Fi वापरा.</translation> <translation id="3293325348208285494">जलद प्रारंभ</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" निवडलेल्या फोल्डरमधील प्रतिमा, व्हिडिओ आणि ध्वनी फायली वाचण्यास आणि लिहिण्यास सक्षम होईल.</translation> <translation id="3294437725009624529">अतिथी</translation> <translation id="329650768420594634">Pack विस्तार चेतावणी</translation> <translation id="3296763833017966289">जॉर्जियन</translation> @@ -1638,6 +1646,7 @@ <translation id="3338239663705455570">स्लॉव्हेनियन कीबोर्ड</translation> <translation id="3340978935015468852">सेटिंग्ज</translation> <translation id="3341703758641437857">फाइल URL मध्ये प्रवेशास अनुमती द्या</translation> +<translation id="3343813173145836998">या डिव्हाइसवर सहज साइन इन करा</translation> <translation id="3344786168130157628">प्रवेशबिंदूचे नाव:</translation> <translation id="3345135638360864351">या साइटवर प्रवेश करण्याची आपली विनंती <ph name="NAME" /> कडे पाठविली जाऊ शकली नाही. कृपया पुन्हा प्रयत्न करा.</translation> <translation id="3345886924813989455">समर्थित ब्राउझर आढळला नाही</translation> @@ -2117,6 +2126,7 @@ <translation id="3996912167543967198">रीसेट करत आहे...</translation> <translation id="3997015411467176489">प्रायोगिक कॅनव्हास वैशिष्ट्ये</translation> <translation id="40027638859996362">शब्द हलविणे</translation> +<translation id="400554499662786523">ऑडिओ सामायिक करण्यासाठी, टॅब निवडा.</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" /> मधील प्रिंटर सेट अप करा किंवा व्यवस्थापित करा.</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />" दुरुस्त करायचे?</translation> <translation id="4018133169783460046"><ph name="PRODUCT_NAME" /> या भाषेत प्रदर्शित करा</translation> @@ -2218,6 +2228,7 @@ <translation id="4180788401304023883">CA प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" हटवायचे?</translation> <translation id="418179967336296930">रशियन ध्वन्यात्मक (YaZHert) कीबोर्ड</translation> <translation id="4181841719683918333">भाषा</translation> +<translation id="4187248015940562149">वेब Bluetooth सक्षम करते जे वेबसाइटना यास कनेक्ट करण्याची आणि आपल्या आसपासच्या Bluetooth डिव्हाइसेसना नियंत्रित करण्याची अनुमती देऊ शकते.</translation> <translation id="4188026131102273494">कीवर्ड:</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> विस्तार, हे सेटिंग नियंत्रित करत आहे.</translation> <translation id="4193154014135846272">Google दस्तऐवज</translation> @@ -2274,6 +2285,7 @@ <translation id="4268025649754414643">की एनसिफरमेन्ट</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">आवृत्ती <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">कोणत्याही जुळण्या नाहीत</translation> <translation id="4274187853770964845">समक्रमण त्रुटी: कृपया थांबा आणि समक्रमण रीस्टार्ट करा.</translation> <translation id="4275830172053184480">आपला डिव्हाइस रीस्टार्ट करा</translation> <translation id="4276796043975446927">मीटिंगसाठी Chromebox मध्ये आपले स्वागत आहे</translation> @@ -2343,6 +2355,7 @@ <translation id="4378551569595875038">कनेक्ट करीत आहे...</translation> <translation id="438122767399415311">UI दिशा निर्देशला सक्ती करा</translation> <translation id="4381849418013903196">अपूर्णविराम</translation> +<translation id="4383192539467954373">डिव्हाइसेवर स्वयंचलितपणे साइन इन करा</translation> <translation id="4384652540891215547">विस्तार सक्रिय करा</translation> <translation id="438503109373656455">Saratoga</translation> <translation id="4387554346626014084">अॅप लाँचर संकालन सक्षम करा. हे उपलब्ध असते तिथे फोल्डर सक्षम देखील करते (OSX नसलेले).</translation> @@ -2360,6 +2373,7 @@ <translation id="4421932782753506458">Fluffy</translation> <translation id="4422347585044846479">या पृष्ठासाठी बुकमार्क संपादित करा</translation> <translation id="4422428420715047158">डोमेन:</translation> +<translation id="4423482519432579560">&शब्दलेखन तपासणी</translation> <translation id="442477792133831654">जवळपासच्या डिव्हाइसेसशी संप्रेषण करा</translation> <translation id="4425149324548788773">माझा ड्राइव्ह</translation> <translation id="4428582326923056538">Adobe Flash Player कॅमेरा अपवाद भिन्न आहेत.</translation> @@ -2374,6 +2388,7 @@ <translation id="444267095790823769">संरक्षित सामग्री अपवाद</translation> <translation id="4443536555189480885">&मदत</translation> <translation id="4444304522807523469">USB द्वारा संलग्न केलेल्या किंवा स्थानिक नेटवर्कवरील दस्तऐवज स्कॅनरवर प्रवेश करा</translation> +<translation id="4445559854264555037">आपले डिव्हाइस दिसत नाही? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">मिरर केलेले</translation> <translation id="4447465454292850432">बॅटरी:</translation> <translation id="4449935293120761385">ऑटोफिल बद्दल</translation> @@ -2631,6 +2646,7 @@ <translation id="485316830061041779">जर्मन</translation> <translation id="4856478137399998590">आपली मोबाइल सेवा सक्रिय झाली आणि वापरण्यासाठी तयार आहे</translation> <translation id="4858913220355269194">फ्रिटझ</translation> +<translation id="4860565041166337978">लागू असेल तेव्हा सिस्टीम डाउनलोड व्यवस्थापकाद्वारे हाताळण्यासाठी डाउनलोडना अनुमती द्या.</translation> <translation id="48607902311828362">विमान मोड</translation> <translation id="4861833787540810454">&प्ले करा</translation> <translation id="4862050643946421924">डिव्हाइस जोडणे...</translation> @@ -2714,7 +2730,6 @@ <translation id="4977942889532008999">प्रवेश पुष्टी करा</translation> <translation id="4982718461356080574">स्टॅक केले असताना निष्क्रिय टॅबवरील बंद बटणे लपविणे</translation> <translation id="498294082491145744">कुकीज, JavaScript, प्लगिन, भौगोलिक स्थान, मायक्रोफोन, कॅमेरा इ. सारख्या वैशिष्ट्यांवरील वेबसाइटचे प्रवेश नियंत्रित करणार्या आपल्या सेटिंग्ज बदला.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">पृष्ठे</translation> <translation id="4988792151665380515">सार्वजनिक की निर्यात करण्यात अयशस्वी.</translation> <translation id="49896407730300355">घड्याळाच्या वि&रूद्ध दिशेने फिरवा</translation> @@ -2904,7 +2919,6 @@ <translation id="5268606875983318825">PPAPI (out-of-process)</translation> <translation id="526926484727016706">यामुळे डीफॉल्टनुसार नकार दिल्या जाणार्या सर्व iframes ना सर्व परवानग्या दिल्या जातात. iframe साठी विशिष्ट परवानग्यांना अनुमती देण्यामध्ये या परवानग्यांची नावे नवीन iframe वैशिष्ट्यांची मूल्ये म्हणून सूचीबद्ध करण्याचा समावेश असतो.</translation> <translation id="5269977353971873915">मुद्रण अयशस्वी</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" निवडलेल्या फोल्डरमधील प्रतिमा, व्हिडिओ आणि ध्वनी फायली आणि ध्वनी फायली वाचण्यात सक्षम असेल.</translation> <translation id="5271247532544265821">सरलीकृत/पारंपारिक चीनी मोड टॉगल करा</translation> <translation id="5271549068863921519">संकेतशब्द जतन करा</translation> <translation id="5273628206174272911">क्षैतिज ओव्हरस्क्रोलला प्रतिसाद म्हणून प्रायोगिक इतिहास नेव्हिगेशन.</translation> @@ -2941,6 +2955,7 @@ <translation id="5316716239522500219">मॉनिटर मिरर करा</translation> <translation id="5317780077021120954">जतन करा</translation> <translation id="5319782540886810524">लाट्वियन कीबोर्ड</translation> +<translation id="532247166573571973">सर्व्हर कदाचित आवाक्याबाहेर असू शकते. नंतर पुन्हा प्रयत्न करा.</translation> <translation id="5323213332664049067">लॅटिन अमेरिकन</translation> <translation id="532360961509278431">उघडण्यात अक्षम "$1": $2</translation> <translation id="5324674707192845912">आपण डिव्हाइस दूरस्थपणे शोधण्याची, पुसण्याची आणि लॉक करण्याची क्षमता अक्षम करण्याकरिता Google सह या <ph name="DEVICE_TYPE" /> ची नोंदणी जवळजवळ रद्द करणार आहात. यास रीबूटची आवश्यकता असेल. आपण सुरु ठेवू इच्छिता?</translation> @@ -2993,11 +3008,11 @@ <translation id="5390284375844109566">अनुक्रमित डेटाबेस</translation> <translation id="5392544185395226057">नेटिव्ह क्लायंटसाठी समर्थन सक्षम करा.</translation> <translation id="5393125431335030955">हे प्लगिन केवळ डेस्कटॉपवर कार्य करते.</translation> -<translation id="5393559999218790205">UI कम्पोझिटर अॅनिमेशन टाइमलाइन अक्षम करा</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> वरील <ph name="PEPPER_PLUGIN_NAME" />आपल्या संगणकावर प्रवेश करू इच्छिते.</translation> <translation id="539755880180803351">प्लेसहोल्डर मजकूर म्हणून स्वयंभरण फील्ड प्रकार अंदाजासह वेब फॉर्म वैयक्तिकृत करा. </translation> <translation id="5397578532367286026">या वापरकर्त्याच्या वापर आणि इतिहासाचे chrome.com वरील व्यवस्थापकाद्वारे (<ph name="MANAGER_EMAIL" />) पुनरावलोकन केले जाऊ शकते.</translation> <translation id="5397794290049113714">आपण</translation> +<translation id="5398572795982417028">निषिद्ध पृष्ठ संदर्भ, मर्यादा <ph name="MAXIMUM_PAGE" /> आहे</translation> <translation id="5398824043967640339">अन्य साइट वरील <ph name="COUNT" /></translation> <translation id="5399158067281117682">पिन जुळत नाहीत!</translation> <translation id="5400640815024374115">विश्वसनीय प्लॅटफॉर्म मॉड्यूल (TPM) चिप अक्षम किंवा अनुपस्थित आहे.</translation> @@ -3017,7 +3032,7 @@ <translation id="5423849171846380976">सक्रिय</translation> <translation id="5425470845862293575">प्रायोगिक DirectWrite फॉन्ट प्रस्तुती प्रणालीचा वापर सक्षम करते.</translation> <translation id="5425722269016440406">हे सेटिंग आपल्या फोनवर आणि अन्य डिव्हाइसेसवर संकालित केली असल्यामुळे Smart Lock बंद करण्यासाठी आपण ऑनलाइन असणे आवश्यक आहे. कृपया सर्वप्रथम एका नेटवर्कशी कनेक्ट करा.</translation> -<translation id="5426623592374109001">UI मधील कम्पोझिट केलेल्या अॅनिमेशनसाठी जुन्या अनाहूत अॅनिमेशन उपसिस्टीमचा वापर करा.</translation> +<translation id="5425863515030416387">डिव्हाइसेसवर स्वयंचलितपणे साइन इन करा</translation> <translation id="5427459444770871191">&घड्याळाच्या दिशेने फिरवा</translation> <translation id="5428105026674456456">स्पॅनिश</translation> <translation id="542872847390508405">आपण अतिथी म्हणून ब्राउझ करत आहात</translation> @@ -3042,6 +3057,7 @@ <translation id="5451646087589576080">फ्रेम &माहिती पहा</translation> <translation id="5453029940327926427">टॅब बंद करा</translation> <translation id="5453632173748266363">सीरिलिक</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> सह</translation> <translation id="5457113250005438886">अवैध</translation> <translation id="5457459357461771897">आपल्या संगणकावरील फोटो, संगीत आणि अन्य मीडिया वाचा आणि हटवा</translation> <translation id="5457599981699367932">अतिथी म्हणून ब्राउझ करा</translation> @@ -3211,7 +3227,6 @@ <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709885306771508267">पिंच स्केल</translation> <translation id="5710406368443808765">अरेरे! डिव्हाइस टोकन आणि ID संचयित करण्यात सिस्टीम अयशस्वी झाली.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> प्रतिसाद देत नाही. कास्ट करण्यात अक्षम.</translation> <translation id="5711983031544731014">अनलॉक करण्यात अक्षम. आपला संकेतशब्द प्रविष्ट करा.</translation> <translation id="5712966208980506909">सक्षम केल्यास, chrome://md-policy URL वस्तू डिझाइन धोरण पृष्ठ लोड करते.</translation> <translation id="5715711091495208045">प्लगिन ब्रोकर: <ph name="PLUGIN_NAME" /></translation> @@ -3478,7 +3493,6 @@ <translation id="6111974609785983504">डीफॉल्टद्वारे अनुमती दिली</translation> <translation id="6113134669445407638">WebRTC मधील अज्ञात AEC विलंब अक्षम करा. सिस्टीम विलंब खूप विश्वसनीय असल्याचा अहवाल दिलेला असल्यास किंवा इतरांना आपल्या मशीनवरून इको ऐकू येत असेल तरच वापरा.</translation> <translation id="6116921718742659598">भाषा आणि इनपुट सेटिंग्ज बदला</translation> -<translation id="6117536376248197233">प्रस्तुतकर्त्यांमधील कम्पोझिटर अॅनिमेशन टाइमलाइन अक्षम करा.</translation> <translation id="6120205520491252677">या पृष्ठास प्रारंभ स्क्रीनवर पिन करा...</translation> <translation id="6122081475643980456">आपले इंटरनेट कनेक्शन नियंत्रित केले जात आहे</translation> <translation id="6122093587541546701">ईमेल (पर्यायी):</translation> @@ -3510,6 +3524,7 @@ <translation id="6163522313638838258">सर्व विस्तृत करा...</translation> <translation id="6164005077879661055">एकदा हा पर्यवेक्षी वापरकर्ता काढल्यानंतर पर्यवेक्षी वापरकर्त्याशी संबद्ध सर्व फायली आणि स्थानिक डेटा कायमचा हटविला जाईल. या पर्यवेक्षी वापरकर्त्यासाठी भेट दिलेल्या वेबसाइट आणि सेटिंग्ज तरीही <ph name="MANAGEMENT_URL" /> वर व्यवस्थापकाद्वारे दृश्यमान असू शकतात.</translation> <translation id="6165508094623778733">अधिक जाणून घ्या</translation> +<translation id="6167008112175207002">आपले बुकमार्क, इतिहास, संकेतशब्द आणि इतर सेटिंग्ज आपल्या Google खात्यात संकालित केले जाईल जेणेकरून आपण आपल्या सर्व डिव्हाइसेसवर त्यांचा वापर करू शकाल. आपण <ph name="BEGIN_LINK" /> मध्ये हे बदलू शकता</translation> <translation id="6171550060231646388">बनावटी हार्डवेअर 'Ok Google' वैशिष्ट्ये</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">एक प्रमाणपत्र निवडा</translation> @@ -3714,6 +3729,7 @@ <translation id="648927581764831596">काहीही उपलब्ध नाही</translation> <translation id="6490936204492416398">वेब स्टोअरमधून नवीन स्थापित करा</translation> <translation id="6492313032770352219">डिस्कवरील आकार:</translation> +<translation id="6498249116389603658">&आपल्या सर्व भाषा</translation> <translation id="6499143127267478107">प्रॉक्सी स्क्रिप्टमध्ये होस्ट निराकरण करीत आहे...</translation> <translation id="6503077044568424649">सर्वाधिक भेट दिलेले</translation> <translation id="6503256918647795660">स्विस फ्रेंच कीबोर्ड</translation> @@ -3755,7 +3771,6 @@ <translation id="6555432686520421228">सर्व वापरकर्ता खाती काढा आणि आपला <ph name="IDS_SHORT_PRODUCT_NAME" /> डिव्हाइस अगदी नव्यासारखा सेट करा.</translation> <translation id="6556866813142980365">पुन्हा करा</translation> <translation id="6557565812667414268">केवळ उच्च-DPI प्रदर्शनांसाठी सक्षम केले</translation> -<translation id="655845594391856372">टॅब प्रतिसाद देत नाही. कास्ट करण्यात अक्षम.</translation> <translation id="6559580823502247193">(आधीपासून या डिव्हाइसवर)</translation> <translation id="6561726789132298588">प्रविष्ट करा</translation> <translation id="6562437808764959486">पुनर्प्राप्ती प्रतिमेचे अवतरण करत आहे...</translation> @@ -3856,6 +3871,7 @@ <translation id="6723354935081862304">Print to Google दस्तऐवज आणि इतर मेघ गंतव्यांचे मुद्रण करा. Google मेघ मुद्रणाचे मुद्रण करण्याकरिता <ph name="BEGIN_LINK" />साइन इन<ph name="END_LINK" /> करा.</translation> <translation id="6723661294526996303">बुकमार्क आणि सेटिंग्ज आयात करा</translation> <translation id="6723839937902243910">सामर्थ्य</translation> +<translation id="6725240607822645708">IME तिच्या स्वत:च्या थ्रेडवर चालवा.</translation> <translation id="6725970970008349185">प्रति पृष्ठ प्रदर्शित करण्यासाठी उमेदवारांची संख्या</translation> <translation id="672609503628871915">नवीन काय ते पहा</translation> <translation id="6727005317916125192">मागील उपखंड</translation> @@ -3986,12 +4002,11 @@ <translation id="6948736568813450284">विकासकांसाठी: Google Payments API कॉलसाठी सॅन्डबॉक्स सेवा वापरा.</translation> <translation id="6949306908218145636">उघडी पृष्ठे बुकमार्क करा...</translation> <translation id="695164542422037736">हा पर्याय सक्षम केला असल्यास आणि मुख्य भाग पार्श्वभूमी-संलग्नक:निश्चित शैलीसह असल्यास, पार्श्वभूमीस तिचा स्वतःचा संमिश्र केलेला स्तर असेल.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> आपले संकेतशब्द लक्षात ठेवते आणि या डिव्हाइसवर आपल्याला स्वयंचलितपणे साइटमध्ये साइन इन करते.</translation> <translation id="6955446738988643816">पॉपअपची तपासणी करा</translation> <translation id="695755122858488207">न निवडलेले रेडिओ बटण</translation> +<translation id="6960277925159781810">या डिव्हाइसवर स्वयंचलितपणे साइन इन करा</translation> <translation id="696036063053180184">3 सेट (शिफ्ट नाही)</translation> <translation id="696203921837389374">मोबाईल डेटावर संकालन सक्षम करा</translation> -<translation id="6964308487066031935">"<ph name="EXTENSION" />" मध्ये फोल्डर जोडायचे?</translation> <translation id="6965382102122355670">ठीक आहे</translation> <translation id="6965648386495488594">पोर्ट</translation> <translation id="6965978654500191972">डिव्हाइस</translation> @@ -4089,7 +4104,6 @@ <translation id="7076293881109082629">साइन इन करीत आहे</translation> <translation id="7077829361966535409">वर्तमान प्रॉक्सी सेटिंग्ज वापरून साइन-इन पृष्ठ लोड करण्यास अयशस्वी झाले. कृपया <ph name="GAIA_RELOAD_LINK_START" />पुन्हा साइन इन करण्याचा प्रयत्न करा<ph name="GAIA_RELOAD_LINK_END" />, किंवा भिन्न <ph name="PROXY_SETTINGS_LINK_START" />प्रॉक्सी सेटिंग्ज<ph name="PROXY_SETTINGS_LINK_END" /> वापरा.</translation> <translation id="7077872827894353012">दुर्लक्षित प्रोटोकॉल हँडलर</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" निवडलेल्या फोल्डरमधील प्रतिमा, व्हिडिओ आणि ध्वनी फायली वाचण्यास सक्षम होईल.</translation> <translation id="708060913198414444">ऑडिओ पत्ता कॉपी करा</translation> <translation id="708187310695946552">सत्र पुनर्संचयन फुगा UI</translation> <translation id="7082055294850503883">CapsLock स्थिती दुर्लक्षित करा आणि डीफॉल्टनुसार लोअरकेस इनपुट करा</translation> @@ -4233,6 +4247,8 @@ <translation id="7313804056609272439">व्हिएतनामी इनपुट पद्धत (व्हीएनआय)</translation> <translation id="7314244761674113881">सॉक्स होस्ट</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (वर्तमान)</translation> +<translation id="7321545336522791733">सर्व्हर आवाक्याबाहेर आहे</translation> +<translation id="7324841169865301118">डेस्कटॉप सामायिक करण्यासाठी वापरकर्त्यास सक्षम करते.</translation> <translation id="7325437708553334317">उच्च प्रखरता विस्तार</translation> <translation id="7326565110843845436">टचपॅड तीन-बोटांनी-क्लिक करणे</translation> <translation id="73289266812733869">न निवडलेले</translation> @@ -4458,7 +4474,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" "<ph name="EXTENSION_NAME" />" काढू इच्छित आहे.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> या भाषेत प्रदर्शित केले आहे</translation> <translation id="7654941827281939388">हे खाते या संगणकावर याआधीच वापरण्यात येत आहे.</translation> -<translation id="7655165758820095116">MediaSource ऑब्जेक्ट JavaScript ला थेट व्हिडिओ घटकावर मीडिया डेटा पाठविण्यास अनुमती देते.</translation> <translation id="7658239707568436148">रद्द करा</translation> <translation id="7659584679870740384">आपण हे डिव्हाइस वापरण्यासाठी प्राधिकृत नाही. कृपया साइन इन करण्याच्या परवानगीसाठी प्रशासकाशी संपर्क साधा.</translation> <translation id="7664620655576155379">असमर्थित Bluetooth डिव्हाइस: "<ph name="DEVICE_NAME" />".</translation> @@ -4589,6 +4604,7 @@ <translation id="7861215335140947162">&डाउनलोड</translation> <translation id="7864539943188674973">Bluetooth अक्षम करा</translation> <translation id="7868891395842935202">API प्रयोगांमधील प्रवेश नियंत्रित करण्यासाठी प्रायोगिक फ्रेमवर्क सक्षम करते.</translation> +<translation id="7870576007982733437">लागू असेल तेव्हा सिस्टीम डाउनलोड व्यवस्थापकाचा वापर करा.</translation> <translation id="7870790288828963061">नवीन आवृत्तीसह कोणतेही कियोस्क अॅप्स आढळले नाहीत. काहीही अद्यतनित करू नका. कृपया USB स्टिक काढा.</translation> <translation id="787150342916295244">क्रेडिट कार्ड स्कॅनिंग</translation> <translation id="7874357055309047713">नेहमी सर्व साइटवर चालवा</translation> @@ -4631,7 +4647,6 @@ <translation id="7918257978052780342">नोंदणी</translation> <translation id="7920092496846849526">या पृष्ठास भेट देणे ठीक आहे का हे आपण आपल्या पालकांना विचारले.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> साठी प्रतीक्षा करीत आहे...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> आपले संकेतशब्द लक्षात ठेवते आणि आपल्याला डिव्हाइसेसवर स्वयंचलितपणे अॅप्स आणि साइटमध्ये साइन इन करते.</translation> <translation id="7925686952655276919">समक्रमणासाठी मोबाइल डेटा वापरु नका</translation> <translation id="7926906273904422255">सुरक्षित नसलेले मूळ हे सुरक्षित-नसलेले म्हणून किंवा "अनिश्चित" म्हणून चिन्हांकित करा.</translation> <translation id="7928710562641958568">डिव्हाइस काढून टाका</translation> @@ -4693,7 +4708,6 @@ आपली की फाइल एका सुरक्षित ठिकाणी ठेवा. आपल्या विस्ताराच्या नवीन आवृत्या तयार करण्यासाठी आपल्याला त्याची आवश्यकता असेल.</translation> <translation id="799923393800005025">पाहू शकते</translation> <translation id="7999338963698132743">नवीन कार्य व्यवस्थापक</translation> -<translation id="8000004253404706714">प्रस्तुतकर्त्यांमधील कम्पोझिट केलेल्या अॅनिमेशनसाठी जुन्या अनाहूत अॅनिमेशन उपसिस्टीमचा वापर करा.</translation> <translation id="8004582292198964060">ब्राउझर</translation> <translation id="8007030362289124303">बॅटरी लो</translation> <translation id="8008356846765065031">इंटरनेट डिस्कनेक्ट झाले. कृपया आपले इंटरनेट कनेक्शन तपासा.</translation> @@ -4822,6 +4836,7 @@ <translation id="8185331656081929126">नेटवर्कवर नवीन प्रिंटर आढळतात तेव्हा सूचना दर्शवा</translation> <translation id="8186609076106987817">सर्व्हर फाइल शोधू शकले नाही.</translation> <translation id="8186706823560132848">सॉफ्टवेअर</translation> +<translation id="8188120771410500975">&मजकूर फील्डचे शब्दलेखन तपासा</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" />, आणि <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> इतर</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> सह कनेक्ट करत आहे</translation> <translation id="8191230140820435481">आपले अनुप्रयोग, विस्तार आणि थीम व्यवस्थापित करा</translation> @@ -5214,6 +5229,7 @@ <translation id="8765985713192161328">हँडलर व्यवस्थापित करा...</translation> <translation id="8766796754185931010">कोटोएरी</translation> <translation id="8767072502252310690">वापरकर्ते</translation> +<translation id="8768367823103160496">माऊस कर्सर लॉक</translation> <translation id="8769662576926275897">कार्ड तपशील</translation> <translation id="8770196827482281187">पर्शियन इनपुट पद्धत (ISIRI 2901 लेआउट)</translation> <translation id="8774934320277480003">शीर्ष समास</translation> @@ -5233,6 +5249,7 @@ <translation id="8795668016723474529">क्रेडिट कार्ड जोडा</translation> <translation id="8795916974678578410">नवीन विंडो</translation> <translation id="8798099450830957504">डीफॉल्ट</translation> +<translation id="8799127529310003270">सक्षम केले असल्यास, InputConnection कॉल IME थ्रेडवर चालतात आणि प्रतिकृती संपादक ठेवण्याऐवजी, प्रत्येक InputConnection कॉल थेटपणे प्रदान करणाऱ्याशी बोलेल.</translation> <translation id="8799839487311913894">"संकेतशब्द बदला" फॉर्म सबमिट केल्यानंतर संकेतशब्द व्यवस्थापकामध्ये संकेतशब्द अद्यतनित करणे सक्षम करा.</translation> <translation id="8800004011501252845">यासाठी गंतव्ये दर्शवत आहे</translation> <translation id="8800420788467349919">व्हॉल्यूम: <ph name="PRECENTAGE" />%</translation> @@ -5259,6 +5276,7 @@ <translation id="8841142799574815336">व्हिज्युअल व्ह्यूपोर्ट समाविष्ट करा.</translation> <translation id="884264119367021077">वहनावळ पत्ता</translation> <translation id="8844238624737526720">Chrome कार्य व्यवस्थापकाच्या नवीन आणि ऑप्टिमाइझ केलेल्या अंमलबजावणीचा वापर करा.</translation> +<translation id="8845001906332463065">मदत मिळवा</translation> <translation id="8846141544112579928">कीबोर्डचा शोध घेत आहे...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift की मोड स्विच</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 6031da1..b135c8a 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -192,7 +192,7 @@ <translation id="1290223615328246825">Log masuk automatik gagal</translation> <translation id="1293556467332435079">Fail</translation> <translation id="1294298200424241932">Edit tetapan kepercayaan:</translation> -<translation id="1295794900245526845">Pilih akaun anda yang disimpan dengan <ph name="PASSWORD_MANAGER_BRAND" /> untuk mengelog masuk</translation> +<translation id="1295794900245526845">Pilih akaun anda yang disimpan dengan <ph name="PASSWORD_MANAGER_BRAND" /> untuk log masuk</translation> <translation id="1297175357211070620">Destinasi</translation> <translation id="1297922636971898492">Google Drive tidak tersedia pada masa ini. Memuat naik akan dimulakan semula secara automatik sebaik sahaja Google Drive kembali.</translation> <translation id="1300861494336759522">Pengubahan hala carian desktop Windows</translation> @@ -292,6 +292,7 @@ <translation id="1434696352799406980">Ini akan menetapkan semula halaman permulaan, halaman tab baharu, enjin carian dan tab tersemat anda. Selain itu, semua sambungan akan dilumpuhkan dan data sementara seperti kuki akan dikosongkan. Sejarah penanda halaman anda dan kata laluan yang disimpan tidak akan dikosongkan.</translation> <translation id="1434886155212424586">Halaman utama ialah halaman Tab Baharu</translation> <translation id="1435550882135542937">Reka semula bar alat sambungan</translation> +<translation id="1436402875660227532">Nota: Tetapan ini tidak lagi digunakan pada sistem ini, tetapi anda masih boleh melihat dan mengeditnya.</translation> <translation id="1436784010935106834">Dibuang</translation> <translation id="1438632560381091872">Nyahredam tab</translation> <translation id="1441841714100794440">Papan kekunci bahasa Vietnam (Teleks)</translation> @@ -1317,6 +1318,7 @@ <translation id="2889064240420137087">Buka pautan dengan...</translation> <translation id="2889925978073739256">Teruskan menyekat pemalam tanpa kotak pasir</translation> <translation id="2890624088306605051">Dapatkan semula tetapan dan data yang disegerakkan sahaja</translation> +<translation id="2890678560483811744">Rujukan halaman di luar batasan</translation> <translation id="2893168226686371498">Penyemak imbas lalai</translation> <translation id="289426338439836048">Rangkaian mudah alih lain...</translation> <translation id="2894745200702272315">Membolehkan versi percubaan ciri pengesanan sebutan laluan 'Ok Google' yang mempunyai pergantungan perkakasan.</translation> @@ -1345,7 +1347,6 @@ <translation id="2925966894897775835">Helaian</translation> <translation id="2927017729816812676">Storan Cache</translation> <translation id="2927657246008729253">Tukar...</translation> -<translation id="2928415919076124714">Sembunyikan Bar Alat dalam Skrin Penuh</translation> <translation id="2928526264833629376">Terus ke Hangout</translation> <translation id="2930644991850369934">Terdapat masalah semasa muat turun imej pemulihan. Sambungan rangkaian hilang.</translation> <translation id="293111069139560936">Membenarkan rak meminimumkan tetingkap jika item rak yang diklik hanya mempunyai satu tetingkap telah aktif yang dikaitkan dengannya.</translation> @@ -1590,7 +1591,6 @@ <translation id="3289566588497100676">Input simbol mudah</translation> <translation id="3289856944988573801">Untuk menyemak kemas kini, sila gunakan Ethernet atau Wi-Fi.</translation> <translation id="3293325348208285494">Permulaan pantas</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" akan dapat membaca dan menulis fail imej, video dan bunyi dalam folder yang ditandakan.</translation> <translation id="3294437725009624529">Tetamu</translation> <translation id="329650768420594634">Amaran Sambungan Pek</translation> <translation id="3296763833017966289">Bahasa Georgia</translation> @@ -1648,6 +1648,7 @@ <translation id="3338239663705455570">Papan kekunci Slovenia</translation> <translation id="3340978935015468852">tetapan</translation> <translation id="3341703758641437857">Membenarkan akses ke URL fail</translation> +<translation id="3343813173145836998">Log masuk dengan mudah pada peranti ini</translation> <translation id="3344786168130157628">Nama titik capaian:</translation> <translation id="3345135638360864351">Permintaan anda untuk mengakses tapak web ini tidak boleh dihantar kepada <ph name="NAME" />. Sila cuba lagi.</translation> <translation id="3345886924813989455">Tiada penyemak imbas disokong yang ditemui</translation> @@ -2287,6 +2288,7 @@ <translation id="4268025649754414643">Encipherment Penting</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versi <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Tiada padanan</translation> <translation id="4274187853770964845">Ralat Penyegerakan: Sila berhenti dan mulakan semula Penyegerakan.</translation> <translation id="4275830172053184480">Mulakan semula peranti anda</translation> <translation id="4276796043975446927">Selamat datang ke Chromebox untuk mesyuarat</translation> @@ -2356,6 +2358,7 @@ <translation id="4378551569595875038">Menyambung...</translation> <translation id="438122767399415311">Paksa arah UI</translation> <translation id="4381849418013903196">Titik bertindih</translation> +<translation id="4383192539467954373">Log masuk secara automatik pada semua peranti</translation> <translation id="4384652540891215547">Aktifkan sambungan</translation> <translation id="438503109373656455">Saratoga</translation> <translation id="4387554346626014084">Dayakan penyegerakan Pelancar Apl. Ini turut mendayakan Folder, jika ada (bukan OSX).</translation> @@ -2388,6 +2391,7 @@ <translation id="444267095790823769">Pengecualian kandungan yang dilindungi</translation> <translation id="4443536555189480885">&Bantuan</translation> <translation id="4444304522807523469">Akses pengimbas dokumen yang disambungkan melalui USB atau pada rangkaian tempatan</translation> +<translation id="4445559854264555037">Tidak melihat peranti anda? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Dicerminkan</translation> <translation id="4447465454292850432">Bateri:</translation> <translation id="4449935293120761385">Mengenai Auto Isi</translation> @@ -2646,6 +2650,7 @@ <translation id="485316830061041779">Bahasa Jerman</translation> <translation id="4856478137399998590">Perkhidmatan data mudah alih anda diaktifkan dan sedia untuk digunakan</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">Benarkan muat turun dikendalikan oleh pengurus muat turun sistem jika bersesuaian.</translation> <translation id="48607902311828362">Mod kapal terbang</translation> <translation id="4861833787540810454">&Mainkan</translation> <translation id="4862050643946421924">Menambah peranti...</translation> @@ -2729,7 +2734,6 @@ <translation id="4977942889532008999">Sahkan Akses</translation> <translation id="4982718461356080574">Penyembunyian butang tutup pada tab tidak aktif apabila ditindan</translation> <translation id="498294082491145744">Ubah tetapan anda yang mengawal akses tapak web kepada ciri seperti kuki, JavaScript, pemalam, geolokasi, mikrofon, kamera, dsb.</translation> -<translation id="4984329823325527157">API Sumber Media</translation> <translation id="4988526792673242964">Halaman</translation> <translation id="4988792151665380515">Gagal intuk mengeksport kunci awam.</translation> <translation id="49896407730300355">Putar m&elawan arah jam</translation> @@ -2918,7 +2922,6 @@ <translation id="5268606875983318825">PPAPI (di luar proses)</translation> <translation id="526926484727016706">Menyebabkan semua iframe ditolak oleh semua kebenaran secara lalai. Tindakan membenarkan kebenaran tertentu untuk iframe mungkin melibatkan penyenaraian nama kebenaran ini sebagai nilai atribut iframe baharu.</translation> <translation id="5269977353971873915">Cetakan Gagal</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" akan dapat membaca fail imej, video dan bunyi dalam folder yang ditandakan.</translation> <translation id="5271247532544265821">Togol mod Bahasa Cina Mudah/Tradisional</translation> <translation id="5271549068863921519">Simpan kata laluan</translation> <translation id="5273628206174272911">Navigasi sejarah percubaan sebagai tindak balas kepada tatal lampau melintang.</translation> @@ -3008,11 +3011,11 @@ <translation id="5390284375844109566">Pangkalan data berindeks</translation> <translation id="5392544185395226057">Dayakan sokongan untuk Pelanggan Asli.</translation> <translation id="5393125431335030955">Pemalam ini hanya berfungsi pada desktop.</translation> -<translation id="5393559999218790205">Lumpuhkan garis masa animasi pengatur huruf UI</translation> <translation id="5396126354477659676">Pemalam <ph name="PEPPER_PLUGIN_NAME" /> di <ph name="PEPPER_PLUGIN_DOMAIN" /> ingin mengakses komputer anda.</translation> <translation id="539755880180803351">Mencatatkan borang web dengan ramalan jenis medan Auto Isi sebagai teks pemegang tempat.</translation> <translation id="5397578532367286026">Penggunaan dan sejarah pengguna ini boleh disemak oleh pengurus (<ph name="MANAGER_EMAIL" />) di chrome.com.</translation> <translation id="5397794290049113714">Anda</translation> +<translation id="5398572795982417028">Rujukan halaman di luar batasan, hadnya adalah <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> daripada tapak lain</translation> <translation id="5399158067281117682">PIN tidak sepadan!</translation> <translation id="5400640815024374115">Cip Modul Platform Dipercayai (TPM) dilumpuhkan atau tiada.</translation> @@ -3032,7 +3035,7 @@ <translation id="5423849171846380976">Diaktifkan</translation> <translation id="5425470845862293575">Dayakan penggunakan sistem pemaparan fon DirectWrite percubaan.</translation> <translation id="5425722269016440406">Anda mesti berada dalam talian untuk mematikan Smart Lock kerana tetapan ini disegerakkan ke telefon anda dan peranti lain. Sila bersambung kepada rangkaian dahulu.</translation> -<translation id="5426623592374109001">Gunakan subsistem animasi intrusif lama untuk animasi gubahan dalam UI.</translation> +<translation id="5425863515030416387">Log masuk dengan mudah pada semua peranti</translation> <translation id="5427459444770871191">Putar &Ikut Arah Jam</translation> <translation id="5428105026674456456">Bahasa Sepanyol</translation> <translation id="542872847390508405">Anda menyemak imbas sebagai Tetamu</translation> @@ -3227,7 +3230,6 @@ <translation id="5708171344853220004">Nama Utama Microsoft</translation> <translation id="5709885306771508267">Skala Cubitan</translation> <translation id="5710406368443808765">Op! Sistem gagal menyimpan token dan ID peranti.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> tidak bertindak balas. Tidak dapat menghantar.</translation> <translation id="5711983031544731014">Tidak dapat membuka kunci. Masukkan kata laluan anda.</translation> <translation id="5712966208980506909">Jika didayakan, URL chrome://md-policy memuatkan halaman dasar Reka Bentuk Bahan.</translation> <translation id="5715711091495208045">Broker Pemalam: <ph name="PLUGIN_NAME" /></translation> @@ -3494,7 +3496,6 @@ <translation id="6111974609785983504">Dibenarkan secara lalai</translation> <translation id="6113134669445407638">Lumpuhkan Delay Agnostic AEC dalam WebRTC. Gunakan jika kelengahan sistem yang dilaporkan adalah amat dipercayai atau jika yang lain mengalami gema daripada mesin anda.</translation> <translation id="6116921718742659598">Tukar tetapan bahasa dan input</translation> -<translation id="6117536376248197233">Lumpuhkan garis masa animasi pengatur huruf dalam pemapar.</translation> <translation id="6120205520491252677">Pin halaman ini pada skrin Mula...</translation> <translation id="6122081475643980456">Sambungan Internet anda sedang dikawal</translation> <translation id="6122093587541546701">E-mel (pilihan):</translation> @@ -3526,6 +3527,7 @@ <translation id="6163522313638838258">Kembangkan semua...</translation> <translation id="6164005077879661055">Semua fail dan data setempat yang dikaitkan dengan pengguna diselia akan dipadamkan secara kekal apabila pengguna diselia ini dialih keluar. Tapak web yang dilawati dan tetapan untuk pengguna diselia ini masih boleh dilihat oleh pengurus di <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Ketahui lebih lanjut</translation> +<translation id="6167008112175207002">Penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan disegerakkan ke Akaun Google supaya anda dapat menggunakannya pada semua peranti. Anda boleh mengubahnya di <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Ciri "Ok Google" perkakasan tersimulasi</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">Pilih sijil</translation> @@ -3771,7 +3773,6 @@ <translation id="6555432686520421228">Alih keluar semua akaun pengguna dan tetapkan semula peranti <ph name="IDS_SHORT_PRODUCT_NAME" /> anda menjadi seperti baharu.</translation> <translation id="6556866813142980365">Buat semula</translation> <translation id="6557565812667414268">Dayakan hanya untuk paparan DPI tinggi</translation> -<translation id="655845594391856372">Tab tidak bertindak balas. Tidak dapat menghantar.</translation> <translation id="6559580823502247193">(sudah ada pada peranti ini)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Mendapatkan imej pemulihan...</translation> @@ -3872,6 +3873,7 @@ <translation id="6723354935081862304">Cetak ke Dokumen Google dan destinasi awan yang lain. <ph name="BEGIN_LINK" />Log masuk<ph name="END_LINK" /> untuk mencetak ke Cetakan Awan Google.</translation> <translation id="6723661294526996303">Import penanda halaman dan tetapan...</translation> <translation id="6723839937902243910">Kuasa</translation> +<translation id="6725240607822645708">Jalankan IME pada urutannya sendiri.</translation> <translation id="6725970970008349185">Bilangan calon untuk dipaparkan bagi setiap halaman</translation> <translation id="672609503628871915">Lihat apa yang baharu</translation> <translation id="6727005317916125192">Anak tetingkap sebelumnya</translation> @@ -4003,12 +4005,11 @@ <translation id="6948736568813450284">Untuk pembangun: gunakan perkhidmatan kotak pasir untuk panggilan API Google Payments.</translation> <translation id="6949306908218145636">Tandakan Halaman Terbuka...</translation> <translation id="695164542422037736">Jika pilihan ini didayakan, dan jika isi digayakan dengan background-attachment:fixed, latar belakang tersebut akan mempunyai lapisan gubahannya sendiri.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> ingat kata laluan anda dan log masuk anda ke tapak secara automatik pada peranti ini.</translation> <translation id="6955446738988643816">Semak Pop Timbul</translation> <translation id="695755122858488207">Butang radio tidak dipilih</translation> +<translation id="6960277925159781810">Log masuk secara automatik pada peranti ini</translation> <translation id="696036063053180184">3 Set (Tiada peralihan)</translation> <translation id="696203921837389374">Dayakan penyegerakan melalui data mudah alih</translation> -<translation id="6964308487066031935">Tambahkan folder ke "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Peranti</translation> @@ -4106,7 +4107,6 @@ <translation id="7076293881109082629">Melog masuk</translation> <translation id="7077829361966535409">Halaman log masuk gagal dimuatkan menggunakan tetapan proksi semasa. Sila <ph name="GAIA_RELOAD_LINK_START" />cuba log masuk sekali lagi<ph name="GAIA_RELOAD_LINK_END" /> atau gunakan <ph name="PROXY_SETTINGS_LINK_START" />tetapan proksi<ph name="PROXY_SETTINGS_LINK_END" /> yang berbeza.</translation> <translation id="7077872827894353012">Pengendali protokol diabaikan</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" akan dapat membaca dan memadamkan fail imej, video dan bunyi dalam folder yang ditandakan.</translation> <translation id="708060913198414444">S&alin alamat audio</translation> <translation id="708187310695946552">UI gelembung pemulihan sesi</translation> <translation id="7082055294850503883">Abaikan status CapsLock dan input huruf kecil secara lalai</translation> @@ -4250,7 +4250,7 @@ <translation id="7313804056609272439">Kaedah input bahasa Vietnam (VNI)</translation> <translation id="7314244761674113881">Hos SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (semasa)</translation> -<translation id="7321545336522791733">Server tidak dapat dihubungi</translation> +<translation id="7321545336522791733">Pelayan tidak dapat dihubungi</translation> <translation id="7324841169865301118">Membolehkan pengguna memilih tab untuk perkongsian desktop.</translation> <translation id="7325437708553334317">Sambungan Kontras Tinggi</translation> <translation id="7326565110843845436">Klik tiga jari pad sentuh</translation> @@ -4477,7 +4477,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" ingin mengalih keluar "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> dipaparkan dalam bahasa ini</translation> <translation id="7654941827281939388">Akaun ini telah digunakan pada komputer ini.</translation> -<translation id="7655165758820095116">Objek MediaSource membenarkan JavaScript menghantar data media secara terus kepada unsur video.</translation> <translation id="7658239707568436148">Batal</translation> <translation id="7659584679870740384">Anda tiada kebenaran untuk menggunakan peranti ini. Sila hubungi pentadbir untuk mendapatkan kebenaran log masuk.</translation> <translation id="7664620655576155379">Peranti Bluetooth tidak disokong: "<ph name="DEVICE_NAME" />".</translation> @@ -4608,6 +4607,7 @@ <translation id="7861215335140947162">&Muat turun</translation> <translation id="7864539943188674973">Lumpuhkan Bluetooth</translation> <translation id="7868891395842935202">Mendayakan Rangka Kerja Percubaan untuk mengawal akses kepada eksperimen API.</translation> +<translation id="7870576007982733437">Gunakan pengurus muat turun sistem jika bersesuaian.</translation> <translation id="7870790288828963061">Tiada apl Kiosk dengan versi lebih baharu dijumpai. Tiada apa-apa untuk dikemas kini. Sila alih keluar batang USB.</translation> <translation id="787150342916295244">Pengimbasan kad kredit</translation> <translation id="7874357055309047713">Sentiasa jalankan pada semua tapak</translation> @@ -4650,7 +4650,6 @@ <translation id="7918257978052780342">Daftar</translation> <translation id="7920092496846849526">Anda telah bertanya kepada ibu bapa anda sama ada ok untuk melawat halaman ini.</translation> <translation id="7925285046818567682">Menunggu untuk <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> ingat kata laluan anda dan log masuk anda ke apl dan tapak secara automatik pada pelbagai peranti.</translation> <translation id="7925686952655276919">Jangan gunakan data mudah alih untuk penyegerakan</translation> <translation id="7926906273904422255">Tandai asal tidak selamat sebagai tidak selamat atau sebagai "meragukan".</translation> <translation id="7928710562641958568">Keluarkan peranti</translation> @@ -4712,7 +4711,6 @@ Simpan fail kunci anda di tempat selamat. Anda akan memerlukannya untuk mencipta versi baharu sambungan anda.</translation> <translation id="799923393800005025">Boleh lihat</translation> <translation id="7999338963698132743">Pengurus tugas baharu</translation> -<translation id="8000004253404706714">Gunakan subsistem animasi intrusif lama untuk animasi gubahan dalam pemapar.</translation> <translation id="8004582292198964060">Penyemak Imbas</translation> <translation id="8007030362289124303">Bateri Lemah</translation> <translation id="8008356846765065031">Internet terputus sambungan. Sila periksa sambungan internet anda.</translation> @@ -5236,6 +5234,7 @@ <translation id="8765985713192161328">Uruskan pengendali...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Pengguna</translation> +<translation id="8768367823103160496">Kunci kursor tetikus</translation> <translation id="8769662576926275897">Butiran kad</translation> <translation id="8770196827482281187">Kaedah input Persia (bentangan ISIRI 2901)</translation> <translation id="8774934320277480003">Jidar atas</translation> @@ -5255,6 +5254,7 @@ <translation id="8795668016723474529">Tambah kad kredit</translation> <translation id="8795916974678578410">Tetingkap Baharu</translation> <translation id="8798099450830957504">Lalai</translation> +<translation id="8799127529310003270">Jika didayakan, panggilan InputConnection akan berjalan pada urutan IME dan setiap panggilan InputConnection yang sepatutnya mengekalkan editor replika, akan berkomunikasi secara terus kepada pemapar.</translation> <translation id="8799839487311913894">Dayakan pengemaskinian kata laluan dalam pengurus kata laluan selepas menyerahkan borang "tukar kata laluan".</translation> <translation id="8800004011501252845">Menunjukkan destinasi untuk</translation> <translation id="8800420788467349919">Kelantangan: <ph name="PRECENTAGE" />%</translation> @@ -5280,6 +5280,7 @@ <translation id="8841142799574815336">Port pandang visual lengai.</translation> <translation id="884264119367021077">Alamat penghantaran</translation> <translation id="8844238624737526720">Gunakan pelaksanaan pengurus tugas chrome yang baharu dan dioptimumkan.</translation> +<translation id="8845001906332463065">Dapatkan bantuan</translation> <translation id="8846141544112579928">Mencari papan kekunci...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Suis mod kekunci anjak</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 73b7fa49..9269fdb 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">Hiermee worden je startpagina, nieuwe tabbladpagina, zoekmachine en vastgezette tabbladen opnieuw ingesteld. Ook worden alle extensies uitgeschakeld en tijdelijke gegevens (zoals cookies) gewist. Je bladwijzers, geschiedenis en opgeslagen wachtwoorden worden niet gewist.</translation> <translation id="1434886155212424586">Startpagina is de nieuwe tabbladpagina</translation> <translation id="1435550882135542937">Nieuw ontwerp van de extensiewerkbalk</translation> +<translation id="1436402875660227532">Opmerking: Deze instellingen worden niet meer gebruikt voor dit systeem. Je kunt ze echter nog steeds bekijken en bewerken.</translation> <translation id="1436784010935106834">Verwijderd</translation> <translation id="1438632560381091872">Dempen tabbladen opheffen</translation> <translation id="1441841714100794440">Vietnamees toetsenbord (Telex)</translation> @@ -1317,6 +1318,7 @@ <translation id="2889064240420137087">Link openen met...</translation> <translation id="2889925978073739256">Plug-ins zonder sandbox blijven blokkeren</translation> <translation id="2890624088306605051">Alleen gesynchroniseerde instellingen en gegevens ophalen</translation> +<translation id="2890678560483811744">Paginaverwijzing valt buiten bereik</translation> <translation id="2893168226686371498">Standaardbrowser</translation> <translation id="289426338439836048">Ander mobiel netwerk...</translation> <translation id="2894745200702272315">Schakelt een experimentele versie van de detectiefuncties voor het hotword "Ok Google" in die hardware-afhankelijk zijn.</translation> @@ -1345,7 +1347,6 @@ <translation id="2925966894897775835">Bladen</translation> <translation id="2927017729816812676">Cache-opslag</translation> <translation id="2927657246008729253">Wijzigen...</translation> -<translation id="2928415919076124714">Werkbalk verbergen in modus Volledig scherm</translation> <translation id="2928526264833629376">Doorgaan naar Hangouts</translation> <translation id="2930644991850369934">Er is een probleem opgetreden tijdens het downloaden van de herstelkopie. De netwerkverbinding is verbroken.</translation> <translation id="293111069139560936">Toestaan dat de plank een venster minimaliseert als er op een item op de plank wordt geklikt waaraan slechts één venster is gekoppeld dat al actief is.</translation> @@ -1590,7 +1591,6 @@ <translation id="3289566588497100676">Eenvoudige invoer van symbolen</translation> <translation id="3289856944988573801">Gebruik Ethernet of wifi om op updates te controleren.</translation> <translation id="3293325348208285494">Snelle start</translation> -<translation id="3293894718455402932">'<ph name="EXTENSION" />' kan afbeeldingen, video's en geluidsbestanden in de aangevinkte mappen lezen en schrijven.</translation> <translation id="3294437725009624529">Gast</translation> <translation id="329650768420594634">Waarschuwing over pakketextensie</translation> <translation id="3296763833017966289">Georgisch</translation> @@ -1648,6 +1648,7 @@ <translation id="3338239663705455570">Sloveens toetsenbord</translation> <translation id="3340978935015468852">instellingen</translation> <translation id="3341703758641437857">Toegang tot bestand-URL's toestaan</translation> +<translation id="3343813173145836998">Gemakkelijk inloggen bij dit apparaat</translation> <translation id="3344786168130157628">Naam van toegangspunt:</translation> <translation id="3345135638360864351">Je verzoek om toegang tot deze site kan niet worden verzonden naar <ph name="NAME" />. Probeer het opnieuw.</translation> <translation id="3345886924813989455">Er is geen ondersteunde browser gevonden</translation> @@ -2287,6 +2288,7 @@ <translation id="4268025649754414643">Sleutelcodering</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versie <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Geen overeenkomsten</translation> <translation id="4274187853770964845">Synchronisatiefout: stop de synchronisatie en start deze opnieuw.</translation> <translation id="4275830172053184480">Je apparaat opnieuw opstarten</translation> <translation id="4276796043975446927">Welkom bij Chromebox for meetings</translation> @@ -2356,6 +2358,7 @@ <translation id="4378551569595875038">Verbinden...</translation> <translation id="438122767399415311">Richting van gebruikersinterface afdwingen</translation> <translation id="4381849418013903196">Dubbele punt</translation> +<translation id="4383192539467954373">Automatisch inloggen bij verschillende apparaten</translation> <translation id="4384652540891215547">Activeer de extensie</translation> <translation id="438503109373656455">Salinero</translation> <translation id="4387554346626014084">Synchronisatie van App Launcher inschakelen. Dit schakelt indien beschikbaar ook 'Mappen' in (niet OSX).</translation> @@ -2388,6 +2391,7 @@ <translation id="444267095790823769">Uitzonderingen voor beveiligde inhoud</translation> <translation id="4443536555189480885">&Help</translation> <translation id="4444304522807523469">Toegang tot documentscanners die zijn aangesloten via USB of die zich op het lokale netwerk bevinden</translation> +<translation id="4445559854264555037">Wordt je apparaat niet weergegeven? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Gespiegeld</translation> <translation id="4447465454292850432">Accu:</translation> <translation id="4449935293120761385">Over Automatisch aanvullen</translation> @@ -2645,6 +2649,7 @@ <translation id="485316830061041779">Duits</translation> <translation id="4856478137399998590">Je mobiele netwerk is actief en klaar voor gebruik</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">Toestaan dat downloads indien van toepassing worden verwerkt door de functie voor downloadbeheer van het systeem.</translation> <translation id="48607902311828362">Vliegtuigmodus</translation> <translation id="4861833787540810454">Afs&pelen</translation> <translation id="4862050643946421924">Apparaat toevoegen...</translation> @@ -2728,7 +2733,6 @@ <translation id="4977942889532008999">Toegang bevestigen</translation> <translation id="4982718461356080574">Knoppen voor het sluiten van inactieve tabbladen verbergen wanneer tabbladen worden gestapeld</translation> <translation id="498294082491145744">Je instellingen wijzigen die de toegang van websites bepalen tot functies zoals cookies, JavaScript, plug-ins, geografische locatie, microfoon, camera, enzovoort</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Pagina's</translation> <translation id="4988792151665380515">Exporteren van openbare sleutel is mislukt.</translation> <translation id="49896407730300355">Linksom &draaien</translation> @@ -2916,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (out-of-process)</translation> <translation id="526926484727016706">Hiermee worden alle rechten voor iframes standaard afgewezen. Voor het toestaan van bepaalde rechten voor een iframe moeten de namen van deze rechten mogelijk als waarden van nieuwe iframe-kenmerken worden vermeld.</translation> <translation id="5269977353971873915">Afdrukken mislukt</translation> -<translation id="5270884342523754894">'<ph name="EXTENSION" />' kan afbeeldingen, video's en geluidsbestanden in de aangevinkte mappen lezen.</translation> <translation id="5271247532544265821">Schakelen tussen Vereenvoudigd en Traditioneel Chinees</translation> <translation id="5271549068863921519">Wachtwoord opslaan</translation> <translation id="5273628206174272911">Experimentele geschiedenisnavigatie in reactie op horizontaal overscrollen.</translation> @@ -3006,11 +3009,11 @@ <translation id="5390284375844109566">Geïndexeerde database</translation> <translation id="5392544185395226057">Ondersteuning voor systeemeigen client inschakelen.</translation> <translation id="5393125431335030955">Deze plug-in werkt alleen op het bureaublad.</translation> -<translation id="5393559999218790205">Animatietijdlijnen voor UI-samensteller uitschakelen</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> op <ph name="PEPPER_PLUGIN_DOMAIN" /> vraagt om toegang tot je computer.</translation> <translation id="539755880180803351">Annoteert webformulieren met tijdelijke tekst als deze velden bevatten die automatisch kunnen worden ingevuld.</translation> <translation id="5397578532367286026">Het gebruik en de geschiedenis van deze gebruiker kunnen worden bekeken door de beheerder (<ph name="MANAGER_EMAIL" />) op chrome.com.</translation> <translation id="5397794290049113714">Jij</translation> +<translation id="5398572795982417028">Paginaverwijzing valt buiten bereik, limiet is <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> van andere sites</translation> <translation id="5399158067281117682">Pincodes komen niet overeen!</translation> <translation id="5400640815024374115">TPM-chip (Trusted Platform Module) is uitgeschakeld of ontbreekt.</translation> @@ -3030,7 +3033,7 @@ <translation id="5423849171846380976">Geactiveerd</translation> <translation id="5425470845862293575">Schakelt het gebruik van het experimentele DirectWrite-weergavesysteem voor lettertypen in.</translation> <translation id="5425722269016440406">Je moet online zijn om Smart Lock uit te schakelen, omdat deze instelling wordt gesynchroniseerd met je telefoon en andere apparaten. Maak eerst verbinding met een netwerk.</translation> -<translation id="5426623592374109001">Het oude, storende animatiesubsysteem voor samengestelde animaties gebruiken in de UI.</translation> +<translation id="5425863515030416387">Gemakkelijk inloggen bij apparaten</translation> <translation id="5427459444770871191">Rechtsom &draaien</translation> <translation id="5428105026674456456">Spaans</translation> <translation id="542872847390508405">Je browst momenteel als gast</translation> @@ -3225,7 +3228,6 @@ <translation id="5708171344853220004">Principal-naam van Microsoft</translation> <translation id="5709885306771508267">Schaal voor samenknijpen</translation> <translation id="5710406368443808765">Het opslaan van de apparaattoken en ID is mislukt.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> reageert niet. Kan niet casten.</translation> <translation id="5711983031544731014">Kan niet ontgrendelen. Geef je wachtwoord op.</translation> <translation id="5712966208980506909">Als deze instelling is ingeschakeld, wordt met de URL chrome://md-policy de beleidspagina voor Material Design geladen.</translation> <translation id="5715711091495208045">Plug-inbroker: <ph name="PLUGIN_NAME" /></translation> @@ -3494,7 +3496,6 @@ <translation id="6111974609785983504">Standaard toegestaan</translation> <translation id="6113134669445407638">Delay Agnostic AEC in WebRTC uitschakelen. Gebruik dit als gemelde systeemvertragingen zeer vertrouwd zijn of als anderen echo's ondervinden van je computer.</translation> <translation id="6116921718742659598">Taal- en invoerinstellingen wijzigen</translation> -<translation id="6117536376248197233">Animatietijdlijnen voor samensteller uitschakelen in weergaveprogramma's.</translation> <translation id="6120205520491252677">Deze pagina vastzetten op het startscherm...</translation> <translation id="6122081475643980456">Je internetverbinding wordt beheerd</translation> <translation id="6122093587541546701">E-mailadres (optioneel):</translation> @@ -3526,6 +3527,7 @@ <translation id="6163522313638838258">Alles uitvouwen...</translation> <translation id="6164005077879661055">Alle bestanden en lokale gegevens gekoppeld aan de gebruiker met beperkte rechten worden permanent verwijderd zodra de gebruiker met beperkte rechten is verwijderd. Bezochte websites en instellingen voor deze gebruiker met beperkte rechten kunnen nog steeds zichtbaar zijn voor de beheerder op <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Meer informatie</translation> +<translation id="6167008112175207002">Je bladwijzers, geschiedenis, wachtwoorden en andere instellingen worden gesynchroniseerd met je Google-account, zodat je ze op al je apparaten kunt gebruiken. Je kunt dit wijzigen in <ph name="BEGIN_LINK" />.</translation> <translation id="6171550060231646388">Gesimuleerde hardware voor 'Ok Google'-functies</translation> <translation id="6175314957787328458">Microsoft-domein-GUID</translation> <translation id="6178664161104547336">Een certificaat selecteren</translation> @@ -3771,7 +3773,6 @@ <translation id="6555432686520421228">Alle gebruikersaccounts verwijderen en je <ph name="IDS_SHORT_PRODUCT_NAME" />-apparaat opnieuw instellen.</translation> <translation id="6556866813142980365">Opnieuw</translation> <translation id="6557565812667414268">Alleen ingeschakeld voor hoge DPI-displays</translation> -<translation id="655845594391856372">Tabblad reageert niet. Kan niet casten.</translation> <translation id="6559580823502247193">(al ingesteld op dit apparaat)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Herstelkopie uitpakken...</translation> @@ -3872,6 +3873,7 @@ <translation id="6723354935081862304">Afdrukken naar Google Documenten en andere cloudbestemmingen. <ph name="BEGIN_LINK" />Inloggen<ph name="END_LINK" /> om af te drukken naar Google Cloudprinter.</translation> <translation id="6723661294526996303">Bladwijzers en instellingen importeren...</translation> <translation id="6723839937902243910">Voeding</translation> +<translation id="6725240607822645708">IME uitvoeren in een eigen thread.</translation> <translation id="6725970970008349185">Aantal kandidaten dat per pagina wordt weergegeven</translation> <translation id="672609503628871915">Wat is er nieuw?</translation> <translation id="6727005317916125192">Vorig venster</translation> @@ -4002,12 +4004,11 @@ <translation id="6948736568813450284">Voor ontwikkelaars: gebruik de sandboxservice voor Google Payments API-aanroepen.</translation> <translation id="6949306908218145636">Bladwijzer toevoegen voor geopende pagina's...</translation> <translation id="695164542422037736">Als deze optie is ingeschakeld en als de hoofdtekst is gestileerd met background-attachment:fixed, heeft de achtergrond een eigen samengestelde laag.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> onthoudt je wachtwoorden en logt je automatisch in op dit apparaat.</translation> <translation id="6955446738988643816">Pop-up controleren</translation> <translation id="695755122858488207">Niet-geselecteerd keuzerondje</translation> +<translation id="6960277925159781810">Automatisch inloggen bij dit apparaat</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Synchroniseren via mobiele gegevens inschakelen</translation> -<translation id="6964308487066031935">Mappen toevoegen aan '<ph name="EXTENSION" />'?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Poort</translation> <translation id="6965978654500191972">Apparaat</translation> @@ -4108,7 +4109,6 @@ <translation id="7076293881109082629">Inloggen</translation> <translation id="7077829361966535409">De inlogpagina kan niet worden geladen met de huidige proxyinstellingen. <ph name="GAIA_RELOAD_LINK_START" />Probeer opnieuw in te loggen<ph name="GAIA_RELOAD_LINK_END" /> of gebruik andere <ph name="PROXY_SETTINGS_LINK_START" />proxyinstellingen<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Genegeerde protocolhandlers</translation> -<translation id="7079038783243627996">'<ph name="EXTENSION" />' kan afbeeldingen, video's en geluidsbestanden in de aangevinkte mappen lezen en verwijderen.</translation> <translation id="708060913198414444">Adres van audio k&opiëren</translation> <translation id="708187310695946552">Sessie herstelgebruikersinterface in ballon</translation> <translation id="7082055294850503883">Status van Caps Lock negeren en tekst standaard in kleine letters invoeren</translation> @@ -4480,7 +4480,6 @@ <translation id="7650511557061837441">'<ph name="TRIGGERING_EXTENSION_NAME" />' wil '<ph name="EXTENSION_NAME" />' verwijderen.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> wordt weergegeven in deze taal</translation> <translation id="7654941827281939388">Dit account wordt al gebruikt op deze computer.</translation> -<translation id="7655165758820095116">Het MediaSource-object staat JavaScript toe mediagegevens rechtstreeks naar een video-element te verzenden.</translation> <translation id="7658239707568436148">Annuleren</translation> <translation id="7659584679870740384">Je beschikt niet over de rechten om dit apparaat te gebruiken. Neem contact op met de beheerder voor toestemming om in te loggen.</translation> <translation id="7664620655576155379">Niet-ondersteund Bluetooth-apparaat: '<ph name="DEVICE_NAME" />'.</translation> @@ -4611,6 +4610,7 @@ <translation id="7861215335140947162">&Downloads</translation> <translation id="7864539943188674973">Bluetooth uitschakelen</translation> <translation id="7868891395842935202">Hiermee wordt het experimentele framework ingeschakeld voor het beheren van toegang tot API-experimenten.</translation> +<translation id="7870576007982733437">De functie voor downloadbeheer van het systeem gebruiken indien van toepassing.</translation> <translation id="7870790288828963061">Er zijn geen Kiosk-apps met een nieuwere versie gevonden. Er is niets om te updaten. Verwijder de USB-stick.</translation> <translation id="787150342916295244">Creditcard scannen</translation> <translation id="7874357055309047713">Altijd uitvoeren voor alle sites</translation> @@ -4653,7 +4653,6 @@ <translation id="7918257978052780342">Aanmelden</translation> <translation id="7920092496846849526">Je hebt je vader of moeder gevraagd of je deze pagina mag bezoeken.</translation> <translation id="7925285046818567682">Wachten op <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> onthoudt je wachtwoorden en logt je automatisch in bij apps en sites op verschillende apparaten.</translation> <translation id="7925686952655276919">Geen mobiele gegevens gebruiken voor synchronisatie</translation> <translation id="7926906273904422255">Niet-beveiligde beginpunten markeren als niet-veilig of 'verdacht'.</translation> <translation id="7928710562641958568">Apparaat uitwerpen</translation> @@ -4715,7 +4714,6 @@ Bewaar je sleutelbestand op een veilige plaats. Je hebt het bestand nodig om nieuwe versies van je extensie te maken.</translation> <translation id="799923393800005025">Kan weergeven</translation> <translation id="7999338963698132743">Nieuw Taakbeheer</translation> -<translation id="8000004253404706714">Het oude, storende animatiesubsysteem voor samengestelde animaties gebruiken in weergaveprogramma's.</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8007030362289124303">Accu is bijna leeg</translation> <translation id="8008356846765065031">Verbinding met internet verbroken. Controleer je internetverbinding.</translation> @@ -5240,6 +5238,7 @@ <translation id="8765985713192161328">Handlers beheren...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Gebruikers</translation> +<translation id="8768367823103160496">Vergrendeling van muisaanwijzer</translation> <translation id="8769662576926275897">Kaartdetails</translation> <translation id="8770196827482281187">Perzische invoermethode (indeling ISIRI 2901)</translation> <translation id="8774934320277480003">Marge bovenkant</translation> @@ -5259,6 +5258,7 @@ <translation id="8795668016723474529">Een creditcard toevoegen</translation> <translation id="8795916974678578410">Nieuw venster</translation> <translation id="8798099450830957504">Standaard</translation> +<translation id="8799127529310003270">Als deze optie is ingeschakeld, worden InputConnection-aanroepen uitgevoerd in een IME-thread. Er wordt geen replica-editor bijgehouden, maar elke InputConnection-aanroep communiceert rechtstreeks met het weergaveprogramma.</translation> <translation id="8799839487311913894">Het updaten van een wachtwoord in wachtwoordbeheer inschakelen na het verzenden van een formulier 'wachtwoord wijzigen'.</translation> <translation id="8800004011501252845">Bestemmingen weergeven voor</translation> <translation id="8800420788467349919">Volume: <ph name="PRECENTAGE" />%</translation> @@ -5284,6 +5284,7 @@ <translation id="8841142799574815336">Inactief visueel kijkvenster.</translation> <translation id="884264119367021077">Verzendadres</translation> <translation id="8844238624737526720">De nieuwe en geoptimaliseerde implementatie van Taakbeheer van Chrome gebruiken.</translation> +<translation id="8845001906332463065">Hulp nodig?</translation> <translation id="8846141544112579928">Toetsenbord zoeken...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Moduswijziging via Shift-toets</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 1986153..2d1cb6fc 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Legg til bokmerke for denne siden</translation> <translation id="1047956942837015229">Sletter <ph name="COUNT" /> elementer ...</translation> <translation id="1048597748939794622">Tvungen aktivering for alle lag</translation> +<translation id="1049795001945932310">&Språkinnstillinger</translation> <translation id="1049926623896334335">Word-dokument</translation> <translation id="1054153489933238809">Åpne det opprinnelige &bildet i en ny fane</translation> <translation id="1055806300943943258">Søker etter Bluetooth og USB-enheter …</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Translitterasjon (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automatiske navnetjenere</translation> <translation id="1215411991991485844">Nytt bakgrunnsprogram er lagt til</translation> +<translation id="1216954813581739968">Slå på muligheten for å dele faner ved deling av skrivebord.</translation> <translation id="121827551500866099">Vis alle nedlastinger</translation> <translation id="122082903575839559">Signaturalgoritme for sertifikat</translation> <translation id="1221024147024329929">PKCS #1 MD2 med RSA-kryptering</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Den automatiske påloggingen mislyktes</translation> <translation id="1293556467332435079">Filer</translation> <translation id="1294298200424241932">Rediger innstillinger for tillit:</translation> +<translation id="1295794900245526845">Velg kontoen som er lagret med <ph name="PASSWORD_MANAGER_BRAND" />, for å logge på</translation> <translation id="1297175357211070620">Destinasjon</translation> <translation id="1297922636971898492">Google Disk er ikke tilgjengelig for øyeblikket. Opplastingen starter automatisk på nytt når Google Disk er tilgjengelig.</translation> <translation id="1300861494336759522">Viderekobling for søk på Windows-datamaskiner</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Dette tilbakestiller oppstartssiden, nye faner, søkemotoren og eventuelle festede faner. I tillegg slår det av alle utvidelser og fjerner midlertidige data, for eksempel informasjonskapsler. Bokmerker, loggoppføringer og lagrede passord slettes ikke.</translation> <translation id="1434886155212424586">Startsiden er Ny fane-siden</translation> <translation id="1435550882135542937">Nydesignet verktøylinje for utvidelse</translation> +<translation id="1436402875660227532">Merk: Disse innstillingene brukes ikke lenger på dette systemet, men du kan fortsatt se dem og endre dem.</translation> <translation id="1436784010935106834">Fjernet</translation> <translation id="1438632560381091872">Slå på lyden for fanene</translation> <translation id="1441841714100794440">Vietnamesisk tastatur (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Aktiver støtte for virtuelt tastatur.</translation> <translation id="1474079335130556426">Slå på bakgrunnsmodus for Push API. Dette gjør at Chrome kan fortsette å kjøre etter at det siste vinduet er lukket, og starte når OS-et starter, dersom Push API trenger det.</translation> <translation id="1474339897586437869">«<ph name="FILENAME" />» ble ikke lastet opp. Det er ikke nok ledig plass på Google Disk.</translation> +<translation id="1476607407192946488">&Språkinnstillinger</translation> <translation id="1476949146811612304">Angi hvilken søkemotor som brukes når du søker i <ph name="BEGIN_LINK" />søkefeltet<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Tokenbuffer for identitets-API</translation> <translation id="1478340334823509079">Detaljer: <ph name="FILE_NAME" /></translation> @@ -646,6 +651,7 @@ <translation id="1962233722219655970">Denne siden bruker en Native Client-app som ikke fungerer på datamaskinen din.</translation> <translation id="1965328510789761112">Privat minne</translation> <translation id="1965624977906726414">Har ingen spesielle tillatelser.</translation> +<translation id="1968720524450620475">Slå på handlingsikonene for nettvarsler.</translation> <translation id="1970746430676306437">Vis side&informasjon</translation> <translation id="197288927597451399">Behold</translation> <translation id="1973491249112991739">Nedlasting av <ph name="PLUGIN_NAME" /> mislyktes.</translation> @@ -905,6 +911,7 @@ <translation id="2344262275956902282">Bruk - og = for å paginere en kandidatliste</translation> <translation id="2347476388323331511">Kunne ikke synkronisere</translation> <translation id="2347991999864119449">La meg velge om innhold i programtillegg skal kjøres eller ikke.</translation> +<translation id="2348165084656290171">For å dele lyd, velg en fane eller hele skjermen.</translation> <translation id="2350182423316644347">Appen startes opp …</translation> <translation id="2350796302381711542">Vil du la <ph name="HANDLER_HOSTNAME" /> åpne alle <ph name="PROTOCOL" />-linker i stedet for <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Språk og inndata</translation> @@ -992,6 +999,7 @@ <translation id="247772113373397749">Kanadisk flerspråklig tastatur</translation> <translation id="2478176599153288112">Mediafilrettigheter for «<ph name="EXTENSION" />»</translation> <translation id="2478830106132467213">Lås bare opp denne <ph name="DEVICE_TYPE" />en når telefonen er innenfor armlengde.</translation> +<translation id="247949520305900375">Del lyd</translation> <translation id="2479780645312551899">Kjør alle programtillegg denne gangen</translation> <translation id="2480626392695177423">Bytt mellom tegnsettingsmodusene for full og halv bredde</translation> <translation id="2481332092278989943">Legg til på hyllen</translation> @@ -1305,6 +1313,7 @@ <translation id="2889064240420137087">Åpne link med</translation> <translation id="2889925978073739256">Fortsett blokkeringen av programtillegg uten prosessisolering</translation> <translation id="2890624088306605051">Bare hent synkroniserte innstillinger og data</translation> +<translation id="2890678560483811744">Sidereferansen ligger utenfor området</translation> <translation id="2893168226686371498">Standardnettleser</translation> <translation id="289426338439836048">Annet mobilnettverk</translation> <translation id="2894745200702272315">Slår på en eksperimentell versjon av gjenkjenningsfunksjoner for «Ok Google»-kommandoord som har en maskinvareavhengighet.</translation> @@ -1333,7 +1342,6 @@ <translation id="2925966894897775835">Regneark</translation> <translation id="2927017729816812676">Bufferlagring</translation> <translation id="2927657246008729253">Endre</translation> -<translation id="2928415919076124714">Skjul verktøylinjen i fullskjermmodus</translation> <translation id="2928526264833629376">Fortsett til Hangouts</translation> <translation id="2930644991850369934">Det oppstod et problem under nedlasting av gjenopprettingsbilde. Nettverkstilkoblingen ble brutt.</translation> <translation id="293111069139560936">Lar hyllen minimalisere vinduer hvis du klikker på hylleelementer som bare har ett aktivt vindu.</translation> @@ -1457,6 +1465,7 @@ <translation id="3117812041123364382">Slår det flytende virtuelle tastaturet på/av.</translation> <translation id="3118319026408854581">Hjelp for <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Utilstrekkelig kryptering for en angitt operasjon på: «<ph name="DEVICE_NAME" />».</translation> +<translation id="3121260210578524273">Vis ikoner på handlingsknappene for nettvarsler.</translation> <translation id="3121793941267913344">Tilbakestill denne <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten</translation> <translation id="3122162841865761901">Eksperimenter i utviklerverktøyene</translation> <translation id="3122464029669770682">Prosessor</translation> @@ -1577,7 +1586,6 @@ <translation id="3289566588497100676">Enkel symbolinndatametode</translation> <translation id="3289856944988573801">For å sjekke etter oppdateringer, kan du bruke Ethernet eller Wi-Fi.</translation> <translation id="3293325348208285494">Rask start</translation> -<translation id="3293894718455402932">«<ph name="EXTENSION" />» får lese- og skrivetilgang til bilde-, video- og lydfiler i de valgte mappene.</translation> <translation id="3294437725009624529">Gjest</translation> <translation id="329650768420594634">Advarsel om pakking av utvidelse</translation> <translation id="3296763833017966289">Georgisk</translation> @@ -1633,6 +1641,7 @@ <translation id="3338239663705455570">Slovensk tastatur</translation> <translation id="3340978935015468852">innstillinger</translation> <translation id="3341703758641437857">Tillat tilgang til filnettadresser</translation> +<translation id="3343813173145836998">Logg på enkelt på denne enheten</translation> <translation id="3344786168130157628">Navn på tilgangspunkt:</translation> <translation id="3345135638360864351">Forespørselen om tilgang til dette nettstedet kunne ikke sendes til <ph name="NAME" />. Prøv igjen.</translation> <translation id="3345886924813989455">Ingen støttede nettlesere funnet</translation> @@ -2110,6 +2119,7 @@ <translation id="3996912167543967198">Tilbakestiller …</translation> <translation id="3997015411467176489">Eksperimentelle lerretsfunksjoner</translation> <translation id="40027638859996362">Ordforflytning</translation> +<translation id="400554499662786523">For å dele lyd, velg en fane.</translation> <translation id="4012550234655138030">Konfigurer eller administrer skrivere i <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Vil du reparere «<ph name="EXTENSION_NAME" />»?</translation> <translation id="4018133169783460046">Vis <ph name="PRODUCT_NAME" /> på dette språket</translation> @@ -2212,6 +2222,7 @@ <translation id="4180788401304023883">Slette CA-sertifikat «<ph name="CERTIFICATE_NAME" />»?</translation> <translation id="418179967336296930">Russisk Fonetisk (YaZHert) tastatur</translation> <translation id="4181841719683918333">Språk</translation> +<translation id="4187248015940562149">Slår på Web Bluetooth, som kan gi nettsteder tillatelse til å koble til og kontrollere Bluetooth-enheter rundt deg.</translation> <translation id="4188026131102273494">Søkeord:</translation> <translation id="4189406272289638749">Denne innstillingen kontrolleres av utvidelsen <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Google-dokument</translation> @@ -2268,6 +2279,7 @@ <translation id="4268025649754414643">Nøkkelchiffrering</translation> <translation id="4268574628540273656">Nettadresse:</translation> <translation id="4270393598798225102">Versjon <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Ingen treff</translation> <translation id="4274187853770964845">Synkroniseringsfeil: Stopp synkronisering, og start den på nytt.</translation> <translation id="4275830172053184480">Start enheten din på nytt</translation> <translation id="4276796043975446927">Velkommen til Chromebox for møter</translation> @@ -2337,6 +2349,7 @@ <translation id="4378551569595875038">Kobler til …</translation> <translation id="438122767399415311">Tving retningen for brukergrensesnittet</translation> <translation id="4381849418013903196">Kolon</translation> +<translation id="4383192539467954373">Logg på automatisk på ulike enheter</translation> <translation id="4384652540891215547">Aktiver utvidelsen</translation> <translation id="438503109373656455">Jockey</translation> <translation id="4387554346626014084">Aktiver synkronisering av appvelgeren. Mapper aktiveres også der de er tilgjengelige (ikke på OSX).</translation> @@ -2354,6 +2367,7 @@ <translation id="4421932782753506458">Pus</translation> <translation id="4422347585044846479">Rediger bokmerket for denne siden</translation> <translation id="4422428420715047158">Domene:</translation> +<translation id="4423482519432579560">&Stavekontroll</translation> <translation id="442477792133831654">Kommuniser med enheter i nærheten</translation> <translation id="4425149324548788773">Min disk</translation> <translation id="4428582326923056538">Kameraunntakene er annerledes for Adobe Flash Player.</translation> @@ -2368,6 +2382,7 @@ <translation id="444267095790823769">Unntak for beskyttet innhold</translation> <translation id="4443536555189480885">&Hjelp</translation> <translation id="4444304522807523469">Få tilgang til dokumentskannere som er tilkoblet via USB eller på det lokale nettverket</translation> +<translation id="4445559854264555037">Ser du ikke enheten din? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Speilt</translation> <translation id="4447465454292850432">Batteri:</translation> <translation id="4449935293120761385">Om autofyll-funksjonen</translation> @@ -2625,6 +2640,7 @@ <translation id="485316830061041779">Tysk</translation> <translation id="4856478137399998590">Mobildatatjenesten er aktivert og klar til bruk</translation> <translation id="4858913220355269194">Drible</translation> +<translation id="4860565041166337978">Alle nedlastinger håndteres av systemets nedlastingsbehandling når det er mulig.</translation> <translation id="48607902311828362">Flymodus</translation> <translation id="4861833787540810454">&Spill av</translation> <translation id="4862050643946421924">Legger til enheten …</translation> @@ -2708,7 +2724,6 @@ <translation id="4977942889532008999">Bekreft tilgangen</translation> <translation id="4982718461356080574">Skjuler lukkeknappene på inaktive faner når de stables</translation> <translation id="498294082491145744">endre innstillingene som kontrollerer nettsteders tilgang til elementer som informasjonskapsler, JavaScript, programtillegg, geografisk posisjon, mikrofon, kamera osv.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Sider</translation> <translation id="4988792151665380515">Kan ikke eksportere den offentlige nøkkelen.</translation> <translation id="49896407730300355">Rotér m&ot klokken</translation> @@ -2894,7 +2909,6 @@ <translation id="5268606875983318825">PPAPI (ikke i prosess)</translation> <translation id="526926484727016706">Gjør at alle iframes som standard blir nektet alle tillatelser. Hvis du gir en iframe spesifikke tillatelser, kan det hende at navnene på disse tillatelsene listes opp som verdier for nye iframe-attributter.</translation> <translation id="5269977353971873915">Utskrift mislyktes</translation> -<translation id="5270884342523754894">«<ph name="EXTENSION" />» får lesetilgang til bilde-, video- og lydfiler i de valgte mappene.</translation> <translation id="5271247532544265821">Bytt mellom forenklet og tradisjonell kinesisk</translation> <translation id="5271549068863921519">Lagre passord</translation> <translation id="5273628206174272911">Eksperimentell loggnavigering som følge av horisontal overrulling.</translation> @@ -2931,6 +2945,7 @@ <translation id="5316716239522500219">Speil skjermer</translation> <translation id="5317780077021120954">Lagre</translation> <translation id="5319782540886810524">Latvisk tastatur</translation> +<translation id="532247166573571973">Det kan hende tjeneren ikke er tilgjengelig. Prøv igjen senere.</translation> <translation id="5323213332664049067">Latinamerikansk</translation> <translation id="532360961509278431">Kan ikke åpne «$1»: $2</translation> <translation id="5324674707192845912">Du er i ferd med å avregistrere denne <ph name="DEVICE_TYPE" />en hos Google for å slå av muligheten til å finne, slette innholdet på og låse enheten fra en ekstern plassering. Dette krever at du starter enheten på nytt. Vil du fortsette?</translation> @@ -2983,11 +2998,11 @@ <translation id="5390284375844109566">Indeksert database</translation> <translation id="5392544185395226057">Aktiver støtte for Native Client (NaCl).</translation> <translation id="5393125431335030955">Dette programtillegget fungerer bare i skrivebordsmodus.</translation> -<translation id="5393559999218790205">Slå av tidslinjene for animasjonssammensetting i grensesnittet</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> på <ph name="PEPPER_PLUGIN_DOMAIN" /> ber om tilgang til datamaskinen din.</translation> <translation id="539755880180803351">Kommenterer nettskjemaer med autofyll-forslag som plassholdertekst.</translation> <translation id="5397578532367286026">Bruken og loggen for denne brukeren kan gjennomgås av administratoren (<ph name="MANAGER_EMAIL" />) på chrome.com</translation> <translation id="5397794290049113714">Deg</translation> +<translation id="5398572795982417028">Sidereferansen ligger utenfor området. Grensen er <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> fra andre nettsteder</translation> <translation id="5399158067281117682">De personlige kodene stemmer ikke overens.</translation> <translation id="5400640815024374115">Pålitelig plattformmodul (TPM)-brikke er deaktivert eller mangler.</translation> @@ -3007,7 +3022,7 @@ <translation id="5423849171846380976">Aktivert</translation> <translation id="5425470845862293575">Muliggjør bruk av det eksperimentelle DirectWrite-systemet for skriftgjengivelse.</translation> <translation id="5425722269016440406">Du må være koblet til nettet for å slå av Smart Lock, fordi denne innstillingen er synkronisert til telefonen og andre enheter. Koble til et nettverk først.</translation> -<translation id="5426623592374109001">Bruk det gamle, forstyrrende undersystemet for sammensatte animasjoner i grensesnittet.</translation> +<translation id="5425863515030416387">Logg på enkelt på ulike enheter</translation> <translation id="5427459444770871191">Rotér &med klokken</translation> <translation id="5428105026674456456">Spansk</translation> <translation id="542872847390508405">Du surfer som gjest</translation> @@ -3032,6 +3047,7 @@ <translation id="5451646087589576080">Vis ramme&informasjon</translation> <translation id="5453029940327926427">Lukk faner</translation> <translation id="5453632173748266363">Kyrillisk</translation> +<translation id="5454166040603940656">med <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Ugyldig</translation> <translation id="5457459357461771897">lese og slette bilder, musikk og andre medier fra datamaskinen din</translation> <translation id="5457599981699367932">Surf som gjest</translation> @@ -3201,7 +3217,6 @@ <translation id="5708171344853220004">Microsoft hovednavn</translation> <translation id="5709885306771508267">Klyping for skalering</translation> <translation id="5710406368443808765">Beklager. Systemet kunne ikke lagre enhetstoken og -ID.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> svarer ikke. Kan ikke caste.</translation> <translation id="5711983031544731014">Kan ikke låse opp. Skriv inn passordet ditt.</translation> <translation id="5712966208980506909">Hvis dette er av, lastes siden for «material design»-regelen inn når du åpner nettadressen chrome://md-policy.</translation> <translation id="5715711091495208045">Programtilleggsmegler: <ph name="PLUGIN_NAME" /></translation> @@ -3468,7 +3483,6 @@ <translation id="6111974609785983504">Tillatt som standard</translation> <translation id="6113134669445407638">Slå av Delay Agnostic AEC i WebRTC. Bruk dette alternativet hvis de rapporterte systemforsinkelsene er svært pålitelige, eller hvis andre opplever ekko fra maskinen din.</translation> <translation id="6116921718742659598">Endre språk- og inndatainnstillinger</translation> -<translation id="6117536376248197233">Slå av tidslinjene for animasjonssammensetting i gjengivelsesmotorer.</translation> <translation id="6120205520491252677">Fest denne siden til startsiden</translation> <translation id="6122081475643980456">Internett-tilkoblingen din kontrolleres</translation> <translation id="6122093587541546701">E-post (valgfritt):</translation> @@ -3500,6 +3514,7 @@ <translation id="6163522313638838258">Utvid alle</translation> <translation id="6164005077879661055">Alle filer og lokale data tilknyttet den administrerte brukeren slettes permanent når den administrerte brukeren fjernes. Besøkte nettsteder og innstillinger for denne administrerte brukeren kan fortsatt ses av administratoren på <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Les mer</translation> +<translation id="6167008112175207002">Bokmerkene, loggoppføringene, passordene og de andre innstillingene dine blir synkronisert med Google-kontoen din, slik at du kan bruke dem på alle enhetene dine. Du kan endre dette i <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Simulerte maskinvarefunksjoner for «Ok Google»</translation> <translation id="6175314957787328458">Microsoft domeneguide</translation> <translation id="6178664161104547336">Velg et sertifikat</translation> @@ -3702,6 +3717,7 @@ <translation id="648927581764831596">Ikke tilgjengelig</translation> <translation id="6490936204492416398">Installer en ny fra nettmarkedet</translation> <translation id="6492313032770352219">Plass på disken:</translation> +<translation id="6498249116389603658">&Alle språkene dine</translation> <translation id="6499143127267478107">Konverterer vert i proxy-skript …</translation> <translation id="6503077044568424649">Mest besøkt</translation> <translation id="6503256918647795660">Fransk tastatur (Sveits)</translation> @@ -3743,7 +3759,6 @@ <translation id="6555432686520421228">Fjern alle brukerkontoer og tilbakestill <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten din til fabrikkstandard.</translation> <translation id="6556866813142980365">Gjør om</translation> <translation id="6557565812667414268">Bare aktivert for skjermer med høy DPI</translation> -<translation id="655845594391856372">Fanen svarer ikke. Kan ikke caste.</translation> <translation id="6559580823502247193">(er allerede på denne enheten)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Pakker ut gjenopprettingsbilde …</translation> @@ -3844,6 +3859,7 @@ <translation id="6723354935081862304">Skriv ut til Google Dokumenter og andre destinasjoner i nettskyen. <ph name="BEGIN_LINK" />Logg på<ph name="END_LINK" /> for å skrive ut med Google Cloud Print.</translation> <translation id="6723661294526996303">Importer bokmerker og innstillinger</translation> <translation id="6723839937902243910">Strøm</translation> +<translation id="6725240607822645708">Kjør IME i sin egen tråd.</translation> <translation id="6725970970008349185">Antall kandidater som vises per side</translation> <translation id="672609503628871915">Se hva som er nytt</translation> <translation id="6727005317916125192">Forrige rute</translation> @@ -3973,12 +3989,11 @@ <translation id="6948736568813450284">For utviklere: Bruk tjenesten for prosessisolering for Google Payments API-kjøringer.</translation> <translation id="6949306908218145636">Bokmerk åpne sider</translation> <translation id="695164542422037736">Hvis dette alternativet er aktivert, og hoveddelen er utformet med «background-attachment:fixed», har bakgrunnen sitt eget sammensatte lag.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> husker passordene dine og logger deg på nettsteder automatisk på denne enheten.</translation> <translation id="6955446738988643816">Undersøk forgrunnsvindu</translation> <translation id="695755122858488207">Ikke valgt alternativknapp</translation> +<translation id="6960277925159781810">Logg på automatisk på denne enheten</translation> <translation id="696036063053180184">3 sett (ikke skift)</translation> <translation id="696203921837389374">Aktivér synkronisering via mobildata</translation> -<translation id="6964308487066031935">Vil du legge til mapper i «<ph name="EXTENSION" />»?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Enhet</translation> @@ -4078,7 +4093,6 @@ <translation id="7076293881109082629">Pålogging</translation> <translation id="7077829361966535409">Påloggingssiden kunne ikke lastes inn med de gjeldende mellomtjenerinnstillingene. <ph name="GAIA_RELOAD_LINK_START" />Forsøk å logge deg på igjen<ph name="GAIA_RELOAD_LINK_END" /> eller endre <ph name="PROXY_SETTINGS_LINK_START" />mellomtjenerinnstillingene<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignorerte protokollbehandlere</translation> -<translation id="7079038783243627996">«<ph name="EXTENSION" />» får tillatelse til å lese og slette bilde-, video- og lydfiler i de valgte mappene.</translation> <translation id="708060913198414444">K&opiér lydadressen</translation> <translation id="708187310695946552">Boblegrensesnitt for øktgjenoppretting</translation> <translation id="7082055294850503883">Ignorer CapsLock-status og skriv inn små bokstaver som standard</translation> @@ -4222,6 +4236,8 @@ <translation id="7313804056609272439">Vietnamesisk inndatametode (VNI)</translation> <translation id="7314244761674113881">SOCKS-vert</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (gjeldende)</translation> +<translation id="7321545336522791733">Tjeneren er ikke tilgjengelig</translation> +<translation id="7324841169865301118">Lar brukeren velge faner ved deling av skrivebord.</translation> <translation id="7325437708553334317">Høy kontrast-utvidelse</translation> <translation id="7326565110843845436">Trefingerklikk for styreflaten</translation> <translation id="73289266812733869">Ikke valgt</translation> @@ -4440,7 +4456,6 @@ <translation id="7650511557061837441">«<ph name="TRIGGERING_EXTENSION_NAME" />» vil fjerne «<ph name="EXTENSION_NAME" />».</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> vises på dette språket</translation> <translation id="7654941827281939388">Denne kontoen er allerede i bruk på denne datamaskinen.</translation> -<translation id="7655165758820095116">MediaSource-objektet gjør at JavaScript kan sende mediedata direkte til videoelementer.</translation> <translation id="7658239707568436148">Avbryt</translation> <translation id="7659584679870740384">Du er ikke autorisert til å bruke denne enheten. Ta kontakt med administratoren for å få tillatelse til å logge på.</translation> <translation id="7664620655576155379">Ustøttet Bluetooth-enhet: <ph name="DEVICE_NAME" />.</translation> @@ -4571,6 +4586,7 @@ <translation id="7861215335140947162">Ne&dlastinger</translation> <translation id="7864539943188674973">Deaktiver Bluetooth</translation> <translation id="7868891395842935202">Slår på det eksperimentelle brukergrensesnittet for kontroll av tilgang til API-eksperimenter.</translation> +<translation id="7870576007982733437">Bruk systemets nedlastingsbehandling når det er mulig.</translation> <translation id="7870790288828963061">Fant ingen Kiosk-apper med nyere versjon. Ingenting å oppdatere. Ta ut USB-pinnen.</translation> <translation id="787150342916295244">Skanning av kredittkort</translation> <translation id="7874357055309047713">Kjør alltid på alle nettsteder</translation> @@ -4613,7 +4629,6 @@ <translation id="7918257978052780342">Registrer deg</translation> <translation id="7920092496846849526">Du spurte foreldrene dine om det er greit å besøke denne siden.</translation> <translation id="7925285046818567682">Venter på <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> husker passordene dine og logger automatisk på apper og nettsteder for deg på alle enhetene dine.</translation> <translation id="7925686952655276919">Ikke bruk mobildata ved synkronisering</translation> <translation id="7926906273904422255">Merk usikre opprinnelser som usikret eller «tvilsomme».</translation> <translation id="7928710562641958568">Utløserenhet</translation> @@ -4675,7 +4690,6 @@ Oppbevar nøkkelfilen på et trygt sted. Du får bruk for den når du skal opprette nye versjoner av utvidelsen.</translation> <translation id="799923393800005025">Kan se</translation> <translation id="7999338963698132743">Ny oppgavebehandling</translation> -<translation id="8000004253404706714">Bruk det gamle, forstyrrende undersystemet for sammensatte animasjoner i gjengivelsesmotorer.</translation> <translation id="8004582292198964060">Nettleser</translation> <translation id="8007030362289124303">Lavt batteri</translation> <translation id="8008356846765065031">Internett er frakoblet. Sjekk Internett-forbindelsen din .</translation> @@ -4804,6 +4818,7 @@ <translation id="8185331656081929126">Vis varsler når nye skrivere oppdages på nettverket</translation> <translation id="8186609076106987817">Tjeneren fant ikke filen.</translation> <translation id="8186706823560132848">Programvare</translation> +<translation id="8188120771410500975">&Kontrollér stavingen i tekstfelt</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" />, og <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> til</translation> <translation id="8190193592390505034">Kobler til <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Administrering av programmer, utvidelser og temaer</translation> @@ -5196,6 +5211,7 @@ <translation id="8765985713192161328">Administrer behandlere</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Brukere</translation> +<translation id="8768367823103160496">Låsing av musemarkøren</translation> <translation id="8769662576926275897">Kortinformasjon</translation> <translation id="8770196827482281187">Inndatametode for persisk (ISIRI 2901-oppsettet)</translation> <translation id="8774934320277480003">Toppmargen</translation> @@ -5215,6 +5231,7 @@ <translation id="8795668016723474529">Legg til kredittkort</translation> <translation id="8795916974678578410">Nytt vindu</translation> <translation id="8798099450830957504">Standard</translation> +<translation id="8799127529310003270">Hvis dette er slått på, kjører InputConnection-kall i IME-tråden, og i stedet for å beholde en kopi av redigeringsvinduet kommuniserer hvert InputConnection-kall direkte med gjengiveren.</translation> <translation id="8799839487311913894">Slår på oppdatering av passord i passordbehandleren etter innsending av «passordendring»-skjema.</translation> <translation id="8800004011501252845">Viser destinasjoner for</translation> <translation id="8800420788467349919">Volum: <ph name="PRECENTAGE" /> %</translation> @@ -5240,6 +5257,7 @@ <translation id="8841142799574815336">Ubevegelig visuelt visningsområde.</translation> <translation id="884264119367021077">Leveringsadresse</translation> <translation id="8844238624737526720">Bruk den nye og optimaliserte implementeringen av oppgavebehandlingen i Chrome.</translation> +<translation id="8845001906332463065">Få hjelp</translation> <translation id="8846141544112579928">Søker etter tastatur …</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Bytt til Shift-tastemodus</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 087c40d..e0fc147 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Dodaj stronę do zakładek...</translation> <translation id="1047956942837015229">Usuwam <ph name="COUNT" /> elementy(ów)...</translation> <translation id="1048597748939794622">Wymuszenie dla wszystkich warstw</translation> +<translation id="1049795001945932310">&Ustawienia języka</translation> <translation id="1049926623896334335">Dokument Worda</translation> <translation id="1054153489933238809">Otwórz oryginalny &obraz w nowej karcie</translation> <translation id="1055806300943943258">Szukam urządzeń Bluetooth i USB...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliteracja (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automatyczny wybór serwerów nazw</translation> <translation id="1215411991991485844">Nowa aplikacja działająca w tle została dodana</translation> +<translation id="1216954813581739968">Włącz kartę przy udostępnianiu pulpitu</translation> <translation id="121827551500866099">Pokaż wszystkie pobrane pliki...</translation> <translation id="122082903575839559">Algorytm podpisu certyfikatu</translation> <translation id="1221024147024329929">PKCS #1, MD2 z szyfrowaniem RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Błąd automatycznego logowania</translation> <translation id="1293556467332435079">Pliki</translation> <translation id="1294298200424241932">Edytuj ustawienia zaufania:</translation> +<translation id="1295794900245526845">Wybierz konto zapisane w <ph name="PASSWORD_MANAGER_BRAND" />, by się zalogować</translation> <translation id="1297175357211070620">Urządzenie docelowe</translation> <translation id="1297922636971898492">Dysk Google nie jest teraz dostępny. Gdy znów będzie można z niego korzystać, przesyłanie zostanie automatycznie wznowione.</translation> <translation id="1300861494336759522">Przekierowanie wyszukiwania z pulpitu systemu Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Spowoduje to zresetowanie Twojej strony początkowej, strony nowej karty, wyszukiwarki i przypiętych kart. Oprócz tego przeglądarka wyłączy wszystkie rozszerzenia i usunie dane tymczasowe takie jak pliki cookie. Twoje zakładki, historia i zapisane hasła nie zostaną usunięte.</translation> <translation id="1434886155212424586">Strona główna jest stroną nowej karty</translation> <translation id="1435550882135542937">Nowy wygląd paska narzędzi rozszerzenia</translation> +<translation id="1436402875660227532">Uwaga: obecny system już nie używa tych ustawień, ale nadal możesz je przeglądać i edytować.</translation> <translation id="1436784010935106834">Usunięto</translation> <translation id="1438632560381091872">Wyłącz wyciszenie kart</translation> <translation id="1441841714100794440">Klawiatura wietnamska (teleks)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Włącz obsługę klawiatury wirtualnej.</translation> <translation id="1474079335130556426">Włącza tryb działania interfejsu API Push w tle. To pozwala Chrome dalej działać po zamknięciu ostatniego okna oraz uruchamiać się przy starcie systemu operacyjnego, jeśli interfejs API Push tego wymaga.</translation> <translation id="1474339897586437869">Plik „<ph name="FILENAME" />” nie został przesłany. Za mało wolnego miejsca na Dysku Google.</translation> +<translation id="1476607407192946488">&Ustawienia języka</translation> <translation id="1476949146811612304">Wybierz wyszukiwarkę używaną w <ph name="BEGIN_LINK" />omniboksie<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Pamięć podręczna tokenów interfejsu API Identity</translation> <translation id="1478340334823509079">Szczegóły: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Ta strona używa aplikacji klienta natywnego, która nie działa na Twoim komputerze.</translation> <translation id="1965328510789761112">Pamięć prywatna</translation> <translation id="1965624977906726414">Nie ma specjalnych uprawnień.</translation> +<translation id="1968720524450620475">Włącz ikony czynności w powiadomieniach internetowych.</translation> <translation id="1970746430676306437">Wyświetl &informacje o stronie</translation> <translation id="197288927597451399">Zachowaj</translation> <translation id="1973491249112991739">Błąd pobierania <ph name="PLUGIN_NAME" />.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">Użyj znaków - i = do przechodzenia między stronami listy kandydatów</translation> <translation id="2347476388323331511">Nie można zsynchronizować</translation> <translation id="2347991999864119449">Pozwól mi wybrać, kiedy uruchomić treść wtyczki</translation> +<translation id="2348165084656290171">Aby udostępnić dźwięk, wybierz kartę lub cały ekran.</translation> <translation id="2350182423316644347">Inicjuję aplikację...</translation> <translation id="2350796302381711542">Zezwolić usłudze <ph name="HANDLER_HOSTNAME" /> na otwieranie wszystkich linków <ph name="PROTOCOL" /> zamiast usługi <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Język i wprowadzanie</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">Kanadyjska klawiatura wielojęzyczna</translation> <translation id="2478176599153288112">Uprawnienia pliku multimedialnego dla rozszerzenia „<ph name="EXTENSION" />”</translation> <translation id="2478830106132467213">Odblokuj to urządzenie <ph name="DEVICE_TYPE" /> tylko wtedy, gdy telefon znajduje się w odległości odpowiadającej długości ramienia.</translation> +<translation id="247949520305900375">Udostępnij dźwięk</translation> <translation id="2479780645312551899">Uruchom tym razem wszystkie wtyczki</translation> <translation id="2480626392695177423">Przełącz tryb interpunkcji na pełną szerokość/połowę szerokości</translation> <translation id="2481332092278989943">Dodaj do półki</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">Otwórz link przy użyciu...</translation> <translation id="2889925978073739256">Nadal blokuj wtyczki spoza piaskownicy</translation> <translation id="2890624088306605051">Pobierz tylko zsynchronizowane ustawienia i dane</translation> +<translation id="2890678560483811744">Odwołanie do strony spoza zakresu</translation> <translation id="2893168226686371498">Domyślna przeglądarka</translation> <translation id="289426338439836048">Inna sieć komórkowa</translation> <translation id="2894745200702272315">Włącza eksperymentalną wersję funkcji wykrywania słowa-klucza „Ok Google”, których działanie jest zależne od sprzętu.</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">Arkusze</translation> <translation id="2927017729816812676">Pamięć podręczna</translation> <translation id="2927657246008729253">Zmień...</translation> -<translation id="2928415919076124714">Ukryj pasek narzędzi w trybie pełnoekranowym</translation> <translation id="2928526264833629376">Otwórz Hangouts</translation> <translation id="2930644991850369934">Wystąpił problem podczas pobierania obrazu odzyskiwania. Połączenie sieciowe zostało zerwane.</translation> <translation id="293111069139560936">Zezwalaj na minimalizowanie okna przez półkę, jeśli kliknięto element półki, z którym powiązane jest tylko jedno (już aktywne) okno.</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">Włącz/wyłącz swobodną klawiaturę wirtualną.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> – pomoc</translation> <translation id="3120430004221004537">Zbyt słabe szyfrowanie tej operacji na: „<ph name="DEVICE_NAME" />”.</translation> +<translation id="3121260210578524273">Włącz ikony w przyciskach polecenia w powiadomieniach internetowych.</translation> <translation id="3121793941267913344">Zresetuj to urządzenie z <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Eksperymenty na platformie Developer Tools</translation> <translation id="3122464029669770682">Procesor</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">Łatwe wprowadzanie symboli</translation> <translation id="3289856944988573801">Jeśli chcesz sprawdzić aktualizacje, użyj Ethernetu lub Wi-Fi.</translation> <translation id="3293325348208285494">Szybki start</translation> -<translation id="3293894718455402932">„<ph name="EXTENSION" />” będzie mieć możliwość odczytywania i zapisywania plików graficznych, wideo i dźwiękowych w zaznaczonych folderach.</translation> <translation id="3294437725009624529">Gość</translation> <translation id="329650768420594634">Ostrzeżenie o rozszerzeniu pakietu</translation> <translation id="3296763833017966289">Gruziński</translation> @@ -1639,6 +1647,7 @@ <translation id="3338239663705455570">Klawiatura słoweńska</translation> <translation id="3340978935015468852">ustawienia</translation> <translation id="3341703758641437857">Zezwalaj na dostęp do adresów URL plików</translation> +<translation id="3343813173145836998">Łatwo loguj się na tym urządzeniu</translation> <translation id="3344786168130157628">Nazwa punktu dostępu:</translation> <translation id="3345135638360864351">Nie udało się wysłać żądania dostępu do strony do <ph name="NAME" />. Spróbuj ponownie.</translation> <translation id="3345886924813989455">Nie znaleziono obsługiwanej przeglądarki</translation> @@ -2118,6 +2127,7 @@ <translation id="3996912167543967198">Resetuję...</translation> <translation id="3997015411467176489">Eksperymentalne funkcje kanw</translation> <translation id="40027638859996362">Przenoszenie słów</translation> +<translation id="400554499662786523">Aby udostępnić dźwięk, wybierz kartę.</translation> <translation id="4012550234655138030">Konfiguruj drukarki lub zarządzaj drukarkami w <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Naprawić „<ph name="EXTENSION_NAME" />”?</translation> <translation id="4018133169783460046">Wyświetl <ph name="PRODUCT_NAME" /> w tym języku</translation> @@ -2220,6 +2230,7 @@ <translation id="4180788401304023883">Czy usunąć certyfikat urzędu certyfikacji „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="418179967336296930">Klawiatura rosyjska – fonetyczna (YaZHert)</translation> <translation id="4181841719683918333">Języki</translation> +<translation id="4187248015940562149">Włącza funkcję Web Bluetooth, która może pozwalać stronom internetowym na łączenie się z Twoimi urządzeniami Bluetooth w pobliżu i sterowanie nimi.</translation> <translation id="4188026131102273494">Słowo kluczowe:</translation> <translation id="4189406272289638749">Kontrolę nad tym ustawieniem ma rozszerzenie <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Dokument Google</translation> @@ -2276,6 +2287,7 @@ <translation id="4268025649754414643">Szyfrowanie klucza</translation> <translation id="4268574628540273656">Adres URL:</translation> <translation id="4270393598798225102">Wersja <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Brak zgodnych wyników</translation> <translation id="4274187853770964845">Błąd synchronizacji: zatrzymaj i ponownie uruchom synchronizację.</translation> <translation id="4275830172053184480">Zrestartuj urządzenie</translation> <translation id="4276796043975446927">Chromebox wideokonferencje – witamy</translation> @@ -2345,6 +2357,7 @@ <translation id="4378551569595875038">Łączę...</translation> <translation id="438122767399415311">Wymuś kierunek tekstu interfejsu</translation> <translation id="4381849418013903196">Dwukropek</translation> +<translation id="4383192539467954373">Automatycznie loguj się na różnych urządzeniach</translation> <translation id="4384652540891215547">Aktywuj rozszerzenie</translation> <translation id="438503109373656455">Walor</translation> <translation id="4387554346626014084">Włącz synchronizację Menu z aplikacjami. Włączy to też Foldery (nie w OS X).</translation> @@ -2362,6 +2375,7 @@ <translation id="4421932782753506458">Puszysty</translation> <translation id="4422347585044846479">Edytuj zakładkę tej strony</translation> <translation id="4422428420715047158">Domena:</translation> +<translation id="4423482519432579560">&Sprawdzanie pisowni</translation> <translation id="442477792133831654">Łącz się z urządzeniami w pobliżu</translation> <translation id="4425149324548788773">Mój dysk</translation> <translation id="4428582326923056538">Wyjątki Adobe Flash Playera dotyczące kamery są inne.</translation> @@ -2376,6 +2390,7 @@ <translation id="444267095790823769">Wyjątki treści chronionej</translation> <translation id="4443536555189480885">&Pomoc</translation> <translation id="4444304522807523469">Dostęp do skanerów podłączonych przez USB lub do sieci lokalnej</translation> +<translation id="4445559854264555037">Nie widzisz swojego urządzenia? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Zduplikowany</translation> <translation id="4447465454292850432">Bateria:</translation> <translation id="4449935293120761385">Autouzupełnianie – informacje</translation> @@ -2631,6 +2646,7 @@ <translation id="485316830061041779">Niemiecki</translation> <translation id="4856478137399998590">Komórkowa usługa transmisji danych została aktywowana i jest gotowa do użycia</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">W odpowiednich przypadkach zezwalaj, by pobieranie obsługiwał systemowy menedżer pobierania.</translation> <translation id="48607902311828362">Tryb samolotowy</translation> <translation id="4861833787540810454">&Odtwórz</translation> <translation id="4862050643946421924">Dodaję urządzenie...</translation> @@ -2714,7 +2730,6 @@ <translation id="4977942889532008999">Potwierdź dostęp</translation> <translation id="4982718461356080574">Ukrywanie przycisków zamykania nieaktywnych kart na stosie</translation> <translation id="498294082491145744">Zmiana ustawień kontrolujących dostęp stron internetowych do takich funkcji jak pliki cookie, JavaScript, wtyczki, geolokalizacja, mikrofon, kamera itp.</translation> -<translation id="4984329823325527157">Interfejs API Media Source</translation> <translation id="4988526792673242964">Strony</translation> <translation id="4988792151665380515">Nie można wyeksportować klucza publicznego.</translation> <translation id="49896407730300355">&Obróć w lewo</translation> @@ -2904,7 +2919,6 @@ <translation id="5268606875983318825">PPAPI (poza procesem)</translation> <translation id="526926484727016706">Powoduje, że wszystkie elementy iframe domyślnie nie otrzymują żadnych uprawnień. Przyznanie konkretnych uprawnień elementowi iframe może wymagać umieszczenia ich nazw jako wartości nowych atrybutów tego elementu.</translation> <translation id="5269977353971873915">Niepowodzenie drukowania</translation> -<translation id="5270884342523754894">„<ph name="EXTENSION" />” będzie mieć możliwość odczytywania plików graficznych, wideo i dźwiękowych w zaznaczonych folderach.</translation> <translation id="5271247532544265821">Przełącz język chiński uproszczony/tradycyjny</translation> <translation id="5271549068863921519">Zapisz hasło</translation> <translation id="5273628206174272911">Eksperymentalna nawigacja po historii w odpowiedzi na dalekie przewinięcie w poziomie.</translation> @@ -2941,6 +2955,7 @@ <translation id="5316716239522500219">Wyświetl na monitorach odbicie lustrzane</translation> <translation id="5317780077021120954">Zapisz</translation> <translation id="5319782540886810524">Klawiatura łotewska</translation> +<translation id="532247166573571973">Serwer może być niedostępny. Spróbuj ponownie później.</translation> <translation id="5323213332664049067">Ameryka Łacińska</translation> <translation id="532360961509278431">Nie można otworzyć „$1”: $2</translation> <translation id="5324674707192845912">Za chwilę wyrejestrujesz to urządzenie <ph name="DEVICE_TYPE" /> w Google, by wyłączyć funkcję zdalnego lokalizowania, wymazywania i blokowania. To wymaga ponownego uruchomienia. Chcesz kontynuować?</translation> @@ -2993,11 +3008,11 @@ <translation id="5390284375844109566">Zindeksowana baza danych</translation> <translation id="5392544185395226057">Włącz obsługę klienta natywnego.</translation> <translation id="5393125431335030955">Ta wtyczka działa tylko na pulpicie.</translation> -<translation id="5393559999218790205">Wyłącz osie czasu animacji w kompozytorze interfejsu</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> na <ph name="PEPPER_PLUGIN_DOMAIN" /> chce mieć dostęp do Twojego komputera.</translation> <translation id="539755880180803351">Dodaje do formularzy internetowych informacje o typie pola autouzupełniania jako tekst zastępczy.</translation> <translation id="5397578532367286026">Działania i historia tego użytkownika mogą być sprawdzane przez menedżera (<ph name="MANAGER_EMAIL" />) na chrome.com.</translation> <translation id="5397794290049113714">Ty</translation> +<translation id="5398572795982417028">Odwołanie do strony spoza zakresu, limit to <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> z innych witryn</translation> <translation id="5399158067281117682">Kody PIN nie są identyczne!</translation> <translation id="5400640815024374115">Moduł TPM (Trusted Platform Module) jest wyłączony lub nieobecny.</translation> @@ -3017,7 +3032,7 @@ <translation id="5423849171846380976">Aktywowano</translation> <translation id="5425470845862293575">Włącza eksperymentalny system renderowania czcionek DirectWrite.</translation> <translation id="5425722269016440406">Smart Lock jest synchronizowany z Twoim telefonem i innymi urządzeniami, dlatego by wyłączyć to ustawienie, musisz być online. Połącz się z siecią.</translation> -<translation id="5426623592374109001">Użyj starego, bardziej uciążliwego podsystemu animacji dla skomponowanych animacji w interfejsie.</translation> +<translation id="5425863515030416387">Łatwo loguj się na różnych urządzeniach</translation> <translation id="5427459444770871191">Obróć w &prawo</translation> <translation id="5428105026674456456">Hiszpański</translation> <translation id="542872847390508405">Przeglądasz jako gość</translation> @@ -3042,6 +3057,7 @@ <translation id="5451646087589576080">Wyświetl &informacje o ramce</translation> <translation id="5453029940327926427">Zamknij karty</translation> <translation id="5453632173748266363">Cyrylica</translation> +<translation id="5454166040603940656">za pomocą <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Nieprawidłowe</translation> <translation id="5457459357461771897">Odczyt i usuwanie zdjęć, muzyki oraz innych multimediów na komputerze</translation> <translation id="5457599981699367932">Przeglądaj jako gość</translation> @@ -3211,7 +3227,6 @@ <translation id="5708171344853220004">Nazwa główna firmy Microsoft</translation> <translation id="5709885306771508267">Skalowanie przez ściągnięcie</translation> <translation id="5710406368443808765">Ups. Systemowi nie udało się zapisać tokenu ani identyfikatora urządzenia.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> nie odpowiada. Nie można przesyłać.</translation> <translation id="5711983031544731014">Nie można odblokować. Wpisz hasło.</translation> <translation id="5712966208980506909">Jeśli ta opcja jest włączona, adres URL chrome://md-policy ładuje stronę zasad Material Design.</translation> <translation id="5715711091495208045">Broker wtyczek: <ph name="PLUGIN_NAME" /></translation> @@ -3478,7 +3493,6 @@ <translation id="6111974609785983504">Dozwolone domyślnie</translation> <translation id="6113134669445407638">Wyłącza funkcję Delay Agnostic AEC w WebRTC. Należy jej używać, gdy zgłaszane opóźnienia systemu są bardzo wiarygodne lub gdy inne osoby słyszą echo pochodzące z Twojego komputera.</translation> <translation id="6116921718742659598">Zmień język i ustawienia wprowadzania</translation> -<translation id="6117536376248197233">Wyłącz osie czasu animacji w kompozytorze w mechanizmach renderowania.</translation> <translation id="6120205520491252677">Przypnij tę stronę do ekranu startowego...</translation> <translation id="6122081475643980456">Twoje połączenie internetowe jest kontrolowane</translation> <translation id="6122093587541546701">Adres e-mail (opcjonalnie):</translation> @@ -3510,6 +3524,7 @@ <translation id="6163522313638838258">Rozwiń wszystko...</translation> <translation id="6164005077879661055">W chwili usunięcia użytkownika nadzorowanego wszystkie powiązane z nim pliki i dane lokalne zostaną trwale usunięte. Lista stron, na które wszedł ten użytkownik, oraz jego ustawienia mogą być wciąż widoczne dla menedżera na <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Więcej informacji</translation> +<translation id="6167008112175207002">Zakładki, historia, hasła i inne ustawienia zostaną zsynchronizowane z kontem Google, by można było z nich korzystać na dowolnym urządzeniu. Możesz to zmienić na stronie <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Funkcje „Ok Google” dla emulowanego sprzętu</translation> <translation id="6175314957787328458">Identyfikator GUID domeny firmy Microsoft</translation> <translation id="6178664161104547336">Wybór certyfikatu</translation> @@ -3713,6 +3728,7 @@ <translation id="648927581764831596">Brak dostępnych</translation> <translation id="6490936204492416398">Zainstaluj nowe ze sklepu</translation> <translation id="6492313032770352219">Rozmiar na dysku:</translation> +<translation id="6498249116389603658">&Wszystkie Twoje języki</translation> <translation id="6499143127267478107">Rozpoznawanie hosta w skrypcie proxy...</translation> <translation id="6503077044568424649">Najczęstsze</translation> <translation id="6503256918647795660">Klawiatura szwajcarska (francuski)</translation> @@ -3754,7 +3770,6 @@ <translation id="6555432686520421228">Usuń wszystkie konta użytkowników i przywróć urządzenie <ph name="IDS_SHORT_PRODUCT_NAME" /> do stanu fabrycznego.</translation> <translation id="6556866813142980365">Ponów</translation> <translation id="6557565812667414268">Włączony tylko w przypadku wyświetlaczy o wysokiej rozdzielczości DPI</translation> -<translation id="655845594391856372">Karta nie odpowiada. Nie można przesyłać.</translation> <translation id="6559580823502247193">(użytkownik już zarejestrowany na urządzeniu)</translation> <translation id="6561726789132298588">wpisz</translation> <translation id="6562437808764959486">Trwa wyodrębnianie obrazu odzyskiwania...</translation> @@ -3855,6 +3870,7 @@ <translation id="6723354935081862304">Drukuj do Dokumentów Google i innych miejsc docelowych w chmurze. <ph name="BEGIN_LINK" />Zaloguj się<ph name="END_LINK" />, by drukować za pomocą Google Cloud Print.</translation> <translation id="6723661294526996303">Importuj zakładki i ustawienia...</translation> <translation id="6723839937902243910">Zasilanie</translation> +<translation id="6725240607822645708">Uruchom edytor IME w jego własnym wątku.</translation> <translation id="6725970970008349185">Liczba propozycji wyświetlanych na stronie</translation> <translation id="672609503628871915">Zobacz, co nowego</translation> <translation id="6727005317916125192">Poprzedni panel</translation> @@ -3984,12 +4000,11 @@ <translation id="6948736568813450284">Programiści: w przypadku wywołań interfejsu API Google Payments należy używać usługi piaskownicy.</translation> <translation id="6949306908218145636">Dodaj otwarte strony do zakładek...</translation> <translation id="695164542422037736">Gdy ta opcja jest włączona i treść ma przypisany styl „background-attachment:fixed”, tło ma własną warstwę skomponowaną.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> pamięta Twoje hasła i automatycznie loguje Cię w witrynach na tym urządzeniu.</translation> <translation id="6955446738988643816">Sprawdź wyskakujące okienko</translation> <translation id="695755122858488207">Niezaznaczony przycisk</translation> +<translation id="6960277925159781810">Automatycznie loguj się na tym urządzeniu</translation> <translation id="696036063053180184">3 Set (bez klawisza Shift)</translation> <translation id="696203921837389374">Włącz synchronizację przy użyciu komórkowej transmisji danych.</translation> -<translation id="6964308487066031935">Dodać foldery do „<ph name="EXTENSION" />”?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Urządzenie</translation> @@ -4087,7 +4102,6 @@ <translation id="7076293881109082629">Logowanie</translation> <translation id="7077829361966535409">Nie można wczytać strony logowania przy bieżących ustawieniach serwera proxy. <ph name="GAIA_RELOAD_LINK_START" />Zaloguj się jeszcze raz<ph name="GAIA_RELOAD_LINK_END" /> lub użyj innych <ph name="PROXY_SETTINGS_LINK_START" />ustawień serwera proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignorowane moduły obsługi</translation> -<translation id="7079038783243627996">„<ph name="EXTENSION" />” będzie mieć możliwość odczytywania i usuwania plików graficznych, wideo i dźwiękowych w zaznaczonych folderach.</translation> <translation id="708060913198414444">K&opiuj adres audio</translation> <translation id="708187310695946552">Dymek z interfejsem przywracania sesji</translation> <translation id="7082055294850503883">Ignoruj stan klawisza CapsLock i domyślnie wprowadzaj małe litery</translation> @@ -4231,6 +4245,8 @@ <translation id="7313804056609272439">wietnamski (VNI)</translation> <translation id="7314244761674113881">Host SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (bieżący)</translation> +<translation id="7321545336522791733">Serwer niedostępny</translation> +<translation id="7324841169865301118">Pozwala użytkownikowi wybrać kartę do udostępniania pulpitu.</translation> <translation id="7325437708553334317">Rozszerzenie High Contrast</translation> <translation id="7326565110843845436">Klikanie trzema palcami na touchpadzie</translation> <translation id="73289266812733869">Niezaznaczony</translation> @@ -4450,7 +4466,6 @@ <translation id="7650511557061837441">„<ph name="TRIGGERING_EXTENSION_NAME" />” chce usunąć „<ph name="EXTENSION_NAME" />”.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> jest w tym języku</translation> <translation id="7654941827281939388">To konto jest już używane na tym komputerze.</translation> -<translation id="7655165758820095116">Obiekt MediaSource pozwala bezpośrednio przesyłać dane multimedialne z JavaScriptu do elementu wideo.</translation> <translation id="7658239707568436148">Anuluj</translation> <translation id="7659584679870740384">Nie masz uprawnień do korzystania z tego urządzenia. Aby uzyskać pozwolenie na logowanie się, skontaktuj się z jego administratorem.</translation> <translation id="7664620655576155379">Nieobsługiwane urządzenie Bluetooth: „<ph name="DEVICE_NAME" />”.</translation> @@ -4581,6 +4596,7 @@ <translation id="7861215335140947162">&Pobrane pliki</translation> <translation id="7864539943188674973">Wyłącz Bluetooth</translation> <translation id="7868891395842935202">Włącza eksperymentalną strukturę do kontrolowania dostępu do eksperymentalnych interfejsów API.</translation> +<translation id="7870576007982733437">W odpowiednich przypadkach używaj systemowego menedżera pobierania.</translation> <translation id="7870790288828963061">Nie odnaleziono nowszej wersji aplikacji kiosku. Aktualizacja nie jest wymagana. Odłącz pamięć USB.</translation> <translation id="787150342916295244">Skanowanie karty kredytowej</translation> <translation id="7874357055309047713">Zawsze uruchamiaj na wszystkich stronach</translation> @@ -4623,7 +4639,6 @@ <translation id="7918257978052780342">Zarejestruj</translation> <translation id="7920092496846849526">Zapytałeś rodzica, czy możesz wejść na tę stronę.</translation> <translation id="7925285046818567682">Oczekiwanie na <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> pamięta Twoje hasła i automatycznie loguje Cię w aplikacjach i witrynach na różnych urządzeniach.</translation> <translation id="7925686952655276919">Nie synchronizuj przez połączenie komórkowe</translation> <translation id="7926906273904422255">Oznacza niezabezpieczone źródła jako niezabezpieczone lub budzące wątpliwości.</translation> <translation id="7928710562641958568">Odłącz urządzenie</translation> @@ -4685,7 +4700,6 @@ Przechowuj plik klucza w bezpiecznym miejscu. Będzie on potrzebny do utworzenia nowych wersji rozszerzenia.</translation> <translation id="799923393800005025">Może wyświetlać</translation> <translation id="7999338963698132743">Nowy menedżer zadań</translation> -<translation id="8000004253404706714">Użyj starego, bardziej uciążliwego podsystemu animacji dla skomponowanych animacji w mechanizmach renderowania.</translation> <translation id="8004582292198964060">Przeglądarka</translation> <translation id="8007030362289124303">Bateria rozładowana</translation> <translation id="8008356846765065031">Brak łączności z internetem. Sprawdź połączenie.</translation> @@ -4814,6 +4828,7 @@ <translation id="8185331656081929126">Pokazuj powiadomienia po wykryciu w sieci nowych drukarek</translation> <translation id="8186609076106987817">Serwer nie znalazł pliku.</translation> <translation id="8186706823560132848">Oprogramowanie</translation> +<translation id="8188120771410500975">Sprawdź &pisownię w polach tekstowych</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> i jeszcze <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Łączenie z siecią <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Zarządzanie Twoimi aplikacjami, rozszerzeniami i motywami</translation> @@ -5206,6 +5221,7 @@ <translation id="8765985713192161328">Zarządzaj modułami obsługi</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Użytkownicy</translation> +<translation id="8768367823103160496">Blokada kursora myszy</translation> <translation id="8769662576926275897">Dane karty</translation> <translation id="8770196827482281187">perski (układ ISIRI 2901)</translation> <translation id="8774934320277480003">Górny margines</translation> @@ -5225,6 +5241,7 @@ <translation id="8795668016723474529">Dodaj kartę kredytową</translation> <translation id="8795916974678578410">Nowe okno</translation> <translation id="8798099450830957504">Domyślny</translation> +<translation id="8799127529310003270">Jeśli ta opcja jest włączona, wywołania InputConnection są uruchamiane w wątku IME i, zamiast utrzymywania edytora wersji zastępczych, komunikują się bezpośrednio z mechanizmem renderowania.</translation> <translation id="8799839487311913894">Włącz aktualizowanie hasła w menedżerze haseł po przesłaniu formularza „zmiana hasła”.</translation> <translation id="8800004011501252845">Pokaż urządzenia docelowe dla</translation> <translation id="8800420788467349919">Głośność: <ph name="PRECENTAGE" />%</translation> @@ -5250,6 +5267,7 @@ <translation id="8841142799574815336">Inercja widocznego obszaru wizualnego.</translation> <translation id="884264119367021077">Adres wysyłki</translation> <translation id="8844238624737526720">Użyj nowej, zoptymalizowanej wersji menedżera zadań Chrome.</translation> +<translation id="8845001906332463065">Uzyskaj pomoc</translation> <translation id="8846141544112579928">Szukam klawiatury...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Przełączanie trybu klawisza Shift</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 9ff2451f..bc14880 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">Esta função irá redefinir sua página de inicialização, a página "Nova guia", o mecanismo de pesquisa e as guias fixadas. Além disso, desativará todas as extensões e limpará dados temporários, como cookies. Seus favoritos, histórico e senhas salvas não serão limpos.</translation> <translation id="1434886155212424586">A página inicial é a página "Nova guia"</translation> <translation id="1435550882135542937">Reformulação da barra de ferramentas da extensão.</translation> +<translation id="1436402875660227532">Observação: essas configurações não são mais usadas neste sistema, mas ainda é possível vê-las e editá-las.</translation> <translation id="1436784010935106834">Removido</translation> <translation id="1438632560381091872">Ativar som das guias</translation> <translation id="1441841714100794440">Teclado vietnamita (Telex)</translation> @@ -1316,6 +1317,7 @@ <translation id="2889064240420137087">Abrir link com...</translation> <translation id="2889925978073739256">Continuar bloqueando plug-ins sem sandbox</translation> <translation id="2890624088306605051">Recuperar somente as configurações e dados sincronizados</translation> +<translation id="2890678560483811744">Referência de página fora dos limites</translation> <translation id="2893168226686371498">Navegador padrão</translation> <translation id="289426338439836048">Outra rede móvel...</translation> <translation id="2894745200702272315">Ativa uma versão experimental dos recursos de detecção de hotword do "Ok Google" que têm uma dependência de hardware.</translation> @@ -1344,7 +1346,6 @@ <translation id="2925966894897775835">Planilhas</translation> <translation id="2927017729816812676">Armazenamento de cache</translation> <translation id="2927657246008729253">Alterar...</translation> -<translation id="2928415919076124714">Ocultar barra de ferramentas no modo de tela cheia</translation> <translation id="2928526264833629376">Continuar no Hangouts</translation> <translation id="2930644991850369934">Ocorreu um problema durante o download da imagem de recuperação. A conexão de rede foi perdida.</translation> <translation id="293111069139560936">Permite que a estante minimize uma janela caso ocorra o clique em um item da estante que tenha uma única janela, já ativa, associada a ele.</translation> @@ -1589,7 +1590,6 @@ <translation id="3289566588497100676">Entrada de símbolos fácil</translation> <translation id="3289856944988573801">Para verificar se há atualizações, utilize Ethernet ou Wi-Fi.</translation> <translation id="3293325348208285494">Início rápido</translation> -<translation id="3293894718455402932">O "<ph name="EXTENSION" />" pode ler e gravar imagens, vídeos e arquivos de som das pastas selecionadas.</translation> <translation id="3294437725009624529">Visitante</translation> <translation id="329650768420594634">Aviso de extensão de pacote</translation> <translation id="3296763833017966289">Georgiano</translation> @@ -1647,6 +1647,7 @@ <translation id="3338239663705455570">Teclado esloveno</translation> <translation id="3340978935015468852">configurações</translation> <translation id="3341703758641437857">Permitir acesso aos URLs do arquivo</translation> +<translation id="3343813173145836998">Fazer login de forma fácil neste dispositivo</translation> <translation id="3344786168130157628">Nome do ponto de acesso:</translation> <translation id="3345135638360864351">Não foi possível enviar sua solicitação a <ph name="NAME" /> para acessar este site. Tente novamente.</translation> <translation id="3345886924813989455">Não foi encontrado um navegador suportado</translation> @@ -2286,6 +2287,7 @@ <translation id="4268025649754414643">Codificação de chaves</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versão <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Nenhuma correspondência</translation> <translation id="4274187853770964845">Erro de sincronização: pare e reinicie o processo.</translation> <translation id="4275830172053184480">Reiniciar seu dispositivo</translation> <translation id="4276796043975446927">Bem-vindo ao Chromebox para videoconferências</translation> @@ -2354,6 +2356,7 @@ <translation id="4378551569595875038">Conectando...</translation> <translation id="438122767399415311">Forçar direção da IU</translation> <translation id="4381849418013903196">Dois pontos</translation> +<translation id="4383192539467954373">Fazer login automaticamente em todos os dispositivos</translation> <translation id="4384652540891215547">Ativar a extensão</translation> <translation id="438503109373656455">Silver</translation> <translation id="4387554346626014084">Ativar sincronização do Acesso rápido aos apps. Também ativa as pastas, quando disponíveis (não para OSX).</translation> @@ -2386,6 +2389,7 @@ <translation id="444267095790823769">Exceções de conteúdo protegido</translation> <translation id="4443536555189480885">&Ajuda</translation> <translation id="4444304522807523469">Acessar scanners de documentos acoplados via USB ou na rede local</translation> +<translation id="4445559854264555037">Não está vendo seu dispositivo? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Espelhada</translation> <translation id="4447465454292850432">Bateria:</translation> <translation id="4449935293120761385">Sobre o preenchimento automático</translation> @@ -2642,6 +2646,7 @@ <translation id="485316830061041779">Alemão</translation> <translation id="4856478137399998590">Seu serviço de dados móveis foi ativado e está pronto para ser usado</translation> <translation id="4858913220355269194">Pelé</translation> +<translation id="4860565041166337978">Permitir que downloads sejam gerenciados pelo gerenciador de downloads do sistema quando aplicável.</translation> <translation id="48607902311828362">Modo avião</translation> <translation id="4861833787540810454">&Reproduzir</translation> <translation id="4862050643946421924">Adicionando um dispositivo...</translation> @@ -2725,7 +2730,6 @@ <translation id="4977942889532008999">Confirmar acesso</translation> <translation id="4982718461356080574">Ocultação de botões de fechamento em guias inativas quando empilhadas</translation> <translation id="498294082491145744">Alterar configurações que controlam o acesso dos websites a recursos como cookies, JavaScript, plug-ins, geolocalização, microfone, câmera etc.</translation> -<translation id="4984329823325527157">API Media Source</translation> <translation id="4988526792673242964">Páginas</translation> <translation id="4988792151665380515">Falha ao exportar chave pública.</translation> <translation id="49896407730300355">Girar no s&entido anti-horário</translation> @@ -2914,7 +2918,6 @@ <translation id="5268606875983318825">PPAPI (fora do processo)</translation> <translation id="526926484727016706">Faz com que todas as permissões de iframes sejam negadast por padrão. O consentimento de permissões específicas de um iframe pode envolver a listagem dos nomes dessas permissões como valores de novos atributos de iframe.</translation> <translation id="5269977353971873915">Falha ao imprimir</translation> -<translation id="5270884342523754894">O "<ph name="EXTENSION" />" pode ler imagens, vídeos e arquivos de som das pastas selecionadas.</translation> <translation id="5271247532544265821">Alternar entre o modo chinês simplificado/tradicional</translation> <translation id="5271549068863921519">Salvar senha</translation> <translation id="5273628206174272911">Histórico de navegação experimental em resposta à rolagem horizontal.</translation> @@ -3004,11 +3007,11 @@ <translation id="5390284375844109566">Banco de dados indexado</translation> <translation id="5392544185395226057">Ativa o suporte para o Cliente nativo.</translation> <translation id="5393125431335030955">Este plug-in funciona apenas na área de trabalho.</translation> -<translation id="5393559999218790205">Desativar linhas do tempo de animações do compositor para interface do usuário</translation> <translation id="5396126354477659676">O plug-in <ph name="PEPPER_PLUGIN_NAME" /> do domínio <ph name="PEPPER_PLUGIN_DOMAIN" /> deseja acessar seu computador.</translation> <translation id="539755880180803351">Comenta formulários da web adicionando previsões de preenchimento automático como textos provisórios.</translation> <translation id="5397578532367286026">O uso e o histórico deste usuário podem ser analisados pelo administrador (<ph name="MANAGER_EMAIL" />) em chrome.com.</translation> <translation id="5397794290049113714">Você</translation> +<translation id="5398572795982417028">Referência de página fora do limite, que é <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> de outros sites</translation> <translation id="5399158067281117682">Os PINs não coincidem.</translation> <translation id="5400640815024374115">O chip do TPM (Module Platform Trusted) está desativado ou ausente.</translation> @@ -3028,7 +3031,7 @@ <translation id="5423849171846380976">Ativado</translation> <translation id="5425470845862293575">Ativa o uso do sistema experimental de renderização de fontes DirectWrite.</translation> <translation id="5425722269016440406">Você precisa estar on-line para desativar o Smart Lock, pois esta configuração é sincronizada com seu smartphone e outros dispositivos. Conecte-se a uma rede primeiro.</translation> -<translation id="5426623592374109001">Usa um subsistema antigo de animação intrusiva para animações compostas na interface do usuário.</translation> +<translation id="5425863515030416387">Fazer login de forma fácil em todos os dispositivos</translation> <translation id="5427459444770871191">Girar no &sentido horário</translation> <translation id="5428105026674456456">Espanhol</translation> <translation id="542872847390508405">Você está navegando como visitante</translation> @@ -3224,7 +3227,6 @@ <translation id="5708171344853220004">Nome principal da Microsoft</translation> <translation id="5709885306771508267">Dimensionamento por gesto de pinça</translation> <translation id="5710406368443808765">Opa! Falha do sistema ao armazenar o token e ID do dispositivo.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> não está respondendo. Não foi possível transmitir.</translation> <translation id="5711983031544731014">Não foi possível realizar o desbloqueio. Insira sua senha.</translation> <translation id="5712966208980506909">Se ativado, o URL chrome://md-policy carrega a página de política do material design.</translation> <translation id="5715711091495208045">Agente do plug-in: <ph name="PLUGIN_NAME" /></translation> @@ -3491,7 +3493,6 @@ <translation id="6111974609785983504">Permitida por padrão</translation> <translation id="6113134669445407638">Desativar Delay Agnostic AEC no WebRTC. Use se atrasos relatados pelo sistema forem muito confiáveis ou se outras pessoas sofrerem eco da sua máquina.</translation> <translation id="6116921718742659598">Alterar configurações de idioma e de entrada</translation> -<translation id="6117536376248197233">Desativar linhas do tempo de animação compostas em renderizadores.</translation> <translation id="6120205520491252677">Fixar esta página na tela inicial...</translation> <translation id="6122081475643980456">Sua conexão com a Internet está sendo controlada</translation> <translation id="6122093587541546701">E-mail (opcional):</translation> @@ -3524,6 +3525,7 @@ <translation id="6164005077879661055">Todos os arquivos e dados locais associados ao usuário supervisionado serão permanentemente excluídos assim que esse usuário for removido. Os websites visitados por esse usuário supervisionado e suas configurações ainda poderão ser vistos pelo administrador em <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Saiba mais</translation> +<translation id="6167008112175207002">Seus favoritos, histórico, senhas e outras configurações serão sincronizados com sua Conta do Google para que seja possível usá-los em todos os seus dispositivos. É possível alterar essa configuração em <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Recursos "Ok Google" de hardware simulado</translation> <translation id="6175314957787328458">GUID do domínio da Microsoft</translation> <translation id="6178664161104547336">Selecione um certificado</translation> @@ -3769,7 +3771,6 @@ <translation id="6555432686520421228">Remover todas as contas de usuário e redefinir seu dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /> para as condições de fábrica.</translation> <translation id="6556866813142980365">Refazer</translation> <translation id="6557565812667414268">Ativado somente para displays com alto DPI</translation> -<translation id="655845594391856372">A guia não está respondendo. Não foi possível transmitir.</translation> <translation id="6559580823502247193">(já neste dispositivo)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Extraindo imagem de recuperação...</translation> @@ -3870,6 +3871,7 @@ <translation id="6723354935081862304">Imprima no Google Docs e outros destinos de nuvem. <ph name="BEGIN_LINK" />Faça login<ph name="END_LINK" /> para imprimir no Google Cloud Print.</translation> <translation id="6723661294526996303">Importar favoritos e configurações...</translation> <translation id="6723839937902243910">Energia</translation> +<translation id="6725240607822645708">Executar IME na própria sequência.</translation> <translation id="6725970970008349185">Número de candidatos a serem exibidos por página</translation> <translation id="672609503628871915">Veja o que há de novo</translation> <translation id="6727005317916125192">Painel anterior</translation> @@ -4001,12 +4003,11 @@ <translation id="6948736568813450284">Para desenvolvedores: use o serviço de sandbox para chamadas da API do Google Payments.</translation> <translation id="6949306908218145636">Adicionar páginas abertas aos favoritos...</translation> <translation id="695164542422037736">Se esta opção estiver ativada e se o corpo estiver estilizado com background-attachment:fixed, o plano de fundo terá sua própria camada composta.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> lembra das suas senhas e faz login em sites automaticamente nesse dispositivo.</translation> <translation id="6955446738988643816">Inspecionar pop-up</translation> <translation id="695755122858488207">Botão de opção desmarcado</translation> +<translation id="6960277925159781810">Fazer login automaticamente neste dispositivo</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Ativar a sincronização de dados móveis</translation> -<translation id="6964308487066031935">Adicionar pastas ao "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Porta</translation> <translation id="6965978654500191972">Dispositivo</translation> @@ -4104,7 +4105,6 @@ <translation id="7076293881109082629">Como fazer login</translation> <translation id="7077829361966535409">Houve uma falha no carregamento da página de login usando as configurações de proxy atuais. <ph name="GAIA_RELOAD_LINK_START" />Tente fazer login novamente<ph name="GAIA_RELOAD_LINK_END" /> ou use <ph name="PROXY_SETTINGS_LINK_START" />configurações de proxy<ph name="PROXY_SETTINGS_LINK_END" /> diferentes.</translation> <translation id="7077872827894353012">Manipuladores de protocolo ignorados</translation> -<translation id="7079038783243627996">O "<ph name="EXTENSION" />" pode ler e gravar imagens, vídeos e arquivos de som das pastas selecionadas.</translation> <translation id="708060913198414444">C&opiar endereço do áudio</translation> <translation id="708187310695946552">IU em bolha de restauração de sessão</translation> <translation id="7082055294850503883">Ignorar o status do CapsLock e inserir letras minúsculas por padrão</translation> @@ -4477,7 +4477,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" deseja remover "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772">O <ph name="PRODUCT_NAME" /> é exibido neste idioma</translation> <translation id="7654941827281939388">Esta conta já está sendo utilizada neste computador.</translation> -<translation id="7655165758820095116">O objeto MediaSource permite que o JavaScript envie dados de mídia diretamente para um elemento de vídeo.</translation> <translation id="7658239707568436148">Cancelar</translation> <translation id="7659584679870740384">Você tem autorização para usar este dispositivo. Para permissão de login, entre em contato com o administrador.</translation> <translation id="7664620655576155379">Dispositivo Bluetooth não suportado: "<ph name="DEVICE_NAME" />".</translation> @@ -4608,6 +4607,7 @@ <translation id="7861215335140947162">&Downloads</translation> <translation id="7864539943188674973">Desativar bluetooth</translation> <translation id="7868891395842935202">Permite que a estrutura experimental controle o acesso a experimentos de API.</translation> +<translation id="7870576007982733437">Usar o gerenciador de downloads do sistema quando aplicável.</translation> <translation id="7870790288828963061">Nenhum aplicativo de quiosque com versão mais recente foi encontrado. Não há nada para ser atualizado. Remova o pendrive.</translation> <translation id="787150342916295244">Digitalização de cartão de crédito</translation> <translation id="7874357055309047713">Sempre executar em todos os sites</translation> @@ -4650,7 +4650,6 @@ <translation id="7918257978052780342">Inscrever-se</translation> <translation id="7920092496846849526">Você pediu aos seus pais se podia visitar esta página.</translation> <translation id="7925285046818567682">Aguardando <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> lembra das suas senhas e faz login em aplicativos e sites automaticamente nos dispositivos.</translation> <translation id="7925686952655276919">Não usar dados móveis na sincronização</translation> <translation id="7926906273904422255">Marcar origens não seguras como "não seguras" ou "duvidosas".</translation> <translation id="7928710562641958568">Ejetar dispositivo</translation> @@ -4712,7 +4711,6 @@ Mantenha a sua chave de arquivo em um local seguro. Você precisará dela para criar novas versões da sua extensão.</translation> <translation id="799923393800005025">Pode ver</translation> <translation id="7999338963698132743">Novo gerenciador de tarefas</translation> -<translation id="8000004253404706714">Usa um subsistema antigo de animação intrusiva para animações compostas em renderizadores.</translation> <translation id="8004582292198964060">Navegador</translation> <translation id="8007030362289124303">Bateria fraca</translation> <translation id="8008356846765065031">Internet desconectada. Verifique sua conexão com a Internet.</translation> @@ -5234,6 +5232,7 @@ <translation id="8765985713192161328">Gerenciar manipuladores...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Usuários</translation> +<translation id="8768367823103160496">Bloqueio do cursor do mouse</translation> <translation id="8769662576926275897">Detalhes do cartão</translation> <translation id="8770196827482281187">Método de entrada persa (layout ISIRI 2901)</translation> <translation id="8774934320277480003">Margem superior</translation> @@ -5253,6 +5252,7 @@ <translation id="8795668016723474529">Adicionar um cartão de crédito</translation> <translation id="8795916974678578410">Nova janela</translation> <translation id="8798099450830957504">Padrão</translation> +<translation id="8799127529310003270">Se ativada, InputConnection chama a execução na sequência do IME e, em vez de manter um editor de réplicas, cada chamada de InputConnection falará diretamente com o renderizador.</translation> <translation id="8799839487311913894">Ativa a atualização de uma senha no gerenciador de senhas depois de enviar um formulário de "alteração de senha".</translation> <translation id="8800004011501252845">Mostrando destinos para</translation> <translation id="8800420788467349919">Volume: <ph name="PRECENTAGE" />%</translation> @@ -5278,6 +5278,7 @@ <translation id="8841142799574815336">Janela de visualização inerte</translation> <translation id="884264119367021077">Endereço de entrega</translation> <translation id="8844238624737526720">Usar a nova e otimizada implementação do gerenciador de tarefas do Chrome.</translation> +<translation id="8845001906332463065">Ajuda</translation> <translation id="8846141544112579928">Procurando teclado...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Alternância com a tecla Shift</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 380396cf..db4669f 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -155,7 +155,7 @@ <translation id="1208421848177517699">Transliteração (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Servidores de nome automático</translation> <translation id="1215411991991485844">Nova aplicação de segundo plano adicionada</translation> -<translation id="1216954813581739968">Ativar separador para partilha do ambiente de trabalho.</translation> +<translation id="1216954813581739968">Ativar separador para partilha do ambiente de trabalho</translation> <translation id="121827551500866099">Mostrar todas as transferências...</translation> <translation id="122082903575839559">Algoritmo de assinatura do certificado</translation> <translation id="1221024147024329929">PKCS #1 MD2 Com encriptação RSA</translation> @@ -292,6 +292,7 @@ <translation id="1434696352799406980">Repõe a página inicial, a página novo separador, o motor de pesquisa e os separadores fixos. Também desativa todas as extensões e limpa os dados temporários como os cookies. Os marcadores, o histórico e as palavras-passe guardadas não são limpos.</translation> <translation id="1434886155212424586">A Página inicial é a página Novo separador</translation> <translation id="1435550882135542937">Reformulação da barra de ferramentas de extensões</translation> +<translation id="1436402875660227532">Nota: estas definições já não são utilizadas neste sistema, mas ainda as pode visualizar e editar.</translation> <translation id="1436784010935106834">Removido</translation> <translation id="1438632560381091872">Reativar som dos separadores</translation> <translation id="1441841714100794440">Teclado vietnamita (telex)</translation> @@ -1317,6 +1318,7 @@ <translation id="2889064240420137087">Abrir link com...</translation> <translation id="2889925978073739256">Continuar a bloquear plug-ins sem isolamento de processos</translation> <translation id="2890624088306605051">Recuperar apenas as definições e os dados sincronizados</translation> +<translation id="2890678560483811744">Referência da página fora dos limites</translation> <translation id="2893168226686371498">Navegador predefinido</translation> <translation id="289426338439836048">Outra rede móvel...</translation> <translation id="2894745200702272315">Ativa uma versão experimental das funcionalidades de deteção de palavras de ativação "Ok Google", que estão dependentes de hardware.</translation> @@ -1345,7 +1347,6 @@ <translation id="2925966894897775835">Folhas</translation> <translation id="2927017729816812676">Armazenamento de cache</translation> <translation id="2927657246008729253">Alterar...</translation> -<translation id="2928415919076124714">Ocultar barra de ferramentas no modo de ecrã inteiro</translation> <translation id="2928526264833629376">Continuar para o Hangouts</translation> <translation id="2930644991850369934">Ocorreu um problema durante a transferência da imagem de recuperação. Ligação à rede perdida.</translation> <translation id="293111069139560936">Permite que a prateleira minimize uma janela se um item da prateleira for clicado e tiver uma única janela, já ativa, associada ao mesmo.</translation> @@ -1591,7 +1592,6 @@ <translation id="3289566588497100676">Introdução simples de símbolos</translation> <translation id="3289856944988573801">Para verificar se existem atualizações, utilize Ethernet ou Wi-Fi.</translation> <translation id="3293325348208285494">Início rápido</translation> -<translation id="3293894718455402932">O "<ph name="EXTENSION" />" poderá ler e escrever ficheiros de imagens, vídeo e som nas pastas marcadas.</translation> <translation id="3294437725009624529">Convidado</translation> <translation id="329650768420594634">Aviso de Extensão do Pacote</translation> <translation id="3296763833017966289">Georgiana</translation> @@ -1648,6 +1648,7 @@ <translation id="3338239663705455570">Teclado esloveno</translation> <translation id="3340978935015468852">definições</translation> <translation id="3341703758641437857">Permitir acesso a URLs de ficheiro</translation> +<translation id="3343813173145836998">Iniciar facilmente sessão neste dispositivo</translation> <translation id="3344786168130157628">Nome do ponto de acesso:</translation> <translation id="3345135638360864351">Não é possível enviar o seu pedido de acesso a este site a <ph name="NAME" />. Tente novamente.</translation> <translation id="3345886924813989455">Não encontrado um browser suportado</translation> @@ -2287,6 +2288,7 @@ <translation id="4268025649754414643">Cifragem de chaves</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Versão <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Sem correspondências</translation> <translation id="4274187853770964845">Erro de Sincronização: pare e reinicie a Sincronização.</translation> <translation id="4275830172053184480">Reiniciar o dispositivo</translation> <translation id="4276796043975446927">Bem-vindo(a) ao Chromebox para reuniões</translation> @@ -2356,6 +2358,7 @@ <translation id="4378551569595875038">A ligar...</translation> <translation id="438122767399415311">Forçar direção da interface do utilizador</translation> <translation id="4381849418013903196">Dois pontos</translation> +<translation id="4383192539467954373">Iniciar automaticamente sessão em vários dispositivos</translation> <translation id="4384652540891215547">Ativar a extensão</translation> <translation id="438503109373656455">Trovão</translation> <translation id="4387554346626014084">Ativar sincronização do Iniciador de Aplicações. Isto também ativa Pastas quando disponíveis (não OSX).</translation> @@ -2388,6 +2391,7 @@ <translation id="444267095790823769">Exceções de conteúdo protegido</translation> <translation id="4443536555189480885">&Ajuda</translation> <translation id="4444304522807523469">Aceder a scanners de documentos anexados através de USB ou na rede local</translation> +<translation id="4445559854264555037">Não vê o seu dispositivo? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Espelhado</translation> <translation id="4447465454292850432">Bateria:</translation> <translation id="4449935293120761385">Acerca do preenchimento automático</translation> @@ -2645,6 +2649,7 @@ <translation id="485316830061041779">Alemão</translation> <translation id="4856478137399998590">O seu serviço de dados móveis está ativado e pronto a utilizar</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">Permitir que o gestor de transferências do sistema processe as transferências quando aplicável.</translation> <translation id="48607902311828362">Modo de avião</translation> <translation id="4861833787540810454">&Reproduzir</translation> <translation id="4862050643946421924">A adicionar dispositivo…</translation> @@ -2728,7 +2733,6 @@ <translation id="4977942889532008999">Confirmar acesso</translation> <translation id="4982718461356080574">Ocultar os botões de fechar dos separadores inativos quando empilhados</translation> <translation id="498294082491145744">Altere as definições que controlam o acesso dos Websites a funcionalidades como cookies, JavaScript, plug-ins, geolocalização, microfone, câmara, etc.</translation> -<translation id="4984329823325527157">API da origem multimédia</translation> <translation id="4988526792673242964">Páginas </translation> <translation id="4988792151665380515">Falha ao exportar chave pública.</translation> <translation id="49896407730300355">Rodar para a &esquerda</translation> @@ -2917,7 +2921,6 @@ <translation id="5268606875983318825">PPAPI (fora do processo)</translation> <translation id="526926484727016706">Faz com que sejam recusadas todas as autorizações a todos os iframes por predefinição. Para permitir autorizações particulares para um iframe, pode ser necessário listar os nomes dessas autorizações como valores de novos atributos de iframe.</translation> <translation id="5269977353971873915">Falha de Impressão</translation> -<translation id="5270884342523754894">O "<ph name="EXTENSION" />" poderá ler ficheiros de imagens, vídeo e som nas pastas marcadas.</translation> <translation id="5271247532544265821">Activar/desactivar modo Chinês simplificado/tradicional</translation> <translation id="5271549068863921519">Guardar palavra-passe</translation> <translation id="5273628206174272911">Navegação no histórico experimental como resposta ao deslocamento horizontal.</translation> @@ -3007,11 +3010,11 @@ <translation id="5390284375844109566">Base de dados indexada</translation> <translation id="5392544185395226057">Ative o suporte do Native Client.</translation> <translation id="5393125431335030955">Este plug-in apenas funciona no computador.</translation> -<translation id="5393559999218790205">Desativar linhas cronológicas de animação do compositor da interface do utilizador</translation> <translation id="5396126354477659676">O <ph name="PEPPER_PLUGIN_NAME" /> em <ph name="PEPPER_PLUGIN_DOMAIN" /> pretende aceder ao seu computador.</translation> <translation id="539755880180803351">Anota formulários web com previsões do tipo de campo de Preenchimento Automático como texto de placeholder.</translation> <translation id="5397578532367286026">A utilização e o histórico deste utilizador podem ser consultados pelo gestor (<ph name="MANAGER_EMAIL" />) em chrome.com.</translation> <translation id="5397794290049113714">Utilizador</translation> +<translation id="5398572795982417028">A referência da página está fora dos limites; o limite é <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> de outros sites</translation> <translation id="5399158067281117682">Os PINs não coincidem!</translation> <translation id="5400640815024374115">O chip do TPM (Trusted Platform Module/Módulo de plataforma fidedigna) está desactivado ou não existe.</translation> @@ -3031,7 +3034,7 @@ <translation id="5423849171846380976">Activado</translation> <translation id="5425470845862293575">Ativa a utilização do sistema experimental de processamento do tipo de letra do DirectWrite.</translation> <translation id="5425722269016440406">Tem de estar online para desativar o Smart Lock, porque esta definição está sincronizada com o telemóvel e outros dispositivos. Primeiro, estabeleça ligação a uma rede.</translation> -<translation id="5426623592374109001">Utilizar o subsistema de animação intrusiva antigo para animações compostas na interface do utilizador.</translation> +<translation id="5425863515030416387">Iniciar facilmente sessão em vários dispositivos</translation> <translation id="5427459444770871191">Rodar para a &Direita</translation> <translation id="5428105026674456456">Espanhol</translation> <translation id="542872847390508405">Está a navegar como Convidado</translation> @@ -3227,7 +3230,6 @@ <translation id="5708171344853220004">Nome principal Microsoft</translation> <translation id="5709885306771508267">Ajustar ao juntar os dedos</translation> <translation id="5710406368443808765">Ups! O sistema não conseguiu armazenar o ID e o token do dispositivo.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> não está a responder. Não é possível transmitir.</translation> <translation id="5711983031544731014">Não foi possível desbloquear. Introduza a sua palavra-passe.</translation> <translation id="5712966208980506909">Se ativado, o URL chrome://md-policy carrega a página da política de Material design.</translation> <translation id="5715711091495208045">Mediador de plug-ins: <ph name="PLUGIN_NAME" /></translation> @@ -3494,7 +3496,6 @@ <translation id="6111974609785983504">Permitido por predefinição</translation> <translation id="6113134669445407638">Desativar a tecnologia Delay Agnostic AEC no WebRTC. Utilize-a se os atrasos do sistema relatados forem muito fidedignos ou se outros utilizadores notarem um eco do seu computador.</translation> <translation id="6116921718742659598">Alterar idioma e definições de introdução</translation> -<translation id="6117536376248197233">Desativar linhas cronológicas de animação do compositor nos renderizadores.</translation> <translation id="6120205520491252677">Fixar esta página ao ecrã Inicial...</translation> <translation id="6122081475643980456">A sua ligação à Internet está a ser controlada</translation> <translation id="6122093587541546701">Email (opcional):</translation> @@ -3526,6 +3527,7 @@ <translation id="6163522313638838258">Expandir tudo...</translation> <translation id="6164005077879661055">Todos os ficheiros e dados locais associados ao utilizador supervisionado serão definitivamente eliminados depois de este utilizador supervisionado ser removido. Os Websites visitados e as definições deste utilizador supervisionado poderão continuar visíveis para o gestor em <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Saiba mais</translation> +<translation id="6167008112175207002">Os marcadores, o histórico, as palavras-passe e outras definições são sincronizados com a sua Conta Google para que os possa utilizar em todos os dispositivos. Pode alterar esta opção em <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Funcionalidades "Ok Google" do hardware simuladas</translation> <translation id="6175314957787328458">GUID de Domínio do Windows</translation> <translation id="6178664161104547336">Seleccionar um certificado</translation> @@ -3771,7 +3773,6 @@ <translation id="6555432686520421228">Remova todas as contas de utilizador e reponha o seu dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /> para que fique como novo.</translation> <translation id="6556866813142980365">Refazer</translation> <translation id="6557565812667414268">Apenas ativo para ecrãs com um nível elevado de PPP</translation> -<translation id="655845594391856372">O separador não está a responder. Não é possível transmitir.</translation> <translation id="6559580823502247193">(já existe neste dispositivo)</translation> <translation id="6561726789132298588">introduzir</translation> <translation id="6562437808764959486">A extrair imagem de recuperação...</translation> @@ -3872,6 +3873,7 @@ <translation id="6723354935081862304">Imprima para o Google Docs e outros destinos na nuvem. <ph name="BEGIN_LINK" />Inicie sessão<ph name="END_LINK" /> para imprimir para o Google Cloud Print.</translation> <translation id="6723661294526996303">Importar marcadores e definições...</translation> <translation id="6723839937902243910">Alimentação</translation> +<translation id="6725240607822645708">Executar IME no seu próprio thread.</translation> <translation id="6725970970008349185">Número de candidatos a apresentar por página</translation> <translation id="672609503628871915">Descobrir as novidades mais recentes</translation> <translation id="6727005317916125192">Painel anterior</translation> @@ -4002,12 +4004,11 @@ <translation id="6948736568813450284">Para programadores: utilize o serviço de isolamento de processos para chamadas da API do Google Payments.</translation> <translation id="6949306908218145636">Adicionar Páginas Abertas aos Marcadores...</translation> <translation id="695164542422037736">Se esta opção estiver ativada e o corpo tiver o estilo de anexo de fundo:fixo, o fundo terá a sua própria camada composta.</translation> -<translation id="6952626679169241027">O <ph name="PASSWORD_MANAGER_BRAND" /> memoriza as suas palavras-passe e inicia automaticamente sessão em sites neste dispositivo.</translation> <translation id="6955446738988643816">Inspecionar Pop-up</translation> <translation id="695755122858488207">Botão de opção não selecionado</translation> +<translation id="6960277925159781810">Iniciar automaticamente sessão neste dispositivo</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Ativar a sincronização através de dados móveis</translation> -<translation id="6964308487066031935">Adicionar pastas a "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Porta</translation> <translation id="6965978654500191972">Dispositivo</translation> @@ -4105,7 +4106,6 @@ <translation id="7076293881109082629">Iniciar sessão</translation> <translation id="7077829361966535409">Ocorreu uma falha ao carregar a página de início de sessão utilizando as definições de proxy atuais. <ph name="GAIA_RELOAD_LINK_START" />Tente iniciar sessão novamente<ph name="GAIA_RELOAD_LINK_END" /> ou utilize <ph name="PROXY_SETTINGS_LINK_START" />definições de proxy<ph name="PROXY_SETTINGS_LINK_END" /> diferentes.</translation> <translation id="7077872827894353012">Processadores de protocolos ignorados</translation> -<translation id="7079038783243627996">O "<ph name="EXTENSION" />" poderá ler e eliminar ficheiros de imagens, vídeo e som nas pastas marcadas.</translation> <translation id="708060913198414444">C&opiar endereço do áudio</translation> <translation id="708187310695946552">IU do restauro da sessão em balões</translation> <translation id="7082055294850503883">Ignorar o estado CapsLock e introduzir em minúsculas por predefinição</translation> @@ -4477,7 +4477,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" pretende remover "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> é apresentado neste idioma</translation> <translation id="7654941827281939388">Esta conta já está a ser utilizada neste computador.</translation> -<translation id="7655165758820095116">O objeto MediaSource permite ao JavaScript enviar dados multimédia diretamente para um elemento de vídeo.</translation> <translation id="7658239707568436148">Cancelar</translation> <translation id="7659584679870740384">Não está autorizado a utilizar este dispositivo. Contacte o administrador para obter autorização de início de sessão.</translation> <translation id="7664620655576155379">Dispositivo Bluetooth não suportado: "<ph name="DEVICE_NAME" />".</translation> @@ -4608,6 +4607,7 @@ <translation id="7861215335140947162">&Transferências</translation> <translation id="7864539943188674973">Desativar Bluetooth</translation> <translation id="7868891395842935202">Ativa a Framework experimental para controlar o acesso às experiências da API.</translation> +<translation id="7870576007982733437">Utilizar o gestor de transferências do sistema quando aplicável.</translation> <translation id="7870790288828963061">Nenhuma aplicação do Quiosque encontrada com uma versão mais recente. Nada a atualizar. Remova a pen USB.</translation> <translation id="787150342916295244">Digitalização de cartões de crédito</translation> <translation id="7874357055309047713">Executar sempre em todos os sites</translation> @@ -4650,7 +4650,6 @@ <translation id="7918257978052780342">Inscrever</translation> <translation id="7920092496846849526">Perguntaste aos teus pais se não havia problema em aceder a esta página.</translation> <translation id="7925285046818567682">A aguardar por <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824">O <ph name="PASSWORD_MANAGER_BRAND" /> memoriza as suas palavras-passe e inicia automaticamente sessão em aplicações e sites em vários dispositivos.</translation> <translation id="7925686952655276919">Não utilizar dados móveis para sincronização</translation> <translation id="7926906273904422255">Marque as origens não seguras como não seguras ou como "duvidosas".</translation> <translation id="7928710562641958568">Ejetar aparelho</translation> @@ -4712,7 +4711,6 @@ Mantenha o seu ficheiro de chave num local seguro, pois irá precisar dele para criar novas versões da sua extensão.</translation> <translation id="799923393800005025">Pode ver</translation> <translation id="7999338963698132743">Novo gestor de tarefas</translation> -<translation id="8000004253404706714">Utilizar o subsistema de animação intrusiva antigo para animações compostas nos renderizadores.</translation> <translation id="8004582292198964060">Navegador</translation> <translation id="8007030362289124303">Bateria fraca</translation> <translation id="8008356846765065031">A Internet está desligada. Verifique a ligação à Internet.</translation> @@ -5234,6 +5232,7 @@ <translation id="8765985713192161328">Gerir processadores...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Utilizadores</translation> +<translation id="8768367823103160496">Bloqueio do cursor do rato</translation> <translation id="8769662576926275897">Detalhes do cartão</translation> <translation id="8770196827482281187">Método de introdução persa (esquema ISIRI 2901)</translation> <translation id="8774934320277480003">Margem superior</translation> @@ -5253,6 +5252,7 @@ <translation id="8795668016723474529">Adicionar um cartão de crédito</translation> <translation id="8795916974678578410">Nova janela</translation> <translation id="8798099450830957504">Predefinição</translation> +<translation id="8799127529310003270">Se ativado, as chamadas de InputConnection são executadas no thread de IME e, em vez de manter um editor de réplicas, cada chamada de InputConnection comunica diretamente com o renderizador.</translation> <translation id="8799839487311913894">Ativar a atualização de palavra-passe no gestor de palavra-passe depois de enviar um formulário de "alterar palavra-passe".</translation> <translation id="8800004011501252845">A mostrar destinos para</translation> <translation id="8800420788467349919">Volume: <ph name="PRECENTAGE" /> %</translation> @@ -5278,6 +5278,7 @@ <translation id="8841142799574815336">Área visível inerte.</translation> <translation id="884264119367021077">Endereço para envio</translation> <translation id="8844238624737526720">Utilizar a implementação do Gestor de tarefas do Chrome nova e otimizada.</translation> +<translation id="8845001906332463065">Obter ajuda</translation> <translation id="8846141544112579928">A pesquisar teclado...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Alteração de modo com tecla Shift</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index cbbc58c..f6a482b6 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Marcați această pagină...</translation> <translation id="1047956942837015229">Se șterg <ph name="COUNT" /> elemente...</translation> <translation id="1048597748939794622">Activat forțat pentru toate straturile</translation> +<translation id="1049795001945932310">&Setări de limbă</translation> <translation id="1049926623896334335">Document Word</translation> <translation id="1054153489933238809">Deschide &imaginea originală într-o filă nouă</translation> <translation id="1055806300943943258">Se caută dispozitive cu Bluetooth și USB...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Transliterație (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Servere de nume automate</translation> <translation id="1215411991991485844">Nouă aplicație de fundal adăugată</translation> +<translation id="1216954813581739968">Activează fila pentru permiterea accesului la desktop.</translation> <translation id="121827551500866099">Afișează toate descărcările...</translation> <translation id="122082903575839559">Algoritm de semnare a certificatului</translation> <translation id="1221024147024329929">PKCS #1 MD2 cu criptare RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Conectarea automată nu a reușit</translation> <translation id="1293556467332435079">Fișiere</translation> <translation id="1294298200424241932">Editează setările privind încrederea:</translation> +<translation id="1295794900245526845">Alege contul salvat cu <ph name="PASSWORD_MANAGER_BRAND" /> pentru a te conecta</translation> <translation id="1297175357211070620">Destinație</translation> <translation id="1297922636971898492">Google Drive nu este disponibil momentan. Încărcarea va reporni automat când Google Drive va putea fi accesat.</translation> <translation id="1300861494336759522">Redirecționarea căutărilor de pe desktopul Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Astfel, pagina de pornire, pagina Filă nouă, motorul de căutare și filele fixate vor fi resetate. De asemenea, vor fi dezactivate toate extensiile, iar datele temporare vor fi șterse, cum ar fi cookie-urile. Marcajele, istoricul și parolele salvate nu vor fi șterse.</translation> <translation id="1434886155212424586">Pagina de pornire este pagina Filă nouă</translation> <translation id="1435550882135542937">Reproiectarea barei de instrumente pentru extensii</translation> +<translation id="1436402875660227532">Notă: aceste setări nu mai sunt folosite pentru acest sistem, dar le poți vedea și edita în continuare.</translation> <translation id="1436784010935106834">Eliminat</translation> <translation id="1438632560381091872">Activează sunetul filelor</translation> <translation id="1441841714100794440">Tastatură vietnameză (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Activați compatibilitatea cu tastatura virtuală.</translation> <translation id="1474079335130556426">Activează modul fundal pentru API-ul Push. Astfel, Chrome rulează în continuare după ce ultima fereastră este închisă și se lansează la pornirea sistemului de operare, dacă API-ul Push o solicită.</translation> <translation id="1474339897586437869">„<ph name="FILENAME" />” nu s-a încărcat. Nu există spațiu liber suficient în Google Drive.</translation> +<translation id="1476607407192946488">&Setări de limbă</translation> <translation id="1476949146811612304">Setați ce motor de căutare este utilizat atunci când se caută din <ph name="BEGIN_LINK" />caseta polivalentă<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Memorie cache pentru indicativele API-ului Identity</translation> <translation id="1478340334823509079">Detalii: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Această pagină utilizează o aplicație Client nativ care nu funcționează pe computerul dvs.</translation> <translation id="1965328510789761112">Memorie privată</translation> <translation id="1965624977906726414">Nu are permisiuni speciale.</translation> +<translation id="1968720524450620475">Activează pictogramele de acțiune pentru Notificările web.</translation> <translation id="1970746430676306437">Afișează &informații despre pagină</translation> <translation id="197288927597451399">Păstrează</translation> <translation id="1973491249112991739">Descărcarea pluginului <ph name="PLUGIN_NAME" /> a eșuat.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">Utilizează tastele - și = pentru a pagina o listă de sugestii</translation> <translation id="2347476388323331511">Nu s-a putut sincroniza</translation> <translation id="2347991999864119449">Voi alege când vreau să fie redat conținutul pluginurilor</translation> +<translation id="2348165084656290171">Pentru a trimite conținut audio, selectează o filă sau întregul ecran.</translation> <translation id="2350182423316644347">Se inițializează aplicația...</translation> <translation id="2350796302381711542">Permiteți ca <ph name="HANDLER_HOSTNAME" /> să deschidă toate linkurile <ph name="PROTOCOL" /> în locul <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Limbă și metodă de introducere a textului</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">Tastatură canadiană multilingvă</translation> <translation id="2478176599153288112">Permisiuni privind fișierele media pentru „<ph name="EXTENSION" />”</translation> <translation id="2478830106132467213">Deblochează acest <ph name="DEVICE_TYPE" /> numai când telefonul este foarte aproape.</translation> +<translation id="247949520305900375">Trimite conținutul audio</translation> <translation id="2479780645312551899">Rulează toate pluginurile de data aceasta</translation> <translation id="2480626392695177423">Comută modul de punctuație cu lățime întreagă/pe jumătate</translation> <translation id="2481332092278989943">Adaugă pe raft</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">Deschide linkul cu...</translation> <translation id="2889925978073739256">Continuă blocarea pluginurilor scoase din mediul de testare</translation> <translation id="2890624088306605051">Preluați numai setările și datele sincronizate</translation> +<translation id="2890678560483811744">Referința privind pagina este în afara limitelor</translation> <translation id="2893168226686371498">Browserul prestabilit</translation> <translation id="289426338439836048">Alte rețele mobile...</translation> <translation id="2894745200702272315">Activează o versiune experimentală a funcțiilor de detectare a expresiei de activare „Ok Google” care au o dependență hardware.</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">Foi de calcul</translation> <translation id="2927017729816812676">Stocarea pentru memoria cache</translation> <translation id="2927657246008729253">Modifică...</translation> -<translation id="2928415919076124714">Ascunde bara de instrumente în modul Ecran complet</translation> <translation id="2928526264833629376">Continuă în Hangouts</translation> <translation id="2930644991850369934">A apărut o problemă în timpul descărcării imaginii de recuperare. Conexiunea la rețea a fost pierdută.</translation> <translation id="293111069139560936">Permite raftului să minimizeze o fereastră dacă se dă clic pe un element din raft care are asociată o singură fereastră, deja activă.</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">Activează/Dezactivează tastatură virtuală mobilă.</translation> <translation id="3118319026408854581">Ajutor <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Criptare insuficientă pentru o operațiune pe: „<ph name="DEVICE_NAME" />”.</translation> +<translation id="3121260210578524273">Activează pictogramele în butoanele de acțiune pentru Notificările web.</translation> <translation id="3121793941267913344">Resetați acest dispozitiv <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Experimente cu Instrumentele pentru dezvoltatori</translation> <translation id="3122464029669770682">CPU</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">Introducere ușoară a simbolurilor</translation> <translation id="3289856944988573801">Pentru a verifica dacă există actualizări, utilizați Ethernet sau Wi-Fi.</translation> <translation id="3293325348208285494">Pornire rapidă</translation> -<translation id="3293894718455402932">„<ph name="EXTENSION" />” va putea citi și scrie fișierele imagine, video și audio din dosarele selectate.</translation> <translation id="3294437725009624529">Invitat</translation> <translation id="329650768420594634">Avertisment privind pachetul pentru extensie</translation> <translation id="3296763833017966289">Georgiană</translation> @@ -1638,6 +1646,7 @@ <translation id="3338239663705455570">Tastatură slovenă</translation> <translation id="3340978935015468852">setări</translation> <translation id="3341703758641437857">Permite accesul la adresele URL de fișiere</translation> +<translation id="3343813173145836998">Conectează-te cu ușurință pe acest dispozitiv</translation> <translation id="3344786168130157628">Nume punct de acces:</translation> <translation id="3345135638360864351">Solicitarea de a accesa acest site nu a putut fi trimisă la <ph name="NAME" />. Încearcă din nou.</translation> <translation id="3345886924813989455">Nu a fost găsit niciun browser acceptat</translation> @@ -2117,6 +2126,7 @@ <translation id="3996912167543967198">Se resetează...</translation> <translation id="3997015411467176489">Funcții experimentale ale obiectului Canvas</translation> <translation id="40027638859996362">Mutarea cuvintelor</translation> +<translation id="400554499662786523">Pentru a trimite conținut audio, selectează o filă.</translation> <translation id="4012550234655138030">Configurați sau gestionați imprimantele din <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Repari „<ph name="EXTENSION_NAME" />”?</translation> <translation id="4018133169783460046">Afișează <ph name="PRODUCT_NAME" /> în această limbă</translation> @@ -2219,6 +2229,7 @@ <translation id="4180788401304023883">Șterge certificatul CA „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="418179967336296930">Tastatură rusă fonetică (YaZHert)</translation> <translation id="4181841719683918333">Limbi</translation> +<translation id="4187248015940562149">Activează Web Bluetooth, care ar putea permite site-urilor să se conecteze la dispozitive Bluetooth din apropiere și să le controleze.</translation> <translation id="4188026131102273494">Cuvânt cheie:</translation> <translation id="4189406272289638749">O extensie, <b><ph name="EXTENSION_NAME" /></b>, controlează această setare.</translation> <translation id="4193154014135846272">Document Google</translation> @@ -2275,6 +2286,7 @@ <translation id="4268025649754414643">Cifrare cheie</translation> <translation id="4268574628540273656">Adresă URL:</translation> <translation id="4270393598798225102">Versiunea <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Nicio potrivire</translation> <translation id="4274187853770964845">Eroare de sincronizare: opriți și reporniți sincronizarea.</translation> <translation id="4275830172053184480">Reporniți gadgetul</translation> <translation id="4276796043975446927">Bun venit la Chromebox pentru videoconferințe</translation> @@ -2344,6 +2356,7 @@ <translation id="4378551569595875038">Se stabilește conexiunea...</translation> <translation id="438122767399415311">Impune direcția interfeței de utilizare</translation> <translation id="4381849418013903196">Două puncte</translation> +<translation id="4383192539467954373">Conectare automată pe toate dispozitivele</translation> <translation id="4384652540891215547">Activați extensia</translation> <translation id="438503109373656455">Fulgeraș</translation> <translation id="4387554346626014084">Activează sincronizarea Lansatorului de aplicații. Activează și Dosarele, după caz (non-OSX).</translation> @@ -2361,6 +2374,7 @@ <translation id="4421932782753506458">Pufoșel</translation> <translation id="4422347585044846479">Editați marcajul pentru această pagină</translation> <translation id="4422428420715047158">Domeniul:</translation> +<translation id="4423482519432579560">&Verificare ortografică</translation> <translation id="442477792133831654">Comunică cu dispozitive din apropiere</translation> <translation id="4425149324548788773">Contul meu Drive</translation> <translation id="4428582326923056538">Excepțiile Adobe Flash Player pentru camera foto sunt diferite.</translation> @@ -2375,6 +2389,7 @@ <translation id="444267095790823769">Excepții cu privire la conținutul protejat</translation> <translation id="4443536555189480885">&Ajutor</translation> <translation id="4444304522807523469">Accesează scanerele de documente atașate prin USB sau dintr-o rețea locală</translation> +<translation id="4445559854264555037">Dispozitivul nu apare? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Oglindit</translation> <translation id="4447465454292850432">Baterie:</translation> <translation id="4449935293120761385">Despre completarea automată</translation> @@ -2632,6 +2647,7 @@ <translation id="485316830061041779">Germană</translation> <translation id="4856478137399998590">Serviciul de date mobile este activat și gata de utilizare</translation> <translation id="4858913220355269194">Jucător</translation> +<translation id="4860565041166337978">Permite descărcărilor să fie gestionate de managerul de descărcări al sistemului atunci când este posibil.</translation> <translation id="48607902311828362">Mod Avion</translation> <translation id="4861833787540810454">&Redă</translation> <translation id="4862050643946421924">Se adaugă dispozitivul...</translation> @@ -2715,7 +2731,6 @@ <translation id="4977942889532008999">Confirmați accesul</translation> <translation id="4982718461356080574">Ascunderea butoanelor de închidere în filele inactive atunci când sunt stivuite</translation> <translation id="498294082491145744">Modifică setările care controlează accesul site-ului la funcții cum ar fi cookie-urile, JavaScript, pluginurile, localizarea geografică, microfonul, camera foto etc.</translation> -<translation id="4984329823325527157">API-ul Media Source</translation> <translation id="4988526792673242964">Pagini</translation> <translation id="4988792151665380515">Exportul cheii publice nu a reușit.</translation> <translation id="49896407730300355">Rotiți în sens &invers acelor de ceasornic</translation> @@ -2904,7 +2919,6 @@ <translation id="5268606875983318825">PPAPI (în afara procesului)</translation> <translation id="526926484727016706">Determină neacordarea niciunei permisiuni pentru toate cadrele iframe, în mod prestabilit. Acordarea anumitor permisiuni pentru un anumit cadru iframe poate implica afișarea numelor permisiunilor respective ca valori ale noilor atribute iframe.</translation> <translation id="5269977353971873915">Printarea a eșuat</translation> -<translation id="5270884342523754894">„<ph name="EXTENSION" />” va putea citi fișierele imagine, video și audio din dosarele selectate.</translation> <translation id="5271247532544265821">Comută între modurile de introducere a textului în chineză simplificată și chineză tradițională</translation> <translation id="5271549068863921519">Salvează parola</translation> <translation id="5273628206174272911">Navigarea experimentală în istoric ca reacție la derularea suplimentară pe orizontală.</translation> @@ -2941,6 +2955,7 @@ <translation id="5316716239522500219">Oglindiți monitoarele</translation> <translation id="5317780077021120954">Salvează</translation> <translation id="5319782540886810524">Tastatură letonă</translation> +<translation id="532247166573571973">Este posibil ca serverul să nu poată fi accesat. Încearcă din nou mai târziu.</translation> <translation id="5323213332664049067">America Latină</translation> <translation id="532360961509278431">Nu se poate deschide „$1”: $2</translation> <translation id="5324674707192845912">Vei anula înregistrarea acestui dispozitiv <ph name="DEVICE_TYPE" /> la Google pentru a dezactiva funcțiile de localizare, ștergere a datelor și blocare la distanță a dispozitivului. Pentru aceasta trebuie să îl repornești. Dorești să continui?</translation> @@ -2993,11 +3008,11 @@ <translation id="5390284375844109566">Bază de date indexată</translation> <translation id="5392544185395226057">Activează compatibilitatea pentru Clientul nativ.</translation> <translation id="5393125431335030955">Acest plugin funcționează numai pe desktop.</translation> -<translation id="5393559999218790205">Dezactivează cronologiile pentru animația din compozitor în interfața de utilizare</translation> <translation id="5396126354477659676">Pluginul <ph name="PEPPER_PLUGIN_NAME" /> de pe <ph name="PEPPER_PLUGIN_DOMAIN" /> dorește să vă acceseze computerul.</translation> <translation id="539755880180803351">Adnotează formularele web cu predicțiile de introducere din câmpul de completare automată ca text substituent.</translation> <translation id="5397578532367286026">Datele privind utilizarea și istoricul ale acestui utilizator pot fi examinate de administrator (<ph name="MANAGER_EMAIL" />) pe chrome.com.</translation> <translation id="5397794290049113714">Dvs.</translation> +<translation id="5398572795982417028">Referința privind pagina este în afara limitelor (limita este <ph name="MAXIMUM_PAGE" />)</translation> <translation id="5398824043967640339"><ph name="COUNT" /> de pe alte site-uri</translation> <translation id="5399158067281117682">Codurile PIN nu coincid!</translation> <translation id="5400640815024374115">Chipul Trusted Platform Module (TPM) este dezactivat sau absent.</translation> @@ -3017,7 +3032,7 @@ <translation id="5423849171846380976">Activat</translation> <translation id="5425470845862293575">Activează utilizarea sistemului experimental DirectWrite de afișare a fonturilor.</translation> <translation id="5425722269016440406">Trebuie să fii online pentru a dezactiva Smart Lock, deoarece această setare este sincronizată cu telefonul și cu alte dispozitive ale tale. Conectează-te la o rețea mai întâi.</translation> -<translation id="5426623592374109001">Folosește un subsistem de animație vechi și inoportun pentru animațiile compuse în interfața de utilizare.</translation> +<translation id="5425863515030416387">Conectează-te cu ușurință pe toate dispozitivele</translation> <translation id="5427459444770871191">Rotiți în sensul acelor de &ceasornic</translation> <translation id="5428105026674456456">Spaniolă</translation> <translation id="542872847390508405">Navigați ca invitat</translation> @@ -3042,6 +3057,7 @@ <translation id="5451646087589576080">Afișează &informații despre cadru</translation> <translation id="5453029940327926427">Închide filele</translation> <translation id="5453632173748266363">Chirilic</translation> +<translation id="5454166040603940656">cu <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Nevalide</translation> <translation id="5457459357461771897">Citește și șterge fotografii, muzică și alte tipuri de conținut media de pe computer</translation> <translation id="5457599981699367932">Navighează ca invitat</translation> @@ -3211,7 +3227,6 @@ <translation id="5708171344853220004">Nume unic Microsoft</translation> <translation id="5709885306771508267">Redimensionare prin ciupire</translation> <translation id="5710406368443808765">Hopa! Sistemul nu a putut stoca indicativul și ID-ul dispozitivului.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> nu răspunde. Nu se poate proiecta.</translation> <translation id="5711983031544731014">Nu se poate debloca. Introdu parola.</translation> <translation id="5712966208980506909">Dacă opțiunea este activată, adresa URL chrome://md-policy încarcă pagina politicii pentru designul material.</translation> <translation id="5715711091495208045">Broker pluginuri: <ph name="PLUGIN_NAME" /></translation> @@ -3478,7 +3493,6 @@ <translation id="6111974609785983504">Permis în mod prestabilit</translation> <translation id="6113134669445407638">Dezactivează Delay Agnostic AEC în WebRTC. Folosește această opțiune dacă întârzierile de sistem raportate sunt de încredere sau dacă alți utilizatori au întâmpinat probleme privind ecoul de pe computer.</translation> <translation id="6116921718742659598">Schimbați setările pentru limbă și introducere de text</translation> -<translation id="6117536376248197233">Dezactivează cronologiile pentru animația din compozitor în programele de redare.</translation> <translation id="6120205520491252677">Fixați această pagină pe ecranul de pornire...</translation> <translation id="6122081475643980456">Conexiunea la internet este controlată</translation> <translation id="6122093587541546701">Adresă de e-mail (opțională):</translation> @@ -3510,6 +3524,7 @@ <translation id="6163522313638838258">Extinde-le pe toate...</translation> <translation id="6164005077879661055">Toate fișierele și datele locale asociate acestui utilizator monitorizat vor fi șterse definitiv după eliminarea acestui utilizator monitorizat. Site-urile web accesate și setările acestui utilizator monitorizat pot fi în continuare vizibile pentru manager la <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Află mai multe</translation> +<translation id="6167008112175207002">Marcajele, istoricul, parolele și alte setări vor fi sincronizate cu Contul Google, pentru a le putea folosi pe toate dispozitivele. Poți modifica această opțiune în <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Funcții de tipul „Ok Google” simulate prin hardware</translation> <translation id="6175314957787328458">GUID domeniu Microsoft</translation> <translation id="6178664161104547336">Selectează un certificat</translation> @@ -3713,6 +3728,7 @@ <translation id="648927581764831596">Indisponibil</translation> <translation id="6490936204492416398">Instalează extensii noi din magazinul web</translation> <translation id="6492313032770352219">Dimensiune pe disc:</translation> +<translation id="6498249116389603658">&Toate limbile tale</translation> <translation id="6499143127267478107">Se rezolvă gazda în scriptul proxy...</translation> <translation id="6503077044568424649">Cele mai vizitate</translation> <translation id="6503256918647795660">Tastatură franceză elvețiană</translation> @@ -3754,7 +3770,6 @@ <translation id="6555432686520421228">Eliminați toate conturile de utilizator și resetați gadgetul <ph name="IDS_SHORT_PRODUCT_NAME" /> la valorile din fabrică.</translation> <translation id="6556866813142980365">Repetă</translation> <translation id="6557565812667414268">Activat numai pentru ecranele de înaltă rezoluție</translation> -<translation id="655845594391856372">Fila nu răspunde. Nu se poate proiecta.</translation> <translation id="6559580823502247193">(există deja pe acest dispozitiv)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Se extrage imaginea de recuperare...</translation> @@ -3855,6 +3870,7 @@ <translation id="6723354935081862304">Printați cu Documente Google și cu alte destinații din cloud. <ph name="BEGIN_LINK" />Conectați-vă<ph name="END_LINK" /> pentru a printa cu Google Cloud Print.</translation> <translation id="6723661294526996303">Importați marcajele și setările...</translation> <translation id="6723839937902243910">Alimentare</translation> +<translation id="6725240607822645708">Rulează IME folosind propriul său fir.</translation> <translation id="6725970970008349185">Numărul de sugestii de afișat pe pagină</translation> <translation id="672609503628871915">Vedeți noutățile</translation> <translation id="6727005317916125192">Panoul anterior</translation> @@ -3985,12 +4001,11 @@ <translation id="6948736568813450284">Pentru dezvoltatori: folosește mediul de testare securizat pentru apelările API-ului Google Payments.</translation> <translation id="6949306908218145636">Marcați paginile deschise...</translation> <translation id="695164542422037736">Dacă această opțiune este activată și dacă pentru corp este aplicat un stil cu background-attachment:fixed, fundalul va avea propriul strat compus.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> reține parolele și te conectează automat pe site-uri de pe acest dispozitiv.</translation> <translation id="6955446738988643816">Fereastră pop-up de inspectare</translation> <translation id="695755122858488207">Buton radio nebifat</translation> +<translation id="6960277925159781810">Conectare automată pe acest dispozitiv</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Activează sincronizarea prin date mobile</translation> -<translation id="6964308487066031935">Adăugați dosarele la „<ph name="EXTENSION" />”?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Dispozitiv</translation> @@ -4088,7 +4103,6 @@ <translation id="7076293881109082629">Conectare</translation> <translation id="7077829361966535409">Pagina de conectare nu s-a putut încărca utilizând setările de proxy actuale. <ph name="GAIA_RELOAD_LINK_START" />Încercați să vă conectați din nou<ph name="GAIA_RELOAD_LINK_END" /> sau utilizați alte <ph name="PROXY_SETTINGS_LINK_START" />setări de proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Handlere de protocol ignorate</translation> -<translation id="7079038783243627996">„<ph name="EXTENSION" />” va putea citi și șterge fișierele imagine, video și audio din dosarele selectate.</translation> <translation id="708060913198414444">C&opiază adresa conținutului audio</translation> <translation id="708187310695946552">Interfață de utilizare cu baloane pentru restabilirea sesiunii</translation> <translation id="7082055294850503883">Ignoră starea CapsLock și introdu minuscule în mod prestabilit</translation> @@ -4232,6 +4246,8 @@ <translation id="7313804056609272439">Metoda de introducere a textului în vietnameză (VNI)</translation> <translation id="7314244761674113881">Gazdă SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (actual)</translation> +<translation id="7321545336522791733">Serverul nu poate fi accesat</translation> +<translation id="7324841169865301118">Permite utilizatorului să aleagă o filă pentru permiterea accesului la desktop.</translation> <translation id="7325437708553334317">Extensia Contrast ridicat</translation> <translation id="7326565110843845436">Clic cu trei degete pe touchpad</translation> <translation id="73289266812733869">Deselectat</translation> @@ -4458,7 +4474,6 @@ <translation id="7650511557061837441">„<ph name="TRIGGERING_EXTENSION_NAME" />” dorește să elimine „<ph name="EXTENSION_NAME" />”.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> este afișat în această limbă</translation> <translation id="7654941827281939388">Acest cont este deja utilizat pe acest computer.</translation> -<translation id="7655165758820095116">Obiectul MediaSource permite ca JavaScript să trimită date media direct către un element video.</translation> <translation id="7658239707568436148">Anulează</translation> <translation id="7659584679870740384">Nu ești autorizat(ă) să folosești acest dispozitiv. Contactează administratorul pentru permisiunea de conectare.</translation> <translation id="7664620655576155379">Dispozitiv Bluetooth neacceptat: „<ph name="DEVICE_NAME" />”.</translation> @@ -4589,6 +4604,7 @@ <translation id="7861215335140947162">&Descărcări</translation> <translation id="7864539943188674973">Dezactivați Bluetooth</translation> <translation id="7868891395842935202">Activează Platforma experimentală pentru a controla accesul la experimentele privind API-urile.</translation> +<translation id="7870576007982733437">Folosește managerul de descărcări al sistemului când este posibil.</translation> <translation id="7870790288828963061">Nu s-a găsit nicio aplicație de tip chioșc cu o versiune mai recentă. Nimic de actualizat. Scoate stickul USB.</translation> <translation id="787150342916295244">Scanarea cardurilor de credit</translation> <translation id="7874357055309047713">Rulează întotdeauna pe toate site-urile</translation> @@ -4631,7 +4647,6 @@ <translation id="7918257978052780342">Înscrieți</translation> <translation id="7920092496846849526">Ai întrebat părintele dacă poți accesa această pagină.</translation> <translation id="7925285046818567682">Se așteaptă <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> reține parolele și te conectează automat la aplicații și pe site-uri, de pe toate dispozitivele.</translation> <translation id="7925686952655276919">Nu utilizați date mobile pentru sincronizare</translation> <translation id="7926906273904422255">Marchează originile nesecurizate ca nesecurizate sau ca „îndoielnice”.</translation> <translation id="7928710562641958568">Scoateți dispozitivul</translation> @@ -4693,7 +4708,6 @@ Păstrează fișierul cu cheia într-un loc sigur. Acesta va fi necesar la crearea noilor versiuni ale extensiei.</translation> <translation id="799923393800005025">Poate vedea</translation> <translation id="7999338963698132743">Noul manager de activități</translation> -<translation id="8000004253404706714">Folosește un subsistem de animație vechi și inoportun pentru animațiile compuse în programele de redare.</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8007030362289124303">Baterie descărcată</translation> <translation id="8008356846765065031">Internet deconectat. Verificați conexiunea la internet.</translation> @@ -4822,6 +4836,7 @@ <translation id="8185331656081929126">Afișați notificări când în rețea sunt detectate imprimante noi</translation> <translation id="8186609076106987817">Serverul nu a putut găsi fișierul.</translation> <translation id="8186706823560132848">Software</translation> +<translation id="8188120771410500975">&Verifică ortografia câmpurilor de text</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> și încă <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Se conectează la <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Gestionează aplicațiile, extensiile și temele dvs.</translation> @@ -5214,6 +5229,7 @@ <translation id="8765985713192161328">Gestionează handlerele...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Utilizatori</translation> +<translation id="8768367823103160496">Blocarea pentru cursorul mouse-ului</translation> <translation id="8769662576926275897">Detaliile cardului</translation> <translation id="8770196827482281187">Metoda de introducere a textului în persană (aspect ISIRI 2901)</translation> <translation id="8774934320277480003">Margine sus</translation> @@ -5233,6 +5249,7 @@ <translation id="8795668016723474529">Adaugă un card de credit</translation> <translation id="8795916974678578410">Fereastră nouă</translation> <translation id="8798099450830957504">Prestabilit</translation> +<translation id="8799127529310003270">Dacă este activat, apelările rutinei InputConnection rulează folosind firul IME și, în loc să păstreze un editor de reproducere, fiecare apelare a rutinei InputConnection va contacta direct programul de redare.</translation> <translation id="8799839487311913894">Activează actualizarea unei parole din managerul de parole după trimiterea unui formular „Schimbă parola”.</translation> <translation id="8800004011501252845">Se afișează destinații pentru</translation> <translation id="8800420788467349919">Volum: <ph name="PRECENTAGE" /> %</translation> @@ -5258,6 +5275,7 @@ <translation id="8841142799574815336">Spațiul vizibil al conținutului inert.</translation> <translation id="884264119367021077">Adresa de expediere</translation> <translation id="8844238624737526720">Folosește noua și optimizata implementare a managerului de activități din Chrome.</translation> +<translation id="8845001906332463065">Obține ajutor</translation> <translation id="8846141544112579928">Se caută tastatura...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Comutare mod tastă Shift</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index d1957776..17998a13 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Добавить страницу в закладки…</translation> <translation id="1047956942837015229">Удаление элементов (<ph name="COUNT" />)…</translation> <translation id="1048597748939794622">Принудительное включение для всех слоев</translation> +<translation id="1049795001945932310">&Язык</translation> <translation id="1049926623896334335">Документ Word</translation> <translation id="1054153489933238809">Открыть оригинальное изображение в новой вкладке</translation> <translation id="1055806300943943258">Поиск Bluetooth- и USB-устройств...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Транслитерация (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Автоматические серверы имен</translation> <translation id="1215411991991485844">Добавлено фоновое приложение</translation> +<translation id="1216954813581739968">Включить общий доступ к вкладке</translation> <translation id="121827551500866099">Все скачанные файлы…</translation> <translation id="122082903575839559">Алгоритм подписи сертификатов</translation> <translation id="1221024147024329929">PKCS #1 MD2 с шифрованием RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Автоматический вход не выполнен</translation> <translation id="1293556467332435079">Файлы</translation> <translation id="1294298200424241932">Изменить настройки доверия:</translation> +<translation id="1295794900245526845">Чтобы войти, выберите нужный аккаунт в <ph name="PASSWORD_MANAGER_BRAND" /></translation> <translation id="1297175357211070620">Принтер</translation> <translation id="1297922636971898492">Google Диск временно недоступен. Когда доступ будет восстановлен, загрузка автоматически возобновится.</translation> <translation id="1300861494336759522">Перенаправлять поисковые запросы с рабочего стола Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Будут сброшены настройки главной страницы, страницы быстрого доступа и поисковой системы, а также откреплены все вкладки. Кроме того, система отключит все расширения и удалит все временные данные, такие как файлы cookie. Ваши закладки, история просмотров и пароли будут сохранены.</translation> <translation id="1434886155212424586">В качестве главной страницы установлена страница быстрого доступа.</translation> <translation id="1435550882135542937">Новое оформление панели инструментов расширений</translation> +<translation id="1436402875660227532">Примечание. Эти настройки больше не используются системой, но вы можете просматривать и изменять их.</translation> <translation id="1436784010935106834">Удалено</translation> <translation id="1438632560381091872">Включить звук на вкладках</translation> <translation id="1441841714100794440">Вьетнамская раскладка (TELEX)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Включает поддержку виртуальной клавиатуры.</translation> <translation id="1474079335130556426">Включите фоновый режим для Push API. Браузер Chrome продолжит работать после закрытия всех окон, а также будет автоматически запускаться после загрузки системы (когда это необходимо).</translation> <translation id="1474339897586437869">Не удалось загрузить <ph name="FILENAME" />. Не хватает пространства на Google Диске.</translation> +<translation id="1476607407192946488">&Язык</translation> <translation id="1476949146811612304">Выберите <ph name="BEGIN_LINK" />поисковую систему по умолчанию<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Кеш токенов API идентификационных данных</translation> <translation id="1478340334823509079">Подробные сведения: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">На этой странице используется приложение Native Client, не поддерживаемое вашим компьютером.</translation> <translation id="1965328510789761112">Частная память</translation> <translation id="1965624977906726414">Без специальных разрешений.</translation> +<translation id="1968720524450620475">Включить значки действий для Web Notifications</translation> <translation id="1970746430676306437">Просмотр &сведений о странице</translation> <translation id="197288927597451399">Сохранить</translation> <translation id="1973491249112991739">Не удалось скачать плагин <ph name="PLUGIN_NAME" />.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">Клавиши "-" и "=" позволяют пролистывать список вариантов</translation> <translation id="2347476388323331511">Не удалось синхронизировать</translation> <translation id="2347991999864119449">Запрашивать разрешение на запуск контента плагинов</translation> +<translation id="2348165084656290171">Чтобы открыть общий доступ к аудио, выберите вкладку или окно.</translation> <translation id="2350182423316644347">Запуск приложения...</translation> <translation id="2350796302381711542">Использовать <ph name="HANDLER_HOSTNAME" /> для обработки ссылок типа "<ph name="PROTOCOL" />" вместо сервиса "<ph name="REPLACED_HANDLER_TITLE" />"?</translation> <translation id="2351266942280602854">Языки и раскладки клавиатуры</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">Канадская многоязычная раскладка клавиатуры</translation> <translation id="2478176599153288112"><ph name="EXTENSION" />: доступ к медиафайлам</translation> <translation id="2478830106132467213">Разблокировать устройство <ph name="DEVICE_TYPE" />, только когда телефон находится на расстоянии вытянутой руки</translation> +<translation id="247949520305900375">Общий доступ к аудио</translation> <translation id="2479780645312551899">Однократно запустить все плагины</translation> <translation id="2480626392695177423">Переключение полного/половинного режима ширины пунктуации</translation> <translation id="2481332092278989943">Добавить на панель запуска</translation> @@ -1311,6 +1319,7 @@ <translation id="2889064240420137087">Открыть ссылку с помощью...</translation> <translation id="2889925978073739256">Всегда блокировать плагины вне тестовой среды</translation> <translation id="2890624088306605051">Выбрать только синхронизированные данные и настройки</translation> +<translation id="2890678560483811744">Размер страницы больше максимально допустимого</translation> <translation id="2893168226686371498">Браузер по умолчанию</translation> <translation id="289426338439836048">Другие мобильные сети...</translation> <translation id="2894745200702272315">Включает экспериментальные настройки распознавания голосовых команд "О'кей, Google", зависящие от аппаратного обеспечения.</translation> @@ -1339,7 +1348,6 @@ <translation id="2925966894897775835">Таблицы</translation> <translation id="2927017729816812676">CacheStorage</translation> <translation id="2927657246008729253">Изменить...</translation> -<translation id="2928415919076124714">Скрывать панель инструментов в полноэкранном режиме</translation> <translation id="2928526264833629376">Перейти к Hangouts</translation> <translation id="2930644991850369934">При скачивании образа для восстановления произошла ошибка. Нет подключения к сети.</translation> <translation id="293111069139560936">Если приложение открыто только в одном, уже активном окне, при нажатии на его значок на панели запуска окно будет сворачиваться.</translation> @@ -1463,6 +1471,7 @@ <translation id="3117812041123364382">Позволяет включить/отключить всплывающую виртуальную клавиатуру.</translation> <translation id="3118319026408854581">Справка <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Неполное шифрование операции на устройстве <ph name="DEVICE_NAME" />.</translation> +<translation id="3121260210578524273">Включает значки действий для Web Notifications.</translation> <translation id="3121793941267913344">Сбросить настройки устройства <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Функция экспериментов для разработчиков</translation> <translation id="3122464029669770682">ЦПУ</translation> @@ -1583,7 +1592,6 @@ <translation id="3289566588497100676">Простой ввод символов</translation> <translation id="3289856944988573801">Чтобы проверить наличие обновлений, подключитесь через сеть Ethernet или Wi-Fi.</translation> <translation id="3293325348208285494">Быстрый запуск</translation> -<translation id="3293894718455402932">Расширение "<ph name="EXTENSION" />" получит доступ на чтение и запись изображений, видео и аудиофайлов в отмеченных папках.</translation> <translation id="3294437725009624529">Гость</translation> <translation id="329650768420594634">Внимание!</translation> <translation id="3296763833017966289">Грузинский</translation> @@ -1640,6 +1648,7 @@ <translation id="3338239663705455570">Словенская раскладка</translation> <translation id="3340978935015468852">настройках</translation> <translation id="3341703758641437857">Разрешить открывать файлы по ссылкам</translation> +<translation id="3343813173145836998">Быстрый вход на этом устройстве</translation> <translation id="3344786168130157628">Название точки доступа:</translation> <translation id="3345135638360864351">Не удалось отправить пользователю <ph name="NAME" /> запрос на доступ к этому сайту. Повторите попытку.</translation> <translation id="3345886924813989455">Поддерживаемые браузеры не найдены</translation> @@ -2119,6 +2128,7 @@ <translation id="3996912167543967198">Сброс...</translation> <translation id="3997015411467176489">Экспериментальные функции canvas</translation> <translation id="40027638859996362">Сдвинуть на одно слово</translation> +<translation id="400554499662786523">Чтобы открыть доступ к аудио, выберите вкладку.</translation> <translation id="4012550234655138030">Настройка принтеров с помощью технологии <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Восстановить "<ph name="EXTENSION_NAME" />"?</translation> <translation id="4018133169783460046">Отображать <ph name="PRODUCT_NAME" /> на этом языке</translation> @@ -2221,6 +2231,7 @@ <translation id="4180788401304023883">Удалить сертификат "<ph name="CERTIFICATE_NAME" />" Центра сертификации?</translation> <translation id="418179967336296930">Русская раскладка (фонетическая – YaZHert)</translation> <translation id="4181841719683918333">Языки</translation> +<translation id="4187248015940562149">Включает Web Bluetooth и разрешает веб-сайтам подключаться к Bluetooth-устройствам, а также управлять ими.</translation> <translation id="4188026131102273494">Ключевое слово:</translation> <translation id="4189406272289638749">Этот параметр управляется расширением <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Документ Google</translation> @@ -2277,6 +2288,7 @@ <translation id="4268025649754414643">Шифрование ключей</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Версия <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Ничего не найдено</translation> <translation id="4274187853770964845">Ошибка. Остановите синхронизацию, затем запустите ее заново.</translation> <translation id="4275830172053184480">Перезапуск устройства</translation> <translation id="4276796043975446927">Добро пожаловать в Chromebox для видеоконференций!</translation> @@ -2346,6 +2358,7 @@ <translation id="4378551569595875038">Подключение…</translation> <translation id="438122767399415311">Задать обязательное направление письма</translation> <translation id="4381849418013903196">Двоеточие</translation> +<translation id="4383192539467954373">Автоматический вход на всех устройствах</translation> <translation id="4384652540891215547">Активация расширения</translation> <translation id="438503109373656455">Скачки</translation> <translation id="4387554346626014084">Включение синхронизации для Панели запуска приложений. Также, где это возможно, включаются папки (не в Mac OS X).</translation> @@ -2363,6 +2376,7 @@ <translation id="4421932782753506458">Пушистик</translation> <translation id="4422347585044846479">Изменить эту закладку</translation> <translation id="4422428420715047158">Домен:</translation> +<translation id="4423482519432579560">&Проверка правописания</translation> <translation id="442477792133831654">Обмен данными с расположенными рядом устройствами</translation> <translation id="4425149324548788773">Мой диск</translation> <translation id="4428582326923056538">Исключения Adobe Flash Player для камеры отличаются.</translation> @@ -2377,6 +2391,7 @@ <translation id="444267095790823769">Исключения для защищенного контента</translation> <translation id="4443536555189480885">&Справка</translation> <translation id="4444304522807523469">Доступ к сканерам, подключенным через USB-порт или локальную сеть</translation> +<translation id="4445559854264555037">Не можете найти свое устройство? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Зеркальное отображение</translation> <translation id="4447465454292850432">Батарея:</translation> <translation id="4449935293120761385">Подробнее…</translation> @@ -2635,6 +2650,7 @@ <translation id="485316830061041779">Немецкий</translation> <translation id="4856478137399998590">Служба передачи данных в мобильных сетях активирована и готова к использованию</translation> <translation id="4858913220355269194">Футбол</translation> +<translation id="4860565041166337978">Разрешает системному диспетчеру загрузки обрабатывать скачанные файлы (если применимо).</translation> <translation id="48607902311828362">Режим "В полете"</translation> <translation id="4861833787540810454">&Воспроизвести</translation> <translation id="4862050643946421924">Добавление устройства</translation> @@ -2718,7 +2734,6 @@ <translation id="4977942889532008999">Подтверждение доступа</translation> <translation id="4982718461356080574">Скрывать значки для закрытия неактивных вкладок, расположенных каскадом</translation> <translation id="498294082491145744">Изменить настройки доступа сайтов к файлам cookie, JavaScript, плагинам, геоданным, микрофону, камере и другим функциям</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Страницы</translation> <translation id="4988792151665380515">Не удалось экспортировать закрытый ключ.</translation> <translation id="49896407730300355">Повернуть п&ротив часовой стрелки</translation> @@ -2907,7 +2922,6 @@ <translation id="5268606875983318825">PPAPI (вне процесса)</translation> <translation id="526926484727016706">По умолчанию запрещает окнам iframe получать разрешения. Если вы всё же предоставите их, названия разрешений могут появиться атрибутах окон iframe в качестве значений.</translation> <translation id="5269977353971873915">Печать не выполнена</translation> -<translation id="5270884342523754894">Расширение "<ph name="EXTENSION" />" получит доступ на чтение изображений, видео и аудиофайлов в отмеченных папках.</translation> <translation id="5271247532544265821">Переключить режим упрощенного/традиционного китайского письма</translation> <translation id="5271549068863921519">Сохранить пароль</translation> <translation id="5273628206174272911">Обеспечивает перемещение по истории просмотра при достижении конца горизонтальной прокрутки.</translation> @@ -2944,6 +2958,7 @@ <translation id="5316716239522500219">Дублировать изображения на мониторах</translation> <translation id="5317780077021120954">Сохранить</translation> <translation id="5319782540886810524">Латышская раскладка</translation> +<translation id="532247166573571973">Сервер недоступен. Повторите попытку позже.</translation> <translation id="5323213332664049067">Латинская Америка</translation> <translation id="532360961509278431">Не удается открыть "$1": $2</translation> <translation id="5324674707192845912">Отменив регистрацию устройства <ph name="DEVICE_TYPE" />, вы больше не сможете узнавать его местоположение, блокировать его или удалять с него данные дистанционно. Для отмены регистрации требуется перезагрузка. Продолжить?</translation> @@ -2996,11 +3011,11 @@ <translation id="5390284375844109566">Индексированная база данных</translation> <translation id="5392544185395226057">Включить поддержку Native Client.</translation> <translation id="5393125431335030955">Этот плагин поддерживается только на ПК.</translation> -<translation id="5393559999218790205">Отключить временную шкалу для анимации элементов интерфейса</translation> <translation id="5396126354477659676">Плагин <ph name="PEPPER_PLUGIN_NAME" /> в домене <ph name="PEPPER_PLUGIN_DOMAIN" /> пытается получить доступ к вашему компьютеру.</translation> <translation id="539755880180803351">Добавляет подсказки автозаполнения в веб-формы в виде текста-заполнителя.</translation> <translation id="5397578532367286026">Менеджер (<ph name="MANAGER_EMAIL" />) может просматривать данные об использовании и историю этого профиля на сайте chrome.com.</translation> <translation id="5397794290049113714">Вы</translation> +<translation id="5398572795982417028">Размер страницы больше максимально допустимого (лимит ‒ <ph name="MAXIMUM_PAGE" />)</translation> <translation id="5398824043967640339"><ph name="COUNT" /> на других сайтах</translation> <translation id="5399158067281117682">PIN-коды не совпадают.</translation> <translation id="5400640815024374115">Микросхема доверенного платформенного модуля отключена или отсутствует.</translation> @@ -3020,7 +3035,7 @@ <translation id="5423849171846380976">Активировано</translation> <translation id="5425470845862293575">Включает экспериментальную систему обработки шрифтов DirectWrite.</translation> <translation id="5425722269016440406">Чтобы отключить Smart Lock, войдите в Интернет. Функция настроена на нескольких устройствах, поэтому необходима синхронизация.</translation> -<translation id="5426623592374109001">Использовать старую подсистему анимации элементов интерфейса</translation> +<translation id="5425863515030416387">Быстрый вход на всех устройствах</translation> <translation id="5427459444770871191">Повернуть &по часовой стрелке</translation> <translation id="5428105026674456456">Испанский</translation> <translation id="542872847390508405">Вы вошли в гостевом режиме</translation> @@ -3045,6 +3060,7 @@ <translation id="5451646087589576080">Просмотреть сведения о фрейме</translation> <translation id="5453029940327926427">Закрыть вкладки</translation> <translation id="5453632173748266363">Кириллица</translation> +<translation id="5454166040603940656">с помощью <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Недопустимые данные</translation> <translation id="5457459357461771897">Доступ к фотографиям, музыке и другим медиафайлам на вашем компьютере, а также их удаление</translation> <translation id="5457599981699367932">Войти в гостевой режим</translation> @@ -3214,7 +3230,6 @@ <translation id="5708171344853220004">Имя участника Microsoft</translation> <translation id="5709885306771508267">Масштабирование сведением или разведением пальцев</translation> <translation id="5710406368443808765">Не удалось сохранить идентификатор и токен устройства.</translation> -<translation id="571161420693302741">Трансляция невозможна, так как <ph name="HOST_NAME" /> не отвечает.</translation> <translation id="5711983031544731014">Невозможно разблокировать. Введите пароль.</translation> <translation id="5712966208980506909">Если этот параметр включен, правила концепции Material design можно открыть на странице chrome://md-policy.</translation> <translation id="5715711091495208045">Посредник: <ph name="PLUGIN_NAME" /></translation> @@ -3481,7 +3496,6 @@ <translation id="6111974609785983504">Разрешено по умолчанию</translation> <translation id="6113134669445407638">Отключает в WebRTC эхоподавление, независимое от задержек. Рекомендуется, если сообщения о задержках в системе достоверны или эхо от вашего устройства мешает другим пользователям.</translation> <translation id="6116921718742659598">Изменение настроек языка и метода ввода</translation> -<translation id="6117536376248197233">Отключит временную шкалу в средствах обработки изображения</translation> <translation id="6120205520491252677">Прикрепить эту страницу к экрану запуска…</translation> <translation id="6122081475643980456">С вашим интернет-соединением все не так просто</translation> <translation id="6122093587541546701">Адрес эл. почты (необязательно):</translation> @@ -3513,6 +3527,7 @@ <translation id="6163522313638838258">Развернуть все...</translation> <translation id="6164005077879661055">После удаления контролируемого профиля все файлы и локальные данные, связанные с ним, будут удалены. Посещенные страницы и настройки этого профиля будут видны его менеджеру на странице: <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Подробнее...</translation> +<translation id="6167008112175207002">Пароли, закладки, история и другие настройки будут синхронизированы с аккаунтом Google, чтобы у вас был доступ к ним на любом устройстве. Изменить параметры синхронизации можно здесь: <ph name="BEGIN_LINK" />.</translation> <translation id="6171550060231646388">Симуляция аппаратных функций "О'кей, Google"</translation> <translation id="6175314957787328458">Идентификатор GUID домена Microsoft</translation> <translation id="6178664161104547336">Выбор сертификата</translation> @@ -3716,6 +3731,7 @@ <translation id="648927581764831596">Отсутствуют</translation> <translation id="6490936204492416398">Установите новые расширения в Интернет-магазине</translation> <translation id="6492313032770352219">Объем на диске:</translation> +<translation id="6498249116389603658">&Все языки</translation> <translation id="6499143127267478107">Разрешение хоста в скрипте прокси-сервера...</translation> <translation id="6503077044568424649">Сайты</translation> <translation id="6503256918647795660">Швейцарская раскладка (французский)</translation> @@ -3757,7 +3773,6 @@ <translation id="6555432686520421228">Удалить все пользовательские аккаунты и восстановить заводские настройки на устройстве <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="6556866813142980365">Повторить</translation> <translation id="6557565812667414268">Только для дисплеев с высоким разрешением.</translation> -<translation id="655845594391856372">Трансляция невозможна, так как вкладка не отвечает.</translation> <translation id="6559580823502247193">(используется на этом устройстве)</translation> <translation id="6561726789132298588">Войти</translation> <translation id="6562437808764959486">Извлечение образа для восстановления...</translation> @@ -3858,6 +3873,7 @@ <translation id="6723354935081862304">Отправляйте файлы на хранение и печать в Google Документы и другие места назначения в облаке. Чтобы использовать Виртуальный принтер Google, <ph name="BEGIN_LINK" />войдите в систему<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">Импортировать закладки и настройки</translation> <translation id="6723839937902243910">Питание</translation> +<translation id="6725240607822645708">Запускать редактор методов ввода (IME) по собственному сценарию</translation> <translation id="6725970970008349185">Количество вариантов, отображаемых на одной странице</translation> <translation id="672609503628871915">Узнать, что нового</translation> <translation id="6727005317916125192">Предыдущая панель</translation> @@ -3988,12 +4004,11 @@ <translation id="6948736568813450284">Для разработчиков: использовать тестовую среду для запросов Google Payments API.</translation> <translation id="6949306908218145636">Добавить все вкладки в закладки…</translation> <translation id="695164542422037736">Если данный параметр включен, а для body указан стиль background-attachment:fixed, фон будет располагаться на отдельном составном слое.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> запоминает пароли и автоматически выполняет вход на сайты, которые вы открываете на этом устройстве</translation> <translation id="6955446738988643816">Просмотр всплывающего окна</translation> <translation id="695755122858488207">Отключенное положение переключателя</translation> +<translation id="6960277925159781810">Автоматический вход на этом устройстве</translation> <translation id="696036063053180184">3 Set (Sebeolsik Noshift)</translation> <translation id="696203921837389374">Синхронизировать по мобильной сети</translation> -<translation id="6964308487066031935">Добавить папки в расширение "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">ОК</translation> <translation id="6965648386495488594">Порт</translation> <translation id="6965978654500191972">Устройство</translation> @@ -4092,7 +4107,6 @@ <translation id="7076293881109082629">Вход</translation> <translation id="7077829361966535409">При загрузке текущих настроек прокси-сервера на главной странице произошла ошибка. <ph name="GAIA_RELOAD_LINK_START" />Выполните вход повторно<ph name="GAIA_RELOAD_LINK_END" /> или измените <ph name="PROXY_SETTINGS_LINK_START" />параметры прокси-сервера<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Игнорируемые обработчики протоколов</translation> -<translation id="7079038783243627996">Расширение "<ph name="EXTENSION" />" получит доступ на чтение и удаление изображений, видео и аудиофайлов в отмеченных папках.</translation> <translation id="708060913198414444">&Копировать URL аудио</translation> <translation id="708187310695946552">Запрос на восстановление сеанса во всплывающем окне</translation> <translation id="7082055294850503883">Игнорировать нажатие клавиши CapsLock и по умолчанию вводить строчные буквы</translation> @@ -4236,6 +4250,8 @@ <translation id="7313804056609272439">вьетнамская раскладка (VNI)</translation> <translation id="7314244761674113881">SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (используется)</translation> +<translation id="7321545336522791733">Сервер недоступен</translation> +<translation id="7324841169865301118">Позволяет пользователю выбрать вкладку, к которой будет открыт общий доступ.</translation> <translation id="7325437708553334317">Расширение высокой контрастности</translation> <translation id="7326565110843845436">Трехпальцевый жест для сенсорной панели</translation> <translation id="73289266812733869">Не выбрано</translation> @@ -4462,7 +4478,6 @@ <translation id="7650511557061837441">Расширение "<ph name="TRIGGERING_EXTENSION_NAME" />" пытается удалить расширение "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> отображается на этом языке</translation> <translation id="7654941827281939388">Этот аккаунт уже используется на данном компьютере.</translation> -<translation id="7655165758820095116">Объект MediaSource позволяет JavaScript отправлять медиаданные непосредственно в видеоэлемент.</translation> <translation id="7658239707568436148">Отмена</translation> <translation id="7659584679870740384">У вас нет доступа к этому устройству. Свяжитесь с его администратором.</translation> <translation id="7664620655576155379">Устройство Bluetooth "<ph name="DEVICE_NAME" />" не поддерживается.</translation> @@ -4593,6 +4608,7 @@ <translation id="7861215335140947162">&Загрузки</translation> <translation id="7864539943188674973">Отключить Bluetooth</translation> <translation id="7868891395842935202">Включить платформу Experimental Framework для управления доступом к экспериментам API.</translation> +<translation id="7870576007982733437">Использовать системный диспетчер загрузки (если применимо)</translation> <translation id="7870790288828963061">Новых версий киоск-приложений нет. Обновление не требуется. Извлеките USB-накопитель.</translation> <translation id="787150342916295244">Сканировать кредитные карты</translation> <translation id="7874357055309047713">Запускать всегда</translation> @@ -4635,7 +4651,6 @@ <translation id="7918257978052780342">Зарегистрироваться</translation> <translation id="7920092496846849526">Вашим родителям отправлен запрос на просмотр страницы.</translation> <translation id="7925285046818567682">Ожидание <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> запоминает пароли и автоматически выполняет вход в приложения и на сайты независимо от используемого устройства.</translation> <translation id="7925686952655276919">Не используйте синхронизацию данных с мобильных устройств</translation> <translation id="7926906273904422255">Незащищенные источники будут помечены как небезопасные или сомнительные.</translation> <translation id="7928710562641958568">Извлечь устройство</translation> @@ -4697,7 +4712,6 @@ Храните файл ключей в надежном месте. Он потребуется для создания новых версий расширения.</translation> <translation id="799923393800005025">Чтение</translation> <translation id="7999338963698132743">Новый диспетчер задач</translation> -<translation id="8000004253404706714">Использовать старую подсистему анимации в средствах обработки изображения</translation> <translation id="8004582292198964060">Браузер</translation> <translation id="8007030362289124303">Низкий заряд батареи</translation> <translation id="8008356846765065031">Не удалось установить соединение. Проверьте подключение к Интернету.</translation> @@ -4826,6 +4840,7 @@ <translation id="8185331656081929126">Оповещать о новых принтерах в сети</translation> <translation id="8186609076106987817">Этот файл отсутствует на сервере.</translation> <translation id="8186706823560132848">Программное обеспечение</translation> +<translation id="8188120771410500975">Проверка правописания &в текстовых полях</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> и ещё <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Соединение с <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Управление приложениями, расширениями и темами</translation> @@ -5218,6 +5233,7 @@ <translation id="8765985713192161328">Настроить обработчики…</translation> <translation id="8766796754185931010">Котоери</translation> <translation id="8767072502252310690">Пользователи</translation> +<translation id="8768367823103160496">Блокировка курсора</translation> <translation id="8769662576926275897">Сведения о карте</translation> <translation id="8770196827482281187">раскладка фарси (ISIRI 2901)</translation> <translation id="8774934320277480003">Верхнее поле</translation> @@ -5237,6 +5253,7 @@ <translation id="8795668016723474529">Добавить банковскую карту</translation> <translation id="8795916974678578410">Новое окно</translation> <translation id="8798099450830957504">По умолчанию</translation> +<translation id="8799127529310003270">Если параметр включен, вызовы InputConnection запускаются по сценарию редактора методов ввода (IME). Резервный редактор не используется – каждый вызов направляется непосредственно к средству визуализации.</translation> <translation id="8799839487311913894">Обновлять пароль в соответствующем диспетчере после отправки специальной формы.</translation> <translation id="8800004011501252845">Поиск мест назначения для</translation> <translation id="8800420788467349919">Громкость: <ph name="PRECENTAGE" />%</translation> @@ -5262,6 +5279,7 @@ <translation id="8841142799574815336">Отражать область просмотра</translation> <translation id="884264119367021077">Адрес доставки</translation> <translation id="8844238624737526720">Использовать новую и оптимизированную версию диспетчера задач Chrome.</translation> +<translation id="8845001906332463065">Справка</translation> <translation id="8846141544112579928">Поиск клавиатуры…</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Переключение режима с помощью клавиши Shift</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index be43127..90271a1 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">Týmto sa obnoví vaša stránka pri spustení, stránka na novej karte, vyhľadávač a pripnuté karty. Zakážu sa aj všetky rozšírenia a vymažú dočasné dáta, ako napríklad súbory cookie. Záložky, história a uložené heslá sa nevymažú.</translation> <translation id="1434886155212424586">Domovská stránka predstavuje stránku Nová karta</translation> <translation id="1435550882135542937">Zmena vzhľadu panela rozšírení</translation> +<translation id="1436402875660227532">Poznámka: Tieto nastavenia sa už v tomto systéme nepoužívajú, môžete ich však stále zobraziť a upraviť.</translation> <translation id="1436784010935106834">Odstránené</translation> <translation id="1438632560381091872">Obnoviť zvuk kariet</translation> <translation id="1441841714100794440">Vietnamská klávesnica (Telex)</translation> @@ -1318,6 +1319,7 @@ <translation id="2889064240420137087">Otvoriť odkaz pomocou...</translation> <translation id="2889925978073739256">Pokračovať v blokovaní doplnkov, ktoré nie sú v karanténe</translation> <translation id="2890624088306605051">Načítať iba synchronizované nastavenia a údaje</translation> +<translation id="2890678560483811744">Odkaz na stránku mimo rozsah</translation> <translation id="2893168226686371498">Predvolený prehliadač</translation> <translation id="289426338439836048">Iná mobilná sieť...</translation> <translation id="2894745200702272315">Aktivuje experimentálnu verziu funkcií detekcie kľúčového slova „Ok Google“, ktoré sú závislé od hardvéru.</translation> @@ -1346,7 +1348,6 @@ <translation id="2925966894897775835">Tabuľky</translation> <translation id="2927017729816812676">Úložisko vyrovnávacej pamäte</translation> <translation id="2927657246008729253">Zmeniť...</translation> -<translation id="2928415919076124714">Skrývať panel s nástrojmi v režime celej obrazovky</translation> <translation id="2928526264833629376">Pokračovať do služby Hangouts</translation> <translation id="2930644991850369934">Pri sťahovaní obrazu na obnovenie sa vyskytol problém. Sieťové pripojenie bolo prerušené.</translation> <translation id="293111069139560936">Povolí poličke minimalizáciu okna v prípade, že používateľ klikne na položku poličky, ktorá je spojená iba s jedným aktívnym oknom.</translation> @@ -1591,7 +1592,6 @@ <translation id="3289566588497100676">Jednoduché vkladanie symbolov</translation> <translation id="3289856944988573801">Ak chcete skontrolovať aktualizácie, použite sieť ethernet alebo Wi-Fi.</translation> <translation id="3293325348208285494">Rýchle spustenie</translation> -<translation id="3293894718455402932">Rozšírenie <ph name="EXTENSION" /> bude môcť v označených priečinkoch čítať a zapisovať obrázky, video a zvukové súbory.</translation> <translation id="3294437725009624529">Hosť</translation> <translation id="329650768420594634">Upozornenie na zbalenie rozšírenia</translation> <translation id="3296763833017966289">Gruzínčina</translation> @@ -1648,6 +1648,7 @@ <translation id="3338239663705455570">slovinská klávesnica</translation> <translation id="3340978935015468852">nastavenia</translation> <translation id="3341703758641437857">Povoliť prístup k webovým adresám súboru</translation> +<translation id="3343813173145836998">Jednoduché prihlásenie na tomto zariadení</translation> <translation id="3344786168130157628">Názov prístupového bodu:</translation> <translation id="3345135638360864351">Vašu žiadosť o prístup k týmto webovým stránkam sa používateľovi <ph name="NAME" /> neporadilo odoslať. Skúste to znova neskôr.</translation> <translation id="3345886924813989455">Nenašiel sa žiadny podporovaný prehliadač</translation> @@ -2230,7 +2231,7 @@ <translation id="4180788401304023883">Odstrániť certifikát CA „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="418179967336296930">Ruská fonetická (YaZHert) klávesnica</translation> <translation id="4181841719683918333">Jazyky</translation> -<translation id="4187248015940562149">Aktivuje funkciu Web Bluetooth zahrňujúcu možnosť povoľovať webové stránky, ku ktorým sa je možné pripojiť, a ovládať zariadenia Bluetooth vo vašom okolí.</translation> +<translation id="4187248015940562149">Aktivuje funkciu Web Bluetooth zahrnujúcu možnosť povoľovať webové stránky, ku ktorým je možné pripojiť sa, a ovládať zariadenia Bluetooth vo vašom okolí.</translation> <translation id="4188026131102273494">Kľúčové slovo:</translation> <translation id="4189406272289638749">Toto nastavenie spravuje rozšírenie <b><ph name="EXTENSION_NAME" /></b>.</translation> <translation id="4193154014135846272">Dokument Google</translation> @@ -2287,6 +2288,7 @@ <translation id="4268025649754414643">Zašifrovanie kľúča</translation> <translation id="4268574628540273656">Webová adresa:</translation> <translation id="4270393598798225102">Verzia <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Žiadne zhody</translation> <translation id="4274187853770964845">Chyba synchronizácie: Zastavte a reštartujte synchronizáciu.</translation> <translation id="4275830172053184480">Reštart zariadenia</translation> <translation id="4276796043975446927">Vitajte v službe Chromebox pre videokonferencie</translation> @@ -2356,6 +2358,7 @@ <translation id="4378551569595875038">Pripája sa...</translation> <translation id="438122767399415311">Vynútiť smer používateľského rozhrania</translation> <translation id="4381849418013903196">Dvojbodka</translation> +<translation id="4383192539467954373">Automatické prihlasovanie na rôznych zariadeniach</translation> <translation id="4384652540891215547">Aktivovať rozšírenie</translation> <translation id="438503109373656455">Saratoga</translation> <translation id="4387554346626014084">Povoliť synchronizáciu Spúšťača aplikácií. Ak je k dispozícii funkcia priečinkov, bude tiež povolená (platí pre všetky operačné systémy okrem OS X).</translation> @@ -2388,6 +2391,7 @@ <translation id="444267095790823769">Výnimky chráneného obsahu</translation> <translation id="4443536555189480885">&Pomocník</translation> <translation id="4444304522807523469">Mať prístup ku skenerom dokumentov pripojeným cez USB alebo v miestnej sieti</translation> +<translation id="4445559854264555037">Nezobrazuje sa vaše zariadenie? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Zrkadlené</translation> <translation id="4447465454292850432">Batéria:</translation> <translation id="4449935293120761385">Informácie o Automatickom dopĺňaní</translation> @@ -2645,6 +2649,7 @@ <translation id="485316830061041779">Nemčina</translation> <translation id="4856478137399998590">Vaša mobilná dátová služba je aktivovaná a pripravená na použitie</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">Ak je to možné, povoliť správu sťahovania súborov pomocou systémového správcu sťahovania.</translation> <translation id="48607902311828362">Režim v lietadle</translation> <translation id="4861833787540810454">&Prehrať</translation> <translation id="4862050643946421924">Pridáva sa zariadenie...</translation> @@ -2728,7 +2733,6 @@ <translation id="4977942889532008999">Potvrdenie prístupu</translation> <translation id="4982718461356080574">Skrývanie tlačidiel na zatvorenie na neaktívnych kartách počas zoskupovania</translation> <translation id="498294082491145744">Meniť nastavenia, ktoré ovládajú prístup webových stránok k funkciám, ako sú súbory cookie, JavaScript, doplnky, geolokácia, mikrofón, fotoaparát atď.</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">Stránky</translation> <translation id="4988792151665380515">Exportovanie verejného kľúča zlyhalo.</translation> <translation id="49896407730300355">Otočiť &proti smeru hodinových ručičiek</translation> @@ -2917,7 +2921,6 @@ <translation id="5268606875983318825">PPAPI (mimo proces)</translation> <translation id="526926484727016706">Táto možnosť spôsobí, že budú všetkým prvkom iframe predvolene zakázané všetky povolenia. Ak pre prvok iframe povolíte konkrétne povolenia, môže byť potrebné uviesť názvy týchto povolení ako hodnoty pre nové atribúty prvku iframe.</translation> <translation id="5269977353971873915">Zlyhanie tlače</translation> -<translation id="5270884342523754894">Rozšírenie <ph name="EXTENSION" /> bude môcť v začiarknutých priečinkoch čítať obrázky, video a zvukové súbory.</translation> <translation id="5271247532544265821">Prepínať medzi režimami zjednodušenej a tradičnej čínštiny</translation> <translation id="5271549068863921519">Uložiť heslo</translation> <translation id="5273628206174272911">Experimentálna navigácia v histórii pri posúvaní vo vodorovnom smere.</translation> @@ -3007,11 +3010,11 @@ <translation id="5390284375844109566">Indexovaná databáza</translation> <translation id="5392544185395226057">Povolí podporu pre technológiu Native Client.</translation> <translation id="5393125431335030955">Tento doplnok funguje iba v režime pracovnej plochy.</translation> -<translation id="5393559999218790205">Zakázať časové osi zložených animácií v používateľskom rozhraní</translation> <translation id="5396126354477659676">Doplnok <ph name="PEPPER_PLUGIN_NAME" /> na stránkach <ph name="PEPPER_PLUGIN_DOMAIN" /> chce získať prístup k vášmu počítaču.</translation> <translation id="539755880180803351">Pridá k webovým formulárom anotácie tak, že ako zástupný text vloží typ poľa predpovedaný funkciou Automatické dopĺňanie.</translation> <translation id="5397578532367286026">Aktivitu a históriu tohto používateľa môže skontrolovať správca (<ph name="MANAGER_EMAIL" />) na adrese chrome.com.</translation> <translation id="5397794290049113714">Vy</translation> +<translation id="5398572795982417028">Odkaz na stránku mimo rozsah, limit je <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> z iných webov</translation> <translation id="5399158067281117682">Kódy PIN sa nezhodujú.</translation> <translation id="5400640815024374115">Čip modulu TPM (Trusted Platform Module) je zakázaný alebo chýba.</translation> @@ -3031,7 +3034,7 @@ <translation id="5423849171846380976">Aktivované</translation> <translation id="5425470845862293575">Povolí použitie experimentálneho systému vykresľovania písma DirectWrite.</translation> <translation id="5425722269016440406">Ak chcete vypnúť funkciu Smart Lock, musíte byť online, pretože toto nastavenie sa synchronizuje do vášho telefónu a ďalších zariadení. Najprv sa pripojte k sieti.</translation> -<translation id="5426623592374109001">V prípade zložených animácií v používateľskom rozhraní sa použije starý podsystém animácií.</translation> +<translation id="5425863515030416387">Jednoduché prihlásenie v rôznych zariadeniach</translation> <translation id="5427459444770871191">Otočiť &v smere hodinových ručičiek</translation> <translation id="5428105026674456456">Španielčina</translation> <translation id="542872847390508405">Prehliadate ako hosť</translation> @@ -3226,7 +3229,6 @@ <translation id="5708171344853220004">Hlavný názov Microsoft</translation> <translation id="5709885306771508267">Zmena veľkosti stiahnutím prstov</translation> <translation id="5710406368443808765">Ojoj! Systému sa nepodarilo uložiť token a ID zariadenia.</translation> -<translation id="571161420693302741">Hostiteľ <ph name="HOST_NAME" /> nereaguje. Prenášanie nie je možné.</translation> <translation id="5711983031544731014">Nie je možné odomknúť. Zadajte heslo.</translation> <translation id="5712966208980506909">Ak je tento príznak povolený, webová adresa chrome://md-policy načíta stránku pravidiel so vzhľadom Material Design.</translation> <translation id="5715711091495208045">Doplnok Broker: <ph name="PLUGIN_NAME" /></translation> @@ -3495,7 +3497,6 @@ <translation id="6111974609785983504">Povolené v predvolenom nastavení</translation> <translation id="6113134669445407638">Zakážte funkciu Delay Agnostic AEC v rozhraní WebRTC. Použite, keď sú nahlásené oneskorenia systému veľmi dôveryhodné alebo vtedy, keď sa ostatným ozýva z vášho zariadenia ozvena.</translation> <translation id="6116921718742659598">Zmeniť nastavenia jazyka a vstupu</translation> -<translation id="6117536376248197233">Zakázať časové osi zložených animácií vo vykresľovacích moduloch</translation> <translation id="6120205520491252677">Pripnúť túto stránku na Úvodnú obrazovku...</translation> <translation id="6122081475643980456">Vaše internetové pripojenie je ovládané</translation> <translation id="6122093587541546701">E-mail (voliteľné):</translation> @@ -3527,6 +3528,7 @@ <translation id="6163522313638838258">Rozbaliť všetko...</translation> <translation id="6164005077879661055">Všetky súbory a miestne údaje spojené s týmto kontrolovaným používateľom budú po jeho odstránení natrvalo odstránené. Správca bude môcť naďalej zobraziť navštívené webové stránky a nastavenia tohto používateľa na adrese <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Viac informácií</translation> +<translation id="6167008112175207002">Záložky, história, heslá a ďalšie nastavenia budú synchronizované do vášho účtu Google a budete ich môcť použiť na všetkých zariadeniach. Toto nastavenie môžete zmeniť tu: <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Simulované hardvérové funkcie Ok Google</translation> <translation id="6175314957787328458">Identifikátor GUID domény spoločnosti Microsoft</translation> <translation id="6178664161104547336">Vybrať certifikát</translation> @@ -3772,7 +3774,6 @@ <translation id="6555432686520421228">Odstráňte všetky používateľské účty a obnovte zariadenie <ph name="IDS_SHORT_PRODUCT_NAME" />, aby bolo ako nové.</translation> <translation id="6556866813142980365">Znova</translation> <translation id="6557565812667414268">Povolené iba pre displeje s vysokou hodnotou DPI</translation> -<translation id="655845594391856372">Karta nereaguje. Prenášanie nie je možné.</translation> <translation id="6559580823502247193">(už je na tomto zariadení)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Extrahuje sa obraz na obnovenie...</translation> @@ -3873,6 +3874,7 @@ <translation id="6723354935081862304">Tlačte do služby Dokumenty Google a ďalších cieľov v cloude. Ak chcete tlačiť do služby Google Cloud Print, <ph name="BEGIN_LINK" />prihláste sa<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">Importovať záložky a nastavenia...</translation> <translation id="6723839937902243910">Napájanie</translation> +<translation id="6725240607822645708">Spustenie editora IME vo vlastnom podprocese</translation> <translation id="6725970970008349185">Počet kandidátov zobrazených na stránke</translation> <translation id="672609503628871915">Zobraziť novinky</translation> <translation id="6727005317916125192">Predchádzajúci panel</translation> @@ -4003,12 +4005,11 @@ <translation id="6948736568813450284">Pre vývojárov: Použite službu karantény pre volania prostredníctvom rozhrania Google Payments API.</translation> <translation id="6949306908218145636">Pridať otvorené stránky medzi záložky...</translation> <translation id="695164542422037736">Ak je táto možnosť povolená a ak je hlavná časť štylizovaná s pevne fixovaným pozadím, bude mať pozadie vlastnú zloženú vrstvu.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> si pamätá vaše heslá a automaticky vás v tomto zariadení prihlasuje na weby.</translation> <translation id="6955446738988643816">Preskúmať kontextové okná</translation> <translation id="695755122858488207">Nevybratý prepínač</translation> +<translation id="6960277925159781810">Automatické prihlásenie na tomto zariadení</translation> <translation id="696036063053180184">Súprava 3 (bez klávesu Shift)</translation> <translation id="696203921837389374">Povoliť synchronizáciu prostredníctvom mobilných dát</translation> -<translation id="6964308487066031935">Pridať priečinky do rozšírenia <ph name="EXTENSION" />?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Zariadenie</translation> @@ -4108,7 +4109,6 @@ <translation id="7076293881109082629">Prihlásenie</translation> <translation id="7077829361966535409">Prihlasovaciu stránku sa pomocou aktuálneho nastavenia servera proxy nepodarilo načítať. <ph name="GAIA_RELOAD_LINK_START" />Skúste sa prihlásiť znova<ph name="GAIA_RELOAD_LINK_END" /> alebo použite iné <ph name="PROXY_SETTINGS_LINK_START" />nastavenia servera proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignorované obslužné programy pre protokoly</translation> -<translation id="7079038783243627996">Rozšírenie <ph name="EXTENSION" /> bude môcť v začiarknutých priečinkoch čítať a odstraňovať obrázky, video a zvukové súbory.</translation> <translation id="708060913198414444">K&opírovať adresu zvuku</translation> <translation id="708187310695946552">Bublinové používateľské rozhranie na obnovenie relácie</translation> <translation id="7082055294850503883">Ignorovať stav klávesu CapsLock a vkladať iba malé písmená</translation> @@ -4480,7 +4480,6 @@ <translation id="7650511557061837441"><ph name="TRIGGERING_EXTENSION_NAME" /> chce odstrániť rozšírenie <ph name="EXTENSION_NAME" />.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> sa zobrazuje v tomto jazyku</translation> <translation id="7654941827281939388">Tento účet sa už v počítači používa.</translation> -<translation id="7655165758820095116">Objekt MediaSource umožňuje JavaScriptu odosielať dáta médií priamo do prvku videa.</translation> <translation id="7658239707568436148">Zrušiť</translation> <translation id="7659584679870740384">Nemáte oprávnenie používať toto zariadenie. Ak chcete získať povolenie na prihlásenie sa, kontaktujte správcu.</translation> <translation id="7664620655576155379">Nepodporované zariadenie Bluetooth: <ph name="DEVICE_NAME" />.</translation> @@ -4611,6 +4610,7 @@ <translation id="7861215335140947162">&Preberanie</translation> <translation id="7864539943188674973">Zakázať rozhranie Bluetooth</translation> <translation id="7868891395842935202">Povolí experimentálnu architektúru na kontrolovanie prístupu k experimentom rozhraní API.</translation> +<translation id="7870576007982733437">Ak je to možné, použiť systémového správcu sťahovania.</translation> <translation id="7870790288828963061">Nenašli sa žiadne aplikácie Kiosku s novšou verziou. Nie je čo aktualizovať. Odoberte kľúč USB.</translation> <translation id="787150342916295244">Skenovanie kreditných kariet</translation> <translation id="7874357055309047713">Vždy spustiť na všetkých stránkach</translation> @@ -4653,7 +4653,6 @@ <translation id="7918257978052780342">Zaregistrovať</translation> <translation id="7920092496846849526">Opýtali ste sa svojho rodiča, či môžete navštíviť túto stránku.</translation> <translation id="7925285046818567682">Čakanie na <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> si pamätá vaše heslá a automaticky vás v zariadeniach prihlasuje do aplikácií na weby.</translation> <translation id="7925686952655276919">Nepoužívať mobilné dátové prenosy na synchronizáciu</translation> <translation id="7926906273904422255">Označiť nezabezpečené zdroje ako Nezabezpečené alebo Pochybné.</translation> <translation id="7928710562641958568">Vysunúť zariadenie</translation> @@ -4715,7 +4714,6 @@ Súbor kľúča uložte na bezpečné miesto. Budete ho potrebovať na vytvorenie nových verzií svojho rozšírenia.</translation> <translation id="799923393800005025">Môže zobraziť</translation> <translation id="7999338963698132743">Nový správca úloh</translation> -<translation id="8000004253404706714">V prípade zložených animácií vo vykresľovacích moduloch sa použije starý podsystém animácií.</translation> <translation id="8004582292198964060">Prehliadač</translation> <translation id="8007030362289124303">Vybitá batéria</translation> <translation id="8008356846765065031">Internet je odpojený. Skontrolujte svoje pripojenie k internetu.</translation> @@ -5238,6 +5236,7 @@ <translation id="8765985713192161328">Správa obslužných nástrojov...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Používatelia</translation> +<translation id="8768367823103160496">Zámka kurzora myši</translation> <translation id="8769662576926275897">Podrobnosti karty</translation> <translation id="8770196827482281187">Perzská metóda vstupu (rozloženie ISIRI 2901)</translation> <translation id="8774934320277480003">Horný okraj</translation> @@ -5257,6 +5256,7 @@ <translation id="8795668016723474529">Pridať kreditnú kartu</translation> <translation id="8795916974678578410">Nové okno</translation> <translation id="8798099450830957504">Predvolené</translation> +<translation id="8799127529310003270">Ak je toto pravidlo aktivované, volania InputConnection sa spúšťajú v podprocese editora IME a každé volanie InputConnection namiesto kópie editora komunikuje priamo s vykresľovacím modulom.</translation> <translation id="8799839487311913894">Povoľte aktualizácie hesla v správcovi hesiel po odoslaní formulára na zmenu hesla.</translation> <translation id="8800004011501252845">Zobrazujú sa ciele pre</translation> <translation id="8800420788467349919">Hlasitosť: <ph name="PRECENTAGE" /> %</translation> @@ -5282,6 +5282,7 @@ <translation id="8841142799574815336">Inertná vizuálna oblasť zobrazenia.</translation> <translation id="884264119367021077">Dodacia adresa</translation> <translation id="8844238624737526720">Použije sa nová a optimalizovaná implementácia správcu úloh Chrome.</translation> +<translation id="8845001906332463065">Získať pomoc</translation> <translation id="8846141544112579928">Hľadá sa klávesnica...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Prepnutie módu klávesom Shift</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 0757d9b..0fbd5ec 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Zaznamek za to stran ...</translation> <translation id="1047956942837015229">Brisanje toliko elementov: <ph name="COUNT" /> ...</translation> <translation id="1048597748939794622">Vsiljeno omogočeno za vse plasti</translation> +<translation id="1049795001945932310">&Jezikovne nastavitve</translation> <translation id="1049926623896334335">Wordov dokument</translation> <translation id="1054153489933238809">Odpri izvirno &sliko na novem zavihku</translation> <translation id="1055806300943943258">Iskanje naprav Bluetooth in USB ...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Prečrkovanje (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Samodejni imenski strežniki</translation> <translation id="1215411991991485844">Dodan je nov program, ki se izvaja v ozadju</translation> +<translation id="1216954813581739968">Omogočanje zavihka za skupno rabo namizja</translation> <translation id="121827551500866099">Pokaži vse prenose ...</translation> <translation id="122082903575839559">Algoritem podpisa potrdila</translation> <translation id="1221024147024329929">PKCS #1 MD2 s šifriranjem RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Samodejna prijava ni uspela</translation> <translation id="1293556467332435079">Datoteke</translation> <translation id="1294298200424241932">Uredite nastavitve zaupanja:</translation> +<translation id="1295794900245526845">Izbira računa, shranjenega z izdelkom <ph name="PASSWORD_MANAGER_BRAND" />, za prijavo</translation> <translation id="1297175357211070620">Cilj</translation> <translation id="1297922636971898492">Google Drive trenutno ni na voljo. Ko bo spet na voljo, se bo prenos samodejno začel znova.</translation> <translation id="1300861494336759522">Preusmeritev pri namizjem iskanju v sistemu Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">S tem bodo ponastavljeni začetna stran, stran »Nov zavihek«, iskalnik in pripeti zavihki. Prav tako bodo onemogočene vse razširitve in izbrisani bodo začasni podatki, kot so piškotki. Zaznamki, zgodovina in shranjena gesla ne bodo izbrisani.</translation> <translation id="1434886155212424586">Domača stran je nov zavihek s povezavami</translation> <translation id="1435550882135542937">Novo oblikovanje orodne vrstice razširitve</translation> +<translation id="1436402875660227532">Opomba: te nastavitve se ne uporabljajo več v tem sistemu, vendar si jih lahko še vedno ogledate in jih uredite.</translation> <translation id="1436784010935106834">Odstranjeno</translation> <translation id="1438632560381091872">Vklop zvoka zavihkov</translation> <translation id="1441841714100794440">Tipkovnica za vietnamščino (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Omogočanje podpore za virtualno tipkovnico.</translation> <translation id="1474079335130556426">Omogočanje načina v ozadju za API Push. Chromu omogoča, da se po zaprtju zadnjega okna še naprej izvaja in zažene ob zagonu operacijskega sistema, če ga API Push potrebuje.</translation> <translation id="1474339897586437869">Datoteka »<ph name="FILENAME" />« ni bila naložena. V Googlu Drive nimate dovolj razpoložljivega prostora.</translation> +<translation id="1476607407192946488">&Jezikovne nastavitve</translation> <translation id="1476949146811612304">Nastavite, kateri iskalnik boste uporabljali pri iskanju v <ph name="BEGIN_LINK" />naslovni vrstici<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Predpomnilnik žetonov za API za identiteto</translation> @@ -650,6 +655,7 @@ <translation id="1962233722219655970">Ta stran uporablja aplikacijo s tehnologijo Native Client, ki ne deluje v vašem računalniku.</translation> <translation id="1965328510789761112">Zasebni pomnilnik</translation> <translation id="1965624977906726414">Nima posebnih dovoljenj.</translation> +<translation id="1968720524450620475">Omogoči ikone dejanj za spletna obvestila</translation> <translation id="1970746430676306437">Poglej informacije o &strani</translation> <translation id="197288927597451399">Obdrži</translation> <translation id="1973491249112991739">Prenos vtičnika <ph name="PLUGIN_NAME" /> ni uspel.</translation> @@ -910,6 +916,7 @@ <translation id="2344262275956902282">Strani seznama kandidatov oštevilčite s tipkama »-« in »=«.</translation> <translation id="2347476388323331511">Ni bilo mogoče sinhronizirati</translation> <translation id="2347991999864119449">Naj sam izberem, kdaj naj se izvaja vsebina vtičnikov</translation> +<translation id="2348165084656290171">Za skupno rabo zvoka izberite zavihek ali celoten zaslon.</translation> <translation id="2350182423316644347">Inicializiranje aplikacije ...</translation> <translation id="2350796302381711542">Dovoli gostitelju <ph name="HANDLER_HOSTNAME" /> odpreti vse povezave za <ph name="PROTOCOL" /> namesto gostitelja <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Jezik in vnos</translation> @@ -997,6 +1004,7 @@ <translation id="247772113373397749">Kanadska večjezikovna tipkovnica</translation> <translation id="2478176599153288112">Dovoljenja za predstavnostne datoteke za razširitev »<ph name="EXTENSION" />«</translation> <translation id="2478830106132467213">To napravo odkleni <ph name="DEVICE_TYPE" />, samo če je telefon na dosegu rok.</translation> +<translation id="247949520305900375">Skupna raba zvoka</translation> <translation id="2479780645312551899">Tokrat zaženi vse vtičnike</translation> <translation id="2480626392695177423">Preklop načina ločil polne/polovične širine</translation> <translation id="2481332092278989943">Dodajanje na polico</translation> @@ -1311,6 +1319,7 @@ <translation id="2889064240420137087">Odpri povezavo z ...</translation> <translation id="2889925978073739256">Še naprej blokiraj vtičnike</translation> <translation id="2890624088306605051">Prenesi samo sinhronizirane nastavitve in podatke</translation> +<translation id="2890678560483811744">Sklic na stran zunaj dovoljenega razpona</translation> <translation id="2893168226686371498">Privzeti brskalnik</translation> <translation id="289426338439836048">Drugo mobilno omrežje ...</translation> <translation id="2894745200702272315">Omogoči poskusno različico funkcij zaznavanja sprožilne besede »Ok Google«, ki so odvisne od strojne opreme.</translation> @@ -1339,7 +1348,6 @@ <translation id="2925966894897775835">Preglednice</translation> <translation id="2927017729816812676">Shramba predpomnilnika</translation> <translation id="2927657246008729253">Spremeni ...</translation> -<translation id="2928415919076124714">Skrij orodno vrstico v celozaslonskem načinu</translation> <translation id="2928526264833629376">Nadaljuj v Hangouts</translation> <translation id="2930644991850369934">Pri prenosu posnetka za obnovitev je prišlo do težave. Omrežna povezava je bila prekinjena.</translation> <translation id="293111069139560936">Omogoča polici, da ob kliku elementa na polici, s katerim je povezano samo eno, že dejavno okno, pomanjša okno.</translation> @@ -1463,6 +1471,7 @@ <translation id="3117812041123364382">Omogoči/onemogoči plavajočo navidezno tipkovnico</translation> <translation id="3118319026408854581">Pomoč za <ph name="PRODUCT_NAME" /> </translation> <translation id="3120430004221004537">Nezadostno šifriranje za dano dejanje v tej napravi: »<ph name="DEVICE_NAME" />«.</translation> +<translation id="3121260210578524273">Omogočanje ikon v gumbih dejanj za spletna obvestila.</translation> <translation id="3121793941267913344">Ponastavitev te naprave <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Poskusi v orodjih za razvijalce</translation> <translation id="3122464029669770682">CPE</translation> @@ -1583,7 +1592,6 @@ <translation id="3289566588497100676">Vnos preprostih simbolov</translation> <translation id="3289856944988573801">Če želite preveriti, ali so na voljo posodobitve, uporabite ethernet ali Wi-Fi.</translation> <translation id="3293325348208285494">Hiter začetek</translation> -<translation id="3293894718455402932">Razširitev »<ph name="EXTENSION" />« bo lahko brala in zapisovala slike, videodatoteke in zvočne datoteke v označenih mapah.</translation> <translation id="3294437725009624529">Gost</translation> <translation id="329650768420594634">Opozorilo glede pakiranja razširitve</translation> <translation id="3296763833017966289">gruzinščina</translation> @@ -1641,6 +1649,7 @@ <translation id="3338239663705455570">Slovenska tipkovnica</translation> <translation id="3340978935015468852">nastavitve</translation> <translation id="3341703758641437857">Dovoli dostop do URL-jev datoteke</translation> +<translation id="3343813173145836998">Preprosta prijava v tej napravi</translation> <translation id="3344786168130157628">Ime dostopne točke:</translation> <translation id="3345135638360864351">Zahteve za dostop do tega spletnega mesta ni bilo mogoče poslati osebi <ph name="NAME" />. Poskusite znova.</translation> <translation id="3345886924813989455">Ni podprtih brskalnikov.</translation> @@ -2120,6 +2129,7 @@ <translation id="3996912167543967198">Ponastavljanje ...</translation> <translation id="3997015411467176489">Poskusne funkcije platna</translation> <translation id="40027638859996362">Premakne besedo</translation> +<translation id="400554499662786523">Za skupno rabo zvoka izberite zavihek.</translation> <translation id="4012550234655138030">Nastavitev ali upravljanje tiskalnikov v storitvi <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Želite popraviti »<ph name="EXTENSION_NAME" />«?</translation> <translation id="4018133169783460046">Prikaži <ph name="PRODUCT_NAME" /> v tem jeziku</translation> @@ -2222,6 +2232,7 @@ <translation id="4180788401304023883">Ali želite izbrisati overjeno potrdilo »<ph name="CERTIFICATE_NAME" />«?</translation> <translation id="418179967336296930">Ruska fonetična (YaZHert) tipkovnica</translation> <translation id="4181841719683918333">Jeziki</translation> +<translation id="4187248015940562149">Omogoča storitev Web Bluetooth, ki lahko dovoli spletnim mestom, da se povežejo z napravami Bluetooth okoli vas in jih nadzirajo.</translation> <translation id="4188026131102273494">Ključna beseda:</translation> <translation id="4189406272289638749">Razširitev <b><ph name="EXTENSION_NAME" /></b> nadzira to nastavitev.</translation> <translation id="4193154014135846272">Googlov dokument</translation> @@ -2278,6 +2289,7 @@ <translation id="4268025649754414643">Šifriranje ključa</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Različica <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Ni ujemanj</translation> <translation id="4274187853770964845">Napaka pri sinhronizaciji: Ustavite jo in jo znova zaženite.</translation> <translation id="4275830172053184480">Znova zaženite napravo.</translation> <translation id="4276796043975446927">Pozdravljeni v Chromeboxu za sestanke</translation> @@ -2347,6 +2359,7 @@ <translation id="4378551569595875038">Povezovanje ...</translation> <translation id="438122767399415311">Vsiljena uveljavitev usmerjenosti v uporabniškem vmesniku</translation> <translation id="4381849418013903196">Dvopičje</translation> +<translation id="4383192539467954373">Samodejna prijava v napravah</translation> <translation id="4384652540891215547">Aktivirajte razširitev</translation> <translation id="438503109373656455">Kovačeva kobila</translation> <translation id="4387554346626014084">Omogoči sinhronizacijo zaganjalnika aplikacij. S tem se omogočijo tudi Mape, kadar so na voljo (ne v sistemu OS X).</translation> @@ -2364,6 +2377,7 @@ <translation id="4421932782753506458">Puhek</translation> <translation id="4422347585044846479">Uredite zaznamek za to stran</translation> <translation id="4422428420715047158">Domena:</translation> +<translation id="4423482519432579560">&Črkovalnik</translation> <translation id="442477792133831654">Sporazumevanje z bližnjimi napravami</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4428582326923056538">Izjeme za kamero za Adobe Flash Player so drugačne.</translation> @@ -2378,6 +2392,7 @@ <translation id="444267095790823769">Izjeme za zaščiteno vsebino</translation> <translation id="4443536555189480885">&Pomoč</translation> <translation id="4444304522807523469">Dostop do optičnih bralnikov, priklopljenih prek USB-ja ali povezanih v lokalno omrežje.</translation> +<translation id="4445559854264555037">Vaša naprava ni prikazana? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Zrcaljeno</translation> <translation id="4447465454292850432">Akumulator:</translation> <translation id="4449935293120761385">O samodejnem izpolnjevanju</translation> @@ -2636,6 +2651,7 @@ <translation id="485316830061041779">nemščina</translation> <translation id="4856478137399998590">Mobilna podatkovna storitev je aktivirana in pripravljena za uporabo</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">Omogočanje sistemskemu upravitelju prenosov upravljanje prenosov, ko je to potrebno.</translation> <translation id="48607902311828362">Način za letalo</translation> <translation id="4861833787540810454">&Predvajaj</translation> <translation id="4862050643946421924">Dodajanje naprave ...</translation> @@ -2719,7 +2735,6 @@ <translation id="4977942889532008999">Potrditev dostopa</translation> <translation id="4982718461356080574">Skrivanje gumbov za zapiranje na nedejavnih zavihkih, ko so zloženi</translation> <translation id="498294082491145744">Spreminjanje nastavitev, ki nadzirajo dostop spletnih mest do funkcij, kot so piškotki, JavaScript, vtičniki, geolokacija, mikrofon, fotoaparat ipd.</translation> -<translation id="4984329823325527157">API za Media Source</translation> <translation id="4988526792673242964">Strani</translation> <translation id="4988792151665380515">Javnega ključa ni bilo mogoče izvoziti.</translation> <translation id="49896407730300355">Zasukaj v o&bratni smeri urinega kazalca</translation> @@ -2908,7 +2923,6 @@ <translation id="5268606875983318825">PPAPI (zunaj procesa)</translation> <translation id="526926484727016706">Povzroči, da so elementom iframe privzeto zavrnjena vsa dovoljenja. Za omogočanje določenih dovoljenj za iframe bo morda treba navesti imena teh dovoljenj kot vrednosti novih atributov elementa iframe.</translation> <translation id="5269977353971873915">Tiskanje ni uspelo</translation> -<translation id="5270884342523754894">Razširitev »<ph name="EXTENSION" />« bo lahko v označenih mapah brala slike, videoposnetke in zvočne datoteke.</translation> <translation id="5271247532544265821">Preklopi med načinom poenostavljene/tradicionalne kitajščine</translation> <translation id="5271549068863921519">Shrani geslo</translation> <translation id="5273628206174272911">Poskusno krmarjenje po zgodovini z odzivom na vodoravno drsenje čez rob strani.</translation> @@ -2945,6 +2959,7 @@ <translation id="5316716239522500219">Zrcaljenje monitorjev</translation> <translation id="5317780077021120954">Shrani</translation> <translation id="5319782540886810524">Latvijska tipkovnica</translation> +<translation id="532247166573571973">Strežnik morda ni dosegljiv. Poskusite znova pozneje.</translation> <translation id="5323213332664049067">Latinskoameriško</translation> <translation id="532360961509278431">Ni mogoče odpreti »$1«: $2</translation> <translation id="5324674707192845912">Ste pred tem, da prekličete članstvo te naprave <ph name="DEVICE_TYPE" /> pri Googlu in s tem onemogočite oddaljeno iskanje naprave, izbris podatkov v njej in njeno zaklepanje. Potreben bo vnovični zagon. Ali želite nadaljevati?</translation> @@ -2997,11 +3012,11 @@ <translation id="5390284375844109566">Indeksirana zbirka podatkov</translation> <translation id="5392544185395226057">Omogočanje podpore za Native Client.</translation> <translation id="5393125431335030955">Ta vtičnik deluje samo na namizju.</translation> -<translation id="5393559999218790205">Onemogoči animacijske časovnice sestavljalnika uporabniškega vmesnika.</translation> <translation id="5396126354477659676">Vtičnik <ph name="PEPPER_PLUGIN_NAME" /> v domeni <ph name="PEPPER_PLUGIN_DOMAIN" /> želi dostopati do vašega računalnika.</translation> <translation id="539755880180803351">Spletnim obrazcem pripiše samodejno izpolnjena predvidevanja kot besedilo ograde.</translation> <translation id="5397578532367286026">Upravitelj (<ph name="MANAGER_EMAIL" />) lahko na chrome.com pregleduje uporabo in zgodovino tega uporabnika.</translation> <translation id="5397794290049113714">Vi</translation> +<translation id="5398572795982417028">Sklic na stran zunaj dovoljenega razpona, omejitev je <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> z drugih spletnih mest</translation> <translation id="5399158067281117682">Kodi PIN se ne ujemata.</translation> <translation id="5400640815024374115">Čip modula zaupanja (TPM) je onemogočen ali ni nameščen.</translation> @@ -3021,7 +3036,7 @@ <translation id="5423849171846380976">Aktivirano</translation> <translation id="5425470845862293575">Omogoča uporabo poskusnega sistema za upodabljanje pisave DirectWrite.</translation> <translation id="5425722269016440406">Če želite izklopiti Smart Lock, morate imeti internetno povezavo, ker je ta nastavitev sinhronizirana z vašim telefonom in drugimi napravami. Najprej se povežite z omrežjem.</translation> -<translation id="5426623592374109001">Za sestavljene animacije v uporabniškem vmesniku uporabi star vsiljiv animacijski podsistem.</translation> +<translation id="5425863515030416387">Preprosta prijava v napravah</translation> <translation id="5427459444770871191">&Zasukaj v smeri urinega kazalca</translation> <translation id="5428105026674456456">španščina</translation> <translation id="542872847390508405">Brskate kot gost</translation> @@ -3046,6 +3061,7 @@ <translation id="5451646087589576080">Prikaz podatkov &okvirja</translation> <translation id="5453029940327926427">Zapri zavihke</translation> <translation id="5453632173748266363">Cirilica</translation> +<translation id="5454166040603940656">pri ponudniku <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Neveljavno</translation> <translation id="5457459357461771897">Branje in izbris fotografij, glasbe in drugih predstavnosti v računalniku</translation> <translation id="5457599981699367932">Brskajte kot gost</translation> @@ -3216,7 +3232,6 @@ <translation id="5708171344853220004">Microsoftovo glavno ime</translation> <translation id="5709885306771508267">Spreminjanje velikosti z vlečenjem prstov skupaj</translation> <translation id="5710406368443808765">Ojoj! Sistemu ni uspelo shraniti žetona in ID-ja naprave.</translation> -<translation id="571161420693302741">Gostitelj <ph name="HOST_NAME" /> se ne odziva. Predvajanje ni mogoče.</translation> <translation id="5711983031544731014">Odklepanje ni mogoče. Vnesite geslo.</translation> <translation id="5712966208980506909">Če je zastavica omogočena, URL chrome://md-policy naloži stran s pravilniki za materialno oblikovanje.</translation> <translation id="5715711091495208045">Posrednik za vtičnik: <ph name="PLUGIN_NAME" /></translation> @@ -3485,7 +3500,6 @@ <translation id="6111974609785983504">Privzeto dovoljeno</translation> <translation id="6113134669445407638">Onemogoči mehanizem »Delay Agnostic AEC« v tehnologiji WebRTC. Uporablja se, če so poročane sistemske zakasnitve izjemno zaupanja vredne ali če drugi od vašega računalnika prejmejo odmev.</translation> <translation id="6116921718742659598">Spreminjanje nastavitev jezika in vnosa</translation> -<translation id="6117536376248197233">V upodabljalnikih onemogoči animacijske časovnice sestavljalnika.</translation> <translation id="6120205520491252677">Pripnite to stran na začetni zaslon ...</translation> <translation id="6122081475643980456">Vaša povezava z internetom je nadzorovana</translation> <translation id="6122093587541546701">E-poštni naslov (izbirno):</translation> @@ -3517,6 +3531,7 @@ <translation id="6163522313638838258">Razširi vse ...</translation> <translation id="6164005077879661055">Vse datoteke in lokalni podatki, povezani z zaščitenim uporabnikom, bodo trajno izbrisani, ko ga odstranite. Obiskana spletna mesta in nastavitve tega uporabnika bodo morda še vedno vidna upravitelju na <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Več o tem</translation> +<translation id="6167008112175207002">Vaši zaznamki, zgodovina, gesla in druge nastavitve bodo sinhronizirani z Google Računom, tako da jih boste uporabljali v vseh svojih napravah. To nastavitev lahko spremenite na <ph name="BEGIN_LINK" />.</translation> <translation id="6171550060231646388">Simulirane funkcije »Ok Google« strojne opreme</translation> <translation id="6175314957787328458">GUID Microsoftove domene</translation> <translation id="6178664161104547336">Izberite potrdilo</translation> @@ -3719,6 +3734,7 @@ <translation id="648927581764831596">Ni na voljo</translation> <translation id="6490936204492416398">Namestitev nove iz spletne trgovine</translation> <translation id="6492313032770352219">Velikost na disku:</translation> +<translation id="6498249116389603658">&Vsi jeziki</translation> <translation id="6499143127267478107">Razreševanje gostitelja v skriptu proxy ...</translation> <translation id="6503077044568424649">Najpogostejše</translation> <translation id="6503256918647795660">Francoska tipkovnica (Švica)</translation> @@ -3760,7 +3776,6 @@ <translation id="6555432686520421228">Odstrani vse uporabniške račune in ponastavi napravo <ph name="IDS_SHORT_PRODUCT_NAME" /> na nastavitve kot pri novi.</translation> <translation id="6556866813142980365">Uveljavi</translation> <translation id="6557565812667414268">Omogočeno samo za visokoločljivostne zaslone</translation> -<translation id="655845594391856372">Zavihek se ne odziva. Predvajanje ni mogoče.</translation> <translation id="6559580823502247193">(že v tej napravi)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Kopiranje posnetka za obnovitev iz stisnjene datoteke ...</translation> @@ -3861,6 +3876,7 @@ <translation id="6723354935081862304">Tiskajte v Google Dokumentih in drugih ciljih v oblaku. Če želite tiskati z Google Tiskanjem v oblaku, <ph name="BEGIN_LINK" />se prijavite<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">Uvoz zaznamkov in nastavitev ...</translation> <translation id="6723839937902243910">Napajanje</translation> +<translation id="6725240607822645708">Izvajaj IME v svoji niti.</translation> <translation id="6725970970008349185">Število kandidatov za prikaz na stran</translation> <translation id="672609503628871915">Oglejte si novosti</translation> <translation id="6727005317916125192">Prejšnje podokno</translation> @@ -3991,12 +4007,11 @@ <translation id="6948736568813450284">Za razvijalce: za klice API-ja za Google Payments uporabite storitev v peskovniku.</translation> <translation id="6949306908218145636">Ustvarjanje zaznamkov za odprte strani ...</translation> <translation id="695164542422037736">Če je ta možnost omogočena in telo uporablja slog background-attachment:fixed, bo imelo ozadje svoj sestavljen sloj.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> si zapomni vaša gesla in vas v tej napravi samodejno prijavi v spletna mesta.</translation> <translation id="6955446738988643816">Preglej pojavno okno</translation> <translation id="695755122858488207">Neizbran izbirni gumb</translation> +<translation id="6960277925159781810">Samodejna prijava v tej napravi</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Omogoči sinhronizacijo prek prenosa podatkov v mobilnih omrežjih</translation> -<translation id="6964308487066031935">Želite v razširitev »<ph name="EXTENSION" />« dodati mape?</translation> <translation id="6965382102122355670">V redu</translation> <translation id="6965648386495488594">Vrata</translation> <translation id="6965978654500191972">Naprava</translation> @@ -4094,7 +4109,6 @@ <translation id="7076293881109082629">Prijava</translation> <translation id="7077829361966535409">Nalaganje strani za prijavo s trenutnimi nastavitvami strežnika proxy ni uspelo. <ph name="GAIA_RELOAD_LINK_START" />Poskusite se znova prijaviti<ph name="GAIA_RELOAD_LINK_END" /> ali uporabite druge <ph name="PROXY_SETTINGS_LINK_START" />nastavitve proxyja<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Prezrte rutine za obravnavanje protokolov</translation> -<translation id="7079038783243627996">Razširitev »<ph name="EXTENSION" />« bo lahko v označenih mapah brala in brisala slike, videoposnetke ter zvočne datoteke.</translation> <translation id="708060913198414444">Kopiraj naslov zvoka</translation> <translation id="708187310695946552">Uporabniški vmesniki za obnovitev seje v oblačku</translation> <translation id="7082055294850503883">Privzeto prezri stanje tipke CapsLock in vnašaj z malimi črkami</translation> @@ -4238,6 +4252,8 @@ <translation id="7313804056609272439">Vietnamski način vnosa (VNI)</translation> <translation id="7314244761674113881">Gostitelj SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (trenutni)</translation> +<translation id="7321545336522791733">Strežnik ni dosegljiv</translation> +<translation id="7324841169865301118">Omogočanje uporabnika za izbiro zavihka za skupno rabo namizja.</translation> <translation id="7325437708553334317">Visokokontrastna razširitev</translation> <translation id="7326565110843845436">Klik s tremi prsti na sledilni ploščici</translation> <translation id="73289266812733869">Neizbrano</translation> @@ -4464,7 +4480,6 @@ <translation id="7650511557061837441">»<ph name="TRIGGERING_EXTENSION_NAME" />« želi odstraniti »<ph name="EXTENSION_NAME" />«.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> je v tem jeziku</translation> <translation id="7654941827281939388">Ta račun se že uporablja v tem računalniku.</translation> -<translation id="7655165758820095116">Predmet MediaSource omogoča JavaScriptu pošiljanje podatkov predstavnosti neposredno videoelementu.</translation> <translation id="7658239707568436148">Prekliči</translation> <translation id="7659584679870740384">Nimate dovoljenja za uporabo te naprave. Za dovoljenje za prijavo se obrnite na skrbnika.</translation> <translation id="7664620655576155379">Nepodprta naprava Bluetooth: »<ph name="DEVICE_NAME" />«.</translation> @@ -4595,6 +4610,7 @@ <translation id="7861215335140947162">&Prenosi</translation> <translation id="7864539943188674973">Onemogoči Bluetooth</translation> <translation id="7868891395842935202">Omogoča poskusno ogrodje za nadziranje dostopa do poskusov z API-ji.</translation> +<translation id="7870576007982733437">Uporaba sistemskega upravitelja prenosov, ko je to potrebno.</translation> <translation id="7870790288828963061">Ni aplikacij za kiosk z novejšo različico. Ni česa posodobiti. Odstranite ključek USB.</translation> <translation id="787150342916295244">Optično branje kreditnih kartic</translation> <translation id="7874357055309047713">Vedno izvajaj na vseh spletnih mestih</translation> @@ -4637,7 +4653,6 @@ <translation id="7918257978052780342">Včlanitev</translation> <translation id="7920092496846849526">Starša si vprašal, ali smeš obiskati to stran.</translation> <translation id="7925285046818567682">Čakam <ph name="HOST_NAME" /> ...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> si zapomni vaša gesla in vas v različnih napravah samodejno prijavi v aplikacije in spletna mesta.</translation> <translation id="7925686952655276919">Ne uporabi mobilnih podatkov za sinhronizacijo</translation> <translation id="7926906273904422255">Izvore, ki niso varni, označi tako, da niso varni ali so »vprašljivi«.</translation> <translation id="7928710562641958568">Izpni napravo</translation> @@ -4699,7 +4714,6 @@ Datoteko s ključem shranite na varnem. Potrebovali jo boste za izdelavo novih različic razširitev.</translation> <translation id="799923393800005025">Ogled dovoljen</translation> <translation id="7999338963698132743">Nov upravitelj opravil</translation> -<translation id="8000004253404706714">Za sestavljene animacije v upodabljalnikih uporabi star vsiljiv animacijski podsistem.</translation> <translation id="8004582292198964060">Brskalnik</translation> <translation id="8007030362289124303">Akumulator je skoraj prazen</translation> <translation id="8008356846765065031">Internetna povezava je prekinjena. Preverite povezavo.</translation> @@ -4828,6 +4842,7 @@ <translation id="8185331656081929126">Pokaži obvestila, ko so v omrežju zaznani novi tiskalniki</translation> <translation id="8186609076106987817">Strežnik ni mogel najti datoteke.</translation> <translation id="8186706823560132848">Programska oprema</translation> +<translation id="8188120771410500975">&Preveri črkovanje besedilnih polj</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> in še toliko drugih: <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Vzpostavljanje povezave z <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Upravljajte aplikacije, razširitve in teme</translation> @@ -5222,6 +5237,7 @@ <translation id="8765985713192161328">Upravljanje kontrolnikov ...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Št. uporabnikov</translation> +<translation id="8768367823103160496">Zaklepanje miškinega kazalca</translation> <translation id="8769662576926275897">Podrobnosti kartice</translation> <translation id="8770196827482281187">Perzijski način vnosa (razporeditev ISIRI 2901)</translation> <translation id="8774934320277480003">Zgornji rob</translation> @@ -5241,6 +5257,7 @@ <translation id="8795668016723474529">Dodaj kreditno kartico</translation> <translation id="8795916974678578410">Novo okno</translation> <translation id="8798099450830957504">Privzeto</translation> +<translation id="8799127529310003270">Če je omogočeno, se klici InputConnection izvajajo v niti IME in vsak klic InputConnection komunicira neposredno z upodabljalnikom, namesto da bi ohranil urejevalnik kopij.</translation> <translation id="8799839487311913894">Omogoči posodabljanje gesla v upravitelju gesel po pošiljanju obrazca za spreminjanje gesla.</translation> <translation id="8800004011501252845">Prikaz ciljev za</translation> <translation id="8800420788467349919">Količina: <ph name="PRECENTAGE" /> %</translation> @@ -5266,6 +5283,7 @@ <translation id="8841142799574815336">Neaktivno vidno območje.</translation> <translation id="884264119367021077">Naslov za pošiljanje</translation> <translation id="8844238624737526720">Uporaba nove in optimizirane izvedbe Chromovega upravitelja opravil.</translation> +<translation id="8845001906332463065">Poiščite pomoč</translation> <translation id="8846141544112579928">Iskanje tipkovnice ...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Preklop načina s tipko Shift</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 3ad793c3..0297e6c 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Обележи ову страницу...</translation> <translation id="1047956942837015229">Брисање ставки (<ph name="COUNT" />)...</translation> <translation id="1048597748939794622">Принудно омогућено за све слојеве</translation> +<translation id="1049795001945932310">&Подешавања језика</translation> <translation id="1049926623896334335">Word документ</translation> <translation id="1054153489933238809">Отвори оригиналну сл&ику у новој картици</translation> <translation id="1055806300943943258">Тражимо Bluetooth и USB уређаје...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Транслитерација (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Аутоматски сервери назива</translation> <translation id="1215411991991485844">Нова апликација у позадини је додата</translation> +<translation id="1216954813581739968">Омогући картицу за дељење радне површине.</translation> <translation id="121827551500866099">Прикажи сва преузимања...</translation> <translation id="122082903575839559">Алгоритам потписа сертификата</translation> <translation id="1221024147024329929">PKCS #1 MD2 са RSA шифровањем</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Аутоматско пријављивање није успело</translation> <translation id="1293556467332435079">Датотеке</translation> <translation id="1294298200424241932">Измени подешавања поузданости:</translation> +<translation id="1295794900245526845">Изаберите налог сачуван помоћу услуге <ph name="PASSWORD_MANAGER_BRAND" /> да бисте се пријавили</translation> <translation id="1297175357211070620">Одредиште</translation> <translation id="1297922636971898492">Google диск тренутно није доступан. Отпремање ће се аутоматски поново покренути када Google диск постане доступан.</translation> <translation id="1300861494336759522">Преусмеравање претрага на Windows радној површини</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Ово ће ресетовати почетну страницу, страницу нове картице, претраживач и закачене картице. Такође ће онемогућити све додатке и обрисати привремене податке попут колачића. Обележивачи, историја и сачуване лозинке неће бити обрисани.</translation> <translation id="1434886155212424586">Почетна страница је страница Нова картица</translation> <translation id="1435550882135542937">Нови дизајн траке с алаткама за додатке</translation> +<translation id="1436402875660227532">Напомена: Ова подешавања се више не користе у овом систему, али и даље можете да их прегледате и мењате.</translation> <translation id="1436784010935106834">Уклоњено</translation> <translation id="1438632560381091872">Укључи звук картица</translation> <translation id="1441841714100794440">Вијетнамска тастатура (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Омогућите подршку за виртуелну тастатуру.</translation> <translation id="1474079335130556426">Омогућава позадински режим за API Push. То омогућава Chrome-у да настави да ради када се затвори последњи прозор, као и да се покреће при покретању ОС-а, ако је то потребно API-ју Push.</translation> <translation id="1474339897586437869">Датотека „<ph name="FILENAME" />“ није отпремљена. Није било довољно слободног места на Google диску.</translation> +<translation id="1476607407192946488">&Подешавања језика</translation> <translation id="1476949146811612304">Подесите претраживач који ће се користити када претражујете из <ph name="BEGIN_LINK" />омнибокса<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Кеш токена API-ја за идентитет</translation> <translation id="1478340334823509079">Детаљи: <ph name="FILE_NAME" /></translation> @@ -646,6 +651,7 @@ <translation id="1962233722219655970">Ова страница користи Native Client апликацију која не функционише на вашем рачунару.</translation> <translation id="1965328510789761112">Приватна меморија</translation> <translation id="1965624977906726414">Нема посебних дозвола.</translation> +<translation id="1968720524450620475">Омогући иконе за радњу за Веб-обавештења.</translation> <translation id="1970746430676306437">Прикажи &информације о страници</translation> <translation id="197288927597451399">Задржи</translation> <translation id="1973491249112991739">Преузимање додатне компоненте <ph name="PLUGIN_NAME" /> није успело.</translation> @@ -906,6 +912,7 @@ <translation id="2344262275956902282">Користите тастере - и = да бисте поставили листу кандидата</translation> <translation id="2347476388323331511">Синхронизација није могућа</translation> <translation id="2347991999864119449">Омогући ми да изаберем када се покреће садржај додатне компоненте</translation> +<translation id="2348165084656290171">Да бисте делили звук, изаберите картицу или цео екран.</translation> <translation id="2350182423316644347">Покретање апликације...</translation> <translation id="2350796302381711542">Желите ли да дозволите да <ph name="HANDLER_HOSTNAME" /> отвара све <ph name="PROTOCOL" /> линкове за које сте до сада користили <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Језик и унос</translation> @@ -993,6 +1000,7 @@ <translation id="247772113373397749">Канадска вишејезичка тастатура</translation> <translation id="2478176599153288112">Дозволе за медијске датотеке за „<ph name="EXTENSION" />“</translation> <translation id="2478830106132467213">Откључај овај <ph name="DEVICE_TYPE" /> само када му је телефон веома близу.</translation> +<translation id="247949520305900375">Дели звук</translation> <translation id="2479780645312551899">Покрени све додатне компоненте овај пут</translation> <translation id="2480626392695177423">Укључи/искључи режим интерпункције пуне или полуширине</translation> <translation id="2481332092278989943">Додајте на полицу</translation> @@ -1306,6 +1314,7 @@ <translation id="2889064240420137087">Отвори везу користећи...</translation> <translation id="2889925978073739256">Настави блокирање додатних компонената које су изван заштићеног окружења</translation> <translation id="2890624088306605051">Преузми само синхронизована подешавања и податке</translation> +<translation id="2890678560483811744">Превелика референца за странице</translation> <translation id="2893168226686371498">Подразумевани прегледач</translation> <translation id="289426338439836048">Друга мобилна мрежа...</translation> <translation id="2894745200702272315">Омогућава експерименталну верзију функција за откривање актуелне речи „ОК Google“ које су зависне од хардвера.</translation> @@ -1334,7 +1343,6 @@ <translation id="2925966894897775835">Табеле</translation> <translation id="2927017729816812676">Меморијски простор кеша</translation> <translation id="2927657246008729253">Промени...</translation> -<translation id="2928415919076124714">Сакриј траку с алаткама у режиму целог екрана</translation> <translation id="2928526264833629376">Настави на Hangouts</translation> <translation id="2930644991850369934">Дошло је до проблема при преузимању слике за обнављање. Прекинута је веза са мрежом.</translation> <translation id="293111069139560936">Омогућава полици да смањи прозор ако се кликне на ставку полице са којом је повезан само један, већ активан прозор.</translation> @@ -1458,6 +1466,7 @@ <translation id="3117812041123364382">Омогућава или онемогућава плутајућу виртуелну тастатуру.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> – помоћ</translation> <translation id="3120430004221004537">Недовољно шифровање за дату операцију на: „<ph name="DEVICE_NAME" />“.</translation> +<translation id="3121260210578524273">Омогућава иконе у дугмади за радњу за Веб-обавештења.</translation> <translation id="3121793941267913344">Ресетовање овог <ph name="IDS_SHORT_PRODUCT_NAME" /> уређаја</translation> <translation id="3122162841865761901">Експерименти са Алаткама за програмере</translation> <translation id="3122464029669770682">CPU</translation> @@ -1578,7 +1587,6 @@ <translation id="3289566588497100676">Лаки унос симбола</translation> <translation id="3289856944988573801">Да бисте потражили ажурирања, користите етернет или Wi-Fi.</translation> <translation id="3293325348208285494">Брзи почетак</translation> -<translation id="3293894718455402932">„<ph name="EXTENSION" />“ ће моћи да чита и уписује датотеке слика, видео и аудио датотеке у означеним директоријумима.</translation> <translation id="3294437725009624529">Гост</translation> <translation id="329650768420594634">Упозорење о паковању додатка</translation> <translation id="3296763833017966289">грузијски</translation> @@ -1636,6 +1644,7 @@ <translation id="3338239663705455570">Језик тастатуре: словеначки</translation> <translation id="3340978935015468852">подешавања</translation> <translation id="3341703758641437857">Дозволи приступ URL адресама датотека</translation> +<translation id="3343813173145836998">Лако се пријављујте на овом уређају</translation> <translation id="3344786168130157628">Назив приступне тачке:</translation> <translation id="3345135638360864351">Слање захтева за приступ овом сајту кориснику <ph name="NAME" /> није успело. Покушајте поново.</translation> <translation id="3345886924813989455">Није пронађен ниједан подржани прегледач</translation> @@ -2115,6 +2124,7 @@ <translation id="3996912167543967198">Враћање на почетне вредности...</translation> <translation id="3997015411467176489">Експерименталне функције проширеног приказа</translation> <translation id="40027638859996362">Премештање речи</translation> +<translation id="400554499662786523">Да бисте делили звук, изаберите картицу.</translation> <translation id="4012550234655138030">Подешавање штампача или управљање њима у услузи <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Желите ли да поправите „<ph name="EXTENSION_NAME" />“?</translation> <translation id="4018133169783460046">Прикажи <ph name="PRODUCT_NAME" /> на овом језику</translation> @@ -2217,6 +2227,7 @@ <translation id="4180788401304023883">Желите ли да избришете сертификат ауторитета за издавање сертификата „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="418179967336296930">Руска фонетска тастатура (YaZHert)</translation> <translation id="4181841719683918333">Језици</translation> +<translation id="4187248015940562149">Омогућава Bluetooth за веб који може да омогући веб-сајтовима да се повезују са Bluetooth уређајима око вас и да их контролишу.</translation> <translation id="4188026131102273494">Кључна реч:</translation> <translation id="4189406272289638749">Додатак, <b><ph name="EXTENSION_NAME" /></b>, контролише ово подешавање.</translation> <translation id="4193154014135846272">Google документ</translation> @@ -2273,6 +2284,7 @@ <translation id="4268025649754414643">Шифровање кључа</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Верзија <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Нема подударања</translation> <translation id="4274187853770964845">Грешка при синхронизацији: Зауставите и поново покрените синхронизацију.</translation> <translation id="4275830172053184480">Поновно покретање уређаја</translation> <translation id="4276796043975446927">Добро дошли у Chromebox за састанке</translation> @@ -2342,6 +2354,7 @@ <translation id="4378551569595875038">Повезује се...</translation> <translation id="438122767399415311">Приморај кориснички интерфејс да користи одређени смер</translation> <translation id="4381849418013903196">Две тачке</translation> +<translation id="4383192539467954373">Аутоматски се пријављујте на свим уређајима</translation> <translation id="4384652540891215547">Активирање додатка</translation> <translation id="438503109373656455">Саратога</translation> <translation id="4387554346626014084">Омогућите синхронизацију Покретача апликација. То омогућава и Директоријуме ако су доступни (не на оперативном систему OSX).</translation> @@ -2359,6 +2372,7 @@ <translation id="4421932782753506458">Пуфница</translation> <translation id="4422347585044846479">Измените обележивач за ову страницу</translation> <translation id="4422428420715047158">Домен:</translation> +<translation id="4423482519432579560">&Провера правописа</translation> <translation id="442477792133831654">Комуникација са уређајима у близини</translation> <translation id="4425149324548788773">Мој диск</translation> <translation id="4428582326923056538">Изузеци за камеру за Adobe Flash Player се разликују.</translation> @@ -2373,6 +2387,7 @@ <translation id="444267095790823769">Изузеци за заштићени садржај</translation> <translation id="4443536555189480885">&Help (Помоћ)</translation> <translation id="4444304522807523469">Приступ скенерима за документе прикљученим преко USB-а или на локалној мрежи</translation> +<translation id="4445559854264555037">Не видите уређај? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Пресликано</translation> <translation id="4447465454292850432">Батерија:</translation> <translation id="4449935293120761385">О аутоматском попуњавању</translation> @@ -2432,7 +2447,7 @@ <translation id="4547659257713117923">Нема картица са других уређаја</translation> <translation id="4547992677060857254">Директоријум који сте изабрали садржи осетљиве датотеке. Јесте ли сигурни да желите да одобрите апликацији „$1“ сталан приступ за уписивање за овај директоријум?</translation> <translation id="4552495056028768700">Приступ страници</translation> -<translation id="4552678318981539154">Купи још складишног простора</translation> +<translation id="4552678318981539154">Купи још меморијског простора</translation> <translation id="4554591392113183336">Верзија спољног додатка је иста или старија од постојећег.</translation> <translation id="4554796861933393312">Брзина анимације капљице за материјални дизајн</translation> <translation id="4555769855065597957">Нови профил</translation> @@ -2631,6 +2646,7 @@ <translation id="485316830061041779">немачки</translation> <translation id="4856478137399998590">Услуга мобилног преноса података је активирана и спремна за употребу</translation> <translation id="4858913220355269194">Фриц</translation> +<translation id="4860565041166337978">Дозволите да преузимања обрађује менаџер преузимања у систему када је то примењиво.</translation> <translation id="48607902311828362">Режим рада у авиону</translation> <translation id="4861833787540810454">&Пусти</translation> <translation id="4862050643946421924">Додаје се уређај...</translation> @@ -2714,7 +2730,6 @@ <translation id="4977942889532008999">Потврдите приступ</translation> <translation id="4982718461356080574">Скривање дугмади за затварање на неактивним картицама када се налазе у групама</translation> <translation id="498294082491145744">Промените подешавања која контролишу приступ веб-сајтова функцијама попут колачића, JavaScript-а, додатних компонената, географске локације, микрофона, камере итд.</translation> -<translation id="4984329823325527157">API Media Source</translation> <translation id="4988526792673242964">Странице</translation> <translation id="4988792151665380515">Извоз јавног кључа није успео.</translation> <translation id="49896407730300355">Окрећи у с&меру супротном од кретања казаљке на сату</translation> @@ -2903,7 +2918,6 @@ <translation id="5268606875983318825">PPAPI (изван процеса)</translation> <translation id="526926484727016706">Доводи до тога да све дозволе за све iframe-ове буду подразумевано одбијене. Ако омогућите одређене дозволе за iframe, то може да подразумева навођење назива тих дозвола као вредности за нове iframe атрибуте.</translation> <translation id="5269977353971873915">Штампање није успело</translation> -<translation id="5270884342523754894">„<ph name="EXTENSION" />“ ће моћи да чита датотеке слика, видео и аудио датотеке у означеним директоријумима.</translation> <translation id="5271247532544265821">Укључи/искључи режим за поједностављени/традиционални кинески језик</translation> <translation id="5271549068863921519">Сачувај лозинку</translation> <translation id="5273628206174272911">Експериментална навигација кроз историју коју активира водоравно бочно превлачење.</translation> @@ -2940,6 +2954,7 @@ <translation id="5316716239522500219">Пресликавање монитора</translation> <translation id="5317780077021120954">Сачувај</translation> <translation id="5319782540886810524">Језик тастатуре: летонски</translation> +<translation id="532247166573571973">Сервер је можда недоступан. Покушајте поново касније.</translation> <translation id="5323213332664049067">Латинска Америка</translation> <translation id="532360961509278431">Није могуће отворити „$1“: $2</translation> <translation id="5324674707192845912">Управо опозивате регистрацију за овај <ph name="DEVICE_TYPE" /> на Google-у да бисте онемогућили даљинско лоцирање, брисање података и закључавање уређаја. За то је потребно рестартовање уређаја. Желите ли да наставите?</translation> @@ -2957,7 +2972,7 @@ <translation id="5334844597069022743">Приказ извора</translation> <translation id="5337705430875057403">Нападачи на <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> могу да вас преваре како бисте урадили нешто опасно, на пример, да инсталирате софтвер или откријете личне податке (попут лозинки, бројева телефона или бројева кредитних картица).</translation> <translation id="5337771866151525739">Инсталирала трећа страна.</translation> -<translation id="5338503421962489998">Локални складишни простор</translation> +<translation id="5338503421962489998">Локални меморијски простор</translation> <translation id="5340217413897845242">6. ставка на полици</translation> <translation id="5342344590724511265">Повратне информације о отказивању картице.</translation> <translation id="5342451237681332106">Користи <ph name="PHONE_NAME" /></translation> @@ -2992,11 +3007,11 @@ <translation id="5390284375844109566">Индексирана база података</translation> <translation id="5392544185395226057">Омогућите подршку за Native Client.</translation> <translation id="5393125431335030955">Ова додатна компонента функционише само на рачунару.</translation> -<translation id="5393559999218790205">Онемогући временске линије за алатку за слагање анимација за кориснички интерфејс</translation> <translation id="5396126354477659676">Додатна компонента <ph name="PEPPER_PLUGIN_NAME" /> на домену <ph name="PEPPER_PLUGIN_DOMAIN" /> жели да приступи рачунару.</translation> <translation id="539755880180803351">Означава веб-обрасце са типом поља са предвиђањима помоћу аутоматског попуњавања који функционишу као текст резервисаног места.</translation> <translation id="5397578532367286026">Менаџер (<ph name="MANAGER_EMAIL" />) може да прегледа коришћење и историју овог корисника на chrome.com.</translation> <translation id="5397794290049113714">Ви</translation> +<translation id="5398572795982417028">Превелика референца за странице, ограничење је <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> са других сајтова</translation> <translation id="5399158067281117682">PIN-ови се не подударају!</translation> <translation id="5400640815024374115">TPM (Trusted Platform Module) чип је онемогућен или недостаје.</translation> @@ -3016,7 +3031,7 @@ <translation id="5423849171846380976">Активирано</translation> <translation id="5425470845862293575">Омогућава коришћење експерименталног DirectWrite система за приказивање фонтова.</translation> <translation id="5425722269016440406">Морате да будете онлајн да бисте искључили Smart Lock јер се ово подешавање синхронизује са телефоном и другим уређајима. Прво се повежите са мрежом.</translation> -<translation id="5426623592374109001">Користите стари принудни подсистем за анимацију за композитне анимације у корисничком интерфејсу.</translation> +<translation id="5425863515030416387">Лако се пријављујте на свим уређајима</translation> <translation id="5427459444770871191">Окрећи &у смеру кретања казаљке на сату</translation> <translation id="5428105026674456456">шпански</translation> <translation id="542872847390508405">Прегледате као гост</translation> @@ -3041,6 +3056,7 @@ <translation id="5451646087589576080">Прикажи &информације о оквиру</translation> <translation id="5453029940327926427">Затвори картице</translation> <translation id="5453632173748266363">ћирилица</translation> +<translation id="5454166040603940656">са добављачем <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Неважеће</translation> <translation id="5457459357461771897">Читање слика, музике и других медија са рачунара и брисање тих медија</translation> <translation id="5457599981699367932">Прегледајте као гост</translation> @@ -3212,7 +3228,6 @@ <translation id="5708171344853220004">Microsoft главно име</translation> <translation id="5709885306771508267">Промена величине скупљањем прстију</translation> <translation id="5710406368443808765">Упс! Систем није успео да сачува токен и ИД уређаја.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> не реагује. Пребацивање није успело.</translation> <translation id="5711983031544731014">Откључавање није могуће. Унесите лозинку.</translation> <translation id="5712966208980506909">Ако је ова опција омогућена, URL chrome://md-policy учитава страницу смерница за материјални дизајн.</translation> <translation id="5715711091495208045">Посредник додатне компоненте: <ph name="PLUGIN_NAME" /></translation> @@ -3481,7 +3496,6 @@ <translation id="6111974609785983504">Подразумевано омогућено</translation> <translation id="6113134669445407638">Онемогућава кашњење агностичког отказивања акустичног еха у WebRTC-у. Користи се ако су пријављена кашњења система веома поуздана или ако се другима јавља ехо са вашег рачунара.</translation> <translation id="6116921718742659598">Промени подешавања језика и уноса</translation> -<translation id="6117536376248197233">Онемогући временске линије за алатку за слагање анимација у приказивачима.</translation> <translation id="6120205520491252677">Закачи ову страницу на Почетни екран...</translation> <translation id="6122081475643980456">Интернет веза се контролише</translation> <translation id="6122093587541546701">Имејл (опционално):</translation> @@ -3513,6 +3527,7 @@ <translation id="6163522313638838258">Прошири све...</translation> <translation id="6164005077879661055">Све датотеке и локални подаци повезани са корисником под надзором ће бити трајно избрисани када уклоните овог корисника под надзором. Менаџер ће можда и даље моћи да види посећене веб-сајтове и подешавања за овог корисника под надзором на <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Сазнајте више</translation> +<translation id="6167008112175207002">Обележивачи, историја, лозинке и друга подешавања ће се синхронизовати са Google налогом да бисте могли да их користите на свим уређајима. То можете да промените у одељку <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Функције „Oк Google“ симулираног хардвера</translation> <translation id="6175314957787328458">GUID Microsoft домена</translation> <translation id="6178664161104547336">Избор сертификата</translation> @@ -3715,6 +3730,7 @@ <translation id="648927581764831596">Није доступно</translation> <translation id="6490936204492416398">Инсталирај нови из веб-продавнице</translation> <translation id="6492313032770352219">Простор на диску:</translation> +<translation id="6498249116389603658">&Сви ваши језици</translation> <translation id="6499143127267478107">Решавање хоста у скрипти проксија...</translation> <translation id="6503077044568424649">Најпосећенији</translation> <translation id="6503256918647795660">Језик тастатуре: француски (Швајцарска)</translation> @@ -3756,7 +3772,6 @@ <translation id="6555432686520421228">Уклоните све корисничке налоге и рестартујте <ph name="IDS_SHORT_PRODUCT_NAME" /> уређај да би био као нов.</translation> <translation id="6556866813142980365">Понови</translation> <translation id="6557565812667414268">Омогућено само за екране високе резолуције</translation> -<translation id="655845594391856372">Картица не реагује. Пребацивање није успело.</translation> <translation id="6559580823502247193">(већ је на овом уређају)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Издвајање слике за обнављање...</translation> @@ -3857,6 +3872,7 @@ <translation id="6723354935081862304">Штампање преко Google докумената или других одредишта у клауду. <ph name="BEGIN_LINK" />Пријавите се<ph name="END_LINK" /> да бисте штампали преко Google Cloud штампања.</translation> <translation id="6723661294526996303">Увези обележиваче и подешавања...</translation> <translation id="6723839937902243910">Енергија</translation> +<translation id="6725240607822645708">Покрени IME у његовој нити.</translation> <translation id="6725970970008349185">Број кандидата за приказ по страници</translation> <translation id="672609503628871915">Прикажи шта је ново</translation> <translation id="6727005317916125192">Претходни оквир</translation> @@ -3986,12 +4002,11 @@ <translation id="6948736568813450284">За програмере: Користите услугу у заштићеном окружењу за позиве API-ја за Google Payments.</translation> <translation id="6949306908218145636">Обележи отворене странице...</translation> <translation id="695164542422037736">Ако је ова опција омогућена, а тело је стилизовано помоћу подешавања background-attachment:fixed, позадина ће имати сопствени композитни слој.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> памти лозинке и аутоматски вас пријављује на сајтове на овом уређају.</translation> <translation id="6955446738988643816">Испитивање искачућег прозора</translation> <translation id="695755122858488207">Неизабрано дугме за избор</translation> +<translation id="6960277925159781810">Аутоматски се пријављујте на овом уређају</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Омогући синхронизацију преко мобилне везе за пренос података</translation> -<translation id="6964308487066031935">Желите да додате директоријуме у „<ph name="EXTENSION" />“?</translation> <translation id="6965382102122355670">Потврди</translation> <translation id="6965648386495488594">Порт</translation> <translation id="6965978654500191972">Уређај</translation> @@ -4092,7 +4107,6 @@ <translation id="7076293881109082629">Пријављивање</translation> <translation id="7077829361966535409">Учитавање странице за пријављивање помоћу актуелних подешавања проксија није успело. <ph name="GAIA_RELOAD_LINK_START" />Покушајте поново да се пријавите<ph name="GAIA_RELOAD_LINK_END" /> или користите нека друга <ph name="PROXY_SETTINGS_LINK_START" />подешавања проксија<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Занемарене процедуре протокола</translation> -<translation id="7079038783243627996">„<ph name="EXTENSION" />“ ће моћи да чита и брише датотеке слика, видео и аудио датотеке у означеним директоријумима.</translation> <translation id="708060913198414444">К&опирај адресу аудио садржаја</translation> <translation id="708187310695946552">Кориснички интерфејс са облачићима за враћање сесије</translation> <translation id="7082055294850503883">Игнориши статус тастера CapsLock и подразумевано уноси мала слова</translation> @@ -4105,7 +4119,7 @@ <translation id="7096082900368329802">Желите ли да откријете још сјајних функција?</translation> <translation id="7100897339030255923">Изабраних ставки: <ph name="COUNT" /></translation> <translation id="710227449793100220">Token Binding.</translation> -<translation id="7106346894903675391">Купи још складишног простора...</translation> +<translation id="7106346894903675391">Купи још меморијског простора...</translation> <translation id="7108338896283013870">Сакриј</translation> <translation id="7108668606237948702">enter</translation> <translation id="7113502843173351041">Откривање ваше имејл адресе</translation> @@ -4236,6 +4250,8 @@ <translation id="7313804056609272439">Вијетнамски метод уноса (VNI)</translation> <translation id="7314244761674113881">SOCKS хост</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (тренутни)</translation> +<translation id="7321545336522791733">Сервер није доступан</translation> +<translation id="7324841169865301118">Омогућава кориснику да изабере картицу за дељење радне површине.</translation> <translation id="7325437708553334317">Додатак за високи контраст</translation> <translation id="7326565110843845436">Клик са три прста на тачпеду</translation> <translation id="73289266812733869">Избор је опозван</translation> @@ -4456,7 +4472,6 @@ <translation id="7650511557061837441">„<ph name="TRIGGERING_EXTENSION_NAME" />“ жели да уклони „<ph name="EXTENSION_NAME" />“.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> је приказан на овом језику</translation> <translation id="7654941827281939388">Овај налог се већ користи на овом рачунару.</translation> -<translation id="7655165758820095116">MediaSource објекат омогућава да JavaScript шаље медијске податке директно у видео елемент.</translation> <translation id="7658239707568436148">Откажи</translation> <translation id="7659584679870740384">Немате овлашћење за коришћење овог уређаја. Контактирајте администратора да бисте добили дозволу за пријављивање.</translation> <translation id="7664620655576155379">Неподржани Bluetooth уређај: „<ph name="DEVICE_NAME" />“.</translation> @@ -4517,7 +4532,7 @@ <translation id="7771452384635174008">Распоред</translation> <translation id="7772032839648071052">Потврди приступну фразу</translation> <translation id="7772127298218883077">О <ph name="PRODUCT_NAME" /> прегледачу</translation> -<translation id="7773726648746946405">Складишни простор сесије</translation> +<translation id="7773726648746946405">Меморијски простор сесије</translation> <translation id="7774497835322490043">Омогућите члан за уклањање грешака засновано на GDB-у. Тиме се зауставља Native Client апликација при покретању и чека се на nacl-gdb (из NaCl комплета за развој софтвера) који ће јој бити приложен.</translation> <translation id="7779249319235708104">Очекује вас напад „пецањем“</translation> <translation id="7781335840981796660">Сви кориснички налози и локални подаци ће бити уклоњени.</translation> @@ -4587,6 +4602,7 @@ <translation id="7861215335140947162">&Преузимања</translation> <translation id="7864539943188674973">Онемогући Bluetooth</translation> <translation id="7868891395842935202">Омогућава експериментални оквир за контролисање приступа експериментима са API-јима.</translation> +<translation id="7870576007982733437">Користи менаџер преузимања у систему када је то примењиво.</translation> <translation id="7870790288828963061">Није пронађена ниједна киоск апликација са новијом верзијом. Нема шта да се ажурира. Уклоните USB меморију.</translation> <translation id="787150342916295244">Скенирање кредитних картица</translation> <translation id="7874357055309047713">Увек покрећи на свим сајтовима</translation> @@ -4629,7 +4645,6 @@ <translation id="7918257978052780342">Пријави ме</translation> <translation id="7920092496846849526">Питао/ла си родитеља да ли смеш да посетиш ову страницу.</translation> <translation id="7925285046818567682">Чека се <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> памти лозинке и аутоматски вас пријављује у апликације и на сајтове на свим уређајима.</translation> <translation id="7925686952655276919">Не користи податке за мобилне уређаје за синхронизацију</translation> <translation id="7926906273904422255">Обележава небезбедно порекло као небезбедно или као „сумњиво“.</translation> <translation id="7928710562641958568">Избаци уређај</translation> @@ -4691,7 +4706,6 @@ Чувајте датотеку кључа на сигурном месту. Биће вам потребна да направите нове верзије додатка.</translation> <translation id="799923393800005025">Може да прегледа</translation> <translation id="7999338963698132743">Нови Менаџер задатака</translation> -<translation id="8000004253404706714">Користите стари принудни подсистем за анимацију за композитне анимације у приказивачима.</translation> <translation id="8004582292198964060">Прегледач</translation> <translation id="8007030362289124303">Батерија је скоро празна</translation> <translation id="8008356846765065031">Веза са интернетом је прекинута. Проверите интернет везу.</translation> @@ -4821,6 +4835,7 @@ <translation id="8185331656081929126">Прикажи обавештења када се на мрежи открију нови штампачи</translation> <translation id="8186609076106987817">Сервер није могао да пронађе датотеку.</translation> <translation id="8186706823560132848">Софтвер</translation> +<translation id="8188120771410500975">&Провери правопис у пољима за текст</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> и још <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">Повезивање са мрежом <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Управљање апликацијама, додацима и темама</translation> @@ -5214,6 +5229,7 @@ <translation id="8765985713192161328">Управљај обрађивачима...</translation> <translation id="8766796754185931010">Котоери</translation> <translation id="8767072502252310690">Корисници</translation> +<translation id="8768367823103160496">Закључавање курсора миша</translation> <translation id="8769662576926275897">Детаљи о картици</translation> <translation id="8770196827482281187">Персијски метод уноса (распоред ISIRI 2901)</translation> <translation id="8774934320277480003">Горња маргина</translation> @@ -5233,6 +5249,7 @@ <translation id="8795668016723474529">Додајте кредитну картицу</translation> <translation id="8795916974678578410">Нови прозор</translation> <translation id="8798099450830957504">Подразумевано</translation> +<translation id="8799127529310003270">Ако омогућите ово подешавање, InputConnection позиви се покрећу у IME нити, а уместо задржавања копије уређивача, сваки InputConnection позив ће директно бити упућен приказивачу.</translation> <translation id="8799839487311913894">Омогућава ажурирање лозинке у менаџеру лозинки када се образац „промена лозинке“ пошаље.</translation> <translation id="8800004011501252845">Приказивање одредишта за</translation> <translation id="8800420788467349919">Јачина звука: <ph name="PRECENTAGE" /> %</translation> @@ -5258,13 +5275,14 @@ <translation id="8841142799574815336">Инертна визуелна област приказа.</translation> <translation id="884264119367021077">Адреса за слање</translation> <translation id="8844238624737526720">Користи нову и оптимизовану примену Chrome менаџера задатака.</translation> +<translation id="8845001906332463065">Затражите помоћ</translation> <translation id="8846141544112579928">Тражимо тастатуру...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Промена режима тастера Shift</translation> <translation id="8852742364582744935">Додате су следеће апликације и додаци:</translation> <translation id="885381502874625531">Белоруска тастатура</translation> <translation id="8856844195561710094">Није могуће зауставити откривање Bluetooth уређаја.</translation> -<translation id="885701979325669005">Складишни простор</translation> +<translation id="885701979325669005">Меморијски простор</translation> <translation id="8859057652521303089">Изаберите језик:</translation> <translation id="8859174528519900719">Подоквир: <ph name="SUBFRAME_SITE" /></translation> <translation id="8860454412039442620">Excel табела</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 5d4b8d6a..cbf67e07 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Skapa bokmärke för den här sidan...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> objekt tas bort ...</translation> <translation id="1048597748939794622">Tvingande aktivering för alla lager</translation> +<translation id="1049795001945932310">&Språkinställningar</translation> <translation id="1049926623896334335">Word-dokument</translation> <translation id="1054153489933238809">Öppna originalbilden i en ny flik</translation> <translation id="1055806300943943258">Söker efter Bluetooth- och USB-enheter …</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Translitterering (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Automatiska namnservrar</translation> <translation id="1215411991991485844">En ny bakgrundsapp har lagts till</translation> +<translation id="1216954813581739968">Aktivera flik för att dela skrivbordet.</translation> <translation id="121827551500866099">Visa alla nedladdningar...</translation> <translation id="122082903575839559">Certifikatets signaturalgoritm</translation> <translation id="1221024147024329929">PKCS #1 MD2 med RSA-kryptering</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Det gick inte att logga in automatiskt</translation> <translation id="1293556467332435079">Filer</translation> <translation id="1294298200424241932">Redigera inställningar för tillförlitlighet:</translation> +<translation id="1295794900245526845">Välj kontot som du har sparat med <ph name="PASSWORD_MANAGER_BRAND" /> för att logga in</translation> <translation id="1297175357211070620">Destination</translation> <translation id="1297922636971898492">Google Drive är inte tillgängligt för närvarande. Överföringen fortsätter automatiskt när Google Drive är tillgängligt igen.</translation> <translation id="1300861494336759522">Omdirigering av sökning på Windows-skrivbord</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Den här funktionen återställer startfliken, sidan Ny flik, sökmotorn och de fästa flikarna. Den inaktiverar också alla tillägg och rensar tillfälliga uppgifter som cookies. Bokmärken, historik och sparade lösenord rensas inte.</translation> <translation id="1434886155212424586">Startsidan är sidan Ny flik</translation> <translation id="1435550882135542937">Omstrukturering av tilläggsfältet</translation> +<translation id="1436402875660227532">Obs! Inställningarna används inte längre i det här systemet men du kan fortfarande visa och redigera dem.</translation> <translation id="1436784010935106834">Borttagna</translation> <translation id="1438632560381091872">Slå på ljud från flikar</translation> <translation id="1441841714100794440">Tangentbord för vietnamesiska (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Aktivera stöd för virtuellt tangentbord.</translation> <translation id="1474079335130556426">Aktivera bakgrundsläge för Push-API:et. Det gör att Chrome fortfarande kan köras när det sista fönstret har stängts, och att det kan startas tillsammans med operativsystemet, om Push-API:et behöver det.</translation> <translation id="1474339897586437869"><ph name="FILENAME" /> laddades inte upp. Det fanns inte tillräckligt mycket ledigt utrymme på Google Drive.</translation> +<translation id="1476607407192946488">&Språkinställningar</translation> <translation id="1476949146811612304">Ange vilken sökmotor som används när du söker från <ph name="BEGIN_LINK" />adressfältet<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Tokencacheminne för identitets-API</translation> <translation id="1478340334823509079">Detaljer: <ph name="FILE_NAME" /></translation> @@ -648,6 +653,7 @@ <translation id="1962233722219655970">Denna sida använder en Native Client-app som inte fungerar på din dator.</translation> <translation id="1965328510789761112">Privat minne</translation> <translation id="1965624977906726414">Har inga speciella behörigheter.</translation> +<translation id="1968720524450620475">Aktivera åtgärdsikoner för webbaviseringar.</translation> <translation id="1970746430676306437">Visa sid&info</translation> <translation id="197288927597451399">Behåll</translation> <translation id="1973491249112991739">Det gick inte att ladda ned <ph name="PLUGIN_NAME" />.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">Använd tangenterna - och = om du vill söka i en kandidatlista</translation> <translation id="2347476388323331511">Det gick inte att synkronisera</translation> <translation id="2347991999864119449">Låt mig välja när plugin-innehåll ska köras</translation> +<translation id="2348165084656290171">Om du vill dela ljud väljer du en flik eller hela skärmen.</translation> <translation id="2350182423316644347">Startar appen ...</translation> <translation id="2350796302381711542">Vill du tillåta att <ph name="HANDLER_HOSTNAME" /> öppnar alla <ph name="PROTOCOL" />-länkar i stället för <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Språk och inmatning</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">Kanadensiskt flerspråkigt tangentbord</translation> <translation id="2478176599153288112">Mediefilsbehörigheter för <ph name="EXTENSION" /></translation> <translation id="2478830106132467213">Lås bara upp <ph name="DEVICE_TYPE" /> när din mobil är inom en armlängds avstånd.</translation> +<translation id="247949520305900375">Dela ljud</translation> <translation id="2479780645312551899">Kör alla pluginprogram den här gången</translation> <translation id="2480626392695177423">Växla mellan skiljeteckenläge med hel och halv bredd</translation> <translation id="2481332092278989943">Lägg till på hyllan</translation> @@ -1311,6 +1319,7 @@ <translation id="2889064240420137087">Öppna länk med ...</translation> <translation id="2889925978073739256">Fortsätt att blockera pluginprogram utanför sandlåda</translation> <translation id="2890624088306605051">Hämta bara synkroniserade inställningar och uppgifter</translation> +<translation id="2890678560483811744">Sidreferensen faller utanför intervallet</translation> <translation id="2893168226686371498">Standardwebbläsare</translation> <translation id="289426338439836048">Andra mobila nätverk...</translation> <translation id="2894745200702272315">Aktiverar en experimentell version av igenkänningsfunktioner för kommandoordet ”Ok Google” som är maskinvaruberoende.</translation> @@ -1339,7 +1348,6 @@ <translation id="2925966894897775835">Kalkylark</translation> <translation id="2927017729816812676">Cachelagring</translation> <translation id="2927657246008729253">Ändra...</translation> -<translation id="2928415919076124714">Dölj verktygsfältet i helskärmsläge</translation> <translation id="2928526264833629376">Fortsätt till Hangouts</translation> <translation id="2930644991850369934">Det uppstod ett problem när återställningsavbildningen laddades ned. Nätverksanslutningen avbröts.</translation> <translation id="293111069139560936">Tillåter hyllan att minimera ett fönster om användaren klickar på ett objekt på hyllan som bara har ett enda, redan aktivt fönster kopplat till sig.</translation> @@ -1463,6 +1471,7 @@ <translation id="3117812041123364382">Aktivera/inaktivera flytande virtuellt tangentbord</translation> <translation id="3118319026408854581">Hjälp för <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Otillräcklig kryptering för angiven åtgärd på: <ph name="DEVICE_NAME" />.</translation> +<translation id="3121260210578524273">Aktivera ikoner i åtgärdsknappar för webbaviseringar.</translation> <translation id="3121793941267913344">Återställ den här <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten</translation> <translation id="3122162841865761901">Experiment i utvecklarverktygen</translation> <translation id="3122464029669770682">CPU</translation> @@ -1583,7 +1592,6 @@ <translation id="3289566588497100676">Enkel symbolinmatning</translation> <translation id="3289856944988573801">Använd Ethernet eller Wi-Fi om du vill söka efter uppdateringar.</translation> <translation id="3293325348208285494">Snabbstart</translation> -<translation id="3293894718455402932"><ph name="EXTENSION" /> kan läsa och skriva bilder, video och ljud i de markerade mapparna.</translation> <translation id="3294437725009624529">Gäst</translation> <translation id="329650768420594634">Varning i paketerat tillägg</translation> <translation id="3296763833017966289">georgiska</translation> @@ -1641,6 +1649,7 @@ <translation id="3338239663705455570">Slovenskt tangentbord</translation> <translation id="3340978935015468852">inställningar</translation> <translation id="3341703758641437857">Tillåt åtkomst till webbadresser i filen</translation> +<translation id="3343813173145836998">Logga in enkelt på den här enheten</translation> <translation id="3344786168130157628">Namn på åtkomstpunkt (APN):</translation> <translation id="3345135638360864351">Det gick inte att skicka begäran om åtkomst till den här webbplatsen till <ph name="NAME" />. Försök igen.</translation> <translation id="3345886924813989455">Det gick inte att hitta någon webbläsare som stöds</translation> @@ -2120,6 +2129,7 @@ <translation id="3996912167543967198">Återställer ...</translation> <translation id="3997015411467176489">Experimentella canvas-funktioner</translation> <translation id="40027638859996362">Flytta ord</translation> +<translation id="400554499662786523">Om du vill dela ljud väljer du en flik.</translation> <translation id="4012550234655138030">Konfigurera eller hantera skrivare i <ph name="CLOUD_PRINT_NAME" />.</translation> <translation id="4014432863917027322">Vill du reparera <ph name="EXTENSION_NAME" />?</translation> <translation id="4018133169783460046">Visa <ph name="PRODUCT_NAME" /> på det här språket</translation> @@ -2222,6 +2232,7 @@ <translation id="4180788401304023883">Vill du ta bort certifikatet <ph name="CERTIFICATE_NAME" />?</translation> <translation id="418179967336296930">Ryskt fonetiskt tangentbord (YaZHert)</translation> <translation id="4181841719683918333">Språk</translation> +<translation id="4187248015940562149">Web Bluetooth aktiveras. Det innebär att webbplatser kan tillåtas att ansluta till och styra Bluetooth-enheter i din närhet.</translation> <translation id="4188026131102273494">Sökord:</translation> <translation id="4189406272289638749">Ett tillägg, <b><ph name="EXTENSION_NAME" /></b>, styr den här inställningen.</translation> <translation id="4193154014135846272">Google Dokument</translation> @@ -2278,6 +2289,7 @@ <translation id="4268025649754414643">Nyckelchiffrering</translation> <translation id="4268574628540273656">Webbadress:</translation> <translation id="4270393598798225102">Version <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Inga träffar</translation> <translation id="4274187853770964845">Synkroniseringsfel. Avbryt och starta om synkroniseringen.</translation> <translation id="4275830172053184480">Starta om enheten</translation> <translation id="4276796043975446927">Välkommen till Chromebox för möten</translation> @@ -2347,6 +2359,7 @@ <translation id="4378551569595875038">Ansluter ...</translation> <translation id="438122767399415311">Tvinga gränssnittets riktning</translation> <translation id="4381849418013903196">Kolon</translation> +<translation id="4383192539467954373">Logga in automatiskt på flera enheter</translation> <translation id="4384652540891215547">Aktivera tillägget</translation> <translation id="438503109373656455">Brunte</translation> <translation id="4387554346626014084">Aktivera synkronisering av startprogrammet för appar. Detta aktiverar även Mappar där så är möjligt (ej OS X).</translation> @@ -2364,6 +2377,7 @@ <translation id="4421932782753506458">Misse</translation> <translation id="4422347585044846479">Redigera bokmärke för den här sidan</translation> <translation id="4422428420715047158">Domän:</translation> +<translation id="4423482519432579560">&Stavningskontroll</translation> <translation id="442477792133831654">Kommunicera med enheter i närheten</translation> <translation id="4425149324548788773">Min enhet</translation> <translation id="4428582326923056538">Adobe Flash Player använder andra undantag för kameran.</translation> @@ -2378,6 +2392,7 @@ <translation id="444267095790823769">Undantag för skyddat innehåll</translation> <translation id="4443536555189480885">&Hjälp</translation> <translation id="4444304522807523469">Åtkomst till dokumentskannrar som är anslutna via USB eller i det lokala nätverket</translation> +<translation id="4445559854264555037">Kan du inte hitta enheten? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Speglat</translation> <translation id="4447465454292850432">Batteri:</translation> <translation id="4449935293120761385">Om Autofyll</translation> @@ -2636,6 +2651,7 @@ <translation id="485316830061041779">tyska</translation> <translation id="4856478137399998590">Datatjänsten har aktiverats och är klar att användas</translation> <translation id="4858913220355269194">Fotboll</translation> +<translation id="4860565041166337978">Tillåt att nedladdningar hanteras av den ansvariga för systemnedladdningar när det är lämpligt.</translation> <translation id="48607902311828362">Flygplansläge</translation> <translation id="4861833787540810454">&Spela</translation> <translation id="4862050643946421924">Enheten läggs till …</translation> @@ -2719,7 +2735,6 @@ <translation id="4977942889532008999">Bekräfta åtkomst</translation> <translation id="4982718461356080574">Dölja stängningsknappen på inaktiva flikar när de är staplade</translation> <translation id="498294082491145744">Ändra inställningarna som styr webbplatsernas tillgång till funktioner som cookies, JavaScript, pluginprogram, geografisk plats, mikrofon, kamera osv.</translation> -<translation id="4984329823325527157">API:et för Media Source</translation> <translation id="4988526792673242964">Sidor</translation> <translation id="4988792151665380515">Det gick inte att exportera den publika nyckeln.</translation> <translation id="49896407730300355">Rotera m&oturs</translation> @@ -2908,7 +2923,6 @@ <translation id="5268606875983318825">PPAPI (utanför process)</translation> <translation id="526926484727016706">Leder till att iframe nekas behörighet som standardinställning. Om du tillåter särskilda behörigheter för en iframe kan detta innebära att namnen på dessa behörigheter anges som värden för nya iframe-attribut.</translation> <translation id="5269977353971873915">Det gick inte att skriva ut dokumentet</translation> -<translation id="5270884342523754894"><ph name="EXTENSION" /> kan läsa bilder, video och ljudfiler i de markerade mapparna.</translation> <translation id="5271247532544265821">Växla mellan förenklad/traditionell kinesiska</translation> <translation id="5271549068863921519">Spara lösenord</translation> <translation id="5273628206174272911">Historiknavigering på experimentstadiet som svar på horisontell överrullning.</translation> @@ -2945,6 +2959,7 @@ <translation id="5316716239522500219">Speglar monitorer</translation> <translation id="5317780077021120954">Spara</translation> <translation id="5319782540886810524">Lettiskt tangentbord</translation> +<translation id="532247166573571973">Servern kanske inte kan nås. Försök igen senare.</translation> <translation id="5323213332664049067">Latinamerikanskt</translation> <translation id="532360961509278431">Det går inte att öppna $1: $2</translation> <translation id="5324674707192845912">Du håller på att avregistrera den här <ph name="DEVICE_TYPE" /> hos Google för att inaktivera möjligheten att lokalisera, rensa och låsa den på distans. Det här kräver omstart. Vill du fortsätta?</translation> @@ -2997,11 +3012,11 @@ <translation id="5390284375844109566">Indexerad databas</translation> <translation id="5392544185395226057">Aktivera stöd för Native Client.</translation> <translation id="5393125431335030955">Det här pluginprogrammet fungerar bara på skrivbordet.</translation> -<translation id="5393559999218790205">Inaktivera tidslinjer för sammansatta animeringar i användargränssnitt</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> på <ph name="PEPPER_PLUGIN_DOMAIN" /> vill ha åtkomst till datorn.</translation> <translation id="539755880180803351">Fyller i webbformulär med förslag från Autofyll som platshållartext.</translation> <translation id="5397578532367286026">Användning och historik för den här användaren kan granskas av den ansvarige (<ph name="MANAGER_EMAIL" />) på chrome.com.</translation> <translation id="5397794290049113714">Du</translation> +<translation id="5398572795982417028">Sidreferensen faller utanför intervallet. Gränsen är <ph name="MAXIMUM_PAGE" />.</translation> <translation id="5398824043967640339"><ph name="COUNT" /> från andra webbplatser</translation> <translation id="5399158067281117682">PIN-koderna matchar inte varandra!</translation> <translation id="5400640815024374115">TPM-chippet (Trusted Platform Module) har inaktiverats eller tagits bort.</translation> @@ -3021,7 +3036,7 @@ <translation id="5423849171846380976">Aktiverat</translation> <translation id="5425470845862293575">Aktiverar rendering av teckensnitt med det experimentella DirectWrite-systemet.</translation> <translation id="5425722269016440406">Du måste vara online för att kunna inaktivera Smart Lock eftersom den här inställningen är synkroniserad med din mobil och andra enheter. Anslut först till ett nätverk.</translation> -<translation id="5426623592374109001">Använd det gamla ineffektiva undersystemet för sammansatta animeringar i användargränssnittet.</translation> +<translation id="5425863515030416387">Logga in enkelt på flera enheter</translation> <translation id="5427459444770871191">Rotera &medurs</translation> <translation id="5428105026674456456">spanska</translation> <translation id="542872847390508405">Du surfar som gäst</translation> @@ -3046,6 +3061,7 @@ <translation id="5451646087589576080">Visa ram&info</translation> <translation id="5453029940327926427">Stäng flikar</translation> <translation id="5453632173748266363">Kyrilliskt</translation> +<translation id="5454166040603940656">med <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Ogiltigt</translation> <translation id="5457459357461771897">Läsa och ta bort foton, musik och andra media från datorn</translation> <translation id="5457599981699367932">Använd som gäst</translation> @@ -3215,7 +3231,6 @@ <translation id="5708171344853220004">Huvudnamn för Microsoft</translation> <translation id="5709885306771508267">Skaländra genom att nypa</translation> <translation id="5710406368443808765">Hoppsan! Det gick inte att lagra enhetstoken och enhets-id.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> svarar inte. Det går inte att casta.</translation> <translation id="5711983031544731014">Det går inte att låsa upp. Ange ditt lösenord.</translation> <translation id="5712966208980506909">När detta alternativ är aktiverat kan principsidan för Material Design öppnas på webbadressen chrome://md-policy.</translation> <translation id="5715711091495208045">Agent för pluginprogram: <ph name="PLUGIN_NAME" /></translation> @@ -3484,7 +3499,6 @@ <translation id="6111974609785983504">Tillåts som standard</translation> <translation id="6113134669445407638">Inaktivera Delay Agnostic AEC i WebRTC. Används om rapporterade systemfördröjningar är mycket tillförlitliga eller om andra hör ett eko från din enhet.</translation> <translation id="6116921718742659598">Ändra språk- och inmatningsinställningar</translation> -<translation id="6117536376248197233">Inaktivera tidslinjer för sammansatta animeringar i renderare.</translation> <translation id="6120205520491252677">Fäst den här sidan på startskärmen ...</translation> <translation id="6122081475643980456">Din internetanslutning kontrolleras</translation> <translation id="6122093587541546701">E-postadress (valfritt):</translation> @@ -3516,6 +3530,7 @@ <translation id="6163522313638838258">Visa alla...</translation> <translation id="6164005077879661055">Alla filer och lokala data som är kopplade till den hanterade användaren tas bort permanent när den hanterade användaren tas bort. Besökta webbplatser och inställningar för den hanterade användaren kan fortfarande vara synliga för den som hanterar användaren på <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Läs mer</translation> +<translation id="6167008112175207002">Bokmärken, historik, lösenord och andra inställningar synkroneras till ditt Google-konto så att du kan använda dem på alla enheter. Du kan ändra inställningen på <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Simulerade maskinvarufunktioner för ”OK Google”</translation> <translation id="6175314957787328458">Grafiskt användargränssnitt för Microsoft-domänen</translation> <translation id="6178664161104547336">Välj ett certifikat</translation> @@ -3719,6 +3734,7 @@ <translation id="648927581764831596">Inte tillgängligt</translation> <translation id="6490936204492416398">Installera nya från webbutiken</translation> <translation id="6492313032770352219">Storlek på disk:</translation> +<translation id="6498249116389603658">&Alla dina språk</translation> <translation id="6499143127267478107">Slår upp adress i proxyscript</translation> <translation id="6503077044568424649">Mest besökta</translation> <translation id="6503256918647795660">Schweiziskt-franskt tangentbord</translation> @@ -3760,7 +3776,6 @@ <translation id="6555432686520421228">Ta bort alla användarkonton och återställ <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten så blir den som ny.</translation> <translation id="6556866813142980365">Upprepa</translation> <translation id="6557565812667414268">Endast aktiverat för skärmar med hög upplösning</translation> -<translation id="655845594391856372">Fliken svarar inte. Det går inte att casta.</translation> <translation id="6559580823502247193">(finns redan på enheten)</translation> <translation id="6561726789132298588">retur</translation> <translation id="6562437808764959486">Extraherar återställningsavbildningen...</translation> @@ -3861,6 +3876,7 @@ <translation id="6723354935081862304">Skriv ut till Google Dokument och andra platser i molnet. <ph name="BEGIN_LINK" />Logga in<ph name="END_LINK" /> om du vill skriva ut med hjälp av Google Cloud Print.</translation> <translation id="6723661294526996303">Importera bokmärken och inställningar...</translation> <translation id="6723839937902243910">Batteri</translation> +<translation id="6725240607822645708">Kör IME i en egen tråd.</translation> <translation id="6725970970008349185">Antal kandidater som ska visas per sida</translation> <translation id="672609503628871915">Kolla nyheterna</translation> <translation id="6727005317916125192">Föregående ruta</translation> @@ -3974,7 +3990,7 @@ <translation id="6915804003454593391">Användare:</translation> <translation id="6916590542764765824">Hantera tillägg</translation> <translation id="6918340160281024199">US Workman</translation> -<translation id="6920569915859786172">Aktiverar Åtgärd från användaragent för WebFonts läses alltid in.</translation> +<translation id="6920569915859786172">Aktivera Åtgärd från användaragent för WebFonts läses alltid in.</translation> <translation id="6920989436227028121">Öppna som en vanlig flik</translation> <translation id="6922128026973287222">Spara data och bläddra snabbare med Google Databesparing. Klicka här om du vill veta mer.</translation> <translation id="6929555043669117778">Fortsätt att blockera popup-program</translation> @@ -3991,12 +4007,11 @@ <translation id="6948736568813450284">För utvecklare: använd sandlådetjänsten för anrop med API:et för Google Payments.</translation> <translation id="6949306908218145636">Spara bokmärke till öppna sidor …</translation> <translation id="695164542422037736">Om det här alternativet är aktiverat och brödtexten har ett format med fast bakgrundsbilaga kommer bakgrunden att ha sitt eget sammansatta lager.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> kommer ihåg lösenord och loggar automatiskt in dig på webbplatser på den här enheten.</translation> <translation id="6955446738988643816">Kontrollera popup</translation> <translation id="695755122858488207">Avmarkerad alternativknapp</translation> +<translation id="6960277925159781810">Logga in automatiskt på den här enheten</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">Aktivera synkronisering via mobildata</translation> -<translation id="6964308487066031935">Vill du lägga till mappar för <ph name="EXTENSION" />?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Enhet</translation> @@ -4094,7 +4109,6 @@ <translation id="7076293881109082629">Logga in</translation> <translation id="7077829361966535409">Det gick inte att läsa in inloggningssidan med de aktuella proxyinställningarna. <ph name="GAIA_RELOAD_LINK_START" />Försök logga in igen<ph name="GAIA_RELOAD_LINK_END" /> eller använd andra <ph name="PROXY_SETTINGS_LINK_START" />proxyinställningar<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Ignorerade protokollhanterare</translation> -<translation id="7079038783243627996"><ph name="EXTENSION" /> kan läsa och ta bort bilder, video och ljud i de markerade mapparna.</translation> <translation id="708060913198414444">K&opiera ljudadress</translation> <translation id="708187310695946552">Bubbelgränssnitt för att återställa sessioner</translation> <translation id="7082055294850503883">Ignorera Caps Lock och mata in gemener som standard</translation> @@ -4238,6 +4252,8 @@ <translation id="7313804056609272439">Vietnamesisk inmatningsmetod (VNI)</translation> <translation id="7314244761674113881">SOCKS-värd</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (aktuell)</translation> +<translation id="7321545336522791733">Servern kan inte nås</translation> +<translation id="7324841169865301118">Tillåter att användare väljer en flik för att dela skrivbordet.</translation> <translation id="7325437708553334317">Högkontrasttillägg</translation> <translation id="7326565110843845436">Klick med tre fingrar på styrplatta</translation> <translation id="73289266812733869">Avmarkerad</translation> @@ -4463,7 +4479,6 @@ <translation id="7650511557061837441"><ph name="TRIGGERING_EXTENSION_NAME" /> vill ta bort <ph name="EXTENSION_NAME" />.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> visas på det här språket</translation> <translation id="7654941827281939388">Kontot används redan på den här datorn.</translation> -<translation id="7655165758820095116">Med MediaSource-objektet kan mediedata skickas direkt till ett videoelement via JavaScript.</translation> <translation id="7658239707568436148">Avbryt</translation> <translation id="7659584679870740384">Du har inte behörighet att använda den här enheten. Kontakta administratören om du vill ha behörighet att logga in.</translation> <translation id="7664620655576155379">Bluetooth-enhet som inte stöds: <ph name="DEVICE_NAME" />.</translation> @@ -4594,6 +4609,7 @@ <translation id="7861215335140947162">&Nedladdade filer</translation> <translation id="7864539943188674973">Inaktivera Bluetooth</translation> <translation id="7868891395842935202">Aktiverar experimentellt ramverk för kontroll av åtkomst till API-experiment.</translation> +<translation id="7870576007982733437">Använd hanteraren för systemnedladdningar när detta är lämpligt.</translation> <translation id="7870790288828963061">Inga kioskappar med nyare version hittades. Det finns inget att uppdatera. Ta bort USB-minnet.</translation> <translation id="787150342916295244">Inläsning av kreditkort</translation> <translation id="7874357055309047713">Kör alltid på alla webbplatser</translation> @@ -4636,7 +4652,6 @@ <translation id="7918257978052780342">Registrera</translation> <translation id="7920092496846849526">Du har frågat en förälder om lov att besöka den här sidan.</translation> <translation id="7925285046818567682">Väntar på <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> kommer ihåg lösenord och loggar automatiskt in dig på webbplatser och i appar på flera enheter</translation> <translation id="7925686952655276919">Använd inte mobildata för synkronisering</translation> <translation id="7926906273904422255">Markera osäkra källor som osäkra eller som tvivelaktiga.</translation> <translation id="7928710562641958568">Mata ut enhet</translation> @@ -4698,7 +4713,6 @@ Spara nyckelfilen på ett säkert ställe. Den behövs om du ska skapa nya versioner av ditt tillägg.</translation> <translation id="799923393800005025">Kan visa</translation> <translation id="7999338963698132743">Ny aktivitetshanterare</translation> -<translation id="8000004253404706714">Använd det gamla ineffektiva undersystemet för sammansatta animeringar i renderare.</translation> <translation id="8004582292198964060">Webbläsare</translation> <translation id="8007030362289124303">Batteriet snart slut</translation> <translation id="8008356846765065031">Internetanslutningen har avbrutits. Kontrollera internetanslutningen.</translation> @@ -4827,6 +4841,7 @@ <translation id="8185331656081929126">Visa aviseringar när nya skrivare hittas i nätverket</translation> <translation id="8186609076106987817">Servern kunde inte hitta filen.</translation> <translation id="8186706823560132848">Program</translation> +<translation id="8188120771410500975">&Kontrollera stavning i textfält</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> och <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> till</translation> <translation id="8190193592390505034">Ansluter till <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Hantera dina appar, tillägg och teman</translation> @@ -5219,6 +5234,7 @@ <translation id="8765985713192161328">Hantera protokoll</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Användare</translation> +<translation id="8768367823103160496">Lås för muspekare</translation> <translation id="8769662576926275897">Kortuppgifter</translation> <translation id="8770196827482281187">Persisk inmatningsmetod (layouten ISIRI 2901)</translation> <translation id="8774934320277480003">Övre marginal</translation> @@ -5238,6 +5254,7 @@ <translation id="8795668016723474529">Lägg till ett kreditkort</translation> <translation id="8795916974678578410">Nytt fönster</translation> <translation id="8798099450830957504">Standard</translation> +<translation id="8799127529310003270">Om inställningen är aktiverad körs InputConnection-anrop på IME-tråden och istället för att behålla en redigerare för kopian talar InputConnection-anropet direkt med renderaren.</translation> <translation id="8799839487311913894">Aktivera uppdatering av lösenordet i lösenordshanteraren efter att ha skickat ett formulär för att ändra lösenord.</translation> <translation id="8800004011501252845">Visar platser för</translation> <translation id="8800420788467349919">Volym: <ph name="PRECENTAGE" /> %</translation> @@ -5263,6 +5280,7 @@ <translation id="8841142799574815336">Inaktivt synligt visningsområde.</translation> <translation id="884264119367021077">Leveransadress</translation> <translation id="8844238624737526720">Använd den nya och optimerade versionen av aktivitetshanteraren i Chrome.</translation> +<translation id="8845001906332463065">Få hjälp</translation> <translation id="8846141544112579928">Söker efter tangentbord …</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Byte av Skift-tangentens läge</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 7ce7bd7..b6893ed 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -155,7 +155,7 @@ <translation id="1208421848177517699">Unukuzi wa mfumo wa kuandika (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Seva za jina otomatiki</translation> <translation id="1215411991991485844">Programu mpya ya mandharinyuma imeongezwa</translation> -<translation id="1216954813581739968">Washa kichupo cha Kushiriki Eneo-kazi.</translation> +<translation id="1216954813581739968">Washa kichupo cha Kushiriki Eneo-Kazi.</translation> <translation id="121827551500866099">Onyesha vipakuliwa vyote...</translation> <translation id="122082903575839559">Kanuni ya Sahihi ya Cheti</translation> <translation id="1221024147024329929">PKCS #1 MD2 Na Usimbaji wa RSA</translation> @@ -292,6 +292,7 @@ <translation id="1434696352799406980">Hatua hii itaweka upya ukurasa wako unaoanza, ukurasa wa kichupo kipya, mtambo wa kutafuta na vichupo vilivyobandikwa. Pia itazima viendelezi na kufuta data ya muda kama vile vidakuzi. Alamisho, historia na manenosiri yako yaliyohifadhiwa hayatafutwa.</translation> <translation id="1434886155212424586">Ukurasa wa Mwanzo ndio ukurasa wa kichupo kipya</translation> <translation id="1435550882135542937">Uundaji upya wa upau wa vidhibiti wa viendelezi</translation> +<translation id="1436402875660227532">Kumbuka: Mipangilio hii haitumiki tena kwenye mfumo huu, lakini bado unaweza kuiangalia na kuibadilisha.</translation> <translation id="1436784010935106834">Zimeondolewa</translation> <translation id="1438632560381091872">Rejesha sauti ya vichupo</translation> <translation id="1441841714100794440">Kibodi ya Kivietnamu (Telex)</translation> @@ -1314,6 +1315,7 @@ <translation id="2889064240420137087">Fungua kiungo kwa...</translation> <translation id="2889925978073739256">Endelea kuzuia programu-jalizi zisizo kwenye sandbox</translation> <translation id="2890624088306605051">Fufua tu mipangilio na data zilizolandanishwa</translation> +<translation id="2890678560483811744">Ukurasa wa marejeleo ambao huruhusiwi kuingia</translation> <translation id="2893168226686371498">Kivinjari chaguo-msingi</translation> <translation id="289426338439836048">Mtandao mwingine wa simu...</translation> <translation id="2894745200702272315">Huwasha toleo la majaribio la vipengele vya ugunduaji wa neno tekelezi vya 'Ok Google' vinavyotegemea maunzi.</translation> @@ -1342,7 +1344,6 @@ <translation id="2925966894897775835">Majedwali</translation> <translation id="2927017729816812676">Hifadhi ya Akiba</translation> <translation id="2927657246008729253">Badilisha...</translation> -<translation id="2928415919076124714">Ficha Upau wa Vidhibiti katika Skrini Nzima</translation> <translation id="2928526264833629376">Nenda kwenye Hangouts</translation> <translation id="2930644991850369934">Kulikuwa na tatizo wakati wa kufufua picha ya upakuaji. Muunganisho wa mtandao umepotea.</translation> <translation id="293111069139560936">Huruhusu rafu ipunguze dirisha iwapo kipengee cha rafu kitabofiwa ambacho kina dirisha moja tu, ambalo tayari linafanya kazi, linalohusishwa nacho.</translation> @@ -1587,7 +1588,6 @@ <translation id="3289566588497100676">Ingizo rahisi la ishara</translation> <translation id="3289856944988573801">Ili kuangalia sasisho, tafadhali tumia Ethernet au Wi-Fi.</translation> <translation id="3293325348208285494">Kuanza kwa kasi</translation> -<translation id="3293894718455402932">" <ph name="EXTENSION" /> "kitaweza kusoma na kuandika picha, video, na faili za sauti katika folda zilizowekewa alama.</translation> <translation id="3294437725009624529">Mgeni</translation> <translation id="329650768420594634">Onyo la Kiendelezo cha Pakiti</translation> <translation id="3296763833017966289">Kijiojia</translation> @@ -1641,6 +1641,7 @@ <translation id="3338239663705455570">Kibodi ya Kislovenia</translation> <translation id="3340978935015468852">mipangilio</translation> <translation id="3341703758641437857">Ruhusu kufikia URL za faili</translation> +<translation id="3343813173145836998">Ingia katika akaunti kwa urahisi kwenye kifaa hiki</translation> <translation id="3344786168130157628">Fikia jina la sehemu:</translation> <translation id="3345135638360864351">Ombi lako la kufikia tovuti hii halikutumwa kwa <ph name="NAME" />. Tafadhali jaribu tena.</translation> <translation id="3345886924813989455">Kivinjari kinachochukuana hakikupatikana</translation> @@ -2220,7 +2221,7 @@ <translation id="4180788401304023883">Futa cheti cha CA "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">Kibodi ya Fonetiki (YaZHert) ya Kirusi</translation> <translation id="4181841719683918333">Lugha</translation> -<translation id="4187248015940562149">Huwasha Bluetooth ya Wavuti inayoweza kuruhusu tovuti kuunganisha kwenye na kudhibiti vifaa vya Bluetooth vilivyo karibu nawe.</translation> +<translation id="4187248015940562149">Huwasha Bluetooth ya Wavuti inayoweza kuruhusu tovuti kuunganisha kwenye, na kudhibiti vifaa vya Bluetooth vilivyo karibu nawe.</translation> <translation id="4188026131102273494">Neno muhimu:</translation> <translation id="4189406272289638749">Kiendelezi, <b> <ph name="EXTENSION_NAME" /> </ b>, kinadhibiti mpangilio huu.</translation> <translation id="4193154014135846272">Hati za Google</translation> @@ -2277,6 +2278,7 @@ <translation id="4268025649754414643">Usimbaji wa Ufunguo</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Toleo <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Hakuna matokeo yanayolingana</translation> <translation id="4274187853770964845">Hitilafu ya Usawazishaji: Tafadhali simamisha na uanzishe upya Usawazishaji.</translation> <translation id="4275830172053184480">Washa upya kifaa chako</translation> <translation id="4276796043975446927">Karibu Chromebox kwa mikutano</translation> @@ -2346,6 +2348,7 @@ <translation id="4378551569595875038">Inaunganisha...</translation> <translation id="438122767399415311">Lazimisha mwelekeo wa kiolesura</translation> <translation id="4381849418013903196">Nukta mbili</translation> +<translation id="4383192539467954373">Ingia katika akaunti kiotomatiki kwenye vifaa vyote</translation> <translation id="4384652540891215547">Amilisha kiendelezi</translation> <translation id="438503109373656455">Saratoga</translation> <translation id="4387554346626014084">Washa usawazisho wa Kizindua Programu. Hii pia huwasha Folda zinapopatikana (sio ya OSX).</translation> @@ -2378,6 +2381,7 @@ <translation id="444267095790823769">Maudhui yanayolindwa yasiyofuata kanuni</translation> <translation id="4443536555189480885">&Msaada</translation> <translation id="4444304522807523469">Fikia vichunguzi vya hati vilivyoambatishwa kupitia USB au kwenye mtandao wa karibu</translation> +<translation id="4445559854264555037">Je, huoni kifaa chako? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Inayoakisiwa</translation> <translation id="4447465454292850432">Betri:</translation> <translation id="4449935293120761385">Kuhusu Kujaza kiotomatiki</translation> @@ -2634,6 +2638,7 @@ <translation id="485316830061041779">Kijerumani</translation> <translation id="4856478137399998590">Huduma yako ya data ya simu ya mkononi imeamilishwa na iko tayari kutumia</translation> <translation id="4858913220355269194">Fritz</translation> +<translation id="4860565041166337978">Vipakuliwa vyote vitashughulikiwa na kidhibiti cha vipakuliwa vya mfumo ikiwa inahitajika.</translation> <translation id="48607902311828362">Hali ya ndege</translation> <translation id="4861833787540810454">&Cheza</translation> <translation id="4862050643946421924">Inaongeza kifaa...</translation> @@ -2717,7 +2722,6 @@ <translation id="4977942889532008999">Thibitisha Idhini ya kufikia</translation> <translation id="4982718461356080574">Kuficha vitufe vya kufunga kwenye vichupo visivyotumika vinapopangwa kwa rafu</translation> <translation id="498294082491145744">Badilisha mipangilio yako inayodhibiti idhini ya kufikia vipengele kama vile vidakuzi, JavaScript, programu-jalizi, eneo la kijiografia, maikrofoni, kamera n.k.</translation> -<translation id="4984329823325527157">API ya Chanzo cha Maudhui</translation> <translation id="4988526792673242964">Kurasa</translation> <translation id="4988792151665380515">Imeshindwa kuhamisha ufunguo wa umma.</translation> <translation id="49896407730300355">Zungusha kinyume saa</translation> @@ -2906,7 +2910,6 @@ <translation id="5268606875983318825">PPAPI (imemaliza mchakato)</translation> <translation id="526926484727016706">Hufanya iframe zote zinyimwe ruhusa zote kwa chaguo-msingi. Kukubali ruhusa fulani kwa ajili ya iframe kunaweza kuhusisha kuorodhesha majina ya ruhusa hizi kama thamani za vipengele vipya vya iframe.</translation> <translation id="5269977353971873915">Uchapishaji Haukufanikiwa</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" kitaweza kusoma picha, video, na faili za sauti katika folda zilizowekewa alama.</translation> <translation id="5271247532544265821">Togoa modi Iliyorahisishwa/Kichina cha Jadi</translation> <translation id="5271549068863921519">Hifadhi nenosiri</translation> <translation id="5273628206174272911">Uendeshaji wa historia ya jaribio katika kujibu utembezaji zaidi wa mlalo.</translation> @@ -2996,11 +2999,11 @@ <translation id="5390284375844109566">Hifadhidata iliyoorodheshwa</translation> <translation id="5392544185395226057">Wezesha uhimili wa Mteja Halisi.</translation> <translation id="5393125431335030955">Programu-jalizi hii inafanya kazi kwenye eneokazi pekee.</translation> -<translation id="5393559999218790205">Zima rekodi ya maeneo uliyotembelea ya uhuishaji wa Kiolesura</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> kwenye <ph name="PEPPER_PLUGIN_DOMAIN" /> inataka kufikia kompyuta yako.</translation> <translation id="539755880180803351">Ongezea maelezo fomu zilizo na utabiri wa aina ya uga Mjazo-otomatiki kama maandishi ya kishika nafasi.</translation> <translation id="5397578532367286026">Matumizi na historia ya mtumiaji huyu yanaweza kukaguliwa na msimamizi ( <ph name="MANAGER_EMAIL" /> ) kwenye chrome.com.</translation> <translation id="5397794290049113714">Wewe</translation> +<translation id="5398572795982417028">Ukurasa wa kurejelea ambao hauruhusiwi kuingia, kikomo ni <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> kutoka kwenye tovuti nyingine</translation> <translation id="5399158067281117682">PIN hazioani!</translation> <translation id="5400640815024374115">Chipu ya Mfumo wa uendeshaji unaoaminika (TPM) imelemazwa au haipo.</translation> @@ -3020,7 +3023,7 @@ <translation id="5423849171846380976">Imeamilishwa</translation> <translation id="5425470845862293575">Huwasha matumizi ya mfumo wa majaribio wa utekelezaji wa fonti ya DirectWrite.</translation> <translation id="5425722269016440406">Lazima uwe mtandaoni ili uzima mfumo wa Smart Lock kwa sababu mipangilio hii imesawazishwa kwenye simu na vifaa vyako vingine. Tafadhali unganisha kwenye mtandao kwanza.</translation> -<translation id="5426623592374109001">Tumia mifumo midogo kuingia uhuishaji kwa ajili ya uhuishaji katika Kiolesura.</translation> +<translation id="5425863515030416387">Ingia katika akaunti kwa urahisi kwenye vifaa vyote</translation> <translation id="5427459444770871191">Zungusha Kisaa</translation> <translation id="5428105026674456456">Kihispania</translation> <translation id="542872847390508405">Unavinjari kama Mgeni</translation> @@ -3215,7 +3218,6 @@ <translation id="5708171344853220004">Jina la Microsoft Principal</translation> <translation id="5709885306771508267">Kipimo cha kubana</translation> <translation id="5710406368443808765">Do! Mfumo haukufaulu kuhifadhi Kitambulisho cha kifaa na tokeni.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> imekwama. Haikuweza kutuma.</translation> <translation id="5711983031544731014">Haiwezi kufungua. Weka nenosiri lako.</translation> <translation id="5712966208980506909">Ikiwashwa, URL ya chrome://md-policy hupakia ukurasa wa sera ya Usanifu Bora.</translation> <translation id="5715711091495208045">Dalali wa Programu-jalizi: <ph name="PLUGIN_NAME" /></translation> @@ -3484,7 +3486,6 @@ <translation id="6111974609785983504">Kimeruhusiwa kama chaguo-msingi</translation> <translation id="6113134669445407638">Zima Delay Agnostic AEC katika WebRTC. Tumia ikiwa kuchelewa kwa mfumo kulikoripotiwa kunaaminika sana, au ikiwa watu wengine wanasikia mwangwi kutoka kwenye mashine yako.</translation> <translation id="6116921718742659598">Badilisha mipangilio ya lugha na uingizaji</translation> -<translation id="6117536376248197233">Zima rekodi ya maeneo uliyotembelea ya uhuishaji wa njia katika vionyeshi.</translation> <translation id="6120205520491252677">Bana ukurasa huu kwenye skirini ya Kuanza...</translation> <translation id="6122081475643980456">Muunganisho wako wa Intaneti unadhibitiwa</translation> <translation id="6122093587541546701">Barua pepe (hiari):</translation> @@ -3516,6 +3517,7 @@ <translation id="6163522313638838258">Panua yote...</translation> <translation id="6164005077879661055">Faili zote na data ya ndani zinazohusishwa na mtumiaji anayesimamiwa zitafutwa kabisa mtumiaji huyu anayesimamiwa atakapoondolewa. Tovuti zilizotembelewa na mipangilio ya mtumiaji huyu anayesimamiwa inaweza bado kuonekana na msimamizi katika <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Pata maelezo zaidi</translation> +<translation id="6167008112175207002">Alamisho, historia, manenosiri, na mipangilio yako mingine itasawazishwa kwenye Akaunti yako ya Google ili uweze kuitumia kwenye vifaa vyako vyote. Unaweza kubadilisha usawazishaji huu katika <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Vipengele vya maunzi vilivyobuniwa vya 'OK Google'</translation> <translation id="6175314957787328458">GUID ya Vikoa kutoka Microsoft</translation> <translation id="6178664161104547336">Chagua cheti</translation> @@ -3761,7 +3763,6 @@ <translation id="6555432686520421228">Ondoa akaunti zote za watumiaji na uweke upya kifaa chako cha <ph name="IDS_SHORT_PRODUCT_NAME" /> ili kiwe kama kipya.</translation> <translation id="6556866813142980365">Rudia</translation> <translation id="6557565812667414268">Imewashwa kwa maonyesho ya -DPI ya juu pekee</translation> -<translation id="655845594391856372">Kichupo kimekwama. Hakikuweza kutuma.</translation> <translation id="6559580823502247193">(tayari kwenye kifaa hiki)</translation> <translation id="6561726789132298588">ingiza</translation> <translation id="6562437808764959486">Inachopoa picha ya ufufuzi...</translation> @@ -3862,6 +3863,7 @@ <translation id="6723354935081862304">Chapisha kwenye Hati za Google na mahali pengine panapofikiwa kwenye wingu. <ph name="BEGIN_LINK" />Ingia<ph name="END_LINK" /> ili uchapishe katika Chapisho la Wingu la Google.</translation> <translation id="6723661294526996303">Ingiza alamisho na mipangilio...</translation> <translation id="6723839937902243910">Nishati</translation> +<translation id="6725240607822645708">Tumia IME kwenye mazungumzo yake.</translation> <translation id="6725970970008349185">Idadi ya wagombea ya kuonyesha kwa kila ukurasa</translation> <translation id="672609503628871915">Angalia yaliyo mapya</translation> <translation id="6727005317916125192">Dirisha lililotangulia</translation> @@ -3991,12 +3993,11 @@ <translation id="6948736568813450284">Kwa wasanidi programu: tumia huduma ya sehemu ya majaribio ya simu za API ya Google Payments.</translation> <translation id="6949306908218145636">Alamisha Kurasa Zilizowazi...</translation> <translation id="695164542422037736">Chaguo hili likiwashwa, na ikiwa kina kinatumia mtindo wa kiambatisho cha mandhari:hakibadiliki, mandhari itakuwa na safu mchanganyiko.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> hukumbuka manenosiri yako na kukuwezesha kuingia katika tovuti kiotomatiki kwenye kifaa hiki.</translation> <translation id="6955446738988643816">Kagua Dirisha Ibukizi</translation> <translation id="695755122858488207">Kitufe cha redio kilichoondolewa tiki</translation> +<translation id="6960277925159781810">Ingia katika akaunti kiotomatiki kwenye kifaa hiki</translation> <translation id="696036063053180184">Seti 3 (Hakuna kuhamisha)</translation> <translation id="696203921837389374">Washa inasawazisha kwenye data ya kifaa cha mkononi</translation> -<translation id="6964308487066031935">Ungependa kuongeza folda kwenye "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">Sawa</translation> <translation id="6965648386495488594">Lango</translation> <translation id="6965978654500191972">Kifaa</translation> @@ -4097,7 +4098,6 @@ <translation id="7076293881109082629">Unaingia katika akaunti</translation> <translation id="7077829361966535409">Ukurasa wa kuingia ulishindwa kupakiwa kutumia mipangilio ya sasa ya proksi. Tafadhali <ph name="GAIA_RELOAD_LINK_START" />jaribu tena kuingia<ph name="GAIA_RELOAD_LINK_END" />, au tumia <ph name="PROXY_SETTINGS_LINK_START" />mipangilio ya proksi<ph name="PROXY_SETTINGS_LINK_END" /> tofauti.</translation> <translation id="7077872827894353012">Vishikizi vya itifaki vilivyopuuzwa</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" kitaweza kusoma na kufuta picha, video, na faili za sauti katika folda zilizowekewa alama.</translation> <translation id="708060913198414444">Nakili anwani ya sauti</translation> <translation id="708187310695946552">Kiolesura cha kiputo cha kurejesha kipindi</translation> <translation id="7082055294850503883">Puuza hali ya CapsLock na uingiza herufi ndogo kwa chaguo-msingi</translation> @@ -4179,7 +4179,7 @@ <translation id="7214227951029819508">Ung'aavu</translation> <translation id="7219357088166514551">Tafuta <ph name="ENGINE" /> au chapa URL</translation> <translation id="7221155467930685510">$1 GB</translation> -<translation id="7221855153210829124">Onyesha arifa</translation> +<translation id="7221855153210829124">Kuonyesha arifa</translation> <translation id="7221869452894271364">Pakia ukurasa huu upya</translation> <translation id="7222232353993864120">Anwani ya barua pepe</translation> <translation id="7222245588540287464">Iwapo Kutafuta katika Muktadha kumewashwa au la</translation> @@ -4469,7 +4469,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" kingependa kuondoa"<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> inaonyeshwa katika lugha hii</translation> <translation id="7654941827281939388">Akaunti hii tayari inatumika kwenye kompyuta hii.</translation> -<translation id="7655165758820095116">Kifaa cha MediaSource huruhusu JavaScript kutuma data ya maudhui moja kwa moja kwenye kipengee cha video.</translation> <translation id="7658239707568436148">Ghairi</translation> <translation id="7659584679870740384">Huruhusiwi kukitimia kifaa hiki. Tafadhali wasiliana na msimamizi kwa ruhusa ya kuingia katika akaunti.</translation> <translation id="7664620655576155379">Kifaa cha Bluetooth kisichoweza kutumiwa: "<ph name="DEVICE_NAME" />".</translation> @@ -4600,6 +4599,7 @@ <translation id="7861215335140947162">&Vipakuzi</translation> <translation id="7864539943188674973">Lemaza Bluetooth</translation> <translation id="7868891395842935202">Huwasha Mfumo wa Majaribio wa kudhibiti ufikiaji wa majaribio ya API.</translation> +<translation id="7870576007982733437">Tumia kidhibiti cha vipakuliwa vya mfumo ikiwa kinatumika.</translation> <translation id="7870790288828963061">Hamna programu za Skrini Nzima zilizo na toleo jipya zaidi zimepatikana. Hakuna cha kusasisha. Tafadhali ondoa hifadhi ya USB.</translation> <translation id="787150342916295244">Uchanganuzi wa kadi ya malipo</translation> <translation id="7874357055309047713">Tekeleza kwenye tovuti zote kila wakati</translation> @@ -4642,7 +4642,6 @@ <translation id="7918257978052780342">Jiandikishe</translation> <translation id="7920092496846849526">Uliwauliza wazazi wako ikiwa ni sawa kuutembelea ukurasa huu.</translation> <translation id="7925285046818567682">Inasubiri <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> hukumbuka manenosiri yako na kukuwezesha kuingia katika programu na tovuti kiotomatiki kwenye vifaa vyote.</translation> <translation id="7925686952655276919">Usitumie data ya simu kwa ulinganishaji</translation> <translation id="7926906273904422255">Alamisha asili zisizo salama kama zisizo salama, au kama "mbaya".</translation> <translation id="7928710562641958568">Ondoa kifaa</translation> @@ -4705,7 +4704,6 @@ Weka faili yako ya funguo mahali salama. Utaihitaji kuunda matoleo mapya ya kiendelezi chako.</translation> <translation id="799923393800005025">Unaweza kuangalia</translation> <translation id="7999338963698132743">Kidhibiti kipya cha shughuli kwenye Chrome</translation> -<translation id="8000004253404706714">Tumia mifumo midogo kuingia uhuishaji kwa ajili ya uhuishaji katika vionyeshi.</translation> <translation id="8004582292198964060">Kivinjari</translation> <translation id="8007030362289124303">Bateria Imepungua Moto</translation> <translation id="8008356846765065031">Intaneti imekatizwa. Tafadhali kagua muunganisho wako wa intaneti.</translation> @@ -5229,6 +5227,7 @@ <translation id="8765985713192161328">Dhibiti vishikizi...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Watumiaji</translation> +<translation id="8768367823103160496">Kufuli la kielekezi cha kipanya</translation> <translation id="8769662576926275897">Maelezo ya kadi</translation> <translation id="8770196827482281187">Mbinu ya uingizaji wa Kiajemi (Mpangilio ISIRI 2901)</translation> <translation id="8774934320277480003">Pambizo la juu</translation> @@ -5248,6 +5247,7 @@ <translation id="8795668016723474529">Ongeza kadi ya malipo</translation> <translation id="8795916974678578410">Dirisha Jipya</translation> <translation id="8798099450830957504">Chaguo Msingi</translation> +<translation id="8799127529310003270">Ikiwashwa, InputConnection huwezesha utekelezaji kwenye mazungumzo ya IME, na badala ya kuweka kihariri rudufu, kila uwezeshaji wa InputConnection utawezeshwa moja kwa moja kwa kitoaji.</translation> <translation id="8799839487311913894">Washa kipengee cha kusasisha nenosiri katika kidhibiti nenosiri baada ya kuwasilisha fomu ya "badilisha nenosiri".</translation> <translation id="8800004011501252845">Printa zinazoweza kutumiwa na</translation> <translation id="8800420788467349919">Kiwango: <ph name="PRECENTAGE" />%</translation> @@ -5273,6 +5273,7 @@ <translation id="8841142799574815336">Sehemu ya kutazamia inayoonekana isiyoweza kusonga.</translation> <translation id="884264119367021077">Anwani ya kusafirisha</translation> <translation id="8844238624737526720">Tumia utekelezaji mpya na ulioboreshwa wa kidhibiti cha shughuli kwenye Chrome.</translation> +<translation id="8845001906332463065">Pata usaidizi</translation> <translation id="8846141544112579928">Inatafuta kibodi...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Ubadilishaji modi wa kitufe cha Shift</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 74442a5..015cbd38 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">இந்தப் பக்கத்தை புக்மார்க் செய்க...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> உருப்படிகளை நீக்குகிறது...</translation> <translation id="1048597748939794622">எல்லா லேயர்களுக்கும் இயக்கவும்</translation> +<translation id="1049795001945932310">&மொழி அமைப்புகள்</translation> <translation id="1049926623896334335">Word document</translation> <translation id="1054153489933238809">அசல் &படத்தைப் புதிய தாவலில் திற</translation> <translation id="1055806300943943258">புளூடூத் மற்றும் USB சாதனங்களைத் தேடுகிறது...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">ஒலிபெயர்ப்பு (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">தானியங்கி பெயர் சேவையகங்கள்</translation> <translation id="1215411991991485844">புதிய பின்புலப் பயன்பாடு சேர்க்கப்பட்டது</translation> +<translation id="1216954813581739968">தாவலில் டெஸ்க்டாப் பகிர்வை இயக்கு.</translation> <translation id="121827551500866099">அனைத்து பதிவிறக்கங்களையும் காண்பி…</translation> <translation id="122082903575839559">சான்றிதழ் கையொப்ப அல்காரிதம்</translation> <translation id="1221024147024329929">RSA குறியாக்கத்துடன் PKCS #1 MD2</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">தானியங்கு உள்நுழைவில் தோல்வி</translation> <translation id="1293556467332435079">கோப்புகள்</translation> <translation id="1294298200424241932">நம்பிக்கை அமைப்புகளைத் திருத்து:</translation> +<translation id="1295794900245526845">உள்நுழைய, <ph name="PASSWORD_MANAGER_BRAND" /> இல் சேமிக்கப்பட்ட உங்கள் கணக்கைத் தேர்வுசெய்யவும்</translation> <translation id="1297175357211070620">இலக்கு</translation> <translation id="1297922636971898492">Google இயக்ககம் இப்போது கிடைக்கவில்லை. Google இயக்ககம் இணைப்பு கிடைத்தவுடன் பதிவேற்றம் தானாகவே மறுதொடக்கம் செய்யப்படும்.</translation> <translation id="1300861494336759522">Windows டெஸ்க்டாப் தேடல் திசைதிருப்பம்</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">இது உங்கள் துவக்கப் பக்கம், புதிய தாவல் பக்கம், தேடல் இன்ஜின் மற்றும் பொருத்தப்பட்ட தாவல்கள் ஆகியவற்றை மீட்டமைக்கும். மேலும் இது எல்லா நீட்டிப்புகளை முடக்கி, குக்கீகள் போன்ற தற்காலிகத் தரவையும் அழிக்கும். உங்கள் புத்தகக்குறிகள், வரலாறு மற்றும் சேமித்த கடவுச்சொற்கள் அழிக்கப்படாது.</translation> <translation id="1434886155212424586">புதிய தாவல் பக்கமே முகப்புப் பக்கமாகும்</translation> <translation id="1435550882135542937">நீட்டிப்புக் கருவிப்பட்டியின் மறுவடிவமைப்பு</translation> +<translation id="1436402875660227532">குறிப்பு: இந்த அமைப்புகளை இனி இந்தக் கணினியில் பயன்படுத்த முடியாது, ஆனால் தொடர்ந்து அவற்றைப் பார்க்கவும் திருத்தவும் முடியும்.</translation> <translation id="1436784010935106834">அகற்றப்பட்டது</translation> <translation id="1438632560381091872">தாவல்களை இயக்கு</translation> <translation id="1441841714100794440">வியட்நாமிய விசைப்பலகை (டெலெக்ஸ்)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">விர்ச்சுவல் விசைப்பலகை ஆதரவை இயக்கு.</translation> <translation id="1474079335130556426">புஷ் APIக்கான பின்னணிப் பயன்முறையை இயக்கும். இது கடைசி சாளரம் மூடப்பட்ட பிறகும் Chromeஐத் தொடர்ந்து இயங்க அனுமதிக்கும், புஷ் APIக்கு தேவைப்பட்டால் OS தொடங்கும் போது இயங்கச் செய்யும்.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" ஏற்றப்படவில்லை. உங்கள் Google இயக்ககத்தில் போதுமான காலியிடம் இல்லை.</translation> +<translation id="1476607407192946488">&மொழி அமைப்புகள்</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />சர்வபுலத்திலிருந்து<ph name="END_LINK" /> தேடும் போது பயன்படுத்தப்படும் தேடு பொறியை அமைக்கலாம்.</translation> <translation id="1477301030751268706">அடையாள API இன் டோக்கன் தேக்ககம்</translation> <translation id="1478340334823509079">விவரங்கள்: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">உங்கள் கணினியில் பணியாற்றாத நேட்டிவ் க்ளையன்ட் பயன்பாட்டை இந்தப் பக்கம் பயன்படுத்துகிறது.</translation> <translation id="1965328510789761112">தனிப்பட்ட நினைவகம்</translation> <translation id="1965624977906726414">எந்தச் சிறப்பு அனுமதிகளும் இல்லை.</translation> +<translation id="1968720524450620475">இணைய அறிவிப்புகளுக்கான செயல் ஐகான்களை இயக்கு.</translation> <translation id="1970746430676306437">பக்கத்தின் &தகவலைக் காட்டு</translation> <translation id="197288927597451399">வைத்திரு</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> பதிவிறக்கம் தோல்வியடைந்தது.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">நபர் பட்டியலைப் பக்கமாக்க - மற்றும் = விசைகளைப் பயன்படுத்துக</translation> <translation id="2347476388323331511">ஒத்திசைக்க முடியவில்லை</translation> <translation id="2347991999864119449">செருகுநிரல் உள்ளடக்கத்தை எப்போது இயக்க வேண்டும் என்பதைத் தேர்வுசெய்ய என்னை அனுமதி</translation> +<translation id="2348165084656290171">ஆடியோவைப் பகிர, ஒரு தாவல் அல்லது முழுத் திரையைத் தேர்ந்தெடுக்கவும்.</translation> <translation id="2350182423316644347">பயன்பாட்டை தொடங்குகிறது...</translation> <translation id="2350796302381711542">எல்லா <ph name="PROTOCOL" /> இணைப்புகளையும் திறக்க, <ph name="REPLACED_HANDLER_TITLE" /> க்குப் பதிலாக <ph name="HANDLER_HOSTNAME" /> ஐ அனுமதிக்கவா?</translation> <translation id="2351266942280602854">மொழியும் உள்ளீடும்</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">கனடியன் பன்மொழி விசைப்பலகை</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" க்கான மீடியா-கோப்பு அனுமதிகள்</translation> <translation id="2478830106132467213">உங்கள் ஃபோன் கையால் தொடக்கூடிய தொலைவில் இருக்கும்போது மட்டும் <ph name="DEVICE_TYPE" />ஐத் திறக்கவும்.</translation> +<translation id="247949520305900375">ஆடியோவைப் பகிர்</translation> <translation id="2479780645312551899">இந்த முறை எல்லா செருகுநிரல்களையும் இயக்கு</translation> <translation id="2480626392695177423">முழு/அரை அகல நிறுத்தற்குறிப் பயன்முறையில் நிலைமாற்று</translation> <translation id="2481332092278989943">ஷெல்ஃபில் சேர்</translation> @@ -1310,6 +1318,7 @@ <translation id="2889064240420137087">இதைக் கொண்டு இணைப்பைத் திற...</translation> <translation id="2889925978073739256">சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல்களைத் தொடர்ந்து தடு</translation> <translation id="2890624088306605051">ஒத்திசைவு அமைப்புகளையும், தரவையும் மட்டும் மீட்டெடு</translation> +<translation id="2890678560483811744">பக்க வரம்பை மீறிவிட்டது</translation> <translation id="2893168226686371498">இயல்புநிலை உலாவி</translation> <translation id="289426338439836048">பிற மொபைல் பிணையம்...</translation> <translation id="2894745200702272315">வன்பொருள் சார்பு கொண்ட 'Ok Google' ஹாட்வேர்டு கண்டறிதல் அம்சங்களின் சோதனைப் பதிப்பை இயக்குகிறது.</translation> @@ -1338,7 +1347,6 @@ <translation id="2925966894897775835">தாள்கள்</translation> <translation id="2927017729816812676">தற்காலிகச் சேமிப்பிடம்</translation> <translation id="2927657246008729253">மாற்று...</translation> -<translation id="2928415919076124714">முழுத் திரையில் கருவிப்பட்டியை மறை</translation> <translation id="2928526264833629376">Hangouts இல் தொடரவும்</translation> <translation id="2930644991850369934">மீட்டெடுப்பதற்கான படத்தைப் பதிவிறக்கும்போது சிக்கல் ஏற்பட்டது. பிணைய இணைப்பு இழக்கப்பட்டது.</translation> <translation id="293111069139560936">ஏற்கனவே செயலில் உள்ள ஒரே ஒரு சாளரத்தைக் கொண்ட ஷெல்ஃப் உருப்படியின் மீது கிளிக் செய்தால், சாளரத்தைச் சிறிதாக்குவதற்கு, ஷெல்ஃபை அனுமதிக்கும்.</translation> @@ -1462,6 +1470,7 @@ <translation id="3117812041123364382">மிதக்கும் விர்ச்சுவல் விசைப்பலகையை இயக்கும்/முடக்கும்.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> உதவி</translation> <translation id="3120430004221004537">குறிப்பிட்ட செயல்பாட்டுக்குப் போதுமான முறைமையாக்கம் இல்லாத சாதனம்: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">இணைய அறிவிப்புகளுக்கான செயல் பொத்தான்களில் ஐகான்களை இயக்கவும்.</translation> <translation id="3121793941267913344">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தை மீட்டமைக்கவும்</translation> <translation id="3122162841865761901">டெவெலப்பர் கருவிகளின் பரிசோதனைகள்</translation> <translation id="3122464029669770682">CPU</translation> @@ -1582,7 +1591,6 @@ <translation id="3289566588497100676">எளிய சின்ன உள்ளீடு</translation> <translation id="3289856944988573801">புதுப்பிப்புகளைப் பார்க்க, ஈத்தர்நெட் அல்லது வைஃபை ஐப் பயன்படுத்தவும்.</translation> <translation id="3293325348208285494">வேகமான தொடக்கம்</translation> -<translation id="3293894718455402932">தேர்ந்தெடுக்கப்பட்ட கோப்புறைகளில் உள்ள படங்கள், வீடியோ மற்றும் ஒலி கோப்புகளை "<ph name="EXTENSION" />" ஆல் படிக்கவும், எழுதவும் முடியும்.</translation> <translation id="3294437725009624529">விருந்தினர்</translation> <translation id="329650768420594634">தொகுப்பு நீட்டிப்பு எச்சரிக்கை</translation> <translation id="3296763833017966289">ஜார்ஜியன்</translation> @@ -1639,6 +1647,7 @@ <translation id="3338239663705455570">ஸ்லோவேனியன் விசைப்பலகை</translation> <translation id="3340978935015468852">அமைப்புகள்</translation> <translation id="3341703758641437857">கோப்பு URLகளுக்கு அணுகலை அனுமதி</translation> +<translation id="3343813173145836998">இந்தச் சாதனத்தில் எளிதாக உள்நுழையவும்</translation> <translation id="3344786168130157628">அணுகல் புள்ளியின் பெயர்:</translation> <translation id="3345135638360864351">இந்தத் தளத்தை அணுகுவதற்கான கோரிக்கையை <ph name="NAME" />க்கு அனுப்ப முடியவில்லை. மீண்டும் முயற்சிக்கவும்.</translation> <translation id="3345886924813989455">ஆதரிக்கின்ற உலாவி கிடைக்கவில்லை</translation> @@ -2118,6 +2127,7 @@ <translation id="3996912167543967198">மீட்டமைக்கிறது...</translation> <translation id="3997015411467176489">பரிசோதனைக்குரிய கேன்வாஸ் அம்சங்கள்</translation> <translation id="40027638859996362">சொல் நகர்த்தல்</translation> +<translation id="400554499662786523">ஆடியோவைப் பகிர, ஒரு தாவலைத் தேர்ந்தெடுக்கவும்.</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" /> இல் பிரிண்டர்களை அமைக்கவும் அல்லது நிர்வகிக்கவும்.</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />"ஐப் புதுப்பிக்கவா?</translation> <translation id="4018133169783460046">இந்த மொழியில் <ph name="PRODUCT_NAME" /> ஐக் காண்பி</translation> @@ -2220,6 +2230,7 @@ <translation id="4180788401304023883">CA சான்றிதழ் "<ph name="CERTIFICATE_NAME" />" ஐ நீக்கவா?</translation> <translation id="418179967336296930">ரஷ்யன் ஒலிபெயர்ப்பு (YaZHert) விசைப்பலகை</translation> <translation id="4181841719683918333">மொழிகள்</translation> +<translation id="4187248015940562149">உங்களைச் சுற்றியுள்ள புளூடூத் சாதனங்களுடன் இணைக்கவும் அவற்றைக் கட்டுப்படுத்தவும் இணையதளங்களை அனுமதிக்கக்கூடிய இணைய புளூடூத்தை இயக்கும்.</translation> <translation id="4188026131102273494">திறவுச்சொல்:</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> என்ற நீட்டிப்பு, இந்த அமைப்பைக் கட்டுப்படுத்துகிறது.</translation> <translation id="4193154014135846272">Google ஆவணம்</translation> @@ -2276,6 +2287,7 @@ <translation id="4268025649754414643">விசை மாற்றம்</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">பதிப்பு <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">பொருத்தங்கள் இல்லை</translation> <translation id="4274187853770964845">ஒத்திசைவுப் பிழை: ஒத்திசைவை நிறுத்திவிட்டு மீண்டும் தொடங்குக.</translation> <translation id="4275830172053184480">உங்கள் சாதனத்தை மீண்டும் தொடங்கவும்</translation> <translation id="4276796043975446927">சந்திப்புகளுக்கான Chromeboxக்கு வரவேற்கிறோம்</translation> @@ -2345,6 +2357,7 @@ <translation id="4378551569595875038">இணைக்கிறது...</translation> <translation id="438122767399415311">UI திசையை மாற்று</translation> <translation id="4381849418013903196">முக்காற்புள்ளி</translation> +<translation id="4383192539467954373">சாதனங்களில் தானாகவே உள்நுழையவும்</translation> <translation id="4384652540891215547">நீட்டிப்பைச் செயல்படுத்து</translation> <translation id="438503109373656455">சரடோகா</translation> <translation id="4387554346626014084">பயன்பாட்டுத் துவக்கியின் ஒத்திசைவை இயக்கவும். மேலும் இது கோப்புறைகள் இருக்கும் (OSX அல்லாத) இடங்களிலெல்லாம் அவற்றை இயக்குகிறது.</translation> @@ -2362,6 +2375,7 @@ <translation id="4421932782753506458">ஃபளஃபி</translation> <translation id="4422347585044846479">இந்தப் பக்கத்திற்கான புக்மார்க்ஸைத் திருத்து</translation> <translation id="4422428420715047158">DOMAIN:</translation> +<translation id="4423482519432579560">&பிழைதிருத்தம்</translation> <translation id="442477792133831654">அருகிலுள்ள சாதனங்களுடன் தொடர்புகொள்ளவும்</translation> <translation id="4425149324548788773">எனது இயக்ககம்</translation> <translation id="4428582326923056538">Adobe Flash Player கேமரா விதிவிலக்குகள் வித்தியாசமானவை.</translation> @@ -2376,6 +2390,7 @@ <translation id="444267095790823769">பாதுகாக்கப்பட்ட உள்ளடக்க விதிவிலக்குகள்</translation> <translation id="4443536555189480885">&Help</translation> <translation id="4444304522807523469">USB அல்லது பிற அக நெட்வொர்க் மூலம் இணைக்கப்பட்ட ஆவண ஸ்கேனர்களை அணுகுதல்</translation> +<translation id="4445559854264555037">உங்கள் சாதனம் காட்டப்படவில்லையா? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">பிரதிபலிக்கப்பட்டது</translation> <translation id="4447465454292850432">பேட்டரி:</translation> <translation id="4449935293120761385">தானியங்குநிரப்பியைப் பற்றி</translation> @@ -2631,6 +2646,7 @@ <translation id="485316830061041779">ஜெர்மன்</translation> <translation id="4856478137399998590">உங்கள் மொபைல் தரவு சேவை செயல்படுத்தப்பட்டது மற்றும் பயன்படுத்தத் தயாராக உள்ளது</translation> <translation id="4858913220355269194">ஃபிரிட்ஸ்</translation> +<translation id="4860565041166337978">பொருத்தமானபோது, பதிவிறக்கங்களை கணினி பதிவிறக்க நிர்வாகி மூலம் கையாள அனுமதிக்கும்.</translation> <translation id="48607902311828362">விமான பயன்முறை</translation> <translation id="4861833787540810454">&இயக்கு</translation> <translation id="4862050643946421924">சாதனத்தைச் சேர்க்கிறது...</translation> @@ -2714,7 +2730,6 @@ <translation id="4977942889532008999">அணுகலை உறுதிசெய்</translation> <translation id="4982718461356080574">பயன்படுத்தாத தாவல்கள் அடுக்கடுக்காக இருக்கும் போது, அவற்றில் மூடு பொத்தான்களை மறைத்தல்</translation> <translation id="498294082491145744">குக்கீகள், JavaScript, செருகுநிரல்கள், புவிஇருப்பிடம், மைக்ரோஃபோன் கேமரா போன்ற இணையதளத்தின் அம்சங்களுக்கான அணுகலைக் கட்டுப்படுத்தும் அமைப்புகளை மாற்றலாம்</translation> -<translation id="4984329823325527157">மீடியா மூல API</translation> <translation id="4988526792673242964">பக்கங்கள்</translation> <translation id="4988792151665380515">பொது விசையை ஏற்றுமதி செய்வதில் தோல்வியடைந்தது.</translation> <translation id="49896407730300355">இ&டஞ்சுழியாகச் சுற்று</translation> @@ -2901,7 +2916,6 @@ <translation id="5268606875983318825">PPAPI (செயல்படவில்லை)</translation> <translation id="526926484727016706">இயல்பாக எல்லா iframes இலும் எல்லா அனுமதிகளையும் மறுக்கும்படி செய்யும். ஒரு iframeக்கு குறிப்பிட்ட அனுமதிகளை அளிப்பதால், இந்த அனுமதிகளின் பெயர்கள் புதிய iframe பண்புக்கூறுகளின் மதிப்புகளாகப் பட்டியலிடப்படலாம்.</translation> <translation id="5269977353971873915">அச்சிடுதல் தோல்வி</translation> -<translation id="5270884342523754894">சரிபார்க்கப்பட்ட கோப்புறைகளில் உள்ள படங்கள், வீடியோ மற்றும் ஒலி கோப்புகளை "<ph name="EXTENSION" />" ஆல் படிக்க முடியும்.</translation> <translation id="5271247532544265821">எளிமையாக்கப்பட்ட/பாரம்பரிய சீனப் பயன்முறைகளுக்கு இடையே மாற்றுக</translation> <translation id="5271549068863921519">கடவுச்சொல்லைச் சேமி</translation> <translation id="5273628206174272911">கிடைமட்ட மிகைஉருட்டலுக்கான, பரிசோதனைக்குரிய வரலாற்றை வழிசெலுத்து.</translation> @@ -2938,6 +2952,7 @@ <translation id="5316716239522500219">மானிட்டர்களைப் பிரதிபலி</translation> <translation id="5317780077021120954">சேமி</translation> <translation id="5319782540886810524">லத்வியன் விசைப்பலகை</translation> +<translation id="532247166573571973">சேவையகத்தைத் தொடர்புகொள்ள முடியாதிருக்கலாம். மீண்டும் முயலவும்.</translation> <translation id="5323213332664049067">லத்தீன் அமெரிக்கன்</translation> <translation id="532360961509278431">"$1" ஐத் திறக்க முடியவில்லை: $2</translation> <translation id="5324674707192845912">தொலைநிலையிலிருந்து கண்டறிதல், தகவலை அழித்தல், பூட்டுதல் ஆகிய வசதிகளை, சாதனத்தில் முடக்க, இந்த <ph name="DEVICE_TYPE" />ஐ Google இல் பதிவுநீக்கப் போகிறீர்கள். இதற்குச் சாதனத்தை மறுதொடக்கம் செய்ய வேண்டியதிருக்கும். தொடர விரும்புகிறீர்களா?</translation> @@ -2990,11 +3005,11 @@ <translation id="5390284375844109566">அட்டவணைப்படுத்திய தரவுத்தளம்</translation> <translation id="5392544185395226057">நேட்டிவ் கிளையண்ட்டிற்கான ஆதரவைச் செயல்படுத்தலாம்.</translation> <translation id="5393125431335030955">இந்தச் செருகுநிரலானது டெஸ்க்டாப்பில் மட்டுமே வேலைசெய்யும்.</translation> -<translation id="5393559999218790205">UI கம்போசிட்டர் அனிமேஷன் காலப்பதிவுகளை முடக்கு</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> இல் உள்ள <ph name="PEPPER_PLUGIN_NAME" /> உங்கள் கணினியை அணுக விரும்புகிறது.</translation> <translation id="539755880180803351">தன்னிரப்பி புல வகை முன்கணிப்புகளுடன், வலைப் படிவங்களை ஒதுக்கிட உரையாகக் குறிக்கிறது.</translation> <translation id="5397578532367286026">இந்தப் பயனரின் பயன்பாடு மற்றும் வரலாறு chrome.com இன் நிர்வாகியால் (<ph name="MANAGER_EMAIL" />) மதிப்பாய்வு செய்யப்படும்.</translation> <translation id="5397794290049113714">நீங்கள்</translation> +<translation id="5398572795982417028">பக்க வரம்பை மீறிவிட்டது, அதிகபட்ச வரம்பு <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339">பிற தளங்களிலிருந்து <ph name="COUNT" /></translation> <translation id="5399158067281117682">பின்கள் பொருந்தவில்லை!</translation> <translation id="5400640815024374115">Trusted Platform Module (TPM) சிப் முடக்கப்பட்டுள்ளது அல்லது இல்லை.</translation> @@ -3014,7 +3029,7 @@ <translation id="5423849171846380976">செயலாக்கப்பட்டது</translation> <translation id="5425470845862293575">சோதனை முறையிலான DirectWrite எழுத்துரு ஒழுங்கமைவு அமைப்பைப் பயன்படுத்துவதை இயக்குகிறது.</translation> <translation id="5425722269016440406">இந்த அமைப்பு உங்கள் மொபைல் மற்றும் பிற சாதனங்களில் ஒத்திசைக்கப்பட்டுள்ளதால், Smart Lock ஐ முடக்க ஆன்லைனில் இருப்பது அவசியம். முதலில் நெட்வொர்க்குடன் இணைக்கவும்.</translation> -<translation id="5426623592374109001">UI இல் தொகுக்கப்பட்ட அனிமேஷன்களுக்கு பழைய ஊடுருவும் அனிமேஷன் துணை அமைப்பைப் பயன்படுத்தும்.</translation> +<translation id="5425863515030416387">சாதனங்களில் எளிதில் உள்நுழையவும்</translation> <translation id="5427459444770871191">&வலஞ்சுழியாகச் சுற்று</translation> <translation id="5428105026674456456">ஸ்பானிஷ்</translation> <translation id="542872847390508405">விருந்தினராக உலாவுகிறீர்கள்</translation> @@ -3039,6 +3054,7 @@ <translation id="5451646087589576080">சட்டக &தகவலைக் காண்க</translation> <translation id="5453029940327926427">தாவல்களை மூடுக</translation> <translation id="5453632173748266363">சிரில்லிக்</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> உடன்</translation> <translation id="5457113250005438886">தவறானது</translation> <translation id="5457459357461771897">உங்கள் கணினியிலிருந்து படங்கள், இசை மற்றும் பிற மீடியாவை படிக்கலாம் மற்றும் நீக்கலாம்</translation> <translation id="5457599981699367932">விருந்தினராக உலாவுங்கள்</translation> @@ -3209,7 +3225,6 @@ <translation id="5708171344853220004">Microsoft Principal பெயர்</translation> <translation id="5709885306771508267">பின்ச் அளவுகோல்</translation> <translation id="5710406368443808765">அச்சச்சோ! சாதன டோக்கனையும் ஐடியையும் சேமிப்பதில் முறைமை தோல்வியுற்றது.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> பதிலளிக்கவில்லை. அனுப்ப முடியவில்லை.</translation> <translation id="5711983031544731014">திறக்க முடியவில்லை. கடவுச்சொல்லை உள்ளிடவும்.</translation> <translation id="5712966208980506909">இயக்கப்பட்டால், chrome://md-policy URL மெட்டீரியல் வடிவக் கொள்கைப் பக்கத்தை ஏற்றும்.</translation> <translation id="5715711091495208045">செருகுநிரல் புரோக்கர்: <ph name="PLUGIN_NAME" /></translation> @@ -3476,7 +3491,6 @@ <translation id="6111974609785983504">இயல்புநிலையில் அனுமதித்தவை</translation> <translation id="6113134669445407638">WebRTC இல் டிலே அக்னாஸ்டிக் AECஐ முடக்கும். தொடர்புகொள்ளும் முறைமை தாமதங்கள் மிகவும் நம்பகமானதாக இருந்தாலோ, உங்கள் கணினியிலிருந்து பிறர் எதிரொலியைக் கேட்டாலோ மட்டும் இதைப் பயன்படுத்தும்.</translation> <translation id="6116921718742659598">மொழி மற்றும் உள்ளீட்டு அமைப்புகளை மாற்றவும்</translation> -<translation id="6117536376248197233">வழங்கிகளில் கம்போசிட்டர் அனிமேஷன் காலப்பதிவுகளை முடக்கு</translation> <translation id="6120205520491252677">தொடக்கத் திரையில் இந்தப் பக்கத்தைப் பொருத்து...</translation> <translation id="6122081475643980456">உங்கள் இணைய இணைப்பு கட்டுப்படுத்தப்படுகிறது</translation> <translation id="6122093587541546701">மின்னஞ்சல் (விரும்பினால்):</translation> @@ -3508,6 +3522,7 @@ <translation id="6163522313638838258">அனைத்தையும் விரி...</translation> <translation id="6164005077879661055">இந்தக் கண்காணிக்கப்படும் பயனர் அகற்றப்பட்டவுடன் கண்காணிக்கப்படும் பயனருடன் தொடர்புடைய எல்லா கோப்புகளும், அகத் தரவும் நிரந்தரமாக நீக்கப்படும். இந்தக் கண்காணிக்கப்படும் பயனர் பார்வையிட்ட இணையதளங்களையும் அமைப்புகளையும் <ph name="MANAGEMENT_URL" /> இல் இன்னும் நிர்வாகியால் பார்க்க முடியும்.</translation> <translation id="6165508094623778733">மேலும் அறிக</translation> +<translation id="6167008112175207002">புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளை உங்கள் சாதனங்கள் எல்லாவற்றிலும் பயன்படுத்தும்படி அவை உங்கள் Google கணக்குடன் ஒத்திசைக்கப்படும். நீங்கள் இதை <ph name="BEGIN_LINK" /> இல் மாற்றலாம்</translation> <translation id="6171550060231646388">ஒத்தியங்கும் வன்பொருளின் 'Ok Google' அம்சங்கள்</translation> <translation id="6175314957787328458">Microsoft Domain GUID</translation> <translation id="6178664161104547336">ஒரு சான்றிதழைத் தேர்ந்தெடு</translation> @@ -3711,6 +3726,7 @@ <translation id="648927581764831596">எதுவும் இல்லை</translation> <translation id="6490936204492416398">இணைய அங்காடியிலிருந்து புதிதாக நிறுவு</translation> <translation id="6492313032770352219">வட்டில் உள்ள அளவு:</translation> +<translation id="6498249116389603658">&உங்கள் எல்லா மொழிகளும்</translation> <translation id="6499143127267478107">ப்ராக்ஸி ஸ்கிரிப்டில் ஹோஸ்டைக் கண்டறிகிறது...</translation> <translation id="6503077044568424649">அதிகமாகப் பார்வையிடப்பட்டது</translation> <translation id="6503256918647795660">ஸ்விஸ் ஃபிரெஞ்ச் விசைப்பலகை</translation> @@ -3752,7 +3768,6 @@ <translation id="6555432686520421228">எல்லா பயனர் கணக்குகளையும் அகற்றிவிட்டு, புதியது போன்று உங்கள் <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தை மீட்டமைக்கவும்.</translation> <translation id="6556866813142980365">மீண்டும் செய்</translation> <translation id="6557565812667414268">உயர்-DPI காட்சிகளுக்கு மட்டும் இயக்கப்பட்டது</translation> -<translation id="655845594391856372">தாவல் பதிலளிக்கவில்லை. அனுப்ப முடியவில்லை.</translation> <translation id="6559580823502247193">(ஏற்கனவே இந்த சாதனத்தில் இருக்கிறார்)</translation> <translation id="6561726789132298588">எண்டர்</translation> <translation id="6562437808764959486">மீட்டெடுத்தல் படிமத்தைப் பிரித்தெடுக்கிறது...</translation> @@ -3853,6 +3868,7 @@ <translation id="6723354935081862304">Google டாக்ஸ் மற்றும் பிற மேகக்கணி இலக்குகளுக்கு அச்சிடுக. Google மேகக்கணி அச்சில் அச்சிடுவதற்கு <ph name="BEGIN_LINK" />உள் நுழைக<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">புக்மார்க்ஸ் மற்றும் அமைப்புகளை இறக்குமதி செய்க...</translation> <translation id="6723839937902243910">ஆற்றல்</translation> +<translation id="6725240607822645708">IMEஐ அதன் தொடரிழையிலேயே இயக்கவும்.</translation> <translation id="6725970970008349185">ஒவ்வொரு பக்கத்திலும் காண்பிப்பதற்கான பிரதிநிதிகளின் எண்ணிக்கை</translation> <translation id="672609503628871915">புதியதைப் பார்க்கவும்</translation> <translation id="6727005317916125192">முந்தைய பலகம்</translation> @@ -3983,12 +3999,11 @@ <translation id="6948736568813450284">டெவெலப்பர்களுக்கு: Google Payments API அழைப்புகளுக்கான சாண்ட்பாக்ஸ் சேவையைப் பயன்படுத்தவும்.</translation> <translation id="6949306908218145636">திறந்திருக்கும் பக்கங்களைப் புக்மார்க் செய்...</translation> <translation id="695164542422037736">இந்த விருப்பம் செயலாக்கப்பட்டிருந்தால், அங்கமானது பின்புல-இணைப்பு:பொருத்தம் என்பதாக வடிவமைக்கப்பட்டிருந்தால், பின்புலமானது தொகுக்கப்பட்ட அடுக்கை சொந்தமாகக் கொண்டிருக்கும்.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> உங்கள் கடவுச்சொற்களை நினைவில் வைத்திருந்து, இந்தச் சாதனத்தில் நீங்கள் செல்லும் தளங்களில் உங்களைத் தானாக உள்நுழையச் செய்யும்.</translation> <translation id="6955446738988643816">பாப்அப் கண்காணிப்பு</translation> <translation id="695755122858488207">தேர்வுசெய்யப்படாத ரேடியோ பொத்தான்</translation> +<translation id="6960277925159781810">இந்தச் சாதனத்தில் தானாகவே உள்நுழையவும்</translation> <translation id="696036063053180184">3 செட் (ஷிஃப்ட் இல்லை)</translation> <translation id="696203921837389374">மொபைல் தரவுடன் ஒத்திசை</translation> -<translation id="6964308487066031935">"<ph name="EXTENSION" />" இல் கோப்புறைகளைச் சேர்க்கவா?</translation> <translation id="6965382102122355670">சரி</translation> <translation id="6965648386495488594">போர்ட்</translation> <translation id="6965978654500191972">சாதனம்</translation> @@ -4086,7 +4101,6 @@ <translation id="7076293881109082629">உள்நுழைகிறீர்கள்</translation> <translation id="7077829361966535409">தற்போதைய பிராக்ஸி அமைப்புகளைப் பயன்படுத்தி உள்நுழைவுப் பக்கத்தை ஏற்றுவது தோல்வியடைந்தது. <ph name="GAIA_RELOAD_LINK_START" />மீண்டும் உள்நுழைய முயற்சிக்கவும்<ph name="GAIA_RELOAD_LINK_END" /> அல்லது வேறொரு <ph name="PROXY_SETTINGS_LINK_START" />பிராக்ஸி அமைப்புகளைப்<ph name="PROXY_SETTINGS_LINK_END" /> பயன்படுத்தவும்.</translation> <translation id="7077872827894353012">புறக்கணிக்கப்பட்ட நெறிமுறை ஹேண்ட்லர்கள்</translation> -<translation id="7079038783243627996">தேர்ந்தெடுக்கப்பட்ட கோப்புறைகளில் உள்ள படங்கள், வீடியோ மற்றும் ஒலி கோப்புகளை "<ph name="EXTENSION" />" ஆல் படிக்கவும், நீக்கவும் முடியும்.</translation> <translation id="708060913198414444">ஆடியோ முகவரியை ந&கலெடு</translation> <translation id="708187310695946552">அமர்வு மீட்டமைவு குமிழி UI</translation> <translation id="7082055294850503883">CapsLock நிலையைப் புறக்கணித்து, இயல்புநிலையாக சிற்றெழுத்தை உள்ளிடு</translation> @@ -4230,6 +4244,8 @@ <translation id="7313804056609272439">வியட்நாமிய உள்ளீட்டு முறை (VNI)</translation> <translation id="7314244761674113881">சாக்ஸ் ஹோஸ்ட்</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (நடப்பு)</translation> +<translation id="7321545336522791733">சேவையகத்தைத் தொடர்புகொள்ள முடியவில்லை</translation> +<translation id="7324841169865301118">டெஸ்க்டாப் பகிர்வுக்கு ஒரு தாவலைத் தேர்வுசெய்ய பயனருக்கு உதவுகிறது</translation> <translation id="7325437708553334317">உயர் நிறமாறுபாடு நீட்டிப்பு</translation> <translation id="7326565110843845436">டச்பேட் மூன்று-விரல்-கிளிக்</translation> <translation id="73289266812733869">தேர்வுநீக்கப்பட்டது</translation> @@ -4448,7 +4464,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />", "<ph name="EXTENSION_NAME" />" ஐ அகற்ற விரும்புகிறது.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> இந்த மொழியில் காண்பிக்கப்படுகிறது</translation> <translation id="7654941827281939388">இந்தக் கணக்கு ஏற்கனவே இந்தக் கணினியில் பயன்படுத்தப்படுகிறது.</translation> -<translation id="7655165758820095116">MediaSource பொருளானது வீடியோ கூறுக்கு நேரடியாக மீடியா தரவை அனுப்ப JavaScriptஐ அனுமதிக்கும்.</translation> <translation id="7658239707568436148">ரத்து செய்</translation> <translation id="7659584679870740384">இந்தச் சாதனத்தைப் பயன்படுத்த உங்களுக்கு அங்கீகாரம் இல்லை. உள்நுழைவு அனுமதியைப் பெற, நிர்வாகியைத் தொடர்பு கொள்ளவும்.</translation> <translation id="7664620655576155379">ஆதரிக்கப்படாத புளூடூத் சாதனம்: "<ph name="DEVICE_NAME" />".</translation> @@ -4579,6 +4594,7 @@ <translation id="7861215335140947162">&பதிவிறக்கங்கள்</translation> <translation id="7864539943188674973">புளூடூத்தை முடக்கு</translation> <translation id="7868891395842935202">API பரிசோதனைகளுக்கான கட்டுப்பாட்டு அணுகலுக்கு பரிசோதனைக் கட்டமைப்பை இயக்கும்.</translation> +<translation id="7870576007982733437">பொருத்தமானபோது, கணினி பதிவிறக்க நிர்வாகியைப் பயன்படுத்தவும்</translation> <translation id="7870790288828963061">புதிய பதிப்பு கொண்ட கியாஸ்க் பயன்பாடுகள் எதுவும் காணப்படவில்லை. புதுப்பிக்க எதுவுமில்லை. USB சாதனத்தை அகற்றவும்.</translation> <translation id="787150342916295244">கிரெடிட் கார்டு ஸ்கேனிங்</translation> <translation id="7874357055309047713">எப்போதும் எல்லா தளங்களிலும் இயக்கு</translation> @@ -4621,7 +4637,6 @@ <translation id="7918257978052780342">பதிவுபெறுக</translation> <translation id="7920092496846849526">இந்தப் பக்கத்தைப் பார்வையிடலாமா என, நீங்கள் பெற்றோர்களிடம் கேட்டுள்ளீர்கள்.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> க்காக காத்திருக்கிறது...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> உங்கள் கடவுச்சொற்களை நினைவில் வைத்திருந்து, உங்களது அனைத்துச் சாதனங்களிலும் நீங்கள் செல்லும் தளங்களில் உங்களைத் தானாக உள்நுழையச் செய்யும்.</translation> <translation id="7925686952655276919">ஒத்திசைவிற்கான மொபைல் தரவைப் பயன்படுத்த வேண்டாம்</translation> <translation id="7926906273904422255">பாதுகாப்பற்ற மூலங்களைப் பாதுகாப்பற்றவை அல்லது "சந்தேகத்திற்குரியவை" எனக் குறிக்கவும்.</translation> <translation id="7928710562641958568">சாதனத்தை வெளித்தள்ளு</translation> @@ -4683,7 +4698,6 @@ உங்கள் முக்கிய கோப்பை பாதுகாப்பான இடத்தில் வையுங்கள். உங்கள் நீட்டிப்பின் புதிய பதிப்புகளை நீங்கள் உருவாக்க வேண்டி ஏற்படும்.</translation> <translation id="799923393800005025">பார்க்கலாம்</translation> <translation id="7999338963698132743">புதிய காரிய நிர்வாகி</translation> -<translation id="8000004253404706714">வழங்கிகளில் தொகுக்கப்பட்ட அனிமேஷன்களுக்கு பழைய ஊடுருவும் அனிமேஷன் துணை அமைப்பைப் பயன்படுத்தும்.</translation> <translation id="8004582292198964060">உலாவி</translation> <translation id="8007030362289124303">பேட்டரி குறைவு</translation> <translation id="8008356846765065031">இணையம் துண்டிக்கப்பட்டது. உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும்.</translation> @@ -4812,6 +4826,7 @@ <translation id="8185331656081929126">பிணையத்தில் புதிய பிரிண்டர்கள் கண்டறியப்படும்போது அறிவிப்புகளைக் காட்டு</translation> <translation id="8186609076106987817">சேவையகத்தால் கோப்பை கண்டறிய முடியவில்லை.</translation> <translation id="8186706823560132848">மென்பொருள்</translation> +<translation id="8188120771410500975">&உரைப் புலங்களில் எழுத்துப்பிழை உள்ளதா எனச் சரிபார்</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> மற்றும் மேலும் <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> உடன் இணைக்கிறது</translation> <translation id="8191230140820435481">உங்கள் பயன்பாடுகள், நீட்டிப்புகள் மற்றும் தீம்களை நிர்வகிக்கலாம்</translation> @@ -5205,6 +5220,7 @@ <translation id="8765985713192161328">ஹேண்ட்லர்களை நிர்வகி...</translation> <translation id="8766796754185931010">கொடோரி</translation> <translation id="8767072502252310690">பயனர்கள்</translation> +<translation id="8768367823103160496">மவுஸ் கர்சர் பூட்டு</translation> <translation id="8769662576926275897">கார்டு விவரங்கள்</translation> <translation id="8770196827482281187">பாரசீக உள்ளீட்டு முறை (ISIRI 2901 தளவமைப்பு)</translation> <translation id="8774934320277480003">மேல் ஓரம்</translation> @@ -5224,6 +5240,7 @@ <translation id="8795668016723474529">கிரெடிட் கார்டைச் சேர்</translation> <translation id="8795916974678578410">புதிய சாளரம்</translation> <translation id="8798099450830957504">இயல்புநிலை</translation> +<translation id="8799127529310003270">செயல்படுத்தப்பட்டால், InputConnection அழைப்புகள் IME தொடரிழையில் இயங்கும், replica editorஐ வைத்திருப்பதற்குப் பதிலாக, ஒவ்வொரு InputConnection அழைப்பும் நேரடியாக வழங்கியுடன் பேசும்.</translation> <translation id="8799839487311913894">"கடவுச்சொல்லை மாற்று" படிவத்தைச் சமர்ப்பித்த பின் கடவுச்சொல் நிர்வாகியில் கடவுச்சொல்லைப் புதுப்பிப்பதை இயக்கு.</translation> <translation id="8800004011501252845">இதற்கான இலக்குகள் காண்பிக்கப்படுகிறது</translation> <translation id="8800420788467349919">அளவு: <ph name="PRECENTAGE" />%</translation> @@ -5249,6 +5266,7 @@ <translation id="8841142799574815336">செயலற்ற விஷுவல் காட்சிப் பகுதி.</translation> <translation id="884264119367021077">ஷிப்பிங் முகவரி</translation> <translation id="8844238624737526720">Chrome காரிய நிர்வாகியின் புதிய மேம்படுத்தப்பட்ட செயல்படுத்தலைப் பயன்படுத்தும்.</translation> +<translation id="8845001906332463065">உதவி பெறுக</translation> <translation id="8846141544112579928">விசைப்பலகையைத் தேடுகிறது...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift விசைப் பயன்முறை மாற்றம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 221d494..aab5c66 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">ఈ పేజీని బుక్మార్క్ చెయ్యి...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> అంశాలను తొలగిస్తోంది...</translation> <translation id="1048597748939794622">అన్ని లేయర్ల కోసం నిర్బంధంగా ప్రారంభించబడింది</translation> +<translation id="1049795001945932310">&భాష సెట్టింగ్లు</translation> <translation id="1049926623896334335">Word పత్రం</translation> <translation id="1054153489933238809">అసలు &చిత్రాన్ని కొత్త ట్యాబ్లో తెరువు</translation> <translation id="1055806300943943258">బ్లూటూత్ మరియు USB పరికరాల కోసం శోధిస్తోంది...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">లిప్యంతరీకరణ (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">స్వయంచాలక పేరు సర్వర్లు</translation> <translation id="1215411991991485844">క్రొత్త నేపథ్య అనువర్తనం జోడించబడింది</translation> +<translation id="1216954813581739968">డెస్క్టాప్ భాగస్వామ్యం కోసం ట్యాబ్ను ప్రారంభించండి.</translation> <translation id="121827551500866099">అన్ని డౌన్లోడ్లను చూపించు...</translation> <translation id="122082903575839559">సర్టిఫికెట్ సంతకం అల్గారిథమ్</translation> <translation id="1221024147024329929">RSA గుప్తీకరణతో PKCS #1 MD2</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">స్వయంచాలక సైన్-ఇన్ విఫలమైంది</translation> <translation id="1293556467332435079">ఫైళ్ళు</translation> <translation id="1294298200424241932">నమ్మకమైన సెట్టింగ్లను సవరించు:</translation> +<translation id="1295794900245526845">సైన్ ఇన్ చేయడానికి <ph name="PASSWORD_MANAGER_BRAND" />తో సేవ్ చేయబడిన మీ ఖాతాను ఎంచుకోండి</translation> <translation id="1297175357211070620">గమ్యం</translation> <translation id="1297922636971898492">Google డిస్క్ ప్రస్తుతం అందుబాటులో లేదు. Google డిస్క్ అందుబాటులోకి వచ్చిన తర్వాత అప్లోడ్ స్వయంచాలకంగా మళ్లీ ప్రారంభమవుతుంది.</translation> <translation id="1300861494336759522">Windows డెస్క్టాప్ శోధన మళ్లింపు</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">దీని వలన మీ ప్రారంభ పేజీ, కొత్త ట్యాబ్ పేజీ, శోధన ఇంజిన్ మరియు పిన్ చేసిన ట్యాబ్లు రీసెట్ చేయబడతాయి. ఇది అన్ని పొడిగింపులను కూడా నిలిపివేస్తుంది మరియు కుక్కీల వంటి తాత్కాలిక డేటాను తీసివేస్తుంది. మీ బుక్మార్క్లు, చరిత్ర మరియు సేవ్ చేసిన పాస్వర్డ్లు తీసివేయబడవు.</translation> <translation id="1434886155212424586">హోమ్పేజీ అనేది కొత్త ట్యాబ్ పేజీ</translation> <translation id="1435550882135542937">పొడిగింపు సాధనపట్టీ పునఃరూపకల్పన</translation> +<translation id="1436402875660227532">గమనిక: ఈ సెట్టింగ్లు ఈ సిస్టమ్లో ఉపయోగించబడలేదు, కానీ మీరు ఇప్పటికీ వాటిని వీక్షించగలరు మరియు సవరించగలరు.</translation> <translation id="1436784010935106834">తీసివేయబడింది</translation> <translation id="1438632560381091872">ట్యాబ్లను అన్మ్యూట్ చేయి</translation> <translation id="1441841714100794440">వియత్నామీస్ కీబోర్డ్ (టెలెక్స్)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">వర్చువల్ కీబోర్డ్ మద్దతును ప్రారంభించండి.</translation> <translation id="1474079335130556426">పుష్ API కోసం నేపథ్య మోడ్ ప్రారంభించండి. దీని వలన Chrome చివరి విండో మూసివేసినా కూడా కొనసాగడానికి మరియు పుష్ APIకి అవసరమైతే OS స్టార్ట్అప్లో ప్రారంభించడానికి అనుమతించబడుతుంది.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" అప్లోడ్ కాలేదు. మీ Google డిస్క్లో తగినంత ఖాళీ స్థలం లేదు.</translation> +<translation id="1476607407192946488">&భాష సెట్టింగ్లు</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />ఓమ్నిపెట్టె<ph name="END_LINK" /> నుండి శోధించినప్పుడు ఉపయోగించవల్సిన శోధన ఇంజిన్ను సెట్ చేయండి.</translation> <translation id="1477301030751268706">గుర్తింపు API టోకెన్ కాష్</translation> <translation id="1478340334823509079">వివరాలు: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">ఈ పేజీ మీ కంప్యూటర్లో పని చేయని స్థానిక క్లయింట్ అనువర్తనాన్ని ఉపయోగిస్తుంది.</translation> <translation id="1965328510789761112">ప్రైవేట్ మెమరీ</translation> <translation id="1965624977906726414">ప్రత్యేక అనుమతులు లేవు.</translation> +<translation id="1968720524450620475">వెబ్ నోటిఫికేషన్ల కోసం చర్య చిహ్నాలను ప్రారంభించండి.</translation> <translation id="1970746430676306437">పేజీ యొక్క &సమాచారాన్ని చూడండి</translation> <translation id="197288927597451399">ఉంచు</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> డౌన్లోడ్ విఫలమైంది.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">అభ్యర్థి జాబితాను పేజీ చేయడానికి - మరియు = కీలను ఉపయోగించండి</translation> <translation id="2347476388323331511">సమకాలీకరించలేదు</translation> <translation id="2347991999864119449">ప్లగిన్ కంటెంట్ను ఎప్పుడు అమలు చేయాలో నేను ఎంచుకుంటాను</translation> +<translation id="2348165084656290171">ఆడియోను భాగస్వామ్యం చేయడానికి, ట్యాబ్ను లేదా మొత్తం స్క్రీన్ను ఎంచుకోండి.</translation> <translation id="2350182423316644347">అనువర్తనాన్ని ప్రారంభిస్తోంది...</translation> <translation id="2350796302381711542"><ph name="REPLACED_HANDLER_TITLE" />కి బదులుగా అన్ని <ph name="PROTOCOL" /> లింక్లను తెరవడానికి <ph name="HANDLER_HOSTNAME" />ను అనుమతించాలా?</translation> <translation id="2351266942280602854">భాష మరియు ఇన్పుట్</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">కెనడియన్ బహుభాషా కీబోర్డ్</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" కోసం మీడియా-ఫైల్ అనుమతులు</translation> <translation id="2478830106132467213">మీ ఫోన్ చేతికి అందే దూరంలో ఉన్నప్పుడు మాత్రమే ఈ <ph name="DEVICE_TYPE" />ని అన్లాక్ చేయండి.</translation> +<translation id="247949520305900375">ఆడియోను భాగస్వామ్యం చేయి</translation> <translation id="2479780645312551899">ఈ సమయంలో అన్ని ప్లగిన్లను అమలు చేయి</translation> <translation id="2480626392695177423">పూర్తి/సగం వెడల్పు విరామచిహ్నం మోడ్ను టోగుల్ చేయి</translation> <translation id="2481332092278989943">అరకు జోడించండి</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">దీనితో లింక్ తెరువు...</translation> <translation id="2889925978073739256">శాండ్బాక్స్ చేయని ప్లగిన్లను బ్లాక్ చేయడం కొనసాగించు</translation> <translation id="2890624088306605051">సమకాలీకరించిన సెట్టింగ్లను మరియు డేటాను మాత్రమే తిరిగి పొందండి</translation> +<translation id="2890678560483811744">పేజీ సూచన పరిమితిని దాటిపోయారు</translation> <translation id="2893168226686371498">డిఫాల్ట్ బ్రౌజర్</translation> <translation id="289426338439836048">ఇతర మొబైల్ నెట్వర్క్...</translation> <translation id="2894745200702272315">హార్డ్వేర్పై ఆధారపడే ప్రయోగాత్మక 'Ok Google' హాట్వర్డ్ గుర్తింపు లక్షణాల సంస్కరణను ప్రారంభిస్తుంది.</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">షీట్లు</translation> <translation id="2927017729816812676">కాష్ నిల్వ</translation> <translation id="2927657246008729253">మార్చు...</translation> -<translation id="2928415919076124714">పూర్తి స్క్రీన్లో సాధనపట్టీని దాచు</translation> <translation id="2928526264833629376">Hangoutsకు కొనసాగించు</translation> <translation id="2930644991850369934">రికవరీ చిత్రం డౌన్లోన్ చేస్తున్నప్పుడు లోపం సంభవించింది. నెట్వర్క్ కనెక్షన్ని కోల్పోయింది.</translation> <translation id="293111069139560936">ఒకే ఒకటి ఉన్న, ఇప్పటికే సక్రియంగా ఉన్న, దానితో అనుబంధించబడిన విండో ఉన్న అర అంశాన్ని క్లిక్ చేసినప్పుడు విండోను కనిష్టీకరించడానికి అరను అనుమతిస్తుంది.</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">తేలియాడే వర్చువల్ కీబోర్డ్ను ప్రారంభించండి/నిలిపివేయండి.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> సహాయం</translation> <translation id="3120430004221004537">దీనిలో నిర్దిష్ట చర్య కోసం తగిన గుప్తీకరణ లేదు: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">వెబ్ నోటిఫికేషన్ల కోసం చర్య బటన్ల్లో చిహ్నాలను ప్రారంభిస్తుంది.</translation> <translation id="3121793941267913344">ఈ <ph name="IDS_SHORT_PRODUCT_NAME" /> పరికరాన్ని రీసెట్ చేయండి</translation> <translation id="3122162841865761901">డెవలపర్ సాధనాల ప్రయోగాలు</translation> <translation id="3122464029669770682">CPU</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">సులభ చిహ్న ఇన్పుట్</translation> <translation id="3289856944988573801">నవీకరణల కోసం తనిఖీ చేయడానికి, దయచేసి ఈథర్నెట్ లేదా Wi-Fiని ఉపయోగించండి.</translation> <translation id="3293325348208285494">వేగవంతమైన ప్రారంభం</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" ఎంచుకున్న ఫోల్డర్ల్లో చిత్రాలు, వీడియో మరియు ధ్వని ఫైల్లను చదవగలదు మరియు వ్రాయగలదు.</translation> <translation id="3294437725009624529">అతిథి</translation> <translation id="329650768420594634">ప్యాక్ పొడిగింపు హెచ్చరిక</translation> <translation id="3296763833017966289">జార్జియన్</translation> @@ -1639,6 +1647,7 @@ <translation id="3338239663705455570">స్లొవెనియన్ కీబోర్డ్</translation> <translation id="3340978935015468852">సెట్టింగ్లు</translation> <translation id="3341703758641437857">ఫైల్ URLలకు ప్రాప్తిని అనుమతించు</translation> +<translation id="3343813173145836998">ఈ పరికరంలో సులభంగా సైన్ ఇన్ చేయండి</translation> <translation id="3344786168130157628">ప్రాప్యతా పాయింట్ పేరు:</translation> <translation id="3345135638360864351">ఈ సైట్ని ప్రాప్యత చేయడానికి మీరు చేసిన అభ్యర్థన <ph name="NAME" />కి పంపబడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation> <translation id="3345886924813989455">మద్దతు గల బ్రౌజర్ కనుగొనబడలేదు</translation> @@ -2118,6 +2127,7 @@ <translation id="3996912167543967198">రీసెట్ చేస్తోంది...</translation> <translation id="3997015411467176489">ప్రయోగాత్మక కాన్వాస్ లక్షణాలు</translation> <translation id="40027638859996362">పద తరలింపు</translation> +<translation id="400554499662786523">ఆడియోను భాగస్వామ్యం చేయడానికి, ట్యాబ్ను ఎంచుకోండి.</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" />లో ప్రింటర్లను సెటప్ చేయండి లేదా నిర్వహించండి.</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />"ని సరి చేయాలా?</translation> <translation id="4018133169783460046">ఈ భాషలో <ph name="PRODUCT_NAME" />ను ప్రదర్శించు</translation> @@ -2220,6 +2230,7 @@ <translation id="4180788401304023883">CA ప్రమాణపత్రం "<ph name="CERTIFICATE_NAME" />"ని తొలగించాలా?</translation> <translation id="418179967336296930">రష్యన్ ఫొనెటిక్ (YaZHert) కీబోర్డ్</translation> <translation id="4181841719683918333">భాషలు</translation> +<translation id="4187248015940562149">మీ చుట్టూ ఉన్న బ్లూటూత్ పరికరాలకు కనెక్ట్ చేయడానికి మరియు వాటిని నియంత్రించడానికి వెబ్సైట్లను అనుమతించే వెబ్ బ్లూటూత్ను ప్రారంభిస్తుంది.</translation> <translation id="4188026131102273494">కీవర్డ్:</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> అనే పొడిగింపు ఈ సెట్టింగ్ను నియంత్రిస్తోంది.</translation> <translation id="4193154014135846272">Google పత్రం</translation> @@ -2276,6 +2287,7 @@ <translation id="4268025649754414643">కీ గుప్తీకరణ</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">సంస్కరణ <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">సరిపోలికలు లేవు</translation> <translation id="4274187853770964845">సమకాలీకరణ లోపం: దయచేసి సమకాలీకరణను ఆపి, పునఃప్రారంభించండి.</translation> <translation id="4275830172053184480">మీ పరికరాన్ని పునఃప్రారంభించండి</translation> <translation id="4276796043975446927">సమావేశాల కోసం Chromeboxకి స్వాగతం</translation> @@ -2345,6 +2357,7 @@ <translation id="4378551569595875038">కనెక్ట్ అవుతోంది...</translation> <translation id="438122767399415311">UI దిశను నిర్బంధించండి</translation> <translation id="4381849418013903196">కోలన్</translation> +<translation id="4383192539467954373">పరికరాల్లో స్వయంచాలకంగా సైన్ ఇన్ చేయండి</translation> <translation id="4384652540891215547">పొడిగింపును సక్రియం చేయండి</translation> <translation id="438503109373656455">సారటోగా</translation> <translation id="4387554346626014084">అనువర్తన లాంచర్ సమకాలీకరణను ప్రారంభించండి. ఇది అందుబాటులో ఉన్నచోట ఫోల్డర్లను కూడా ప్రారంభిస్తుంది (OSX కానివి).</translation> @@ -2362,6 +2375,7 @@ <translation id="4421932782753506458">ఫ్లఫ్ఫీ</translation> <translation id="4422347585044846479">ఈ పేజీకి బుక్మార్క్ను సవరించు</translation> <translation id="4422428420715047158">DOMAIN:</translation> +<translation id="4423482519432579560">&అక్షరక్రమ తనిఖీ</translation> <translation id="442477792133831654">సమీపంలోని పరికరాలతో కమ్యూనికేట్ చేయి</translation> <translation id="4425149324548788773">నా డిస్క్</translation> <translation id="4428582326923056538">Adobe Flash Player కెమెరా మినహాయింపులు భిన్నమైనవి.</translation> @@ -2376,6 +2390,7 @@ <translation id="444267095790823769">రక్షిత కంటెంట్ మినహాయింపులు</translation> <translation id="4443536555189480885">&సహాయం</translation> <translation id="4444304522807523469">USB ద్వారా లేదా స్థానిక నెట్వర్క్లో జోడించిన పత్రం స్కానర్లను ప్రాప్యత చేయండి</translation> +<translation id="4445559854264555037">మీ పరికరం కనిపించడం లేదా? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">ప్రతిబింబితం</translation> <translation id="4447465454292850432">బ్యాటరీ:</translation> <translation id="4449935293120761385">స్వయంపూర్తి గురించి</translation> @@ -2634,6 +2649,7 @@ <translation id="485316830061041779">జర్మన్</translation> <translation id="4856478137399998590">మీ మొబైల్ డేటా సేవ సక్రియం చెయ్యబడింది మరియు ఉపయోగించడానికి సిద్ధంగా ఉంది</translation> <translation id="4858913220355269194">ఫ్రిట్జ్</translation> +<translation id="4860565041166337978">వర్తించే సమయంలో డౌన్లోడ్లను నిర్వహించడానికి సిస్టమ్ డౌన్లోడ్ నిర్వాహికిని అనుమతిస్తుంది.</translation> <translation id="48607902311828362">ఎయిర్ప్లైన్ మోడ్</translation> <translation id="4861833787540810454">&ప్లే</translation> <translation id="4862050643946421924">పరికరాన్ని జోడించడం...</translation> @@ -2717,7 +2733,6 @@ <translation id="4977942889532008999">ప్రాప్యతను నిర్ధారించండి</translation> <translation id="4982718461356080574">స్టాక్ చేసినప్పుడు నిష్క్రియ ట్యాబ్ల్లో మూసివేత బటన్లను దాచడం</translation> <translation id="498294082491145744">కుక్కీలు, జావాస్క్రిప్ట్, ప్లగిన్లు, భౌగోళిక స్థానం, మైక్రోఫోన్, కెమెరా మొదలైన లక్షణాలకు వెబ్సైట్ల ప్రాప్యతను నియంత్రించే మీ సెట్టింగ్లను మార్చండి.</translation> -<translation id="4984329823325527157">మీడియా సోర్స్ API</translation> <translation id="4988526792673242964">పేజీలు</translation> <translation id="4988792151665380515">పబ్లిక్ కీని ఎగుమతి చేయడానికి విఫలమైంది.</translation> <translation id="49896407730300355">అ&పసవ్యదిశలో తిప్పు</translation> @@ -2906,7 +2921,6 @@ <translation id="5268606875983318825">PPAPI (ప్రాసెస్-వెలుపల-ఉంది)</translation> <translation id="526926484727016706">ఇది డిఫాల్ట్గా అన్ని iframes అన్ని అనుమతులు తిరస్కరించేలా చేస్తుంది. iframe కోసం నిర్దిష్ట అనుమతులను అనుమతించడం వలన ఈ అనుమతుల పేర్లను కొత్త iframe లక్షణాల విలువలుగా జాబితా చేయడంలో ప్రమేయాన్ని కలిగి ఉండవచ్చు.</translation> <translation id="5269977353971873915">ముద్రణ విఫలమైంది</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" ఎంచుకున్న ఫోల్డర్ల్లో చిత్రాలు, వీడియో మరియు ధ్వని ఫైల్లను చదవగలదు.</translation> <translation id="5271247532544265821">సులభతర/సాంప్రదాయ చైనీస్ మోడ్ను మార్చండి</translation> <translation id="5271549068863921519">పాస్వర్డ్ను సేవ్ చెయ్యి</translation> <translation id="5273628206174272911">సమతల ఓవర్స్క్రోల్కు ప్రతిస్పందనగా ప్రయోగాత్మక చరిత్ర నావిగేషన్.</translation> @@ -2943,6 +2957,7 @@ <translation id="5316716239522500219">మానిటర్లను ప్రతిబింబించు</translation> <translation id="5317780077021120954">సేవ్ చేయి</translation> <translation id="5319782540886810524">లాట్వైన్ కీబోర్డ్</translation> +<translation id="532247166573571973">సర్వర్ అందుబాటులో లేకపోవచ్చు. తర్వాత మళ్లీ ప్రయత్నించండి.</translation> <translation id="5323213332664049067">లాటిన్ అమెరికన్</translation> <translation id="532360961509278431">"$1"ని తెరవడం సాధ్యం కాలేదు: $2</translation> <translation id="5324674707192845912">మీరు పరికరాన్ని రిమోట్ పద్ధతిలో గుర్తించే, డేటాను తొలగించే మరియు లాక్ చేసే సామర్థ్యాన్ని నిలిపివేయడానికి ఈ <ph name="DEVICE_TYPE" /> Googleతో కలిగి ఉన్న నమోదును తీసివేయబోతున్నారు. ఇందుకు రీబూట్ చేయడం అవసరం. మీరు కొనసాగాలనుకుంటున్నారా?</translation> @@ -2995,11 +3010,11 @@ <translation id="5390284375844109566">సూచికలోని డేటాబేస్</translation> <translation id="5392544185395226057">స్థానిక క్లయింట్ కోసం మద్దతుని ప్రారంభించు.</translation> <translation id="5393125431335030955">ఈ ప్లగిన్ డెస్క్టాప్లో మాత్రమే పని చేస్తుంది.</translation> -<translation id="5393559999218790205">UI కంపోజిటర్ యానిమేషన్ కాలక్రమాలను నిలిపివేయండి</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" />లో <ph name="PEPPER_PLUGIN_NAME" /> మీ కంప్యూటర్ను ప్రాప్యత చేయాలనుకుంటోంది.</translation> <translation id="539755880180803351">ప్లేస్హోల్డర్ వచనం వలె స్వీయ పూరింపు ఫీల్డ్ రకం సూచనలతో వెబ్ ఫారమ్లను వ్యాఖ్యానిస్తుంది.</translation> <translation id="5397578532367286026">ఈ వినియోగదారు యొక్క వినియోగం మరియు చరిత్రను chrome.comలో నిర్వాహకుడు (<ph name="MANAGER_EMAIL" />) సమీక్షించవచ్చు.</translation> <translation id="5397794290049113714">మీరు</translation> +<translation id="5398572795982417028">పేజీ సూచన పరిమితిని దాటిపోయారు, పరిమితి <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339">ఇతర సైట్ల నుండి <ph name="COUNT" /></translation> <translation id="5399158067281117682">పిన్లు సరిపోలడం లేదు!</translation> <translation id="5400640815024374115">నమ్మకమైన ప్లాట్ఫామ్ మాడ్యూల్ (TPM) చిప్ ఆపివెయ్యబడింది లేదా హాజరు కాలేదు.</translation> @@ -3019,7 +3034,7 @@ <translation id="5423849171846380976">సక్రియం చెయ్యబడింది</translation> <translation id="5425470845862293575">ప్రయోగాత్మక DirectWrite ఫాంట్ భాషాంతరీకరణ సిస్టమ్ యొక్క ఉపయోగాన్ని ప్రారంభిస్తుంది.</translation> <translation id="5425722269016440406">ఈ సెట్టింగ్ మీ ఫోన్ మరియు ఇతర పరికరాలకు సమకాలీకరించబడినందున Smart Lockను ఆఫ్ చేయడానికి మీరు తప్పనిసరిగా ఆన్లైన్లో ఉండాలి. దయచేసి ముందుగా నెట్వర్క్కు కనెక్ట్ చేయండి.</translation> -<translation id="5426623592374109001">UIలో కంపోజ్ చేసిన యానిమేషన్ల కోసం పాత అనుచిత యానిమేషన్ సబ్సిస్టమ్ను ఉపయోగిస్తుంది.</translation> +<translation id="5425863515030416387">పరికరాల్లో సులభంగా సైన్ ఇన్ చేయండి</translation> <translation id="5427459444770871191">&సవ్యదిశలో తిప్పు</translation> <translation id="5428105026674456456">స్పానిష్</translation> <translation id="542872847390508405">మీరు అతిథిగా బ్రౌజ్ చేస్తున్నారు</translation> @@ -3044,6 +3059,7 @@ <translation id="5451646087589576080">ఫ్రేమ్ &సమాచారాన్ని చూడండి</translation> <translation id="5453029940327926427">టాబ్లను మూసివెయ్యి</translation> <translation id="5453632173748266363">సిరిలిక్</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" />తో</translation> <translation id="5457113250005438886">చెల్లదు</translation> <translation id="5457459357461771897">మీ కంప్యూటర్లోని ఫోటోలు, సంగీతం మరియు ఇతర మీడియాను చదవడం మరియు తొలగించడం</translation> <translation id="5457599981699367932">అతిథి వలె బ్రౌజ్ చెయ్యండి</translation> @@ -3213,7 +3229,6 @@ <translation id="5708171344853220004">Microsoft ప్రధాన పేరు</translation> <translation id="5709885306771508267">వేళ్లతో తాకి సక్రియం చేసే ప్రమాణం</translation> <translation id="5710406368443808765">అయ్యో! సిస్టమ్ పరికర టోకెన్ మరియు IDని నిల్వ చేయడంలో విఫలమైంది.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> ప్రతిస్పందించడం లేదు. ప్రసారం చేయడం సాధ్యపడలేదు.</translation> <translation id="5711983031544731014">అన్లాక్ చేయడం సాధ్యపడలేదు. మీ పాస్వర్డ్ను నమోదు చేయండి.</translation> <translation id="5712966208980506909">ప్రారంభించబడితే, chrome://md-policy URL విశిష్ట రూపకల్పన విధాన పేజీని లోడ్ చేస్తుంది.</translation> <translation id="5715711091495208045">ప్లగిన్ బ్రోకర్: <ph name="PLUGIN_NAME" /></translation> @@ -3480,7 +3495,6 @@ <translation id="6111974609785983504">డిఫాల్ట్గా అనుమతించబడింది</translation> <translation id="6113134669445407638">WebRTCలో అజ్ఞేయ AEC జాప్యాన్ని నిలిపివేయండి. నివేదిత సిస్టమ్ జాప్యాలు అత్యంత విశ్వసనీయమైనవి అయితే లేదా ఇతరులకు మీ మెషీన్ నుండి ప్రతిధ్వని అందుతుంటే ఉపయోగించండి.</translation> <translation id="6116921718742659598">భాష మరియు ఇన్పుట్ సెట్టింగ్లను మార్చండి</translation> -<translation id="6117536376248197233">రెండెరెర్ల్లో కంపోజిటర్ యానిమేషన్ కాలక్రమాలను నిలిపివేయండి.</translation> <translation id="6120205520491252677">ప్రారంభ స్క్రీన్కు ఈ పేజీని పిన్ చేయి...</translation> <translation id="6122081475643980456">మీ ఇంటర్నెట్ కనెక్షన్ నియంత్రించబడుతోంది</translation> <translation id="6122093587541546701">ఇమెయిల్ (ఐచ్ఛికం):</translation> @@ -3512,6 +3526,7 @@ <translation id="6163522313638838258">అన్నీ విస్తరించు...</translation> <translation id="6164005077879661055">ఈ పర్యవేక్షించబడే వినియోగదారు తీసివేయబడినప్పుడు పర్యవేక్షించబడే వినియోగదారుతో అనుబంధించబడిన అన్ని ఫైల్లు మరియు స్థానిక డేటా శాశ్వతంగా తొలగించబడతాయి. ఈ పర్యవేక్షించబడే వినియోగదారు సందర్శించిన వెబ్సైట్లు మరియు వీరి సెట్టింగ్లు ఇప్పటికీ <ph name="MANAGEMENT_URL" />లో నిర్వాహకునికి కనిపించవచ్చు.</translation> <translation id="6165508094623778733">మరింత తెలుసుకోండి</translation> +<translation id="6167008112175207002">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లు మీ Google ఖాతాకు సమకాలీకరించబడతాయి, కాబట్టి మీరు వాటిని మీ అన్ని పరికరాల్లో ఉపయోగించవచ్చు. మీరు దీన్ని <ph name="BEGIN_LINK" />లో మార్చవచ్చు</translation> <translation id="6171550060231646388">సిమ్యులేట్ చేసిన హార్డ్వేర్ 'Ok Google' లక్షణాలు</translation> <translation id="6175314957787328458">Microsoft డొమైన్ GUID</translation> <translation id="6178664161104547336">ఒక సర్టిఫికెట్ని ఎంచుకోండి</translation> @@ -3715,6 +3730,7 @@ <translation id="648927581764831596">ఏవీ అందుబాటులో లేవు</translation> <translation id="6490936204492416398">వెబ్స్టోర్ నుండి కొత్తవి ఇన్స్టాల్ చేయి</translation> <translation id="6492313032770352219">డిస్క్ పరిమాణం:</translation> +<translation id="6498249116389603658">&మీ అన్ని భాషలు</translation> <translation id="6499143127267478107">ప్రాక్సీ స్క్రిప్ట్లో హోస్ట్ను పరిష్కరిస్తోంది...</translation> <translation id="6503077044568424649">ఎక్కువగా సందర్శించేవి</translation> <translation id="6503256918647795660">స్విస్ ఫ్రెంచ్ కీబోర్డ్</translation> @@ -3756,7 +3772,6 @@ <translation id="6555432686520421228">అన్ని వినియోగదారు ఖాతాలను తీసివేయండి మరియు మీ <ph name="IDS_SHORT_PRODUCT_NAME" /> పరికరాన్ని క్రొత్త దాని వలె రీసెట్ చేయండి.</translation> <translation id="6556866813142980365">చర్య పునరావృతం</translation> <translation id="6557565812667414268">అధిక-DPI డిస్ప్లేల కోసం మాత్రమే ప్రారంభించబడింది</translation> -<translation id="655845594391856372">ట్యాబ్ ప్రతిస్పందించడం లేదు. ప్రసారం చేయడం సాధ్యపడలేదు.</translation> <translation id="6559580823502247193">(ఇప్పటికే ఈ పరికరంలో ఉన్నారు)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">రికవరీ చిత్రాన్ని సంగ్రహిస్తోంది...</translation> @@ -3857,6 +3872,7 @@ <translation id="6723354935081862304">Google డాక్స్కు మరియు ఇతర మేఘ గమ్యస్థానాలకు ముద్రించండి. Google మేఘ ముద్రణకు ముద్రించడానికి <ph name="BEGIN_LINK" />సైన్ ఇన్ చేయండి<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">బుక్మార్క్లను మరియు సెట్టింగులను దిగుమతి చెయ్యి...</translation> <translation id="6723839937902243910">పవర్</translation> +<translation id="6725240607822645708">IMEని దాని స్వంత థ్రెడ్లో అమలు చేయండి.</translation> <translation id="6725970970008349185">ప్రతి పేజీకి ప్రదర్శించడానికి అభ్యర్థుల సంఖ్య</translation> <translation id="672609503628871915">కొత్తగా ఏమి ఉన్నాయో చూడండి</translation> <translation id="6727005317916125192">మునుపటి పేన్</translation> @@ -3988,12 +4004,11 @@ <translation id="6948736568813450284">డెవలపర్ల కోసం: Google చెల్లింపుల API కాల్ల కోసం శాండ్బాక్స్ సేవను ఉపయోగిస్తుంది.</translation> <translation id="6949306908218145636">తెరిచిన పేజీలను బుక్మార్క్ చేయి...</translation> <translation id="695164542422037736">ఈ ఎంపిక ప్రారంభించబడితే, విషయం ఈ నేపథ్య-జోడింపుతో శైలీకృతమైతే:స్థిరం, నేపథ్యం దాని స్వంత కూర్చబడిన లేయర్ను కలిగి ఉంటుంది.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> మీ పాస్వర్డ్లను గుర్తుంచుకుంటుంది మరియు ఈ పరికరంలో సైట్లకు మిమ్మల్ని స్వయంచాలకంగా సైన్ ఇన్ చేస్తుంది.</translation> <translation id="6955446738988643816">పాప్అప్ను పరిశీలించు</translation> <translation id="695755122858488207">ఎంపిక చెయ్యని రేడియో బటన్</translation> +<translation id="6960277925159781810">ఈ పరికరంలో స్వయంచాలకంగా సైన్ ఇన్ చేయండి</translation> <translation id="696036063053180184">3 సెట్ (మార్పు లేదు)</translation> <translation id="696203921837389374">మొబైల్ డేటాలో సమకాలీకరించడాన్ని ప్రారంభించు</translation> -<translation id="6964308487066031935">"<ph name="EXTENSION" />"కు ఫోల్డర్లను జోడించాలా?</translation> <translation id="6965382102122355670">సరే</translation> <translation id="6965648386495488594">పోర్ట్</translation> <translation id="6965978654500191972">పరికరం</translation> @@ -4091,7 +4106,6 @@ <translation id="7076293881109082629">సైన్ ఇన్ చేస్తోంది</translation> <translation id="7077829361966535409">సైన్ ఇన్ పేజీ ప్రస్తుత ప్రాక్సీ సెట్టింగ్లను ఉపయోగించి లోడ్ కావడంలో విఫలమైంది. దయచేసి <ph name="GAIA_RELOAD_LINK_START" />మళ్లీ సైన్ ఇన్ చేయడానికి ప్రయత్నించండి<ph name="GAIA_RELOAD_LINK_END" /> లేదా విభిన్న <ph name="PROXY_SETTINGS_LINK_START" />ప్రాక్సీ సెట్టింగ్ల<ph name="PROXY_SETTINGS_LINK_END" />ను ఉపయోగించండి.</translation> <translation id="7077872827894353012">విస్మరించబడిన ప్రోటోకాల్ హ్యాండ్లెర్స్</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" ఎంచుకున్న ఫోల్డర్ల్లో చిత్రాలు, వీడియో మరియు ధ్వని ఫైల్లను చదవగలదు మరియు తొలగించగలదు.</translation> <translation id="708060913198414444">ఆడియో చిరునామాను కా&పీ చేయి</translation> <translation id="708187310695946552">సెషన్ పునరుద్ధరణ బబుల్ UI</translation> <translation id="7082055294850503883">CapsLock స్థితిని విస్మరించి, డిఫాల్ట్గా చిన్నబడిని ఇన్పుట్ చేయండి</translation> @@ -4235,6 +4249,8 @@ <translation id="7313804056609272439">వియత్నామీస్ ఇన్పుట్ పద్ధతి (VNI)</translation> <translation id="7314244761674113881">సాక్స్ హోస్ట్</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (ప్రస్తుత)</translation> +<translation id="7321545336522791733">సర్వర్ అందుబాటులో లేదు</translation> +<translation id="7324841169865301118">డెస్క్టాప్ భాగస్వామ్యం కోసం ట్యాబ్ను ఎంచుకోవడానికి వినియోగదారుని అనుమతిస్తుంది.</translation> <translation id="7325437708553334317">అధిక కాంట్రాస్ట్ పొడిగింపు</translation> <translation id="7326565110843845436">టచ్ప్యాడ్పై మూడు వేళ్లతో క్లిక్ చేయడం</translation> <translation id="73289266812733869">ఎంచుకోబడలేదు</translation> @@ -4461,7 +4477,6 @@ <translation id="7650511557061837441">"<ph name="EXTENSION_NAME" />"ని "<ph name="TRIGGERING_EXTENSION_NAME" />" తీసివేయాలనుకుంటోంది.</translation> <translation id="7650701856438921772">ఈ భాషలో <ph name="PRODUCT_NAME" /> ప్రదర్శించబడింది</translation> <translation id="7654941827281939388">ఈ ఖాతా ఇప్పటికే ఈ కంప్యూటర్లో ఉపయోగించబడుతోంది.</translation> -<translation id="7655165758820095116">MediaSource ఆబ్జెట్ మీడియా డేటాను నేరుగా వీడియో మూలకానికి పంపేందుకు జావాస్క్రిప్ట్ని అనుమతిస్తుంది.</translation> <translation id="7658239707568436148">రద్దు చెయ్యి</translation> <translation id="7659584679870740384">ఈ పరికరాన్ని ఉపయోగించడానికి మీకు అధికారం లేదు. దయచేసి సైన్-ఇన్ అనుమతి కోసం నిర్వాహకుడిని సంప్రదించండి.</translation> <translation id="7664620655576155379">మద్దతు లేని బ్లూటూత్ పరికరం: "<ph name="DEVICE_NAME" />".</translation> @@ -4592,6 +4607,7 @@ <translation id="7861215335140947162">&డౌన్లోడ్లు</translation> <translation id="7864539943188674973">Bluetoothని నిలిపివేయి</translation> <translation id="7868891395842935202">API ప్రయోగాలకు ప్రాప్యతను నియంత్రించడం కోసం ప్రయోగాత్మక ఫ్రేమ్వర్క్ను ప్రారంభిస్తుంది.</translation> +<translation id="7870576007982733437">వర్తించే సమయంలో సిస్టమ్ డౌన్లోడ్ నిర్వాహికిని ఉపయోగించండి.</translation> <translation id="7870790288828963061">సరికొత్త సంస్కరణ అందుబాటులో ఉన్న కియోస్క్ అనువర్తనాలేవీ కనుగొనబడలేదు. నవీకరించడానికి ఏదీ లేదు. దయచేసి USB స్టిక్ను తీసివేయండి.</translation> <translation id="787150342916295244">క్రెడిట్ కార్డ్ స్కానింగ్</translation> <translation id="7874357055309047713">ఎల్లప్పుడూ అన్ని సైట్ల్లో అమలు చేయి</translation> @@ -4634,7 +4650,6 @@ <translation id="7918257978052780342">నమోదు చేయి</translation> <translation id="7920092496846849526">మీరు ఈ పేజీని సందర్శించడానికి అనుమతించమని కోరుతూ మీ తల్లి/తండ్రికి అభ్యర్థన పంపారు.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> కోసం వేచి ఉంది ...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> మీ పాస్వర్డ్లను గుర్తుంచుకుంటుంది మరియు పరికరాల్లో అనువర్తనాలు మరియు సైట్లకు మిమ్మల్ని స్వయంచాలకంగా సైన్ ఇన్ చేస్తుంది.</translation> <translation id="7925686952655276919">సమకాలీకరణ కోసం మొబైల్ డేటాని ఉపయోగించవద్దు</translation> <translation id="7926906273904422255">అసురక్షిత మూలాలను అసురక్షితంగా లేదా "అవిశ్వసనీయం"గా గుర్తిస్తుంది.</translation> <translation id="7928710562641958568">పరికరాన్ని తీసివేయండి</translation> @@ -4693,7 +4708,6 @@ పొడిగింపు: <ph name="EXTENSION_FILE" />కీ ఫైల్: <ph name="KEY_FILE" />మీ కీ ఫైల్ను ఒక సురక్షితమైన స్థలంలో ఉంచండి. మీ పొడిగింపు యొక్క క్రొత్త సంస్కరణను సృష్టించడానికి మీకు ఇది అవసరం అవుతుంది.</translation> <translation id="799923393800005025">వీక్షించవచ్చు</translation> <translation id="7999338963698132743">కొత్త విధి నిర్వాహికి</translation> -<translation id="8000004253404706714">రెండెరెర్ల్లో కంపోజ్ చేసిన యానిమేషన్ల కోసం పాత అనుచిత యానిమేషన్ సబ్సిస్టమ్ను ఉపయోగిస్తుంది.</translation> <translation id="8004582292198964060">బ్రౌజర్</translation> <translation id="8007030362289124303">తక్కువ బ్యాటరీ</translation> <translation id="8008356846765065031">ఇంటర్నెట్ డిస్కనెక్ట్ చేయబడింది. దయచేసి మీ ఇంటర్నెట్ కనెక్షన్ను తనిఖీ చేయండి.</translation> @@ -4822,6 +4836,7 @@ <translation id="8185331656081929126">నెట్వర్క్లో కొత్త ప్రింటర్లు గుర్తించబడినప్పుడు నోటిఫికేషన్లను చూపు</translation> <translation id="8186609076106987817">సర్వర్ ఫైల్ని కనుగొనలేకపోయింది.</translation> <translation id="8186706823560132848">సాఫ్ట్వేర్</translation> +<translation id="8188120771410500975">&వచన ఫీల్డ్ల అక్షరక్రమాన్ని తనిఖీ చేయి</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" />, మరియు మరో <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" />కు కనెక్ట్ చేస్తోంది</translation> <translation id="8191230140820435481">మీ అనువర్తనాలను, పొడిగింపులను మరియు థీమ్లను నిర్వహించండి</translation> @@ -5214,6 +5229,7 @@ <translation id="8765985713192161328">హ్యాండ్లర్లను నిర్వహించండి...</translation> <translation id="8766796754185931010">కోటోరి</translation> <translation id="8767072502252310690">వినియోగదారులు</translation> +<translation id="8768367823103160496">మౌస్ కర్సర్ లాక్</translation> <translation id="8769662576926275897">కార్డ్ వివరాలు</translation> <translation id="8770196827482281187">పర్షియన్ ఇన్పుట్ విధానం (ISIRI 2901 లేఅవుట్)</translation> <translation id="8774934320277480003">ఎగువ అంచు</translation> @@ -5233,6 +5249,7 @@ <translation id="8795668016723474529">క్రెడిట్ కార్డ్ను జోడించండి</translation> <translation id="8795916974678578410">క్రొత్త విండో</translation> <translation id="8798099450830957504">డిఫాల్ట్</translation> +<translation id="8799127529310003270">ప్రారంభిస్తే, InputConnection కాల్లు IME థ్రెడ్లో అమలు చేయబడతాయి మరియు నకిలీ ఎడిటర్ను ఉంచుకోవడానికి బదులుగా, ప్రతి InputConnection కాల్లో నేరుగా రెండెరెర్తో మాట్లాడటం జరుగుతుంది.</translation> <translation id="8799839487311913894">"పాస్వర్డ్ను మార్చుకోండి" ఫారమ్ను సమర్పించిన తర్వాత పాస్వర్డ్ నిర్వాహికిలో పాస్వర్డ్ను నవీకరించడం అనుమతిస్తుంది.</translation> <translation id="8800004011501252845">దీని కోసం గమ్యస్థానాలను చూపుతోంది</translation> <translation id="8800420788467349919">శబ్దం: <ph name="PRECENTAGE" />%</translation> @@ -5258,6 +5275,7 @@ <translation id="8841142799574815336">అచేతన దృశ్య వీక్షణ పోర్ట్.</translation> <translation id="884264119367021077">షిప్పింగ్ చిరునామా</translation> <translation id="8844238624737526720">chrome విధి నిర్వాహికి యొక్క కొత్త మరియు అనుకూలీకృత అమలుని ఉపయోగిస్తుంది.</translation> +<translation id="8845001906332463065">సహాయం పొందండి</translation> <translation id="8846141544112579928">కీబోర్డ్ కోసం శోధిస్తోంది...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift కీ మోడ్ మార్పు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index df03fef..5e40217e 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">บุ๊กมาร์กหน้านี้...</translation> <translation id="1047956942837015229">กำลังลบ <ph name="COUNT" /> รายการ...</translation> <translation id="1048597748939794622">บังคับเปิดสำหรับทุกเลเยอร์</translation> +<translation id="1049795001945932310">&การตั้งค่าภาษา</translation> <translation id="1049926623896334335">เอกสาร Word</translation> <translation id="1054153489933238809">เ&ปิดภาพต้นฉบับในแท็บใหม่</translation> <translation id="1055806300943943258">กำลังค้นหาอุปกรณ์บลูทูธและอุปกรณ์ USB...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">การทับศัพท์ (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">เซิร์ฟเวอร์ชื่ออัตโนมัติ</translation> <translation id="1215411991991485844">มีการเพิ่มแอปพลิเคชันที่ทำงานอยู่เบื้องหลังตัวใหม่</translation> +<translation id="1216954813581739968">เปิดใช้แท็บสำหรับการแชร์เดสก์ท็อป</translation> <translation id="121827551500866099">แสดงการดาวน์โหลดทั้งหมด...</translation> <translation id="122082903575839559">อัลกอริธึมลายเซ็นใบรับรอง </translation> <translation id="1221024147024329929">PKCS #1 MD2 พร้อมการเข้ารหัส RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">การลงชื่อเข้าใช้อัตโนมัติล้มเหลว</translation> <translation id="1293556467332435079">ไฟล์</translation> <translation id="1294298200424241932">แก้ไขการตั้งค่าความเชื่อถือ:</translation> +<translation id="1295794900245526845">เลือกบัญชีของคุณที่บันทึกไว้กับ <ph name="PASSWORD_MANAGER_BRAND" /> เพื่อลงชื่อเข้าใช้</translation> <translation id="1297175357211070620">ปลายทาง</translation> <translation id="1297922636971898492">Google ไดรฟ์ไม่พร้อมใช้งานในขณะนี้ การอัปโหลดจะเริ่มต้นอีกครั้งโดยอัตโนมัติเมื่อ Google ไดรฟ์ใช้งานได้</translation> <translation id="1300861494336759522">การเปลี่ยนเส้นทางการค้นหาบนเดสก์ท็อปของ Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">การดำเนินการนี้จะรีเซ็ตหน้าเริ่มต้นใช้งาน หน้าแท็บใหม่ เครื่องมือค้นหา แท็บที่ถูกตรึง และยังปิดใช้ส่วนขยายทั้งหมด ตลอดจนล้างข้อมูลชั่วคราว เช่น คุกกี้ โดยจะไม่ล้างบุ๊กมาร์ก ประวัติ และรหัสผ่านที่บันทึกไว้</translation> <translation id="1434886155212424586">หน้าแรกคือหน้าแท็บใหม่</translation> <translation id="1435550882135542937">การออกแบบแถบเครื่องมือส่วนขยายใหม่</translation> +<translation id="1436402875660227532">หมายเหตุ: การตั้งค่าเหล่านี้จะไม่นำมาใช้กับระบบนี้อีกต่อไป แต่คุณยังสามารถดูและแก้ไขได้</translation> <translation id="1436784010935106834">ลบออกแล้ว</translation> <translation id="1438632560381091872">เปิดเสียงแท็บ</translation> <translation id="1441841714100794440">แป้นพิมพ์ภาษาเวียดนาม (Telex)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">เปิดใช้งานการสนับสนุนแป้นพิมพ์เสมือน</translation> <translation id="1474079335130556426">เปิดใช้โหมดพื้นหลังสำหรับ Push API ซึ่งจะทำให้ Chrome ยังทำงานต่อหลังจากที่ปิดหน้าต่างสุดท้าย และเพื่อเปิด Chrome เมื่อเริ่มระบบปฏิบัติการ ในกรณีที่ Push API จำเป็นต้องใช้งาน</translation> <translation id="1474339897586437869">ไม่ได้อัปโหลด "<ph name="FILENAME" />" มีพื้นที่ว่างไม่เพียงพอใน Google ไดรฟ์ของคุณ</translation> +<translation id="1476607407192946488">&การตั้งค่าภาษา</translation> <translation id="1476949146811612304">ตั้งค่าว่าจะใช้เครื่องมือค้นหาใดเมื่อค้นหาจาก<ph name="BEGIN_LINK" />แถบอเนกประสงค์<ph name="END_LINK" /></translation> <translation id="1477301030751268706">แคชโทเค็น API ข้อมูลประจำตัว</translation> <translation id="1478340334823509079">รายละเอียด: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">หน้าเว็บนี้ใช้แอปพลิเคชัน Native Client ซึ่งไม่สามารถทำงานบนคอมพิวเตอร์ของคุณ</translation> <translation id="1965328510789761112">หน่วยความจำส่วนตัว</translation> <translation id="1965624977906726414">ไม่มีสิทธิ์พิเศษใดๆ</translation> +<translation id="1968720524450620475">เปิดใช้ไอคอนการทำงานสำหรับการแจ้งเตือนในเว็บ</translation> <translation id="1970746430676306437">ดู&ข้อมูลหน้าเว็บ</translation> <translation id="197288927597451399">เก็บไว้</translation> <translation id="1973491249112991739">การดาวน์โหลด <ph name="PLUGIN_NAME" /> ล้มเหลว</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">ใช้คีย์ - และ = เพื่อสร้างหน้ารายการตัวเลือก</translation> <translation id="2347476388323331511">ไม่สามารถซิงค์</translation> <translation id="2347991999864119449">ให้ฉันเลือกว่าจะเรียกใช้เนื้อหาปลั๊กอินเมื่อใด</translation> +<translation id="2348165084656290171">หากต้องการแชร์เสียง ให้เลือกแท็บหรือทั้งหน้าจอ</translation> <translation id="2350182423316644347">กำลังเริ่มต้นแอปพลิเคชัน...</translation> <translation id="2350796302381711542">ต้องการอนุญาตให้ <ph name="HANDLER_HOSTNAME" /> เปิดลิงก์ <ph name="PROTOCOL" /> ทั้งหมดแทน <ph name="REPLACED_HANDLER_TITLE" /> ไหม</translation> <translation id="2351266942280602854">ภาษาและการป้อนข้อมูล</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">แป้นพิมพ์หลายภาษาแบบแคนาดา</translation> <translation id="2478176599153288112">สิทธิ์ไฟล์สื่อสำหรับ "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">ปลดล็อก <ph name="DEVICE_TYPE" /> นี้เมื่อโทรศัพท์อยู่ในระยะเอื้อมมือถึงเท่านั้น</translation> +<translation id="247949520305900375">แชร์เสียง</translation> <translation id="2479780645312551899">เรียกใช้ปลั๊กอินทั้งหมดเฉพาะครั้งนี้</translation> <translation id="2480626392695177423">สลับระหว่างโหมดเครื่องหมายวรรคตอนแบบเต็มความกว้าง/แบบครึ่งความกว้าง</translation> <translation id="2481332092278989943">เพิ่มลงในชั้นวาง</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">เปิดลิงก์ด้วย...</translation> <translation id="2889925978073739256">บล็อกปลั๊กอินที่ไม่ได้อยู่ในแซนด์บ็อกซ์ต่อไป</translation> <translation id="2890624088306605051">ดึงเฉพาะการตั้งค่าและข้อมูลที่ซิงค์เท่านั้น</translation> +<translation id="2890678560483811744">การอ้างอิงหน้าอยู่นอกขอบเขต</translation> <translation id="2893168226686371498">เบราว์เซอร์เริ่มต้น</translation> <translation id="289426338439836048">เครือข่ายมือถืออื่น...</translation> <translation id="2894745200702272315">เปิดใช้คุณลักษณะการตรวจหาคำที่นิยม "Ok Google" เวอร์ชันทดสอบ ซึ่งขึ้นอยู่กับฮาร์ดแวร์</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">แผ่นงาน</translation> <translation id="2927017729816812676">พื้นที่เก็บข้อมูลแคช</translation> <translation id="2927657246008729253">เปลี่ยน...</translation> -<translation id="2928415919076124714">ซ่อนแถบเครื่องมือเมื่อแสดงผลเต็มจอ</translation> <translation id="2928526264833629376">ไปยังแฮงเอาท์</translation> <translation id="2930644991850369934">เกิดปัญหาขณะดาวน์โหลดอิมเมจการกู้คืน การเชื่อมต่อเครือข่ายขาดหาย</translation> <translation id="293111069139560936">อนุญาตให้ชั้นวางย่อหน้าต่างให้เล็กที่สุด หากรายการชั้นวางถูกคลิกโดยที่มีหน้าต่างเพียงบานเดียวซึ่งใช้งานอยู่แล้วเชื่อมโยงกับรายการนั้น</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">เปิดหรือปิดใช้แป้นพิมพ์เสมือนแบบลอย</translation> <translation id="3118319026408854581">ความช่วยเหลือของ <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">การเข้ารหัสสำหรับการดำเนินการที่ระบุไม่เพียงพอใน "<ph name="DEVICE_NAME" />"</translation> +<translation id="3121260210578524273">เปิดใช้ไอคอนในปุ่มการทำงานสำหรับการแจ้งเตือนในเว็บ</translation> <translation id="3121793941267913344">รีเซ็ตอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">การทดสอบเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์</translation> <translation id="3122464029669770682">CPU</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">การป้อนสัญลักษณ์แบบง่าย</translation> <translation id="3289856944988573801">ในการตรวจหาการอัปเดต โปรดใช้อีเทอร์เน็ตหรือ WiFi</translation> <translation id="3293325348208285494">เริ่มอย่างรวดเร็ว</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" จะสามารถอ่านและเขียนไฟล์รูปภาพ วิดีโอ และเสียงในโฟลเดอร์ที่เลือกไว้</translation> <translation id="3294437725009624529">ผู้มาเยือน</translation> <translation id="329650768420594634">คำเตือนเกี่ยวกับส่วนขยายของ Pack</translation> <translation id="3296763833017966289">จอร์เจีย</translation> @@ -1638,6 +1646,7 @@ <translation id="3338239663705455570">แป้นพิมพ์ภาษาสโลวีเนีย</translation> <translation id="3340978935015468852">การตั้งค่า</translation> <translation id="3341703758641437857">อนุญาตให้เข้าถึงไฟล์ URL</translation> +<translation id="3343813173145836998">ลงชื่อเข้าใช้บนอุปกรณ์นี้ได้ง่ายๆ</translation> <translation id="3344786168130157628">Access point name:</translation> <translation id="3345135638360864351">ไม่สามารถส่งคำขอเข้าถึงไซต์นี้ไปยัง <ph name="NAME" /> ได้ โปรดลองอีกครั้ง</translation> <translation id="3345886924813989455">ไม่พบเบราว์เซอร์ที่สนับสนุน</translation> @@ -2117,6 +2126,7 @@ <translation id="3996912167543967198">กำลังรีเซ็ต...</translation> <translation id="3997015411467176489">คุณลักษณะ Canvas รุ่นทดสอบ</translation> <translation id="40027638859996362">ย้ายคำ</translation> +<translation id="400554499662786523">หากต้องการแชร์เสียง ให้เลือกแท็บ</translation> <translation id="4012550234655138030">ตั้งค่าหรือจัดการเครื่องพิมพ์ใน <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="4014432863917027322">ต้องการซ่อม "<ph name="EXTENSION_NAME" />" ไหม</translation> <translation id="4018133169783460046">แสดง <ph name="PRODUCT_NAME" /> ในภาษานี้</translation> @@ -2219,6 +2229,7 @@ <translation id="4180788401304023883">ลบใบรับรองของผู้ออกใบรับรอง "<ph name="CERTIFICATE_NAME" />" หรือไม่</translation> <translation id="418179967336296930">แป้นพิมพ์การถ่ายเสียงภาษารัสเซีย (YaZHert)</translation> <translation id="4181841719683918333">ภาษา</translation> +<translation id="4187248015940562149">เปิดใช้เว็บบลูทูธซึ่งช่วยให้เว็บไซต์เชื่อมต่อและควบคุมอุปกรณ์บลูทูธรอบตัวคุณได้</translation> <translation id="4188026131102273494">คำหลัก:</translation> <translation id="4189406272289638749">ส่วนขยาย <b><ph name="EXTENSION_NAME" /></b> กำลังควบคุมการตั้งค่านี้</translation> <translation id="4193154014135846272">เอกสารของ Google</translation> @@ -2275,6 +2286,7 @@ <translation id="4268025649754414643">การเข้ารหัสคีย์</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">รุ่น <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">ไม่มีรายการที่ตรงกัน</translation> <translation id="4274187853770964845">การซิงค์มีข้อผิดพลาด: โปรดหยุดและเริ่มการซิงค์ใหม่</translation> <translation id="4275830172053184480">รีสตาร์ทอุปกรณ์ของคุณ</translation> <translation id="4276796043975446927">ยินดีต้อนรับสู่ Chromebox วิดีโอคอนเฟอเรนซ์</translation> @@ -2344,6 +2356,7 @@ <translation id="4378551569595875038">กำลังเชื่อมต่อ...</translation> <translation id="438122767399415311">บังคับทิศทางของ UI</translation> <translation id="4381849418013903196">มหัพภาคคู่</translation> +<translation id="4383192539467954373">ลงชื่อเข้าใช้อุปกรณ์ทุกเครื่องโดยอัตโนมัติ</translation> <translation id="4384652540891215547">เปิดใช้งานส่วนขยาย</translation> <translation id="438503109373656455">ซาราโทกะ</translation> <translation id="4387554346626014084">เปิดการซิงค์เครื่องเรียกใช้งานแอป โดยจะเปิดใช้โฟลเดอร์ด้วยเมื่อพร้อมใช้งาน (ไม่ใช่ OSX)</translation> @@ -2361,6 +2374,7 @@ <translation id="4421932782753506458">ฟลัฟฟี</translation> <translation id="4422347585044846479">แก้ไขบุ๊กมาร์กสำหรับหน้านี้</translation> <translation id="4422428420715047158">โดเมน:</translation> +<translation id="4423482519432579560">&ตรวจการสะกด</translation> <translation id="442477792133831654">สื่อสารกับอุปกรณ์ใกล้เคียง</translation> <translation id="4425149324548788773">ไดรฟ์ของฉัน</translation> <translation id="4428582326923056538">ข้อยกเว้นของกล้องถ่ายรูป Adobe Flash Player จะแตกต่างกันไป</translation> @@ -2375,6 +2389,7 @@ <translation id="444267095790823769">ข้อยกเว้นเนื้อหาที่ได้รับการป้องกัน</translation> <translation id="4443536555189480885">&ความช่วยเหลือ</translation> <translation id="4444304522807523469">เข้าถึงเครื่องสแกนเอกสารที่เชื่อมต่อผ่าน USB หรือบนเครือข่าย LAN</translation> +<translation id="4445559854264555037">หากไม่เห็นอุปกรณ์ของคุณ <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">มิเรอร์</translation> <translation id="4447465454292850432">แบตเตอรี่:</translation> <translation id="4449935293120761385">เกี่ยวกับการป้อนอัตโนมัติ</translation> @@ -2632,6 +2647,7 @@ <translation id="485316830061041779">เยอรมัน</translation> <translation id="4856478137399998590">บริการดาต้าบนมือถือของคุณเปิดใช้งานและพร้อมทำงานแล้ว</translation> <translation id="4858913220355269194">ฟริทซ์</translation> +<translation id="4860565041166337978">อนุญาตให้ Download Manager ของระบบจัดการการดาวน์โหลดในกรณีที่ทำได้</translation> <translation id="48607902311828362">โหมดใช้งานบนเครื่องบิน</translation> <translation id="4861833787540810454">เ&ล่น</translation> <translation id="4862050643946421924">กำลังเพิ่มอุปกรณ์...</translation> @@ -2715,7 +2731,6 @@ <translation id="4977942889532008999">ยืนยันการเข้าถึง</translation> <translation id="4982718461356080574">การซ่อนปุ่มปิดของแท็บที่ไม่ได้ใช้งานเมื่อเรียงเป็นกลุ่ม</translation> <translation id="498294082491145744">เปลี่ยนการตั้งค่าที่ควบคุมสิทธิ์ของเว็บไซต์ในการเข้าถึงคุณลักษณะอย่างเช่นคุกกี้, JavaScript, ปลั๊กอิน, ตำแหน่งทางภูมิศาสตร์, ไมโครโฟน, กล้องถ่ายรูป ฯลฯ</translation> -<translation id="4984329823325527157">API แหล่งที่มาของสื่อ</translation> <translation id="4988526792673242964">หน้า</translation> <translation id="4988792151665380515">ไม่สามารถส่งออกคีย์สาธารณะ</translation> <translation id="49896407730300355">หมุน&ทวนเข็มนาฬิกา</translation> @@ -2904,7 +2919,6 @@ <translation id="5268606875983318825">PPAPI (นอกกระบวนการ)</translation> <translation id="526926484727016706">ทำให้มีการปฏิเสธ iframe ทั้งหมดจากสิทธิ์ทั้งหมดโดยค่าเริ่มต้น การให้สิทธิ์เฉพาะสำหรับ iframe อาจเกี่ยวข้องกับการแสดงรายชื่อของสิทธิ์เหล่านี้เป็นค่าแอตทริบิวต์ใหม่ของ iframe</translation> <translation id="5269977353971873915">การพิมพ์ล้มเหลว</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" จะสามารถอ่านไฟล์รูปภาพ วิดีโอ และเสียงในโฟลเดอร์ที่เลือกไว้</translation> <translation id="5271247532544265821">สลับระหว่างโหมดภาษาจีนตัวย่อ/ตัวเต็ม</translation> <translation id="5271549068863921519">บันทึกรหัสผ่าน</translation> <translation id="5273628206174272911">การนำทางของประวัติแบบทดลองเพื่อเป็นการตอบสนองการเลื่อนในแนวนอน</translation> @@ -2941,6 +2955,7 @@ <translation id="5316716239522500219">แสดงผลบนหน้าจอ</translation> <translation id="5317780077021120954">บันทึก</translation> <translation id="5319782540886810524">แป้นพิมพ์ภาษาลัตเวีย</translation> +<translation id="532247166573571973">อาจไม่สามารถเข้าถึงเซิร์ฟเวอร์ โปรดลองอีกครั้งในภายหลัง</translation> <translation id="5323213332664049067">ละตินอเมริกา</translation> <translation id="532360961509278431">ไม่สามารถเปิด "$1": $2</translation> <translation id="5324674707192845912">คุณกำลังจะยกเลิกการลงทะเบียน <ph name="DEVICE_TYPE" /> เครื่องนี้กับ Google เพื่อปิดใช้ความสามารถในการค้นหา ล้างข้อมูล และล็อกอุปกรณ์ระยะไกล การดำเนินการนี้จำเป็นต้องรีบูตเครื่อง คุณต้องการดำเนินการต่อไหม</translation> @@ -2993,11 +3008,11 @@ <translation id="5390284375844109566">ฐานข้อมูลที่มีการจัดทำดัชนี</translation> <translation id="5392544185395226057">เปิดใช้งานการสนับสนุนสำหรับ Native Client</translation> <translation id="5393125431335030955">ปลั๊กอินนี้จะทำงานบนเดสก์ท็อปเท่านั้น</translation> -<translation id="5393559999218790205">ปิดใช้เส้นควบคุมเวลาภาพเคลื่อนไหวการจัดวางองค์ประกอบ UI</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> บน <ph name="PEPPER_PLUGIN_DOMAIN" /> ต้องการเข้าถึงคอมพิวเตอร์ของคุณ</translation> <translation id="539755880180803351">ป้อนข้อมูลในเว็บฟอร์มด้วยการคาดคะเนประเภทฟิลด์การป้อนอัตโนมัติเป็นข้อความตัวยึด</translation> <translation id="5397578532367286026">การใช้งานและประวัติของผู้ใช้รายนี้อาจถูกตรวจสอบโดยผู้จัดการ (<ph name="MANAGER_EMAIL" />) บน chrome.com</translation> <translation id="5397794290049113714">คุณ</translation> +<translation id="5398572795982417028">การอ้างอิงหน้าอยู่นอกขอบเขต จำกัดไว้ที่ <ph name="MAXIMUM_PAGE" /> หน้า</translation> <translation id="5398824043967640339"><ph name="COUNT" /> รายการจากเว็บไซต์อื่น</translation> <translation id="5399158067281117682">PIN ไม่ตรงกัน!</translation> <translation id="5400640815024374115">ไม่พบชิป Trusted Platform Module (TPM) หรือถูกปิดการใช้งานไว้</translation> @@ -3017,7 +3032,7 @@ <translation id="5423849171846380976">เปิดอยู่</translation> <translation id="5425470845862293575">เปิดให้ใช้งานระบบแสดงผลแบบอักษร DirectWrite แบบทดลอง</translation> <translation id="5425722269016440406">คุณต้องออนไลน์เพื่อปิด Smart Lock เนื่องจากการตั้งค่านี้ได้ซิงค์กับโทรศัพท์และอุปกรณ์อื่นๆ โปรดเชื่อมต่อเครือข่ายก่อน</translation> -<translation id="5426623592374109001">ใช้ระบบย่อยของภาพเคลื่อนไหวที่แทรกเดิมเป็นภาพเคลื่อนไหวขององค์ประกอบใน UI</translation> +<translation id="5425863515030416387">ลงชื่อเข้าใช้อุปกรณ์ทุกเครื่องได้ง่ายๆ</translation> <translation id="5427459444770871191">หมุน&ตามเข็มนาฬิกา</translation> <translation id="5428105026674456456">สเปน</translation> <translation id="542872847390508405">คุณกำลังเรียกดูในฐานะผู้เยี่ยมชม</translation> @@ -3042,6 +3057,7 @@ <translation id="5451646087589576080">ดู&ข้อมูลเฟรม</translation> <translation id="5453029940327926427">ปิดแท็บ</translation> <translation id="5453632173748266363">ซีริลลิก</translation> +<translation id="5454166040603940656">กับ <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">ไม่ถูกต้อง</translation> <translation id="5457459357461771897">อ่านและลบรูปภาพ เพลง และสื่ออื่นๆ จากคอมพิวเตอร์ของคุณ</translation> <translation id="5457599981699367932">ท่องเว็บในฐานะผู้มาเยือน</translation> @@ -3211,7 +3227,6 @@ <translation id="5708171344853220004">ชื่อหลักของ Microsoft</translation> <translation id="5709885306771508267">อัตราส่วนการบีบนิ้ว</translation> <translation id="5710406368443808765">อ๊ะ! ระบบไม่สามารถจัดเก็บโทเค็นและ ID ของอุปกรณ์</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> ไม่ตอบสนอง ไม่สามารถแคสต์ได้</translation> <translation id="5711983031544731014">ไม่สามารถปลดล็อก โปรดใส่รหัสผ่าน</translation> <translation id="5712966208980506909">หากเปิดใช้ URL ของ Chrome://md-policy จะโหลดหน้านโยบายดีไซน์ Material</translation> <translation id="5715711091495208045">โบรกเกอร์ปลั๊กอิน: <ph name="PLUGIN_NAME" /></translation> @@ -3478,7 +3493,6 @@ <translation id="6111974609785983504">อนุญาตโดยค่าเริ่มต้น</translation> <translation id="6113134669445407638">ปิดใช้ Delay Agnostic AEC ใน WebRTC โปรดใช้หากความล่าช้าของระบบตามที่รายงานน่าเชื่อถือ หรือหากผู้อื่นประสบกับเสียงก้องจากเครื่องของคุณ</translation> <translation id="6116921718742659598">เปลี่ยนการตั้งค่าภาษาและการป้อนข้อมูล</translation> -<translation id="6117536376248197233">ปิดใช้เส้นควบคุมเวลาภาพเคลื่อนไหวขององค์ประกอบในโหมดแสดงภาพ</translation> <translation id="6120205520491252677">ตรึงหน้าเว็บนี้ไว้ที่หน้าจอเริ่ม...</translation> <translation id="6122081475643980456">กำลังมีการควบคุมการเชื่อมต่ออินเทอร์เน็ตของคุณ</translation> <translation id="6122093587541546701">อีเมล (ไม่บังคับ):</translation> @@ -3510,6 +3524,7 @@ <translation id="6163522313638838258">ขยายทั้งหมด...</translation> <translation id="6164005077879661055">ไฟล์และข้อมูลในตัวเครื่องทั้งหมดที่เกี่ยวข้องกับผู้ใช้ภายใต้การดูแลจะถูกลบออกอย่างถาวรเมื่อผู้ใช้ภายใต้การดูแลนี้ถูกลบ เว็บไซต์ที่เข้าชมและการตั้งค่าสำหรับผู้ใช้ภายใต้การดูแลนี้อาจจะยังคงมองเห็นได้โดยผู้จัดการที่ <ph name="MANAGEMENT_URL" /></translation> <translation id="6165508094623778733">เรียนรู้เพิ่มเติม</translation> +<translation id="6167008112175207002">บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ ของคุณจะซิงค์กับบัญชี Google เพื่อให้คุณใช้งานได้บนอุปกรณ์ทุกเครื่อง คุณสามารถเปลี่ยนแปลงการตั้งค่านี้ได้ใน <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">คุณลักษณะ "Ok Google" ของฮาร์ดแวร์ที่จำลองขึ้น</translation> <translation id="6175314957787328458">โดเมน GUID ของ Microsoft</translation> <translation id="6178664161104547336">เลือกใบรับรอง</translation> @@ -3713,6 +3728,7 @@ <translation id="648927581764831596">ไม่มีให้ใช้งาน</translation> <translation id="6490936204492416398">ติดตั้งส่วนขยายใหม่จากเว็บสโตร์</translation> <translation id="6492313032770352219">ขนาดของดิสก์:</translation> +<translation id="6498249116389603658">&ทุกภาษาของคุณ</translation> <translation id="6499143127267478107">กำลังแก้ไขปัญหาโฮสต์ในสคริปต์พร็อกซี...</translation> <translation id="6503077044568424649">เข้าชมบ่อยสุด</translation> <translation id="6503256918647795660">แป้นพิมพ์ภาษาฝรั่งเศสสวิส</translation> @@ -3754,7 +3770,6 @@ <translation id="6555432686520421228">ลบบัญชีผู้ใช้ทั้งหมดและรีเซ็ตอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME" /> ของคุณให้เหมือนใหม่</translation> <translation id="6556866813142980365">ทำซ้ำ</translation> <translation id="6557565812667414268">เปิดใช้งานสำหรับจอแสดงผลแบบ DPI สูงเท่านั้น</translation> -<translation id="655845594391856372">แท็บไม่ตอบสนอง ไม่สามารถแคสต์ได้</translation> <translation id="6559580823502247193">(อยู่บนอุปกรณ์นี้แล้ว)</translation> <translation id="6561726789132298588">ป้อน</translation> <translation id="6562437808764959486">กำลังคลายอิมเมจการกู้คืน...</translation> @@ -3855,6 +3870,7 @@ <translation id="6723354935081862304">พิมพ์ไปยัง Google เอกสารและปลายทางในระบบคลาวด์อื่นๆ <ph name="BEGIN_LINK" />ลงชื่อเข้าใช้<ph name="END_LINK" />เพื่อพิมพ์ไปยัง Google Cloud Print</translation> <translation id="6723661294526996303">นำเข้าบุ๊กมาร์กและการตั้งค่า...</translation> <translation id="6723839937902243910">พลังงาน</translation> +<translation id="6725240607822645708">เรียกใช้ IME บนเธรดของตัวมันเอง</translation> <translation id="6725970970008349185">จำนวนตัวเลือกที่จะแสดงต่อหนึ่งหน้า</translation> <translation id="672609503628871915">ดูว่ามีอะไรใหม่</translation> <translation id="6727005317916125192">แผงก่อนหน้า</translation> @@ -3985,12 +4001,11 @@ <translation id="6948736568813450284">สำหรับนักพัฒนาซอฟต์แวร์: ให้ใช้บริการแซนด์บ็อกซ์สำหรับการเรียก API ของ Google Payments</translation> <translation id="6949306908218145636">บุ๊กมาร์กหน้าที่เปิดอยู่...</translation> <translation id="695164542422037736">หากตัวเลือกนี้ถูกเปิดใช้งาน และหากเนื้อหาถูกจัดรูปแบบด้วย background-attachment:fixed พื้นหลังจะมีเลเยอร์ประกอบรวมของตัวเอง</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> จดจำรหัสผ่านของคุณและลงชื่อเข้าใช้ให้คุณในเว็บไซต์ต่างๆ โดยอัตโนมัติบนอุปกรณ์นี้</translation> <translation id="6955446738988643816">ตรวจสอบป๊อปอัป</translation> <translation id="695755122858488207">ปุ่มตัวเลือกที่ไม่ได้เลือก</translation> +<translation id="6960277925159781810">ลงชื่อเข้าใช้บนอุปกรณ์นี้โดยอัตโนมัติ</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">เปิดใช้การซิงค์ผ่านข้อมูลมือถือ</translation> -<translation id="6964308487066031935">ต้องการเพิ่มโฟลเดอร์ลงใน "<ph name="EXTENSION" />" ใช่ไหม</translation> <translation id="6965382102122355670">ตกลง</translation> <translation id="6965648386495488594">พอร์ต</translation> <translation id="6965978654500191972">อุปกรณ์</translation> @@ -4088,7 +4103,6 @@ <translation id="7076293881109082629">กำลังลงชื่อเข้าใช้</translation> <translation id="7077829361966535409">หน้าลงชื่อเข้าใช้ไม่สามารถโหลดโดยใช้การตั้งค่าพร็อกซีในปัจจุบัน โปรด <ph name="GAIA_RELOAD_LINK_START" />ลองลงชื่อเข้าใช้อีกครั้ง<ph name="GAIA_RELOAD_LINK_END" /> หรือใช้<ph name="PROXY_SETTINGS_LINK_START" />การตั้งค่าพร็อกซี<ph name="PROXY_SETTINGS_LINK_END" />อื่นๆ</translation> <translation id="7077872827894353012">ตัวจัดการโปรโตคอลที่ละเว้น</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" จะสามารถอ่านและลบไฟล์รูปภาพ วิดีโอ และเสียงในโฟลเดอร์ที่เลือกไว้</translation> <translation id="708060913198414444">คัด&ลอกที่อยู่ของเสียง</translation> <translation id="708187310695946552">UI ฟองอากาศสำหรับการกู้คืนเซสชัน</translation> <translation id="7082055294850503883">ละเลยสถานะ CapsLock และการป้อนตัวพิมพ์เล็กโดยค่าเริ่มต้น</translation> @@ -4232,6 +4246,8 @@ <translation id="7313804056609272439">วิธีป้อนข้อมูลภาษาเวียดนาม (VNI)</translation> <translation id="7314244761674113881">โฮสต์ SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (ปัจจุบัน)</translation> +<translation id="7321545336522791733">ไม่สามารถเข้าถึงเซิร์ฟเวอร์</translation> +<translation id="7324841169865301118">อนุญาตให้ผู้ใช้เลือกแท็บสำหรับการแชร์เดสก์ท็อป</translation> <translation id="7325437708553334317">ส่วนขยายภาพความคมชัดสูง</translation> <translation id="7326565110843845436">การคลิกด้วยนิ้ว 3 นิ้วบนทัชแพด</translation> <translation id="73289266812733869">ยกเลิกการเลือกแล้ว</translation> @@ -4458,7 +4474,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" ต้องการลบ "<ph name="EXTENSION_NAME" />"</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> แสดงผลในภาษานี้</translation> <translation id="7654941827281939388">ใช้บัญชีนี้ในคอมพิวเตอร์เครื่องนี้อยู่แล้ว</translation> -<translation id="7655165758820095116">ออบเจ็กต์ MediaSource อนุญาตให้ JavaScript ส่งข้อมูลสื่อไปยังองค์ประกอบวิดีโอโดยตรง</translation> <translation id="7658239707568436148">ยกเลิก</translation> <translation id="7659584679870740384">คุณไม่ได้รับอนุญาตให้ใช้อุปกรณ์นี้ โปรดติดต่อผู้ดูแลระบบเพื่อขออนุญาตลงชื่อเข้าใช้</translation> <translation id="7664620655576155379">อุปกรณ์บลูทูธที่ไม่สนับสนุน: "<ph name="DEVICE_NAME" />"</translation> @@ -4589,6 +4604,7 @@ <translation id="7861215335140947162">&ดาวน์โหลด</translation> <translation id="7864539943188674973">ปิดใช้งานบลูทูธ</translation> <translation id="7868891395842935202">เปิดใช้กรอบการทดสอบสำหรับการควบคุมการเข้าถึงการทดสอบต่างๆ เกี่ยวกับ API</translation> +<translation id="7870576007982733437">ใช้ Download Manager ของระบบในกรณีที่ทำได้</translation> <translation id="7870790288828963061">ไม่พบแอปคีออสก์เวอร์ชันใหม่กว่า ไม่มีรายการที่จะอัปเดต โปรดนำ USB สติ๊กออก</translation> <translation id="787150342916295244">การสแกนบัตรเครดิต</translation> <translation id="7874357055309047713">เรียกใช้บนทุกเว็บไซต์เสมอ</translation> @@ -4631,7 +4647,6 @@ <translation id="7918257978052780342">ลงทะเบียน</translation> <translation id="7920092496846849526">คุณได้ถามผู้ปกครองแล้วว่าสามารถเข้าชมหน้านี้ได้ไหม</translation> <translation id="7925285046818567682">กำลังรอ <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> จดจำรหัสผ่านของคุณและลงชื่อเข้าใช้ให้คุณในแอปและเว็บไซต์โดยอัตโนมัติบนอุปกรณ์ต่างๆ</translation> <translation id="7925686952655276919">อย่าใช้ข้อมูลมือถือสำหรับการซิงค์</translation> <translation id="7926906273904422255">ทำเครื่องหมายต้นกำเนิดที่ไม่ปลอดภัยเป็น ไม่ปลอดภัย หรือเป็น "น่าสงสัย"</translation> <translation id="7928710562641958568">ยกเลิกการต่อเชื่อมอุปกรณ์</translation> @@ -4693,7 +4708,6 @@ รักษาไฟล์กุญแจของคุณไว้ในที่ปลอดภัย คุณจะต้องใช้ไฟล์นี้ในการสร้างส่วนขยายรุ่นใหม่</translation> <translation id="799923393800005025">สามารถดูได้</translation> <translation id="7999338963698132743">ตัวจัดการงานใหม่</translation> -<translation id="8000004253404706714">ใช้ระบบย่อยของภาพเคลื่อนไหวที่แทรกเดิมเป็นภาพเคลื่อนไหวขององค์ประกอบในโหมดแสดงภาพ</translation> <translation id="8004582292198964060">เบราว์เซอร์</translation> <translation id="8007030362289124303">แบตเตอรี่ต่ำ</translation> <translation id="8008356846765065031">อินเทอร์เน็ตถูกตัด โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ต</translation> @@ -4822,6 +4836,7 @@ <translation id="8185331656081929126">แสดงการแจ้งเตือนเมื่อตรวจพบเครื่องพิมพ์ใหม่บนเครือข่าย</translation> <translation id="8186609076106987817">เซิร์ฟเวอร์ไม่พบไฟล์</translation> <translation id="8186706823560132848">ซอฟต์แวร์</translation> +<translation id="8188120771410500975">&ตรวจการสะกดคำในช่องข้อความ</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> และอีก <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> รายการ</translation> <translation id="8190193592390505034">กำลังเชื่อมต่อกับ <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">จัดการแอปพลิเคชัน ส่วนขยาย และธีมของคุณ</translation> @@ -5214,6 +5229,7 @@ <translation id="8765985713192161328">จัดการตัวจัดการ...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">ผู้ใช้</translation> +<translation id="8768367823103160496">ล็อกเคอร์เซอร์เมาส์</translation> <translation id="8769662576926275897">รายละเอียดบัตร</translation> <translation id="8770196827482281187">วิธีป้อนข้อมูลภาษาเปอร์เซีย (รูปแบบ ISIRI 2901)</translation> <translation id="8774934320277480003">ขอบบน</translation> @@ -5233,6 +5249,7 @@ <translation id="8795668016723474529">เพิ่มบัตรเครดิต</translation> <translation id="8795916974678578410">หน้าต่างใหม่</translation> <translation id="8798099450830957504">ค่าเริ่มต้น</translation> +<translation id="8799127529310003270">หากเปิดใช้ไว้ การเรียก InputConnection จะทำงานบนเธรดของ IME และการเรียก InputConnection แต่ละครั้งจะสื่อสารกับตัวแสดงผลโดยตรง แทนที่จะเก็บตัวแก้ไขแบบจำลอง</translation> <translation id="8799839487311913894">เปิดใช้การอัปเดตรหัสผ่านในตัวจัดการรหัสผ่านเมื่อส่งแบบฟอร์ม "เปลี่ยนรหัสผ่าน" แล้ว</translation> <translation id="8800004011501252845">แสดงปลายทางสำหรับ</translation> <translation id="8800420788467349919">ระดับเสียง: <ph name="PRECENTAGE" />%</translation> @@ -5258,6 +5275,7 @@ <translation id="8841142799574815336">วิวพอร์ตภาพแบบเฉื่อย</translation> <translation id="884264119367021077">ที่อยู่จัดส่ง</translation> <translation id="8844238624737526720">ใช้การดำเนินงานใหม่ที่ได้รับการเพิ่มประสิทธิภาพของตัวจัดการงาน Chrome</translation> +<translation id="8845001906332463065">ขอความช่วยเหลือ</translation> <translation id="8846141544112579928">กำลังค้นหาแป้นพิมพ์...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">สลับไปใช้โหมดแป้น Shift</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 5b85f85..58e919e 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Bu Sayfaya Yer İşareti Koy...</translation> <translation id="1047956942837015229"><ph name="COUNT" /> öğe siliniyor...</translation> <translation id="1048597748939794622">Tüm katmanlar için etkinleştirmeye zorla</translation> +<translation id="1049795001945932310">&Dil ayarları</translation> <translation id="1049926623896334335">Word belgesi</translation> <translation id="1054153489933238809">Orijinal &Resmi Yeni Sekmede Aç</translation> <translation id="1055806300943943258">Bluetooth ve USB cihazları aranıyor...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Harf çevirisi (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Otomatik ad sunucuları</translation> <translation id="1215411991991485844">Yeni arka plan uygulaması eklendi</translation> +<translation id="1216954813581739968">Masaüstü Paylaşımı İçin sekmesini etkinleştir.</translation> <translation id="121827551500866099">Tüm indirilenleri göster...</translation> <translation id="122082903575839559">Sertifika İmza Algoritması</translation> <translation id="1221024147024329929">PKCS #1 RSA Şifrelemeli MD2</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Otomatik oturum açma başarısız oldu</translation> <translation id="1293556467332435079">Dosyalar</translation> <translation id="1294298200424241932">Güven ayarlarını düzenle:</translation> +<translation id="1295794900245526845">Oturum açmak için <ph name="PASSWORD_MANAGER_BRAND" /> uygulamasıyla kaydedilen hesabınızı seçin</translation> <translation id="1297175357211070620">Hedef</translation> <translation id="1297922636971898492">Google Drive şu anda kullanılamıyor. Google Drive tekrar kullanılabilir olduğunda yükleme işlemi otomatik olarak yeniden başlayacak.</translation> <translation id="1300861494336759522">Windows masaüstü araması yönlendirmesi</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Bu işlem, başlangıç sayfanızı, yeni sekme sayfanızı, arama motorunuzu ve sabit sekmelerinizi sıfırlar. Ayrıca, tüm uzantılar devre dışı bırakılır ve çerezler gibi geçici veriler temizlenir. Yer işaretleriniz, geçmişiniz ve kayıtlı şifreleriniz temizlenmez.</translation> <translation id="1434886155212424586">Ana sayfa Yeni Sekme sayfasıdır</translation> <translation id="1435550882135542937">Uzantı araç çubuğu yeniden tasarımı</translation> +<translation id="1436402875660227532">Not: Bu ayarlar artık bu sistemde kullanılmamaktadır, ancak bunları görüntüleyip düzenlemeye devam edebilirsiniz.</translation> <translation id="1436784010935106834">Kaldırıldı</translation> <translation id="1438632560381091872">Sekmelerin sesini aç</translation> <translation id="1441841714100794440">Vietnamca klavye (Teleks)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Sanal klavye desteğini etkinleştirin.</translation> <translation id="1474079335130556426">Push API'sı için arka plan modunu etkinleştirin. Bu mod, Chrome'un, son pencere kapatıldıktan sonra çalışmaya devam etmesine ve Push API'sı ihtiyaç duyarsa OS başlatılırken açılmasına olanak tanır.</translation> <translation id="1474339897586437869">"<ph name="FILENAME" />" yüklenmedi. Google Drive'ınızda yeterli boş alan yok.</translation> +<translation id="1476607407192946488">&Dil Ayarları</translation> <translation id="1476949146811612304"><ph name="BEGIN_LINK" />Çok amaçlı adres çubuğundan<ph name="END_LINK" /> arama yaparken hangi arama motorunun kullanılacağını ayarlayın.</translation> <translation id="1477301030751268706">Kimlik API'sı Jeton Önbelleği</translation> <translation id="1478340334823509079">Ayrıntılar: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">Bu sayfada, bilgisayarınızda çalışmayan bir Native Client uygulaması kullanılmaktadır.</translation> <translation id="1965328510789761112">Özel bellek</translation> <translation id="1965624977906726414">Özel bir izni yok.</translation> +<translation id="1968720524450620475">Web Bildirimleri için işlem simgelerini etkinleştir.</translation> <translation id="1970746430676306437">Sayfa &bilgisini görüntüle</translation> <translation id="197288927597451399">Sakla</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> indirilemedi.</translation> @@ -909,6 +915,7 @@ <translation id="2344262275956902282">Aday listesi sayfası için - ve = tuşlarını kullan</translation> <translation id="2347476388323331511">Senkronize edilemedi</translation> <translation id="2347991999864119449">Eklenti içeriğinin ne zaman çalıştırılacağını kendim seçeceğim</translation> +<translation id="2348165084656290171">Sesi paylaşmak için bir sekmeyi veya ekranın tamamını seçin.</translation> <translation id="2350182423316644347">Uygulama başlatılıyor...</translation> <translation id="2350796302381711542">Tüm <ph name="PROTOCOL" /> bağlantılarını <ph name="REPLACED_HANDLER_TITLE" /> yerine <ph name="HANDLER_HOSTNAME" /> ana makinesinin açmasına izin verilsin mi?</translation> <translation id="2351266942280602854">Dil ve giriş</translation> @@ -996,6 +1003,7 @@ <translation id="247772113373397749">Çok dilli Kanada klavyesi</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" için Medya Dosya İzinleri</translation> <translation id="2478830106132467213">Bu <ph name="DEVICE_TYPE" /> cihazın kilidini sadece telefon bir kol mesafesi dahilindeyken aç.</translation> +<translation id="247949520305900375">Sesi paylaş</translation> <translation id="2479780645312551899">Bu seferlik tüm eklentileri çalıştır</translation> <translation id="2480626392695177423">Tam/yarım genişlikli noktalama modları arasında geçiş yap</translation> <translation id="2481332092278989943">Rafa ekleyin</translation> @@ -1310,6 +1318,7 @@ <translation id="2889064240420137087">Bağlantıyı şununla aç...</translation> <translation id="2889925978073739256">Korumalı alanda olmayan eklentileri engellemeye devam et</translation> <translation id="2890624088306605051">Sadece senkronize edilmiş ayarları ve verileri al</translation> +<translation id="2890678560483811744">Sayfa sınırlarının dışına başvuru</translation> <translation id="2893168226686371498">Varsayılan tarayıcı</translation> <translation id="289426338439836048">Diğer mobil ağlar...</translation> <translation id="2894745200702272315">"Ok Google" özel kelimesini algılama özelliğinin, donanım bağımlılığı olan deneysel bir sürümünü etkinleştirir.</translation> @@ -1338,7 +1347,6 @@ <translation id="2925966894897775835">E-Tablolar</translation> <translation id="2927017729816812676">Önbellek Depolama Alanı</translation> <translation id="2927657246008729253">Değiştir...</translation> -<translation id="2928415919076124714">Tam Ekranda Araç Çubuğunu Gizle</translation> <translation id="2928526264833629376">Hangouts ile devam et</translation> <translation id="2930644991850369934">Kurtarma görüntüsü indirilirken bir sorun oluştu. Ağ bağlantısı kesildi.</translation> <translation id="293111069139560936">İlişkili, tek ve zaten etkin olan bir pencereye sahip bir raf öğesi tıklandığında, rafın pencereyi simge durumuna küçültmesine izin verir.</translation> @@ -1462,6 +1470,7 @@ <translation id="3117812041123364382">Kayan sanal klavyeyi etkinleştirin/devre dışı bırakın.</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> Yardım</translation> <translation id="3120430004221004537">Şu cihazda belirli bir işlem için yetersiz şifreleme: "<ph name="DEVICE_NAME" />".</translation> +<translation id="3121260210578524273">Web Bildirimleri için işlem düğmelerinde simgeleri etkinleştirin.</translation> <translation id="3121793941267913344">Bu <ph name="IDS_SHORT_PRODUCT_NAME" /> cihazını sıfırla</translation> <translation id="3122162841865761901">Geliştirici Araçları denemeleri</translation> <translation id="3122464029669770682">CPU</translation> @@ -1582,7 +1591,6 @@ <translation id="3289566588497100676">Kolay sembol girişi</translation> <translation id="3289856944988573801">Güncellemeleri kontrol etmek için lütfen Ethernet veya Kablosuz kullanın.</translation> <translation id="3293325348208285494">Hızlı başlangıç</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />", işaretlenen klasörlerdeki resim, video ve ses dosyalarını okuyabilir ve yazabilir.</translation> <translation id="3294437725009624529">Misafir</translation> <translation id="329650768420594634">Paket Uzantı Uyarısı</translation> <translation id="3296763833017966289">Gürcüce</translation> @@ -1640,6 +1648,7 @@ <translation id="3338239663705455570">Slovence klavye</translation> <translation id="3340978935015468852">ayarlar</translation> <translation id="3341703758641437857">Dosya URL'lerine erişime izin ver</translation> +<translation id="3343813173145836998">Bu cihazda kolayca oturum açın</translation> <translation id="3344786168130157628">Erişim noktası adı:</translation> <translation id="3345135638360864351">Bu siteye erişim isteğiniz <ph name="NAME" /> adlı kullanıcıya gönderilemedi. Lütfen tekrar deneyin.</translation> <translation id="3345886924813989455">Desteklenen tarayıcı bulunamadı</translation> @@ -2119,6 +2128,7 @@ <translation id="3996912167543967198">Sıfırlanıyor...</translation> <translation id="3997015411467176489">Deneysel tuval özellikleri</translation> <translation id="40027638859996362">Kelime taşıma</translation> +<translation id="400554499662786523">Sesi paylaşmak için bir sekme seçin.</translation> <translation id="4012550234655138030"><ph name="CLOUD_PRINT_NAME" /> içinde yazıcılar kurun ve yönetin.</translation> <translation id="4014432863917027322">"<ph name="EXTENSION_NAME" />" onarılsın mı?</translation> <translation id="4018133169783460046"><ph name="PRODUCT_NAME" /> için bu dili kullan</translation> @@ -2221,6 +2231,7 @@ <translation id="4180788401304023883">"<ph name="CERTIFICATE_NAME" />" CA sertifikası silinsin mi?</translation> <translation id="418179967336296930">Rusça Fonetik (YaZHert) klavye</translation> <translation id="4181841719683918333">Diller</translation> +<translation id="4187248015940562149">Web sitelerinin etrafınızdaki Bluetooth cihazlara bağlanmasına ve bu cihazları kontrol etmesine izin veren Web Bluetooth'u etkinleştirir.</translation> <translation id="4188026131102273494">Anahtar kelime:</translation> <translation id="4189406272289638749">Bu ayarı <b><ph name="EXTENSION_NAME" /></b> adlı uzantı kontrol ediyor.</translation> <translation id="4193154014135846272">Google dokümanı</translation> @@ -2277,6 +2288,7 @@ <translation id="4268025649754414643">Anahtar Şifreleme</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Sürüm <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Eşleşme yok</translation> <translation id="4274187853770964845">Senkronizasyon hatası: Lütfen Senkronizasyonu durdurup yeniden başlatın.</translation> <translation id="4275830172053184480">Cihazınızı yeniden başlatın</translation> <translation id="4276796043975446927">Chromebox video konferansa hoş geldiniz.</translation> @@ -2346,6 +2358,7 @@ <translation id="4378551569595875038">Bağlanıyor...</translation> <translation id="438122767399415311">Kullanıcı arayüzü yönünü zorla</translation> <translation id="4381849418013903196">İki Nokta</translation> +<translation id="4383192539467954373">Cihazlarda otomatik olarak oturum açın</translation> <translation id="4384652540891215547">Uzantıyı etkinleştir</translation> <translation id="438503109373656455">Şimşek</translation> <translation id="4387554346626014084">Uygulama Başlatıcı senkronizasyonunu etkinleştirin. Bu ayrıca, kullanılabildiğinde Klasörleri de etkinleştirir (OSX dışında)</translation> @@ -2363,6 +2376,7 @@ <translation id="4421932782753506458">Mırnav</translation> <translation id="4422347585044846479">Bu sayfanın yer işaretini düzenle</translation> <translation id="4422428420715047158">Etki Alanı:</translation> +<translation id="4423482519432579560">&Yazım denetimi</translation> <translation id="442477792133831654">Yakınlardaki cihazlarla iletişim</translation> <translation id="4425149324548788773">Drive'ım</translation> <translation id="4428582326923056538">Adobe Flash Player kamera istisnaları farklıdır.</translation> @@ -2377,6 +2391,7 @@ <translation id="444267095790823769">Korunan içerik istisnaları</translation> <translation id="4443536555189480885">&Yardım</translation> <translation id="4444304522807523469">USB üzerinden bağlı veya yerel ağda bulunan doküman tarayıcılara erişme</translation> +<translation id="4445559854264555037">Cihazınızı görmüyor musunuz? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Yansıtılmış</translation> <translation id="4447465454292850432">Pil:</translation> <translation id="4449935293120761385">Otomatik Doldurma hakkında</translation> @@ -2635,6 +2650,7 @@ <translation id="485316830061041779">Almanca</translation> <translation id="4856478137399998590">Mobil veri hizmetiniz etkinleştirildi ve kullanıma hazır</translation> <translation id="4858913220355269194">Futbolcu</translation> +<translation id="4860565041166337978">Uygun durumlarda indirme işlemlerinin sistem indirme yöneticisi tarafından işlenmesine izin verin.</translation> <translation id="48607902311828362">Uçak modu</translation> <translation id="4861833787540810454">&Yürüt</translation> <translation id="4862050643946421924">Cihaz ekleniyor...</translation> @@ -2718,7 +2734,6 @@ <translation id="4977942889532008999">Erişimi Onaylayın</translation> <translation id="4982718461356080574">Yığın modundayken aktif olmayan sekmelerde kapat düğmelerini gizleme</translation> <translation id="498294082491145744">Web sitelerinin çerezler, JavaScript, eklentiler, coğrafi konum, mikrofon, kamera vb. özelliklere erişimini denetleyen ayarlarınızı değiştirme</translation> -<translation id="4984329823325527157">Medya Kaynağı API'sı</translation> <translation id="4988526792673242964">Sayfalar</translation> <translation id="4988792151665380515">Genel anahtar dışa alınamadı.</translation> <translation id="49896407730300355">Saat yönünün &tersine döndür</translation> @@ -2907,7 +2922,6 @@ <translation id="5268606875983318825">PPAPI (işlenmiyor)</translation> <translation id="526926484727016706">Varsayılan olarak tüm iframe'lerin tüm izinlerinin reddedilmesine neden olur. Bir iframe'e ilişkin özel izinlere olanak tanınması, yeni iframe özelliklerinin değerleri olarak bu izinlerin adlarının listelenmesini içerebilir.</translation> <translation id="5269977353971873915">Yazdırma Başarısız</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />", işaretlenen klasörlerdeki resimleri, videoları ve ses dosyalarını okuyabilecek.</translation> <translation id="5271247532544265821">Basitleştirilmiş/Geleneksel Çince modları arasında geçiş yap</translation> <translation id="5271549068863921519">Şifreyi kaydet</translation> <translation id="5273628206174272911">Yatay yönde fazla kaydırma yapıldığında geçmişte deneysel gezinti.</translation> @@ -2944,6 +2958,7 @@ <translation id="5316716239522500219">Monitörleri yansıt</translation> <translation id="5317780077021120954">Kaydet</translation> <translation id="5319782540886810524">Letonca klavye</translation> +<translation id="532247166573571973">Sunucuya ulaşılamıyor olabilir. Daha sonra tekrar deneyin.</translation> <translation id="5323213332664049067">Latin Amerika</translation> <translation id="532360961509278431">"$1" açılamıyor: $2</translation> <translation id="5324674707192845912">Bu <ph name="DEVICE_TYPE" /> cihazının uzaktan bulunmasını, silinmesini ve kilitlenmesini devre dışı bırakmak için cihazın Google'daki kaydını silmek üzeresiniz. Bu işlem, cihazın yeniden başlatılmasını gerektirir. Devam etmek istiyor musunuz?</translation> @@ -2996,11 +3011,11 @@ <translation id="5390284375844109566">Dizine alınmış veritabanları</translation> <translation id="5392544185395226057">Native Client desteğini etkinleştir.</translation> <translation id="5393125431335030955">Bu eklenti yalnızca masaüstünde çalışır.</translation> -<translation id="5393559999218790205">Kullanıcı arayüzünü birleştiren animasyon zaman çizelgelerini devre dışı bırak</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> alanındaki <ph name="PEPPER_PLUGIN_NAME" /> eklentisi bilgisayarınıza erişmek istiyor.</translation> <translation id="539755880180803351">Web formlarında, Otomatik Doldur alan türü tahminlerini yer tutucu metin olarak ek açıklama şeklinde belirtir.</translation> <translation id="5397578532367286026">Bu kullanıcıyla ilgili kullanım ve geçmiş bilgileri, yönetici (<ph name="MANAGER_EMAIL" />) tarafından chrome.com adresinden incelenebilir.</translation> <translation id="5397794290049113714">Siz</translation> +<translation id="5398572795982417028">Sınırların dışında sayfa referansı. Sınır: <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339">Diğer sitelerden <ph name="COUNT" /> çerez</translation> <translation id="5399158067281117682">PIN'ler eşleşmiyor!</translation> <translation id="5400640815024374115">Güvenilir Platform Modülü (TPM) yongası devre dışı bırakıldı veya yok.</translation> @@ -3020,7 +3035,7 @@ <translation id="5423849171846380976">Etkin</translation> <translation id="5425470845862293575">Deneysel DirectWrite yazı tipi oluşturma sisteminin kullanılmasını etkinleştirir.</translation> <translation id="5425722269016440406">Smart Lock, telefonunuz ve diğer cihazlarınız ile senkronize olduğundan bu ayarı kapatmak için çevrimiçi olmanız gerekir. Lütfen önce bir ağa bağlanın.</translation> -<translation id="5426623592374109001">Kullanıcı arayüzünde birleştirilmiş animasyonlar için araya giren eski animasyon alt sistemini kullanın.</translation> +<translation id="5425863515030416387">Cihazlarda kolayca oturum açın</translation> <translation id="5427459444770871191">Saat &Yönünde Döndür</translation> <translation id="5428105026674456456">İspanyolca</translation> <translation id="542872847390508405">Misafir olarak göz atıyorsunuz</translation> @@ -3045,6 +3060,7 @@ <translation id="5451646087589576080">Çerçeve &Bilgilerini Görüntüle</translation> <translation id="5453029940327926427">Sekmeleri kapat</translation> <translation id="5453632173748266363">Kiril</translation> +<translation id="5454166040603940656"><ph name="PROVIDER" /> ile</translation> <translation id="5457113250005438886">Geçersiz</translation> <translation id="5457459357461771897">Bilgisayarınızdaki fotoğrafları, müzikleri ve diğer medyaları okuma ve silme</translation> <translation id="5457599981699367932">Misafir olarak Göz At</translation> @@ -3215,7 +3231,6 @@ <translation id="5708171344853220004">Microsoft Asıl Adı</translation> <translation id="5709885306771508267">Ölçeğe sıkıştır</translation> <translation id="5710406368443808765">Hata! Sistem, cihaz kodunu ve kimliğini depolayamadı.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> yanıt vermiyor. Yayın yapılamıyor.</translation> <translation id="5711983031544731014">Kilit açılamıyor. Şifrenizi girin.</translation> <translation id="5712966208980506909">Etkinleştirilirse, chrome://md-policy URL'si Malzeme Tasarımı politika sayfasını yükler.</translation> <translation id="5715711091495208045">Eklenti Aracısı: <ph name="PLUGIN_NAME" /></translation> @@ -3482,7 +3497,6 @@ <translation id="6111974609785983504">Varsayılan olarak izin verilir</translation> <translation id="6113134669445407638">WebRTC'de Agnostik AEC'yi Geciktirme özelliğini devre dışı bırakın. Bu seçeneği, raporlanan sistem gecikmelerinin çok güvenilir olması veya başkalarının, makinenizden gelen eko sorunu yaşamaları durumunda kullanın.</translation> <translation id="6116921718742659598">Dil ve giriş ayarlarını değiştir</translation> -<translation id="6117536376248197233">Oluşturucularda birleştirici animasyon zaman çizelgelerini devre dışı bırak</translation> <translation id="6120205520491252677">Bu sayfayı Başlangıç ekranına sabitle...</translation> <translation id="6122081475643980456">İnternet bağlantınız kontrol ediliyor</translation> <translation id="6122093587541546701">E-posta (isteğe bağlı):</translation> @@ -3514,6 +3528,7 @@ <translation id="6163522313638838258">Tümünü genişlet...</translation> <translation id="6164005077879661055">Denetlenen bu kullanıcı kaldırıldığında denetlenen kullanıcıyla ilişkilendirilmiş tüm dosyalar ve yerel veriler kalıcı olarak silinir. Yönetici, denetlenen bu kullanıcıya ilişkin ziyaret edilen web sayfaları ve ayarları <ph name="MANAGEMENT_URL" /> adresinden görüntülemeye devam edebilir.</translation> <translation id="6165508094623778733">Daha fazla bilgi edinin</translation> +<translation id="6167008112175207002">Yer işaretleriniz, geçmişiniz, şifreleriniz ve diğer ayarlarınız Google Hesabınızla senkronize edilecek. Böylece, tüm cihazlarınızda bunları kullanabileceksiniz. Bu ayarı <ph name="BEGIN_LINK" /> bölümünden değiştirebilirsiniz.</translation> <translation id="6171550060231646388">Simüle edilmiş donanım "Ok Google" özellikleri</translation> <translation id="6175314957787328458">Microsoft Etki Alanı GUID'si</translation> <translation id="6178664161104547336">Sertifika seç</translation> @@ -3717,6 +3732,7 @@ <translation id="648927581764831596">Hiçbiri mevcut değil</translation> <translation id="6490936204492416398">Web mağazasından yeni uzantı yükle</translation> <translation id="6492313032770352219">Disk üzerindeki boyut:</translation> +<translation id="6498249116389603658">&Tüm dilleriniz</translation> <translation id="6499143127267478107">Proxy komut dosyasındaki ana makine çözümleniyor...</translation> <translation id="6503077044568424649">En çok ziyaret edilenler</translation> <translation id="6503256918647795660">Fransızca (İsviçre) klavye</translation> @@ -3758,7 +3774,6 @@ <translation id="6555432686520421228">Tüm kullanıcı hesaplarını kaldırın ve <ph name="IDS_SHORT_PRODUCT_NAME" /> cihazınızı sıfırlayarak yepyeni hale getirin.</translation> <translation id="6556866813142980365">Yeniden Yap</translation> <translation id="6557565812667414268">Sadece yüksek DPI ekranlar için etkin</translation> -<translation id="655845594391856372">Sekme yanıt vermiyor. Yayın yapılamıyor.</translation> <translation id="6559580823502247193">(bu cihazda zaten mevcut)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Kurtarma görüntüsü ayıklanıyor...</translation> @@ -3859,6 +3874,7 @@ <translation id="6723354935081862304">Google Dokümanlar'a ve diğer bulut (cloud) hedeflerine yazdır. Google Cloud Print'e yazdırmak için <ph name="BEGIN_LINK" />oturum açın<ph name="END_LINK" />.</translation> <translation id="6723661294526996303">Yer işaretlerini ve ayarları içe aktar...</translation> <translation id="6723839937902243910">Güç</translation> +<translation id="6725240607822645708">IME'yi kendi iş parçacığında çalıştır.</translation> <translation id="6725970970008349185">Sayfa başına görüntülenecek aday sayısı</translation> <translation id="672609503628871915">Yenilikleri görüntüle</translation> <translation id="6727005317916125192">Önceki bölme</translation> @@ -3989,12 +4005,11 @@ <translation id="6948736568813450284">Geliştiriciler için: Google Payments API çağrıları için korumalı alan hizmetini kullanın.</translation> <translation id="6949306908218145636">Açık Sayfalara Yer İşareti Koy...</translation> <translation id="695164542422037736">Bu seçenek etkinleştirilirse ve gövde için "background-attachment:fixed" stili belirlenirse, arka planın kendi birleştirilmiş katmanı olur.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" />, şifrelerinizi hatırlar ve bu cihazdan sitelerde otomatik olarak oturum açmanızı sağlar.</translation> <translation id="6955446738988643816">Pop-up'ı İncele</translation> <translation id="695755122858488207">Seçili olmayan radyo düğmesi</translation> +<translation id="6960277925159781810">Bu cihazda otomatik olarak oturum açın</translation> <translation id="696036063053180184">3 Grup (Üst karakter yok)</translation> <translation id="696203921837389374">Mobil veriler üzerinden senkronizasyonu etkinleştir</translation> -<translation id="6964308487066031935">"<ph name="EXTENSION" />" uzantısına klasör eklensin mi?</translation> <translation id="6965382102122355670">Tamam</translation> <translation id="6965648386495488594">Bağlantı noktası</translation> <translation id="6965978654500191972">Cihaz</translation> @@ -4092,7 +4107,6 @@ <translation id="7076293881109082629">Oturum açılıyor</translation> <translation id="7077829361966535409">Oturum açma sayfası, mevcut proxy ayarları kullanılarak yüklenemedi. Lütfen <ph name="GAIA_RELOAD_LINK_START" />tekrar oturum açmayı deneyin<ph name="GAIA_RELOAD_LINK_END" /> veya farklı <ph name="PROXY_SETTINGS_LINK_START" />proxy ayarları<ph name="PROXY_SETTINGS_LINK_END" /> kullanın.</translation> <translation id="7077872827894353012">Göz ardı edilen protokol işleyicileri</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />", işaretlenen klasörlerdeki resimleri, videoları ve ses dosyalarını okuyabilecek ve silebilecek.</translation> <translation id="708060913198414444">Ses adresini k&opyala</translation> <translation id="708187310695946552">Oturum geri yükleme balonu kullanıcı arayüzü</translation> <translation id="7082055294850503883">CapsLock durumunu göz ardı et ve varsayılan olarak küçük harf gir</translation> @@ -4236,6 +4250,8 @@ <translation id="7313804056609272439">Vietnamca giriş yöntemi (VNI)</translation> <translation id="7314244761674113881">SOCKS Ana makine</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (şu andaki)</translation> +<translation id="7321545336522791733">Sunucuya ulaşılamıyor</translation> +<translation id="7324841169865301118">Kullanıcının masaüstü paylaşımı için bir sekme seçebilmesini sağlar.</translation> <translation id="7325437708553334317">Yüksek Kontrast Uzantısı</translation> <translation id="7326565110843845436">Dokunmatik yüzeyde üç parmakla tıklama</translation> <translation id="73289266812733869">Seçili değil</translation> @@ -4462,7 +4478,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />", "<ph name="EXTENSION_NAME" />" uzantısını kaldırmak istiyor.</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> bu dilde görüntüleniyor</translation> <translation id="7654941827281939388">Bu hesap zaten bu bilgisayarda kullanılıyor.</translation> -<translation id="7655165758820095116">MediaSource nesnesi, JavaScript'in, medya verilerini doğrudan bir video öğesine göndermesine olanak sağlar.</translation> <translation id="7658239707568436148">İptal</translation> <translation id="7659584679870740384">Bu cihazı kullanma yetkiniz yok. Oturum açma izni almak için lütfen yöneticiyle iletişim kurun.</translation> <translation id="7664620655576155379">Desteklenmeyen Bluetooth cihazı: "<ph name="DEVICE_NAME" />".</translation> @@ -4593,6 +4608,7 @@ <translation id="7861215335140947162">&İndirilenler</translation> <translation id="7864539943188674973">Bluetooth'u devre dışı bırak</translation> <translation id="7868891395842935202">API denemelerine erişimi kontrol etmek için Deneysel Çerçeve'yi etkinleştirir.</translation> +<translation id="7870576007982733437">Uygun durumlarda sistem indirme yöneticisini kullan.</translation> <translation id="7870790288828963061">Daha yeni bir sürüme sahip herhangi bir Kiosk uygulaması bulunamadı. Güncellenecek hiçbir şey yok. Lütfen USB çubuğunu çıkarın.</translation> <translation id="787150342916295244">Kredi kartı taraması</translation> <translation id="7874357055309047713">Tüm sitelerde her zaman çalıştır</translation> @@ -4635,7 +4651,6 @@ <translation id="7918257978052780342">Kaydol</translation> <translation id="7920092496846849526">Ebeveyninize bu sayfayı ziyaret etmenizin uygun olup olmadığını sordunuz.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> bekleniyor...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" />, şifrelerinizi hatırlar ve tüm cihazlardan uygulamalarda ve sitelerde otomatik olarak oturum açmanızı sağlar.</translation> <translation id="7925686952655276919">Senkronizasyon için mobil veri kullanma</translation> <translation id="7926906273904422255">Güvenli olmayan başlangıç noktalarını güvenli değil veya "şüpheli" olarak işaretleyin.</translation> <translation id="7928710562641958568">Cihazı çıkar</translation> @@ -4697,7 +4712,6 @@ Anahtar dosyanızı güvenli bir yerde saklayın. Uzantınızın yeni sürümlerini oluşturmak için bu dosyaya ihtiyacınız olacak.</translation> <translation id="799923393800005025">Görüntüleyebilir</translation> <translation id="7999338963698132743">Yeni görev yöneticisi</translation> -<translation id="8000004253404706714">Oluşturuculardaki birleştirilmiş animasyonlar için araya giren eski animasyon alt sistemini kullanın.</translation> <translation id="8004582292198964060">Tarayıcı</translation> <translation id="8007030362289124303">Pil Düzeyi Düşük</translation> <translation id="8008356846765065031">İnternet bağlantısı kesildi. Lütfen İnternet bağlantınızı kontrol edin.</translation> @@ -4827,6 +4841,7 @@ <translation id="8185331656081929126">Ağ üzerinde yeni yazıcılar algılandığında bildirim göster</translation> <translation id="8186609076106987817">Sunucu dosyayı bulamadı.</translation> <translation id="8186706823560132848">Yazılım</translation> +<translation id="8188120771410500975">&Metin alanlarında yazım denetimi yap</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> ve <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> tane daha</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> ağına bağlanılıyor</translation> <translation id="8191230140820435481">Uygulamalarınızı, uzantılarınızı ve temalarınızı yönetme</translation> @@ -5220,6 +5235,7 @@ <translation id="8765985713192161328">İşleyicileri yönet...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Kullanıcılar</translation> +<translation id="8768367823103160496">Fare imleci kilidi</translation> <translation id="8769662576926275897">Kart ayrıntıları</translation> <translation id="8770196827482281187">Farsça giriş yöntemi (ISIRI 2901 düzeni)</translation> <translation id="8774934320277480003">Üst kenar boşluğu</translation> @@ -5239,6 +5255,7 @@ <translation id="8795668016723474529">Kredi kartı ekle</translation> <translation id="8795916974678578410">Yeni Pencere</translation> <translation id="8798099450830957504">Varsayılan</translation> +<translation id="8799127529310003270">Etkinleştirilirse InputConnection çağrıları IME iş parçacığında çalıştırılır ve bir kopya düzenleyicisi tutmak yerine her bir InputConnection çağrısı doğrudan oluşturucuyla iletişim kurar.</translation> <translation id="8799839487311913894">"Şifre değiştirme" formu gönderdikten sonra şifre değiştirme yöneticisinde şifre güncellemeyi etkinleştirin.</translation> <translation id="8800004011501252845">Bu adresin hedefleri gösteriliyor:</translation> <translation id="8800420788467349919">Ses Düzeyi: %<ph name="PRECENTAGE" /></translation> @@ -5264,6 +5281,7 @@ <translation id="8841142799574815336">Durağan görsel görüntü alanı.</translation> <translation id="884264119367021077">Gönderim adresi</translation> <translation id="8844238624737526720">Chrome görev yöneticisinin yeni ve optimize edilmiş uygulamasını kullanır.</translation> +<translation id="8845001906332463065">Yardım alın</translation> <translation id="8846141544112579928">Klavye aranıyor...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">ÜstKrkt tuşu mod geçişi</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index ee1609f..8632266 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">Додати цю сторінку до закладок...</translation> <translation id="1047956942837015229">Видалення елементів (<ph name="COUNT" />)…</translation> <translation id="1048597748939794622">Примусово ввімкнено для всіх шарів</translation> +<translation id="1049795001945932310">&Налаштування мови</translation> <translation id="1049926623896334335">Документ Word</translation> <translation id="1054153489933238809">Відкрити оригінальне зображення в новій вкладці</translation> <translation id="1055806300943943258">Пошук пристроїв Bluetooth і USB…</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">Транслітерація (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">Імена серверів – автоматично</translation> <translation id="1215411991991485844">Додано нову фонову програму</translation> +<translation id="1216954813581739968">Увімкнути вкладку для трансляції на комп’ютер.</translation> <translation id="121827551500866099">Показати всі завантаження...</translation> <translation id="122082903575839559">Алгоритм підпису сертифіката</translation> <translation id="1221024147024329929">PKCS #1 MD2 із шифруванням RSA</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">Помилка автоматичного входу</translation> <translation id="1293556467332435079">Файли</translation> <translation id="1294298200424241932">Редагувати налаштування довіри:</translation> +<translation id="1295794900245526845">Виберіть обліковий запис, збережений за допомогою <ph name="PASSWORD_MANAGER_BRAND" /></translation> <translation id="1297175357211070620">Місце призначення</translation> <translation id="1297922636971898492">Диск Google зараз недоступний. Завантаження автоматично відновиться після повторного під’єднання до Google Диска.</translation> <translation id="1300861494336759522">Переспрямування пошукових запитів із комп’ютера Windows</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">Стартову сторінку, сторінку нової вкладки, пошукову систему та закріплені вкладки буде скинуто. Також буде вимкнено всі розширення та видалено тимчасові дані, як-от файли cookie. Історія закладок і збережені паролі не видалятимуться.</translation> <translation id="1434886155212424586">Домашня сторінка – це сторінка нової вкладки</translation> <translation id="1435550882135542937">Новий дизайн панелі інструментів розширень</translation> +<translation id="1436402875660227532">Примітка. Ці налаштування більше не використовуються в цій системі, але ви все ще можете переглядати та змінювати їх.</translation> <translation id="1436784010935106834">Видалено</translation> <translation id="1438632560381091872">Увімкнути звук на вкладках</translation> <translation id="1441841714100794440">В’єтнамська клавіатура (телекс)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">Увімкнути підтримку віртуальної клавіатури.</translation> <translation id="1474079335130556426">Увімкнути фоновий режим для Push API. Chrome працюватиме, навіть коли ви закриєте всі вікна, і відкриватиметься під час запуску ОС, якщо він потрібен для Push API.</translation> <translation id="1474339897586437869">Файл "<ph name="FILENAME" />" не додано. Замало вільного місця на Google Диску.</translation> +<translation id="1476607407192946488">&Налаштування мови</translation> <translation id="1476949146811612304">Налаштувати, яку пошукову систему використовувати під час пошуку з <ph name="BEGIN_LINK" />універсального вікна пошуку<ph name="END_LINK" />.</translation> <translation id="1477301030751268706">Кеш маркера API ідентифікації</translation> <translation id="1478340334823509079">Деталі: <ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">На цій сторінці використовується програма Native Client, яка не працює на вашому комп’ютері.</translation> <translation id="1965328510789761112">Приватна пам’ять</translation> <translation id="1965624977906726414">Спеціальні дозволи не потрібні.</translation> +<translation id="1968720524450620475">Увімкнути командні значки для веб-сповіщень.</translation> <translation id="1970746430676306437">Переглянути &інформацію про сторінку</translation> <translation id="197288927597451399">Зберегти</translation> <translation id="1973491249112991739">Помилка завантаження плагіна <ph name="PLUGIN_NAME" />.</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">Використовувати клавіші "-" і "=" для гортання списку кандидатів</translation> <translation id="2347476388323331511">Не вдалося синхронізувати</translation> <translation id="2347991999864119449">Питати дозволу на запуск вмісту плагінів</translation> +<translation id="2348165084656290171">Щоб поділитись аудіо, виберіть вкладку або весь екран.</translation> <translation id="2350182423316644347">Ініціалізація програми…</translation> <translation id="2350796302381711542">Дозволити обробнику <ph name="HANDLER_HOSTNAME" /> відкривати всі посилання протоколу <ph name="PROTOCOL" /> замість обробника <ph name="REPLACED_HANDLER_TITLE" />?</translation> <translation id="2351266942280602854">Мова та способи введення</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">Канадська клавіатура (багатомовна)</translation> <translation id="2478176599153288112">Дозволи медіа-файлу для розширення "<ph name="EXTENSION" />"</translation> <translation id="2478830106132467213">Розблоковувати цей <ph name="DEVICE_TYPE" />, лише коли телефон розташовано на відстані витягнутої руки.</translation> +<translation id="247949520305900375">Поділитись аудіо</translation> <translation id="2479780645312551899">Запустити всі плагіни цього разу</translation> <translation id="2480626392695177423">Переключити режим ширини пунктуації (повний/половинний)</translation> <translation id="2481332092278989943">Додати на полицю</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">Відкрити посилання за допомогою...</translation> <translation id="2889925978073739256">Продовжити блокувати плагіни з неізольованим програмним середовищем</translation> <translation id="2890624088306605051">Отримувати лише синхронізовані налаштування та дані</translation> +<translation id="2890678560483811744">Сторінка поза діапазоном</translation> <translation id="2893168226686371498">Веб-переглядач за умовчанням</translation> <translation id="289426338439836048">Інша мобільна мережа...</translation> <translation id="2894745200702272315">Вмикає експериментальну версію функцій виявлення команд швидкого запуску "Ok Google", яка залежить від апаратного забезпечення.</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">Таблиці</translation> <translation id="2927017729816812676">Кеш-пам’ять</translation> <translation id="2927657246008729253">Змінити...</translation> -<translation id="2928415919076124714">Ховати панель інструментів у повноекранному режимі</translation> <translation id="2928526264833629376">Перейти в Hangouts</translation> <translation id="2930644991850369934">Під час завантаження образу для відновлення виникла проблема. З’єднання з мережею втрачено.</translation> <translation id="293111069139560936">Дозволити полиці згортати вікно, якщо натиснуто елемент полиці, який має лише одне, уже активне вікно, пов’язане з ним.</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">Вмикається або вимикається плаваюча віртуальна клавіатура.</translation> <translation id="3118319026408854581">Довідка <ph name="PRODUCT_NAME" /></translation> <translation id="3120430004221004537">Недостатнє шифрування для цієї операції на пристрої <ph name="DEVICE_NAME" />.</translation> +<translation id="3121260210578524273">Увімкнути значки командних кнопок для веб-сповіщень.</translation> <translation id="3121793941267913344">Скинути налаштування цього пристрою <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> <translation id="3122162841865761901">Експерименти в Інструментах розробника</translation> <translation id="3122464029669770682">ЦП</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">Введення простих символів</translation> <translation id="3289856944988573801">Щоб перевірити наявність оновлень, скористайтеся мережею Ethernet чи Wi-Fi.</translation> <translation id="3293325348208285494">Швидко спочатку</translation> -<translation id="3293894718455402932">Розширення "<ph name="EXTENSION" />" зможе читати й записувати зображення, відео та звукові файли у вибраних розташуваннях.</translation> <translation id="3294437725009624529">Гість</translation> <translation id="329650768420594634">Застереження щодо пакування розширення</translation> <translation id="3296763833017966289">Грузинська</translation> @@ -1638,6 +1646,7 @@ <translation id="3338239663705455570">Словенська розкладка</translation> <translation id="3340978935015468852">налаштування</translation> <translation id="3341703758641437857">Надавати доступ до URL-адрес файлу</translation> +<translation id="3343813173145836998">Легко входьте в обліковий запис на цьому пристрої</translation> <translation id="3344786168130157628">Ім’я точки доступу:</translation> <translation id="3345135638360864351">Не вдалося надіслати запит на доступ до цього сайту користувачеві <ph name="NAME" />. Повторіть спробу.</translation> <translation id="3345886924813989455">Не знайдено жодного веб-переглядача, який підтримується</translation> @@ -2117,6 +2126,7 @@ <translation id="3996912167543967198">Скидання…</translation> <translation id="3997015411467176489">Експериментальні функції canvas</translation> <translation id="40027638859996362">Перенести слово</translation> +<translation id="400554499662786523">Щоб поділитись аудіо, виберіть вкладку.</translation> <translation id="4012550234655138030">Налаштувати принтери чи керувати ними в <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="4014432863917027322">Відновити розширення <ph name="EXTENSION_NAME" />?</translation> <translation id="4018133169783460046">Відображати <ph name="PRODUCT_NAME" /> цією мовою</translation> @@ -2219,6 +2229,7 @@ <translation id="4180788401304023883">Видалити сертифікат Центру сертифікації "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="418179967336296930">Російська фонетична клавіатура (YaZHert)</translation> <translation id="4181841719683918333">Мови</translation> +<translation id="4187248015940562149">Буде ввімкнено Web Bluetooth. Веб-сайти зможуть під’єднуватися до пристроїв Bluetooth поблизу та керувати ними.</translation> <translation id="4188026131102273494">Ключове слово:</translation> <translation id="4189406272289638749">Розширення <b><ph name="EXTENSION_NAME" /></b> контролює це налаштування.</translation> <translation id="4193154014135846272">Документ Google</translation> @@ -2275,6 +2286,7 @@ <translation id="4268025649754414643">Шифрування ключа</translation> <translation id="4268574628540273656">URL-адреса:</translation> <translation id="4270393598798225102">Версія <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Немає збігів</translation> <translation id="4274187853770964845">Помилка синхронізації. Зупиніть і перезапустіть синхронізацію.</translation> <translation id="4275830172053184480">Перезапустіть пристрій</translation> <translation id="4276796043975446927">Вітаємо в Chromebox для відеоконференцій</translation> @@ -2344,6 +2356,7 @@ <translation id="4378551569595875038">Підключення…</translation> <translation id="438122767399415311">Примусово вмикати напрямок тексту інтерфейсу</translation> <translation id="4381849418013903196">Двокрапка</translation> +<translation id="4383192539467954373">Автоматично входьте в обліковий запис на всіх пристроях</translation> <translation id="4384652540891215547">Активувати розширення</translation> <translation id="438503109373656455">Жокей</translation> <translation id="4387554346626014084">Увімкнути синхронізацію панелі запуску додатків. Також вмикає папки, де це можливо (крім OSX).</translation> @@ -2361,6 +2374,7 @@ <translation id="4421932782753506458">Киця</translation> <translation id="4422347585044846479">Редагувати закладку для цієї сторінки</translation> <translation id="4422428420715047158">Домен:</translation> +<translation id="4423482519432579560">&Перевірка правопису</translation> <translation id="442477792133831654">Обмінюватися даними з пристроями поблизу</translation> <translation id="4425149324548788773">Мій диск</translation> <translation id="4428582326923056538">В Adobe Flash Player використовуються інші винятки для камери.</translation> @@ -2375,6 +2389,7 @@ <translation id="444267095790823769">Винятки для захищеного вмісту</translation> <translation id="4443536555189480885">&Довідка</translation> <translation id="4444304522807523469">Отримувати доступ до сканерів документів, під’єднаних через USB або локальну мережу</translation> +<translation id="4445559854264555037">Не бачите свого пристрою? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Трансляція</translation> <translation id="4447465454292850432">Акумулятор:</translation> <translation id="4449935293120761385">Про автозаповнення</translation> @@ -2633,6 +2648,7 @@ <translation id="485316830061041779">Німецька</translation> <translation id="4856478137399998590">Службу пересилання мобільних даних активовано. Нею можна користуватися</translation> <translation id="4858913220355269194">Футбол</translation> +<translation id="4860565041166337978">Дозволити диспетчеру системних завантажень обробляти завантаження, коли це можливо.</translation> <translation id="48607902311828362">Режим польоту</translation> <translation id="4861833787540810454">&Відтворення</translation> <translation id="4862050643946421924">Додавання пристрою…</translation> @@ -2716,7 +2732,6 @@ <translation id="4977942889532008999">Підтвердити доступ</translation> <translation id="4982718461356080574">Кнопка "Закрити" на неактивних вкладках ховається, коли вони накладаються</translation> <translation id="498294082491145744">Змінювати налаштування, які контролюють доступ веб-сайтів до файлів cookie, сценаріїв JavaScript, плагінів, даних геолокації, мікрофона, камери тощо.</translation> -<translation id="4984329823325527157">API Media Source</translation> <translation id="4988526792673242964">Сторінки</translation> <translation id="4988792151665380515">Не вдалося експортувати відкритий ключ.</translation> <translation id="49896407730300355">Повернути п&роти годинникової стрілки</translation> @@ -2905,7 +2920,6 @@ <translation id="5268606875983318825">PPAPI (поза процесом)</translation> <translation id="526926484727016706">За умовчанням відхилятимуться всі дозволи для елементів iframe. Якщо надати елементу iframe якісь дозволи, їх може бути додано як значення нових атрибутів елемента iframe.</translation> <translation id="5269977353971873915">Помилка друку</translation> -<translation id="5270884342523754894">Розширення "<ph name="EXTENSION" />" зможе читати зображення, відео та звукові файли у вибраних розташуваннях.</translation> <translation id="5271247532544265821">Переключити режим китайська спрощена/традиційна</translation> <translation id="5271549068863921519">Зберегти пароль</translation> <translation id="5273628206174272911">Експериментальна навігація в історії за допомогою горизонтального прокручування.</translation> @@ -2942,6 +2956,7 @@ <translation id="5316716239522500219">Дбулювати зображення на моніторах</translation> <translation id="5317780077021120954">Зберегти</translation> <translation id="5319782540886810524">Латвійська розкладка</translation> +<translation id="532247166573571973">Можливо, сервер недоступний. Спробуйте пізніше.</translation> <translation id="5323213332664049067">латиноамериканська</translation> <translation id="532360961509278431">Неможливо відкрити "$1": $2</translation> <translation id="5324674707192845912">Ви збираєтеся скасувати реєстрацію цього <ph name="DEVICE_TYPE" /> у Google, щоб вимкнути можливість віддалено знаходити та блокувати пристрій, а також стирати дані на ньому. Для цього потрібне перезавантаження. Продовжити?</translation> @@ -2994,11 +3009,11 @@ <translation id="5390284375844109566">Проіндексована база даних</translation> <translation id="5392544185395226057">Увімкнути підтримку для Native Client.</translation> <translation id="5393125431335030955">Цей плагін працює лише на комп’ютері.</translation> -<translation id="5393559999218790205">Вимкнути часові шкали для скомпонованих анімацій інтерфейсу</translation> <translation id="5396126354477659676">Плагін <ph name="PEPPER_PLUGIN_NAME" /> у домені <ph name="PEPPER_PLUGIN_DOMAIN" /> хоче отримати доступ до вашого комп’ютера.</translation> <translation id="539755880180803351">Додає примітки до веб-форм за допомогою передбачень типу поля автозаповнення як тексту заповнювача.</translation> <translation id="5397578532367286026">Менеджер (<ph name="MANAGER_EMAIL" />) може переглядати дії й історію цього користувача на chrome.com.</translation> <translation id="5397794290049113714">Ви</translation> +<translation id="5398572795982417028">Сторінка поза діапазоном, максимальна кількість сторінок: <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> з інших сайтів</translation> <translation id="5399158067281117682">PIN-коди не підходять!</translation> <translation id="5400640815024374115">Модуль Trusted Platform Module (TPM) вимкнено або його немає.</translation> @@ -3018,7 +3033,7 @@ <translation id="5423849171846380976">Активовано</translation> <translation id="5425470845862293575">Увімкнути використання експерементальної системи обробки шрифтів DirectWrite.</translation> <translation id="5425722269016440406">Щоб вимкнути Smart Lock, потрібно мати доступ до Інтернету, оскільки це налаштування синхронізується з вашим телефоном та іншими пристроями. Під’єднайтеся до мережі.</translation> -<translation id="5426623592374109001">Використовувати стару підсистему анімацій для скомпонованих анімацій інтерфейсу.</translation> +<translation id="5425863515030416387">Легко входьте в обліковий запис на всіх пристроях</translation> <translation id="5427459444770871191">Повернути &за годинниковою стрілкою</translation> <translation id="5428105026674456456">Іспанська</translation> <translation id="542872847390508405">Ви переглядаєте в гостьовому режимі</translation> @@ -3043,6 +3058,7 @@ <translation id="5451646087589576080">Переглянути &інформацію про фрейм</translation> <translation id="5453029940327926427">Закрити вкладки</translation> <translation id="5453632173748266363">Кирилиця</translation> +<translation id="5454166040603940656">за допомогою <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Недійсні дані</translation> <translation id="5457459357461771897">Читати й видаляти фотографії, музику та інші медіафайли на комп’ютері</translation> <translation id="5457599981699367932">Переглядати в режимі гостя</translation> @@ -3212,7 +3228,6 @@ <translation id="5708171344853220004">Ім'я учасника Microsoft</translation> <translation id="5709885306771508267">Змінення масштабу зведенням і відведенням пальців</translation> <translation id="5710406368443808765">На жаль, системі не вдалося зберегти маркер та ідентифікатор пристрою.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> не відповідає. Не вдається транслювати.</translation> <translation id="5711983031544731014">Не вдалося розблокувати. Введіть пароль.</translation> <translation id="5712966208980506909">Якщо ввімкнути цю опцію, за URL-адресою chrome://md-policy завантажуватиметься сторінка з політикою щодо матеріального дизайну.</translation> <translation id="5715711091495208045">Посередник для плагінів: <ph name="PLUGIN_NAME" /></translation> @@ -3479,7 +3494,6 @@ <translation id="6111974609785983504">Дозволено за умовчанням</translation> <translation id="6113134669445407638">Вимкнути Delay Agnostic AEC у WebRTC. Поставте прапорець, якщо ви довіряєте повідомленням про затримки системи або якщо інші користувачі чують відлуння з вашого пристрою.</translation> <translation id="6116921718742659598">Змінити налаштування мови та введення</translation> -<translation id="6117536376248197233">Вимкнути часові шкали скомпонованих анімацій в інструментах візуалізації.</translation> <translation id="6120205520491252677">Закріпити цю сторінку на екрані запуску...</translation> <translation id="6122081475643980456">Ваше з’єднання з Інтернетом контролюється</translation> <translation id="6122093587541546701">Електронна адреса (необов’язково):</translation> @@ -3511,6 +3525,7 @@ <translation id="6163522313638838258">Розгорнути все...</translation> <translation id="6164005077879661055">Усі файли та локальні дані, пов’язані з контрольованим користувачем, буде назавжди видалено, якщо вилучити цього контрольованого користувача. Менеджер усе одно може бачити веб-сайти, які відвідував цей контрольований користувач, і його налаштування на сторінці <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Докладніше</translation> +<translation id="6167008112175207002">Ваші закладки, історія, паролі й інші налаштування синхронізуватимуться з обліковим записом Google, щоб ви могли користуватися ними на всіх своїх пристроях. Це налаштування можна змінити на сторінці <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Імітовані функціональні характеристики "Ok Google"</translation> <translation id="6175314957787328458">GUID домену Microsoft</translation> <translation id="6178664161104547336">Вибір сертифіката</translation> @@ -3714,6 +3729,7 @@ <translation id="648927581764831596">Нічого не доступно</translation> <translation id="6490936204492416398">Установити нові розширення з веб-магазину</translation> <translation id="6492313032770352219">Місце на диску:</translation> +<translation id="6498249116389603658">&Усі мови</translation> <translation id="6499143127267478107">Визначення хосту в сценарії проксі-сервера...</translation> <translation id="6503077044568424649">Часто відвідувані</translation> <translation id="6503256918647795660">Швейцарська (французька) розкладка</translation> @@ -3755,7 +3771,6 @@ <translation id="6555432686520421228">Видаліть усі облікові записи користувача та відновіть заводські налаштування пристрою <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="6556866813142980365">Повторити</translation> <translation id="6557565812667414268">Увімкнено лише для екранів із високою роздільною здатністю</translation> -<translation id="655845594391856372">Вкладка не відповідає. Не вдається транслювати.</translation> <translation id="6559580823502247193">(уже на цьому пристрої)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Видобування образу для відновлення...</translation> @@ -3856,6 +3871,7 @@ <translation id="6723354935081862304">Друкувати в Документи Google та інші веб-доступні місця призначення. <ph name="BEGIN_LINK" />Увійти<ph name="END_LINK" />, щоб друкувати в службу Google Cloud Print.</translation> <translation id="6723661294526996303">Імпорт закладок і налаштувань...</translation> <translation id="6723839937902243910">Заряд</translation> +<translation id="6725240607822645708">Запустити редактор IME у власному потоці.</translation> <translation id="6725970970008349185">Кількість варіантів, відображених на сторінку</translation> <translation id="672609503628871915">Докладніше про нові функції</translation> <translation id="6727005317916125192">Попередня панель</translation> @@ -3987,12 +4003,11 @@ <translation id="6948736568813450284">Для розробників: використовуйте службу ізольованого програмного забезпечення, щоб викликати API Google Payments.</translation> <translation id="6949306908218145636">Створити закладки для відкритих сторінок…</translation> <translation id="695164542422037736">Якщо цю опцію ввімкнено, а тіло має стиль background-attachment:fixed, фон матиме власний скомпонований шар.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> запам’ятовує ваші паролі й автоматично входить в облікові записи на цьому пристрої.</translation> <translation id="6955446738988643816">Перевірити спливаюче вікно</translation> <translation id="695755122858488207">Невибраний перемикач</translation> +<translation id="6960277925159781810">Автоматично входьте в обліковий запис на цьому пристрої</translation> <translation id="696036063053180184">3-рядна розкладка (без клавіші "Shift")</translation> <translation id="696203921837389374">Увімкнути синхронізацію через мобільний Інтернет</translation> -<translation id="6964308487066031935">Додати папки до розширення "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">ОК</translation> <translation id="6965648386495488594">Порт</translation> <translation id="6965978654500191972">Пристрій</translation> @@ -4090,7 +4105,6 @@ <translation id="7076293881109082629">Вхід</translation> <translation id="7077829361966535409">Не вдалося завантажити сторінку входу за допомогою поточних налаштувань проксі-сервера. <ph name="GAIA_RELOAD_LINK_START" />Спробуйте ввійти знову<ph name="GAIA_RELOAD_LINK_END" /> або скористайтеся іншими <ph name="PROXY_SETTINGS_LINK_START" />налаштуваннями проксі-сервера<ph name="PROXY_SETTINGS_LINK_END" />.</translation> <translation id="7077872827894353012">Проігноровані обробники протоколів</translation> -<translation id="7079038783243627996">Розширення "<ph name="EXTENSION" />" зможе читати й видаляти зображення, відео та звукові файли у вибраних розташуваннях.</translation> <translation id="708060913198414444">Копіювати адресу аудіо</translation> <translation id="708187310695946552">Інтерфейс із підказками для відновлення сеансу</translation> <translation id="7082055294850503883">Ігнорувати режим CapsLock і вводити малими літерами за умовчанням</translation> @@ -4234,6 +4248,8 @@ <translation id="7313804056609272439">Метод введення для в'єтнамської мови (VNI)</translation> <translation id="7314244761674113881">Хост SOCKS</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (поточний)</translation> +<translation id="7321545336522791733">Сервер недоступний</translation> +<translation id="7324841169865301118">Користувач може вибирати вкладку для трансляції на комп’ютер.</translation> <translation id="7325437708553334317">Розширення "Високий контраст"</translation> <translation id="7326565110843845436">Натискання трьома пальцями на сенсорній панелі</translation> <translation id="73289266812733869">Невиділений</translation> @@ -4460,7 +4476,6 @@ <translation id="7650511557061837441">Розширення "<ph name="TRIGGERING_EXTENSION_NAME" />" хоче вилучити розширення "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> відображається цією мовою</translation> <translation id="7654941827281939388">Цей обліковий запис уже використовується на цьому комп’ютері.</translation> -<translation id="7655165758820095116">Об’єкт MediaSource дозволяє JavaScript надсилати медіа-дані просто в елемент відео.</translation> <translation id="7658239707568436148">Скасувати</translation> <translation id="7659584679870740384">Вам не маєте права використовувати цей пристрій. Зверніться до адміністратора, щоб отримати дозвіл на вхід.</translation> <translation id="7664620655576155379">Непідтримуваний пристрій Bluetooth: "<ph name="DEVICE_NAME" />".</translation> @@ -4591,6 +4606,7 @@ <translation id="7861215335140947162">&Завантаження</translation> <translation id="7864539943188674973">Вимкнути Bluetooth</translation> <translation id="7868891395842935202">Вмикає експериментальне середовище, щоб контролювати доступ до експериментів API.</translation> +<translation id="7870576007982733437">Використовувати диспетчер системних завантажень, коли це можливо.</translation> <translation id="7870790288828963061">Новіші версії додатків-терміналів не знайдено. Помилка оновлення. Витягніть носій USB.</translation> <translation id="787150342916295244">Сканування кредитної картки</translation> <translation id="7874357055309047713">Завжди запускати на всіх сайтах</translation> @@ -4633,7 +4649,6 @@ <translation id="7918257978052780342">Зареєструвати</translation> <translation id="7920092496846849526">Ви надіслали одному з батьків запит на перегляд цієї сторінки.</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> запам’ятовує ваші паролі й автоматично входить у додатки й облікові записи на пристроях.</translation> <translation id="7925686952655276919">Не використовувати мобільне передавання даних для синхронізації</translation> <translation id="7926906273904422255">Позначати незахищені джерела як ненадійні або сумнівні.</translation> <translation id="7928710562641958568">Витягнути пристрій</translation> @@ -4695,7 +4710,6 @@ Зберігайте свій файл ключа в безпечному місці. Він знадобиться вам для створення нових версій вашого розширення.</translation> <translation id="799923393800005025">Може переглядати</translation> <translation id="7999338963698132743">Новий диспетчер завдань</translation> -<translation id="8000004253404706714">Використовувати стару підсистему анімацій для скомпонованих анімацій в інструментах візуалізації.</translation> <translation id="8004582292198964060">Переглядач</translation> <translation id="8007030362289124303">Низький заряд батареї</translation> <translation id="8008356846765065031">Утрачено з’єднання з Інтернетом. Перевірте з’єднання.</translation> @@ -4824,6 +4838,7 @@ <translation id="8185331656081929126">Показувати сповіщення, якщо в мережі виявлено нові принтери</translation> <translation id="8186609076106987817">Серверу не вдалося знайти файл.</translation> <translation id="8186706823560132848">Програмне забезпечення</translation> +<translation id="8188120771410500975">&Перевіряти правопис у текстових полях</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />, <ph name="UWS_NAME" /> і ще <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /></translation> <translation id="8190193592390505034">З'єднання з <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Керувати вашими програмами, розширеннями та темами</translation> @@ -5216,6 +5231,7 @@ <translation id="8765985713192161328">Керувати обробниками ...</translation> <translation id="8766796754185931010">Котоері</translation> <translation id="8767072502252310690">Користувачі</translation> +<translation id="8768367823103160496">Блокування курсора миші</translation> <translation id="8769662576926275897">Дані картки</translation> <translation id="8770196827482281187">Метод введення для перської мови (розкладка ISIRI 2901)</translation> <translation id="8774934320277480003">Верхнє поле</translation> @@ -5235,6 +5251,7 @@ <translation id="8795668016723474529">Додати кредитну картку</translation> <translation id="8795916974678578410">Нове вікно</translation> <translation id="8798099450830957504">За умовчанням</translation> +<translation id="8799127529310003270">Якщо ввімкнено, виклики InputConnection запускають потік виконання IME. Щоб не зберігати копію редактора, кожний виклик InputConnection звертається безпосередньо до засобу візуалізації.</translation> <translation id="8799839487311913894">Оновлювати дані в диспетчері паролів після надсилання форми "Змінення пароля".</translation> <translation id="8800004011501252845">Показано місця призначення для</translation> <translation id="8800420788467349919">Гучність: <ph name="PRECENTAGE" />%</translation> @@ -5260,6 +5277,7 @@ <translation id="8841142799574815336">Неактивна візуальна область перегляду.</translation> <translation id="884264119367021077">Адреса доставки</translation> <translation id="8844238624737526720">Використовувати нову оптимізовану версію диспетчера завдань Chrome.</translation> +<translation id="8845001906332463065">Отримати довідку</translation> <translation id="8846141544112579928">Пошук клавіатури…</translation> <translation id="8847988622838149491">Сповіщення щодо USB</translation> <translation id="8848709220963126773">Перемикач режиму клавіші Shift</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 7db791c..e7e54831 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -292,6 +292,7 @@ <translation id="1434696352799406980">Thao tác này sẽ đặt lại trang khởi động, trang tab mới, công cụ tìm kiếm và tab được ghim. Thao tác này cũng sẽ vô hiệu hóa tất cả các tiện ích và xóa dữ liệu tạm thời như cookie. Dấu trang, lịch sử và mật khẩu đã lưu của bạn sẽ không bị xóa.</translation> <translation id="1434886155212424586">Trang chủ là trang Tab mới</translation> <translation id="1435550882135542937">Thiết kế lại thanh công cụ tiện ích</translation> +<translation id="1436402875660227532">Lưu ý: Những cài đặt này không còn được sử dụng trên hệ thống này nữa nhưng bạn vẫn có thể xem và chỉnh sửa.</translation> <translation id="1436784010935106834">Đã xóa</translation> <translation id="1438632560381091872">Bật âm thanh tab</translation> <translation id="1441841714100794440">Bàn phím tiếng Việt (Telex)</translation> @@ -1318,6 +1319,7 @@ <translation id="2889064240420137087">Mở liên kết bằng...</translation> <translation id="2889925978073739256">Tiếp tục chặn plugin không có hộp cát</translation> <translation id="2890624088306605051">Chỉ truy xuất cài đặt và dữ liệu đã đồng bộ hóa</translation> +<translation id="2890678560483811744">Vượt quá phạm vi trang</translation> <translation id="2893168226686371498">Trình duyệt mặc định</translation> <translation id="289426338439836048">Mạng di động khác...</translation> <translation id="2894745200702272315">Bật phiên bản thử nghiệm của tính năng phát hiện từ nóng 'Ok Google' có phần phụ thuộc phần cứng.</translation> @@ -1346,7 +1348,6 @@ <translation id="2925966894897775835">Bảng tính</translation> <translation id="2927017729816812676">Bộ nhớ cache</translation> <translation id="2927657246008729253">Thay đổi...</translation> -<translation id="2928415919076124714">Ẩn thanh công cụ ở chế độ toàn màn hình</translation> <translation id="2928526264833629376">Tiếp tục với Hangouts</translation> <translation id="2930644991850369934">Đã xảy ra sự cố trong quá trình tải xuống hình ảnh khôi phục. Kết nối mạng đã bị mất.</translation> <translation id="293111069139560936">Cho phép giá thu nhỏ cửa sổ nếu mục trên giá được nhấp chuột chỉ có một cửa sổ đã hoạt động được liên kết với mục đó.</translation> @@ -1591,7 +1592,6 @@ <translation id="3289566588497100676">Nhập biểu tượng đơn giản</translation> <translation id="3289856944988573801">Để kiểm tra các cập nhật, hãy sử dụng kết nối Ethernet hoặc Wi-Fi.</translation> <translation id="3293325348208285494">Khởi động nhanh</translation> -<translation id="3293894718455402932">"<ph name="EXTENSION" />" sẽ có thể đọc và ghi hình ảnh, video cũng như các tệp âm thanh trong thư mục đã chọn.</translation> <translation id="3294437725009624529">Khách</translation> <translation id="329650768420594634">Cảnh báo đóng gói tiện ích</translation> <translation id="3296763833017966289">Tiếng Georgia</translation> @@ -1649,6 +1649,7 @@ <translation id="3338239663705455570">Bàn phím tiếng Slovenia</translation> <translation id="3340978935015468852">cài đặt</translation> <translation id="3341703758641437857">Cho phép truy cập vào các URL của tệp</translation> +<translation id="3343813173145836998">Đăng nhập dễ dàng trên thiết bị này</translation> <translation id="3344786168130157628">Tên điểm truy cập:</translation> <translation id="3345135638360864351">Không thể gửi yêu cầu truy cập trang web này của bạn tới <ph name="NAME" />. Vui lòng thử lại.</translation> <translation id="3345886924813989455">Không tìm thấy trình duyệt được hỗ trợ</translation> @@ -2288,6 +2289,7 @@ <translation id="4268025649754414643">Mã hóa Khóa</translation> <translation id="4268574628540273656">URL:</translation> <translation id="4270393598798225102">Phiên bản <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">Không có kết quả phù hợp</translation> <translation id="4274187853770964845">Lỗi đồng bộ hóa: Hãy dừng lại và khởi động lại đồng bộ hóa.</translation> <translation id="4275830172053184480">Khởi động lại thiết bị của bạn</translation> <translation id="4276796043975446927">Chào mừng bạn đến với Chromebox cho hội họp</translation> @@ -2357,6 +2359,7 @@ <translation id="4378551569595875038">Đang kết nối…</translation> <translation id="438122767399415311">Buộc hướng giao diện người dùng</translation> <translation id="4381849418013903196">Dấu hai chấm</translation> +<translation id="4383192539467954373">Tự động đăng nhập trên các thiết bị</translation> <translation id="4384652540891215547">Kích hoạt tiện ích</translation> <translation id="438503109373656455">Ngựa đua Saratoga</translation> <translation id="4387554346626014084">Bật Đồng bộ hóa trình chạy ứng dụng. Thao tác này cũng bật Thư mục khi có thể (không phải OSX).</translation> @@ -2389,6 +2392,7 @@ <translation id="444267095790823769">Ngoại lệ cho nội dung được bảo vệ</translation> <translation id="4443536555189480885">&Trợ giúp</translation> <translation id="4444304522807523469">Truy cập máy quét tài liệu được lắp qua USB hoặc trên mạng cục bộ</translation> +<translation id="4445559854264555037">Không thấy thiết bị của bạn? <ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">Được phản chiếu</translation> <translation id="4447465454292850432">Pin:</translation> <translation id="4449935293120761385">Giới thiệu về Tự động điền</translation> @@ -2647,6 +2651,7 @@ <translation id="485316830061041779">Tiếng Đức</translation> <translation id="4856478137399998590">Dịch vụ dữ liệu di động của bạn đã được kích hoạt và sẵn sàng để sử dụng</translation> <translation id="4858913220355269194">Nam cầu thủ Fritz</translation> +<translation id="4860565041166337978">Cho phép trình quản lý tải xuống của hệ thống xử lý các nội dung tải xuống nếu có.</translation> <translation id="48607902311828362">Chế độ trên máy bay</translation> <translation id="4861833787540810454">&Phát</translation> <translation id="4862050643946421924">Đang thêm thiết bị...</translation> @@ -2730,7 +2735,6 @@ <translation id="4977942889532008999">Xác nhận truy cập</translation> <translation id="4982718461356080574">Ẩn nút đóng trên các tab không hoạt động khi được xếp chồng</translation> <translation id="498294082491145744">Thay đổi cài đặt của bạn để kiểm soát quyền truy cập của trang web vào các tính năng như cookie, JavaScript, plugin, vị trí địa lý, micrô, máy ảnh, v.v.</translation> -<translation id="4984329823325527157">API nguồn phương tiện</translation> <translation id="4988526792673242964">Trang</translation> <translation id="4988792151665380515">Không thể xuất khóa công cộng.</translation> <translation id="49896407730300355">Xoay &ngược chiều kim đồng hồ</translation> @@ -2919,7 +2923,6 @@ <translation id="5268606875983318825">PPAPI (chạy độc lập)</translation> <translation id="526926484727016706">Khiến tất cả iframe bị từ chối mọi quyền theo mặc định. Quá trình cho phép các quyền cụ thể cho iframe có thể liên quan đến việc liệt kê tên của các quyền này dưới dạng giá trị của thuộc tính iframe mới.</translation> <translation id="5269977353971873915">In không thành công</translation> -<translation id="5270884342523754894">"<ph name="EXTENSION" />" sẽ có thể đọc hình ảnh, video cũng như các tệp âm thanh trong thư mục đã chọn.</translation> <translation id="5271247532544265821">Chuyển giữa chế độ tiếng Trung Giản thể/tiếng Trung Phồn thể</translation> <translation id="5271549068863921519">Lưu mật khẩu</translation> <translation id="5273628206174272911">Điều hướng lịch sử thử nghiệm theo thanh cuộn qua ngang.</translation> @@ -3009,11 +3012,11 @@ <translation id="5390284375844109566">Cơ sở dữ liệu được lập chỉ mục</translation> <translation id="5392544185395226057">Bật hỗ trợ cho Native Client.</translation> <translation id="5393125431335030955">Plugin này chỉ hoạt động trên máy tính để bàn.</translation> -<translation id="5393559999218790205">Vô hiệu hóa dòng thời gian hoạt ảnh bộ sắp xếp giao diện người dùng</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME" /> trên <ph name="PEPPER_PLUGIN_DOMAIN" /> muốn truy cập máy tính của bạn.</translation> <translation id="539755880180803351">Chú thích biểu mẫu web với dự đoán loại trường Tự động điền là văn bản giữ chỗ.</translation> <translation id="5397578532367286026">Người quản lý (<ph name="MANAGER_EMAIL" />) trên chrome.com có thể xem lại mức sử dụng và lịch sử của người dùng này.</translation> <translation id="5397794290049113714">Bạn</translation> +<translation id="5398572795982417028">Vượt quá phạm vi trang, giới hạn là <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339"><ph name="COUNT" /> từ trang web khác</translation> <translation id="5399158067281117682">Các mã PIN không khớp!</translation> <translation id="5400640815024374115">Phần Mô-đun nền tảng đáng tin cậy (TPM) đã bị vô hiệu hóa hoặc bị thiếu.</translation> @@ -3033,7 +3036,7 @@ <translation id="5423849171846380976">Đã kích hoạt</translation> <translation id="5425470845862293575">Cho phép sử dụng hệ thống hiển thị phông chữ DirectWrite thử nghiệm.</translation> <translation id="5425722269016440406">Bạn phải trực tuyến để tắt Smart Lock vì cài đặt này được đồng bộ hóa với điện thoại và các thiết bị khác của bạn. Trước tiên, vui lòng kết nối mạng.</translation> -<translation id="5426623592374109001">Sử dụng hệ thống phụ hoạt ảnh xâm nhập cũ cho hoạt ảnh phức hợp trong giao diện người dùng.</translation> +<translation id="5425863515030416387">Đăng nhập dễ dàng trên các thiết bị</translation> <translation id="5427459444770871191">Xoay &theo chiều kim đồng hồ</translation> <translation id="5428105026674456456">Tiếng Tây Ban Nha</translation> <translation id="542872847390508405">Bạn đang duyệt với tư cách khách</translation> @@ -3228,7 +3231,6 @@ <translation id="5708171344853220004">Tên Chính của Microsoft</translation> <translation id="5709885306771508267">Thu hẹp phạm vi</translation> <translation id="5710406368443808765">Rất tiếc! Hệ thống không lưu trữ được mã thông báo và ID của thiết bị này.</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> không phản hồi. Không truyền được.</translation> <translation id="5711983031544731014">Không mở khóa được. Hãy nhập mật khẩu của bạn.</translation> <translation id="5712966208980506909">Nếu được bật, URL chrome://md-policy sẽ tải trang chính sách Material Design.</translation> <translation id="5715711091495208045">Trình môi giới plugin: <ph name="PLUGIN_NAME" /></translation> @@ -3497,7 +3499,6 @@ <translation id="6111974609785983504">Được cho phép theo mặc định</translation> <translation id="6113134669445407638">Tắt Delay Agnostic AEC trong WebRTC. Sử dụng nếu độ trễ hệ thống được báo cáo là rất đáng tin cậy hoặc nếu người khác gặp tiếng vọng từ máy tính của bạn.</translation> <translation id="6116921718742659598">Thay đổi cài đặt ngôn ngữ và phương thức nhập</translation> -<translation id="6117536376248197233">Vô hiệu hóa dòng thời gian hoạt ảnh bộ sắp xếp trong kết xuất đồ họa.</translation> <translation id="6120205520491252677">Ghim trang này vào màn hình Bắt đầu...</translation> <translation id="6122081475643980456">Kết nối Internet của bạn đang bị kiểm soát</translation> <translation id="6122093587541546701">Email (tùy chọn):</translation> @@ -3529,6 +3530,7 @@ <translation id="6163522313638838258">Mở rộng tất cả...</translation> <translation id="6164005077879661055">Tất cả các tệp và dữ liệu trên máy được liên kết với người dùng được giám sát sẽ vĩnh viễn bị xóa khi người dùng được giám sát này bị xóa. Các trang web đã truy cập và các cài đặt của người dùng được giám sát này có thể vẫn hiển thị với người quản lý tại <ph name="MANAGEMENT_URL" />.</translation> <translation id="6165508094623778733">Tìm hiểu thêm</translation> +<translation id="6167008112175207002">Dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ được đồng bộ hóa với Tài khoản Google của bạn để bạn có thể sử dụng chúng trên tất cả thiết bị của mình. Bạn có thể thay đổi cài đặt này trong <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">Tính năng 'Ok Google' cho phần cứng được mô phỏng</translation> <translation id="6175314957787328458">GUID Tên miền của Microsoft</translation> <translation id="6178664161104547336">Chọn một chứng chỉ</translation> @@ -3774,7 +3776,6 @@ <translation id="6555432686520421228">Xóa tất cả tài khoản người dùng và khởi động lại thiết bị <ph name="IDS_SHORT_PRODUCT_NAME" /> của bạn như mới.</translation> <translation id="6556866813142980365">Làm lại</translation> <translation id="6557565812667414268">Chỉ bật cho các màn hình DPI cao</translation> -<translation id="655845594391856372">Tab không phản hồi. Không truyền được.</translation> <translation id="6559580823502247193">(đã có trên thiết bị này)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562437808764959486">Đang trích xuất hình ảnh khôi phục...</translation> @@ -3875,6 +3876,7 @@ <translation id="6723354935081862304">In tới Google Documents và các điểm đến khác trên đám mây. <ph name="BEGIN_LINK" />Đăng nhập<ph name="END_LINK" /> để in tới Google Cloud Print.</translation> <translation id="6723661294526996303">Nhập dấu trang và cài đặt...</translation> <translation id="6723839937902243910">Nguồn</translation> +<translation id="6725240607822645708">Chạy IME trên chuỗi riêng.</translation> <translation id="6725970970008349185">Số lượng ứng viên để hiển thị trên mỗi trang</translation> <translation id="672609503628871915">Xem tính năng mới</translation> <translation id="6727005317916125192">Ngăn trước đó</translation> @@ -4006,12 +4008,11 @@ <translation id="6948736568813450284">Đối với nhà phát triển: sử dụng dịch vụ hộp cát cho cuộc gọi API Google Payments.</translation> <translation id="6949306908218145636">Đánh dấu các trang đang mở...</translation> <translation id="695164542422037736">Nếu bật tùy chọn này và nếu phần thân được đặt kiểu với tệp đính kèm nền:cố định, nền sẽ có lớp kết hợp riêng.</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> ghi nhớ mật khẩu của bạn và tự động đăng nhập bạn vào các trang web trên thiết bị này.</translation> <translation id="6955446738988643816">Kiểm tra cửa sổ bật lên</translation> <translation id="695755122858488207">Nút radio không được chọn</translation> +<translation id="6960277925159781810">Tự động đăng nhập trên thiết bị này</translation> <translation id="696036063053180184">Bộ 3 (Không sử dụng shift)</translation> <translation id="696203921837389374">Bật đồng bộ hóa qua dữ liệu di động</translation> -<translation id="6964308487066031935">Thêm các thư mục vào "<ph name="EXTENSION" />"?</translation> <translation id="6965382102122355670">OK</translation> <translation id="6965648386495488594">Cổng</translation> <translation id="6965978654500191972">Thiết bị</translation> @@ -4110,7 +4111,6 @@ <translation id="7076293881109082629">Đăng nhập</translation> <translation id="7077829361966535409">Không thể tải trang đăng nhập bằng cài đặt proxy hiện tại. Vui lòng <ph name="GAIA_RELOAD_LINK_START" />thử đăng nhập lại<ph name="GAIA_RELOAD_LINK_END" /> hoặc sử dụng <ph name="PROXY_SETTINGS_LINK_START" />cài đặt proxy<ph name="PROXY_SETTINGS_LINK_END" /> khác.</translation> <translation id="7077872827894353012">Trình xử lý giao thức bị bỏ qua</translation> -<translation id="7079038783243627996">"<ph name="EXTENSION" />" sẽ có thể đọc và xóa hình ảnh, video cũng như các tệp âm thanh trong thư mục đã chọn.</translation> <translation id="708060913198414444">S&ao chép địa chỉ âm thanh</translation> <translation id="708187310695946552">Giao diện người dùng trong bong bóng khôi phục phiên</translation> <translation id="7082055294850503883">Bỏ qua trạng thái Chữ viết hoa và nhập chữ thường theo mặc định</translation> @@ -4482,7 +4482,6 @@ <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" muốn xóa "<ph name="EXTENSION_NAME" />".</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> được hiển thị bằng ngôn ngữ này</translation> <translation id="7654941827281939388">Tài khoản này đã đang được sử dụng trên máy tính này.</translation> -<translation id="7655165758820095116">Đối tượng MediaSource cho phép JavaScript trực tiếp gửi dữ liệu phương tiện đến phần tử video.</translation> <translation id="7658239707568436148">Hủy</translation> <translation id="7659584679870740384">Bạn không được phép sử dụng thiết bị này. Vui lòng liên hệ với quản trị viên để có quyền đăng nhập.</translation> <translation id="7664620655576155379">Thiết bị Bluetooth không được hỗ trợ: "<ph name="DEVICE_NAME" />".</translation> @@ -4613,6 +4612,7 @@ <translation id="7861215335140947162">&Tải xuống</translation> <translation id="7864539943188674973">Tắt bluetooth</translation> <translation id="7868891395842935202">Bật Khung thử nghiệm để kiểm soát quyền truy cập vào thử nghiệm API.</translation> +<translation id="7870576007982733437">Sử dụng trình quản lý tải xuống của hệ thống nếu có.</translation> <translation id="7870790288828963061">Không tìm thấy ứng dụng Kiosk nào có phiên bản mới hơn. Không có gì để cập nhật. Vui lòng rút thẻ USB.</translation> <translation id="787150342916295244">Quét thẻ tín dụng</translation> <translation id="7874357055309047713">Luôn chạy trên tất cả các trang web</translation> @@ -4655,7 +4655,6 @@ <translation id="7918257978052780342">Đăng ký</translation> <translation id="7920092496846849526">Bạn đã hỏi cha mẹ mình xem có thể truy cập vào trang này hay không.</translation> <translation id="7925285046818567682">Đang chờ <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> ghi nhớ mật khẩu của bạn và tự động đăng nhập bạn vào các ứng dụng và trang web trên thiết bị.</translation> <translation id="7925686952655276919">Không sử dụng dữ liệu di động để đồng bộ hóa</translation> <translation id="7926906273904422255">Đánh dấu các nguồn gốc không an toàn là không an toàn hoặc "đáng ngờ".</translation> <translation id="7928710562641958568">Tháo thiết bị</translation> @@ -4717,7 +4716,6 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa để tạo phiên bản tiện ích mới của mình.</translation> <translation id="799923393800005025">Có thể xem</translation> <translation id="7999338963698132743">Trình quản lý tác vụ mới</translation> -<translation id="8000004253404706714">Sử dụng hệ thống phụ hoạt ảnh xâm nhập cũ cho hoạt ảnh phức hợp trong kết xuất đồ họa.</translation> <translation id="8004582292198964060">Trình duyệt</translation> <translation id="8007030362289124303">Pin Yếu</translation> <translation id="8008356846765065031">Internet đã bị ngắt kết nối. Vui lòng kiểm tra kết nối Internet của bạn.</translation> @@ -5239,6 +5237,7 @@ <translation id="8765985713192161328">Quản lý trình xử lý ...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">Người dùng</translation> +<translation id="8768367823103160496">Khóa con trỏ chuột</translation> <translation id="8769662576926275897">Chi tiết thẻ</translation> <translation id="8770196827482281187">Phương pháp nhập tiếng Ba Tư (bố cục ISIRI 2901)</translation> <translation id="8774934320277480003">Lề trên</translation> @@ -5258,6 +5257,7 @@ <translation id="8795668016723474529">Thêm thẻ tín dụng</translation> <translation id="8795916974678578410">Cửa sổ mới</translation> <translation id="8798099450830957504">Mặc định</translation> +<translation id="8799127529310003270">Nếu được bật, các cuộc gọi InputConnection sẽ chạy trên chuỗi IME và thay vì duy trì trình chỉnh sửa bản sao, mỗi cuộc gọi InputConnection sẽ kết nối trực tiếp với kết xuất đồ họa.</translation> <translation id="8799839487311913894">Bật cập nhật mật khẩu trong trình quản lý mật khẩu sau khi gửi biểu mẫu "thay đổi mật khẩu".</translation> <translation id="8800004011501252845">Hiển thị điểm đến cho</translation> <translation id="8800420788467349919">Âm lượng: <ph name="PRECENTAGE" />%</translation> @@ -5283,6 +5283,7 @@ <translation id="8841142799574815336">Chế độ xem hình ảnh tĩnh.</translation> <translation id="884264119367021077">Ðịa chỉ giao hàng</translation> <translation id="8844238624737526720">Sử dụng triển khai mới và tối ưu hóa của trình quản lý tác vụ Chrome.</translation> +<translation id="8845001906332463065">Nhận trợ giúp</translation> <translation id="8846141544112579928">Đang tìm kiếm bàn phím...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Chuyển chế độ phím shift</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 3bdf894..ce3cff87 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -7,7 +7,7 @@ <translation id="1007233996198401083">无法连接。</translation> <translation id="1007408791287232274">无法加载设备。</translation> <translation id="1008557486741366299">以后再说</translation> -<translation id="1010366937854368312">添加其他无障碍功能</translation> +<translation id="1010366937854368312">添加其他辅助功能</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{1 个页面无响应}other{多个页面无响应}}</translation> <translation id="1012794136286421601">正在同步您的文档、表格、幻灯片和绘图文件。打开Google云端硬盘应用可在线或离线访问这些文件。</translation> <translation id="1013707859758800957">某个未经过沙盒屏蔽的插件已获准在此页上运行。</translation> @@ -34,6 +34,7 @@ <translation id="1047726139967079566">为此页添加书签...</translation> <translation id="1047956942837015229">正在删除<ph name="COUNT" />项内容…</translation> <translation id="1048597748939794622">已针对所有图层强制启用</translation> +<translation id="1049795001945932310">语言设置(&L)</translation> <translation id="1049926623896334335">Word 文档</translation> <translation id="1054153489933238809">在新标签页中打开原始图片(&I)</translation> <translation id="1055806300943943258">正在搜索蓝牙设备和USB设备…</translation> @@ -134,7 +135,7 @@ <translation id="1185924365081634987">您也可以尝试<ph name="GUEST_SIGNIN_LINK_START" />以访客身份浏览<ph name="GUEST_SIGNIN_LINK_END" />,以便修复该网络错误。</translation> <translation id="1187722533808055681">闲置状态唤醒</translation> <translation id="1188807932851744811">未上传日志。</translation> -<translation id="1189418886587279221">启用无障碍功能,以便更轻松地使用您的设备。</translation> +<translation id="1189418886587279221">启用辅助功能,以便更轻松地使用您的设备。</translation> <translation id="1190144681599273207">抓取此文件将使用约 <ph name="FILE_SIZE" /> 移动数据。</translation> <translation id="11901918071949011">{NUM_FILES,plural, =1{可访问您计算机上存储的 1 个文件}other{可访问您计算机上存储的 # 个文件}}</translation> <translation id="1190855992966397019">启用 AppContainer 锁定。</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">音译(namaste → નમસ્તે)</translation> <translation id="1209796539517632982">自动域名服务器</translation> <translation id="1215411991991485844">已添加新的后台应用</translation> +<translation id="1216954813581739968">启用桌面共享标签页。</translation> <translation id="121827551500866099">显示所有下载内容...</translation> <translation id="122082903575839559">证书签名算法</translation> <translation id="1221024147024329929">PKCS #1,带有 RSA 加密的 MD2</translation> @@ -162,7 +164,7 @@ <translation id="1223853788495130632">您的管理员建议将此设置设为某个特定值。</translation> <translation id="1225177025209879837">正在处理请求…</translation> <translation id="1225211345201532184">栏中第 5 项</translation> -<translation id="1225404570112441414">将此网站添加到文件架,以便随时使用。</translation> +<translation id="1225404570112441414">将此网站添加到任务栏,以便随时使用。</translation> <translation id="1227507814927581609">连接到“<ph name="DEVICE_NAME" />”时身份验证失败。</translation> <translation id="1232569758102978740">无标题</translation> <translation id="1233721473400465416">语言区域</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">自动登录失败</translation> <translation id="1293556467332435079">文件</translation> <translation id="1294298200424241932">修改信任设置:</translation> +<translation id="1295794900245526845">选择您已在 <ph name="PASSWORD_MANAGER_BRAND" /> 中保存的帐户进行登录</translation> <translation id="1297175357211070620">目标打印机</translation> <translation id="1297922636971898492">Google云端硬盘暂时无法使用。Google云端硬盘恢复正常后,系统将自动重新开始上传。</translation> <translation id="1300861494336759522">Windows 桌面搜索重定向</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">这将重置您的启动页、“打开新的标签页”页面、搜索引擎和固定标签页,同时还会停用所有扩展程序并清除临时数据(例如 Cookie)。但是,系统不会清除您的书签、历史记录和保存的密码。</translation> <translation id="1434886155212424586">首页是新标签页</translation> <translation id="1435550882135542937">扩展程序工具栏重新设计功能</translation> +<translation id="1436402875660227532">请注意:此系统上已不再使用这些设置,但您仍可以查看和修改它们。</translation> <translation id="1436784010935106834">已删除</translation> <translation id="1438632560381091872">将所有标签页取消静音</translation> <translation id="1441841714100794440">越南语键盘(电传机)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">启用虚拟键盘支持。</translation> <translation id="1474079335130556426">启用 Push API 后台模式。这样一来,Chrome 将在最后一个窗口关闭后继续运行,并在操作系统启动时一并启动(如果 Push API 需要使用 Chrome)。</translation> <translation id="1474339897586437869">未上传“<ph name="FILENAME" />”,因为您的 Google 云端硬盘没有足够的可用空间。</translation> +<translation id="1476607407192946488">语言设置(&L)</translation> <translation id="1476949146811612304">设置在通过<ph name="BEGIN_LINK" />多功能框<ph name="END_LINK" />搜索时所用的搜索引擎。</translation> <translation id="1477301030751268706">Identity API 令牌缓存</translation> <translation id="1478340334823509079">详细信息:<ph name="FILE_NAME" /></translation> @@ -646,6 +651,7 @@ <translation id="1962233722219655970">此页使用了您的计算机不支持的 Native Client 应用。</translation> <translation id="1965328510789761112">专用内存</translation> <translation id="1965624977906726414">无需特殊权限。</translation> +<translation id="1968720524450620475">为网络通知启用操作图标。</translation> <translation id="1970746430676306437">查看网页信息(&I)</translation> <translation id="197288927597451399">保留</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> 下载失败。</translation> @@ -904,6 +910,7 @@ <translation id="2344262275956902282">用“-”键和“=”键在候选字词列表中翻页</translation> <translation id="2347476388323331511">无法同步</translation> <translation id="2347991999864119449">让我自行选择何时运行插件内容</translation> +<translation id="2348165084656290171">要分享音频,请先选择一个标签页或整个屏幕。</translation> <translation id="2350182423316644347">正在初始化应用…</translation> <translation id="2350796302381711542">允许<ph name="HANDLER_HOSTNAME" />打开所有<ph name="PROTOCOL" />链接(而非<ph name="REPLACED_HANDLER_TITLE" />)?</translation> <translation id="2351266942280602854">语言和输入法</translation> @@ -991,9 +998,10 @@ <translation id="247772113373397749">加拿大多语言键盘</translation> <translation id="2478176599153288112">“<ph name="EXTENSION" />”的媒体文件权限</translation> <translation id="2478830106132467213">仅当配对手机不超过一臂远时,才能用来为此 <ph name="DEVICE_TYPE" /> 解锁。</translation> +<translation id="247949520305900375">分享音频</translation> <translation id="2479780645312551899">运行所有插件(仅限此次)</translation> <translation id="2480626392695177423">切换全角/半角标点模式</translation> -<translation id="2481332092278989943">添加到文件架</translation> +<translation id="2481332092278989943">添加到任务栏</translation> <translation id="2482081114970574549">使用基于 iframe 的登录流程(而非基于 WebView 的流程)。</translation> <translation id="2482878487686419369">通知</translation> <translation id="2485056306054380289">服务器CA证书:</translation> @@ -1304,6 +1312,7 @@ <translation id="2889064240420137087">链接打开方式...</translation> <translation id="2889925978073739256">继续拦截未经过沙盒屏蔽的插件</translation> <translation id="2890624088306605051">只检索同步的设置和数据</translation> +<translation id="2890678560483811744">页面引用超出范围</translation> <translation id="2893168226686371498">默认浏览器</translation> <translation id="289426338439836048">其他移动网络...</translation> <translation id="2894745200702272315">启用具有硬件依赖性的实验版“Ok Google”启动指令检测功能。</translation> @@ -1332,10 +1341,9 @@ <translation id="2925966894897775835">表格</translation> <translation id="2927017729816812676">缓存空间</translation> <translation id="2927657246008729253">更改...</translation> -<translation id="2928415919076124714">采用全屏模式时隐藏工具栏</translation> <translation id="2928526264833629376">继续使用环聊</translation> <translation id="2930644991850369934">下载恢复映像时出现问题。网络连接已断开。</translation> -<translation id="293111069139560936">对于只与一个活动窗口相关联的文件架,允许点击它后将窗口最小化。</translation> +<translation id="293111069139560936">对于只与一个活动窗口相关联的任务栏,允许点击它后将窗口最小化。</translation> <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" />(未成年人帐户)</translation> <translation id="2932883381142163287">举报滥用行为</translation> <translation id="2934522647674136521">使用GPU对网络进行栅格化处理。需要使用实现端绘画。</translation> @@ -1456,6 +1464,7 @@ <translation id="3117812041123364382">启用/停用浮动虚拟键盘。</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" />帮助</translation> <translation id="3120430004221004537">“<ph name="DEVICE_NAME" />”上某项指定操作的加密强度不足。</translation> +<translation id="3121260210578524273">为网络通知启用操作按钮中的图标。</translation> <translation id="3121793941267913344">重置这台<ph name="IDS_SHORT_PRODUCT_NAME" />设备</translation> <translation id="3122162841865761901">开发者工具实验性功能</translation> <translation id="3122464029669770682">CPU</translation> @@ -1576,7 +1585,6 @@ <translation id="3289566588497100676">简单符号输入</translation> <translation id="3289856944988573801">要检查是否有更新,请使用以太网或 WLAN。</translation> <translation id="3293325348208285494">快速启动</translation> -<translation id="3293894718455402932">“<ph name="EXTENSION" />”将能够对所选文件夹中的图片、视频和声音文件进行读写操作。</translation> <translation id="3294437725009624529">访客</translation> <translation id="329650768420594634">打包扩展程序警告</translation> <translation id="3296763833017966289">格鲁吉亚语</translation> @@ -1631,6 +1639,7 @@ <translation id="3338239663705455570">斯洛文尼亚语键盘</translation> <translation id="3340978935015468852">设置</translation> <translation id="3341703758641437857">允许访问文件网址</translation> +<translation id="3343813173145836998">在这台设备上轻松登录</translation> <translation id="3344786168130157628">接入点名称:</translation> <translation id="3345135638360864351">无法将您访问此网站的请求发送给<ph name="NAME" />,请重试。</translation> <translation id="3345886924813989455">没有找到支持的浏览器</translation> @@ -2053,7 +2062,7 @@ <translation id="3924145049010392604">Meta</translation> <translation id="3925247638945319984">您最近没有记录WebRTC日志。</translation> <translation id="3925573269917483990">摄像头:</translation> -<translation id="3925842537050977900">取消固定到文件架</translation> +<translation id="3925842537050977900">取消固定到任务栏</translation> <translation id="3926002189479431949">Smart Lock 的配对手机已更改</translation> <translation id="3927932062596804919">拒绝</translation> <translation id="3930521966936686665">播放设备</translation> @@ -2109,6 +2118,7 @@ <translation id="3996912167543967198">正在重置…</translation> <translation id="3997015411467176489">实验性画布功能</translation> <translation id="40027638859996362">字词移动</translation> +<translation id="400554499662786523">要分享音频,请先选择一个标签页。</translation> <translation id="4012550234655138030">设置或管理“<ph name="CLOUD_PRINT_NAME" />”中的打印机。</translation> <translation id="4014432863917027322">要修复“<ph name="EXTENSION_NAME" />”吗?</translation> <translation id="4018133169783460046">以这种语言显示 <ph name="PRODUCT_NAME" /></translation> @@ -2211,6 +2221,7 @@ <translation id="4180788401304023883">要删除 CA 证书“<ph name="CERTIFICATE_NAME" />”吗?</translation> <translation id="418179967336296930">俄语注音 (YaZHert) 键盘</translation> <translation id="4181841719683918333">语言</translation> +<translation id="4187248015940562149">启用网络蓝牙,允许网站连接到并控制附近的蓝牙设备。</translation> <translation id="4188026131102273494">关键字:</translation> <translation id="4189406272289638749">此设置目前由扩展程序<b><ph name="EXTENSION_NAME" /></b>控制。</translation> <translation id="4193154014135846272">Google 文档</translation> @@ -2267,6 +2278,7 @@ <translation id="4268025649754414643">密钥加密</translation> <translation id="4268574628540273656">网址:</translation> <translation id="4270393598798225102">版本 <ph name="NUMBER" /></translation> +<translation id="4271396100647220620">找不到相符的结果</translation> <translation id="4274187853770964845">发生同步错误:请先停止,然后重新启动同步功能。</translation> <translation id="4275830172053184480">重启您的设备</translation> <translation id="4276796043975446927">欢迎使用 Chromebox 会易</translation> @@ -2282,7 +2294,7 @@ <translation id="4289540628985791613">概述</translation> <translation id="4293409159363387562">仍然恢复</translation> <translation id="4296575653627536209">添加受监管用户</translation> -<translation id="4297391862525234515">文件架在点击后最小化</translation> +<translation id="4297391862525234515">任务栏在点击后最小化</translation> <translation id="42981349822642051">展开</translation> <translation id="4298972503445160211">丹麦语键盘</translation> <translation id="4299273509016391946">启用“打印预览”对话框中的“简化网页”复选框</translation> @@ -2336,6 +2348,7 @@ <translation id="4378551569595875038">正在连接…</translation> <translation id="438122767399415311">强制采用指定的界面语言书写方向</translation> <translation id="4381849418013903196">冒号</translation> +<translation id="4383192539467954373">在所有设备上自动登录</translation> <translation id="4384652540891215547">激活该扩展程序</translation> <translation id="438503109373656455">小马</translation> <translation id="4387554346626014084">启用应用启动器同步。如果有Folders的话,Folders也将一并启用(非OSX)。</translation> @@ -2353,6 +2366,7 @@ <translation id="4421932782753506458">猫咪</translation> <translation id="4422347585044846479">修改此页的书签</translation> <translation id="4422428420715047158">域:</translation> +<translation id="4423482519432579560">拼写检查(&S)</translation> <translation id="442477792133831654">与附近的设备通信</translation> <translation id="4425149324548788773">我的云端硬盘</translation> <translation id="4428582326923056538">Adobe Flash Player 的摄像头例外情况有所不同。</translation> @@ -2367,6 +2381,7 @@ <translation id="444267095790823769">受保护内容例外情况</translation> <translation id="4443536555189480885">帮助(&H)</translation> <translation id="4444304522807523469">使用通过 USB 连接的或本地网络中的文档扫描仪</translation> +<translation id="4445559854264555037">没看到您的设备?<ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">镜像</translation> <translation id="4447465454292850432">电池:</translation> <translation id="4449935293120761385">关于自动填充</translation> @@ -2542,7 +2557,7 @@ <translation id="4737715515457435632">请连接到网络</translation> <translation id="473775607612524610">更新</translation> <translation id="474217410105706308">将此标签页静音</translation> -<translation id="4742746985488890273">固定到文件架</translation> +<translation id="4742746985488890273">固定到任务栏</translation> <translation id="474421578985060416">您阻止</translation> <translation id="4744574733485822359">您的下载操作已完成</translation> <translation id="4746971725921104503">您似乎已在管理具有该名称的用户。您要<ph name="LINK_START" />将<ph name="USER_DISPLAY_NAME" />导入此设备<ph name="LINK_END" />吗?</translation> @@ -2621,6 +2636,7 @@ <translation id="485316830061041779">德语</translation> <translation id="4856478137399998590">您的移动数据服务已激活,可以立即使用</translation> <translation id="4858913220355269194">足球</translation> +<translation id="4860565041166337978">允许系统下载管理器处理下载内容(如适用)。</translation> <translation id="48607902311828362">飞行模式</translation> <translation id="4861833787540810454">播放(&P)</translation> <translation id="4862050643946421924">添加设备…</translation> @@ -2674,7 +2690,7 @@ <translation id="4925542575807923399">此帐户的管理员规定:在多帐户登录会话中,此帐户必须是最先登录的帐户。</translation> <translation id="4927301649992043040">打包扩展程序</translation> <translation id="4927753642311223124">这里没有任何通知,往前走吧。</translation> -<translation id="4929925845384605079">显示“添加到文件架”横幅(提示用户将网络应用添加到文件架或其他平台上的同等位置)。</translation> +<translation id="4929925845384605079">显示“添加到任务栏”横幅(提示用户将网络应用添加到任务栏或其他平台上的同等位置)。</translation> <translation id="4930497775425430760">您之所以看到这条消息,是因为您第一次访问新的网站时需要获得家长的批准。</translation> <translation id="4933484234309072027">嵌入 <ph name="URL" /></translation> <translation id="493571969993549666">添加受监管用户</translation> @@ -2704,7 +2720,6 @@ <translation id="4977942889532008999">确认访问</translation> <translation id="4982718461356080574">在堆叠状态下隐藏不活动标签页上的关闭按钮</translation> <translation id="498294082491145744">更改您用于控制以下内容的设置:网站对 Cookie、JavaScript、插件、地理位置信息、麦克风、摄像头等功能的使用权限。</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">页码</translation> <translation id="4988792151665380515">无法导出公共密钥。</translation> <translation id="49896407730300355">逆时针旋转(&O)</translation> @@ -2890,7 +2905,6 @@ <translation id="5268606875983318825">PPAPI(进程外插件)</translation> <translation id="526926484727016706">启用此项后,默认情况下,将不会向任何 iframe 授予任何权限。如果要向某个 iframe 授予特定权限,可能需要将相应权限的名称指定为新 iframe 属性的值。</translation> <translation id="5269977353971873915">打印失败</translation> -<translation id="5270884342523754894">“<ph name="EXTENSION" />”将能够读取所选文件夹中的图片、视频和声音文件。</translation> <translation id="5271247532544265821">在简体中文/繁体中文模式之间切换</translation> <translation id="5271549068863921519">保存密码</translation> <translation id="5273628206174272911">在发生水平反弹时浏览实验性历史记录。</translation> @@ -2927,6 +2941,7 @@ <translation id="5316716239522500219">镜像显示器</translation> <translation id="5317780077021120954">保存</translation> <translation id="5319782540886810524">拉脱维亚语键盘</translation> +<translation id="532247166573571973">可能无法连接到服务器,请稍后重试。</translation> <translation id="5323213332664049067">拉丁美洲</translation> <translation id="532360961509278431">无法打开“$1”:$2</translation> <translation id="5324674707192845912">您打算取消在 Google 注册此<ph name="DEVICE_TYPE" />,以便停用远程定位、清空和锁定此设备的功能。这需要重新启动此设备。要继续吗?</translation> @@ -2979,11 +2994,11 @@ <translation id="5390284375844109566">索引型数据库</translation> <translation id="5392544185395226057">启用 Native Client 支持。</translation> <translation id="5393125431335030955">该插件只能在桌面模式下运行。</translation> -<translation id="5393559999218790205">停用界面合成器动画时间轴</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> 上的 <ph name="PEPPER_PLUGIN_NAME" /> 想要访问您的计算机。</translation> <translation id="539755880180803351">以占位符文字的形式,使用自动填充的字段类型预测内容对网络表单进行注释。</translation> <translation id="5397578532367286026">管理员 (<ph name="MANAGER_EMAIL" />) 可在 chrome.com 上查看该用户的使用情况和历史记录。</translation> <translation id="5397794290049113714">您</translation> +<translation id="5398572795982417028">页面引用超出范围,上限为 <ph name="MAXIMUM_PAGE" /></translation> <translation id="5398824043967640339">有 <ph name="COUNT" /> 个来自其他网站</translation> <translation id="5399158067281117682">PIN 不正确!</translation> <translation id="5400640815024374115">可信平台模块 (TPM) 芯片已停用或缺失。</translation> @@ -3003,7 +3018,7 @@ <translation id="5423849171846380976">已激活</translation> <translation id="5425470845862293575">启用实验性DirectWrite字体渲染系统。</translation> <translation id="5425722269016440406">您必须联网才能关闭 Smart Lock,因为此设置已同步到您的手机和其他设备。请先连接到网络。</translation> -<translation id="5426623592374109001">针对界面中的合成动画使用旧版干扰性动画子系统。</translation> +<translation id="5425863515030416387">在所有设备上轻松登录</translation> <translation id="5427459444770871191">顺时针旋转(&C)</translation> <translation id="5428105026674456456">西班牙语</translation> <translation id="542872847390508405">您正在以访客身份浏览</translation> @@ -3028,6 +3043,7 @@ <translation id="5451646087589576080">查看框架信息(&I)</translation> <translation id="5453029940327926427">关闭标签页</translation> <translation id="5453632173748266363">西里尔语</translation> +<translation id="5454166040603940656">提供方:<ph name="PROVIDER" /></translation> <translation id="5457113250005438886">无效</translation> <translation id="5457459357461771897">读取和删除您计算机上的照片、音乐和其他媒体</translation> <translation id="5457599981699367932">以访客身份浏览</translation> @@ -3197,7 +3213,6 @@ <translation id="5708171344853220004">Microsoft 主体名称</translation> <translation id="5709885306771508267">双指张合缩放功能</translation> <translation id="5710406368443808765">抱歉!系统未能存储设备令牌和ID。</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> 没有响应,因此无法投射。</translation> <translation id="5711983031544731014">无法解锁,请输入密码。</translation> <translation id="5712966208980506909">启用后,网址 chrome://md-policy 将会加载 Material Design 政策页面。</translation> <translation id="5715711091495208045">插件代理程序:<ph name="PLUGIN_NAME" /></translation> @@ -3322,7 +3337,7 @@ <translation id="5869029295770560994">知道了</translation> <translation id="5869522115854928033">已保存的密码</translation> <translation id="5869741316553135824">允许通过一种新方式将信用卡信息上传到 Google Payments 以同步到所有 Chrome 设备。</translation> -<translation id="5870086504539785141">关闭无障碍功能菜单</translation> +<translation id="5870086504539785141">关闭辅助功能菜单</translation> <translation id="5874045675243596003">严格强制实施模式(如果不能获得哈希值,则为硬错误)</translation> <translation id="5875858680971105888">糟糕!无法导入该受监管用户。请检查您的网络连接,并稍后重试。</translation> <translation id="5880247576487732437">已提供令牌</translation> @@ -3367,7 +3382,7 @@ <translation id="5959471481388474538">网络不可用</translation> <translation id="5963026469094486319">获取主题背景</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> 个(峰值:<ph name="NUM_KILOBYTES_LIVE" />)</translation> -<translation id="5965403572731919803">添加到文件架…</translation> +<translation id="5965403572731919803">添加到任务栏…</translation> <translation id="5965661248935608907">它还能够控制您点击“主页”按钮后或通过多功能框进行搜索时系统显示的页面。</translation> <translation id="5971037678316050792">控制蓝牙适配器状态和配对</translation> <translation id="5972017421290582825">管理 MIDI 设置…</translation> @@ -3464,7 +3479,6 @@ <translation id="6111974609785983504">默认允许</translation> <translation id="6113134669445407638">停用 WebRTC 中的 Delay Agnostic AEC。如果所报告的系统延时非常可信或他人能从您的机器中听到回声,请使用此项设置。</translation> <translation id="6116921718742659598">更改语言和输入设置</translation> -<translation id="6117536376248197233">在渲染程序中停用合成器动画时间轴。</translation> <translation id="6120205520491252677">将此网页固定到“开始”屏幕...</translation> <translation id="6122081475643980456">您的互联网连接受到控制</translation> <translation id="6122093587541546701">电子邮件(可选):</translation> @@ -3496,6 +3510,7 @@ <translation id="6163522313638838258">全部展开...</translation> <translation id="6164005077879661055">删除该受监管用户后,与其相关联的所有文件和本地数据都会被永久删除,但管理员仍可以在 <ph name="MANAGEMENT_URL" /> 上查看该用户的设置和访问过的网站。</translation> <translation id="6165508094623778733">了解详情</translation> +<translation id="6167008112175207002">您的书签、历史记录、密码及其他设置将同步到您的 Google 帐户,以便您在自己的任意设备上使用。如果要更改此设置,请前往 <ph name="BEGIN_LINK" /></translation> <translation id="6171550060231646388">模拟硬件“Ok Google”功能</translation> <translation id="6175314957787328458">Microsoft 域 GUID</translation> <translation id="6178664161104547336">选择证书</translation> @@ -3698,6 +3713,7 @@ <translation id="648927581764831596">没有可用设备</translation> <translation id="6490936204492416398">从网上应用店中安装新的扩展程序</translation> <translation id="6492313032770352219">磁盘大小:</translation> +<translation id="6498249116389603658">所选全部语言(&A)</translation> <translation id="6499143127267478107">正在解析代理脚本中的主机...</translation> <translation id="6503077044568424649">常去网站</translation> <translation id="6503256918647795660">法语(瑞士)键盘</translation> @@ -3739,7 +3755,6 @@ <translation id="6555432686520421228">删除所有用户帐户并重置您的 <ph name="IDS_SHORT_PRODUCT_NAME" /> 设备,使其焕然一新。</translation> <translation id="6556866813142980365">重做</translation> <translation id="6557565812667414268">仅对高 DPI 显示屏启用</translation> -<translation id="655845594391856372">标签页没有响应,因此无法投射。</translation> <translation id="6559580823502247193">(已在此设备中)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="6562437808764959486">正在提取恢复映像...</translation> @@ -3840,6 +3855,7 @@ <translation id="6723354935081862304">使用 Google 文档和其他云端目标进行打印。<ph name="BEGIN_LINK" />登录<ph name="END_LINK" />即可使用 Google 云端打印进行打印。</translation> <translation id="6723661294526996303">导入书签和设置...</translation> <translation id="6723839937902243910">电源</translation> +<translation id="6725240607822645708">在单独的线程中运行 IME。</translation> <translation id="6725970970008349185">每页显示的候选字词数</translation> <translation id="672609503628871915">了解一下新变化</translation> <translation id="6727005317916125192">上一个窗格</translation> @@ -3969,12 +3985,11 @@ <translation id="6948736568813450284">针对开发者:请使用沙盒服务调用 Google Payments API。</translation> <translation id="6949306908218145636">为打开的网页添加书签…</translation> <translation id="695164542422037736">如果启用此选项,并且 Body 样式为 background-attachment:fixed,背景将有专属的合成图层。</translation> -<translation id="6952626679169241027">在这台设备上,<ph name="PASSWORD_MANAGER_BRAND" /> 会记住您的密码,并会让您自动登录到相应网站。</translation> <translation id="6955446738988643816">审查弹出内容</translation> <translation id="695755122858488207">未选中的单选按钮</translation> +<translation id="6960277925159781810">在这台设备上自动登录</translation> <translation id="696036063053180184">3 Set (No shift)</translation> <translation id="696203921837389374">在移动数据网络中启用同步功能</translation> -<translation id="6964308487066031935">要为“<ph name="EXTENSION" />”添加文件夹吗?</translation> <translation id="6965382102122355670">确定</translation> <translation id="6965648386495488594">端口</translation> <translation id="6965978654500191972">设备</translation> @@ -4073,7 +4088,6 @@ <translation id="7076293881109082629">正在登录</translation> <translation id="7077829361966535409">使用当前代理设置无法加载登录页面。请<ph name="GAIA_RELOAD_LINK_START" />尝试重新登录<ph name="GAIA_RELOAD_LINK_END" />,或者使用不同的<ph name="PROXY_SETTINGS_LINK_START" />代理设置<ph name="PROXY_SETTINGS_LINK_END" />。</translation> <translation id="7077872827894353012">已忽略的协议处理程序</translation> -<translation id="7079038783243627996">“<ph name="EXTENSION" />”将能够读取和删除所选文件夹中的图片、视频和声音文件。</translation> <translation id="708060913198414444">复制音频地址(&O)</translation> <translation id="708187310695946552">会话恢复气泡界面</translation> <translation id="7082055294850503883">默认情况下,忽略大写锁定状态并输入小写字母</translation> @@ -4217,6 +4231,8 @@ <translation id="7313804056609272439">越南语输入法 (VNI)</translation> <translation id="7314244761674113881">SOCKS 主机</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" />(当前)</translation> +<translation id="7321545336522791733">无法连接到服务器</translation> +<translation id="7324841169865301118">允许用户选择桌面共享标签页。</translation> <translation id="7325437708553334317">“高反差”扩展程序</translation> <translation id="7326565110843845436">触控板三指点击</translation> <translation id="73289266812733869">未选中</translation> @@ -4366,7 +4382,7 @@ <translation id="7549053541268690807">搜索字典</translation> <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> 下载失败</translation> -<translation id="7551643184018910560">固定到文件架</translation> +<translation id="7551643184018910560">固定到任务栏</translation> <translation id="7553242001898162573">输入您的密码</translation> <translation id="7554791636758816595">打开新的标签页</translation> <translation id="7556033326131260574">Smart Lock 无法验证您的帐户,您需要输入密码才能进入。</translation> @@ -4434,7 +4450,6 @@ <translation id="7650511557061837441">“<ph name="TRIGGERING_EXTENSION_NAME" />”想要移除“<ph name="EXTENSION_NAME" />”。</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" />目前以这种语言显示</translation> <translation id="7654941827281939388">已有人在此计算机上使用此帐户。</translation> -<translation id="7655165758820095116">MediaSource 对象允许 JavaScript 直接向视频元素发送媒体数据。</translation> <translation id="7658239707568436148">取消</translation> <translation id="7659584679870740384">您无权使用此设备。请向管理员申请登录权限。</translation> <translation id="7664620655576155379">不支持的蓝牙设备:“<ph name="DEVICE_NAME" />”。</translation> @@ -4565,6 +4580,7 @@ <translation id="7861215335140947162">下载内容(&D)</translation> <translation id="7864539943188674973">停用蓝牙</translation> <translation id="7868891395842935202">启用可用于控制 API 实验访问权限的实验性框架。</translation> +<translation id="7870576007982733437">使用系统下载管理器(如适用)。</translation> <translation id="7870790288828963061">找不到信息亭模式下的应用的更高版本,因此没有要更新的内容。请拔下 U 盘。</translation> <translation id="787150342916295244">信用卡扫描</translation> <translation id="7874357055309047713">在所有网站上始终运行</translation> @@ -4607,7 +4623,6 @@ <translation id="7918257978052780342">注册</translation> <translation id="7920092496846849526">已向您父母提出允许您访问此网页的请求。</translation> <translation id="7925285046818567682">正在等待 <ph name="HOST_NAME" /> 的响应...</translation> -<translation id="7925425262460550824">在所有设备上,<ph name="PASSWORD_MANAGER_BRAND" /> 都会记住您的密码,并会让您自动登录到相应的应用和网站。</translation> <translation id="7925686952655276919">不使用移动数据进行同步</translation> <translation id="7926906273904422255">将不安全的来源标为“不安全”或“可疑”。</translation> <translation id="7928710562641958568">卸载设备</translation> @@ -4669,7 +4684,6 @@ 请妥善保存您的密钥文件。您还需要使用该文件创建新版扩展程序。</translation> <translation id="799923393800005025">可以查看</translation> <translation id="7999338963698132743">新版任务管理器</translation> -<translation id="8000004253404706714">针对渲染程序中的合成动画使用旧版干扰性动画子系统。</translation> <translation id="8004582292198964060">浏览器</translation> <translation id="8007030362289124303">电池电量低</translation> <translation id="8008356846765065031">网络已断开,请检查您的互联网连接是否正常。</translation> @@ -4798,6 +4812,7 @@ <translation id="8185331656081929126">在网络中检测到新打印机时显示通知</translation> <translation id="8186609076106987817">服务器找不到该文件。</translation> <translation id="8186706823560132848">软件</translation> +<translation id="8188120771410500975">检查文本字段的拼写(&C)</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />、<ph name="UWS_NAME" />以及另外 <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> 个</translation> <translation id="8190193592390505034">正在连接到<ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">管理您的应用、扩展程序和主题背景</translation> @@ -5190,6 +5205,7 @@ <translation id="8765985713192161328">管理处理程序...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">用户</translation> +<translation id="8768367823103160496">鼠标光标锁定</translation> <translation id="8769662576926275897">信用卡详细信息</translation> <translation id="8770196827482281187">波斯语输入法(ISIRI 2901 布局)</translation> <translation id="8774934320277480003">上边距</translation> @@ -5209,6 +5225,7 @@ <translation id="8795668016723474529">添加信用卡</translation> <translation id="8795916974678578410">打开新的窗口</translation> <translation id="8798099450830957504">默认</translation> +<translation id="8799127529310003270">启用后,系统会在 IME 线程中运行 InputConnection 调用(而不会保留副本编辑器),并且每个 InputConnection 调用都将直接与呈现器通信。</translation> <translation id="8799839487311913894">允许在提交“更改密码”表单后通过密码管理器更新密码。</translation> <translation id="8800004011501252845">目前显示的是以下帐户的目标打印机:</translation> <translation id="8800420788467349919">音量:<ph name="PRECENTAGE" />%</translation> @@ -5234,6 +5251,7 @@ <translation id="8841142799574815336">惰化可见视口。</translation> <translation id="884264119367021077">送货地址</translation> <translation id="8844238624737526720">使用经过优化的新版 Chrome 任务管理器。</translation> +<translation id="8845001906332463065">获取帮助</translation> <translation id="8846141544112579928">正在搜索键盘…</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">使用 Shift 键进行模式切换</translation> @@ -5480,7 +5498,7 @@ <translation id="9220525904950070496">移除帐户</translation> <translation id="923467487918828349">显示全部</translation> <translation id="930268624053534560">详细时间戳</translation> -<translation id="932327136139879170">家庭</translation> +<translation id="932327136139879170">首页</translation> <translation id="932508678520956232">无法开始打印。</translation> <translation id="936801553271523408">系统诊断数据</translation> <translation id="93766956588638423">修复扩展程序</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 0cb8e5c..19b32b2e 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -34,6 +34,7 @@ <translation id="1047726139967079566">把此頁加入書籤...</translation> <translation id="1047956942837015229">正在刪除 <ph name="COUNT" /> 個項目...</translation> <translation id="1048597748939794622">強制啟用所有圖層</translation> +<translation id="1049795001945932310">語言設定(&L)</translation> <translation id="1049926623896334335">Word 文件</translation> <translation id="1054153489933238809">在新分頁中開啟原始圖片(&I)</translation> <translation id="1055806300943943258">搜尋藍牙裝置和 USB 裝置...</translation> @@ -154,6 +155,7 @@ <translation id="1208421848177517699">音譯 (namaste → નમસ્તે)</translation> <translation id="1209796539517632982">自動名稱伺服器</translation> <translation id="1215411991991485844">已新增新的背景應用程式</translation> +<translation id="1216954813581739968">允許桌面分享功能一併分享分頁。</translation> <translation id="121827551500866099">顯示所有下載...</translation> <translation id="122082903575839559">憑證簽章演算法</translation> <translation id="1221024147024329929">PKCS #1 MD2 (使用 RSA 加密)</translation> @@ -190,6 +192,7 @@ <translation id="1290223615328246825">自動登入失敗</translation> <translation id="1293556467332435079">檔案</translation> <translation id="1294298200424241932">編輯信任設定:</translation> +<translation id="1295794900245526845">選擇您儲存在 <ph name="PASSWORD_MANAGER_BRAND" /> 中的帳戶來登入</translation> <translation id="1297175357211070620">目的地</translation> <translation id="1297922636971898492">Google 雲端硬碟目前無法提供服務。一旦 Google 雲端硬碟恢復正常運作,上傳作業將會自動重新啟動。</translation> <translation id="1300861494336759522">Windows 桌面搜尋重新導向</translation> @@ -289,6 +292,7 @@ <translation id="1434696352799406980">這項功能會重設您的起始網頁、新分頁、搜尋引擎和固定分頁,同時停用所有擴充功能並清除 Cookie 等暫存資料,但不會清除您的書籤、歷史紀錄和已儲存的密碼。</translation> <translation id="1434886155212424586">首頁是新分頁</translation> <translation id="1435550882135542937">新的擴充功能工具列設計</translation> +<translation id="1436402875660227532">注意:本系統已不再使用這些設定,但您仍可查看及編輯這些設定。</translation> <translation id="1436784010935106834">已移除</translation> <translation id="1438632560381091872">開啟多個分頁音訊</translation> <translation id="1441841714100794440">越南文鍵盤 (電報打字機)</translation> @@ -319,6 +323,7 @@ <translation id="14720830734893704">啟用虛擬鍵盤支援。</translation> <translation id="1474079335130556426">為 Push API 啟用背景模式,讓 Chrome 在最後一個視窗關閉後繼續執行,以及配合作業系統一併啟動 (依 Push API 的要求)。</translation> <translation id="1474339897586437869">您的 Google 雲端硬碟的可用空間不足,因此無法上傳「<ph name="FILENAME" />」。</translation> +<translation id="1476607407192946488">語言設定(&L)</translation> <translation id="1476949146811612304">設定透過<ph name="BEGIN_LINK" />網址列<ph name="END_LINK" />進行搜尋時要使用哪個搜尋引擎。</translation> <translation id="1477301030751268706">Identity API 憑證快取</translation> <translation id="1478340334823509079">詳細資料:<ph name="FILE_NAME" /></translation> @@ -649,6 +654,7 @@ <translation id="1962233722219655970">這個網頁使用無法在您電腦上運行的 Native Client 應用程式。</translation> <translation id="1965328510789761112">專用記憶體</translation> <translation id="1965624977906726414">沒有特殊權限。</translation> +<translation id="1968720524450620475">為網路通知啟用動作圖示。</translation> <translation id="1970746430676306437">檢視網頁資訊(&I)</translation> <translation id="197288927597451399">保留</translation> <translation id="1973491249112991739"><ph name="PLUGIN_NAME" /> 下載失敗。</translation> @@ -908,6 +914,7 @@ <translation id="2344262275956902282">使用 - 鍵與 = 鍵呼叫建議清單</translation> <translation id="2347476388323331511">無法同步處理</translation> <translation id="2347991999864119449">我要自行選擇執行外掛程式內容的時機</translation> +<translation id="2348165084656290171">如要分享音訊,請選取分頁或整個畫面。</translation> <translation id="2350182423316644347">正在初始化應用程式...</translation> <translation id="2350796302381711542">要允許 <ph name="HANDLER_HOSTNAME" /> 取代 <ph name="REPLACED_HANDLER_TITLE" /> 開啟所有<ph name="PROTOCOL" />連結嗎?</translation> <translation id="2351266942280602854">語言和輸入</translation> @@ -995,6 +1002,7 @@ <translation id="247772113373397749">加拿大文 (多語言) 鍵盤</translation> <translation id="2478176599153288112">「<ph name="EXTENSION" />」的媒體檔案權限</translation> <translation id="2478830106132467213">當您的手機在距離範圍之內 (一個手臂的長度) 時才解鎖這台 <ph name="DEVICE_TYPE" />。</translation> +<translation id="247949520305900375">分享音訊</translation> <translation id="2479780645312551899">執行所有外掛程式 (僅限這次)</translation> <translation id="2480626392695177423">切換全形/半形標點符號模式</translation> <translation id="2481332092278989943">加到檔案櫃</translation> @@ -1309,6 +1317,7 @@ <translation id="2889064240420137087">使用其他程式開啟連結...</translation> <translation id="2889925978073739256">繼續封鎖無沙箱防護的外掛程式</translation> <translation id="2890624088306605051">只擷取已同步處理的設定和資料</translation> +<translation id="2890678560483811744">參照的網頁超出範圍</translation> <translation id="2893168226686371498">預設瀏覽器</translation> <translation id="289426338439836048">其他行動網路...</translation> <translation id="2894745200702272315">啟用實驗版本的「Ok Google」啟動字詞偵測功能 (如果硬體支援的話)。</translation> @@ -1337,7 +1346,6 @@ <translation id="2925966894897775835">試算表</translation> <translation id="2927017729816812676">快取儲存空間</translation> <translation id="2927657246008729253">變更...</translation> -<translation id="2928415919076124714">啟用全螢幕模式時隱藏工具列</translation> <translation id="2928526264833629376">繼續 Hangouts</translation> <translation id="2930644991850369934">下載還原映像檔時發生問題,網路連線已中斷。</translation> <translation id="293111069139560936">針對只有一個作用中視窗的檔案櫃項目,允許點擊後將視窗縮到最小。</translation> @@ -1461,6 +1469,7 @@ <translation id="3117812041123364382">啟用/停用浮動虛擬鍵盤。</translation> <translation id="3118319026408854581"><ph name="PRODUCT_NAME" />說明</translation> <translation id="3120430004221004537">在以下裝置上指定的作業的加密強度不足:「<ph name="DEVICE_NAME" />」。</translation> +<translation id="3121260210578524273">為網路通知啟用動作按鈕的圖示。</translation> <translation id="3121793941267913344">重設這個 <ph name="IDS_SHORT_PRODUCT_NAME" /> 裝置</translation> <translation id="3122162841865761901">開發人員工具實驗功能</translation> <translation id="3122464029669770682">CPU</translation> @@ -1581,7 +1590,6 @@ <translation id="3289566588497100676">簡易符號輸入</translation> <translation id="3289856944988573801">如要檢查更新,請使用乙太網路或 Wi-Fi。</translation> <translation id="3293325348208285494">快速啟動</translation> -<translation id="3293894718455402932">「<ph name="EXTENSION" />」將可以讀取及寫入已勾選資料夾中的圖片、影片和音效檔案。</translation> <translation id="3294437725009624529">訪客</translation> <translation id="329650768420594634">封裝擴充功能警告</translation> <translation id="3296763833017966289">喬治亞文</translation> @@ -1638,6 +1646,7 @@ <translation id="3338239663705455570">斯洛維尼亞文鍵盤</translation> <translation id="3340978935015468852">設定</translation> <translation id="3341703758641437857">允許存取檔案網址</translation> +<translation id="3343813173145836998">輕鬆登入這個裝置上的帳戶</translation> <translation id="3344786168130157628">存取點名稱:</translation> <translation id="3345135638360864351">無法將您的網站存取要求傳送給<ph name="NAME" />,請再試一次。</translation> <translation id="3345886924813989455">找不到支援的瀏覽器</translation> @@ -2116,6 +2125,7 @@ <translation id="3996912167543967198">重設中...</translation> <translation id="3997015411467176489">實驗性 Canvas 功能</translation> <translation id="40027638859996362">文字移動</translation> +<translation id="400554499662786523">如要分享音訊,請選取分頁。</translation> <translation id="4012550234655138030">設定或管理 <ph name="CLOUD_PRINT_NAME" />中的印表機。</translation> <translation id="4014432863917027322">修復「<ph name="EXTENSION_NAME" />」?</translation> <translation id="4018133169783460046">將 <ph name="PRODUCT_NAME" /> 介面設為這個語言</translation> @@ -2218,6 +2228,7 @@ <translation id="4180788401304023883">刪除憑證授權單位(CA) 的「<ph name="CERTIFICATE_NAME" />」憑證?</translation> <translation id="418179967336296930">俄文語音 (YaZHert) 鍵盤</translation> <translation id="4181841719683918333">語言</translation> +<translation id="4187248015940562149">啟用網路藍牙,允許網站與附近的藍牙裝置連線並控制這些裝置。</translation> <translation id="4188026131102273494">關鍵字:</translation> <translation id="4189406272289638749"><b><ph name="EXTENSION_NAME" /></b> 擴充功能正在控制這項設定。</translation> <translation id="4193154014135846272">Google 文件</translation> @@ -2274,6 +2285,7 @@ <translation id="4268025649754414643">金鑰編密</translation> <translation id="4268574628540273656">網址:</translation> <translation id="4270393598798225102">第 <ph name="NUMBER" /> 版</translation> +<translation id="4271396100647220620">找不到相符的項目</translation> <translation id="4274187853770964845">同步處理發生錯誤:請停止同步功能,然後再重新啟動同步程序。</translation> <translation id="4275830172053184480">重新啟動裝置</translation> <translation id="4276796043975446927">歡迎使用 Chromebox 視訊會議解決方案</translation> @@ -2343,6 +2355,7 @@ <translation id="4378551569595875038">連線中…</translation> <translation id="438122767399415311">強制套用特定使用者介面文字方向</translation> <translation id="4381849418013903196">冒號</translation> +<translation id="4383192539467954373">在所有裝置上自動登入</translation> <translation id="4384652540891215547">啟用擴充功能</translation> <translation id="438503109373656455">赤兔馬</translation> <translation id="4387554346626014084">啟用「應用程式啟動器」同步功能。如有「資料夾」也會一併啟用 (非 OSX)。</translation> @@ -2360,6 +2373,7 @@ <translation id="4421932782753506458">毛毛</translation> <translation id="4422347585044846479">編輯此網頁的書籤</translation> <translation id="4422428420715047158">網域:</translation> +<translation id="4423482519432579560">拼字檢查(&S)</translation> <translation id="442477792133831654">與附近的裝置進行通訊</translation> <translation id="4425149324548788773">我的雲端硬碟</translation> <translation id="4428582326923056538">Adobe Flash Player 適用不同的攝影機例外狀況。</translation> @@ -2374,6 +2388,7 @@ <translation id="444267095790823769">受保護內容例外情況</translation> <translation id="4443536555189480885">說明(&H)</translation> <translation id="4444304522807523469">存取透過 USB 附加或是在區域網路上的文件掃描器</translation> +<translation id="4445559854264555037">找不到您的裝置嗎?<ph name="GET_HELP_LINK" /></translation> <translation id="4446933390699670756">鏡像模式</translation> <translation id="4447465454292850432">電池:</translation> <translation id="4449935293120761385">關於自動填入</translation> @@ -2629,6 +2644,7 @@ <translation id="485316830061041779">德文</translation> <translation id="4856478137399998590">您的行動數據服務已啟用,隨時可供使用</translation> <translation id="4858913220355269194">飛球</translation> +<translation id="4860565041166337978">允許系統下載管理員處理下載內容 (如適用)。</translation> <translation id="48607902311828362">飛航模式</translation> <translation id="4861833787540810454">播放(&P)</translation> <translation id="4862050643946421924">新增裝置...</translation> @@ -2712,7 +2728,6 @@ <translation id="4977942889532008999">確認存取權</translation> <translation id="4982718461356080574">分頁堆疊時隱藏閒置分頁的關閉按鈕</translation> <translation id="498294082491145744">變更 Cookie、JavaScript、外掛程式、地理位置、麥克風、攝影機等功能的網站存取權控制設定。</translation> -<translation id="4984329823325527157">Media Source API</translation> <translation id="4988526792673242964">頁數</translation> <translation id="4988792151665380515">匯出公開金鑰失敗。</translation> <translation id="49896407730300355">逆時針旋轉(&O)</translation> @@ -2899,7 +2914,6 @@ <translation id="5268606875983318825">PPAPI (獨立程序)</translation> <translation id="526926484727016706">預設讓所有 iframe 拒絕每一項權限。如果允許特定 iframe 權限,這些權限的名稱可能會被列為新 iframe 屬性的值。</translation> <translation id="5269977353971873915">列印失敗</translation> -<translation id="5270884342523754894">「<ph name="EXTENSION" />」將可以讀取已勾選資料夾中的圖片、影片和音效檔案。</translation> <translation id="5271247532544265821">切換簡體中文/繁體中文模式</translation> <translation id="5271549068863921519">儲存密碼</translation> <translation id="5273628206174272911">實驗性的橫向捲動紀錄導覽功能 (可透過橫向捲動啟動)。</translation> @@ -2936,6 +2950,7 @@ <translation id="5316716239522500219">建立顯示器鏡像</translation> <translation id="5317780077021120954">儲存</translation> <translation id="5319782540886810524">拉脫維亞文鍵盤</translation> +<translation id="532247166573571973">無法連上伺服器,請稍後再試。</translation> <translation id="5323213332664049067">拉丁美洲</translation> <translation id="532360961509278431">無法開啟「$1」:$2</translation> <translation id="5324674707192845912">您即將向 Google 取消註冊這台 <ph name="DEVICE_TYPE" />,以停用遠端定位、清除及鎖定裝置的功能。這項設定需要重新啟動後才會生效,您要繼續嗎?</translation> @@ -2988,11 +3003,11 @@ <translation id="5390284375844109566">索引資料庫</translation> <translation id="5392544185395226057">啟用 Native Client 支援。</translation> <translation id="5393125431335030955">這個外掛程式只能在電腦上執行。</translation> -<translation id="5393559999218790205">停用使用者介面撰寫器動畫時間軸</translation> <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_DOMAIN" /> 上的 <ph name="PEPPER_PLUGIN_NAME" /> 外掛程式要求存取您的電腦。</translation> <translation id="539755880180803351">使用自動填入的欄位類型建議為網路表單加上註解,做為預留位置文字。</translation> <translation id="5397578532367286026">管理員 (<ph name="MANAGER_EMAIL" />) 可以在 chrome.com 瞭解這名使用者的使用情形和紀錄。</translation> <translation id="5397794290049113714">您</translation> +<translation id="5398572795982417028">參照的網頁超出範圍限制 (<ph name="MAXIMUM_PAGE" />)</translation> <translation id="5398824043967640339">有 <ph name="COUNT" /> 個 Cookie 來自其他網站</translation> <translation id="5399158067281117682">PIN 不符!</translation> <translation id="5400640815024374115">可信任平台模組 (TPM) 晶片已停用或遺失。</translation> @@ -3012,7 +3027,7 @@ <translation id="5423849171846380976">已啟用</translation> <translation id="5425470845862293575">允許使用實驗性 DirectWrite 字型轉譯系統。</translation> <translation id="5425722269016440406">您必須上網才能關閉 Smart Lock,因為這項設定會同步到您的手機和其他裝置上。請先連線至網路。</translation> -<translation id="5426623592374109001">針對使用者介面中的撰寫式動畫使用舊版干擾型動畫子系統。</translation> +<translation id="5425863515030416387">輕鬆登入所有裝置上的帳戶</translation> <translation id="5427459444770871191">順時針旋轉(&C)</translation> <translation id="5428105026674456456">西班牙文</translation> <translation id="542872847390508405">您目前是以訪客身分瀏覽</translation> @@ -3037,6 +3052,7 @@ <translation id="5451646087589576080">檢視頁框資訊(&I)</translation> <translation id="5453029940327926427">關閉分頁</translation> <translation id="5453632173748266363">斯拉夫語</translation> +<translation id="5454166040603940656">提供者:<ph name="PROVIDER" /></translation> <translation id="5457113250005438886">無效</translation> <translation id="5457459357461771897">讀取及刪除您電腦中的相片、音樂及其他媒體</translation> <translation id="5457599981699367932">以訪客身分瀏覽</translation> @@ -3206,7 +3222,6 @@ <translation id="5708171344853220004">Microsoft 主要名稱</translation> <translation id="5709885306771508267">以雙指撥動進行縮放</translation> <translation id="5710406368443808765">糟糕!系統無法儲存裝置憑證和 ID。</translation> -<translation id="571161420693302741"><ph name="HOST_NAME" /> 沒有回應,因此無法投放。</translation> <translation id="5711983031544731014">無法解鎖,請輸入您的密碼。</translation> <translation id="5712966208980506909">啟用後,chrome://md-policy 網址會載入 Material Design 政策網頁。</translation> <translation id="5715711091495208045">外掛程式代理元件:<ph name="PLUGIN_NAME" /></translation> @@ -3473,7 +3488,6 @@ <translation id="6111974609785983504">預設允許</translation> <translation id="6113134669445407638">在 WebRTC 中停用 Delay Agnostic AEC。使用時機:非常信任回報的系統延遲時,或其他人收到您裝置的回應時。</translation> <translation id="6116921718742659598">變更語言和輸入設定</translation> -<translation id="6117536376248197233">在轉譯器中停用撰寫器動畫時間軸。</translation> <translation id="6120205520491252677">將這個網頁固定到開始畫面...</translation> <translation id="6122081475643980456">您的網際網路連線目前受到控制</translation> <translation id="6122093587541546701">電子郵件地址 (選填):</translation> @@ -3505,6 +3519,7 @@ <translation id="6163522313638838258">全部展開...</translation> <translation id="6164005077879661055">將這位受監管的使用者移除後,系統即會永久刪除所有與該使用者相關的檔案和本機資料。管理員仍可前往 <ph name="MANAGEMENT_URL" /> 查看這位受監管使用者的網頁瀏覽紀錄和設定。</translation> <translation id="6165508094623778733">瞭解詳情</translation> +<translation id="6167008112175207002">您的書籤、歷史紀錄、密碼和其他設定都會在您的 Google 帳戶中保持同步,讓您在所有個人裝置上使用。您可以在 [<ph name="BEGIN_LINK" />] 中變更這項設定</translation> <translation id="6171550060231646388">模擬硬體的「Ok Google」功能</translation> <translation id="6175314957787328458">Microsoft 網域 GUID</translation> <translation id="6178664161104547336">選取憑證</translation> @@ -3707,6 +3722,7 @@ <translation id="648927581764831596">沒有可用的裝置</translation> <translation id="6490936204492416398">從線上應用程式商店安裝新的擴充功能</translation> <translation id="6492313032770352219">磁碟大小:</translation> +<translation id="6498249116389603658">所選全部語言(&A)</translation> <translation id="6499143127267478107">正在解析 Proxy 指令碼主機...</translation> <translation id="6503077044568424649">最常造訪</translation> <translation id="6503256918647795660">瑞士法文鍵盤</translation> @@ -3748,7 +3764,6 @@ <translation id="6555432686520421228">移除所有使用者帳戶,並將您的 <ph name="IDS_SHORT_PRODUCT_NAME" /> 裝置重設為原廠狀態。</translation> <translation id="6556866813142980365">重做</translation> <translation id="6557565812667414268">只針對高 DPI 的顯示器啟用</translation> -<translation id="655845594391856372">分頁沒有回應,因此無法投放。</translation> <translation id="6559580823502247193">(已在這個裝置上)</translation> <translation id="6561726789132298588">Enter 鍵</translation> <translation id="6562437808764959486">正在擷取還原映像檔...</translation> @@ -3849,6 +3864,7 @@ <translation id="6723354935081862304">透過 Google 文件和其他雲端目的地進行列印。如要透過 Google 雲端列印進行列印,請先<ph name="BEGIN_LINK" />登入<ph name="END_LINK" />。</translation> <translation id="6723661294526996303">匯入書籤和設定...</translation> <translation id="6723839937902243910">電源</translation> +<translation id="6725240607822645708">在本身的執行緒中執行 IME。</translation> <translation id="6725970970008349185">每頁顯示的候選字個數</translation> <translation id="672609503628871915">查看新功能</translation> <translation id="6727005317916125192">上一個窗格</translation> @@ -3978,12 +3994,11 @@ <translation id="6948736568813450284">開發人員注意事項:透過 Google Payments API 執行呼叫作業時,請使用沙箱服務。</translation> <translation id="6949306908218145636">將開啟的網頁加入書籤...</translation> <translation id="695164542422037736">如果啟用這個選項,而且 Body 樣式為 background-attachment:fixed,背景將有專屬的複合圖層。</translation> -<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> 會記住您的密碼,並且讓您在這個裝置上自動登入相關網站。</translation> <translation id="6955446738988643816">檢查彈出式視窗</translation> <translation id="695755122858488207">未選取的圓形按鈕</translation> +<translation id="6960277925159781810">在這個裝置上自動登入</translation> <translation id="696036063053180184">韓文 3 Set (No shift)</translation> <translation id="696203921837389374">啟用透過行動數據進行同步處理的功能</translation> -<translation id="6964308487066031935">將資料夾加到「<ph name="EXTENSION" />」?</translation> <translation id="6965382102122355670">確定</translation> <translation id="6965648386495488594">通訊埠</translation> <translation id="6965978654500191972">裝置</translation> @@ -4082,7 +4097,6 @@ <translation id="7076293881109082629">登入中</translation> <translation id="7077829361966535409">無法使用目前的 Proxy 設定載入登入頁面。請<ph name="GAIA_RELOAD_LINK_START" />重新登入<ph name="GAIA_RELOAD_LINK_END" />或使用其他 <ph name="PROXY_SETTINGS_LINK_START" />Proxy 設定<ph name="PROXY_SETTINGS_LINK_END" />。</translation> <translation id="7077872827894353012">略過的通訊協定處理常式</translation> -<translation id="7079038783243627996">「<ph name="EXTENSION" />」將可以讀取及刪除已勾選資料夾中的圖片、影片和音效檔案。</translation> <translation id="708060913198414444">複製音訊位址(&O)</translation> <translation id="708187310695946552">復原工作階段的說明圖示使用者介面</translation> <translation id="7082055294850503883">略過 CapsLock 狀態,預設輸入小寫</translation> @@ -4226,6 +4240,8 @@ <translation id="7313804056609272439">越南文輸入法 (VNI)</translation> <translation id="7314244761674113881">SOCKS 主機</translation> <translation id="7317938878466090505"><ph name="PROFILE_NAME" /> (目前)</translation> +<translation id="7321545336522791733">無法連上伺服器</translation> +<translation id="7324841169865301118">允許使用者選擇要使用桌面分享功能的分頁。</translation> <translation id="7325437708553334317">高對比擴充功能</translation> <translation id="7326565110843845436">觸控板的三指點擊功能</translation> <translation id="73289266812733869">已取消選取</translation> @@ -4449,7 +4465,6 @@ <translation id="7650511557061837441">「<ph name="TRIGGERING_EXTENSION_NAME" />」要求移除「<ph name="EXTENSION_NAME" />」。</translation> <translation id="7650701856438921772"><ph name="PRODUCT_NAME" /> 介面已設為這個語言</translation> <translation id="7654941827281939388">已有人在這台電腦上使用這個帳戶。</translation> -<translation id="7655165758820095116">MediaSource 物件允許 JavaScript 直接將媒體資料傳送至視訊元素。</translation> <translation id="7658239707568436148">取消</translation> <translation id="7659584679870740384">您未獲得授權,無法使用這個裝置。如需登入權限,請與管理員聯絡。</translation> <translation id="7664620655576155379">不支援的藍牙裝置:「<ph name="DEVICE_NAME" />」。</translation> @@ -4580,6 +4595,7 @@ <translation id="7861215335140947162">下載(&D)</translation> <translation id="7864539943188674973">停用藍牙</translation> <translation id="7868891395842935202">啟用實驗性架構,用來控管 API 實驗存取權。</translation> +<translation id="7870576007982733437">使用系統下載管理員 (如適用)。</translation> <translation id="7870790288828963061">找不到新版 Kiosk 應用程式,沒有可更新的內容。請移除 USB 隨身碟。</translation> <translation id="787150342916295244">信用卡掃描</translation> <translation id="7874357055309047713">一律在所有網站上執行</translation> @@ -4622,7 +4638,6 @@ <translation id="7918257978052780342">註冊</translation> <translation id="7920092496846849526">您已詢問家長是否同意您造訪這個網頁。</translation> <translation id="7925285046818567682">正在等候 <ph name="HOST_NAME" />...</translation> -<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> 會記住您的密碼,並且讓您在各個裝置上自動登入相關應用程式和網站。</translation> <translation id="7925686952655276919">請勿使用行動數據進行同步處理</translation> <translation id="7926906273904422255">將不安全的來源標示為不安全或「可疑」。</translation> <translation id="7928710562641958568">退出裝置</translation> @@ -4684,7 +4699,6 @@ 請妥善保管您的金鑰檔案;建立新版本的擴充功能時將需要使用該金鑰檔案。</translation> <translation id="799923393800005025">可以檢視</translation> <translation id="7999338963698132743">新版工作管理員</translation> -<translation id="8000004253404706714">針對轉譯器中的撰寫式動畫使用舊版干擾型動畫子系統。</translation> <translation id="8004582292198964060">瀏覽器</translation> <translation id="8007030362289124303">電池電量不足</translation> <translation id="8008356846765065031">網路連線中斷,請檢查您的網際網路連線。</translation> @@ -4813,6 +4827,7 @@ <translation id="8185331656081929126">在網路上偵測到新印表機時顯示通知</translation> <translation id="8186609076106987817">伺服器找不到檔案。</translation> <translation id="8186706823560132848">軟體</translation> +<translation id="8188120771410500975">檢查文字欄位的拼字(&C)</translation> <translation id="8190192229604245067"><ph name="UWS_NAME" />、<ph name="UWS_NAME" /> 和另外 <ph name="NUMBER_OF_UWS_GREATER_THAN_ONE" /> 個惡意軟體</translation> <translation id="8190193592390505034">正在連線至 <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">管理您的應用程式、擴充功能和主題</translation> @@ -5205,6 +5220,7 @@ <translation id="8765985713192161328">管理處理常式...</translation> <translation id="8766796754185931010">Kotoeri</translation> <translation id="8767072502252310690">使用者</translation> +<translation id="8768367823103160496">滑鼠游標鎖定</translation> <translation id="8769662576926275897">信用卡詳細資料</translation> <translation id="8770196827482281187">波斯文輸入法 (ISIRI 2901 配置)</translation> <translation id="8774934320277480003">上邊界</translation> @@ -5224,6 +5240,7 @@ <translation id="8795668016723474529">新增信用卡</translation> <translation id="8795916974678578410">開新視窗</translation> <translation id="8798099450830957504">預設</translation> +<translation id="8799127529310003270">啟用後,系統會在 IME 執行緒中執行 InputConnection 呼叫 (而不會保留複本編輯器),每個 InputConnection 呼叫都會直接與轉譯器通訊。</translation> <translation id="8799839487311913894">允許在提交「變更密碼」表單後透過密碼管理員更新密碼。</translation> <translation id="8800004011501252845">顯示以下地址的目的地:</translation> <translation id="8800420788467349919">音量:<ph name="PRECENTAGE" />%</translation> @@ -5249,6 +5266,7 @@ <translation id="8841142799574815336">插入畫面檢視區</translation> <translation id="884264119367021077">運送地址</translation> <translation id="8844238624737526720">使用經過最佳化處理的新版 Chrome 工作管理員。</translation> +<translation id="8845001906332463065">尋求協助</translation> <translation id="8846141544112579928">正在搜尋鍵盤...</translation> <translation id="8847988622838149491">USB</translation> <translation id="8848709220963126773">Shift 鍵模式切換</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index c6caf76b..73a8d38 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -2,7 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="ca"> <translation id="1001534784610492198">El fitxer d'instal·lació està malmès o no és vàlid. Torna a baixar Google Chrome.</translation> -<translation id="1013290471399003443">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació vàlida sobre Certificate Transparency.</translation> +<translation id="1013290471399003443">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació vàlida sobre Transparència de certificats.</translation> <translation id="103396972844768118">Informació important sobre les dades de Chrome</translation> <translation id="1035334672863811645">Inicieu la sessió a Chrome</translation> <translation id="1061441684050139317">Chrome necessita accés al micròfon per compartir-lo amb aquest lloc web.</translation> @@ -63,7 +63,7 @@ <translation id="2769762047821873045">Google Chrome no és el navegador predeterminat.</translation> <translation id="2770231113462710648">Canvia el navegador predeterminat a:</translation> <translation id="2871893339301912279">Teniu la sessió iniciada a Chrome.</translation> -<translation id="2997147809295888909">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor no ha proporcionat informació sobre Certificate Transparency.</translation> +<translation id="2997147809295888909">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor no ha proporcionat informació sobre Transparència de certificats.</translation> <translation id="3037838751736561277">Google Chrome està en mode de segon pla.</translation> <translation id="3047079729301751317">Si desconnecteu <ph name="USERNAME" /> s'esborraran l'historial, les adreces d'interès, la configuració i totes les dades de Chrome que hi hagi desades en aquest dispositiu. Les dades emmagatzemades al compte de Google no s'esborraran, i es poden gestionar des del <ph name="GOOGLE_DASHBOARD_LINK" />Tauler de Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation> <translation id="3080151273017101988">Continua executant aplicacions de segon pla en tancar Google Chrome</translation> @@ -86,7 +86,7 @@ <translation id="3847841918622877581">Google Chrome pot utilitzar serveis web per millorar l'experiència de navegació dels usuaris.</translation> <translation id="386202838227397562">Tanqueu totes les finestres de Google Chrome i torneu-ho a provar.</translation> <translation id="3870154837782082782">Google Inc.</translation> -<translation id="3881912906674381083">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació sobre Certificate Transparency, però Chrome no n'ha reconegut cap registre.</translation> +<translation id="3881912906674381083">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació sobre Transparència de certificats, però Chrome no n'ha reconegut cap registre.</translation> <translation id="3889417619312448367">Desinstal·la Google Chrome</translation> <translation id="4042449298237264661">Aquest ordinador ja no rebrà més actualitzacions de Google Chrome perquè Windows XP i Windows Vista ja no són compatibles.</translation> <translation id="4050175100176540509">La versió més recent incorpora millores de seguretat i funcions noves importants.</translation> @@ -115,7 +115,7 @@ <translation id="4794050651896644714">Desa els detalls a Chrome</translation> <translation id="4891791193823137474">Permet que Google Chrome s'executi en procés de fons</translation> <translation id="4921569541910214635">Si compartiu un ordinador, ara podeu configurar Chrome com vulgueu.</translation> -<translation id="4925019873400497719">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació sobre Certificate Transparency, però no era vàlida.</translation> +<translation id="4925019873400497719">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web. El servidor ha proporcionat informació sobre Transparència de certificats, però no era vàlida.</translation> <translation id="4953650215774548573">Defineix Google Chrome com a navegador predeterminat</translation> <translation id="4987308747895123092">Tanqueu totes les finestres de Google Chrome (incloses les del mode Windows 8) i torneu-ho a provar.</translation> <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index b2f09d1..ef15445 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -239,6 +239,26 @@ You have certificates from these organizations that identify you: </message> + <!-- Certificate Manager Page, Edit Certificate Authority Trust dialog--> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_TITLE" desc="Title of the certificate manager edit trust dialog"> + Certificate authority + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_DESCRIPTION" desc="Line displayed in certificate manager edit trust dialog before the checkboxes for setting certificate trust flags"> + Edit trust settings: + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EXPLANATION" desc="Description in dialog for editing Certification Authority trust flags"> + The certificate "<ph name="CERTIFICATE_NAME">$1<ex>Verisign Class 1 Public Primary Certification Authority</ex></ph>" represents a Certification Authority. + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_SSL" desc="Description in Certification Authority trust dialog for the SSL trust checkbox."> + Trust this certificate for identifying websites. + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EMAIL" desc="Description in Certification Authority trust dialog for the Email trust checkbox."> + Trust this certificate for identifying email users. + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_OBJ_SIGN" desc="Description in Certification Authority trust dialog for the Code Signing trust checkbox."> + Trust this certificate for identifying software makers. + </message> + <!-- Clear Browsing Data --> <message name="IDS_SETTINGS_CLEAR_FOLLOWING_ITEMS_FROM" desc="Label at the top of the client area of the dialog, preceding the period combo box"> Clear the following items from
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index a2055020..706d58e96 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1806,8 +1806,7 @@ #if defined(OS_ANDROID) {"ime-thread", IDS_FLAGS_IME_THREAD_NAME, IDS_FLAGS_IME_THREAD_DESCRIPTION, kOsAndroid, - ENABLE_DISABLE_VALUE_TYPE(switches::kEnableImeThread, - switches::kDisableImeThread)}, + FEATURE_VALUE_TYPE(features::kImeThread)}, #endif // defined(OS_ANDROID) #if defined(OS_ANDROID) {"offline-pages-ntp", IDS_FLAGS_NTP_OFFLINE_PAGES_NAME,
diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc index 5d739b4..c653c9f1 100644 --- a/chrome/browser/background/background_mode_manager.cc +++ b/chrome/browser/background/background_mode_manager.cc
@@ -311,7 +311,8 @@ // there are background apps) or exit if there are none. if (command_line.HasSwitch(switches::kNoStartupWindow)) { keep_alive_for_startup_.reset( - new ScopedKeepAlive(KeepAliveOrigin::BACKGROUND_MODE_MANAGER)); + new ScopedKeepAlive(KeepAliveOrigin::BACKGROUND_MODE_MANAGER_STARTUP, + KeepAliveRestartOption::DISABLED)); } else { // Otherwise, start with background mode suspended in case we're launching // in a mode that doesn't open a browser window. It will be resumed when the @@ -767,7 +768,8 @@ if (in_background_mode_ && !background_mode_suspended_) { if (!keep_alive_) { keep_alive_.reset( - new ScopedKeepAlive(KeepAliveOrigin::BACKGROUND_MODE_MANAGER)); + new ScopedKeepAlive(KeepAliveOrigin::BACKGROUND_MODE_MANAGER, + KeepAliveRestartOption::ENABLED)); } CreateStatusTrayIcon(); return;
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc index 8f0c08c1..15266ce 100644 --- a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc +++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
@@ -96,9 +96,9 @@ return REQUEST_ID_INVALID; // Check for existing images first. - base::OwningMRUCache<GURL, CacheEntry*>::iterator iter = cache_.Get(url); + auto iter = cache_.Get(url); if (iter != cache_.end()) { - BitmapFetcherService::CacheEntry* entry = iter->second; + BitmapFetcherService::CacheEntry* entry = iter->second.get(); request->NotifyImageChanged(entry->bitmap.get()); // There is no request ID associated with this - data is already delivered. @@ -184,9 +184,9 @@ } if (bitmap && !bitmap->isNull()) { - CacheEntry* entry = new CacheEntry; + scoped_ptr<CacheEntry> entry(new CacheEntry); entry->bitmap.reset(new SkBitmap(*bitmap)); - cache_.Put(fetcher->url(), entry); + cache_.Put(fetcher->url(), std::move(entry)); } RemoveFetcher(fetcher);
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h index 13aa9387..f9c5962 100644 --- a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h +++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h
@@ -96,7 +96,7 @@ scoped_ptr<const SkBitmap> bitmap; }; - base::OwningMRUCache<GURL, CacheEntry*> cache_; + base::MRUCache<GURL, scoped_ptr<CacheEntry>> cache_; // Current request ID to be used. int current_request_id_;
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 9e57c22..b00f49fb 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -399,6 +399,23 @@ <include name="IDR_USER_MANAGER_JS" file="resources\user_manager\user_manager.js" flattenhtml="true" type="BINDATA" /> <include name="IDR_USER_MANAGER_HTML" file="resources\user_manager\user_manager.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> </if> + <if expr="not is_android and not is_ios and not chromeos"> + <include name="IDR_MD_CONTROL_BAR_CSS" file="resources\md_user_manager\control_bar.css" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_CONTROL_BAR_HTML" file="resources\md_user_manager\control_bar.html" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_CONTROL_BAR_JS" file="resources\md_user_manager\control_bar.js" type="BINDATA" /> + <include name="IDR_MD_CREATE_PROFILE_CSS" file="resources\md_user_manager\create_profile.css" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_CREATE_PROFILE_HTML" file="resources\md_user_manager\create_profile.html" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_CREATE_PROFILE_JS" file="resources\md_user_manager\create_profile.js" type="BINDATA" /> + <include name="IDR_MD_PROFILE_BROWSER_PROXY_HTML" file="resources\md_user_manager\profile_browser_proxy.html" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_PROFILE_BROWSER_PROXY_JS" file="resources\md_user_manager\profile_browser_proxy.js" type="BINDATA" /> + <include name="IDR_MD_USER_MANAGER_CSS" file="resources\md_user_manager\user_manager.css" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_USER_MANAGER_HTML" file="resources\md_user_manager\user_manager.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> + <include name="IDR_MD_USER_MANAGER_JS" file="resources\md_user_manager\user_manager.js" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_USER_MANAGER_PAGES_CSS" file="resources\md_user_manager\user_manager_pages.css" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_USER_MANAGER_PAGES_HTML" file="resources\md_user_manager\user_manager_pages.html" flattenhtml="true" type="BINDATA" /> + <include name="IDR_MD_USER_MANAGER_PAGES_JS" file="resources\md_user_manager\user_manager_pages.js" type="BINDATA" /> + <include name="IDR_MD_USER_MANAGER_STRINGS_HTML" file="resources\md_user_manager\strings.html" flattenhtml="true" type="BINDATA" /> + </if> <include name="IDR_SUPERVISED_USER_BLOCK_INTERSTITIAL_HTML" file="resources\supervised_user_block_interstitial.html" flattenhtml="true" type="BINDATA" /> <include name="IDR_PROFILE_SIGNIN_CONFIRMATION_HTML" file="resources\profile_signin_confirmation.html" type="BINDATA" /> <include name="IDR_PROFILE_SIGNIN_CONFIRMATION_JS" file="resources\profile_signin_confirmation.js" type="BINDATA" />
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index c90d3e6f..5a3ec57 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1725,6 +1725,15 @@ return rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).ToImageSkia(); } +bool ChromeContentBrowserClient::IsDataSaverEnabled( + content::BrowserContext* browser_context) { + Profile* profile = Profile::FromBrowserContext(browser_context); + if (!profile) + return false; + PrefService* prefs = profile->GetPrefs(); + return prefs && prefs->GetBoolean(prefs::kDataSaverEnabled); +} + bool ChromeContentBrowserClient::AllowAppCache( const GURL& manifest_url, const GURL& first_party,
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index d8ccfa8..b500d88e 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h
@@ -25,6 +25,7 @@ } namespace content { +class BrowserContext; class QuotaPermissionContext; } @@ -126,6 +127,7 @@ std::string GetApplicationLocale() override; std::string GetAcceptLangs(content::BrowserContext* context) override; const gfx::ImageSkia* GetDefaultFavicon() override; + bool IsDataSaverEnabled(content::BrowserContext* context) override; bool AllowAppCache(const GURL& manifest_url, const GURL& first_party, content::ResourceContext* context) override;
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc index 45ecd0a3..c8b4b437 100644 --- a/chrome/browser/chrome_content_browser_client_unittest.cc +++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -28,6 +28,7 @@ #if !defined(OS_ANDROID) #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/common/pref_names.h" #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/search_test_utils.h" #endif @@ -53,6 +54,14 @@ *target_contents = opened_contents; } +TEST_F(ChromeContentBrowserClientWindowTest, IsDataSaverEnabled) { + ChromeContentBrowserClient client; + content::BrowserContext* context = browser()->profile(); + EXPECT_FALSE(client.IsDataSaverEnabled(context)); + browser()->profile()->GetPrefs()->SetBoolean(prefs::kDataSaverEnabled, true); + EXPECT_TRUE(client.IsDataSaverEnabled(context)); +} + // This test opens two URLs using ContentBrowserClient::OpenURL. It expects the // URLs to be opened in new tabs and activated, changing the active tabs after // each call and increasing the tab count by 2.
diff --git a/chrome/browser/chromeos/arc/arc_auth_service.cc b/chrome/browser/chromeos/arc/arc_auth_service.cc index ddb6e73..86ae290 100644 --- a/chrome/browser/chromeos/arc/arc_auth_service.cc +++ b/chrome/browser/chromeos/arc/arc_auth_service.cc
@@ -42,10 +42,9 @@ // Skip creating UI in unit tests bool disable_ui_for_testing = false; -const char kStateDisable[] = "DISABLE"; +const char kStateStopped[] = "STOPPED"; const char kStateFetchingCode[] = "FETCHING_CODE"; -const char kStateNoCode[] = "NO_CODE"; -const char kStateEnable[] = "ENABLE"; +const char kStateActive[] = "ACTIVE"; } // namespace ArcAuthService::ArcAuthService(ArcBridgeService* bridge_service) @@ -77,6 +76,7 @@ registry->RegisterBooleanPref( prefs::kArcEnabled, false, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterBooleanPref(prefs::kArcSignedIn, false); } // static @@ -111,8 +111,30 @@ void ArcAuthService::GetAuthCode(const GetAuthCodeCallback& callback) { DCHECK(thread_checker_.CalledOnValidThread()); - callback.Run(mojo::String(GetAndResetAuthCode()), - !IsOptInVerificationDisabled()); + std::string auth_code = GetAndResetAuthCode(); + if (!auth_code.empty()) { + callback.Run(mojo::String(auth_code), !IsOptInVerificationDisabled()); + return; + } + + auth_callback_ = callback; + SetState(State::FETCHING_CODE); + FetchAuthCode(); +} + +void ArcAuthService::OnSignInComplete() { + DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_EQ(state_, State::ACTIVE); + + profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true); +} + +void ArcAuthService::OnSignInFailed(arc::ArcSignInFailureReason reason) { + DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_EQ(state_, State::ACTIVE); + + profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); + ShutdownBridgeAndCloseUI(); } void ArcAuthService::SetState(State state) { @@ -154,8 +176,7 @@ } } else { auth_code_.clear(); - ArcBridgeService::Get()->HandleStartup(); - SetState(State::ENABLE); + StartArc(); } } @@ -218,11 +239,18 @@ DCHECK(profile_); if (profile_->GetPrefs()->GetBoolean(prefs::kArcEnabled)) { - if (state_ != State::ENABLE) { + if (state_ != State::ACTIVE) { CloseUI(); auth_code_.clear(); - SetState(State::FETCHING_CODE); - FetchAuthCode(); + + if (!profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn)) { + // Need pre-fetch auth code and show OptIn UI if needed. + SetState(State::FETCHING_CODE); + FetchAuthCode(); + } else { + // Ready to start Arc. + StartArc(); + } } } else { ShutdownBridgeAndCloseUI(); @@ -231,11 +259,12 @@ void ArcAuthService::ShutdownBridgeAndCloseUI() { CloseUI(); + auth_callback_.reset(); auth_fetcher_.reset(); ubertoken_fethcher_.reset(); merger_fetcher_.reset(); ArcBridgeService::Get()->Shutdown(); - SetState(State::DISABLE); + SetState(State::STOPPED); } void ArcAuthService::AddObserver(Observer* observer) { @@ -252,10 +281,25 @@ FOR_EACH_OBSERVER(Observer, observer_list_, OnOptInUINeedToClose()); } +void ArcAuthService::StartArc() { + DCHECK(thread_checker_.CalledOnValidThread()); + ArcBridgeService::Get()->HandleStartup(); + SetState(State::ACTIVE); +} + void ArcAuthService::SetAuthCodeAndStartArc(const std::string& auth_code) { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(!auth_code.empty()); + if (!auth_callback_.is_null()) { + DCHECK_EQ(state_, State::FETCHING_CODE); + SetState(State::ACTIVE); + CloseUI(); + auth_callback_.Run(mojo::String(auth_code), !IsOptInVerificationDisabled()); + auth_callback_.reset(); + return; + } + State state = state_; ShutdownBridgeAndCloseUI(); @@ -264,8 +308,7 @@ return; auth_code_ = auth_code; - ArcBridgeService::Get()->HandleStartup(); - SetState(State::ENABLE); + StartArc(); } void ArcAuthService::FetchAuthCode() { @@ -329,21 +372,18 @@ void ArcAuthService::OnAuthCodeFailed() { DCHECK_EQ(state_, State::FETCHING_CODE); - CloseUI(); - SetState(State::NO_CODE); + ShutdownBridgeAndCloseUI(); } std::ostream& operator<<(std::ostream& os, const ArcAuthService::State& state) { switch (state) { - case ArcAuthService::State::DISABLE: - return os << kStateDisable; + case ArcAuthService::State::STOPPED: + return os << kStateStopped; case ArcAuthService::State::FETCHING_CODE: return os << kStateFetchingCode; - case ArcAuthService::State::NO_CODE: - return os << kStateNoCode; - case ArcAuthService::State::ENABLE: - return os << kStateEnable; + case ArcAuthService::State::ACTIVE: + return os << kStateActive; default: NOTREACHED(); return os;
diff --git a/chrome/browser/chromeos/arc/arc_auth_service.h b/chrome/browser/chromeos/arc/arc_auth_service.h index 74d03b83..c71ddc0 100644 --- a/chrome/browser/chromeos/arc/arc_auth_service.h +++ b/chrome/browser/chromeos/arc/arc_auth_service.h
@@ -48,10 +48,9 @@ public syncable_prefs::PrefServiceSyncableObserver { public: enum class State { - DISABLE, // ARC is not allowed to run (default). - FETCHING_CODE, // ARC is allowed, receiving auth_2 code. - NO_CODE, // ARC is allowed, auth_2 code was not received. - ENABLE, // ARC is allowed, auth_2 code was received. + STOPPED, // ARC is not running. + FETCHING_CODE, // ARC may be running or not. Auth code is fetching. + ACTIVE, // ARC is running. }; class Observer { @@ -92,11 +91,14 @@ // ArcBridgeService::Observer: void OnAuthInstanceReady() override; - // Overrides AuthHost. For security reason this code can be used only - // once and exists for specific period of time. + // AuthHost: + // For security reason this code can be used only once and exists for specific + // period of time. void GetAuthCodeDeprecated( const GetAuthCodeDeprecatedCallback& callback) override; void GetAuthCode(const GetAuthCodeCallback& callback) override; + void OnSignInComplete() override; + void OnSignInFailed(arc::ArcSignInFailureReason reason) override; // May be called internally as response to on Arc OptIn preference change // or externally from Arc support platform app. @@ -125,6 +127,7 @@ void OnIsSyncingChanged() override; private: + void StartArc(); void SetAuthCodeAndStartArc(const std::string& auth_code); void ShowUI(); void CloseUI(); @@ -143,12 +146,13 @@ mojo::Binding<AuthHost> binding_; base::ThreadChecker thread_checker_; - State state_ = State::DISABLE; + State state_ = State::STOPPED; base::ObserverList<Observer> observer_list_; scoped_ptr<ArcAuthFetcher> auth_fetcher_; scoped_ptr<GaiaAuthFetcher> merger_fetcher_; scoped_ptr<UbertokenFetcher> ubertoken_fethcher_; std::string auth_code_; + GetAuthCodeCallback auth_callback_; DISALLOW_COPY_AND_ASSIGN(ArcAuthService); };
diff --git a/chrome/browser/chromeos/arc/arc_auth_service_unittest.cc b/chrome/browser/chromeos/arc/arc_auth_service_unittest.cc index 42d8ee1..b3028d11 100644 --- a/chrome/browser/chromeos/arc/arc_auth_service_unittest.cc +++ b/chrome/browser/chromeos/arc/arc_auth_service_unittest.cc
@@ -115,20 +115,20 @@ }; TEST_F(ArcAuthServiceTest, PrefChangeTriggersService) { - ASSERT_EQ(ArcAuthService::State::DISABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); PrefService* pref = profile()->GetPrefs(); DCHECK_EQ(false, pref->GetBoolean(prefs::kArcEnabled)); auth_service()->OnPrimaryUserProfilePrepared(profile()); - ASSERT_EQ(ArcAuthService::State::DISABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); PrepareURLResponse(net::HTTP_OK, false); pref->SetBoolean(prefs::kArcEnabled, true); ASSERT_EQ(ArcAuthService::State::FETCHING_CODE, auth_service()->state()); pref->SetBoolean(prefs::kArcEnabled, false); - ASSERT_EQ(ArcAuthService::State::DISABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); // Correctly stop service. auth_service()->Shutdown(); @@ -136,14 +136,14 @@ TEST_F(ArcAuthServiceTest, BaseWorkflow) { ASSERT_EQ(ArcBridgeService::State::STOPPED, bridge_service()->state()); - ASSERT_EQ(ArcAuthService::State::DISABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); ASSERT_EQ(std::string(), auth_service()->GetAndResetAuthCode()); PrepareURLResponse(net::HTTP_OK, true); auth_service()->OnPrimaryUserProfilePrepared(profile()); // By default ARC is not enabled. - ASSERT_EQ(ArcAuthService::State::DISABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, true); @@ -153,14 +153,14 @@ content::BrowserThread::GetBlockingPool()->FlushForTesting(); base::RunLoop().RunUntilIdle(); - ASSERT_EQ(ArcAuthService::State::ENABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::ACTIVE, auth_service()->state()); ASSERT_EQ(ArcBridgeService::State::READY, bridge_service()->state()); // Auth code valid only for one call. ASSERT_EQ(kTestAuthCode, auth_service()->GetAndResetAuthCode()); ASSERT_EQ(std::string(), auth_service()->GetAndResetAuthCode()); auth_service()->Shutdown(); - ASSERT_EQ(ArcAuthService::State::DISABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); ASSERT_EQ(ArcBridgeService::State::STOPPED, bridge_service()->state()); ASSERT_EQ(std::string(), auth_service()->GetAndResetAuthCode()); @@ -179,14 +179,14 @@ // Send error response. PrepareURLResponse(net::HTTP_BAD_REQUEST, false); auth_service()->Shutdown(); - ASSERT_EQ(ArcAuthService::State::DISABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); auth_service()->OnPrimaryUserProfilePrepared(profile()); ASSERT_EQ(ArcAuthService::State::FETCHING_CODE, auth_service()->state()); content::BrowserThread::GetBlockingPool()->FlushForTesting(); base::RunLoop().RunUntilIdle(); - ASSERT_EQ(ArcAuthService::State::NO_CODE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); // Correctly stop service. auth_service()->Shutdown(); @@ -201,7 +201,7 @@ ASSERT_EQ(ArcAuthService::State::FETCHING_CODE, auth_service()->state()); auth_service()->CancelAuthCode(); - ASSERT_EQ(ArcAuthService::State::DISABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); ASSERT_EQ(false, pref->GetBoolean(prefs::kArcEnabled)); // Correctly stop service. @@ -218,10 +218,10 @@ content::BrowserThread::GetBlockingPool()->FlushForTesting(); base::RunLoop().RunUntilIdle(); - ASSERT_EQ(ArcAuthService::State::ENABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::ACTIVE, auth_service()->state()); auth_service()->CancelAuthCode(); - ASSERT_EQ(ArcAuthService::State::ENABLE, auth_service()->state()); + ASSERT_EQ(ArcAuthService::State::ACTIVE, auth_service()->state()); ASSERT_EQ(true, pref->GetBoolean(prefs::kArcEnabled)); // Correctly stop service. @@ -243,4 +243,42 @@ auth_service()->Shutdown(); } +TEST_F(ArcAuthServiceTest, SignInStatus) { + PrefService* prefs = profile()->GetPrefs(); + + PrepareURLResponse(net::HTTP_OK, true); + EXPECT_FALSE(prefs->GetBoolean(prefs::kArcSignedIn)); + prefs->SetBoolean(prefs::kArcEnabled, true); + + auth_service()->OnPrimaryUserProfilePrepared(profile()); + EXPECT_EQ(ArcAuthService::State::FETCHING_CODE, auth_service()->state()); + content::BrowserThread::GetBlockingPool()->FlushForTesting(); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(ArcAuthService::State::ACTIVE, auth_service()->state()); + EXPECT_EQ(ArcBridgeService::State::READY, bridge_service()->state()); + EXPECT_FALSE(prefs->GetBoolean(prefs::kArcSignedIn)); + auth_service()->OnSignInComplete(); + EXPECT_TRUE(prefs->GetBoolean(prefs::kArcSignedIn)); + EXPECT_EQ(ArcAuthService::State::ACTIVE, auth_service()->state()); + EXPECT_EQ(ArcBridgeService::State::READY, bridge_service()->state()); + + // Second start, no fetching code is expected. + auth_service()->Shutdown(); + EXPECT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); + EXPECT_EQ(ArcBridgeService::State::STOPPED, bridge_service()->state()); + auth_service()->OnPrimaryUserProfilePrepared(profile()); + EXPECT_TRUE(prefs->GetBoolean(prefs::kArcSignedIn)); + EXPECT_EQ(ArcAuthService::State::ACTIVE, auth_service()->state()); + EXPECT_EQ(ArcBridgeService::State::READY, bridge_service()->state()); + + // Report failure. + auth_service()->OnSignInFailed(arc::ArcSignInFailureReason::UNKNOWN_ERROR); + EXPECT_FALSE(prefs->GetBoolean(prefs::kArcSignedIn)); + EXPECT_EQ(ArcAuthService::State::STOPPED, auth_service()->state()); + EXPECT_EQ(ArcBridgeService::State::STOPPED, bridge_service()->state()); + + // Correctly stop service. + auth_service()->Shutdown(); +} + } // namespace arc
diff --git a/chrome/browser/chromeos/arc/arc_process.h b/chrome/browser/chromeos/arc/arc_process.h new file mode 100644 index 0000000..9e64aec --- /dev/null +++ b/chrome/browser/chromeos/arc/arc_process.h
@@ -0,0 +1,23 @@ +// 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 CHROME_BROWSER_CHROMEOS_ARC_ARC_PROCESS_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_ARC_PROCESS_H_ + +#include <string> + +#include "base/process/process_handle.h" +#include "components/arc/common/process.mojom.h" + +namespace arc { + +struct ArcProcess { + base::ProcessId nspid; + base::ProcessId pid; + std::string process_name; + ProcessState process_state; +}; + +} // namespace arc + +#endif // CHROME_BROWSER_CHROMEOS_ARC_ARC_PROCESS_H_
diff --git a/chrome/browser/chromeos/arc/arc_process_service.cc b/chrome/browser/chromeos/arc/arc_process_service.cc new file mode 100644 index 0000000..890941e --- /dev/null +++ b/chrome/browser/chromeos/arc/arc_process_service.cc
@@ -0,0 +1,244 @@ +// 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. +// +// The main point of this class is to cache ARC proc nspid<->pid mapping +// globally. Since the calculation is costly, a dedicated worker thread is +// used. All read/write of its internal data structure (i.e., the mapping) +// should be on this thread. + +#include "chrome/browser/chromeos/arc/arc_process_service.h" + +#include <queue> +#include <set> +#include <string> + +#include "base/process/process.h" +#include "base/process/process_iterator.h" +#include "base/task_runner_util.h" +#include "base/trace_event/trace_event.h" +#include "content/public/browser/browser_thread.h" + +namespace arc { + +namespace { + +const char kSequenceToken[] = "arc_process_service"; + +// Weak pointer. This class is owned by ArcServiceManager. +ArcProcessService* g_arc_process_service = nullptr; + +} // namespace + +using base::kNullProcessId; +using base::Process; +using base::ProcessId; +using base::SequencedWorkerPool; +using std::map; +using std::set; +using std::vector; + +ArcProcessService::ArcProcessService(ArcBridgeService* bridge_service) + : ArcService(bridge_service), + worker_pool_(new SequencedWorkerPool(1, "arc_process_manager")), + weak_ptr_factory_(this) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + arc_bridge_service()->AddObserver(this); + DCHECK(!g_arc_process_service); + g_arc_process_service = this; + // Not intended to be used from the creating thread. + thread_checker_.DetachFromThread(); +} + +ArcProcessService::~ArcProcessService() { + DCHECK(g_arc_process_service == this); + g_arc_process_service = nullptr; + arc_bridge_service()->RemoveObserver(this); + worker_pool_->Shutdown(); +} + +// static +ArcProcessService* ArcProcessService::Get() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + return g_arc_process_service; +} + +void ArcProcessService::OnProcessInstanceReady() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + worker_pool_->PostNamedSequencedWorkerTask( + kSequenceToken, + FROM_HERE, + base::Bind(&ArcProcessService::Reset, + weak_ptr_factory_.GetWeakPtr())); +} + +void ArcProcessService::Reset() { + DCHECK(thread_checker_.CalledOnValidThread()); + nspid_to_pid_.clear(); +} + +bool ArcProcessService::RequestProcessList( + RequestProcessListCallback callback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + arc::ProcessInstance* process_instance = + arc_bridge_service()->process_instance(); + if (!process_instance) { + return false; + } + process_instance->RequestProcessList( + base::Bind(&ArcProcessService::OnReceiveProcessList, + weak_ptr_factory_.GetWeakPtr(), + callback)); + return true; +} + +void ArcProcessService::OnReceiveProcessList( + const RequestProcessListCallback& callback, + mojo::Array<arc::RunningAppProcessInfoPtr> mojo_processes) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + auto raw_processes = new vector<RunningAppProcessInfoPtr>(); + mojo_processes.Swap(raw_processes); + + auto ret_processes = new vector<ArcProcess>(); + // Post to its dedicated worker thread to avoid race condition. + // Since no two tasks with the same token should be run at the same. + // Note: GetSequencedTaskRunner's shutdown behavior defaults to + // SKIP_ON_SHUTDOWN (ongoing task blocks shutdown). + // So in theory using Unretained(this) should be fine since the life cycle + // of |this| is the same as the main browser. + // To be safe I still use weak pointers, but weak_ptrs can only bind to + // methods without return values. That's why I can't use + // PostTaskAndReplyWithResult but handle the return object by myself. + auto runner = worker_pool_->GetSequencedTaskRunner( + worker_pool_->GetNamedSequenceToken(kSequenceToken)); + runner->PostTaskAndReply( + FROM_HERE, + base::Bind(&ArcProcessService::UpdateAndReturnProcessList, + weak_ptr_factory_.GetWeakPtr(), + base::Owned(raw_processes), + base::Unretained(ret_processes)), + base::Bind(&ArcProcessService::CallbackRelay, + weak_ptr_factory_.GetWeakPtr(), + callback, + base::Owned(ret_processes))); +} + +void ArcProcessService::CallbackRelay( + const RequestProcessListCallback& callback, + const vector<ArcProcess>* ret_processes) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + callback.Run(*ret_processes); +} + +void ArcProcessService::UpdateAndReturnProcessList( + const vector<arc::RunningAppProcessInfoPtr>* raw_processes, + vector<ArcProcess>* ret_processes) { + DCHECK(thread_checker_.CalledOnValidThread()); + + // Cleanup dead pids in the cache |nspid_to_pid_|. + set<ProcessId> nspid_to_remove; + for (const auto& entry : nspid_to_pid_) { + nspid_to_remove.insert(entry.first); + } + bool unmapped_nspid = false; + for (const auto& entry : *raw_processes) { + // erase() returns 0 if coudln't find the key. It means a new process. + if (nspid_to_remove.erase(entry->pid) == 0) { + nspid_to_pid_[entry->pid] = kNullProcessId; + unmapped_nspid = true; + } + } + for (const auto& entry : nspid_to_remove) { + nspid_to_pid_.erase(entry); + } + + // The operation is costly so avoid calling it when possible. + if (unmapped_nspid) { + UpdateNspidToPidMap(); + } + + PopulateProcessList(raw_processes, ret_processes); +} + +void ArcProcessService::PopulateProcessList( + const vector<arc::RunningAppProcessInfoPtr>* raw_processes, + vector<ArcProcess>* ret_processes) { + DCHECK(thread_checker_.CalledOnValidThread()); + for (const auto& entry : *raw_processes) { + const auto it = nspid_to_pid_.find(entry->pid); + // In case the process already dies so couldn't find corresponding pid. + if (it != nspid_to_pid_.end() && it->second != kNullProcessId) { + ArcProcess arc_process = { + entry->pid, it->second, entry->process_name, entry->process_state}; + ret_processes->push_back(arc_process); + } + } +} + +// Computes a map from PID in ARC namespace to PID in system namespace. +// The returned map contains ARC processes only. +void ArcProcessService::UpdateNspidToPidMap() { + DCHECK(thread_checker_.CalledOnValidThread()); + + TRACE_EVENT0("browser", "ArcProcessService::UpdateNspidToPidMap"); + + // NB: Despite of its name, ProcessIterator::Snapshot() may return + // inconsistent information because it simply walks procfs. Especially + // we must not assume the parent-child relationships are consistent. + const base::ProcessIterator::ProcessEntries& entry_list = + base::ProcessIterator(nullptr).Snapshot(); + + // System may contain many different namespaces so several different + // processes may have the same nspid. We need to get the proper subset of + // processes to create correct nspid -> pid map. + + // Construct the process tree. + // NB: This can contain a loop in case of race conditions. + map<ProcessId, vector<ProcessId> > process_tree; + for (const base::ProcessEntry& entry : entry_list) + process_tree[entry.parent_pid()].push_back(entry.pid()); + + // Find the ARC init process. + ProcessId arc_init_pid = kNullProcessId; + for (const base::ProcessEntry& entry : entry_list) { + // TODO(nya): Add more constraints to avoid mismatches. + std::string process_name = + !entry.cmd_line_args().empty() ? entry.cmd_line_args()[0] : ""; + if (process_name == "/init") { + arc_init_pid = entry.pid(); + break; + } + } + + // Enumerate all processes under ARC init and create nspid -> pid map. + if (arc_init_pid != kNullProcessId) { + std::queue<ProcessId> queue; + std::set<ProcessId> visited; + queue.push(arc_init_pid); + while (!queue.empty()) { + ProcessId pid = queue.front(); + queue.pop(); + // Do not visit the same process twice. Otherwise we may enter an infinite + // loop if |process_tree| contains a loop. + if (!visited.insert(pid).second) + continue; + + ProcessId nspid = base::Process(pid).GetPidInNamespace(); + + // All ARC processes should be in namespace so nspid is usually non-null, + // but this can happen if the process has already gone. + // Only add processes we're interested in (those appear as keys in + // |nspid_to_pid_|). + if (nspid != kNullProcessId && + nspid_to_pid_.find(nspid) != nspid_to_pid_.end()) + nspid_to_pid_[nspid] = pid; + + for (ProcessId child_pid : process_tree[pid]) + queue.push(child_pid); + } + } +} + +} // namespace arc
diff --git a/chrome/browser/chromeos/arc/arc_process_service.h b/chrome/browser/chromeos/arc/arc_process_service.h new file mode 100644 index 0000000..634e4e34 --- /dev/null +++ b/chrome/browser/chromeos/arc/arc_process_service.h
@@ -0,0 +1,96 @@ +// 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 CHROME_BROWSER_CHROMEOS_ARC_ARC_PROCESS_SERVICE_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_ARC_PROCESS_SERVICE_H_ + +#include <map> +#include <vector> + +#include "base/callback.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/threading/sequenced_worker_pool.h" +#include "base/threading/thread_checker.h" +#include "chrome/browser/chromeos/arc/arc_process.h" +#include "components/arc/arc_bridge_service.h" +#include "components/arc/arc_service.h" + +namespace arc { + +// A single global entry to get a list of ARC processes. +// +// Call RequestProcessList() on the main UI thread to get a list of all ARC +// processes. It returns vector<arc::ArcProcess>, which includes pid <-> nspid +// mapping. +// Example: +// void OnUpdateProcessList(const vector<arc::ArcProcess>&) {...} +// +// arc::ArcProcessService* arc_process_service = +// arc::ArcProcessService::Get(); +// if (!arc_process_service || +// !arc_process_service->RequestProcessList( +// base::Bind(&OnUpdateProcessList)) { +// LOG(ERROR) << "ARC process instance not ready."; +// } +class ArcProcessService : public ArcService, + public ArcBridgeService::Observer { + public: + using RequestProcessListCallback = + base::Callback<void(const std::vector<ArcProcess>&)>; + + explicit ArcProcessService(ArcBridgeService* bridge_service); + ~ArcProcessService() override; + + // Returns nullptr before the global instance is ready. + static ArcProcessService* Get(); + + // ArcBridgeService::Observer overrides. + void OnProcessInstanceReady() override; + + // Returns true if ARC IPC is ready for process list request, + // otherwise false. + bool RequestProcessList(RequestProcessListCallback callback); + + private: + void Reset(); + + void OnReceiveProcessList( + const RequestProcessListCallback& callback, + mojo::Array<arc::RunningAppProcessInfoPtr> mojo_processes); + + void CallbackRelay( + const RequestProcessListCallback& callback, + const std::vector<ArcProcess>* ret_processes); + + void UpdateAndReturnProcessList( + const std::vector<arc::RunningAppProcessInfoPtr>* raw_processes, + std::vector<ArcProcess>* ret_processes); + + void PopulateProcessList( + const std::vector<arc::RunningAppProcessInfoPtr>* raw_processes, + std::vector<ArcProcess>* ret_processes); + + void UpdateNspidToPidMap(); + + // Keep a cache pid mapping of all arc processes so to minimize the number of + // nspid lookup from /proc/<PID>/status. + // To play safe, always modify |nspid_to_pid_| on the worker thread. + std::map<base::ProcessId, base::ProcessId> nspid_to_pid_; + + scoped_refptr<base::SequencedWorkerPool> worker_pool_; + + // To ensure internal state changes are done on the same worker thread. + base::ThreadChecker thread_checker_; + + // Always keep this the last member of this class to make sure it's the + // first thing to be destructed. + base::WeakPtrFactory<ArcProcessService> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(ArcProcessService); +}; + +} // namespace arc + +#endif // CHROME_BROWSER_CHROMEOS_ARC_ARC_PROCESS_SERVICE_H_
diff --git a/chrome/browser/chromeos/arc/arc_service_launcher.cc b/chrome/browser/chromeos/arc/arc_service_launcher.cc index cc426fc..a90bd0c3 100644 --- a/chrome/browser/chromeos/arc/arc_service_launcher.cc +++ b/chrome/browser/chromeos/arc/arc_service_launcher.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "chrome/browser/chromeos/arc/arc_auth_service.h" #include "chrome/browser/chromeos/arc/arc_intent_helper_bridge.h" +#include "chrome/browser/chromeos/arc/arc_process_service.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/session_manager_client.h" #include "components/arc/arc_bridge_service.h" @@ -24,6 +25,8 @@ new ArcAuthService(arc_service_manager_->arc_bridge_service()))); arc_service_manager_->AddService(make_scoped_ptr( new ArcIntentHelperBridge(arc_service_manager_->arc_bridge_service()))); + arc_service_manager_->AddService(make_scoped_ptr( + new ArcProcessService(arc_service_manager_->arc_bridge_service()))); // Detect availiability. chromeos::SessionManagerClient* session_manager_client =
diff --git a/chrome/browser/chromeos/login/test/app_window_waiter.cc b/chrome/browser/chromeos/login/test/app_window_waiter.cc index 75a33970..0308b7d 100644 --- a/chrome/browser/chromeos/login/test/app_window_waiter.cc +++ b/chrome/browser/chromeos/login/test/app_window_waiter.cc
@@ -10,7 +10,7 @@ AppWindowWaiter::AppWindowWaiter(extensions::AppWindowRegistry* registry, const std::string& app_id) - : registry_(registry), app_id_(app_id), window_(NULL) { + : registry_(registry), app_id_(app_id) { registry_->AddObserver(this); } @@ -23,18 +23,43 @@ if (window_) return window_; - run_loop_.Run(); + wait_type_ = WAIT_FOR_ADDED; + run_loop_.reset(new base::RunLoop); + run_loop_->Run(); + + return window_; +} + +extensions::AppWindow* AppWindowWaiter::WaitForShown() { + window_ = registry_->GetCurrentAppWindowForApp(app_id_); + if (window_ && !window_->is_hidden()) + return window_; + + wait_type_ = WAIT_FOR_SHOWN; + run_loop_.reset(new base::RunLoop); + run_loop_->Run(); return window_; } void AppWindowWaiter::OnAppWindowAdded(extensions::AppWindow* app_window) { - if (!run_loop_.running()) + if (wait_type_ != WAIT_FOR_ADDED || !run_loop_ || !run_loop_->running()) return; if (app_window->extension_id() == app_id_) { window_ = app_window; - run_loop_.Quit(); + run_loop_->Quit(); + } +} + +void AppWindowWaiter::OnAppWindowShown(extensions::AppWindow* app_window, + bool was_hidden) { + if (wait_type_ != WAIT_FOR_SHOWN || !run_loop_ || !run_loop_->running()) + return; + + if (app_window->extension_id() == app_id_) { + window_ = app_window; + run_loop_->Quit(); } }
diff --git a/chrome/browser/chromeos/login/test/app_window_waiter.h b/chrome/browser/chromeos/login/test/app_window_waiter.h index bb2bfc8..90db4dd 100644 --- a/chrome/browser/chromeos/login/test/app_window_waiter.h +++ b/chrome/browser/chromeos/login/test/app_window_waiter.h
@@ -9,6 +9,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" +#include "base/memory/scoped_ptr.h" #include "base/run_loop.h" #include "extensions/browser/app_window/app_window_registry.h" @@ -26,16 +27,29 @@ const std::string& app_id); ~AppWindowWaiter() override; + // Waits for an AppWindow of the app to be added. extensions::AppWindow* Wait(); + // Waits for an AppWindow of the app to be shown. + extensions::AppWindow* WaitForShown(); + // AppWindowRegistry::Observer: void OnAppWindowAdded(extensions::AppWindow* app_window) override; + void OnAppWindowShown(extensions::AppWindow* app_window, + bool was_hidden) override; private: - extensions::AppWindowRegistry* registry_; - std::string app_id_; - base::RunLoop run_loop_; - extensions::AppWindow* window_; + enum WaitType { + WAIT_FOR_NONE, + WAIT_FOR_ADDED, + WAIT_FOR_SHOWN, + }; + + extensions::AppWindowRegistry* const registry_; + const std::string app_id_; + scoped_ptr<base::RunLoop> run_loop_; + WaitType wait_type_ = WAIT_FOR_NONE; + extensions::AppWindow* window_ = nullptr; DISALLOW_COPY_AND_ASSIGN(AppWindowWaiter); };
diff --git a/chrome/browser/chromeos/login/ui/captive_portal_view.cc b/chrome/browser/chromeos/login/ui/captive_portal_view.cc index b43c87d..e566c99 100644 --- a/chrome/browser/chromeos/login/ui/captive_portal_view.cc +++ b/chrome/browser/chromeos/login/ui/captive_portal_view.cc
@@ -13,7 +13,6 @@ #include "components/captive_portal/captive_portal_detector.h" #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/views/window/dialog_delegate.h" #include "url/gurl.h" namespace { @@ -69,11 +68,6 @@ return true; } -views::NonClientFrameView* CaptivePortalView::CreateNonClientFrameView( - views::Widget* widget) { - return views::DialogDelegate::CreateDialogFrameView(widget); -} - void CaptivePortalView::NavigationStateChanged( content::WebContents* source, content::InvalidateTypes changed_flags) {
diff --git a/chrome/browser/chromeos/login/ui/captive_portal_view.h b/chrome/browser/chromeos/login/ui/captive_portal_view.h index 2acb713a5..57f9962 100644 --- a/chrome/browser/chromeos/login/ui/captive_portal_view.h +++ b/chrome/browser/chromeos/login/ui/captive_portal_view.h
@@ -26,8 +26,6 @@ ui::ModalType GetModalType() const override; base::string16 GetWindowTitle() const override; bool ShouldShowWindowTitle() const override; - views::NonClientFrameView* CreateNonClientFrameView( - views::Widget* widget) override; // Overridden from content::WebContentsDelegate: void NavigationStateChanged(content::WebContents* source,
diff --git a/chrome/browser/chromeos/login/ui/login_feedback.cc b/chrome/browser/chromeos/login/ui/login_feedback.cc new file mode 100644 index 0000000..bf58ed0 --- /dev/null +++ b/chrome/browser/chromeos/login/ui/login_feedback.cc
@@ -0,0 +1,197 @@ +// 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 "chrome/browser/chromeos/login/ui/login_feedback.h" + +#include "base/bind.h" +#include "base/time/time.h" +#include "chrome/browser/chromeos/login/ui/login_display_host.h" +#include "chrome/browser/extensions/api/feedback_private/feedback_private_api.h" +#include "chrome/browser/extensions/component_loader.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/common/extensions/extension_constants.h" +#include "content/public/browser/browser_thread.h" +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/app_window_registry.h" +#include "extensions/browser/extension_registry.h" +#include "extensions/browser/extension_system.h" +#include "extensions/common/extension.h" +#include "grit/browser_resources.h" +#include "ui/aura/window.h" +#include "ui/views/widget/widget.h" +#include "ui/wm/core/window_util.h" + +namespace chromeos { + +namespace { + +extensions::ComponentLoader* GetComponentLoader( + content::BrowserContext* context) { + extensions::ExtensionSystem* extension_system = + extensions::ExtensionSystem::Get(context); + ExtensionService* extension_service = extension_system->extension_service(); + return extension_service->component_loader(); +} + +} // namespace + +//////////////////////////////////////////////////////////////////////////////// +// LoginFeedback::ScopedFeedbackExtension + +class LoginFeedback::ScopedFeedbackExtension + : public extensions::ExtensionRegistryObserver { + public: + explicit ScopedFeedbackExtension(LoginFeedback* owner); + ~ScopedFeedbackExtension() override; + + // extensions::ExtensionRegistryObserver + void OnExtensionReady(content::BrowserContext* browser_context, + const extensions::Extension* extension) override; + + private: + LoginFeedback* const owner_; + DISALLOW_COPY_AND_ASSIGN(ScopedFeedbackExtension); +}; + +LoginFeedback::ScopedFeedbackExtension::ScopedFeedbackExtension( + LoginFeedback* owner) + : owner_(owner) { + Profile* profile = owner_->profile_; + extensions::ExtensionRegistry::Get(profile)->AddObserver(this); + + extensions::ComponentLoader* component_loader = GetComponentLoader(profile); + DCHECK(!component_loader->Exists(extension_misc::kFeedbackExtensionId)) + << "Feedback extension is already loaded. Is there any other " + "LoginFeedback instance running?"; + component_loader->Add(IDR_FEEDBACK_MANIFEST, + base::FilePath(FILE_PATH_LITERAL("feedback"))); +} + +LoginFeedback::ScopedFeedbackExtension::~ScopedFeedbackExtension() { + Profile* profile = owner_->profile_; + extensions::ExtensionRegistry::Get(profile)->RemoveObserver(this); + GetComponentLoader(profile)->Remove(extension_misc::kFeedbackExtensionId); +} + +void LoginFeedback::ScopedFeedbackExtension::OnExtensionReady( + content::BrowserContext* browser_context, + const extensions::Extension* extension) { + if (extension->id() != extension_misc::kFeedbackExtensionId) + return; + owner_->OnFeedbackExtensionReady(); +} + +//////////////////////////////////////////////////////////////////////////////// +// LoginFeedback::FeedbackWindowHandler + +class LoginFeedback::FeedbackWindowHandler + : public extensions::AppWindowRegistry::Observer { + public: + explicit FeedbackWindowHandler(LoginFeedback* owner); + ~FeedbackWindowHandler() override; + + bool HasFeedbackAppWindow() const; + + // extensions::AppWindowRegistry::Observer + void OnAppWindowAdded(extensions::AppWindow* app_window) override; + void OnAppWindowRemoved(extensions::AppWindow* app_window) override; + + private: + LoginFeedback* const owner_; + extensions::AppWindowRegistry* const window_registry_; + + DISALLOW_COPY_AND_ASSIGN(FeedbackWindowHandler); +}; + +LoginFeedback::FeedbackWindowHandler::FeedbackWindowHandler( + LoginFeedback* owner) + : owner_(owner), + window_registry_(extensions::AppWindowRegistry::Get(owner_->profile_)) { + window_registry_->AddObserver(this); +} + +LoginFeedback::FeedbackWindowHandler::~FeedbackWindowHandler() { + window_registry_->RemoveObserver(this); +} + +bool LoginFeedback::FeedbackWindowHandler::HasFeedbackAppWindow() const { + return !window_registry_ + ->GetAppWindowsForApp(extension_misc::kFeedbackExtensionId) + .empty(); +} + +void LoginFeedback::FeedbackWindowHandler::OnAppWindowAdded( + extensions::AppWindow* app_window) { + if (app_window->extension_id() != extension_misc::kFeedbackExtensionId) + return; + + // Move the feedback window to the same container as the login screen and make + // it a transient child of the login screen. + views::Widget::ReparentNativeView( + app_window->GetNativeWindow(), + LoginDisplayHost::default_host()->GetNativeWindow()->parent()); + wm::AddTransientChild(LoginDisplayHost::default_host()->GetNativeWindow(), + app_window->GetNativeWindow()); +} + +void LoginFeedback::FeedbackWindowHandler::OnAppWindowRemoved( + extensions::AppWindow* app_window) { + if (app_window->extension_id() != extension_misc::kFeedbackExtensionId) + return; + + if (!HasFeedbackAppWindow()) + owner_->OnFeedbackFinished(); +} + +//////////////////////////////////////////////////////////////////////////////// +// LoginFeedback + +LoginFeedback::LoginFeedback(Profile* signin_profile) + : profile_(signin_profile), weak_factory_(this) {} + +LoginFeedback::~LoginFeedback() {} + +void LoginFeedback::Request(const std::string& description, + const base::Closure& finished_callback) { + description_ = description; + finished_callback_ = finished_callback; + + feedback_extension_.reset(new ScopedFeedbackExtension(this)); +} + +void LoginFeedback::OnFeedbackExtensionReady() { + feedback_window_handler_.reset(new FeedbackWindowHandler(this)); + EnsureFeedbackUI(); +} + +void LoginFeedback::EnsureFeedbackUI() { + // Bail if any feedback app window is opened. + if (feedback_window_handler_->HasFeedbackAppWindow()) + return; + + extensions::FeedbackPrivateAPI* api = + extensions::FeedbackPrivateAPI::GetFactoryInstance()->Get(profile_); + api->RequestFeedbackForFlow( + description_, "Login", GURL(), + extensions::api::feedback_private::FeedbackFlow::FEEDBACK_FLOW_LOGIN); + + // Check feedback app window shortly after to ensure it is opened. There is + // some racing between the event dispatching and the starting of the + // background page. This is a poor man's way to make sure the event is + // delivered. + // TODO(xiyuan): Investigate why the occasional event lost and remove this. + const int kCheckDelaySecond = 1; + content::BrowserThread::PostDelayedTask( + content::BrowserThread::UI, FROM_HERE, + base::Bind(&LoginFeedback::EnsureFeedbackUI, weak_factory_.GetWeakPtr()), + base::TimeDelta::FromSeconds(kCheckDelaySecond)); +} + +void LoginFeedback::OnFeedbackFinished() { + if (!finished_callback_.is_null()) + finished_callback_.Run(); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/login_feedback.h b/chrome/browser/chromeos/login/ui/login_feedback.h new file mode 100644 index 0000000..80f8731 --- /dev/null +++ b/chrome/browser/chromeos/login/ui/login_feedback.h
@@ -0,0 +1,65 @@ +// 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 CHROME_BROWSER_CHROMEOS_LOGIN_UI_LOGIN_FEEDBACK_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_UI_LOGIN_FEEDBACK_H_ + +#include <string> + +#include "base/callback.h" +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" + +class Profile; + +namespace chromeos { + +// Show the feedback UI to collect a feedback on the login screen. Note that +// it dynamically loads/unloads the feedback extension on the signin profile, +// there should only be one instance live of this class. Otherwise, they would +// stamp on each other toes and not function properly. +class LoginFeedback { + public: + explicit LoginFeedback(Profile* signin_profile); + ~LoginFeedback(); + + // Request to show the feedback UI with |description|. |finished_callback| + // will be invoked when the feedback UI is closed, either cancel or send the + // feedback. + void Request(const std::string& description, + const base::Closure& finished_callback); + + private: + // Loads and unloads the feedback extension on the signin profile. + class ScopedFeedbackExtension; + + // Makes the feedback UI windows on top of login screen and watches when + // all feedback windows are closed. + class FeedbackWindowHandler; + + // Invoked by ScopedFeedbackExtension when feedback extension is ready. + void OnFeedbackExtensionReady(); + + // Invoked by FeedbackWindowHandler when all feedback windows are closed. + void OnFeedbackFinished(); + + // Ensures feedback UI is created. + void EnsureFeedbackUI(); + + Profile* const profile_; + std::string description_; + base::Closure finished_callback_; + + scoped_ptr<ScopedFeedbackExtension> feedback_extension_; + scoped_ptr<FeedbackWindowHandler> feedback_window_handler_; + + base::WeakPtrFactory<LoginFeedback> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(LoginFeedback); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_UI_LOGIN_FEEDBACK_H_
diff --git a/chrome/browser/chromeos/login/ui/login_feedback_browsertest.cc b/chrome/browser/chromeos/login/ui/login_feedback_browsertest.cc new file mode 100644 index 0000000..2b2055b7 --- /dev/null +++ b/chrome/browser/chromeos/login/ui/login_feedback_browsertest.cc
@@ -0,0 +1,52 @@ +// 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 "chrome/browser/chromeos/login/ui/login_feedback.h" + +#include "ash/wm/window_util.h" +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/run_loop.h" +#include "chrome/browser/chromeos/login/login_manager_test.h" +#include "chrome/browser/chromeos/login/test/app_window_waiter.h" +#include "chrome/browser/chromeos/profiles/profile_helper.h" +#include "chrome/common/extensions/extension_constants.h" +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/app_window_registry.h" +#include "extensions/browser/app_window/native_app_window.h" +#include "ui/aura/client/focus_client.h" + +namespace chromeos { + +class LoginFeedbackTest : public LoginManagerTest { + public: + LoginFeedbackTest() : LoginManagerTest(true) {} + ~LoginFeedbackTest() override {} + + private: + DISALLOW_COPY_AND_ASSIGN(LoginFeedbackTest); +}; + +// Test feedback UI shows up and is active. +IN_PROC_BROWSER_TEST_F(LoginFeedbackTest, Basic) { + Profile* const profile = ProfileHelper::GetSigninProfile(); + scoped_ptr<LoginFeedback> login_feedback(new LoginFeedback(profile)); + + base::RunLoop run_loop; + login_feedback->Request("Test feedback", run_loop.QuitClosure()); + + extensions::AppWindow* feedback_window = + AppWindowWaiter(extensions::AppWindowRegistry::Get(profile), + extension_misc::kFeedbackExtensionId) + .WaitForShown(); + ASSERT_NE(nullptr, feedback_window); + EXPECT_FALSE(feedback_window->is_hidden()); + + EXPECT_EQ(feedback_window->GetNativeWindow(), ash::wm::GetActiveWindow()); + + feedback_window->GetBaseWindow()->Close(); + run_loop.Run(); +} + +} // namespace chromeos
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc index 3ff3d1f..168de50b 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc +++ b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
@@ -11,14 +11,18 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/extensions/api/feedback_private.h" +#include "chrome/common/extensions/extension_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "content/public/common/content_switches.h" +#include "content/public/test/browser_test_utils.h" #include "content/public/test/test_utils.h" #include "extensions/browser/app_window/app_window.h" #include "extensions/browser/app_window/app_window_registry.h" #include "extensions/browser/event_router.h" #include "extensions/browser/extension_system.h" +using extensions::api::feedback_private::FeedbackFlow; + namespace { void StopMessageLoopCallback() { @@ -45,14 +49,14 @@ bool IsFeedbackAppAvailable() { return extensions::EventRouter::Get(browser()->profile()) ->ExtensionHasEventListener( - kFeedbackExtensionId, + extension_misc::kFeedbackExtensionId, extensions::api::feedback_private::OnFeedbackRequested::kEventName); } - void StartFeedbackUI() { + void StartFeedbackUI(FeedbackFlow flow) { base::Closure callback = base::Bind(&StopMessageLoopCallback); extensions::FeedbackPrivateGetStringsFunction::set_test_callback(&callback); - InvokeFeedbackUI(); + InvokeFeedbackUI(flow); content::RunMessageLoop(); extensions::FeedbackPrivateGetStringsFunction::set_test_callback(NULL); } @@ -63,27 +67,48 @@ ASSERT_TRUE(window); const Extension* feedback_app = window->GetExtension(); ASSERT_TRUE(feedback_app); - EXPECT_EQ(feedback_app->id(), std::string(kFeedbackExtensionId)); + EXPECT_EQ(feedback_app->id(), + std::string(extension_misc::kFeedbackExtensionId)); } private: - void InvokeFeedbackUI() { + void InvokeFeedbackUI(FeedbackFlow flow) { extensions::FeedbackPrivateAPI* api = extensions::FeedbackPrivateAPI::GetFactoryInstance()->Get( browser()->profile()); - api->RequestFeedback("Test description", - "Test tag", - GURL("http://www.test.com")); + api->RequestFeedbackForFlow("Test description", "Test tag", + GURL("http://www.test.com"), flow); } }; -// See http://crbug.com/369886. -IN_PROC_BROWSER_TEST_F(FeedbackTest, DISABLED_ShowFeedback) { +IN_PROC_BROWSER_TEST_F(FeedbackTest, ShowFeedback) { WaitForExtensionViewsToLoad(); ASSERT_TRUE(IsFeedbackAppAvailable()); - StartFeedbackUI(); + StartFeedbackUI(FeedbackFlow::FEEDBACK_FLOW_REGULAR); VerifyFeedbackAppLaunch(); } +IN_PROC_BROWSER_TEST_F(FeedbackTest, ShowLoginFeedback) { + WaitForExtensionViewsToLoad(); + + ASSERT_TRUE(IsFeedbackAppAvailable()); + StartFeedbackUI(FeedbackFlow::FEEDBACK_FLOW_LOGIN); + VerifyFeedbackAppLaunch(); + + AppWindow* const window = + PlatformAppBrowserTest::GetFirstAppWindowForBrowser(browser()); + ASSERT_TRUE(window); + content::WebContents* const content = window->web_contents(); + + bool bool_result = false; + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( + content, + "domAutomationController.send(" + "$('page-url').hidden && $('attach-file-container').hidden && " + "$('attach-file-note').hidden);", + &bool_result)); + EXPECT_TRUE(bool_result); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc b/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc index 64381675..061742f 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc +++ b/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/extensions/api/feedback_private/feedback_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/signin_manager_factory.h" +#include "chrome/common/extensions/extension_constants.h" #include "chrome/grit/generated_resources.h" #include "components/feedback/tracing_manager.h" #include "components/signin/core/browser/signin_manager.h" @@ -50,8 +51,7 @@ using feedback_private::SystemInformation; using feedback_private::FeedbackInfo; - -char kFeedbackExtensionId[] = "gfdkimpbcpahaombhbimeihdjnejgicl"; +using feedback_private::FeedbackFlow; static base::LazyInstance<BrowserContextKeyedAPIFactory<FeedbackPrivateAPI> > g_factory = LAZY_INSTANCE_INITIALIZER; @@ -79,6 +79,15 @@ const std::string& description_template, const std::string& category_tag, const GURL& page_url) { + RequestFeedbackForFlow(description_template, category_tag, page_url, + FeedbackFlow::FEEDBACK_FLOW_REGULAR); +} + +void FeedbackPrivateAPI::RequestFeedbackForFlow( + const std::string& description_template, + const std::string& category_tag, + const GURL& page_url, + api::feedback_private::FeedbackFlow flow) { if (browser_context_ && EventRouter::Get(browser_context_)) { FeedbackInfo info; info.description = description_template; @@ -89,9 +98,10 @@ if (TracingManager* manager = TracingManager::Get()) { info.trace_id.reset(new int(manager->RequestTrace())); } + info.flow = flow; - scoped_ptr<base::ListValue> args(new base::ListValue()); - args->Append(info.ToValue().release()); + scoped_ptr<base::ListValue> args = + feedback_private::OnFeedbackRequested::Create(info); scoped_ptr<Event> event(new Event( events::FEEDBACK_PRIVATE_ON_FEEDBACK_REQUESTED, @@ -99,7 +109,8 @@ event->restrict_to_browser_context = browser_context_; EventRouter::Get(browser_context_) - ->DispatchEventToExtension(kFeedbackExtensionId, std::move(event)); + ->DispatchEventToExtension(extension_misc::kFeedbackExtensionId, + std::move(event)); } }
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_private_api.h b/chrome/browser/extensions/api/feedback_private/feedback_private_api.h index dfe83e64..bf21cfb3 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_private_api.h +++ b/chrome/browser/extensions/api/feedback_private/feedback_private_api.h
@@ -12,8 +12,6 @@ namespace extensions { -extern char kFeedbackExtensionId[]; - class FeedbackService; using extensions::api::feedback_private::SystemInformation; @@ -24,10 +22,16 @@ ~FeedbackPrivateAPI() override; FeedbackService* GetService() const; + void RequestFeedback(const std::string& description_template, const std::string& category_tag, const GURL& page_url); + void RequestFeedbackForFlow(const std::string& description_template, + const std::string& category_tag, + const GURL& page_url, + api::feedback_private::FeedbackFlow flow); + // BrowserContextKeyedAPI implementation. static BrowserContextKeyedAPIFactory<FeedbackPrivateAPI>* GetFactoryInstance();
diff --git a/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc b/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc index 1a59f99..9016860 100644 --- a/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc +++ b/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc
@@ -340,11 +340,6 @@ .AppendASCII("common"); } - base::FilePath GetWallpaperTestDataDir() const { - return test_data_dir_.AppendASCII("api_test") - .AppendASCII("wallpaper"); - } - int num_galleries() const { return ensure_media_directories_exists_->num_galleries(); } @@ -572,7 +567,6 @@ AddFileToSingleFakeGallery(media::GetTestDataFilePath("90rotation.mp4")); AddFileToSingleFakeGallery(media::GetTestDataFilePath("id3_png_test.mp3")); - AddFileToSingleFakeGallery(GetWallpaperTestDataDir().AppendASCII("test.jpg")); base::ListValue custom_args; #if defined(USE_PROPRIETARY_CODECS)
diff --git a/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc b/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc index d4c5e3c..3160400 100644 --- a/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc +++ b/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc
@@ -128,7 +128,7 @@ } // anonymous namespace -IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_Metrics) { +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Metrics) { base::UserActionTester user_action_tester; base::FieldTrialList::CreateFieldTrial("apitestfieldtrial2", "group1");
diff --git a/chrome/browser/extensions/context_menu_matcher.cc b/chrome/browser/extensions/context_menu_matcher.cc index 24aceca..211932e6 100644 --- a/chrome/browser/extensions/context_menu_matcher.cc +++ b/chrome/browser/extensions/context_menu_matcher.cc
@@ -166,15 +166,18 @@ return item->enabled(); } -void ContextMenuMatcher::ExecuteCommand(int command_id, +void ContextMenuMatcher::ExecuteCommand( + int command_id, content::WebContents* web_contents, + content::RenderFrameHost* render_frame_host, const content::ContextMenuParams& params) { MenuItem* item = GetExtensionMenuItem(command_id); if (!item) return; MenuManager* manager = MenuManager::Get(browser_context_); - manager->ExecuteCommand(browser_context_, web_contents, params, item->id()); + manager->ExecuteCommand(browser_context_, web_contents, render_frame_host, + params, item->id()); } bool ContextMenuMatcher::GetRelevantExtensionTopLevelItems(
diff --git a/chrome/browser/extensions/context_menu_matcher.h b/chrome/browser/extensions/context_menu_matcher.h index ccbf7c0f..19e921c0 100644 --- a/chrome/browser/extensions/context_menu_matcher.h +++ b/chrome/browser/extensions/context_menu_matcher.h
@@ -20,6 +20,7 @@ namespace content { class BrowserContext; +class RenderFrameHost; } namespace extensions { @@ -66,6 +67,7 @@ bool IsCommandIdEnabled(int command_id) const; void ExecuteCommand(int command_id, content::WebContents* web_contents, + content::RenderFrameHost* render_frame_host, const content::ContextMenuParams& params); private:
diff --git a/chrome/browser/extensions/extension_context_menu_browsertest.cc b/chrome/browser/extensions/extension_context_menu_browsertest.cc index 9c6d98c..f9ce770 100644 --- a/chrome/browser/extensions/extension_context_menu_browsertest.cc +++ b/chrome/browser/extensions/extension_context_menu_browsertest.cc
@@ -4,6 +4,7 @@ #include <stddef.h> +#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/extensions/extension_browsertest.h" @@ -14,7 +15,10 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/common/context_menu_params.h" +#include "content/public/test/browser_test_utils.h" +#include "extensions/browser/extension_api_frame_id_map.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/process_manager.h" #include "extensions/browser/test_management_policy.h" @@ -108,6 +112,34 @@ return MenuHasExtensionItemWithLabel(menu.get(), label); } + // Click on a context menu identified by |target_menu_item_id|, and returns + // the result of chrome.test.sendMessage. The .js test file that sets up the + // context menu should call chrome.test.sendMessage in its onclick event. + std::string ClickMenuInFrame(content::RenderFrameHost* frame, + const std::string& target_menu_item_id) { + content::ContextMenuParams params; + if (frame->GetParent()) + params.frame_url = frame->GetLastCommittedURL(); + else + params.page_url = frame->GetLastCommittedURL(); + + TestRenderViewContextMenu menu(frame, params); + menu.Init(); + + MenuItem::Id menu_item_id; + menu_item_id.string_uid = target_menu_item_id; + int command_id = -1; + if (!FindCommandId(&menu, menu_item_id, &command_id)) + return "Menu item not found: " + target_menu_item_id; + + ExtensionTestMessageListener listener(false); + menu.ExecuteCommand(command_id, 0); + if (!listener.WaitUntilSatisfied()) + return "Onclick never fired for menu item: " + target_menu_item_id; + + return listener.message(); + } + // This creates an extension that starts |enabled| and then switches to // |!enabled|. void TestEnabledContextMenu(bool enabled) { @@ -595,6 +627,31 @@ page_url, GURL(), frame_url, std::string("Frame item"))); } +// Tests that info.frameId is correctly set when the context menu is invoked. +IN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, ClickInFrame) { + ExtensionTestMessageListener listener("created items", false); + ASSERT_TRUE(LoadContextMenuExtension("frames")); + GURL url_with_frame("data:text/html,<iframe name='child'>"); + ui_test_utils::NavigateToURL(browser(), url_with_frame); + ASSERT_TRUE(listener.WaitUntilSatisfied()); + + // Click on a menu item in the main frame. + EXPECT_EQ( + "pageUrl=" + url_with_frame.spec() + ", frameUrl=undefined, frameId=0", + ClickMenuInFrame(GetWebContents()->GetMainFrame(), "item1")); + + // Click on a menu item in the child frame. + content::RenderFrameHost* child_frame = content::FrameMatchingPredicate( + GetWebContents(), base::Bind(&content::FrameMatchesName, "child")); + ASSERT_TRUE(child_frame); + int extension_api_frame_id = + extensions::ExtensionApiFrameIdMap::GetFrameId(child_frame); + EXPECT_EQ( + base::StringPrintf("pageUrl=undefined, frameUrl=about:blank, frameId=%d", + extension_api_frame_id), + ClickMenuInFrame(child_frame, "item1")); +} + // Tests enabling and disabling a context menu item. IN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, Enabled) { TestEnabledContextMenu(true);
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc index 787b7b82..886a927 100644 --- a/chrome/browser/extensions/extension_context_menu_model.cc +++ b/chrome/browser/extensions/extension_context_menu_model.cc
@@ -242,7 +242,7 @@ command_id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) { DCHECK(extension_items_); extension_items_->ExecuteCommand(command_id, GetActiveWebContents(), - content::ContextMenuParams()); + nullptr, content::ContextMenuParams()); return; }
diff --git a/chrome/browser/extensions/menu_manager.cc b/chrome/browser/extensions/menu_manager.cc index 9c794fa..77a7b9c 100644 --- a/chrome/browser/extensions/menu_manager.cc +++ b/chrome/browser/extensions/menu_manager.cc
@@ -28,6 +28,7 @@ #include "content/public/common/child_process_host.h" #include "content/public/common/context_menu_params.h" #include "extensions/browser/event_router.h" +#include "extensions/browser/extension_api_frame_id_map.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/guest_view/web_view/web_view_guest.h" #include "extensions/browser/state_store.h" @@ -617,6 +618,7 @@ void MenuManager::ExecuteCommand(content::BrowserContext* context, WebContents* web_contents, + content::RenderFrameHost* render_frame_host, const content::ContextMenuParams& params, const MenuItem::Id& menu_item_id) { EventRouter* event_router = EventRouter::Get(context); @@ -679,6 +681,10 @@ if (!extension || !extension->is_platform_app()) { // Note: web_contents are NULL in unit tests :( if (web_contents) { + int frame_id = ExtensionApiFrameIdMap::GetFrameId(render_frame_host); + if (frame_id != ExtensionApiFrameIdMap::kInvalidFrameId) + properties->SetInteger("frameId", frame_id); + args->Append( ExtensionTabUtil::CreateTabObject(web_contents)->ToValue().release()); } else {
diff --git a/chrome/browser/extensions/menu_manager.h b/chrome/browser/extensions/menu_manager.h index 7386d9a..0e9bf8f 100644 --- a/chrome/browser/extensions/menu_manager.h +++ b/chrome/browser/extensions/menu_manager.h
@@ -32,6 +32,7 @@ namespace content { class BrowserContext; +class RenderFrameHost; class WebContents; struct ContextMenuParams; } @@ -340,6 +341,7 @@ // Called when a menu item is clicked on by the user. void ExecuteCommand(content::BrowserContext* context, content::WebContents* web_contents, + content::RenderFrameHost* render_frame_host, const content::ContextMenuParams& params, const MenuItem::Id& menu_item_id);
diff --git a/chrome/browser/extensions/menu_manager_unittest.cc b/chrome/browser/extensions/menu_manager_unittest.cc index 29fa6d5..e22aeb6 100644 --- a/chrome/browser/extensions/menu_manager_unittest.cc +++ b/chrome/browser/extensions/menu_manager_unittest.cc
@@ -590,7 +590,8 @@ .Times(1) .WillOnce(DeleteArg<2>()); } - manager_.ExecuteCommand(&profile, NULL /* web_contents */, params, id); + manager_.ExecuteCommand(&profile, nullptr /* web_contents */, + nullptr /* render_frame_host */, params, id); ASSERT_EQ(2u, list->GetSize());
diff --git a/chrome/browser/lifetime/keep_alive_registry.cc b/chrome/browser/lifetime/keep_alive_registry.cc index 08c6c78..dbe7cbc2 100644 --- a/chrome/browser/lifetime/keep_alive_registry.cc +++ b/chrome/browser/lifetime/keep_alive_registry.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/lifetime/keep_alive_registry.h" #include "chrome/browser/lifetime/application_lifetime.h" +#include "chrome/browser/lifetime/keep_alive_state_observer.h" #include "chrome/browser/lifetime/keep_alive_types.h" //////////////////////////////////////////////////////////////////////////////// @@ -15,29 +16,62 @@ return base::Singleton<KeepAliveRegistry>::get(); } -bool KeepAliveRegistry::WillKeepAlive() const { +bool KeepAliveRegistry::IsKeepingAlive() const { return registered_count_ > 0; } +bool KeepAliveRegistry::IsRestartAllowed() const { + return registered_count_ == restart_allowed_count_; +} + +void KeepAliveRegistry::AddObserver(KeepAliveStateObserver* observer) { + observers_.AddObserver(observer); +} + +void KeepAliveRegistry::RemoveObserver(KeepAliveStateObserver* observer) { + observers_.RemoveObserver(observer); +} + //////////////////////////////////////////////////////////////////////////////// // Private methods -KeepAliveRegistry::KeepAliveRegistry() : registered_count_(0) {} +KeepAliveRegistry::KeepAliveRegistry() + : registered_count_(0), restart_allowed_count_(0) {} KeepAliveRegistry::~KeepAliveRegistry() { DCHECK_EQ(0, registered_count_); DCHECK_EQ(0u, registered_keep_alives_.size()); + DCHECK_EQ(0, restart_allowed_count_); } -void KeepAliveRegistry::Register(KeepAliveOrigin origin) { - if (!WillKeepAlive()) - chrome::IncrementKeepAliveCount(); +void KeepAliveRegistry::Register(KeepAliveOrigin origin, + KeepAliveRestartOption restart) { + bool old_keeping_alive = IsKeepingAlive(); + bool old_restart_allowed = IsRestartAllowed(); ++registered_keep_alives_[origin]; ++registered_count_; + + if (restart == KeepAliveRestartOption::ENABLED) + ++restart_allowed_count_; + + bool new_keeping_alive = IsKeepingAlive(); + bool new_restart_allowed = IsRestartAllowed(); + + if (new_keeping_alive != old_keeping_alive) + OnKeepingAliveChanged(new_keeping_alive); + + if (new_restart_allowed != old_restart_allowed) + OnRestartAllowedChanged(new_restart_allowed); + + DVLOG(1) << "New state of the KeepAliveRegistry: " << *this; } -void KeepAliveRegistry::Unregister(KeepAliveOrigin origin) { +void KeepAliveRegistry::Unregister(KeepAliveOrigin origin, + KeepAliveRestartOption restart) { + bool old_keeping_alive = IsKeepingAlive(); + bool old_restart_allowed = IsRestartAllowed(); + --registered_count_; DCHECK_GE(registered_count_, 0); @@ -46,6 +80,49 @@ if (new_count == 0) registered_keep_alives_.erase(origin); - if (!WillKeepAlive()) - chrome::DecrementKeepAliveCount(); + if (restart == KeepAliveRestartOption::ENABLED) + --restart_allowed_count_; + + bool new_keeping_alive = IsKeepingAlive(); + bool new_restart_allowed = IsRestartAllowed(); + + if (new_restart_allowed != old_restart_allowed) + OnRestartAllowedChanged(new_restart_allowed); + + if (new_keeping_alive != old_keeping_alive) + OnKeepingAliveChanged(new_keeping_alive); + + DVLOG(1) << "New state of the KeepAliveRegistry: " << *this; } + +void KeepAliveRegistry::OnKeepingAliveChanged(bool new_keeping_alive) { + if (new_keeping_alive) { + DVLOG(1) << "KeepAliveRegistry is now keeping the browser alive."; + chrome::IncrementKeepAliveCount(); + } else { + DVLOG(1) << "KeepAliveRegistry stopped keeping the browser alive."; + chrome::DecrementKeepAliveCount(); + } +} + +void KeepAliveRegistry::OnRestartAllowedChanged(bool new_restart_allowed) { + DVLOG(1) << "Notifying KeepAliveStateObservers: Restart changed to: " + << new_restart_allowed; + FOR_EACH_OBSERVER(KeepAliveStateObserver, observers_, + OnKeepAliveRestartStateChanged(new_restart_allowed)); +} + +#ifndef NDEBUG +std::ostream& operator<<(std::ostream& out, const KeepAliveRegistry& registry) { + out << "{KeepingAlive=" << registry.IsKeepingAlive() + << ", RestartAllowed=" << registry.IsRestartAllowed() << ", KeepAlives=["; + for (auto counts_per_origin_it : registry.registered_keep_alives_) { + if (counts_per_origin_it != *registry.registered_keep_alives_.begin()) + out << ", "; + out << counts_per_origin_it.first << " (" << counts_per_origin_it.second + << ")"; + } + out << "]}"; + return out; +} +#endif // ndef NDEBUG
diff --git a/chrome/browser/lifetime/keep_alive_registry.h b/chrome/browser/lifetime/keep_alive_registry.h index db47677..f504fa0 100644 --- a/chrome/browser/lifetime/keep_alive_registry.h +++ b/chrome/browser/lifetime/keep_alive_registry.h
@@ -9,26 +9,43 @@ #include "base/macros.h" #include "base/memory/singleton.h" +#include "base/observer_list.h" enum class KeepAliveOrigin; +enum class KeepAliveRestartOption; +class KeepAliveStateObserver; class KeepAliveRegistry { public: static KeepAliveRegistry* GetInstance(); - bool WillKeepAlive() const; + // Methods to query the state of the registry. + // TODO(dgn): This currently does not give a complete picture. It has no + // information about the many places that rely on IncrementKeepAliveCount and + // AddRefModule to keep the browser alive. Tracked by https://crbug.com/587926 + bool IsKeepingAlive() const; + bool IsRestartAllowed() const; + + void AddObserver(KeepAliveStateObserver* observer); + void RemoveObserver(KeepAliveStateObserver* observer); private: friend struct base::DefaultSingletonTraits<KeepAliveRegistry>; // Friend to be able to use Register/Unregister friend class ScopedKeepAlive; + friend std::ostream& operator<<(std::ostream& out, + const KeepAliveRegistry& registry); KeepAliveRegistry(); ~KeepAliveRegistry(); // Add/Remove entries. Do not use directly, use ScopedKeepAlive instead. - void Register(KeepAliveOrigin origin); - void Unregister(KeepAliveOrigin origin); + void Register(KeepAliveOrigin origin, KeepAliveRestartOption restart); + void Unregister(KeepAliveOrigin origin, KeepAliveRestartOption restart); + + // Methods called when a specific aspect of the state of the registry changes. + void OnKeepingAliveChanged(bool new_keeping_alive); + void OnRestartAllowedChanged(bool new_restart_allowed); // Tracks the registered KeepAlives, storing the origin and the number of // registered KeepAlives for each. @@ -37,7 +54,16 @@ // Total number of registered KeepAlives int registered_count_; + // Number of registered keep alives that have KeepAliveRestartOption::ENABLED. + int restart_allowed_count_; + + base::ObserverList<KeepAliveStateObserver> observers_; + DISALLOW_COPY_AND_ASSIGN(KeepAliveRegistry); }; +#ifndef NDEBUG +std::ostream& operator<<(std::ostream& out, const KeepAliveRegistry& registry); +#endif // ndef NDEBUG + #endif // CHROME_BROWSER_LIFETIME_KEEP_ALIVE_REGISTRY_H_
diff --git a/chrome/browser/lifetime/keep_alive_registry_unittest.cc b/chrome/browser/lifetime/keep_alive_registry_unittest.cc index acff5539..b2916ec 100644 --- a/chrome/browser/lifetime/keep_alive_registry_unittest.cc +++ b/chrome/browser/lifetime/keep_alive_registry_unittest.cc
@@ -6,54 +6,119 @@ #include "base/memory/scoped_ptr.h" #include "chrome/browser/lifetime/application_lifetime.h" +#include "chrome/browser/lifetime/keep_alive_state_observer.h" #include "chrome/browser/lifetime/keep_alive_types.h" #include "chrome/browser/lifetime/scoped_keep_alive.h" #include "testing/gtest/include/gtest/gtest.h" -// Test the WillKeepAlive state and when we interact with the browser with +class KeepAliveRegistryTest : public testing::Test, + public KeepAliveStateObserver { + public: + KeepAliveRegistryTest() + : on_restart_allowed_call_count_(0), + on_restart_forbidden_call_count_(0), + registry_(KeepAliveRegistry::GetInstance()) { + registry_->AddObserver(this); + + EXPECT_FALSE(registry_->IsKeepingAlive()); + } + + ~KeepAliveRegistryTest() override { + registry_->RemoveObserver(this); + + EXPECT_FALSE(registry_->IsKeepingAlive()); + } + + void OnKeepAliveRestartStateChanged(bool can_restart) override { + if (can_restart) + ++on_restart_allowed_call_count_; + else + ++on_restart_forbidden_call_count_; + } + + protected: + int on_restart_allowed_call_count_; + int on_restart_forbidden_call_count_; + KeepAliveRegistry* registry_; +}; + +// Test the IsKeepingAlive state and when we interact with the browser with // a KeepAlive registered. -TEST(KeepAliveRegistryTest, BasicKeepAliveTest) { +TEST_F(KeepAliveRegistryTest, BasicKeepAliveTest) { const int base_keep_alive_count = chrome::GetKeepAliveCountForTesting(); KeepAliveRegistry* registry = KeepAliveRegistry::GetInstance(); - EXPECT_FALSE(registry->WillKeepAlive()); + EXPECT_FALSE(registry->IsKeepingAlive()); { // Arbitrarily chosen Origin - ScopedKeepAlive test_keep_alive(KeepAliveOrigin::CHROME_APP_DELEGATE); + ScopedKeepAlive test_keep_alive(KeepAliveOrigin::CHROME_APP_DELEGATE, + KeepAliveRestartOption::DISABLED); // We should require the browser to stay alive EXPECT_EQ(base_keep_alive_count + 1, chrome::GetKeepAliveCountForTesting()); - EXPECT_TRUE(registry->WillKeepAlive()); + EXPECT_TRUE(registry_->IsKeepingAlive()); } // We should be back to normal now. EXPECT_EQ(base_keep_alive_count, chrome::GetKeepAliveCountForTesting()); - EXPECT_FALSE(registry->WillKeepAlive()); + EXPECT_FALSE(registry_->IsKeepingAlive()); } -// Test the WillKeepAlive state and when we interact with the browser with +// Test the IsKeepingAlive state and when we interact with the browser with // more than one KeepAlive registered. -TEST(KeepAliveRegistryTest, DoubleKeepAliveTest) { +TEST_F(KeepAliveRegistryTest, DoubleKeepAliveTest) { const int base_keep_alive_count = chrome::GetKeepAliveCountForTesting(); - KeepAliveRegistry* registry = KeepAliveRegistry::GetInstance(); scoped_ptr<ScopedKeepAlive> keep_alive_1, keep_alive_2; - keep_alive_1.reset(new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE)); + keep_alive_1.reset(new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE, + KeepAliveRestartOption::DISABLED)); EXPECT_EQ(base_keep_alive_count + 1, chrome::GetKeepAliveCountForTesting()); - EXPECT_TRUE(registry->WillKeepAlive()); + EXPECT_TRUE(registry_->IsKeepingAlive()); - keep_alive_2.reset(new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE)); + keep_alive_2.reset(new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE, + KeepAliveRestartOption::DISABLED)); // We should not increment the count twice EXPECT_EQ(base_keep_alive_count + 1, chrome::GetKeepAliveCountForTesting()); - EXPECT_TRUE(registry->WillKeepAlive()); + EXPECT_TRUE(registry_->IsKeepingAlive()); keep_alive_1.reset(); // We should not decrement the count before the last keep alive is released. EXPECT_EQ(base_keep_alive_count + 1, chrome::GetKeepAliveCountForTesting()); - EXPECT_TRUE(registry->WillKeepAlive()); + EXPECT_TRUE(registry_->IsKeepingAlive()); keep_alive_2.reset(); EXPECT_EQ(base_keep_alive_count, chrome::GetKeepAliveCountForTesting()); - EXPECT_FALSE(registry->WillKeepAlive()); + EXPECT_FALSE(registry_->IsKeepingAlive()); +} + +// Test the IsKeepingAlive state and when we interact with the browser with +// more than one KeepAlive registered. +TEST_F(KeepAliveRegistryTest, RestartOptionTest) { + scoped_ptr<ScopedKeepAlive> keep_alive, keep_alive_restart; + + EXPECT_EQ(0, on_restart_allowed_call_count_); + EXPECT_EQ(0, on_restart_forbidden_call_count_); + + // With a normal keep alive, restart should not be allowed + keep_alive.reset(new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE, + KeepAliveRestartOption::DISABLED)); + ASSERT_EQ(1, on_restart_forbidden_call_count_--); // decrement to ack + + // Restart should not be allowed if all KA don't allow it. + keep_alive_restart.reset(new ScopedKeepAlive( + KeepAliveOrigin::CHROME_APP_DELEGATE, KeepAliveRestartOption::ENABLED)); + EXPECT_EQ(0, on_restart_allowed_call_count_); + + // Now restart should be allowed, the only one left allows it. + keep_alive.reset(); + ASSERT_EQ(1, on_restart_allowed_call_count_--); + + // No keep alive, we should no prevent restarts. + keep_alive.reset(); + EXPECT_EQ(0, on_restart_forbidden_call_count_); + + // Make sure all calls were checked. + EXPECT_EQ(0, on_restart_allowed_call_count_); + EXPECT_EQ(0, on_restart_forbidden_call_count_); }
diff --git a/chrome/browser/lifetime/keep_alive_state_observer.h b/chrome/browser/lifetime/keep_alive_state_observer.h new file mode 100644 index 0000000..0e959b1 --- /dev/null +++ b/chrome/browser/lifetime/keep_alive_state_observer.h
@@ -0,0 +1,18 @@ +// 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 CHROME_BROWSER_LIFETIME_KEEP_ALIVE_STATE_OBSERVER_H_ +#define CHROME_BROWSER_LIFETIME_KEEP_ALIVE_STATE_OBSERVER_H_ + +struct KeepAliveOptions; + +class KeepAliveStateObserver { + public: + virtual void OnKeepAliveRestartStateChanged(bool can_restart) = 0; + + protected: + virtual ~KeepAliveStateObserver() {} +}; + +#endif // CHROME_BROWSER_LIFETIME_KEEP_ALIVE_STATE_OBSERVER_H_
diff --git a/chrome/browser/lifetime/keep_alive_types.cc b/chrome/browser/lifetime/keep_alive_types.cc index 0cd4fce..a96050e 100644 --- a/chrome/browser/lifetime/keep_alive_types.cc +++ b/chrome/browser/lifetime/keep_alive_types.cc
@@ -10,6 +10,8 @@ switch (origin) { case KeepAliveOrigin::BACKGROUND_MODE_MANAGER: return out << "BACKGROUND_MODE_MANAGER"; + case KeepAliveOrigin::BACKGROUND_MODE_MANAGER_STARTUP: + return out << "BACKGROUND_MODE_MANAGER_STARTUP"; case KeepAliveOrigin::APP_LIST_SERVICE_VIEWS: return out << "APP_LIST_SERVICE_VIEWS"; case KeepAliveOrigin::APP_LIST_SHOWER: @@ -27,4 +29,18 @@ NOTREACHED(); return out << static_cast<int>(origin); } -#endif // ndef DEBUG + +std::ostream& operator<<(std::ostream& out, + const KeepAliveRestartOption& restart) { + switch (restart) { + case KeepAliveRestartOption::DISABLED: + return out << "DISABLED"; + case KeepAliveRestartOption::ENABLED: + return out << "ENABLED"; + } + + NOTREACHED(); + return out << static_cast<int>(restart); +} + +#endif // ndef NDEBUG
diff --git a/chrome/browser/lifetime/keep_alive_types.h b/chrome/browser/lifetime/keep_alive_types.h index 0fc846649..e41d5c1c 100644 --- a/chrome/browser/lifetime/keep_alive_types.h +++ b/chrome/browser/lifetime/keep_alive_types.h
@@ -7,9 +7,16 @@ #include <ostream> +// Types here are used to register KeepAlives. +// They Give indications about which kind of optimizations are allowed during +// the KeepAlive's lifetime. This allows to have more info about the state of +// the browser to optimize the resource consumption. + +// Refers to the what the KeepAlive's lifetime is tied to, to help debugging. enum class KeepAliveOrigin { // c/b/background BACKGROUND_MODE_MANAGER, + BACKGROUND_MODE_MANAGER_STARTUP, // c/b/ui APP_LIST_SERVICE_VIEWS, @@ -20,8 +27,14 @@ USER_MANAGER_VIEW }; +// Restart: Allow Chrome to restart when all the registered KeepAlives allow +// restarts +enum class KeepAliveRestartOption { DISABLED, ENABLED }; + #ifndef NDEBUG std::ostream& operator<<(std::ostream& out, const KeepAliveOrigin& origin); +std::ostream& operator<<(std::ostream& out, + const KeepAliveRestartOption& restart); #endif // ndef NDEBUG #endif // CHROME_BROWSER_LIFETIME_KEEP_ALIVE_TYPES_H_
diff --git a/chrome/browser/lifetime/scoped_keep_alive.cc b/chrome/browser/lifetime/scoped_keep_alive.cc index 0e0e935..42c2b9d 100644 --- a/chrome/browser/lifetime/scoped_keep_alive.cc +++ b/chrome/browser/lifetime/scoped_keep_alive.cc
@@ -7,10 +7,12 @@ #include "chrome/browser/lifetime/keep_alive_registry.h" #include "chrome/browser/lifetime/keep_alive_types.h" -ScopedKeepAlive::ScopedKeepAlive(KeepAliveOrigin origin) : origin_(origin) { - KeepAliveRegistry::GetInstance()->Register(origin_); +ScopedKeepAlive::ScopedKeepAlive(KeepAliveOrigin origin, + KeepAliveRestartOption restart) + : origin_(origin), restart_(restart) { + KeepAliveRegistry::GetInstance()->Register(origin_, restart_); } ScopedKeepAlive::~ScopedKeepAlive() { - KeepAliveRegistry::GetInstance()->Unregister(origin_); + KeepAliveRegistry::GetInstance()->Unregister(origin_, restart_); }
diff --git a/chrome/browser/lifetime/scoped_keep_alive.h b/chrome/browser/lifetime/scoped_keep_alive.h index 8e73723a..5dbc4b91 100644 --- a/chrome/browser/lifetime/scoped_keep_alive.h +++ b/chrome/browser/lifetime/scoped_keep_alive.h
@@ -8,16 +8,18 @@ #include "base/macros.h" enum class KeepAliveOrigin; +enum class KeepAliveRestartOption; // Registers with KeepAliveRegistry on creation and unregisters them // on destruction. Use these objects with a scoped_ptr for easy management. class ScopedKeepAlive { public: - explicit ScopedKeepAlive(KeepAliveOrigin origin); + ScopedKeepAlive(KeepAliveOrigin origin, KeepAliveRestartOption restart); ~ScopedKeepAlive(); private: const KeepAliveOrigin origin_; + const KeepAliveRestartOption restart_; DISALLOW_COPY_AND_ASSIGN(ScopedKeepAlive); };
diff --git a/chrome/browser/push_messaging/push_messaging_browsertest.cc b/chrome/browser/push_messaging/push_messaging_browsertest.cc index 192cdbac..4caad51 100644 --- a/chrome/browser/push_messaging/push_messaging_browsertest.cc +++ b/chrome/browser/push_messaging/push_messaging_browsertest.cc
@@ -484,6 +484,33 @@ EXPECT_EQ("testdata", script_result); } +IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventWithoutPayload) { + std::string script_result; + + TryToSubscribeSuccessfully("1-0" /* expected_push_subscription_id */); + + PushMessagingAppIdentifier app_identifier = + GetAppIdentifierForServiceWorkerRegistration(0LL); + EXPECT_EQ(app_identifier.app_id(), gcm_service()->last_registered_app_id()); + EXPECT_EQ("1234567890", gcm_service()->last_registered_sender_ids()[0]); + + ASSERT_TRUE(RunScript("isControlled()", &script_result)); + ASSERT_EQ("false - is not controlled", script_result); + + LoadTestPage(); // Reload to become controlled. + + ASSERT_TRUE(RunScript("isControlled()", &script_result)); + ASSERT_EQ("true - is controlled", script_result); + + gcm::IncomingMessage message; + message.sender_id = "1234567890"; + message.decrypted = false; + + push_service()->OnMessage(app_identifier.app_id(), message); + ASSERT_TRUE(RunScript("resultQueue.pop()", &script_result)); + EXPECT_EQ("[NULL]", script_result); +} + IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventNoServiceWorker) { std::string script_result;
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index a1e4bc7..7f69247 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -1654,7 +1654,8 @@ // Process extension menu items. if (ContextMenuMatcher::IsExtensionsCustomCommandId(id)) { - extension_items_.ExecuteCommand(id, source_web_contents_, params_); + extension_items_.ExecuteCommand(id, source_web_contents_, + GetRenderFrameHost(), params_); return; }
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util.js index 9a0038e3..3e29b6b 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_util.js
@@ -268,4 +268,17 @@ return a == b; }; +/** + * Determines whether or not a node is or is the descendant of another node. + * @param {!AutomationNode} node + * @param {!AutomationNode} ancestor + * @return {boolean} + */ +AutomationUtil.isDescendantOf = function(node, ancestor) { + var testNode = node; + while (testNode && testNode !== ancestor) + testNode = testNode.parent; + return testNode === ancestor; +}; + }); // goog.scope
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs index f124f88..d8f3338 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
@@ -556,3 +556,33 @@ .replay(); }.bind(this)); }); + +TEST_F('BackgroundTest', 'Checkbox', function() { + var mockFeedback = this.createMockFeedback(); + this.runWithLoadedTree(function() {/*! + <div id="go" role="checkbox">go</div> + <script> + var go = document.getElementById('go'); + var isChecked = true; + go.addEventListener('click', function(e) { + if (isChecked) + go.setAttribute('aria-checked', true); + else + go.removeAttribute('aria-checked'); + isChecked = !isChecked; + }); + </script> + */}, function(root) { + var cbx = root.find({role: 'checkBox'}); + var click = cbx.doDefault.bind(cbx); + mockFeedback.call(click) + .expectSpeech('go') + .expectSpeech('Check box') + .expectSpeech('checked') + .call(click) + .expectSpeech('go') + .expectSpeech('Check box') + .expectSpeech('not checked') + .replay(); + }); +});
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/base_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/base_automation_handler.js index 3a522e1..eb124f0 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/base_automation_handler.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/base_automation_handler.js
@@ -30,6 +30,8 @@ */ this.listenerMap_ = { alert: this.onAlert, + ariaAttributeChanged: this.onEventIfInRange, + checkedStateChanged: this.onEventIfInRange, focus: this.onFocus, hover: this.onEventDefault, loadComplete: this.onLoadComplete, @@ -126,6 +128,17 @@ /** * @param {!AutomationEvent} evt */ + onEventIfInRange: function(evt) { + // TODO(dtseng): Consider the end of the current range as well. + if (AutomationUtil.isDescendantOf( + global.backgroundObj.currentRange.start.node, evt.target) || + evt.target.state.focused) + this.onEventDefault(evt); + }, + + /** + * @param {!AutomationEvent} evt + */ onMenuStart: function(evt) {}, /**
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js index 3ef4c40..266ff6a 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
@@ -56,6 +56,12 @@ }).bind(this)); }; +/** + * Time to wait until processing more value changed events. + * @const {number} + */ +DesktopAutomationHandler.VMIN_VALUE_CHANGE_DELAY_MS = 500; + DesktopAutomationHandler.prototype = { __proto__: BaseAutomationHandler.prototype, @@ -242,16 +248,20 @@ ChromeVoxState.instance.mode === ChromeVoxMode.CLASSIC) return; - if (!evt.target.state.focused && evt.target.root.role != RoleType.desktop) - return; + var t = evt.target; + if (t.state.focused || + t.root.role == RoleType.desktop || + AutomationUtil.isDescendantOf( + global.backgroundObj.currentRange.start.node, t)) { + if (new Date() - this.lastValueChanged_ <= + DesktopAutomationHandler.VMIN_VALUE_CHANGE_DELAY_MS) + return; - if (new Date() - this.lastValueChanged_ <= 500) - return; + this.lastValueChanged_ = new Date(); - this.lastValueChanged_ = new Date(); - - new Output().format('$value', evt.target) - .go(); + new Output().format('$value', evt.target) + .go(); + } }, /**
diff --git a/chrome/browser/resources/chromeos/chromevox/host/chrome/tts_background.js b/chrome/browser/resources/chromeos/chromevox/host/chrome/tts_background.js index b972aa0..94376942 100644 --- a/chrome/browser/resources/chromeos/chromevox/host/chrome/tts_background.js +++ b/chrome/browser/resources/chromeos/chromevox/host/chrome/tts_background.js
@@ -257,8 +257,6 @@ // any speech very well. Handle empty and whitespace only strings (including // non-breaking space) here to mitigate the issue somewhat. if (/^[\s\u00a0]*$/.test(textString)) { - queueMode = cvox.QueueMode.FLUSH; - // We still want to callback for listeners in our content script. if (properties['startCallback']) { try { @@ -272,6 +270,9 @@ } catch (e) { } } + if (queueMode === cvox.QueueMode.FLUSH) { + this.stop(); + } return this; }
diff --git a/chrome/browser/resources/chromeos/login/screen_unrecoverable_cryptohome_error.html b/chrome/browser/resources/chromeos/login/screen_unrecoverable_cryptohome_error.html index 11a6f35..7901074 100644 --- a/chrome/browser/resources/chromeos/login/screen_unrecoverable_cryptohome_error.html +++ b/chrome/browser/resources/chromeos/login/screen_unrecoverable_cryptohome_error.html
@@ -4,6 +4,8 @@ <unrecoverable-cryptohome-error-card id="unrecoverable-cryptohome-error-card"> </unrecoverable-cryptohome-error-card> <div id="unrecoverable-cryptohome-error-busy" class="step-loading" hidden> - <throbber-notice i18n-values="text:gaiaLoading"></throbber-notice> + <throbber-notice + i18n-values="text:unrecoverableCryptohomeErrorRecreatingProfile"> + </throbber-notice> </div> </div>
diff --git a/chrome/browser/resources/chromeos/login/screen_unrecoverable_cryptohome_error.js b/chrome/browser/resources/chromeos/login/screen_unrecoverable_cryptohome_error.js index 42dd380..a00d536 100644 --- a/chrome/browser/resources/chromeos/login/screen_unrecoverable_cryptohome_error.js +++ b/chrome/browser/resources/chromeos/login/screen_unrecoverable_cryptohome_error.js
@@ -6,7 +6,8 @@ 'unrecoverable-cryptohome-error', function() { return { EXTERNAL_API: [ - 'show' + 'show', + 'resumeAfterFeedbackUI' ], /** @override */ @@ -16,11 +17,8 @@ this.card_.addEventListener('done', function(e) { this.setLoading_(true); - if (e.detail.shouldSendFeedback) { - chrome.send('sendFeedbackAndResyncUserData'); - } else { - chrome.send('resyncUserData'); - } + $('oobe').hidden = true; // Hide while showing the feedback UI. + chrome.send('sendFeedbackAndResyncUserData'); }.bind(this)); }, @@ -34,13 +32,21 @@ }, /** - * Show password changed screen. + * Show the unrecoverable cryptohome error screen to ask user permission + * to collect a feedback report. */ show: function() { this.setLoading_(false); Oobe.getInstance().headerHidden = true; Oobe.showScreen({id: SCREEN_UNRECOVERABLE_CRYPTOHOME_ERROR}); + }, + + /** + * Shows the loading UI after the feedback UI is dismissed. + */ + resumeAfterFeedbackUI: function() { + $('oobe').hidden = false; } }; });
diff --git a/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.css b/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.css index f08ddb4..4bc35e3 100644 --- a/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.css +++ b/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.css
@@ -4,5 +4,16 @@ */ :host .content { - padding: 1em; + padding: 24px 24px 16px; +} + +:host .title { + font-weight: bold; + white-space: nowrap; + word-wrap: normal; +} + +:host .message { + margin-bottom: 25px; + margin-top: 20px; }
diff --git a/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.html b/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.html index 3c09687..bc00a605 100644 --- a/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.html +++ b/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.html
@@ -3,7 +3,6 @@ found in the LICENSE file. --> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html"> <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> <!-- @@ -12,9 +11,6 @@ sending us a feedback and allows user to re-create the cryptohome so that the device could still be used. - Attributes: - 'shouldSendFeedback' - Whether to send feedback - Events: 'done' - fired when user clicks on continue button. --> @@ -23,15 +19,11 @@ <template> <div class="content"> - <div class="gaia-body-text horizontal layout center"> - <p i18n-content="unrecoverableCryptohomeErrorMessage" class="flex"> - </p> + <div i18n-content="unrecoverableCryptohomeErrorMessageTitle" class="title"> </div> - <p> - <paper-checkbox id="sendFeedback" checked="{{shouldSendFeedback}}"> - <span i18n-content="unrecoverableCryptohomeErrorSendFeedback"></span> - </paper-checkbox> - </p> + <div class="message" + i18n-values=".innerHTML:unrecoverableCryptohomeErrorMessage"> + </div> <div class="horizontal-reverse layout justified center"> <gaia-button on-tap="onContinueClicked_" i18n-content="unrecoverableCryptohomeErrorContinue">
diff --git a/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.js b/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.js index 4fd4839..4a35d7a 100644 --- a/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.js +++ b/chrome/browser/resources/chromeos/login/unrecoverable_cryptohome_error_card.js
@@ -5,14 +5,7 @@ Polymer({ is: 'unrecoverable-cryptohome-error-card', - properties: { - shouldSendFeedback: { - type: Boolean, - value: true - } - }, - onContinueClicked_: function() { - this.fire('done', {shouldSendFeedback: this.shouldSendFeedback}); + this.fire('done'); }, });
diff --git a/chrome/browser/resources/feedback/css/feedback.css b/chrome/browser/resources/feedback/css/feedback.css index 0e09874..7270cf6d 100644 --- a/chrome/browser/resources/feedback/css/feedback.css +++ b/chrome/browser/resources/feedback/css/feedback.css
@@ -16,6 +16,10 @@ width: 100%; } +[hidden] { + display: none !important; +} + .title-bar { -webkit-align-items: center; -webkit-app-region: drag;
diff --git a/chrome/browser/resources/feedback/js/event_handler.js b/chrome/browser/resources/feedback/js/event_handler.js index ebc426d..4ca6d1288 100644 --- a/chrome/browser/resources/feedback/js/event_handler.js +++ b/chrome/browser/resources/feedback/js/event_handler.js
@@ -200,14 +200,6 @@ * @param {Object} feedbackInfo Object containing any initial feedback info. */ function startFeedbackUI(feedbackInfo) { - initialFeedbackInfo = feedbackInfo; - finalFeedbackInfo = null; - systemInfo = null; - isSystemInfoReady = false; - onSystemInfoReadyCallback = null; - - chrome.feedbackPrivate.getSystemInformation(getSystemInformationCallback); - var win = chrome.app.window.get(FEEDBACK_DEFAULT_WINDOW_ID); if (win) { win.show(); @@ -221,13 +213,27 @@ hidden: true, resizable: false }, function(appWindow) { + // Initialize the state of the app only once upon the creation of the + // feedback UI window. + initialFeedbackInfo = feedbackInfo; + finalFeedbackInfo = null; + systemInfo = null; + isSystemInfoReady = false; + onSystemInfoReadyCallback = null; + // Define some functions for the new window so that it can call back // into here. // Define a function for the new window to get the system information. - // Returns null if the system information is not ready yet. - appWindow.contentWindow.getSystemInformation = function() { - return systemInfo; + appWindow.contentWindow.getSystemInformation = function(callback) { + if (!isSystemInfoReady) { + onSystemInfoReadyCallback = callback; + chrome.feedbackPrivate.getSystemInformation( + getSystemInformationCallback); + return; + } + + callback(systemInfo); }; // Define a function to be called by the new window when the report is @@ -247,13 +253,6 @@ appWindow.contentWindow.isSystemInfoReady = function() { return isSystemInfoReady; }; - - // Registers a callback that will be invoked when the system information - // is received. - appWindow.contentWindow.setOnSystemInfoReadyCallback = - function(callback) { - onSystemInfoReadyCallback = callback; - }; }); }
diff --git a/chrome/browser/resources/feedback/js/feedback.js b/chrome/browser/resources/feedback/js/feedback.js index e6db735..6cd19b6 100644 --- a/chrome/browser/resources/feedback/js/feedback.js +++ b/chrome/browser/resources/feedback/js/feedback.js
@@ -7,6 +7,7 @@ */ var FEEDBACK_LANDING_PAGE = 'https://support.google.com/chrome/go/feedback_confirmation'; + /** @type {number} * @const */ @@ -17,12 +18,19 @@ * @const */ var FEEDBACK_MIN_WIDTH = 500; + /** * @type {number} * @const */ var FEEDBACK_MIN_HEIGHT = 585; +/** + * @type {number} + * @const + */ +var FEEDBACK_MIN_HEIGHT_LOGIN = 482; + /** @type {number} * @const */ @@ -43,6 +51,15 @@ */ var STATS_WINDOW_ID = 'stats_window'; +/** + * Feedback flow defined in feedback_private.idl. + * @enum {string} + */ +var FeedbackFlow = { + REGULAR: 'regular', // Flow in a regular user session. + LOGIN: 'login' // Flow on the login screen. +}; + var attachedFileBlob = null; var lastReader = null; @@ -166,14 +183,19 @@ // The report will be sent later by the feedback extension's background // page (see event_handler.js). sendReportLater(feedbackInfo); - window.open(FEEDBACK_LANDING_PAGE, '_blank'); + + // No landing page for login screen feedback. + if (feedbackInfo.flow != FeedbackFlow.LOGIN) + window.open(FEEDBACK_LANDING_PAGE, '_blank'); window.close(); return true; } } chrome.feedbackPrivate.sendFeedback(feedbackInfo, function(result) { - window.open(FEEDBACK_LANDING_PAGE, '_blank'); + // No landing page for login screen feedback. + if (feedbackInfo.flow != FeedbackFlow.LOGIN) + window.open(FEEDBACK_LANDING_PAGE, '_blank'); window.close(); }); @@ -233,8 +255,11 @@ // style.margin - the variable seems to not exist. var height = $('title-bar').scrollHeight + $('content-pane').scrollHeight + CONTENT_MARGIN_HEIGHT; - if (height < FEEDBACK_MIN_HEIGHT) - height = FEEDBACK_MIN_HEIGHT; + + var minHeight = FEEDBACK_MIN_HEIGHT; + if (feedbackInfo.flow == FeedbackFlow.LOGIN) + minHeight = FEEDBACK_MIN_HEIGHT_LOGIN; + height = Math.max(height, minHeight); chrome.app.window.current().resizeTo(width, height); } @@ -259,8 +284,6 @@ sysInfoPageOnSysInfoReadyCallback(feedbackInfo.systemInformation); sysInfoPageOnSysInfoReadyCallback = null; } - - setOnSystemInfoReadyCallback(null); } /** @@ -279,6 +302,10 @@ chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { if (request.sentFromEventPage) { feedbackInfo = request.data; + + if (!feedbackInfo.flow) + feedbackInfo.flow = FeedbackFlow.REGULAR; + $('description-text').textContent = feedbackInfo.description; if (feedbackInfo.pageUrl) $('page-url-text').value = feedbackInfo.pageUrl; @@ -302,12 +329,9 @@ $('user-email-text').value = email; }); - // Prepare the full system information if available or do this later once - // it becomes available. - if (isSystemInfoReady()) - onSystemInformation(getSystemInformation()); - else - setOnSystemInfoReadyCallback(onSystemInformation); + // Initiate getting the system info and use it to prepare the full + // feedback info. + getSystemInformation(onSystemInformation); // An extension called us with an attached file. if (feedbackInfo.attachedFile) { @@ -318,6 +342,13 @@ $('attach-file').hidden = true; } + // No URL and file attachment for login screen feedback. + if (feedbackInfo.flow == FeedbackFlow.LOGIN) { + $('page-url').hidden = true; + $('attach-file-container').hidden = true; + $('attach-file-note').hidden = true; + } + <if expr="chromeos"> if (feedbackInfo.traceId && ($('performance-info-area'))) { $('performance-info-area').hidden = false;
diff --git a/chrome/browser/resources/md_user_manager/compiled_resources2.gyp b/chrome/browser/resources/md_user_manager/compiled_resources2.gyp new file mode 100644 index 0000000..a135850e --- /dev/null +++ b/chrome/browser/resources/md_user_manager/compiled_resources2.gyp
@@ -0,0 +1,36 @@ +# 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. +{ + 'targets': [ + { + 'target_name': 'control_bar', + 'dependencies': [ + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', + 'profile_browser_proxy', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + { + 'target_name': 'create_profile', + 'dependencies': [ + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:web_ui_listener_behavior', + 'profile_browser_proxy', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + { + 'target_name': 'profile_browser_proxy', + 'dependencies': [ + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:assert', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + { + 'target_name': 'user_manager_pages', + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + ], +}
diff --git a/chrome/browser/resources/md_user_manager/control_bar.css b/chrome/browser/resources/md_user_manager/control_bar.css new file mode 100644 index 0000000..77b12601 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/control_bar.css
@@ -0,0 +1,39 @@ +/* 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. */ + +#login-header-bar { + bottom: 0; + left: 0; + min-height: 32px; + padding-bottom: 12px; + padding-top: 12px; + position: absolute; + right: 0; +} + +paper-button { + border-radius: 2px; + line-height: 32px; + min-width: 52px; + padding: 0 16px; +} + +#addUser { + -webkit-margin-end: 16px; +} + +#logo { + content: -webkit-image-set( + url(../../../app/theme/default_100_percent/%DISTRIBUTION%/product_logo_name_48.png) 1x, + url(../../../app/theme/default_200_percent/%DISTRIBUTION%/product_logo_name_48.png) 2x); + height: 18px; + left: 24px; + position: absolute; + top: 19px; +} + +:host-context([dir='rtl']) #logo { + left: auto; + right: 24px; +}
diff --git a/chrome/browser/resources/md_user_manager/control_bar.html b/chrome/browser/resources/md_user_manager/control_bar.html new file mode 100644 index 0000000..9610d76 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/control_bar.html
@@ -0,0 +1,23 @@ +<link rel="import" href="chrome://md-user-manager/profile_browser_proxy.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> + +<dom-module id="control-bar"> + <!-- TODO(mahmadi): this format is deprecated. Change to the new + "shared styles" format. --> + <link rel="import" type="css" href="chrome://md-user-manager/control_bar.css"> + <template> + <div id="login-header-bar" + class="login-header-bar layout horizontal end-justified"> + <div id="logo"></div> + <paper-button id="lauchGuest" on-tap="onLauchGuestTap_" + i18n-content="browseAsGuest" hidden="[[!showGuest]]"></paper-button> + <div id="add-user-header-bar-item"> + <paper-button id="addUser" on-tap="onAddUserTap_" + i18n-content="addUser" hidden="[[!showAddPerson]]"></paper-button> + </div> + </div> + </template> + <script src="chrome://md-user-manager/control_bar.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/md_user_manager/control_bar.js b/chrome/browser/resources/md_user_manager/control_bar.js new file mode 100644 index 0000000..7619772 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/control_bar.js
@@ -0,0 +1,60 @@ +// 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. + +/** + * @fileoverview 'control-bar' is the horizontal bar at the bottom of the user + * manager screen. + * + * @element control-bar + */ + Polymer({ + is: 'control-bar', + + properties: { + /** + * True if 'Browse as Guest' button is displayed. + * @type {boolean} + */ + showGuest: { + type: Boolean, + value: false + }, + + /** + * True if 'Add Person' button is displayed. + * @type {boolean} + */ + showAddPerson: { + type: Boolean, + value: false + }, + + /** @private {!signin.ProfileBrowserProxy} */ + browserProxy_: Object + }, + + /** @override */ + created: function() { + this.browserProxy_ = signin.ProfileBrowserProxyImpl.getInstance(); + }, + + /** + * Handler for 'Browse as Guest' button click event. + * @param {!Event} event + * @private + */ + onLauchGuestTap_: function(event) { + this.browserProxy_.launchGuestUser(); + }, + + /** + * Handler for 'Add Person' button click event. + * @param {!Event} event + * @private + */ + onAddUserTap_: function(event) { + // Event is caught by user-manager-pages. + this.fire('change-page', {page: 'create-user-page'}); + } +});
diff --git a/chrome/browser/resources/md_user_manager/create_profile.css b/chrome/browser/resources/md_user_manager/create_profile.css new file mode 100644 index 0000000..e64c020 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/create_profile.css
@@ -0,0 +1,106 @@ +/* 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. */ + +.container { + color: var(--paper-grey-800); + margin: 64px auto; + width: 556px; +} + +#title-bar { + border-bottom: 1px solid rgba(0, 0, 0, .12); + font-size: 16px; + padding-bottom: 20px; +} + +#nameInput, +paper-dropdown-menu { + --paper-input-container-input: { + color: inherit; + font-size: inherit; + }; +} + +#nameInput { + width: 300px; +} + +paper-dropdown-menu { + position: relative; + top: -1px; + width: 200px; +} + +#icons { + margin-top: 24px; +} + +#icons #wrapper { + margin: -12px -10px; +} + +#icons paper-button { + background: rgb(222, 222, 222); + border: 1px solid rgba(0, 0, 0, .12); + margin: 12px 10px; + min-width: 0; + padding: 6px 4px; +} + +#icons paper-button[active] { + border-color: var(--google-blue-500); +} + +#icons paper-button:focus:not([active]) { + outline: 1px dotted #666; +} + +#createSupervisedContainer { + margin-top: 10px; +} + +#messageBubble { + -webkit-transition: max-height 200ms, padding 200ms; + background-color: var(--google-red-700); + border-radius: 4px; + color: white; + font-weight: bold; + margin-left: auto; + margin-right: auto; + margin-top: 16px; + max-height: 50px; + overflow: hidden; + padding: 10px 10px; + text-align: center; + width: 80%; +} + +#messageBubble:empty { + display: none; +} + +#actions { + margin-top: 32px; +} + +#actions paper-button { + border-radius: 2px; + line-height: 32px; + min-width: 52px; + padding: 0 16px; +} + +#cancel { + color: var(--paper-grey-600); +} + +#save { + -webkit-margin-end: 0; + background: var(--google-blue-500); + color: white; +} + +#save[disabled] { + background: rgba(66, 133, 244, .5); +}
diff --git a/chrome/browser/resources/md_user_manager/create_profile.html b/chrome/browser/resources/md_user_manager/create_profile.html new file mode 100644 index 0000000..1f05a02 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/create_profile.html
@@ -0,0 +1,69 @@ +<link rel="import" href="chrome://md-user-manager/profile_browser_proxy.html"> +<link rel="import" href="chrome://resources/html/action_link.html"> +<link rel="import" href="chrome://resources/html/cr.html"> +<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-dropdown-menu/paper-dropdown-menu.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-item.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-menu/paper-menu.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> + +<dom-module id="create-profile"> + <link rel="import" type="css" + href="chrome://md-user-manager/create_profile.css"> + <link rel="import" type="css" href="chrome://resources/css/action_link.css"> + <template> + <div class="container"> + <div id="title-bar" i18n-content="createProfileTitle"></div> + <paper-input id="nameInput" value="{{profileName_}}" pattern=".*\S.*" + auto-validate> + </paper-input> + <div id="icons"> + <div id="wrapper"> + <template is="dom-repeat" items="[[availableIconUrls_]]"> + <paper-button toggles on-tap="onIconTap_" data-icon-url$="[[item]]" + active="{{isActiveIcon_(item, profileIconUrl_)}}"> + <img src="[[item]]"> + </paper-button> + </template> + </div> + </div> + <div id="createSupervisedContainer"> + <template is="dom-if" if="[[signedIn_]]"> + <paper-checkbox checked="{{isSupervised_}}" + disabled="{{supervisedUserCheckboxDisabled_}}"> + <span i18n-content="manageProfilesSupervisedSignedInLabel"></span> + </paper-checkbox> + <paper-dropdown-menu no-label-float> + <paper-menu selected="{{selectedEmail_}}" class="dropdown-content"> + <template is="dom-repeat" items="[[signedInUsers_]]"> + <paper-item>[[item.username]]</paper-item> + </template> + </paper-menu> + </paper-dropdown-menu> + <a id="learnMore" is="action-link" i18n-content="learnMore" + on-tap="onLearnMoreTap_"></a> + </template> + <span id="create-profile-supervised-not-signed-in" + i18n-values=".innerHTML:manageProfilesSupervisedNotSignedIn" + hidden="{{signedIn_}}"> + </span> + <div id="messageBubble" inner-h-t-m-l="{{message_}}"></div> + </div> + <div id="actions" class="layout horizontal end-justified"> + <paper-spinner active="[[createInProgress_]]"></paper-spinner> + <paper-button id="cancel" on-tap="onCancelTap_" i18n-content="cancel"> + </paper-button> + <paper-button id="save" on-tap="onSaveTap_" + i18n-content="createProfileConfirm" + disabled="{{isOkDisabled_(createInProgress_, profileName_, message_)}}"> + </paper-button> + </div> + </div> + </template> + <script src="chrome://md-user-manager/create_profile.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/md_user_manager/create_profile.js b/chrome/browser/resources/md_user_manager/create_profile.js new file mode 100644 index 0000000..c49d5f5 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/create_profile.js
@@ -0,0 +1,273 @@ +// 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. + +/** + * @fileoverview 'create-profile' is a page that contains controls for creating + * a (optionally supervised) profile, including choosing a name, and an avatar. + * + * @element create-profile + */ +Polymer({ + is: 'create-profile', + + behaviors: [WebUIListenerBehavior], + + properties: { + /** + * True if supervised user checkbox is disabled. + * @private {boolean} + */ + supervisedUserCheckboxDisabled_: { + type: Boolean, + computed: + 'isSupervisedUserCheckboxDisabled_(createInProgress_, signedIn_)' + }, + + /** + * The current profile name. + * @private {string} + */ + profileName_: { + type: String, + value: '', + }, + + /** + * The list of available profile icon URLs. + * @private {!Array<string>} + */ + availableIconUrls_: { + type: Array, + value: function() { return []; } + }, + + /** + * The currently selected profile icon URL. May be a data URL. + * @private {string} + */ + profileIconUrl_: { + type: String, + value: '' + }, + + /** + * True if a profile is being created or imported. + * @private {boolean} + */ + createInProgress_: { + type: Boolean, + value: false + }, + + /** + * The current error/warning message. + * @private {string} + */ + message_: { + type: String, + value: '' + }, + + /** + * True if the new profile is a supervised profile. + * @private {boolean} + */ + isSupervised_: { + type: Boolean, + value: false + }, + + /** + * The list of usernames and profile paths for currently signed-in users. + * @private {!Array<SignedInUser>} + */ + signedInUsers_: { + type: Array, + value: function() { return []; } + }, + + /** + * Index of the selected signed-in user. + * @private {number} + */ + selectedEmail_: { + type: Number, + value: 0 + }, + + /** @private {!signin.ProfileBrowserProxy} */ + browserProxy_: Object + }, + + /** @override */ + created: function() { + this.browserProxy_ = signin.ProfileBrowserProxyImpl.getInstance(); + }, + + /** @override */ + attached: function() { + this.resetForm_(); + + this.addWebUIListener( + 'create-profile-success', this.handleSuccess_.bind(this)); + this.addWebUIListener( + 'create-profile-warning', this.handleMessage_.bind(this)); + this.addWebUIListener( + 'create-profile-error', this.handleMessage_.bind(this)); + this.addWebUIListener( + 'profile-icons-received', this.handleProfileIcons_.bind(this)); + this.addWebUIListener( + 'signedin-users-received', this.handleSignedInUsers_.bind(this)); + + this.browserProxy_.getAvailableIcons(); + this.browserProxy_.getSignedInUsers(); + }, + + /** + * Resets the state of the page. + * @private + */ + resetForm_: function() { + this.profileName_ = ''; + this.availableIconUrls_ = []; + this.profileIconUrl_ = ''; + this.createInProgress_ = false; + this.message_ = ''; + this.isSupervised_ = false; + this.signedInUsers_ = []; + this.selectedEmail_ = 0; + }, + + /** + * Handler for when the profile icons are pushed from the browser. + * @param {!Array<string>} iconUrls + * @private + */ + handleProfileIcons_: function(iconUrls) { + this.availableIconUrls_ = iconUrls; + this.profileIconUrl_ = iconUrls[0]; + }, + + /** + * Updates the signed-in users. + * @param {!Array<SignedInUser>} signedInUsers + * @private + */ + handleSignedInUsers_: function(signedInUsers) { + this.signedInUsers_ = signedInUsers; + this.signedIn_ = signedInUsers.length > 0; + }, + + /** + * Handler for the 'Learn More' button click event. + * @param {!Event} event + * @private + */ + onLearnMoreTap_: function(event) { + // TODO(mahmadi): fire the event to show the 'learn-more-page' + }, + + /** + * Handler for the 'Ok' button click event. + * @param {!Event} event + * @private + */ + onSaveTap_: function(event) { + this.createInProgress_ = true; + this.browserProxy_.createProfile( + this.profileName_, this.profileIconUrl_, this.isSupervised_, + this.signedInUsers_[this.selectedEmail_].profilePath); + }, + + /** + * Handler for the 'Cancel' button click event. + * @param {!Event} event + * @private + */ + onCancelTap_: function(event) { + if (this.createInProgress_) { + this.createInProgress_ = false; + this.browserProxy_.cancelCreateProfile(); + } else { + this.fire('change-page', {page: 'user-pods-page'}); + } + }, + + /** + * Handler for when the user clicks a new profile icon. + * @param {!Event} event + * @private + */ + onIconTap_: function(event) { + var element = Polymer.dom(event).rootTarget; + + if (element.nodeName == 'IMG') + this.profileIconUrl_ = element.src; + else if (element.dataset && element.dataset.iconUrl) + this.profileIconUrl_ = element.dataset.iconUrl; + + // Button toggle state is controlled by the selected icon URL. Prevent + // tap events from changing the toggle state. + event.preventDefault(); + }, + + /** + * Handles profile create/import success message pushed by the browser. + * @param {!ProfileInfo} profileInfo Details of the created/imported profile. + * @private + */ + handleSuccess_: function(profileInfo) { + this.createInProgress_ = false; + this.fire('change-page', {page: 'user-pods-page'}); + }, + + /** + * Handles profile create/import warning/error message pushed by the browser. + * @param {string} message An HTML warning/error message. + * @private + */ + handleMessage_: function(message) { + this.createInProgress_ = false; + this.message_ = message; + }, + + /** + * Computed binding determining which profile icon button is toggled on. + * @param {string} iconUrl icon URL of a given icon button. + * @param {string} profileIconUrl Currently selected icon URL. + * @return {boolean} + * @private + */ + isActiveIcon_: function(iconUrl, profileIconUrl) { + return iconUrl == profileIconUrl; + }, + + /** + * Computed binding determining whether 'Ok' button is disabled. + * @param {boolean} createInProgress Is create in progress? + * @param {string} profileName Profile Name. + * @param {string} message Existing warning/error message. + * @return {boolean} + * @private + */ + isOkDisabled_: function(createInProgress, profileName, message) { + // TODO(mahmadi): Figure out a way to add 'paper-input-extracted' as a + // dependency and cast to PaperInputElement instead. + /** @type {{validate: function():boolean}} */ + var nameInput = this.$.nameInput; + return createInProgress || !profileName || message != '' || + !nameInput.validate(); + }, + + /** + * Computed binding determining whether supervised user checkbox is disabled. + * @param {boolean} createInProgress Is create in progress? + * @param {boolean} signedIn Are there any signed-in users? + * @return {boolean} + * @private + */ + isSupervisedUserCheckboxDisabled_: function(createInProgress, signedIn) { + return createInProgress || !signedIn; + } +});
diff --git a/chrome/browser/resources/md_user_manager/profile_browser_proxy.html b/chrome/browser/resources/md_user_manager/profile_browser_proxy.html new file mode 100644 index 0000000..078c69a --- /dev/null +++ b/chrome/browser/resources/md_user_manager/profile_browser_proxy.html
@@ -0,0 +1,3 @@ +<link rel="import" href="chrome://resources/html/assert.html"> +<link rel="import" href="chrome://resources/html/cr.html"> +<script src="chrome://md-user-manager/profile_browser_proxy.js"></script>
diff --git a/chrome/browser/resources/md_user_manager/profile_browser_proxy.js b/chrome/browser/resources/md_user_manager/profile_browser_proxy.js new file mode 100644 index 0000000..165b92f --- /dev/null +++ b/chrome/browser/resources/md_user_manager/profile_browser_proxy.js
@@ -0,0 +1,134 @@ +// 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. + +/** + * @fileoverview Helper object and related behavior that encapsulate messaging + * between JS and C++ for creating/importing profiles in the user-manager page. + */ + +/** @typedef {{username: string, profilePath: string}} */ +var SignedInUser; + +/** @typedef {{name: string, filePath: string, isSupervised: boolean}} */ +var ProfileInfo; + +cr.define('signin', function() { + /** @interface */ + function ProfileBrowserProxy() {} + + ProfileBrowserProxy.prototype = { + /** + * Gets the available profile icons to choose from. + */ + getAvailableIcons: function() { + assertNotReached(); + }, + + /** + * Gets the current signed-in users. + */ + getSignedInUsers: function() { + assertNotReached(); + }, + + /** + * Launches the guest user. + */ + launchGuestUser: function() { + assertNotReached(); + }, + + /** + * Creates a profile. + * @param {string} profileName Name of the new profile. + * @param {string} profileIconUrl URL of the selected icon of the new + * profile. + * @param {boolean} isSupervised True if the new profile is supervised. + * @param {string|undefined} supervisorProfilePath Profile path of the + * supervisor if the new profile is supervised. + */ + createProfile: function(profileName, profileIconUrl, isSupervised, + supervisorProfilePath) { + assertNotReached(); + }, + + /** + * Cancels creation of the new profile. + */ + cancelCreateProfile: function() { + assertNotReached(); + }, + + /** + * Initializes the UserManager + * @param {string} locationHash + */ + initializeUserManager: function(locationHash) { + assertNotReached(); + }, + + /** + * Launches the user with the given |profilePath| + * @param {string} profilePath Profile Path of the user. + */ + launchUser: function(profilePath) { + assertNotReached(); + } + }; + + /** + * @constructor + * @implements {signin.ProfileBrowserProxy} + */ + function ProfileBrowserProxyImpl() {} + + // The singleton instance_ is replaced with a test version of this wrapper + // during testing. + cr.addSingletonGetter(ProfileBrowserProxyImpl); + + ProfileBrowserProxyImpl.prototype = { + /** @override */ + getAvailableIcons: function() { + chrome.send('requestDefaultProfileIcons'); + }, + + /** @override */ + getSignedInUsers: function() { + chrome.send('requestSignedInProfiles'); + }, + + /** @override */ + launchGuestUser: function() { + chrome.send('launchGuest'); + }, + + /** @override */ + createProfile: function(profileName, profileIconUrl, isSupervised, + supervisorProfilePath) { + chrome.send('createProfile', + [profileName, profileIconUrl, false, isSupervised, '', + supervisorProfilePath]); + }, + + /** @override */ + cancelCreateProfile: function() { + chrome.send('cancelCreateProfile'); + }, + + /** @override */ + initializeUserManager: function(locationHash) { + chrome.send('userManagerInitialize', [locationHash]); + }, + + /** @override */ + launchUser: function(profilePath) { + chrome.send('launchUser', [profilePath]); + } + }; + + return { + ProfileBrowserProxy: ProfileBrowserProxy, + ProfileBrowserProxyImpl: ProfileBrowserProxyImpl, + }; +});
diff --git a/chrome/browser/resources/md_user_manager/strings.html b/chrome/browser/resources/md_user_manager/strings.html new file mode 100644 index 0000000..b349971 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/strings.html
@@ -0,0 +1,2 @@ +<link rel="import" href="chrome://resources/html/load_time_data.html"> +<script src="chrome://md-user-manager/strings.js"></script>
diff --git a/chrome/browser/resources/md_user_manager/user_manager.css b/chrome/browser/resources/md_user_manager/user_manager.css new file mode 100644 index 0000000..9f08d8b7 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/user_manager.css
@@ -0,0 +1,207 @@ +/* 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. */ + +body { + background-color: #eee; +} + +/* Overrides for the desktop user manager screen. */ + +#outer-container { + min-height: 0; +} + +.bubble.faded { + opacity: 0; +} + +.pod { + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + height: 226px; + /* On non-retina desktop, the text is blurry if we use the scale3d() + inherited from user_pod_row.js */ + transform: scale(0.9); +} + +podrow[ncolumns='6'] .pod { + transform: scale(0.8); +} + +/* Because of crbug.com/406529, the text in the .name div is janky if there's +both a transform:scale and a transition:opacity applied to a div, so we must +apply the opacity change to the children instead. */ +.pod.faded { + opacity: 1; +} + +.pod.faded .user-image-pane, +.pod.faded .main-pane { + opacity: .4; +} + +.pod.hovered:not(.focused) { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} + +.pod.focused { + box-shadow: 0 16px 21px rgba(0, 0, 0, 0.2); + transform: scale(1) !important; +} + +.pod.focused.locked { + box-shadow: 0 12px 21px rgba(0, 0, 0, 0.2); + height: 220px; +} + +.user-image-pane { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + height: 180px; + left: 0; + top: 0; + width: 180px; +} + +html[dir=rtl] .user-image-pane { + right: 0; +} + +.pod .name { + margin-top: 12px; +} + +.pod .user-image { + height: 180px; + width: 180px; +} + +.pod input[type='password'] { + height: 45px; /* 1px shorter as to not overlap the pod's rounded corners */ + top: 1px; +} + +.pod .indicator-container { + background-color: rgba(255, 255, 255, 0.85); + border-radius: 16px; + height: 32px; + left: 8px; + position: absolute; + top: 8px; +} + +html[dir=rtl] .pod .indicators { + left: auto; + right: 8px; +} + +.pod .indicator { + background-position: center; + background-repeat: no-repeat; + background-size: 18px; + display: none; + float: left; + height: 32px; + width: 32px; +} + +/* Using -webkit-mask on the indicators allows us to tweak the color. */ +.pod .indicator-container > div { + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: 24px; +} + +.pod.locked .locked-indicator { + -webkit-mask-image: url(../../../../ui/webui/resources/images/lock.svg); + background-color: var(--paper-grey-600); + display: initial; +} + +.pod.legacy-supervised .legacy-supervised-indicator { + -webkit-mask-image: + url(../../../../ui/webui/resources/images/supervisor_account.svg); + background-color: var(--google-blue-500); + display: initial; +} + +.pod.child .child-indicator { + -webkit-mask-image: + url(../../../../ui/webui/resources/images/account_child_invert.svg); + background-color: var(--google-blue-500); + display: initial; +} + +.main-pane { + left: 0; + top: 0; +} + +html[dir=rtl] .main-pane { + right: 0; +} + +.name-container, +.pod.focused:not(.multiprofiles-policy-applied) .auth-container { + top: 180px; + width: 180px; +} + +.pod.focused:not(.locked) .name-container { + display: block; +} + +.pod .name { + color: var(--paper-grey-800); + font-size: 15px; + margin-top: 11px; +} + +.pod.focused:not(.locked) .auth-container { + display: none; +} + +.pod[auth-type='offlinePassword'].focused.locked .password-entry-container { + display: flex; + flex: auto; +} + +.action-box-area { + background-color: var(--google-grey-100); + height: 24px; + /* Because of crbug.com/406529, the text in the .name div is janky if there's + an opacity transition in this div. */ + transition: none; + width: 24px; +} + +.action-box-button, +.action-box-button:hover, +.action-box-area.active .action-box-button { + background-image: none; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid #989898; + height: 0; + left: 6px; + margin: 0; + position: absolute; + top: 9px; + width: 0; +} + +.action-box-button:hover, +.action-box-area.active .action-box-button { + border-top: 6px solid #4c4c4c; +} + +.action-box-remove-user-warning .remove-warning-button { + height: 30px; +} + +.action-box-remove-user-warning .remove-warning-button:focus { + /* Override the default blue border inherited from + button.custom-appearance:focus. */ + border: 1px solid transparent !important; + box-shadow: inset 0 0 0 1px #fff; +}
diff --git a/chrome/browser/resources/md_user_manager/user_manager.html b/chrome/browser/resources/md_user_manager/user_manager.html new file mode 100644 index 0000000..239c1bf --- /dev/null +++ b/chrome/browser/resources/md_user_manager/user_manager.html
@@ -0,0 +1,44 @@ +<!doctype html> +<html i18n-values="build:buildType; + dir:textdirection; + lang:language; + screen:screenType"> +<head> + <meta charset="utf-8"> + <meta name="google" value="notranslate"> + <title i18n-content="title"></title> + + <link rel="stylesheet" href="../../../../ui/login/account_picker/screen_account_picker.css"> + <link rel="stylesheet" href="../../../../ui/login/account_picker/user_pod_row.css"> + <link rel="stylesheet" href="../../../../ui/login/bubble.css"> + <link rel="stylesheet" href="../../../../ui/login/oobe.css"> + <link rel="stylesheet" href="../../../../ui/login/screen_container.css"> + <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> + <link rel="stylesheet" href="user_manager.css"> + + <link rel="import" href="chrome://md-user-manager/control_bar.html"> + <link rel="import" href="chrome://md-user-manager/user_manager_pages.html"> + <link rel="import" href="chrome://resources/html/cr/ui.html"> + <link rel="import" href="chrome://resources/html/util.html"> +</head> +<body> + <user-manager-pages> + <div id="outer-container"> + <div id="oobe" class="faded"> + <div id="inner-container"> + <div id="step-logo" hidden> + <div id="header-sections"></div> + </div> + <include src="../../../../ui/login/account_picker/screen_account_picker.html"> + </div> + </div> + </div> + <div id="bubble" class="bubble faded" hidden></div> + <control-bar></control-bar> + <include src="../../../../ui/login/account_picker/user_pod_template.html"> + </user-manager-pages> + <link rel="import" href="chrome://md-user-manager/strings.html"> + <link rel="import" href="chrome://resources/html/i18n_template.html"> + <script src="user_manager.js"></script> +</body> +</html>
diff --git a/chrome/browser/resources/md_user_manager/user_manager.js b/chrome/browser/resources/md_user_manager/user_manager.js new file mode 100644 index 0000000..158bac1 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/user_manager.js
@@ -0,0 +1,122 @@ +// 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 src="../../../../ui/login/screen.js"> +<include src="../../../../ui/login/bubble.js"> +<include src="../../../../ui/login/login_ui_tools.js"> +<include src="../../../../ui/login/display_manager.js"> +<include src="../../../../ui/login/account_picker/screen_account_picker.js"> +<include src="../../../../ui/login/account_picker/user_pod_row.js"> + + +cr.define('cr.ui', function() { + var DisplayManager = cr.ui.login.DisplayManager; + + /** + * Manages initialization of screens, transitions, and error messages. + * @constructor + * @extends {DisplayManager} + */ + function UserManager() {} + + cr.addSingletonGetter(UserManager); + + UserManager.prototype = { + __proto__: DisplayManager.prototype, + }; + + /** + * Initializes the UserManager. + */ + UserManager.initialize = function() { + cr.ui.login.DisplayManager.initialize(); + login.AccountPickerScreen.register(); + cr.ui.Bubble.decorate($('bubble')); + + signin.ProfileBrowserProxyImpl.getInstance().initializeUserManager( + window.location.hash); + }; + + /** + * Shows the given screen. + * @param {boolean} showGuest True if 'Browse as Guest' button should be + * displayed. + * @param {boolean} showAddPerson True if 'Add Person' button should be + * displayed. + */ + UserManager.showUserManagerScreen = function(showGuest, showAddPerson) { + UserManager.getInstance().showScreen({id: 'account-picker', + data: {disableAddUser: false}}); + // Hide control options if the user does not have the right permissions. + var controlBar = document.querySelector('control-bar'); + controlBar.showGuest = showGuest; + controlBar.showAddPerson = showAddPerson; + + // Disable the context menu, as the Print/Inspect element items don't + // make sense when displayed as a widget. + document.addEventListener('contextmenu', function(e) {e.preventDefault();}); + + // TODO(mahmadi): start the tutorial if the location hash is #tutorial. + }; + + /** + * Open a new browser for the given profile. + * @param {string} profilePath The profile's path. + */ + UserManager.launchUser = function(profilePath) { + signin.ProfileBrowserProxyImpl.getInstance().launchUser(profilePath); + }; + + /** + * Disables signin UI. + */ + UserManager.disableSigninUI = function() { + DisplayManager.disableSigninUI(); + }; + + /** + * Shows signin UI. + * @param {string=} opt_email An optional email for signin UI. + */ + UserManager.showSigninUI = function(opt_email) { + DisplayManager.showSigninUI(opt_email); + }; + + /** + * Shows sign-in error bubble. + * @param {number} loginAttempts Number of login attempts tried. + * @param {string} message Error message to show. + * @param {string} link Text to use for help link. + * @param {number} helpId Help topic Id associated with help link. + */ + UserManager.showSignInError = function(loginAttempts, message, link, helpId) { + DisplayManager.showSignInError(loginAttempts, message, link, helpId); + }; + + /** + * Clears error bubble as well as optional menus that could be open. + */ + UserManager.clearErrors = function() { + DisplayManager.clearErrors(); + }; + + // Export + return { + UserManager: UserManager + }; +}); + +// Alias to Oobe for use in src/ui/login/account_picker/user_pod_row.js +var Oobe = cr.ui.UserManager; + +// Allow selection events on components with editable text (password field) +// bug (http://code.google.com/p/chromium/issues/detail?id=125863) +disableTextSelectAndDrag(function(e) { + var src = e.target; + return src instanceof HTMLTextAreaElement || + src instanceof HTMLInputElement && + /text|password|search/.test(src.type); +}); + +document.addEventListener('DOMContentLoaded', cr.ui.UserManager.initialize);
diff --git a/chrome/browser/resources/md_user_manager/user_manager_pages.css b/chrome/browser/resources/md_user_manager/user_manager_pages.css new file mode 100644 index 0000000..51453f6 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/user_manager_pages.css
@@ -0,0 +1,7 @@ +/* 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. */ + +neon-animated-pages { + height: 100%; +}
diff --git a/chrome/browser/resources/md_user_manager/user_manager_pages.html b/chrome/browser/resources/md_user_manager/user_manager_pages.html new file mode 100644 index 0000000..7c515987 --- /dev/null +++ b/chrome/browser/resources/md_user_manager/user_manager_pages.html
@@ -0,0 +1,27 @@ +<link rel="import" href="chrome://md-user-manager/create_profile.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/slide-from-left-animation.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/slide-right-animation.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> + +<dom-module id="user-manager-pages"> + <link rel="import" type="css" + href="chrome://md-user-manager/user_manager_pages.css"> + <template> + <neon-animated-pages id="animatedPages" attr-for-selected="id" + selected="[[selectedPage_]]" entry-animation="slide-from-left-animation" + exit-animation="slide-right-animation"> + <div id="create-user-page"> + <template is="dom-if" if="[[isPageVisible_(selectedPage_, 'create-user-page')]]" restamp> + <create-profile></create-profile> + </template> + </div> + <div id="user-pods-page"> + <template is="dom-if" if="[[isPageVisible_(selectedPage_, 'user-pods-page')]]"> + <content></content> + </template> + </div> + </neon-animated-pages> + </template> + <script src="chrome://md-user-manager/user_manager_pages.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/md_user_manager/user_manager_pages.js b/chrome/browser/resources/md_user_manager/user_manager_pages.js new file mode 100644 index 0000000..752a369b --- /dev/null +++ b/chrome/browser/resources/md_user_manager/user_manager_pages.js
@@ -0,0 +1,47 @@ +// 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. + +/** + * @fileoverview 'user-manager-pages' is the element that controls paging in the + * user manager screen. + * + * @element user-manager-pages + */ +Polymer({ + is: 'user-manager-pages', + + properties: { + /** + * ID of the currently selected page. + * @private {string} + */ + selectedPage_: { + type: String, + value: 'user-pods-page' + } + }, + + listeners: { + 'change-page': 'changePage_' + }, + + /** + * Changes the currently selected page. + * @param {Event} e The event containing ID of the selected page. + * @private + */ + changePage_: function(e) { + this.selectedPage_ = e.detail.page; + }, + + /** + * Returns True if the given page should be visible. + * @param {string} selectedPage ID of the currently selected page. + * @param {string} page ID of the given page. + * @return {boolean} + */ + isPageVisible_: function(selectedPage, page) { + return this.selectedPage_ == page; + } +});
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js index ff0de41..7f6114d 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -192,6 +192,17 @@ }, /** + * Whether the search input is currently focused. This is used to prevent + * window focus/blur events from interfering with input-focus-dependent + * operations. + * @private {boolean} + */ + isSearchFocused_: { + type: Boolean, + value: false, + }, + + /** * Whether the user is currently searching for a sink. * @private {boolean} */ @@ -456,9 +467,7 @@ ready: function() { this.elementReadyTimeMs_ = performance.now(); document.addEventListener('keydown', this.checkForEscapePress_.bind(this)); - this.$$('#sink-search-input').addEventListener('focus', function() { - this.isUserSearching_ = true; - }.bind(this)); + this.setSearchFocusHandlers_(); this.showSinkList_(); }, @@ -548,7 +557,9 @@ this.showSinkList_(); e.preventDefault(); } else { - this.fire('close-dialog'); + this.fire('close-dialog', { + pressEscToClose: true, + }); } } }, @@ -1396,6 +1407,43 @@ }, /** + * Sets various focus and blur event handlers to handle |isSearchFocused_| and + * showing search results when the input is focused. + * @private + */ + setSearchFocusHandlers_: function() { + var search = this.$['sink-search-input']; + + // If the search input is focused and the whole window is losing focus, the + // search input will see a blur event first and then the window. The search + // event listener sets |isSearchFocused_| to false on the next event loop + // but then the event continues bubbling up. When it reaches the window + // event listener, it is still |true|. The window event listener queues its + // own action for the next event loop which keeps |isSearchFocused_| at the + // same value. + // + // So if only the search input is losing focus, |isSearchFocused_| will + // successfully be set to |false| during the next event loop. If the whole + // window is losing focus, which is the cause for the search input's blur + // event, it will be set to |false| and then immediately restored to |true|. + window.addEventListener('blur', function() { + var saveSearchFocusState = this.isSearchFocused_; + setTimeout(function() { + this.isSearchFocused_ = saveSearchFocusState; + }.bind(this)); + }.bind(this)); + search.addEventListener('blur', function() { + setTimeout(function() { this.isSearchFocused_ = false; }.bind(this)); + }.bind(this)); + search.addEventListener('focus', function() { + if (!this.isSearchFocused_) { + this.isSearchFocused_ = true; + this.isUserSearching_ = true; + } + }.bind(this)); + }, + + /** * Updates the shown cast mode, and updates the header text fields * according to the cast mode. If |castMode| type is AUTO, then set * |userHasSelectedCastMode_| to false. @@ -1489,7 +1537,9 @@ startTapTimer_: function() { var id = setTimeout(function() { if (!this.mouseIsPositionedOverDialog_) - this.fire('close-dialog'); + this.fire('close-dialog', { + pressEscToClose: false, + }); }.bind(this), 3000 /* 3 seconds */); },
diff --git a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js index 36eb363..8dd96b9 100644 --- a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js +++ b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js
@@ -158,7 +158,9 @@ * @private */ onCloseButtonClick_: function() { - this.fire('close-button-click'); + this.fire('close-dialog', { + pressEscToClose: false, + }); }, /**
diff --git a/chrome/browser/resources/media_router/media_router.js b/chrome/browser/resources/media_router/media_router.js index 703fbc2..394e9bc 100644 --- a/chrome/browser/resources/media_router/media_router.js +++ b/chrome/browser/resources/media_router/media_router.js
@@ -33,8 +33,7 @@ onAcknowledgeFirstRunFlow); container.addEventListener('back-click', onNavigateToSinkList); container.addEventListener('cast-mode-selected', onCastModeSelected); - container.addEventListener('close-button-click', onCloseDialogEvent); - container.addEventListener('close-dialog', onCloseDialogEvent); + container.addEventListener('close-dialog', onCloseDialog); container.addEventListener('close-route-click', onCloseRouteClick); container.addEventListener('create-route', onCreateRoute); container.addEventListener('issue-action-click', onIssueActionClick); @@ -61,6 +60,8 @@ media_router.MediaRouterUserAction.CLOSE); } }); + + window.addEventListener('blur', onWindowBlur); } /** @@ -96,12 +97,20 @@ /** * Closes the dialog. - * Called when the user clicks the close button on the dialog. + * Called when the user clicks the close button on the dialog. Reports + * whether the user closed the dialog via the ESC key. + * + * @param {!Event} event + * Parameters in |event|.detail: + * pressEscToClose - whether or not the user pressed ESC to close the + * dialog. */ - function onCloseDialogEvent() { + function onCloseDialog(event) { + /** @type {{pressEscToClose: boolean}} */ + var detail = event.detail; container.maybeReportUserFirstAction( media_router.MediaRouterUserAction.CLOSE); - media_router.browserApi.closeDialog(); + media_router.browserApi.closeDialog(detail.pressEscToClose); } /** @@ -295,6 +304,13 @@ media_router.browserApi.reportSinkCount(detail.sinkCount); } + /** + * Reports when the user clicks outside the dialog. + */ + function onWindowBlur() { + media_router.browserApi.reportBlur(); + } + return { initialize: initialize, };
diff --git a/chrome/browser/resources/media_router/media_router_ui_interface.js b/chrome/browser/resources/media_router/media_router_ui_interface.js index 37afa99f..a566dfe 100644 --- a/chrome/browser/resources/media_router/media_router_ui_interface.js +++ b/chrome/browser/resources/media_router/media_router_ui_interface.js
@@ -198,9 +198,12 @@ /** * Closes the dialog. + * + * @param {boolean} pressEscToClose Whether the user pressed ESC to close the + * dialog. */ - function closeDialog() { - chrome.send('closeDialog'); + function closeDialog(pressEscToClose) { + chrome.send('closeDialog', [pressEscToClose]); } /** @@ -229,6 +232,13 @@ } /** + * Reports when the user clicks outside the dialog. + */ + function reportBlur() { + chrome.send('reportBlur'); + } + + /** * Reports the index of the selected sink. * * @param {number} sinkIndex @@ -338,6 +348,7 @@ closeRoute: closeRoute, joinRoute: joinRoute, onInitialDataReceived: onInitialDataReceived, + reportBlur: reportBlur, reportClickedSinkIndex: reportClickedSinkIndex, reportInitialAction: reportInitialAction, reportInitialState: reportInitialState,
diff --git a/chrome/browser/resources/net_internals/main.css b/chrome/browser/resources/net_internals/main.css index 5f80612a..b8a005c 100644 --- a/chrome/browser/resources/net_internals/main.css +++ b/chrome/browser/resources/net_internals/main.css
@@ -9,6 +9,10 @@ box-sizing: border-box; } +body { + overflow: hidden; /* Prevents scroll bar flickering on resize. */ +} + ul { padding-left: 2em; }
diff --git a/chrome/browser/resources/ntp4/new_tab.js b/chrome/browser/resources/ntp4/new_tab.js index 69d1f37a..43e25f75 100644 --- a/chrome/browser/resources/ntp4/new_tab.js +++ b/chrome/browser/resources/ntp4/new_tab.js
@@ -3,9 +3,9 @@ // found in the LICENSE file. /** - * @fileoverview New tab page - * This is the main code for the new tab page used by touch-enabled Chrome - * browsers. For now this is still a prototype. + * @fileoverview New tab page 4 + * This is the main code for a previous version of the Chrome NTP ("NTP4"). + * Some parts of this are still used for the chrome://apps page. */ // Use an anonymous function to enable strict mode just for this file (which @@ -49,16 +49,6 @@ var DEFAULT_TRANSITION_TIME = 500; /** - * See description for these values in ntp_stats.h. - * @enum {number} - */ - var NtpFollowAction = { - CLICKED_TILE: 11, - CLICKED_OTHER_NTP_PANE: 12, - OTHER: 13 - }; - - /** * Creates a NewTabView object. NewTabView extends PageListView with * new tab UI specific logics. * @constructor @@ -451,7 +441,6 @@ getCardSlider: getCardSlider, onLoad: onLoad, leaveRearrangeMode: leaveRearrangeMode, - NtpFollowAction: NtpFollowAction, saveAppPageName: saveAppPageName, setAppToBeHighlighted: setAppToBeHighlighted, setBookmarkBarAttached: setBookmarkBarAttached,
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html index df0a73cf..f1efea4 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html +++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html
@@ -8,83 +8,99 @@ href="chrome://md-settings/appearance_page/appearance_shared.css"> <template> <style include="settings-shared"></style> - <div>[[selectedStandardFont_]]</div> <div class="settings-box first"> - <div i18n-content="fontSize"></div> - <paper-slider id="sizeSlider" value="{{fontSizeIndex_}}" - max="[[fontSizeRangeLimit_]]" - immediate-value="{{immediateSizeIndex_}}" - on-immediate-value-change="immediateSizeIndexChanged_"> + <div class="start">$i18n{fontSize}</div> + <paper-slider class="slider-labels" id="sizeSlider" + value="{{fontSizeIndex_}}" + max="[[fontSizeRangeLimit_]]" max-markers="5" + immediate-value="{{immediateSizeIndex_}}" snaps> </paper-slider> </div> <div class="settings-box"> - <settings-dropdown-menu id="standardFont" - i18n-values="label:standardFont" - pref="{{prefs.webkit.webprefs.fonts.standard.Zyyy}}" - menu-options="[[fontOptions_]]"> - </settings-dropdown-menu> - <div class="settings-column" - style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.standard.Zyyy.value)]]"> - <span>[[defaultFontSize_]]</span>: - <span i18n-content="loremIpsum"></span> + <div class="start">$i18n{minimumFont}</div> + <div class="list-item" style$="[[computeStyle_(minimumFontSize_, prefs.webkit.webprefs.fonts.standard.Zyyy.value)]]"> + <span>[[minimumFontSize_]]</span>: + <span i18n-content="quickBrownFox"></span> + </div> + <paper-slider class="slider-labels" id="minimumSizeSlider" + value="{{minimumSizeIndex_}}" + max="[[minimumFontSizeRangeLimit_]]" max-markers="5" + immediate-value="{{immediateMinimumSizeIndex_}}" snaps> + </paper-slider> + </div> + <div class="settings-box"> + <div class="start"> + <h2 i18n-content="standardFont"></h2> + <div class="list-frame"> + <div class="list-item"> + <settings-dropdown-menu class="start" id="standardFont" + pref="{{prefs.webkit.webprefs.fonts.standard.Zyyy}}" + menu-options="[[fontOptions_]]" no-label-float> + </settings-dropdown-menu> + </div> + <div class="list-item underbar" + style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.standard.Zyyy.value)]]"> + <span>[[defaultFontSize_]]</span>: + <span i18n-content="quickBrownFox"></span> + </div> + </div> + <h2 i18n-content="serifFont"></h2> + <div class="list-frame"> + <div class="list-item"> + <settings-dropdown-menu class="start" id="serifFont" + pref="{{prefs.webkit.webprefs.fonts.serif.Zyyy}}" + menu-options="[[fontOptions_]]" no-label-float> + </settings-dropdown-menu> + </div> + <div class="list-item underbar" + style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.serif.Zyyy.value)]]"> + <span>[[defaultFontSize_]]</span>: + <span i18n-content="quickBrownFox"></span> + </div> + </div> + <h2 i18n-content="sansSerifFont"></h2> + <div class="list-frame"> + <div class="list-item"> + <settings-dropdown-menu class="start" id="sansSerifFont" + pref="{{prefs.webkit.webprefs.fonts.sansserif.Zyyy}}" + menu-options="[[fontOptions_]]" no-label-float> + </settings-dropdown-menu> + </div> + <div class="list-item underbar" + style$="{{computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.sansserif.Zyyy.value)}}"> + <span>[[defaultFontSize_]]</span>: + <span i18n-content="quickBrownFox"></span> + </div> + </div> + <h2 i18n-content="fixedWidthFont"></h2> + <div class="list-frame"> + <div class="list-item"> + <settings-dropdown-menu class="start" id="fixedFont" + pref="{{prefs.webkit.webprefs.fonts.fixed.Zyyy}}" + menu-options="[[fontOptions_]]" no-label-float> + </settings-dropdown-menu> + </div> + <div class="list-item" + style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.fixed.Zyyy.value)]]"> + <span>[[defaultFontSize_]]</span>: + <span i18n-content="quickBrownFox"></span> + </div> + </div> </div> </div> <div class="settings-box"> - <settings-dropdown-menu id="serifFont" - i18n-values="label:serifFont" - pref="{{prefs.webkit.webprefs.fonts.serif.Zyyy}}" - menu-options="[[fontOptions_]]"> - </settings-dropdown-menu> - <div class="settings-column" - style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.serif.Zyyy.value)]]"> - <span>[[defaultFontSize_]]</span>: - <span i18n-content="loremIpsum"></span> - </div> - </div> - <div class="settings-box"> - <settings-dropdown-menu id="sansSerifFont" - i18n-values="label:sansSerifFont" - pref="{{prefs.webkit.webprefs.fonts.sansserif.Zyyy}}" - menu-options="[[fontOptions_]]"> - </settings-dropdown-menu> - <div class="settings-column" - style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.sansserif.Zyyy.value)]]"> - <span>[[defaultFontSize_]]</span>: - <span i18n-content="loremIpsum"></span> - </div> - </div> - <div class="settings-box"> - <settings-dropdown-menu id="fixedFont" - i18n-values="label:fixedWidthFont" - pref="{{prefs.webkit.webprefs.fonts.fixed.Zyyy}}" - menu-options="[[fontOptions_]]"> - </settings-dropdown-menu> - <div class="settings-column" - style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.fixed.Zyyy.value)]]"> - <span i18n-content="loremIpsum"></span> - </div> - </div> - <div class="settings-box"> - <div> - <div i18n-content="minimumFont"></div> - <paper-slider id="minimumSizeSlider" value="{{minimumSizeIndex_}}" - max="[[minimumFontSizeRangeLimit_]]" - immediate-value="{{immediateMinimumSizeIndex_}}" - on-immediate-value-change="immediateMinimumSizeIndexChanged_"> - </paper-slider> - </div> - <div style$="[[computeStyle_(minimumFontSize_, prefs.webkit.webprefs.fonts.standard.Zyyy.value)]]"> - <span>[[minimumFontSize_]]</span>: - <span i18n-content="loremIpsum"></span> - </div> - </div> - <div class="settings-box"> + <div class="start" i18n-content="encoding"></div> <settings-dropdown-menu id="encoding" - i18n-values="label:encoding" pref="{{prefs.intl.charset_default}}" - menu-options="[[encodingOptions_]]"> + menu-options="[[encodingOptions_]]" no-label-float> </settings-dropdown-menu> </div> + <div class="settings-box two-line"> + <div class="start"> + <div i18n-content="advancedFontSettings"></div> + <div class="secondary" i18n-content="requiresWebStoreExtension"></div> + </div> + </div> </template> <script src="appearance_fonts_page.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js index b21a4ca..7a3b1fb 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js +++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js
@@ -77,6 +77,7 @@ * @private */ immediateMinimumSizeIndex_: { + observer: 'immediateMinimumSizeIndexChanged_', type: Number, }, @@ -85,6 +86,7 @@ * @private */ immediateSizeIndex_: { + observer: 'immediateSizeIndexChanged_', type: Number, },
diff --git a/chrome/browser/resources/settings/certificate_manager_page/ca_trust_edit_dialog.html b/chrome/browser/resources/settings/certificate_manager_page/ca_trust_edit_dialog.html new file mode 100644 index 0000000..c36818c --- /dev/null +++ b/chrome/browser/resources/settings/certificate_manager_page/ca_trust_edit_dialog.html
@@ -0,0 +1,46 @@ +<link rel="import" href="chrome://resources/html/polymer_config.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html"> +<link rel="import" href="chrome://md-settings/i18n_setup.html"> +<link rel="import" href="chrome://md-settings/settings_dialog.html"> +<link rel="import" href="chrome://md-settings/settings_shared_css.html"> +<link rel="import" href="chrome://md-settings/certificate_manager_page/certificates_browser_proxy.html"> + +<dom-module id="settings-ca-trust-edit-dialog"> + <template> + <style include="settings-shared"> + paper-checkbox { + display: block; + } + </style> + + <settings-dialog id="dialog"> + <div class="title">$i18n{certificateManagerCaTrustEditDialogTitle}</div> + <div class="body"> + <div>[[explanationText_]]</div> + <div>$i18n{certificateManagerCaTrustEditDialogDescription}</div> + <paper-checkbox id="ssl" checked="[[trustInfo_.ssl]]"> + $i18n{certificateManagerCaTrustEditDialogSsl} + </paper-checkbox> + <paper-checkbox id="email" checked="[[trustInfo_.email]]"> + $i18n{certificateManagerCaTrustEditDialogEmail} + </paper-checkbox> + <paper-checkbox id="objSign" checked="[[trustInfo_.objSign]]"> + $i18n{certificateManagerCaTrustEditDialogObjSign} + </paper-checkbox> + </div> + <div class="button-container"> + <paper-spinner id="spinner"></paper-spinner> + <paper-button class="cancel-button" on-tap="onCancelTap_"> + $i18n{cancel} + </paper-button> + <paper-button id="ok" class="action-button" on-tap="onOkTap_"> + $i18n{ok} + </paper-button> + </div> + </settings-dialog> + </template> + <script src="ca_trust_edit_dialog.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/settings/certificate_manager_page/ca_trust_edit_dialog.js b/chrome/browser/resources/settings/certificate_manager_page/ca_trust_edit_dialog.js new file mode 100644 index 0000000..019f8fd --- /dev/null +++ b/chrome/browser/resources/settings/certificate_manager_page/ca_trust_edit_dialog.js
@@ -0,0 +1,67 @@ +// 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. + +/** + * @fileoverview + * 'settings-ca-trust-edit-dialog' is the a dialog allowing the user to edit the + * trust lever of a given certificate authority. + * + * @group Chrome Settings Elements + * @element settings-ca-trust-edit-dialog + */ +Polymer({ + is: 'settings-ca-trust-edit-dialog', + + properties: { + /** @private {!settings.CertificatesBrowserProxy} */ + browserProxy_: Object, + + /** @type {!CertificateSubnode} */ + model: Object, + + /** @private {?CaTrustInfo} */ + trustInfo_: Object, + + /** @private {string} */ + explanationText_: String, + }, + + /** @override */ + ready: function() { + this.browserProxy_ = settings.CertificatesBrowserProxyImpl.getInstance(); + }, + + /** @override */ + attached: function() { + this.explanationText_ = loadTimeData.getStringF( + 'certificateManagerCaTrustEditDialogExplanation', + this.model.name); + this.browserProxy_.getCaCertificateTrust(this.model.id).then( + /** @param {!CaTrustInfo} trustInfo */ + function(trustInfo) { + this.trustInfo_ = trustInfo; + this.$.dialog.open(); + }.bind(this)); + }, + + /** @private */ + onCancelTap_: function() { + this.$.dialog.close(); + }, + + /** @private */ + onOkTap_: function() { + this.$.spinner.active = true; + this.browserProxy_.editCaCertificateTrust( + this.model.id, this.$.ssl.checked, + this.$.email.checked, this.$.objSign.checked).then(function() { + this.$.spinner.active = false; + this.$.dialog.close(); + }.bind(this), + /** @param {!CertificatesError} error */ + function(error) { + // TODO(dpapad): Display error here. + }); + }, +});
diff --git a/chrome/browser/resources/settings/certificate_manager_page/certificate_manager_page.html b/chrome/browser/resources/settings/certificate_manager_page/certificate_manager_page.html index 70a5b6ea..c3c5ca8 100644 --- a/chrome/browser/resources/settings/certificate_manager_page/certificate_manager_page.html +++ b/chrome/browser/resources/settings/certificate_manager_page/certificate_manager_page.html
@@ -1,7 +1,9 @@ +<link rel="import" href="chrome://resources/html/polymer_config.html"> <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-tabs/paper-tabs.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-pages/iron-pages.html"> +<link rel="import" href="chrome://md-settings/certificate_manager_page/ca_trust_edit_dialog.html"> <dom-module id="settings-certificate-manager-page"> <link rel="import" type="css" href="certificate_manager_page.css">
diff --git a/chrome/browser/resources/settings/certificate_manager_page/certificate_manager_page.js b/chrome/browser/resources/settings/certificate_manager_page/certificate_manager_page.js index 61ca501..14979a3 100644 --- a/chrome/browser/resources/settings/certificate_manager_page/certificate_manager_page.js +++ b/chrome/browser/resources/settings/certificate_manager_page/certificate_manager_page.js
@@ -17,15 +17,4 @@ */ Polymer({ is: 'settings-certificate-manager-page', - - properties: { - /** - * Preferences state. - * TODO(dschuyler) check whether this is necessary. - */ - prefs: { - type: Object, - notify: true, - }, - }, });
diff --git a/chrome/browser/resources/settings/people_page/change_picture.html b/chrome/browser/resources/settings/people_page/change_picture.html index bfd8002a..146c8181 100644 --- a/chrome/browser/resources/settings/people_page/change_picture.html +++ b/chrome/browser/resources/settings/people_page/change_picture.html
@@ -1,4 +1,5 @@ <link rel="import" href="chrome://resources/html/i18n_behavior.html"> +<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> <link rel="import" href="chrome://resources/html/util.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-keys/iron-a11y-keys.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icons/image-icons.html"> @@ -7,7 +8,7 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> <link rel="import" href="chrome://md-settings/people_page/camera.html"> -<link rel="import" href="chrome://md-settings/people_page/change_picture_private_api.html"> +<link rel="import" href="chrome://md-settings/people_page/change_picture_browser_proxy.html"> <link rel="import" href="chrome://md-settings/settings_shared_css.html"> <dom-module id="settings-change-picture">
diff --git a/chrome/browser/resources/settings/people_page/change_picture.js b/chrome/browser/resources/settings/people_page/change_picture.js index f091ae28..b59bea2 100644 --- a/chrome/browser/resources/settings/people_page/change_picture.js +++ b/chrome/browser/resources/settings/people_page/change_picture.js
@@ -35,6 +35,7 @@ behaviors: [ I18nBehavior, + WebUIListenerBehavior, ], properties: { @@ -75,11 +76,11 @@ */ profileImageUrl_: { type: String, - value: settings.ChangePicturePrivateApi.ButtonImages.PROFILE_PICTURE, + value: 'chrome://theme/IDR_PROFILE_PICTURE_LOADING', }, /** - * The default user images. Populated by ChangePicturePrivateApi. + * The default user images. * @private {!Array<!settings.DefaultImage>} */ defaultImages_: { @@ -90,7 +91,7 @@ /** * The fallback image to be selected when the user discards the 'old' image. * This may be null if the user started with the 'old' image. - * @private {settings.ChangePictureImageElement} + * @private {?settings.ChangePictureImageElement} */ fallbackImage_: { type: settings.ChangePictureImageElement, @@ -106,86 +107,100 @@ type: String, value: '', }, + + /** @private {!settings.ChangePictureBrowserProxyImpl} */ + browserProxy_: { + type: Object, + value: function() { + return settings.ChangePictureBrowserProxyImpl.getInstance(); + }, + }, }, /** @override */ attached: function() { - // This is the interface called by the C++ handler. - var nativeInterface = { - /** - * Called from C++ to provide the default set of images. - * @param {!Array<!settings.DefaultImage>} images - */ - receiveDefaultImages: function(images) { - this.defaultImages_ = images; - }.bind(this), + this.addWebUIListener('default-images-changed', + this.receiveDefaultImages_.bind(this)); + this.addWebUIListener('selected-image-changed', + this.receiveSelectedImage_.bind(this)); + this.addWebUIListener('old-image-changed', + this.receiveOldImage_.bind(this)); + this.addWebUIListener('profile-image-changed', + this.receiveProfileImage_.bind(this)); + this.addWebUIListener('camera-presence-changed', + this.receiveCameraPresence_.bind(this)); - /** - * Called from C++ to provide the URL of the selected image. Is only - * called with default images. - * @param {string} imageUrl - */ - receiveSelectedImage: function(imageUrl) { - var index = this.$.selector.items.findIndex(function(image) { - return image.dataset.type == 'default' && image.src == imageUrl; - }); - assert(index != -1, 'Default image not found: ' + imageUrl); + this.browserProxy_.initialize(); + }, - this.fallbackImage_ = this.$.selector.items[index]; + /** + * Handler for the 'default-images-changed' event. + * @param {!Array<!settings.DefaultImage>} images + * @private + */ + receiveDefaultImages_: function(images) { + this.defaultImages_ = images; + }, - // If user is currently taking a photo, do not steal the focus. - if (!this.selectedItem_ || this.selectedItem_.dataset.type != 'camera') - this.$.selector.select(index); - }.bind(this), - - /** - * Called from C++ to provide the URL of the 'old' image. The 'old' - * image is any selected non-profile and non-default image. It can be - * from the camera, a file, or a deprecated default image. When this - * method is called, the old image becomes the selected image. - * @param {string} imageUrl - */ - receiveOldImage: function(imageUrl) { - this.oldImageUrl_ = imageUrl; - this.$.selector.select(this.$.selector.indexOf(this.$.oldImage)); - }.bind(this), - - /** - * Called from C++ to provide the URL of the profile image. - * @param {string} imageUrl - * @param {boolean} selected - */ - receiveProfileImage: function(imageUrl, selected) { - this.profileImageUrl_ = imageUrl; - this.$.profileImage.alt = this.i18n('profilePhoto'); - - if (!selected) - return; - - this.fallbackImage_ = this.$.profileImage; - - // If user is currently taking a photo, do not steal the focus. - if (!this.selectedItem_ || this.selectedItem_.dataset.type != 'camera') - this.$.selector.select(this.$.selector.indexOf(this.$.profileImage)); - }.bind(this), - - /** - * Called from the C++ to notify page about camera presence. - * @param {boolean} cameraPresent - */ - receiveCameraPresence: function(cameraPresent) { - this.cameraPresent_ = cameraPresent; - }.bind(this), - }; - - cr.define('settings', function() { - var ChangePicturePage = nativeInterface; - return { - ChangePicturePage: ChangePicturePage, - }; + /** + * Handler for the 'selected-image-changed' event. Is only called with + * default images. + * @param {string} imageUrl + * @private + */ + receiveSelectedImage_: function(imageUrl) { + var index = this.$.selector.items.findIndex(function(image) { + return image.dataset.type == 'default' && image.src == imageUrl; }); + assert(index != -1, 'Default image not found: ' + imageUrl); - settings.ChangePicturePrivateApi.initialize(); + this.fallbackImage_ = this.$.selector.items[index]; + + // If user is currently taking a photo, do not steal the focus. + if (!this.selectedItem_ || this.selectedItem_.dataset.type != 'camera') + this.$.selector.select(index); + }, + + /** + * Handler for the 'old-image-changed' event. The 'old' image is any selected + * non-profile and non-default image. It can be from the camera, a file, or a + * deprecated default image. When this method is called, the old image + * becomes the selected image. + * @param {string} imageUrl + * @private + */ + receiveOldImage_: function(imageUrl) { + this.oldImageUrl_ = imageUrl; + this.$.selector.select(this.$.selector.indexOf(this.$.oldImage)); + }, + + /** + * Handler for the 'profile-image-changed' event. + * @param {string} imageUrl + * @param {boolean} selected + * @private + */ + receiveProfileImage_: function(imageUrl, selected) { + this.profileImageUrl_ = imageUrl; + this.$.profileImage.alt = this.i18n('profilePhoto'); + + if (!selected) + return; + + this.fallbackImage_ = this.$.profileImage; + + // If user is currently taking a photo, do not steal the focus. + if (!this.selectedItem_ || this.selectedItem_.dataset.type != 'camera') + this.$.selector.select(this.$.selector.indexOf(this.$.profileImage)); + }, + + /** + * Handler for the 'camera-presence-changed' event. + * @param {boolean} cameraPresent + * @private + */ + receiveCameraPresence_: function(cameraPresent) { + this.cameraPresent_ = cameraPresent; }, /** @@ -199,16 +214,16 @@ // Nothing needs to be done. break; case 'file': - settings.ChangePicturePrivateApi.chooseFile(); + this.browserProxy_.chooseFile(); break; case 'profile': - settings.ChangePicturePrivateApi.selectProfileImage(); + this.browserProxy_.selectProfileImage(); break; case 'old': - settings.ChangePicturePrivateApi.selectOldImage(); + this.browserProxy_.selectOldImage(); break; case 'default': - settings.ChangePicturePrivateApi.selectDefaultImage(image.src); + this.browserProxy_.selectDefaultImage(image.src); break; default: assertNotReached('Selected unknown image type'); @@ -264,7 +279,7 @@ var /** SettingsCameraElement */ camera = this.$.camera; camera.takePhoto(); } else if (this.selectedItem_.dataset.type == 'file') { - settings.ChangePicturePrivateApi.chooseFile(); + this.browserProxy_.chooseFile(); } else if (this.selectedItem_.dataset.type == 'old') { this.onTapDiscardOldImage_(); } @@ -289,7 +304,7 @@ * containing a data URL. */ onPhotoTaken_: function(event) { - settings.ChangePicturePrivateApi.photoTaken(event.detail.photoDataUrl); + this.browserProxy_.photoTaken(event.detail.photoDataUrl); }, /** @@ -311,8 +326,7 @@ // If the user has not chosen an image since opening the subpage and // discards the current photo, select the first default image. assert(this.defaultImages_.length > 0); - settings.ChangePicturePrivateApi.selectDefaultImage( - this.defaultImages_[0].url); + this.browserProxy_.selectDefaultImage(this.defaultImages_[0].url); announceAccessibleMessage( loadTimeData.getString('photoDiscardAccessibleText'));
diff --git a/chrome/browser/resources/settings/people_page/change_picture_browser_proxy.html b/chrome/browser/resources/settings/people_page/change_picture_browser_proxy.html new file mode 100644 index 0000000..2175c99 --- /dev/null +++ b/chrome/browser/resources/settings/people_page/change_picture_browser_proxy.html
@@ -0,0 +1 @@ +<script src="chrome://md-settings/people_page/change_picture_browser_proxy.js"></script>
diff --git a/chrome/browser/resources/settings/people_page/change_picture_browser_proxy.js b/chrome/browser/resources/settings/people_page/change_picture_browser_proxy.js new file mode 100644 index 0000000..cfcd3cda --- /dev/null +++ b/chrome/browser/resources/settings/people_page/change_picture_browser_proxy.js
@@ -0,0 +1,112 @@ +// 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. + +/** + * @fileoverview A helper object used from the "Change Picture" subpage of + * the People section to interact with the browser. ChromeOS only. + */ +cr.exportPath('settings'); + +/** + * An object describing a default image. + * @typedef {{ + * author: string, + * title: string, + * url: string, + * website: string + * }} + */ +settings.DefaultImage; + +cr.define('settings', function() { + /** @interface */ + function ChangePictureBrowserProxy() {} + + ChangePictureBrowserProxy.prototype = { + /** + * Retrieves the initial set of default images, profile image, etc. As a + * response, the C++ sends these WebUIListener events: + * 'default-images-changed', 'profile-image-changed', 'old-image-changed', + * and 'selected-image-changed' + */ + initialize: function() {}, + + /** + * Sets the user image to one of the default images. As a response, the C++ + * sends the 'default-images-changed' WebUIListener event. + * @param {string} imageUrl + */ + selectDefaultImage: function(imageUrl) {}, + + /** + * Sets the user image to the 'old' image. As a response, the C++ sends the + * 'old-image-changed' WebUIListener event. + */ + selectOldImage: function() {}, + + /** + * Sets the user image to the profile image. As a response, the C++ sends + * the 'profile-image-changed' WebUIListener event. + */ + selectProfileImage: function() {}, + + /** + * Provides the taken photo as a data URL to the C++. No response is + * expected. + * @param {string} photoDataUrl + */ + photoTaken: function(photoDataUrl) {}, + + /** + * Requests a file chooser to select a new user image. No response is + * expected. + */ + chooseFile: function() {}, + }; + + /** + * @constructor + * @implements {ChangePictureBrowserProxy} + */ + function ChangePictureBrowserProxyImpl() {} + // The singleton instance_ is replaced with a test version of this wrapper + // during testing. + cr.addSingletonGetter(ChangePictureBrowserProxyImpl); + + ChangePictureBrowserProxyImpl.prototype = { + /** @override */ + initialize: function() { + chrome.send('onChangePicturePageInitialized'); + }, + + /** @override */ + selectDefaultImage: function(imageUrl) { + chrome.send('selectImage', [imageUrl, 'default']); + }, + + /** @override */ + selectOldImage: function() { + chrome.send('selectImage', ['', 'old']); + }, + + /** @override */ + selectProfileImage: function() { + chrome.send('selectImage', ['', 'profile']); + }, + + /** @override */ + photoTaken: function(photoDataUrl) { + chrome.send('photoTaken', [photoDataUrl]); + }, + + /** @override */ + chooseFile: function() { + chrome.send('chooseFile'); + }, + }; + + return { + ChangePictureBrowserProxyImpl: ChangePictureBrowserProxyImpl, + }; +});
diff --git a/chrome/browser/resources/settings/people_page/change_picture_private_api.html b/chrome/browser/resources/settings/people_page/change_picture_private_api.html deleted file mode 100644 index 1160701f..0000000 --- a/chrome/browser/resources/settings/people_page/change_picture_private_api.html +++ /dev/null
@@ -1 +0,0 @@ -<script src="chrome://md-settings/people_page/change_picture_private_api.js"></script>
diff --git a/chrome/browser/resources/settings/people_page/change_picture_private_api.js b/chrome/browser/resources/settings/people_page/change_picture_private_api.js deleted file mode 100644 index 7f1ae948..0000000 --- a/chrome/browser/resources/settings/people_page/change_picture_private_api.js +++ /dev/null
@@ -1,91 +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. - -cr.exportPath('settings'); - -/** - * An object describing a default image. - * @typedef {{ - * author: string, - * title: string, - * url: string, - * website: string - * }} - */ -settings.DefaultImage; - -cr.define('settings', function() { - /** - * API which encapsulates messaging between JS and C++ for the ChromeOS - * Change Picture subpage. - * @constructor - */ - function ChangePicturePrivateApi() {} - - /** - * URLs of special button images. - * @enum {string} - */ - ChangePicturePrivateApi.ButtonImages = { - TAKE_PHOTO: 'chrome://theme/IDR_BUTTON_USER_IMAGE_TAKE_PHOTO', - CHOOSE_FILE: 'chrome://theme/IDR_BUTTON_USER_IMAGE_CHOOSE_FILE', - PROFILE_PICTURE: 'chrome://theme/IDR_PROFILE_PICTURE_LOADING' - }; - - /** - * Called from JavaScript. Retrieves the initial set of default images, - * profile image, etc. As a response, the C++ calls these ChangePicturePage - * methods as callbacks: receiveDefaultImages, receiveOldImage, - * receiveProfileImage, and receiveSelectedImage. - */ - ChangePicturePrivateApi.initialize = function() { - chrome.send('onChangePicturePageInitialized'); - }; - - /** - * Called from JavaScript. Sets the user image to one of the default images. - * As a response, the C++ calls ChangePicturePage.receiveSelectedImage. - * @param {string} imageUrl - */ - ChangePicturePrivateApi.selectDefaultImage = function(imageUrl) { - chrome.send('selectImage', [imageUrl, 'default']); - }; - - /** - * Called from JavaScript. Sets the user image to the 'old' image. - * As a response, the C++ calls ChangePicturePage.receiveSelectedImage. - */ - ChangePicturePrivateApi.selectOldImage = function() { - chrome.send('selectImage', ['', 'old']); - }; - - /** - * Called from JavaScript. Sets the user image to the profile image. - * As a response, the C++ calls ChangePicturePage.receiveSelectedImage. - */ - ChangePicturePrivateApi.selectProfileImage = function() { - chrome.send('selectImage', ['', 'profile']); - }; - - /** - * Called from JavaScript. Provides the taken photo as a data URL to the C++. - * No response is expected. - * @param {string} photoDataUrl - */ - ChangePicturePrivateApi.photoTaken = function(photoDataUrl) { - chrome.send('photoTaken', [photoDataUrl]); - }; - - /** - * Called from JavaScript. Requests a file chooser to select a new user image. - * No response is expected. - */ - ChangePicturePrivateApi.chooseFile = function() { - chrome.send('chooseFile'); - }; - - return { - ChangePicturePrivateApi: ChangePicturePrivateApi, - }; -});
diff --git a/chrome/browser/resources/settings/people_page/compiled_resources2.gyp b/chrome/browser/resources/settings/people_page/compiled_resources2.gyp index dd58217..d7980ab2 100644 --- a/chrome/browser/resources/settings/people_page/compiled_resources2.gyp +++ b/chrome/browser/resources/settings/people_page/compiled_resources2.gyp
@@ -16,16 +16,17 @@ 'target_name': 'change_picture', 'dependencies': [ '<(DEPTH)/third_party/polymer/v1_0/components-chromium/iron-selector/compiled_resources2.gyp:iron-selector-extracted', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:util', - '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:web_ui_listener_behavior', 'camera', - 'change_picture_private_api', + 'change_picture_browser_proxy', ], 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], }, { - 'target_name': 'change_picture_private_api', + 'target_name': 'change_picture_browser_proxy', 'dependencies': [ '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr', ],
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.css b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.css deleted file mode 100644 index 37ba0a1..0000000 --- a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.css +++ /dev/null
@@ -1,9 +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. */ - -.footer { - background-color: rgb(236, 236, 236); - margin: 0; - padding: 20px; -}
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html index a34a006a..26e660a 100644 --- a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html +++ b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html
@@ -8,7 +8,6 @@ <dom-module id="settings-reset-profile-dialog"> <link rel="import" type="css" href="reset_page_dialog.css"> - <link rel="import" type="css" href="reset_profile_dialog.css"> <template> <style include="settings-shared"></style> <settings-dialog id="dialog">
diff --git a/chrome/browser/resources/settings/settings_dialog.html b/chrome/browser/resources/settings/settings_dialog.html index 3b2cc93..bacb033 100644 --- a/chrome/browser/resources/settings/settings_dialog.html +++ b/chrome/browser/resources/settings/settings_dialog.html
@@ -9,6 +9,11 @@ <template> <style include="paper-dialog-shared-styles"></style> <style> + .body-content { + font-size: 1em; + margin: 20px 0; + } + .dialog-content { -webkit-padding-end: 0; -webkit-padding-start: 0; @@ -23,33 +28,17 @@ .top-row { align-items: center; - border-bottom: 1px solid gainsboro; + border-bottom: 1px solid var(--paper-grey-300); display: flex; padding-bottom: 5px; padding-top: 5px; } - .body-content { - font-size: 1em; - margin: 20px 0; - } - :host { max-width: 800px; min-width: 500px; } - :host ::content .title { - flex: 1; - font-size: 1.13em; - } - - :host ::content .title, - .body-content { - -webkit-padding-end: 24px; - -webkit-padding-start: 24px; - } - :host ::content .body { margin-bottom: 35px; } @@ -60,9 +49,36 @@ } :host ::content .button-container .cancel-button { - color: rgb(109, 109, 109); + color: var(--paper-grey-600); font-weight: 500; } + + :host ::content .footer { + background-color: var(--paper-grey-200); + margin: 0; + padding: 20px; + } + + :host ::content .row { + align-items: center; + display: flex; + min-height: 40px; + } + + :host ::content .row .start { + flex: 1; + } + + :host ::content .title { + flex: 1; + font-size: 1.13em; + } + + :host ::content .title, + .body-content { + -webkit-padding-end: 24px; + -webkit-padding-start: 24px; + } </style> <div class="dialog-content"> <div class="top-row">
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index 4d9564a5..5e0af9d 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -178,6 +178,12 @@ <structure name="IDR_SETTINGS_CERTIFICATES_BROWSER_PROXY_JS" file="certificate_manager_page/certificates_browser_proxy.js" type="chrome_html" /> + <structure name="IDR_SETTINGS_CERTIFICATES_CA_TRUST_EDIT_DIALOG_JS" + file="certificate_manager_page/ca_trust_edit_dialog.js" + type="chrome_html" /> + <structure name="IDR_SETTINGS_CERTIFICATES_CA_TRUST_EDIT_DIALOG_HTML" + file="certificate_manager_page/ca_trust_edit_dialog.html" + type="chrome_html" /> <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_PAGE_CSS" file="clear_browsing_data_page/clear_browsing_data_page.css" type="chrome_html" /> @@ -295,9 +301,6 @@ <structure name="IDR_SETTINGS_RESET_PAGE_JS" file="reset_page/reset_page.js" type="chrome_html" /> - <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_CSS" - file="reset_page/reset_profile_dialog.css" - type="chrome_html" /> <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_HTML" file="reset_page/reset_profile_dialog.html" type="chrome_html" /> @@ -799,13 +802,13 @@ <structure name="IDR_SETTINGS_PEOPLE_PAGE_CHANGE_PICTURE_JS" file="people_page/change_picture.js" type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_CHANGE_PICTURE_PRIVATE_API_JS" - file="people_page/change_picture_private_api.js" + <structure name="IDR_SETTINGS_PEOPLE_CHANGE_PICTURE_BROWSER_PROXY_JS" + file="people_page/change_picture_browser_proxy.js" type="chrome_html" flattenhtml="true" allowexternalscript="true" /> - <structure name="IDR_SETTINGS_PEOPLE_CHANGE_PICTURE_PRIVATE_API_HTML" - file="people_page/change_picture_private_api.html" + <structure name="IDR_SETTINGS_PEOPLE_CHANGE_PICTURE_BROWSER_PROXY_HTML" + file="people_page/change_picture_browser_proxy.html" type="chrome_html" flattenhtml="true" allowexternalscript="true" />
diff --git a/chrome/browser/resources/settings/settings_shared_css.html b/chrome/browser/resources/settings/settings_shared_css.html index 77a6217..09729ae 100644 --- a/chrome/browser/resources/settings/settings_shared_css.html +++ b/chrome/browser/resources/settings/settings_shared_css.html
@@ -134,6 +134,10 @@ padding: 0; } + .list-item.underbar { + border-bottom: 1px solid var(--paper-grey-300); + } + .list-item iron-icon { @apply(--layout-center); height: 20px;
diff --git a/chrome/browser/resources/user_manager/user_manager.js b/chrome/browser/resources/user_manager/user_manager.js index 39d76d47..96ddf65 100644 --- a/chrome/browser/resources/user_manager/user_manager.js +++ b/chrome/browser/resources/user_manager/user_manager.js
@@ -21,12 +21,12 @@ * @extends {DisplayManager} * @constructor */ - function Oobe() { + function UserManager() { } - cr.addSingletonGetter(Oobe); + cr.addSingletonGetter(UserManager); - Oobe.prototype = { + UserManager.prototype = { __proto__: DisplayManager.prototype, }; @@ -35,8 +35,8 @@ * @param {bool} showGuest Whether the 'Browse as Guest' button is displayed. * @param {bool} showAddPerson Whether the 'Add Person' button is displayed. */ - Oobe.showUserManagerScreen = function(showGuest, showAddPerson) { - Oobe.getInstance().showScreen({id: 'account-picker', + UserManager.showUserManagerScreen = function(showGuest, showAddPerson) { + UserManager.getInstance().showScreen({id: 'account-picker', data: {disableAddUser: false}}); // The ChromeOS account-picker will hide the AddUser button if a user is // logged in and the screen is "locked", so we must re-enabled it @@ -60,14 +60,14 @@ * Open a new browser for the given profile. * @param {string} profilePath The profile's path. */ - Oobe.launchUser = function(profilePath) { + UserManager.launchUser = function(profilePath) { chrome.send('launchUser', [profilePath]); }; /** * Disables signin UI. */ - Oobe.disableSigninUI = function() { + UserManager.disableSigninUI = function() { DisplayManager.disableSigninUI(); }; @@ -75,7 +75,7 @@ * Shows signin UI. * @param {string} opt_email An optional email for signin UI. */ - Oobe.showSigninUI = function(opt_email) { + UserManager.showSigninUI = function(opt_email) { DisplayManager.showSigninUI(opt_email); }; @@ -86,28 +86,28 @@ * @param {string} link Text to use for help link. * @param {number} helpId Help topic Id associated with help link. */ - Oobe.showSignInError = function(loginAttempts, message, link, helpId) { + UserManager.showSignInError = function(loginAttempts, message, link, helpId) { DisplayManager.showSignInError(loginAttempts, message, link, helpId); }; /** * Clears error bubble as well as optional menus that could be open. */ - Oobe.clearErrors = function() { + UserManager.clearErrors = function() { DisplayManager.clearErrors(); }; /** * Clears password field in user-pod. */ - Oobe.clearUserPodPassword = function() { + UserManager.clearUserPodPassword = function() { DisplayManager.clearUserPodPassword(); }; /** * Restores input focus to currently selected pod. */ - Oobe.refocusCurrentPod = function() { + UserManager.refocusCurrentPod = function() { DisplayManager.refocusCurrentPod(); }; @@ -116,13 +116,13 @@ * @param {string} email The user's email, if signed in. * @param {string} displayName The user's display name. */ - Oobe.showUserManagerTutorial = function() { + UserManager.showUserManagerTutorial = function() { UserManagerTutorial.startTutorial(); }; // Export return { - Oobe: Oobe + UserManager: UserManager }; }); @@ -149,7 +149,8 @@ }; }); -var Oobe = cr.ui.Oobe; +// Alias to Oobe for use in src/ui/login/account_picker/user_pod_row.js +var Oobe = cr.ui.UserManager; // Allow selection events on components with editable text (password field) // bug (http://code.google.com/p/chromium/issues/detail?id=125863)
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc index 3aa0ae8..247bbe8 100644 --- a/chrome/browser/safe_browsing/safe_browsing_service.cc +++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
@@ -165,6 +165,17 @@ nullptr)); safe_browsing_request_context_->set_cookie_store( safe_browsing_cookie_store_.get()); + // The above cookie store will persist cookies, but the ChannelIDService in + // the system request context is ephemeral, which could lead to losing the + // keys that cookies are bound to. Since this is only used for safe + // browsing, any cookie bindings don't matter. + // + // For crbug.com/548423, the channel ID store and cookie store used for a + // request are being tracked to see if an ephemeral channel ID store is used + // with a persistent cookie store (which apart from here would be a bug). + // The following line tells that tracking to ignore the mismatch from this + // URLRequestContext. + safe_browsing_request_context_->set_has_known_mismatched_cookie_store(); } return safe_browsing_request_context_.get();
diff --git a/chrome/browser/shell_integration.cc b/chrome/browser/shell_integration.cc index c38ffb4..a714630 100644 --- a/chrome/browser/shell_integration.cc +++ b/chrome/browser/shell_integration.cc
@@ -174,9 +174,6 @@ set_as_default_in_progress_ = true; set_as_default_initialized_ = InitializeSetAsDefault(); - // Remember the start time. - start_time_ = base::TimeTicks::Now(); - BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, base::Bind(&DefaultWebClientWorker::SetAsDefault, this)); @@ -231,25 +228,12 @@ } void DefaultWebClientWorker::ReportAttemptResult(AttemptResult result) { - const char* histogram_prefix = GetHistogramPrefix(); - - // Report result. base::LinearHistogram::FactoryGet( - base::StringPrintf("%s.SetDefaultResult", histogram_prefix), 1, + base::StringPrintf("%s.SetDefaultResult", GetHistogramPrefix()), 1, AttemptResult::NUM_ATTEMPT_RESULT_TYPES, AttemptResult::NUM_ATTEMPT_RESULT_TYPES + 1, base::HistogramBase::kUmaTargetedHistogramFlag) ->Add(result); - - // Report asynchronous duration. - if (IsSetAsDefaultAsynchronous() && ShouldReportDurationForResult(result)) { - base::Histogram::FactoryTimeGet( - base::StringPrintf("%s.SetDefaultAsyncDuration_%s", histogram_prefix, - AttemptResultToString(result)), - base::TimeDelta::FromMilliseconds(10), base::TimeDelta::FromMinutes(3), - 50, base::HistogramBase::kUmaTargetedHistogramFlag) - ->AddTime(base::TimeTicks::Now() - start_time_); - } } bool DefaultWebClientWorker::InitializeSetAsDefault() { @@ -277,35 +261,6 @@ } } -bool DefaultWebClientWorker::ShouldReportDurationForResult( - AttemptResult result) { - return result == SUCCESS || result == FAILURE || result == RETRY; -} - -const char* DefaultWebClientWorker::AttemptResultToString( - AttemptResult result) { - switch (result) { - case SUCCESS: - return "Success"; - case ALREADY_DEFAULT: - return "AlreadyDefault"; - case FAILURE: - return "Failure"; - case LAUNCH_FAILURE: - return "LaunchFailure"; - case OTHER_WORKER: - return "OtherWorker"; - case RETRY: - return "Retry"; - case NO_ERRORS_NOT_DEFAULT: - return "NoErrorsNotDefault"; - case NUM_ATTEMPT_RESULT_TYPES: - break; - } - NOTREACHED(); - return ""; -} - /////////////////////////////////////////////////////////////////////////////// // DefaultBrowserWorker //
diff --git a/chrome/browser/shell_integration.h b/chrome/browser/shell_integration.h index a408fb08..503f395 100644 --- a/chrome/browser/shell_integration.h +++ b/chrome/browser/shell_integration.h
@@ -304,13 +304,6 @@ // client state. void UpdateUI(DefaultWebClientState state); - // Returns true if the duration of an attempt to set the default web client - // should be reported to UMA for |result|. - static bool ShouldReportDurationForResult(AttemptResult result); - - // Returns a string based on |result|. This is used for UMA reports. - static const char* AttemptResultToString(AttemptResult result); - // Called with the default state after the worker is done. DefaultWebClientWorkerCallback callback_; @@ -319,9 +312,6 @@ // initialized. bool set_as_default_initialized_ = false; - // Records the time it takes to set the default browser. - base::TimeTicks start_time_; - // Wait until Chrome has been confirmed as the default browser before // reporting a successful attempt. bool check_default_should_report_success_ = false;
diff --git a/chrome/browser/signin/easy_unlock_service.h b/chrome/browser/signin/easy_unlock_service.h index 8711a53..5009b4f 100644 --- a/chrome/browser/signin/easy_unlock_service.h +++ b/chrome/browser/signin/easy_unlock_service.h
@@ -154,8 +154,8 @@ // Whether easy unlock is allowed to be used. If the controlling preference // is set (from policy), this returns the preference value. Otherwise, it is - // permitted if the flag is enabled. - bool IsAllowed() const; + // permitted if the flag is enabled. Virtual to allow override for testing. + virtual bool IsAllowed() const; // Whether Easy Unlock is currently enabled for this user. bool IsEnabled() const;
diff --git a/chrome/browser/task_management/providers/arc/arc_process_task_provider.cc b/chrome/browser/task_management/providers/arc/arc_process_task_provider.cc index 37e9d195..a563b6c 100644 --- a/chrome/browser/task_management/providers/arc/arc_process_task_provider.cc +++ b/chrome/browser/task_management/providers/arc/arc_process_task_provider.cc
@@ -13,77 +13,26 @@ #include "base/logging.h" #include "base/process/process.h" -#include "base/process/process_iterator.h" -#include "base/task_runner_util.h" -#include "base/threading/worker_pool.h" +#include "base/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" -#include "components/arc/arc_bridge_service.h" - -namespace { - -// Computes a map from PID in ARC namespace to PID in system namespace. -// The returned map contains ARC processes only. -std::map<base::ProcessId, base::ProcessId> ComputeNspidToPidMap() { - TRACE_EVENT0("browser", "ComputeNspidToPidMap"); - - // NB: Despite of its name, ProcessIterator::Snapshot() may return - // inconsistent information because it simply walks procfs. Especially - // we must not assume the parent-child relationships are consistent. - const base::ProcessIterator::ProcessEntries& entry_list = - base::ProcessIterator(nullptr).Snapshot(); - - // System may contain many different namespaces so several different - // processes may have the same nspid. We need to get the proper subset of - // processes to create correct nspid -> pid map. - - // Construct the process tree. - // NB: This can contain a loop in case of race conditions. - std::map<base::ProcessId, std::vector<base::ProcessId> > process_tree; - for (const base::ProcessEntry& entry : entry_list) - process_tree[entry.parent_pid()].push_back(entry.pid()); - - // Find the ARC init process. - base::ProcessId arc_init_pid = base::kNullProcessId; - for (const base::ProcessEntry& entry : entry_list) { - // TODO(nya): Add more constraints to avoid mismatches. - std::string process_name = - !entry.cmd_line_args().empty() ? entry.cmd_line_args()[0] : ""; - if (process_name == "/init") { - arc_init_pid = entry.pid(); - break; - } - } - - // Enumerate all processes under ARC init and create nspid -> pid map. - std::map<base::ProcessId, base::ProcessId> nspid_to_pid; - if (arc_init_pid != base::kNullProcessId) { - std::queue<base::ProcessId> queue; - std::set<base::ProcessId> visited; - queue.push(arc_init_pid); - while (!queue.empty()) { - base::ProcessId pid = queue.front(); - queue.pop(); - // Do not visit the same process twice. Otherwise we may enter an infinite - // loop if |process_tree| contains a loop. - if (!visited.insert(pid).second) - continue; - base::ProcessId nspid = base::Process(pid).GetPidInNamespace(); - // All ARC processes should be in namespace so nspid is usually non-null, - // but this can happen if the process has already gone. - if (nspid != base::kNullProcessId) - nspid_to_pid[nspid] = pid; - for (base::ProcessId child_pid : process_tree[pid]) - queue.push(child_pid); - } - } - return nspid_to_pid; -} - -} // namespace +#include "chrome/browser/chromeos/arc/arc_process.h" +#include "chrome/browser/chromeos/arc/arc_process_service.h" namespace task_management { -ArcProcessTaskProvider::ArcProcessTaskProvider() : weak_ptr_factory_(this) {} +namespace { + +const int kUpdateProcessListDelaySeconds = 1; + +} // namespace + +using std::set; +using arc::ArcProcess; +using base::Process; +using base::ProcessId; + +ArcProcessTaskProvider::ArcProcessTaskProvider() + : is_updating_(false), weak_ptr_factory_(this) {} ArcProcessTaskProvider::~ArcProcessTaskProvider() {} @@ -95,95 +44,76 @@ } void ArcProcessTaskProvider::OnUpdateProcessList( - mojo::Array<arc::RunningAppProcessInfoPtr> processes) { + const std::vector<ArcProcess>& processes) { TRACE_EVENT0("browser", "ArcProcessTaskProvider::OnUpdateProcessList"); + if (!is_updating_) + return; + // NB: |processes| can be already stale here because it is sent via IPC, and // we can never avoid that. See also the comment at the declaration of // ArcProcessTaskProvider. - std::vector<arc::RunningAppProcessInfo> added_processes; - std::set<base::ProcessId> removed_nspids; - for (const auto& entry : nspid_to_task_) - removed_nspids.insert(entry.first); - for (size_t i = 0; i < processes.size(); ++i) { - const arc::RunningAppProcessInfoPtr& process = processes[i]; - if (nspid_to_task_.count(process->pid)) - removed_nspids.erase(process->pid); - else - added_processes.push_back(*process); + set<ProcessId> nspid_to_remove; + for (const auto& it : nspid_to_task_) + nspid_to_remove.insert(it.first); + + for (const auto& it : processes) { + if (nspid_to_remove.erase(it.nspid) == 0) { + // New arc process. + scoped_ptr<ArcProcessTask>& task = nspid_to_task_[it.nspid]; + // After calling NotifyObserverTaskAdded(), the raw pointer of |task| is + // remebered somewhere else. One should not (implicitly) delete the + // referenced object before calling NotifyObserverTaskRemoved() first + // (crbug.com/587707). + DCHECK(!task.get()) << + "Task with the same pid should not be added twice."; + task.reset(new ArcProcessTask(it.pid, it.nspid, it.process_name)); + NotifyObserverTaskAdded(task.get()); + } } - // Remove stale tasks. - RemoveTasks(removed_nspids); - - // Add new tasks. - // Note: ComputeNspidToPidMap() is an expensive operation, so try to reduce - // the number of times it is called. - if (!added_processes.empty()) { - base::PostTaskAndReplyWithResult( - base::WorkerPool::GetTaskRunner(false /* task_is_slow */).get(), - FROM_HERE, - base::Bind(&ComputeNspidToPidMap), - base::Bind(&ArcProcessTaskProvider::AddTasks, - weak_ptr_factory_.GetWeakPtr(), - added_processes)); + for (const auto& it : nspid_to_remove) { + // Stale arc process. + NotifyObserverTaskRemoved(nspid_to_task_[it].get()); + nspid_to_task_.erase(it); } + ScheduleNextRequest(); } void ArcProcessTaskProvider::RequestProcessList() { - arc::ProcessInstance* arc_process_instance = - arc::ArcBridgeService::Get()->process_instance(); - if (!arc_process_instance) { + arc::ArcProcessService* arc_process_service = + arc::ArcProcessService::Get(); + if (!arc_process_service || + !arc_process_service->RequestProcessList( + base::Bind(&ArcProcessTaskProvider::OnUpdateProcessList, + weak_ptr_factory_.GetWeakPtr()))) { VLOG(2) << "ARC process instance is not ready."; - return; - } - arc_process_instance->RequestProcessList( - base::Bind(&ArcProcessTaskProvider::OnUpdateProcessList, - weak_ptr_factory_.GetWeakPtr())); -} - -void ArcProcessTaskProvider::RemoveTasks( - const std::set<base::ProcessId>& removed_nspids) { - for (base::ProcessId nspid : removed_nspids) { - NotifyObserverTaskRemoved(nspid_to_task_[nspid].get()); - nspid_to_task_.erase(nspid); - } -} - -void ArcProcessTaskProvider::AddTasks( - const std::vector<arc::RunningAppProcessInfo>& added_processes, - const std::map<base::ProcessId, base::ProcessId>& nspid_to_pid) { - for (const arc::RunningAppProcessInfo& process : added_processes) { - auto iter = nspid_to_pid.find(process.pid); - if (iter == nspid_to_pid.end()) { - // The process may have exited just after the snapshot was generated. - continue; - } - base::ProcessId pid = iter->second; - scoped_ptr<ArcProcessTask>& task = nspid_to_task_[process.pid]; - if (task.get()) - NotifyObserverTaskRemoved(task.get()); - task.reset(new ArcProcessTask(pid, process.pid, process.process_name)); - NotifyObserverTaskAdded(task.get()); + ScheduleNextRequest(); } } void ArcProcessTaskProvider::StartUpdating() { + is_updating_ = true; RequestProcessList(); - // TODO(nya): Remove this timer once ARC starts to send us UpdateProcessList - // message when the process list changed. As of today, ARC does not send - // the process list unless we request it by RequestProcessList message. - timer_.Start( - FROM_HERE, - base::TimeDelta::FromSeconds(1), - this, - &ArcProcessTaskProvider::RequestProcessList); } void ArcProcessTaskProvider::StopUpdating() { - timer_.Stop(); + is_updating_ = false; nspid_to_task_.clear(); } +void ArcProcessTaskProvider::ScheduleNextRequest() { + if (!is_updating_) + return; + // TODO(nya): Remove this timer once ARC starts to send us UpdateProcessList + // message when the process list changed. As of today, ARC does not send + // the process list unless we request it by RequestProcessList message. + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::Bind(&ArcProcessTaskProvider::RequestProcessList, + weak_ptr_factory_.GetWeakPtr()), + base::TimeDelta::FromSeconds(kUpdateProcessListDelaySeconds)); +} + } // namespace task_management
diff --git a/chrome/browser/task_management/providers/arc/arc_process_task_provider.h b/chrome/browser/task_management/providers/arc/arc_process_task_provider.h index fc5689c..70c1d7d 100644 --- a/chrome/browser/task_management/providers/arc/arc_process_task_provider.h +++ b/chrome/browser/task_management/providers/arc/arc_process_task_provider.h
@@ -13,14 +13,10 @@ #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" -#include "base/timer/timer.h" +#include "base/process/process.h" +#include "chrome/browser/chromeos/arc/arc_process.h" #include "chrome/browser/task_management/providers/arc/arc_process_task.h" #include "chrome/browser/task_management/providers/task_provider.h" -#include "components/arc/arc_bridge_service.h" - -namespace base { -class Timer; -} // namespace base namespace task_management { @@ -30,8 +26,8 @@ // it can never avoid race conditions. For example, in an extreme case such as // fork(2) is called millions of times in a second, this provider can return // wrong results. However, its chance is very low, and even if we hit the case, -// the worst outcome is just that an Android app (non-system) process which -// the user did not intend to choose is killed. Since Android apps are designed +// the worst outcome is just that an app (non-system) process which +// the user did not intend to choose is killed. Since apps are designed // to be killed at any time, it sounds acceptable. class ArcProcessTaskProvider : public TaskProvider { public: @@ -44,20 +40,21 @@ int route_id) override; private: + // Auto-retry if ARC bridge service is not ready. void RequestProcessList(); - void OnUpdateProcessList( - mojo::Array<arc::RunningAppProcessInfoPtr> processes); - void RemoveTasks(const std::set<base::ProcessId>& removed_nspids); - void AddTasks(const std::vector<arc::RunningAppProcessInfo>& added_processes, - const std::map<base::ProcessId, base::ProcessId>& nspid_to_pid); + void OnUpdateProcessList(const std::vector<arc::ArcProcess>& processes); // task_management::TaskProvider: void StartUpdating() override; void StopUpdating() override; - std::map<base::ProcessId, scoped_ptr<ArcProcessTask> > nspid_to_task_; - base::RepeatingTimer timer_; + void ScheduleNextRequest(); + + std::map<base::ProcessId, scoped_ptr<ArcProcessTask>> nspid_to_task_; + + // Whether to continue the periodical polling. + bool is_updating_; // Always keep this the last member of this class to make sure it's the // first thing to be destructed.
diff --git a/chrome/browser/task_management/sampling/task_manager_impl.cc b/chrome/browser/task_management/sampling/task_manager_impl.cc index 6ca6fe2..9c2abab 100644 --- a/chrome/browser/task_management/sampling/task_manager_impl.cc +++ b/chrome/browser/task_management/sampling/task_manager_impl.cc
@@ -4,6 +4,9 @@ #include "chrome/browser/task_management/sampling/task_manager_impl.h" +#include <string> +#include <vector> + #include "base/command_line.h" #include "base/stl_util.h" #include "build/build_config.h" @@ -15,6 +18,7 @@ #if defined(OS_CHROMEOS) #include "chrome/browser/task_management/providers/arc/arc_process_task_provider.h" +#include "components/arc/arc_bridge_service.h" #endif // defined(OS_CHROMEOS) namespace task_management {
diff --git a/chrome/browser/ui/android/autofill/autofill_popup_view_android.cc b/chrome/browser/ui/android/autofill/autofill_popup_view_android.cc index a2a8054..663bd8b4 100644 --- a/chrome/browser/ui/android/autofill/autofill_popup_view_android.cc +++ b/chrome/browser/ui/android/autofill/autofill_popup_view_android.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/ui/android/view_android_helper.h" #include "chrome/browser/ui/autofill/autofill_popup_controller.h" #include "chrome/browser/ui/autofill/autofill_popup_layout_model.h" +#include "components/autofill/core/browser/popup_item_ids.h" #include "components/autofill/core/browser/suggestion.h" #include "components/autofill/core/common/autofill_util.h" #include "content/public/browser/android/content_view_core.h" @@ -72,7 +73,7 @@ env, controller_->GetElidedLabelAt(i)); int android_icon_id = 0; - const autofill::Suggestion& suggestion = controller_->GetSuggestionAt(i); + const Suggestion& suggestion = controller_->GetSuggestionAt(i); if (!suggestion.icon.empty()) { android_icon_id = ResourceMapper::MapFromChromiumId( controller_->layout_model().GetIconResourceID(suggestion.icon)); @@ -80,15 +81,11 @@ bool deletable = controller_->GetRemovalConfirmationText(i, nullptr, nullptr); + bool is_label_multiline = + suggestion.frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE; Java_AutofillPopupBridge_addToAutofillSuggestionArray( - env, - data_array.obj(), - i, - value.obj(), - label.obj(), - android_icon_id, - suggestion.frontend_id, - deletable); + env, data_array.obj(), i, value.obj(), label.obj(), android_icon_id, + suggestion.frontend_id, deletable, is_label_multiline); } Java_AutofillPopupBridge_show(
diff --git a/chrome/browser/ui/app_list/app_list_service_views.cc b/chrome/browser/ui/app_list/app_list_service_views.cc index cb50d89..4b02465 100644 --- a/chrome/browser/ui/app_list/app_list_service_views.cc +++ b/chrome/browser/ui/app_list/app_list_service_views.cc
@@ -117,7 +117,8 @@ app_list::AppListModel::State state) { DCHECK(profile); - ScopedKeepAlive keep_alive(KeepAliveOrigin::APP_LIST_SERVICE_VIEWS); + ScopedKeepAlive keep_alive(KeepAliveOrigin::APP_LIST_SERVICE_VIEWS, + KeepAliveRestartOption::DISABLED); CreateForProfile(profile);
diff --git a/chrome/browser/ui/app_list/app_list_shower_views.cc b/chrome/browser/ui/app_list/app_list_shower_views.cc index 4bec5fd..20f5acba 100644 --- a/chrome/browser/ui/app_list/app_list_shower_views.cc +++ b/chrome/browser/ui/app_list/app_list_shower_views.cc
@@ -30,7 +30,8 @@ void AppListShower::ShowForCurrentProfile() { DCHECK(HasView()); - keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::APP_LIST_SHOWER)); + keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::APP_LIST_SHOWER, + KeepAliveRestartOption::DISABLED)); // If the app list is already displaying |profile| just activate it (in case // we have lost focus).
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc index 3535fd7..2afa157f 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -4,17 +4,125 @@ #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" +#include "ash/shell.h" +#include "base/bind.h" +#include "base/synchronization/waitable_event.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "components/arc/arc_bridge_service.h" +#include "ui/aura/window.h" +#include "ui/gfx/display.h" +#include "ui/gfx/screen.h" namespace arc { -void GetAndroidAppTargetRect(gfx::Rect& target_rect) { - // TODO: Figure out where to put the android window. - target_rect.SetRect(0, 0, 0, 0); -} +namespace { -bool LaunchApp(content::BrowserContext* context, const std::string& app_id) { +// A class which handles the asynchronous ARC runtime callback to figure out if +// an app can handle a certain resolution or not. +// After LaunchAndRelease() got called, the object will destroy itself once +// done. +class LaunchAppWithoutSize { + public: + LaunchAppWithoutSize(content::BrowserContext* context, std::string app_id) : + context_(context), app_id_(app_id) {} + + // This will launch the request and after the return the creator does not + // need to delete the object anymore. + bool LaunchAndRelease() { + landscape_ = gfx::Rect(0, 0, NEXUS7_WIDTH, NEXUS7_HEIGHT); + if (!ash::Shell::HasInstance()) { + // Skip this if there is no Ash shell. + LaunchAppWithRect(context_, app_id_, landscape_); + delete this; + return true; + } + bool result = CanHandleResolution(context_, app_id_, landscape_, + base::Bind(&LaunchAppWithoutSize::Callback, base::Unretained(this))); + if (!result) + delete this; + return result; + } + + private: + // Default sizes to use. + static const int NEXUS7_WIDTH = 1170; + static const int NEXUS7_HEIGHT = 800; + static const int NEXUS6_WIDTH = 410; + static const int NEXUS6_HEIGHT = 730; + + // Constants which are (for now) defined by constants coming from Wayland. + static const int WINDOW_TITLE_HEIGHT = 30; + + content::BrowserContext* context_; + const std::string app_id_; + gfx::Rect landscape_; + + // The callback handler which gets called from the CanHandleResolution + // function. + void Callback(bool can_handle) { + gfx::Size target_size = can_handle ? landscape_.size() : + gfx::Size(NEXUS6_WIDTH, NEXUS6_HEIGHT); + LaunchAppWithRect(context_, app_id_, getTargetRect(target_size)); + // Now that we are done, we can delete ourselves. + delete this; + } + + // Find a proper size and position for a given rectangle on the screen. + // TODO(skuhne): This needs more consideration, but it is lacking + // WindowPositioner functionality since we do not have an Aura::Window yet. + gfx::Rect getTargetRect(const gfx::Size& size) { + // Make sure that the window will fit into our workspace. + // Note that Arc++ will always be on the primary screen (for now). + // Note that Android's coordinate system is only valid inside the working + // area. We can therefore ignore the provided left / top offsets. + aura::Window* root = ash::Shell::GetPrimaryRootWindow(); + gfx::Rect work_area = + gfx::Screen::GetScreen()->GetDisplayNearestWindow(root).work_area(); + + // For what Android is concerned, the title bar starts at -TITLE_BAR_HEIGHT. + // as such we deduct the title bar height simply from the height, but leave + // the top as it is. + work_area.set_height(work_area.height() - WINDOW_TITLE_HEIGHT); + gfx::Rect result(size); + + // Make sure that the window fits entirely into the work area. + if (size.width() < work_area.width() || + size.height() < work_area.height()) { + float aspect = static_cast<float>(size.width()) / + static_cast<float>(size.height()); + // Calculate the complementary size from the aspect ratio. + int w = static_cast<int>(static_cast<float>(work_area.height()) * aspect); + int h = static_cast<int>(static_cast<float>(work_area.width()) / aspect); + // Overwrite the dimension which is too big with the possible maximum, + // keeping the complementary size. + if (h > work_area.height()) { + result.set_height(work_area.height()); + result.set_width(w); + } else { + result.set_width(work_area.width()); + result.set_height(h); + } + } + + // ChromeOS does not give us much logic at this time, so we emulate what + // WindowPositioner::GetDefaultWindowBounds does for now. + // Note: Android's positioning will not overlap the shelf - as such we can + // ignore the given workspace inset. + // TODO(skuhne): Replace this with some more useful logic from the + // WindowPositioner. + result.set_x((work_area.width() - result.width()) / 2); + result.set_y((work_area.height() - result.height()) / 2); + return result; + } + + DISALLOW_COPY_AND_ASSIGN(LaunchAppWithoutSize); +}; + +} // namespace + +bool LaunchAppWithRect(content::BrowserContext* context, + const std::string& app_id, + const gfx::Rect& target_rect) { ArcAppListPrefs* prefs = ArcAppListPrefs::Get(context); CHECK(prefs); @@ -42,9 +150,6 @@ return false; } - gfx::Rect target_rect; - GetAndroidAppTargetRect(target_rect); - arc::ScreenRectPtr rect = arc::ScreenRect::New(); rect->left = target_rect.x(); rect->right = target_rect.right(); @@ -58,6 +163,10 @@ return true; } +bool LaunchApp(content::BrowserContext* context, const std::string& app_id) { + return (new LaunchAppWithoutSize(context, app_id))->LaunchAndRelease(); +} + bool CanHandleResolution(content::BrowserContext* context, const std::string& app_id, const gfx::Rect& rect,
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.h b/chrome/browser/ui/app_list/arc/arc_app_utils.h index bd9ba93..2fbd1b7c 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_utils.h +++ b/chrome/browser/ui/app_list/arc/arc_app_utils.h
@@ -16,12 +16,15 @@ namespace arc { using CanHandleResolutionCallback = base::Callback<void(bool)>; -} -namespace arc { - +// Launch an app and let the system decide how big and where to place it. bool LaunchApp(content::BrowserContext* context, const std::string& app_id); +// Launch an app and place it at the specified coordinates. +bool LaunchAppWithRect(content::BrowserContext* context, + const std::string& app_id, + const gfx::Rect& target_rect); + // Tests if the application can use the given target resolution. // The callback will receive the information once known. // A false will get returned if the result cannot be determined in which case
diff --git a/chrome/browser/ui/app_list/extension_app_context_menu.cc b/chrome/browser/ui/app_list/extension_app_context_menu.cc index 65a3a48..39d939b6 100644 --- a/chrome/browser/ui/app_list/extension_app_context_menu.cc +++ b/chrome/browser/ui/app_list/extension_app_context_menu.cc
@@ -237,7 +237,7 @@ controller()->UninstallApp(profile(), app_id()); } else if (extensions::ContextMenuMatcher::IsExtensionsCustomCommandId( command_id)) { - extension_menu_items_->ExecuteCommand(command_id, nullptr, + extension_menu_items_->ExecuteCommand(command_id, nullptr, nullptr, content::ContextMenuParams()); } else if (command_id == MENU_NEW_WINDOW) { controller()->CreateNewWindow(profile(), false);
diff --git a/chrome/browser/ui/app_list/profile_loader.cc b/chrome/browser/ui/app_list/profile_loader.cc index 7bc57f1f..be09089c 100644 --- a/chrome/browser/ui/app_list/profile_loader.cc +++ b/chrome/browser/ui/app_list/profile_loader.cc
@@ -67,7 +67,8 @@ void ProfileLoader::IncrementPendingProfileLoads() { pending_profile_loads_++; if (pending_profile_loads_ == 1) - keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::PROFILE_LOADER)); + keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::PROFILE_LOADER, + KeepAliveRestartOption::DISABLED)); } void ProfileLoader::DecrementPendingProfileLoads() {
diff --git a/chrome/browser/ui/app_list/search/common/webservice_cache.cc b/chrome/browser/ui/app_list/search/common/webservice_cache.cc index 8fa41ca..d1c745a 100644 --- a/chrome/browser/ui/app_list/search/common/webservice_cache.cc +++ b/chrome/browser/ui/app_list/search/common/webservice_cache.cc
@@ -26,10 +26,6 @@ } // namespace -void WebserviceCache::CacheDeletor::operator()(const Payload& payload) { - delete payload.result; -} - WebserviceCache::WebserviceCache(content::BrowserContext* context) : cache_(Cache::NO_AUTO_EVICT), cache_loaded_(false) { @@ -49,11 +45,11 @@ std::string typed_query = PrependType(type, query); Cache::iterator iter = cache_.Get(typed_query); if (iter != cache_.end()) { - if (base::Time::Now() - iter->second.time <= + if (base::Time::Now() - iter->second->time <= base::TimeDelta::FromMinutes(kWebserviceCacheTimeLimitInMinutes)) { - return std::make_pair(FRESH, iter->second.result); + return std::make_pair(FRESH, iter->second->result.get()); } else { - return std::make_pair(STALE, iter->second.result); + return std::make_pair(STALE, iter->second->result.get()); } } return std::make_pair(STALE, static_cast<base::DictionaryValue*>(NULL)); @@ -64,15 +60,17 @@ scoped_ptr<base::DictionaryValue> result) { if (result) { std::string typed_query = PrependType(type, query); - Payload payload(base::Time::Now(), result.release()); + scoped_ptr<Payload> scoped_payload( + new Payload(base::Time::Now(), std::move(result))); + Payload* payload = scoped_payload.get(); - cache_.Put(typed_query, payload); + cache_.Put(typed_query, std::move(scoped_payload)); // If the cache isn't loaded yet, we're fine with losing queries since // a 1000 entry cache should load really quickly so the chance of a user // already having typed a 3 character search before the cache has loaded is // very unlikely. if (cache_loaded_) { - data_store_->cached_dict()->Set(typed_query, DictFromPayload(payload)); + data_store_->cached_dict()->Set(typed_query, DictFromPayload(*payload)); data_store_->ScheduleWrite(); if (cache_.size() > kWebserviceCacheMaxSize) TrimCache(); @@ -89,16 +87,16 @@ !it.IsAtEnd(); it.Advance()) { const base::DictionaryValue* payload_dict; - Payload payload; + scoped_ptr<Payload> payload(new Payload); if (!it.value().GetAsDictionary(&payload_dict) || !payload_dict || - !PayloadFromDict(payload_dict, &payload)) { + !PayloadFromDict(payload_dict, payload.get())) { // In case we don't have a valid payload associated with a given query, // clean up that query from our data store. cleanup_keys.push_back(it.key()); continue; } - cache_.Put(it.key(), payload); + cache_.Put(it.key(), std::move(payload)); } if (!cleanup_keys.empty()) { @@ -125,7 +123,7 @@ // instead of returning the original reference. The new dictionary will be // owned by our MRU cache. *payload = Payload(base::Time::FromInternalValue(time_val), - result->DeepCopy()); + make_scoped_ptr(result->DeepCopy())); return true; } @@ -163,4 +161,18 @@ } } +WebserviceCache::Payload::Payload(const base::Time& time, + scoped_ptr<base::DictionaryValue> result) + : time(time), result(std::move(result)) {} + +WebserviceCache::Payload::Payload() = default; + +WebserviceCache::Payload::~Payload() = default; + +WebserviceCache::Payload& WebserviceCache::Payload::operator=(Payload&& other) { + time = std::move(other.time); + result = std::move(other.result); + return *this; +} + } // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/common/webservice_cache.h b/chrome/browser/ui/app_list/search/common/webservice_cache.h index b71c76b..a5ac910 100644 --- a/chrome/browser/ui/app_list/search/common/webservice_cache.h +++ b/chrome/browser/ui/app_list/search/common/webservice_cache.h
@@ -64,22 +64,17 @@ private: struct Payload { - Payload(const base::Time& time, - const base::DictionaryValue* result) - : time(time), result(result) {} - Payload() {} + Payload(const base::Time& time, scoped_ptr<base::DictionaryValue> result); + Payload(); + ~Payload(); + + Payload& operator=(Payload&& other); base::Time time; - const base::DictionaryValue* result; + scoped_ptr<base::DictionaryValue> result; }; - class CacheDeletor { - public: - void operator()(const Payload& payload); - }; - typedef base:: - MRUCacheBase<std::string, Payload, std::less<std::string>, CacheDeletor> - Cache; + using Cache = base::MRUCache<std::string, scoped_ptr<Payload>>; // Callback for when the cache is loaded from the dictionary data store. void OnCacheLoaded(scoped_ptr<base::DictionaryValue>); @@ -87,8 +82,7 @@ // Populates the payload parameter with the corresponding payload stored // in the given dictionary. If the dictionary is invalid for any reason, // this method will return false. - bool PayloadFromDict(const base::DictionaryValue* dict, - Payload* payload); + bool PayloadFromDict(const base::DictionaryValue* dict, Payload* payload); // Returns a dictionary value for a given payload. The returned dictionary // will be owned by the data_store_ cached_dict, and freed on the destruction
diff --git a/chrome/browser/ui/apps/chrome_app_delegate.cc b/chrome/browser/ui/apps/chrome_app_delegate.cc index 155eb2a4..35249f7 100644 --- a/chrome/browser/ui/apps/chrome_app_delegate.cc +++ b/chrome/browser/ui/apps/chrome_app_delegate.cc
@@ -153,8 +153,8 @@ new_window_contents_delegate_(new NewWindowContentsDelegate()), weak_factory_(this) { if (keep_alive) { - keep_alive_.reset( - new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE)); + keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE, + KeepAliveRestartOption::DISABLED)); } registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, @@ -328,7 +328,8 @@ void ChromeAppDelegate::OnShow() { has_been_shown_ = true; is_hidden_ = false; - keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE)); + keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::CHROME_APP_DELEGATE, + KeepAliveRestartOption::DISABLED)); } void ChromeAppDelegate::Observe(int type,
diff --git a/chrome/browser/ui/ash/launcher/app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/app_window_launcher_controller.cc index ee37e650..4e46569 100644 --- a/chrome/browser/ui/ash/launcher/app_window_launcher_controller.cc +++ b/chrome/browser/ui/ash/launcher/app_window_launcher_controller.cc
@@ -29,11 +29,6 @@ return app_window->extension_id(); } -bool ControlsWindow(aura::Window* window) { - return chrome::GetHostDesktopTypeForNativeWindow(window) == - chrome::HOST_DESKTOP_TYPE_ASH; -} - } // namespace AppWindowLauncherController::AppWindowLauncherController( @@ -86,9 +81,6 @@ void AppWindowLauncherController::OnAppWindowIconChanged( AppWindow* app_window) { - if (!ControlsWindow(app_window->GetNativeWindow())) - return; - const std::string app_shelf_id = GetAppShelfId(app_window); AppControllerMap::iterator iter = app_controller_map_.find(app_shelf_id); if (iter == app_controller_map_.end()) @@ -102,18 +94,12 @@ void AppWindowLauncherController::OnAppWindowShown(AppWindow* app_window, bool was_hidden) { aura::Window* window = app_window->GetNativeWindow(); - if (!ControlsWindow(window)) - return; - if (!IsRegisteredApp(window)) RegisterApp(app_window); } void AppWindowLauncherController::OnAppWindowHidden(AppWindow* app_window) { aura::Window* window = app_window->GetNativeWindow(); - if (!ControlsWindow(window)) - return; - if (IsRegisteredApp(window)) UnregisterApp(window); } @@ -122,8 +108,6 @@ // which destroys AppWindow, so both |window| and the associated AppWindow // are valid here. void AppWindowLauncherController::OnWindowDestroying(aura::Window* window) { - if (!ControlsWindow(window)) - return; UnregisterApp(window); }
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc index 8bdda51..44de04d8 100644 --- a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc +++ b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
@@ -312,7 +312,7 @@ break; default: if (extension_items_) { - extension_items_->ExecuteCommand(command_id, nullptr, + extension_items_->ExecuteCommand(command_id, nullptr, nullptr, content::ContextMenuParams()); } }
diff --git a/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc index c36f1a2b..6ca56f75 100644 --- a/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc +++ b/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc
@@ -14,15 +14,6 @@ #include "extensions/browser/app_window/native_app_window.h" #include "ui/aura/window.h" -namespace { - -bool ControlsWindow(aura::Window* window) { - return chrome::GetHostDesktopTypeForNativeWindow(window) == - chrome::HOST_DESKTOP_TYPE_ASH; -} - -} // namespace - MultiProfileAppWindowLauncherController:: MultiProfileAppWindowLauncherController(ChromeLauncherController* owner) : AppWindowLauncherController(owner) {} @@ -77,9 +68,6 @@ void MultiProfileAppWindowLauncherController::OnAppWindowAdded( extensions::AppWindow* app_window) { - if (!ControlsWindow(app_window->GetNativeWindow())) - return; - app_window_list_.push_back(app_window); Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); // If the window got created for a non active user but the user allowed to @@ -94,9 +82,6 @@ void MultiProfileAppWindowLauncherController::OnAppWindowShown( extensions::AppWindow* app_window, bool was_hidden) { - if (!ControlsWindow(app_window->GetNativeWindow())) - return; - Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); if (multi_user_util::IsProfileFromActiveUser(profile) && @@ -117,9 +102,6 @@ void MultiProfileAppWindowLauncherController::OnAppWindowHidden( extensions::AppWindow* app_window) { - if (!ControlsWindow(app_window->GetNativeWindow())) - return; - Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); if (multi_user_util::IsProfileFromActiveUser(profile) && IsRegisteredApp(app_window->GetNativeWindow())) { @@ -129,9 +111,6 @@ void MultiProfileAppWindowLauncherController::OnAppWindowRemoved( extensions::AppWindow* app_window) { - if (!ControlsWindow(app_window->GetNativeWindow())) - return; - // If the application is registered with AppWindowLauncher (because the user // is currently active), the OnWindowDestroying observer has already (or will // soon) unregister it independently from the shelf. If it was not registered
diff --git a/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm b/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm index f7b215f..969b3db 100644 --- a/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm +++ b/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm
@@ -248,7 +248,7 @@ // Midline horizontal ellipsis follwed by last four digits. base::scoped_nsobject<NSTextField> lastFourLabel([SaveCardBubbleViewCocoa - makeLabel:SysUTF16ToNSString(base::UTF8ToUTF16("\xE2\x8B\xAF") + + makeLabel:SysUTF16ToNSString(base::string16(autofill::kMidlineEllipsis) + card.LastFourDigits())]); base::scoped_nsobject<NSTextField> expirationDateLabel(
diff --git a/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.mm b/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.mm index 4a1de10e..e3586b6 100644 --- a/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.mm +++ b/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.mm
@@ -196,7 +196,10 @@ } - (BOOL)acceptsFirstResponder { - return YES; + // The overflow container needs to receive key events to handle in-item + // navigation. The top-level container should not become first responder, + // allowing focus travel to proceed to the first action. + return isOverflow_; } - (void)mouseEntered:(NSEvent*)theEvent {
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm index e3bcc4e..a6279134 100644 --- a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm +++ b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm
@@ -594,10 +594,6 @@ [attributedString addAttribute:NSForegroundColorAttributeName value:color range:ComponentToNSRange(scheme)]; - } else if (as_length) { - [attributedString addAttribute:NSForegroundColorAttributeName - value:BaseTextColor(inDarkMode) - range:as_entire_string]; } }
diff --git a/chrome/browser/ui/extensions/extension_installed_bubble.cc b/chrome/browser/ui/extensions/extension_installed_bubble.cc index 2db22ac..9813606d 100644 --- a/chrome/browser/ui/extensions/extension_installed_bubble.cc +++ b/chrome/browser/ui/extensions/extension_installed_bubble.cc
@@ -250,9 +250,12 @@ bool extension_action_redesign_on = extensions::FeatureSwitch::extension_action_redesign()->IsEnabled(); - if (extensions::ActionInfo::GetBrowserActionInfo(extension_)) { + const extensions::ActionInfo* action_info = nullptr; + if ((action_info = extensions::ActionInfo::GetBrowserActionInfo( + extension_)) != nullptr) { type_ = BROWSER_ACTION; - } else if (extensions::ActionInfo::GetPageActionInfo(extension_) && + } else if ((action_info = extensions::ActionInfo::GetPageActionInfo( + extension_)) != nullptr && (extensions::ActionInfo::IsVerboseInstallMessage(extension_) || extension_action_redesign_on)) { type_ = PAGE_ACTION; @@ -271,7 +274,10 @@ switch (type_) { case BROWSER_ACTION: case PAGE_ACTION: - options_ |= HOW_TO_USE; + DCHECK(action_info); + if (!action_info->synthesized) + options_ |= HOW_TO_USE; + if (has_command_keybinding()) { options_ |= SHOW_KEYBINDING; } else {
diff --git a/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc b/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc new file mode 100644 index 0000000..ccaca98 --- /dev/null +++ b/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc
@@ -0,0 +1,43 @@ +// 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 "chrome/browser/extensions/extension_action_test_util.h" +#include "chrome/browser/extensions/extension_browsertest.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/ui/extensions/extension_installed_bubble.h" + +using ExtensionInstalledBubbleBrowserTest = ExtensionBrowserTest; + +IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, + DoNotShowHowToUseForSynthesizedActions) { + const SkBitmap kEmptyBitmap; + { + scoped_refptr<const extensions::Extension> extension = + extensions::extension_action_test_util::CreateActionExtension( + "No action", extensions::extension_action_test_util::NO_ACTION); + extension_service()->AddExtension(extension.get()); + ExtensionInstalledBubble bubble(extension.get(), browser(), kEmptyBitmap); + bubble.Initialize(); + EXPECT_EQ(0, bubble.options() & ExtensionInstalledBubble::HOW_TO_USE); + } + { + scoped_refptr<const extensions::Extension> extension = + extensions::extension_action_test_util::CreateActionExtension( + "Browser action", + extensions::extension_action_test_util::BROWSER_ACTION); + extension_service()->AddExtension(extension.get()); + ExtensionInstalledBubble bubble(extension.get(), browser(), kEmptyBitmap); + bubble.Initialize(); + EXPECT_NE(0, bubble.options() & ExtensionInstalledBubble::HOW_TO_USE); + } + { + scoped_refptr<const extensions::Extension> extension = + extensions::extension_action_test_util::CreateActionExtension( + "Page action", extensions::extension_action_test_util::PAGE_ACTION); + extension_service()->AddExtension(extension.get()); + ExtensionInstalledBubble bubble(extension.get(), browser(), kEmptyBitmap); + bubble.Initialize(); + EXPECT_NE(0, bubble.options() & ExtensionInstalledBubble::HOW_TO_USE); + } +}
diff --git a/chrome/browser/ui/layout_constants.cc b/chrome/browser/ui/layout_constants.cc index 786b47d..7fefe4e 100644 --- a/chrome/browser/ui/layout_constants.cc +++ b/chrome/browser/ui/layout_constants.cc
@@ -121,18 +121,12 @@ case AVATAR_ICON: return gfx::Insets(0, kAvatarLeftPadding[mode], kAvatarBottomPadding[mode], kAvatarRightPadding[mode]); - case OMNIBOX_DROPDOWN: { - const int padding = kOmniboxDropdownPadding[mode]; - return gfx::Insets(padding, 0, padding, 0); - } - case OMNIBOX_DROPDOWN_ICON: { - const int padding = kOmniboxDropdownIconPadding[mode]; - return gfx::Insets(padding, 0, padding, 0); - } - case OMNIBOX_DROPDOWN_TEXT: { - const int padding = kOmniboxDropdownTextPadding[mode]; - return gfx::Insets(padding, 0, padding, 0); - } + case OMNIBOX_DROPDOWN: + return gfx::Insets(kOmniboxDropdownPadding[mode], 0); + case OMNIBOX_DROPDOWN_ICON: + return gfx::Insets(kOmniboxDropdownIconPadding[mode], 0); + case OMNIBOX_DROPDOWN_TEXT: + return gfx::Insets(kOmniboxDropdownTextPadding[mode], 0); case TAB: return gfx::Insets(kTabTopPadding[mode], kTabLeftPadding[mode], kTabBottomPadding[mode], kTabRightPadding[mode]); @@ -140,10 +134,8 @@ return gfx::Insets(kToolbarTopPadding[mode], kToolbarLeftPadding[mode], kToolbarBottomPadding[mode], kToolbarRightPadding[mode]); - case TOOLBAR_BUTTON: { - const int inset = kToolbarButtonPadding[mode]; - return gfx::Insets(inset, inset, inset, inset); - } + case TOOLBAR_BUTTON: + return gfx::Insets(kToolbarButtonPadding[mode]); } NOTREACHED(); return gfx::Insets();
diff --git a/chrome/browser/ui/views/accelerator_table.cc b/chrome/browser/ui/views/accelerator_table.cc index fc1e991ca..21f858d 100644 --- a/chrome/browser/ui/views/accelerator_table.cc +++ b/chrome/browser/ui/views/accelerator_table.cc
@@ -232,12 +232,9 @@ } bool GetAshAcceleratorForCommandId(int command_id, - HostDesktopType host_desktop_type, ui::Accelerator* accelerator) { #if defined(USE_ASH) - if (host_desktop_type != chrome::HOST_DESKTOP_TYPE_ASH) - return false; - for (size_t i = 0; i < kChromeCmdId2AshActionIdLength; ++i) { + for (size_t i = 0; i < kChromeCmdId2AshActionIdLength; ++i) { if (command_id == kChromeCmdId2AshActionId[i].chrome_cmd_id) { for (size_t j = 0; j < ash::kAcceleratorDataLength; ++j) { if (kChromeCmdId2AshActionId[i].ash_action_id ==
diff --git a/chrome/browser/ui/views/accelerator_table.h b/chrome/browser/ui/views/accelerator_table.h index f67a804..14bb0ad 100644 --- a/chrome/browser/ui/views/accelerator_table.h +++ b/chrome/browser/ui/views/accelerator_table.h
@@ -7,7 +7,6 @@ #include <vector> -#include "chrome/browser/ui/host_desktop.h" #include "chrome/browser/ui/views/chrome_views_export.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -28,13 +27,11 @@ // handled by Chrome but excluding accelerators handled by Ash. CHROME_VIEWS_EXPORT std::vector<AcceleratorMapping> GetAcceleratorList(); -// Returns true if the desktop host type indicates Ash and if the -// command id has an associated accelerator which is handled by -// Ash. If the return is true the accelerator is returned via the +// Returns true on Ash and if the command id has an associated accelerator which +// is handled by Ash. If the return is true the accelerator is returned via the // second argument. CHROME_VIEWS_EXPORT bool GetAshAcceleratorForCommandId( int command_id, - HostDesktopType host_desktop_type, ui::Accelerator* accelerator); // Returns true if the command id has an associated standard
diff --git a/chrome/browser/ui/views/accelerator_utils_aura.cc b/chrome/browser/ui/views/accelerator_utils_aura.cc index 3efed3672..99a9de1 100644 --- a/chrome/browser/ui/views/accelerator_utils_aura.cc +++ b/chrome/browser/ui/views/accelerator_utils_aura.cc
@@ -44,9 +44,7 @@ // find Ash accelerators if Ash is supported on this platform, even if it's // not currently in use. if (GetStandardAcceleratorForCommandId(command_id, &accelerator) || - GetAshAcceleratorForCommandId(command_id, - HOST_DESKTOP_TYPE_ASH, - &accelerator)) { + GetAshAcceleratorForCommandId(command_id, &accelerator)) { return accelerator; }
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc index bbc09a7..ccf443ce 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
@@ -83,13 +83,12 @@ // Install an easy resize window targeter, which ensures that the root window // (not the app) receives mouse events on the edges. aura::Window* window = widget()->GetNativeWindow(); - int resize_inside = frame->resize_inside_bounds_size(); - gfx::Insets inset(resize_inside, resize_inside, resize_inside, resize_inside); // Add the AppWindowEasyResizeWindowTargeter on the window, not its root // window. The root window does not have a delegate, which is needed to // handle the event in Linux. - window->SetEventTargeter(scoped_ptr<ui::EventTargeter>( - new AppWindowEasyResizeWindowTargeter(window, inset, this))); + window->SetEventTargeter( + scoped_ptr<ui::EventTargeter>(new AppWindowEasyResizeWindowTargeter( + window, gfx::Insets(frame->resize_inside_bounds_size()), this))); return frame; }
diff --git a/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc b/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc index 802b40c..79c08bf3 100644 --- a/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc +++ b/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc
@@ -129,7 +129,7 @@ // Install a window-targeter on the root window that allows a window to // receive events outside of its bounds. Verify that this window-targeter is // active unless the window has a custom shape. - gfx::Insets inset(-30, -30, -30, -30); + gfx::Insets inset(-30); root_window()->SetEventTargeter(scoped_ptr<ui::EventTargeter>( new wm::EasyResizeWindowTargeter(root_window(), inset, inset)));
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc index 10706a8..a0302ede 100644 --- a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
@@ -174,9 +174,8 @@ views::Border::CreateSolidBorder(1, kSubtleBorderColor)); description_view->AddChildView(card_type_icon); - // Midline horizontal ellipsis follwed by last four digits: description_view->AddChildView(new views::Label( - base::UTF8ToUTF16("\xE2\x8B\xAF") + card.LastFourDigits())); + base::string16(kMidlineEllipsis) + card.LastFourDigits())); description_view->AddChildView( new views::Label(card.AbbreviatedExpirationDateForDisplay()));
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index b772e9f..81028f96 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -658,8 +658,7 @@ } } // Else, we retrieve the accelerator information from Ash (if applicable). - return chrome::GetAshAcceleratorForCommandId( - cmd_id, browser_->host_desktop_type(), accelerator); + return chrome::GetAshAcceleratorForCommandId(cmd_id, accelerator); } bool BrowserView::IsAcceleratorRegistered(const ui::Accelerator& accelerator) {
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index 46469a6..5d51bca 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -191,7 +191,7 @@ views::Painter::CreateImageGridPainter(kOmniboxPopupBorderImages)); } else { ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); - const gfx::Insets omnibox_border_insets(14, 9, 14, 9); + const gfx::Insets omnibox_border_insets(14, 9); border_painter_.reset(views::Painter::CreateImagePainter( *rb.GetImageSkiaNamed(IDR_OMNIBOX_BORDER), omnibox_border_insets)); }
diff --git a/chrome/browser/ui/views/network_profile_bubble_view.cc b/chrome/browser/ui/views/network_profile_bubble_view.cc index 847b7486..69e0086 100644 --- a/chrome/browser/ui/views/network_profile_bubble_view.cc +++ b/chrome/browser/ui/views/network_profile_bubble_view.cc
@@ -63,8 +63,7 @@ navigator_(navigator), profile_(profile) { // Compensate for built-in vertical padding in the anchor view's image. - set_anchor_view_insets( - gfx::Insets(kAnchorVerticalInset, 0, kAnchorVerticalInset, 0)); + set_anchor_view_insets(gfx::Insets(kAnchorVerticalInset, 0)); } ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/panels/panel_frame_view.cc b/chrome/browser/ui/views/panels/panel_frame_view.cc index 09be1e00..0960003 100644 --- a/chrome/browser/ui/views/panels/panel_frame_view.cc +++ b/chrome/browser/ui/views/panels/panel_frame_view.cc
@@ -322,8 +322,7 @@ PanelView::kResizeInsideBoundsSize - BorderThickness(); aura::Window* window = panel_view_->GetNativePanelWindow(); window->set_hit_test_bounds_override_inner( - gfx::Insets(thickness_for_mouse_resizing, thickness_for_mouse_resizing, - thickness_for_mouse_resizing, thickness_for_mouse_resizing)); + gfx::Insets(thickness_for_mouse_resizing)); #endif }
diff --git a/chrome/browser/ui/views/panels/panel_view.cc b/chrome/browser/ui/views/panels/panel_view.cc index 42c71b4..5f93d5f8c 100644 --- a/chrome/browser/ui/views/panels/panel_view.cc +++ b/chrome/browser/ui/views/panels/panel_view.cc
@@ -304,7 +304,8 @@ #if !defined(USE_ASH) // Prevent the browser process from shutting down while this window is open. // Chrome OS already has a mechanism to always stay alive and skips this. - keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::PANEL_VIEW)); + keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::PANEL_VIEW, + KeepAliveRestartOption::DISABLED)); #endif // !defined(USE_ASH) web_view_ = new views::WebView(NULL);
diff --git a/chrome/browser/ui/views/profiles/user_manager_view.cc b/chrome/browser/ui/views/profiles/user_manager_view.cc index 3da9dae..038521f 100644 --- a/chrome/browser/ui/views/profiles/user_manager_view.cc +++ b/chrome/browser/ui/views/profiles/user_manager_view.cc
@@ -236,7 +236,8 @@ : web_view_(NULL), user_manager_started_showing_(base::Time()) { #if !defined(USE_ASH) - keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::USER_MANAGER_VIEW)); + keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::USER_MANAGER_VIEW, + KeepAliveRestartOption::DISABLED)); #endif // !defined(USE_ASH) }
diff --git a/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc b/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc index df2cf75..ae30b7c 100644 --- a/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc +++ b/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc
@@ -117,8 +117,8 @@ set_anchor_view_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0)); set_close_on_deactivate(false); } - int margin = is_sync_dialog_ ? kDialogMargin : views::kButtonVEdgeMarginNew; - set_margins(gfx::Insets(margin, margin, margin, margin)); + set_margins(gfx::Insets(is_sync_dialog_ ? kDialogMargin + : views::kButtonVEdgeMarginNew)); } OneClickSigninBubbleView::~OneClickSigninBubbleView() {
diff --git a/chrome/browser/ui/views/website_settings/website_settings_popup_view_unittest.cc b/chrome/browser/ui/views/website_settings/website_settings_popup_view_unittest.cc index 716c001..92bee18 100644 --- a/chrome/browser/ui/views/website_settings/website_settings_popup_view_unittest.cc +++ b/chrome/browser/ui/views/website_settings/website_settings_popup_view_unittest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h" #include "base/macros.h" +#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" #include "chrome/browser/ui/views/website_settings/chosen_object_view.h" #include "chrome/browser/ui/views/website_settings/permission_selector_view.h" #include "chrome/browser/usb/usb_chooser_context.h" @@ -164,11 +165,13 @@ list.back().source = content_settings::SETTING_SOURCE_USER; list.back().is_incognito = false; - EXPECT_EQ(0, api_->permissions_content()->child_count()); + const int kExpectedChildren = + ExclusiveAccessManager::IsSimplifiedFullscreenUIEnabled() ? 10 : 12; + EXPECT_EQ(kExpectedChildren, api_->permissions_content()->child_count()); list.back().setting = CONTENT_SETTING_ALLOW; api_->SetPermissionInfo(list); - EXPECT_EQ(1, api_->permissions_content()->child_count()); + EXPECT_EQ(kExpectedChildren, api_->permissions_content()->child_count()); PermissionSelectorView* selector = api_->GetPermissionSelectorAt(0); EXPECT_EQ(3, selector->child_count()); @@ -193,26 +196,28 @@ // WebsiteSettings to update the pref. list.back().setting = CONTENT_SETTING_ALLOW; api_->GetPermissionSelectorAt(0)->PermissionChanged(list.back()); - EXPECT_EQ(1, api_->permissions_content()->child_count()); + EXPECT_EQ(kExpectedChildren, api_->permissions_content()->child_count()); EXPECT_EQ(base::ASCIIToUTF16("Allowed by you"), api_->GetPermissionButtonAt(0)->GetText()); // Setting to the default via the UI should keep the button around. list.back().setting = CONTENT_SETTING_ASK; api_->GetPermissionSelectorAt(0)->PermissionChanged(list.back()); - EXPECT_EQ(1, api_->permissions_content()->child_count()); + EXPECT_EQ(kExpectedChildren, api_->permissions_content()->child_count()); EXPECT_EQ(base::ASCIIToUTF16("Ask by you"), api_->GetPermissionButtonAt(0)->GetText()); // However, since the setting is now default, recreating the dialog with those // settings should omit the permission from the UI. api_->SetPermissionInfo(list); - EXPECT_EQ(0, api_->permissions_content()->child_count()); + EXPECT_EQ(kExpectedChildren, api_->permissions_content()->child_count()); } // Test UI construction and reconstruction with USB devices. TEST_F(WebsiteSettingsPopupViewTest, SetPermissionInfoWithUsbDevice) { - EXPECT_EQ(0, api_->permissions_content()->child_count()); + const int kExpectedChildren = + ExclusiveAccessManager::IsSimplifiedFullscreenUIEnabled() ? 10 : 12; + EXPECT_EQ(kExpectedChildren, api_->permissions_content()->child_count()); const GURL origin = GURL(kUrl).GetOrigin(); scoped_refptr<device::UsbDevice> device = @@ -224,10 +229,10 @@ PermissionInfoList list; api_->SetPermissionInfo(list); - EXPECT_EQ(1, api_->permissions_content()->child_count()); + EXPECT_EQ(kExpectedChildren + 1, api_->permissions_content()->child_count()); - ChosenObjectView* object_view = - static_cast<ChosenObjectView*>(api_->permissions_content()->child_at(0)); + ChosenObjectView* object_view = static_cast<ChosenObjectView*>( + api_->permissions_content()->child_at(kExpectedChildren)); EXPECT_EQ(3, object_view->child_count()); const int kLabelIndex = 1; @@ -245,7 +250,7 @@ static_cast<views::ButtonListener*>(object_view); button_listener->ButtonPressed(button, event); api_->SetPermissionInfo(list); - EXPECT_EQ(0, api_->permissions_content()->child_count()); + EXPECT_EQ(kExpectedChildren, api_->permissions_content()->child_count()); EXPECT_FALSE(store->HasDevicePermission( origin, origin, *device::usb::DeviceInfo::From(*device))); }
diff --git a/chrome/browser/ui/website_settings/website_settings.cc b/chrome/browser/ui/website_settings/website_settings.cc index 755a01d0..9996abb 100644 --- a/chrome/browser/ui/website_settings/website_settings.cc +++ b/chrome/browser/ui/website_settings/website_settings.cc
@@ -698,13 +698,14 @@ NULL); } - if ((permission_info.setting != CONTENT_SETTING_DEFAULT && - permission_info.setting != permission_info.default_setting) || - (permission_info.type == CONTENT_SETTINGS_TYPE_KEYGEN && - tab_specific_content_settings()->IsContentBlocked( - permission_info.type))) { - permission_info_list.push_back(permission_info); + if (permission_info.type == CONTENT_SETTINGS_TYPE_KEYGEN && + (permission_info.setting == CONTENT_SETTING_DEFAULT || + permission_info.setting == permission_info.default_setting) && + !tab_specific_content_settings()->IsContentBlocked( + permission_info.type)) { + continue; } + permission_info_list.push_back(permission_info); } for (const ChooserUIInfo& ui_info : kChooserUIInfo) {
diff --git a/chrome/browser/ui/webui/app_launcher_login_handler.cc b/chrome/browser/ui/webui/app_launcher_login_handler.cc index b9c22dd..bd0afdd 100644 --- a/chrome/browser/ui/webui/app_launcher_login_handler.cc +++ b/chrome/browser/ui/webui/app_launcher_login_handler.cc
@@ -27,7 +27,6 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/chrome_pages.h" -#include "chrome/browser/ui/webui/ntp/new_tab_ui.h" #include "chrome/browser/ui/webui/profile_info_watcher.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" @@ -153,10 +152,6 @@ const base::ListValue* args) { Profile::FromWebUI(web_ui())->GetPrefs()->SetBoolean( prefs::kSignInPromoShowNTPBubble, false); - NewTabUI* ntp_ui = NewTabUI::FromWebUIController(web_ui()->GetController()); - // When instant extended is enabled, there may not be a NewTabUI object. - if (ntp_ui) - ntp_ui->set_showing_sync_bubble(true); } void AppLauncherLoginHandler::HandleShowAdvancedLoginUI(
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index e1558da..6e05725 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -29,7 +29,6 @@ #include "chrome/browser/browser_shutdown.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" -#include "chrome/browser/chromeos/feedback_util.h" #include "chrome/browser/chromeos/input_method/input_method_util.h" #include "chrome/browser/chromeos/login/error_screens_histogram_helper.h" #include "chrome/browser/chromeos/login/hwid_checker.h" @@ -40,6 +39,7 @@ #include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/login/ui/login_display_host.h" #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" +#include "chrome/browser/chromeos/login/ui/login_feedback.h" #include "chrome/browser/chromeos/login/ui/webui_login_display.h" #include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h" #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h" @@ -451,12 +451,14 @@ builder->Add("insecureURLEnrollmentError", IDS_ENTERPRISE_ENROLLMENT_AUTH_INSECURE_URL_ERROR); + builder->Add("unrecoverableCryptohomeErrorMessageTitle", + IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_TITLE); builder->Add("unrecoverableCryptohomeErrorMessage", IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_MESSAGE); builder->Add("unrecoverableCryptohomeErrorContinue", IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_CONTINUE); - builder->Add("unrecoverableCryptohomeErrorSendFeedback", - IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_SEND_FEEDBACK); + builder->Add("unrecoverableCryptohomeErrorRecreatingProfile", + IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_WAIT_MESSAGE); } void SigninScreenHandler::RegisterMessages() { @@ -1314,10 +1316,11 @@ "Auto generated feedback for http://crbug.com/547857.\n" "(uniquifier:%s)", base::Int64ToString(base::Time::Now().ToInternalValue()).c_str()); - feedback_util::SendSysLogFeedback( - Profile::FromWebUI(web_ui()), description, - base::Bind(&SigninScreenHandler::OnSysLogFeedbackSent, - weak_factory_.GetWeakPtr())); + + login_feedback_.reset(new LoginFeedback(Profile::FromWebUI(web_ui()))); + login_feedback_->Request(description, + base::Bind(&SigninScreenHandler::OnFeedbackFinished, + weak_factory_.GetWeakPtr())); } bool SigninScreenHandler::AllWhitelistedUsersPresent() { @@ -1407,8 +1410,9 @@ CallJS("login.AccountPickerScreen.setCapsLockState", caps_lock_enabled_); } -void SigninScreenHandler::OnSysLogFeedbackSent(bool sent) { - LOG_IF(ERROR, !sent) << "Failed to send syslog feedback."; +void SigninScreenHandler::OnFeedbackFinished() { + CallJS("login.UnrecoverableCryptohomeErrorScreen.resumeAfterFeedbackUI"); + // Recreate user's cryptohome after the feedkback is attempted. HandleResyncUserData(); }
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h index dab27aa..41d4ac20 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -49,6 +49,7 @@ class CoreOobeActor; class ErrorScreensHistogramHelper; class GaiaScreenHandler; +class LoginFeedback; class NativeWindowDelegate; class SupervisedUserCreationScreenHandler; class User; @@ -412,8 +413,8 @@ // Returns OobeUI object of NULL. OobeUI* GetOobeUI() const; - // Callback invoked after the syslog feedback is sent. - void OnSysLogFeedbackSent(bool sent); + // Callback invoked after the feedback is finished. + void OnFeedbackFinished(); // Current UI state of the signin screen. UIState ui_state_ = UI_STATE_UNKNOWN; @@ -482,6 +483,8 @@ scoped_ptr<ErrorScreensHistogramHelper> histogram_helper_; + scoped_ptr<LoginFeedback> login_feedback_; + base::WeakPtrFactory<SigninScreenHandler> weak_factory_; DISALLOW_COPY_AND_ASSIGN(SigninScreenHandler);
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc index dbdaa9c..a76bdac 100644 --- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc +++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
@@ -47,6 +47,7 @@ const char kCloseRoute[] = "closeRoute"; const char kJoinRoute[] = "joinRoute"; const char kCloseDialog[] = "closeDialog"; +const char kReportBlur[] = "reportBlur"; const char kReportClickedSinkIndex[] = "reportClickedSinkIndex"; const char kReportInitialAction[] = "reportInitialAction"; const char kReportInitialState[] = "reportInitialState"; @@ -325,6 +326,10 @@ base::Bind(&MediaRouterWebUIMessageHandler::OnCloseDialog, base::Unretained(this))); web_ui()->RegisterMessageCallback( + kReportBlur, + base::Bind(&MediaRouterWebUIMessageHandler::OnReportBlur, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( kReportClickedSinkIndex, base::Bind(&MediaRouterWebUIMessageHandler::OnReportClickedSinkIndex, base::Unretained(this))); @@ -557,10 +562,27 @@ if (dialog_closing_) return; + bool used_esc_to_close_dialog = false; + if (!args->GetBoolean(0, &used_esc_to_close_dialog)) { + DVLOG(1) << "Unable to extract args."; + return; + } + + if (used_esc_to_close_dialog) { + base::RecordAction(base::UserMetricsAction( + "MediaRouter_Ui_Dialog_ESCToClose")); + } + dialog_closing_ = true; media_router_ui_->Close(); } +void MediaRouterWebUIMessageHandler::OnReportBlur( + const base::ListValue* args) { + DVLOG(1) << "OnReportBlur"; + base::RecordAction(base::UserMetricsAction("MediaRouter_Ui_Dialog_Blur")); +} + void MediaRouterWebUIMessageHandler::OnReportClickedSinkIndex( const base::ListValue* args) { DVLOG(1) << "OnReportClickedSinkIndex";
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h index 92313fb..20c84ed6 100644 --- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h +++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h
@@ -68,6 +68,7 @@ void OnCloseRoute(const base::ListValue* args); void OnJoinRoute(const base::ListValue* args); void OnCloseDialog(const base::ListValue* args); + void OnReportBlur(const base::ListValue* args); void OnReportClickedSinkIndex(const base::ListValue* args); void OnReportInitialAction(const base::ListValue* args); void OnReportInitialState(const base::ListValue* args);
diff --git a/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.cc b/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.cc deleted file mode 100644 index 7c80144..0000000 --- a/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.cc +++ /dev/null
@@ -1,206 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.h" - -#include <vector> - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/strings/string_split.h" -#include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" -#include "base/values.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/signin_manager_factory.h" -#include "chrome/browser/signin/signin_promo.h" -#include "chrome/browser/sync/profile_sync_service_factory.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_finder.h" -#include "chrome/browser/ui/chrome_pages.h" -#include "chrome/browser/ui/webui/signin/login_ui_service.h" -#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" -#include "chrome/common/pref_names.h" -#include "chrome/grit/generated_resources.h" -#include "components/browser_sync/browser/profile_sync_service.h" -#include "components/prefs/pref_service.h" -#include "components/signin/core/browser/signin_manager.h" -#include "components/signin/core/common/signin_pref_names.h" -#include "content/public/browser/render_view_host.h" -#include "content/public/browser/web_ui.h" -#include "net/cookies/cookie_monster.h" -#include "net/url_request/url_request_context.h" -#include "ui/base/l10n/l10n_util.h" - -NewTabPageSyncHandler::NewTabPageSyncHandler() : sync_service_(NULL), - waiting_for_initial_page_load_(true) { -} - -NewTabPageSyncHandler::~NewTabPageSyncHandler() { - if (sync_service_) - sync_service_->RemoveObserver(this); -} - -// static -NewTabPageSyncHandler::MessageType - NewTabPageSyncHandler::FromSyncStatusMessageType( - sync_ui_util::MessageType type) { - switch (type) { - case sync_ui_util::SYNC_ERROR: - return SYNC_ERROR; - case sync_ui_util::SYNC_PROMO: - return SYNC_PROMO; - case sync_ui_util::PRE_SYNCED: - case sync_ui_util::SYNCED: - default: - return HIDE; - } -} - -void NewTabPageSyncHandler::RegisterMessages() { - sync_service_ = ProfileSyncServiceFactory::GetInstance()->GetForProfile( - Profile::FromWebUI(web_ui())); - if (sync_service_) - sync_service_->AddObserver(this); - profile_pref_registrar_.Init(Profile::FromWebUI(web_ui())->GetPrefs()); - profile_pref_registrar_.Add( - prefs::kSigninAllowed, - base::Bind(&NewTabPageSyncHandler::OnSigninAllowedPrefChange, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback("GetSyncMessage", - base::Bind(&NewTabPageSyncHandler::HandleGetSyncMessage, - base::Unretained(this))); - web_ui()->RegisterMessageCallback("SyncLinkClicked", - base::Bind(&NewTabPageSyncHandler::HandleSyncLinkClicked, - base::Unretained(this))); -} - -void NewTabPageSyncHandler::HandleGetSyncMessage(const base::ListValue* args) { - waiting_for_initial_page_load_ = false; - BuildAndSendSyncStatus(); -} - -void NewTabPageSyncHandler::HideSyncStatusSection() { - SendSyncMessageToPage(HIDE, std::string(), std::string()); -} - -void NewTabPageSyncHandler::BuildAndSendSyncStatus() { - DCHECK(!waiting_for_initial_page_load_); - SigninManagerBase* signin = SigninManagerFactory::GetForProfile( - Profile::FromWebUI(web_ui())); - - // Hide the sync status section if sync is managed or disabled entirely. - if (!sync_service_ || - sync_service_->IsManaged() || - !signin || - !signin->IsSigninAllowed()) { - HideSyncStatusSection(); - return; - } - - // Don't show sync status if setup is not complete. - if (!sync_service_->IsFirstSetupComplete()) { - return; - } - - // Once sync has been enabled, the supported "sync statuses" for the NNTP - // from the user's perspective are: - // - // "Sync error", when we can't authenticate or establish a connection with - // the sync server (appropriate information appended to - // message). - base::string16 status_msg; - base::string16 link_text; - - sync_ui_util::MessageType type = sync_ui_util::GetStatusLabelsForNewTabPage( - Profile::FromWebUI(web_ui()), sync_service_, *signin, &status_msg, - &link_text); - SendSyncMessageToPage(FromSyncStatusMessageType(type), - base::UTF16ToUTF8(status_msg), - base::UTF16ToUTF8(link_text)); -} - -void NewTabPageSyncHandler::HandleSyncLinkClicked(const base::ListValue* args) { - DCHECK(!waiting_for_initial_page_load_); - if (!sync_service_ || !sync_service_->IsSyncAllowedByFlag()) - return; - Browser* browser = - chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()); - if (!browser || browser->IsAttemptingToCloseBrowser()) - return; - chrome::ShowBrowserSignin(browser, - signin_metrics::AccessPoint::ACCESS_POINT_NTP_LINK); - - if (sync_service_->IsFirstSetupComplete()) { - base::string16 user = base::UTF8ToUTF16( - SigninManagerFactory::GetForProfile(Profile::FromWebUI(web_ui())) - ->GetAuthenticatedAccountInfo() - .email); - base::DictionaryValue value; - value.SetString("syncEnabledMessage", - l10n_util::GetStringFUTF16(IDS_SYNC_NTP_SYNCED_TO, - user)); - web_ui()->CallJavascriptFunction("ntp.syncAlreadyEnabled", value); - } else { - ProfileSyncService::SyncEvent(ProfileSyncService::START_FROM_NTP); - } -} - -void NewTabPageSyncHandler::OnStateChanged() { - // Don't do anything if the page has not yet loaded. - if (waiting_for_initial_page_load_) - return; - BuildAndSendSyncStatus(); -} - -void NewTabPageSyncHandler::OnSigninAllowedPrefChange() { - // Don't do anything if the page has not yet loaded. - if (waiting_for_initial_page_load_) - return; - BuildAndSendSyncStatus(); -} - -void NewTabPageSyncHandler::SendSyncMessageToPage(MessageType type, - const std::string& msg, - const std::string& linktext) { - base::DictionaryValue value; - std::string user; - std::string title; - std::string linkurl; - - // If there is nothing to show, we should hide the sync section altogether. - if (type == HIDE || (msg.empty() && linktext.empty())) { - value.SetBoolean("syncsectionisvisible", false); - } else { - if (type == SYNC_ERROR) - title = l10n_util::GetStringUTF8(IDS_SYNC_NTP_SYNC_SECTION_ERROR_TITLE); - else if (type == SYNC_PROMO) - title = l10n_util::GetStringUTF8(IDS_SYNC_NTP_SYNC_SECTION_PROMO_TITLE); - else - NOTREACHED(); - - value.SetBoolean("syncsectionisvisible", true); - value.SetString("msg", msg); - value.SetString("title", title); - if (linktext.empty()) { - value.SetBoolean("linkisvisible", false); - } else { - value.SetBoolean("linkisvisible", true); - value.SetString("linktext", linktext); - - // The only time we set the URL is when the user is synced and we need to - // show a link to a web interface (e.g. http://docs.google.com). When we - // set that URL, HandleSyncLinkClicked won't be called when the user - // clicks on the link. - if (linkurl.empty()) { - value.SetBoolean("linkurlisset", false); - } else { - value.SetBoolean("linkurlisset", true); - value.SetString("linkurl", linkurl); - } - } - } - web_ui()->CallJavascriptFunction("ntp.syncMessageChanged", value); -}
diff --git a/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.h b/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.h deleted file mode 100644 index fd2af9a..0000000 --- a/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.h +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_PAGE_SYNC_HANDLER_H_ -#define CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_PAGE_SYNC_HANDLER_H_ - -#include <string> - -#include "base/gtest_prod_util.h" -#include "base/macros.h" -#include "chrome/browser/sync/sync_ui_util.h" -#include "components/browser_sync/browser/profile_sync_service.h" -#include "components/prefs/pref_change_registrar.h" -#include "content/public/browser/web_ui_message_handler.h" - -namespace base { -class ListValue; -} - -// Sends sync-state changes to the New Tab Page for UI updating and forwards -// link clicks on the page to the sync service. -class NewTabPageSyncHandler : public content::WebUIMessageHandler, - public sync_driver::SyncServiceObserver { - public: - NewTabPageSyncHandler(); - ~NewTabPageSyncHandler() override; - - // WebUIMessageHandler implementation. - void RegisterMessages() override; - - // Callback for "GetSyncMessage". - void HandleGetSyncMessage(const base::ListValue* args); - // Callback for "SyncLinkClicked". - void HandleSyncLinkClicked(const base::ListValue* args); - - // sync_driver::SyncServiceObserver - void OnStateChanged() override; - - void OnSigninAllowedPrefChange(); - - private: - friend class MockNewTabPageSyncHandler; - FRIEND_TEST_ALL_PREFIXES(NewTabPageSyncHandlerBrowserTest, - ChangeSigninAllowedToFalse); - - enum MessageType { - HIDE, - SYNC_ERROR, - SYNC_PROMO - }; - // Helper to invoke the |syncMessageChanged| JS function on the new tab page. - virtual void SendSyncMessageToPage(MessageType type, - const std::string& msg, - const std::string& linktext); - - // Helper to query the sync service and figure out what to send to - // the page, and send it via SendSyncMessageToPage. - // NOTE: precondition: sync must be enabled. - void BuildAndSendSyncStatus(); - - // Helper to send a message to the NNTP which hides the sync section. - void HideSyncStatusSection(); - - // Helper to convert from a sync status message type to an NTP specific one. - static MessageType FromSyncStatusMessageType( - sync_ui_util::MessageType type); - - // Cached pointer to ProfileSyncService. - ProfileSyncService* sync_service_; - - PrefChangeRegistrar profile_pref_registrar_; - - // Used to make sure we don't register ourselves twice if the user refreshes - // the new tab page. - bool waiting_for_initial_page_load_; - - DISALLOW_COPY_AND_ASSIGN(NewTabPageSyncHandler); -}; - -#endif // CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_PAGE_SYNC_HANDLER_H_
diff --git a/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler_browsertest.cc b/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler_browsertest.cc deleted file mode 100644 index 3f63899..0000000 --- a/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler_browsertest.cc +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.h" - -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/pref_names.h" -#include "chrome/common/url_constants.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/signin/core/common/signin_pref_names.h" -#include "content/public/browser/web_contents.h" -#include "content/public/browser/web_ui.h" -#include "content/public/test/browser_test_utils.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "url/gurl.h" - -using ::testing::_; - -typedef InProcessBrowserTest NewTabPageSyncHandlerBrowserTest; - -class MockNewTabPageSyncHandler : public NewTabPageSyncHandler { - public: - MOCK_METHOD3(SendSyncMessageToPage, - void(MessageType type, - const std::string& msg, - const std::string& linktext)); - - void SetWaitingForInitialPageLoad(bool waiting) { - waiting_for_initial_page_load_ = waiting; - } -}; - -// TODO(samarth): Delete along with the rest of the NTP4 code. -IN_PROC_BROWSER_TEST_F(NewTabPageSyncHandlerBrowserTest, - DISABLED_ChangeSigninAllowedToFalse) { - ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL)); - content::WebUI* web_ui = - browser()->tab_strip_model()->GetActiveWebContents()->GetWebUI(); - MockNewTabPageSyncHandler* mock_handler = new MockNewTabPageSyncHandler(); - mock_handler->SetWaitingForInitialPageLoad(false); - web_ui->AddMessageHandler(mock_handler); - EXPECT_CALL(*mock_handler, SendSyncMessageToPage(mock_handler->HIDE, _, _)); - browser()->profile()->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false); -}
diff --git a/chrome/browser/ui/webui/ntp/new_tab_ui.cc b/chrome/browser/ui/webui/ntp/new_tab_ui.cc index cb1bdfc..d3ef1383 100644 --- a/chrome/browser/ui/webui/ntp/new_tab_ui.cc +++ b/chrome/browser/ui/webui/ntp/new_tab_ui.cc
@@ -8,36 +8,28 @@ #include "base/i18n/rtl.h" #include "base/lazy_instance.h" +#include "base/memory/ref_counted_memory.h" #include "base/memory/scoped_ptr.h" -#include "base/metrics/histogram.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/chrome_notification_types.h" +#include "base/values.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/metrics_handler.h" #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" #include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h" #include "chrome/browser/ui/webui/ntp/favicon_webui_handler.h" -#include "chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.h" #include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h" #include "chrome/browser/ui/webui/ntp/ntp_resource_cache_factory.h" -#include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h" #include "chrome/common/url_constants.h" -#include "chrome/grit/generated_resources.h" #include "components/bookmarks/common/bookmark_pref_names.h" -#include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/notification_service.h" #include "content/public/browser/render_process_host.h" -#include "content/public/browser/render_view_host.h" -#include "content/public/browser/url_data_source.h" -#include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "extensions/browser/extension_system.h" -#include "grit/browser_resources.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" +#include "url/gurl.h" #if defined(ENABLE_THEMES) #include "chrome/browser/ui/webui/theme_handler.h" @@ -48,15 +40,10 @@ #endif using content::BrowserThread; -using content::RenderViewHost; using content::WebUIController; namespace { -// The amount of time there must be no painting for us to consider painting -// finished. Observed times are in the ~1200ms range on Windows. -const int kTimeoutMs = 2000; - // Strings sent to the page via jstemplates used to set the direction of the // HTML document based on locale. const char kRTLHtmlTextDirection[] = "rtl"; @@ -77,23 +64,15 @@ // NewTabUI NewTabUI::NewTabUI(content::WebUI* web_ui) - : WebUIController(web_ui), - WebContentsObserver(web_ui->GetWebContents()), - showing_sync_bubble_(false) { + : WebUIController(web_ui) { g_live_new_tabs.Pointer()->insert(this); web_ui->OverrideTitle(l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE)); - // We count all link clicks as AUTO_BOOKMARK, so that site can be ranked more - // highly. Note this means we're including clicks on not only most visited - // thumbnails, but also clicks on recently bookmarked. - web_ui->SetLinkTransitionType(ui::PAGE_TRANSITION_AUTO_BOOKMARK); - Profile* profile = GetProfile(); if (!profile->IsOffTheRecord()) { web_ui->AddMessageHandler(new MetricsHandler()); web_ui->AddMessageHandler(new FaviconWebUIHandler()); web_ui->AddMessageHandler(new CoreAppLauncherHandler()); - web_ui->AddMessageHandler(new NewTabPageSyncHandler()); ExtensionService* service = extensions::ExtensionSystem::Get(profile)->extension_service(); @@ -104,9 +83,6 @@ } #if defined(ENABLE_THEMES) - // The theme handler can require some CPU, so do it after hooking up the most - // visited handler. This allows the DB query for the new tab thumbs to happen - // earlier. if (!profile->IsGuestSession()) web_ui->AddMessageHandler(new ThemeHandler()); #endif @@ -127,74 +103,6 @@ g_live_new_tabs.Pointer()->erase(this); } -// The timer callback. If enough time has elapsed since the last paint -// message, we say we're done painting; otherwise, we keep waiting. -void NewTabUI::PaintTimeout() { - // The amount of time there must be no painting for us to consider painting - // finished. Observed times are in the ~1200ms range on Windows. - base::TimeTicks now = base::TimeTicks::Now(); - if ((now - last_paint_) >= base::TimeDelta::FromMilliseconds(kTimeoutMs)) { - // Painting has quieted down. Log this as the full time to run. - base::TimeDelta load_time = last_paint_ - start_; - UMA_HISTOGRAM_TIMES("NewTabUI load", load_time); - } else { - // Not enough quiet time has elapsed. - // Some more paints must've occurred since we set the timeout. - // Wait some more. - timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeoutMs), this, - &NewTabUI::PaintTimeout); - } -} - -void NewTabUI::StartTimingPaint(RenderViewHost* render_view_host) { - start_ = base::TimeTicks::Now(); - last_paint_ = start_; - - content::NotificationSource source = - content::Source<content::RenderWidgetHost>(render_view_host->GetWidget()); - if (!registrar_.IsRegistered(this, - content::NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, - source)) { - registrar_.Add( - this, - content::NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, - source); - } - - timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeoutMs), this, - &NewTabUI::PaintTimeout); -} - -void NewTabUI::RenderViewCreated(RenderViewHost* render_view_host) { - StartTimingPaint(render_view_host); -} - -void NewTabUI::RenderViewReused(RenderViewHost* render_view_host) { - StartTimingPaint(render_view_host); -} - -void NewTabUI::WasHidden() { - EmitNtpStatistics(); -} - -void NewTabUI::Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - switch (type) { - case content::NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE: { - last_paint_ = base::TimeTicks::Now(); - break; - } - default: - CHECK(false) << "Unexpected notification: " << type; - } -} - -void NewTabUI::EmitNtpStatistics() { - NTPUserDataLogger::GetOrCreateFromWebContents( - web_contents())->EmitNtpStatistics(); -} - void NewTabUI::OnShowBookmarkBarChanged() { base::StringValue attached( GetProfile()->GetPrefs()->GetBoolean(bookmarks::prefs::kShowBookmarkBar) ?
diff --git a/chrome/browser/ui/webui/ntp/new_tab_ui.h b/chrome/browser/ui/webui/ntp/new_tab_ui.h index d0b8dfc..99fd0ee 100644 --- a/chrome/browser/ui/webui/ntp/new_tab_ui.h +++ b/chrome/browser/ui/webui/ntp/new_tab_ui.h
@@ -5,17 +5,13 @@ #ifndef CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_UI_H_ #define CHROME_BROWSER_UI_WEBUI_NTP_NEW_TAB_UI_H_ +#include <map> #include <string> #include "base/macros.h" -#include "base/time/time.h" -#include "base/timer/timer.h" +#include "base/strings/string16.h" #include "components/prefs/pref_change_registrar.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" #include "content/public/browser/url_data_source.h" -#include "content/public/browser/web_contents.h" -#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_ui_controller.h" class GURL; @@ -29,10 +25,8 @@ class PrefRegistrySyncable; } -// The WebUIController used for the New Tab page. -class NewTabUI : public content::WebUIController, - public content::WebContentsObserver, - public content::NotificationObserver { +// The WebUIController used for the incognito and guest mode New Tab page. +class NewTabUI : public content::WebUIController { public: explicit NewTabUI(content::WebUI* web_ui); ~NewTabUI() override; @@ -58,19 +52,7 @@ // page. static NewTabUI* FromWebUIController(content::WebUIController* ui); - // The current preference version. - static int current_pref_version() { return current_pref_version_; } - - // WebUIController implementation: - void RenderViewCreated(content::RenderViewHost* render_view_host) override; - void RenderViewReused(content::RenderViewHost* render_view_host) override; - - // WebContentsObserver implementation: - void WasHidden() override; - - bool showing_sync_bubble() { return showing_sync_bubble_; } - void set_showing_sync_bubble(bool showing) { showing_sync_bubble_ = showing; } - + private: class NewTabHTMLSource : public content::URLDataSource { public: explicit NewTabHTMLSource(Profile* profile); @@ -104,38 +86,10 @@ DISALLOW_COPY_AND_ASSIGN(NewTabHTMLSource); }; - private: - // content::NotificationObserver implementation. - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; - - // If |web_contents| has an NTP URL, emits a number of NTP statistics (like - // mouseovers counts) associated with |web_contents|, to be logged in UMA - // histograms. - void EmitNtpStatistics(); - void OnShowBookmarkBarChanged(); - void StartTimingPaint(content::RenderViewHost* render_view_host); - void PaintTimeout(); - Profile* GetProfile() const; - content::NotificationRegistrar registrar_; - - // The time when we started benchmarking. - base::TimeTicks start_; - // The last time we got a paint notification. - base::TimeTicks last_paint_; - // Scoping so we can be sure our timeouts don't outlive us. - base::OneShotTimer timer_; - // The preference version. This used for migrating prefs of the NTP. - static const int current_pref_version_ = 3; - - // If the sync promo NTP bubble is being shown. - bool showing_sync_bubble_; - PrefChangeRegistrar pref_change_registrar_; DISALLOW_COPY_AND_ASSIGN(NewTabUI);
diff --git a/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc b/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc index 37be5577..8ffe5a7 100644 --- a/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc +++ b/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc
@@ -53,28 +53,6 @@ } }; -// TODO(samarth): delete along with rest of NTP4 code. -// Loads chrome://hang/ into two NTP tabs, ensuring we don't crash. -// See http://crbug.com/59859. -// If this flakes, use http://crbug.com/87200. -IN_PROC_BROWSER_TEST_F(NewTabUIBrowserTest, DISABLED_ChromeHangInNTP) { - // Bring up a new tab page. - ui_test_utils::NavigateToURLWithDisposition( - browser(), GURL(chrome::kChromeUINewTabURL), NEW_FOREGROUND_TAB, - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); - - // Navigate to chrome://hang/ to stall the process. - ui_test_utils::NavigateToURLWithDisposition( - browser(), GURL(content::kChromeUIHangURL), CURRENT_TAB, 0); - - // Visit chrome://hang/ again in another NTP. Don't bother waiting for the - // NTP to load, because it's hung. - chrome::NewTab(browser()); - browser()->OpenURL(OpenURLParams( - GURL(content::kChromeUIHangURL), Referrer(), CURRENT_TAB, - ui::PAGE_TRANSITION_TYPED, false)); -} - // Navigate to incognito NTP. Fails if there are console errors. IN_PROC_BROWSER_TEST_F(NewTabUIBrowserTest, ShowIncognito) { ui_test_utils::NavigateToURL(CreateIncognitoBrowser(),
diff --git a/chrome/browser/ui/webui/ntp/ntp_stats.h b/chrome/browser/ui/webui/ntp/ntp_stats.h deleted file mode 100644 index 44fb441..0000000 --- a/chrome/browser/ui/webui/ntp/ntp_stats.h +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_NTP_NTP_STATS_H_ -#define CHROME_BROWSER_UI_WEBUI_NTP_NTP_STATS_H_ - -// This enum is also defined in histograms.xml. These values represent the -// action that the user has taken to leave the NTP. This is shared between the -// Suggested pane and the Most Visited pane. This is also defined in new_tab.js. -enum NtpFollowAction { - // Values 0 to 10 are the core values from PageTransition (see - // page_transition_types.h). - - // The user has clicked on a tile. - NTP_FOLLOW_ACTION_CLICKED_TILE = 11, - // The user has moved to another pane within the NTP. - NTP_FOLLOW_ACTION_CLICKED_OTHER_NTP_PANE, - // Any action other than what is listed here (e.g. closing the tab, etc.). - NTP_FOLLOW_ACTION_OTHER, - // The number of suggested sites actions that we log. - NUM_NTP_FOLLOW_ACTIONS -}; - -#endif // CHROME_BROWSER_UI_WEBUI_NTP_NTP_STATS_H_
diff --git a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc index 2955df6e2..c549f253 100644 --- a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
@@ -135,8 +135,9 @@ default_user_image::GetDefaultImageDescription(i)); image_urls.Append(image_data.release()); } - web_ui()->CallJavascriptFunction( - "settings.ChangePicturePage.receiveDefaultImages", image_urls); + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + base::StringValue("default-images-changed"), + image_urls); } void ChangePictureHandler::HandleChooseFile(const base::ListValue* args) { @@ -224,7 +225,8 @@ base::StringValue image_url( default_user_image::GetDefaultImageUrl(previous_image_index_)); web_ui()->CallJavascriptFunction( - "settings.ChangePicturePage.receiveSelectedImage", image_url); + "cr.webUIListenerCallback", + base::StringValue("selected-image-changed"), image_url); } else { // User has an old default image, so present it in the same manner as a // previous image from file. @@ -239,8 +241,9 @@ bool should_select) { base::StringValue data_url(webui::GetBitmapDataUrl(*image.bitmap())); base::FundamentalValue select(should_select); - web_ui()->CallJavascriptFunction( - "settings.ChangePicturePage.receiveProfileImage", data_url, select); + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + base::StringValue("profile-image-changed"), + data_url, select); } void ChangePictureHandler::UpdateProfileImage() { @@ -258,8 +261,8 @@ void ChangePictureHandler::SendOldImage(const std::string& image_url) { previous_image_url_ = image_url; base::StringValue url(image_url); - web_ui()->CallJavascriptFunction("settings.ChangePicturePage.receiveOldImage", - url); + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + base::StringValue("old-image-changed"), url); } void ChangePictureHandler::HandleSelectImage(const base::ListValue* args) { @@ -353,10 +356,9 @@ } void ChangePictureHandler::SetCameraPresent(bool present) { - base::FundamentalValue present_value(present); - - web_ui()->CallJavascriptFunction( - "settings.ChangePicturePage.receiveCameraPresence", present_value); + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + base::StringValue("camera-presence-changed"), + base::FundamentalValue(present)); } void ChangePictureHandler::OnCameraPresenceCheckDone(bool is_camera_present) {
diff --git a/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.cc b/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.cc index 34c8f97..686a85a2 100644 --- a/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.cc
@@ -92,7 +92,7 @@ web_ui()->CallJavascriptFunction( "cr.webUIListenerCallback", - base::StringValue("easy-unlock-turn-off-dialog-update"), + base::StringValue("easy-unlock-turn-off-flow-status"), base::StringValue(status_string)); }
diff --git a/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.h b/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.h index 47fe197..b0c3f567 100644 --- a/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.h
@@ -34,9 +34,12 @@ // EasyUnlockServiceObserver void OnTurnOffOperationStatusChanged() override; - private: + protected: explicit EasyUnlockSettingsHandler(Profile* profile); + private: + FRIEND_TEST_ALL_PREFIXES(EasyUnlockSettingsHandlerTest, TurnOffStatus); + void SendTurnOffOperationStatus(); // JS callbacks.
diff --git a/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler_unittest.cc new file mode 100644 index 0000000..cb9ad3e3 --- /dev/null +++ b/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler_unittest.cc
@@ -0,0 +1,176 @@ +// 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 "chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.h" + +#include "base/memory/scoped_ptr.h" +#include "chrome/browser/signin/easy_unlock_service.h" +#include "chrome/browser/signin/easy_unlock_service_factory.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/browser/web_ui_data_source.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "content/public/test/test_web_ui.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { +namespace settings { + +namespace { + +class FakeEasyUnlockService : public EasyUnlockService { + public: + explicit FakeEasyUnlockService(Profile* profile) + : EasyUnlockService(profile), turn_off_status_(IDLE), is_allowed_(true) {} + + TurnOffFlowStatus GetTurnOffFlowStatus() const override { + return turn_off_status_; + } + + bool IsAllowed() const override { return is_allowed_; } + + void set_is_allowed(bool is_allowed) { is_allowed_ = is_allowed; } + + void RunTurnOffFlow() override { + turn_off_status_ = PENDING; + NotifyTurnOffOperationStatusChanged(); + } + + void ResetTurnOffFlow() override { + turn_off_status_ = IDLE; + NotifyTurnOffOperationStatusChanged(); + } + + void SetTurnOffFailForTest() { + turn_off_status_ = FAIL; + NotifyTurnOffOperationStatusChanged(); + } + + private: + Type GetType() const override { return TYPE_REGULAR; } + AccountId GetAccountId() const override { return EmptyAccountId(); } + void LaunchSetup() override {} + const base::DictionaryValue* GetPermitAccess() const override { + return nullptr; + } + void SetPermitAccess(const base::DictionaryValue& permit) override {} + void ClearPermitAccess() override {} + + const base::ListValue* GetRemoteDevices() const override { return nullptr; } + void SetRemoteDevices(const base::ListValue& devices) override {} + void SetRemoteBleDevices(const base::ListValue& devices) override {} + + std::string GetChallenge() const override { return std::string(); } + std::string GetWrappedSecret() const override { return std::string(); } + void RecordEasySignInOutcome(const AccountId& account_id, + bool success) const override {} + void RecordPasswordLoginEvent(const AccountId& account_id) const override {} + void StartAutoPairing(const AutoPairingResultCallback& callback) override {} + void SetAutoPairingResult(bool success, const std::string& error) override {} + + void InitializeInternal() override {} + void ShutdownInternal() override {} + bool IsAllowedInternal() const override { return false; } + void OnWillFinalizeUnlock(bool success) override {} + void OnSuspendDoneInternal() override {} + + TurnOffFlowStatus turn_off_status_; + bool is_allowed_; +}; + +class TestEasyUnlockSettingsHandler : public EasyUnlockSettingsHandler { + public: + explicit TestEasyUnlockSettingsHandler(Profile* profile) + : EasyUnlockSettingsHandler(profile) {} + + using EasyUnlockSettingsHandler::set_web_ui; +}; + +scoped_ptr<KeyedService> CreateEasyUnlockServiceForTest( + content::BrowserContext* context) { + return make_scoped_ptr( + new FakeEasyUnlockService(Profile::FromBrowserContext(context))); +} + +} // namespace + +class EasyUnlockSettingsHandlerTest : public testing::Test { + public: + EasyUnlockSettingsHandlerTest() {} + + void SetUp() override { + TestingProfile::Builder builder; + builder.AddTestingFactory(EasyUnlockServiceFactory::GetInstance(), + &CreateEasyUnlockServiceForTest); + profile_ = builder.Build(); + } + + Profile* profile() { return profile_.get(); } + content::TestWebUI* web_ui() { return &web_ui_; } + FakeEasyUnlockService* fake_easy_unlock_service() { + return static_cast<FakeEasyUnlockService*>( + EasyUnlockService::Get(profile_.get())); + } + + void VerifyTurnOffStatusCallback(size_t expected_total_calls, + const std::string& expected_status) { + std::string event; + std::string status; + + EXPECT_EQ(expected_total_calls, web_ui_.call_data().size()); + + const content::TestWebUI::CallData& data = *web_ui_.call_data().back(); + EXPECT_EQ("cr.webUIListenerCallback", data.function_name()); + ASSERT_TRUE(data.arg1()->GetAsString(&event)); + EXPECT_EQ("easy-unlock-turn-off-flow-status", event); + ASSERT_TRUE(data.arg2()->GetAsString(&status)); + + EXPECT_EQ(expected_status, status); + } + + private: + content::TestBrowserThreadBundle thread_bundle_; + scoped_ptr<TestingProfile> profile_; + content::TestWebUI web_ui_; +}; + +TEST_F(EasyUnlockSettingsHandlerTest, OnlyCreatedWhenEasyUnlockAllowed) { + scoped_ptr<EasyUnlockSettingsHandler> handler; + content::WebUIDataSource* data_source = + content::WebUIDataSource::Create("test-data-source"); + content::WebUIDataSource::Add(profile(), data_source); + handler.reset( + EasyUnlockSettingsHandler::Create(data_source, profile())); + EXPECT_TRUE(handler.get()); + + fake_easy_unlock_service()->set_is_allowed(false); + handler.reset(EasyUnlockSettingsHandler::Create(data_source, profile())); + EXPECT_FALSE(handler.get()); +} + +TEST_F(EasyUnlockSettingsHandlerTest, TurnOffStatus) { + scoped_ptr<EasyUnlockSettingsHandler> handler; + handler.reset(new TestEasyUnlockSettingsHandler(profile())); + handler->set_web_ui(web_ui()); + + handler->HandleGetTurnOffFlowStatus(nullptr); + VerifyTurnOffStatusCallback(1U, "idle"); + + handler->HandleRequestTurnOff(nullptr); + VerifyTurnOffStatusCallback(2U, "pending"); + + handler->HandleGetTurnOffFlowStatus(nullptr); + VerifyTurnOffStatusCallback(3U, "pending"); + + handler->HandlePageDismissed(nullptr); + VerifyTurnOffStatusCallback(4U, "idle"); + + fake_easy_unlock_service()->SetTurnOffFailForTest(); + VerifyTurnOffStatusCallback(5U, "server-error"); + + handler->HandleGetTurnOffFlowStatus(nullptr); + VerifyTurnOffStatusCallback(6U, "server-error"); +} + +} // namespace settings +} // namespace chromeos
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index 0202839..119e569 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -189,6 +189,19 @@ {"certificateManagerExport", IDS_SETTINGS_CERTIFICATE_MANAGER_EXPORT}, {"certificateManagerDelete", IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE}, {"certificateManagerDone", IDS_SETTINGS_CERTIFICATE_MANAGER_DONE}, + // CA trust edit dialog. + {"certificateManagerCaTrustEditDialogTitle", + IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_TITLE}, + {"certificateManagerCaTrustEditDialogDescription", + IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_DESCRIPTION}, + {"certificateManagerCaTrustEditDialogExplanation", + IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EXPLANATION}, + {"certificateManagerCaTrustEditDialogSsl", + IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_SSL}, + {"certificateManagerCaTrustEditDialogEmail", + IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EMAIL}, + {"certificateManagerCaTrustEditDialogObjSign", + IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_OBJ_SIGN}, }; AddLocalizedStringsBulk(html_source, localized_strings, arraysize(localized_strings));
diff --git a/chrome/browser/ui/webui/signin/md_user_manager_ui.cc b/chrome/browser/ui/webui/signin/md_user_manager_ui.cc index ee15db34e..3802b1ca 100644 --- a/chrome/browser/ui/webui/signin/md_user_manager_ui.cc +++ b/chrome/browser/ui/webui/signin/md_user_manager_ui.cc
@@ -52,7 +52,27 @@ source->AddLocalizedStrings(localized_strings); source->SetJsonPath("strings.js"); - // TODO(mahmadi): Add resource paths. + source->AddResourcePath("control_bar.css", IDR_MD_CONTROL_BAR_CSS); + source->AddResourcePath("control_bar.html", IDR_MD_CONTROL_BAR_HTML); + source->AddResourcePath("control_bar.js", IDR_MD_CONTROL_BAR_JS); + source->AddResourcePath("create_profile.css", IDR_MD_CREATE_PROFILE_CSS); + source->AddResourcePath("create_profile.html", IDR_MD_CREATE_PROFILE_HTML); + source->AddResourcePath("create_profile.js", IDR_MD_CREATE_PROFILE_JS); + source->AddResourcePath("profile_browser_proxy.html", + IDR_MD_PROFILE_BROWSER_PROXY_HTML); + source->AddResourcePath("profile_browser_proxy.js", + IDR_MD_PROFILE_BROWSER_PROXY_JS); + source->AddResourcePath("strings.html", IDR_MD_USER_MANAGER_STRINGS_HTML); + source->AddResourcePath("user_manager.css", IDR_MD_USER_MANAGER_CSS); + source->AddResourcePath("user_manager.js", IDR_MD_USER_MANAGER_JS); + source->AddResourcePath("user_manager_pages.css", + IDR_MD_USER_MANAGER_PAGES_CSS); + source->AddResourcePath("user_manager_pages.html", + IDR_MD_USER_MANAGER_PAGES_HTML); + source->AddResourcePath("user_manager_pages.js", + IDR_MD_USER_MANAGER_PAGES_JS); + + source->SetDefaultResource(IDR_MD_USER_MANAGER_HTML); return source; }
diff --git a/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc b/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc index fe5da85a..7509b102 100644 --- a/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc +++ b/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc
@@ -57,6 +57,10 @@ void SigninCreateProfileHandler::GetLocalizedValues( base::DictionaryValue* localized_strings) { localized_strings->SetString( + "manageProfilesSupervisedSignedInLabel", + l10n_util::GetStringUTF16( + IDS_PROFILES_CREATE_SUPERVISED_MULTI_SIGNED_IN_LABEL)); + localized_strings->SetString( "manageProfilesSupervisedNotSignedIn", l10n_util::GetStringUTF16( IDS_PROFILES_CREATE_SUPERVISED_NOT_SIGNED_IN_HTML)); @@ -119,7 +123,8 @@ image_url_list.AppendString(url); } - web_ui()->CallJavascriptFunction("signin.ProfileApi.updateAvailableIcons", + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + base::StringValue("profile-icons-received"), image_url_list); } @@ -141,7 +146,8 @@ user_info_list.Append(user_info.release()); } - web_ui()->CallJavascriptFunction("signin.ProfileApi.updateSignedInUsers", + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + base::StringValue("signedin-users-received"), user_info_list); } @@ -292,7 +298,9 @@ dict.SetBoolean("isSupervised", is_supervised); #endif web_ui()->CallJavascriptFunction( - GetJavascriptMethodName(PROFILE_CREATION_SUCCESS), dict); + "cr.webUIListenerCallback", + GetWebUIListenerName(PROFILE_CREATION_SUCCESS), + dict); // If the new profile is a supervised user, instead of opening a new window // right away, a confirmation overlay will be shown by JS from the creation @@ -320,9 +328,9 @@ DCHECK_NE(NO_CREATION_IN_PROGRESS, profile_creation_type_); profile_creation_type_ = NO_CREATION_IN_PROGRESS; profile_path_being_created_.clear(); - web_ui()->CallJavascriptFunction( - GetJavascriptMethodName(PROFILE_CREATION_ERROR), - base::StringValue(error)); + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + GetWebUIListenerName(PROFILE_CREATION_ERROR), + base::StringValue(error)); // The ProfileManager calls us back with a NULL profile in some cases. if (profile) webui::DeleteProfileAtPath(profile->GetPath(), web_ui()); @@ -366,31 +374,31 @@ } #endif -std::string SigninCreateProfileHandler::GetJavascriptMethodName( +base::StringValue SigninCreateProfileHandler::GetWebUIListenerName( ProfileCreationStatus status) const { switch (profile_creation_type_) { #if defined(ENABLE_SUPERVISED_USERS) case SUPERVISED_PROFILE_IMPORT: switch (status) { case PROFILE_CREATION_SUCCESS: - return "BrowserOptions.showSupervisedUserImportSuccess"; + return base::StringValue("create-profile-success"); case PROFILE_CREATION_ERROR: - return "BrowserOptions.showSupervisedUserImportError"; + return base::StringValue("create-profile-error"); } break; #endif default: switch (status) { case PROFILE_CREATION_SUCCESS: - return "signin.ProfileApi.onCreateProfileSuccess"; + return base::StringValue("create-profile-success"); case PROFILE_CREATION_ERROR: - return "signin.ProfileApi.onCreateProfileError"; + return base::StringValue("create-profile-error"); } break; } NOTREACHED(); - return std::string(); + return base::StringValue(std::string()); } #if defined(ENABLE_SUPERVISED_USERS) @@ -597,7 +605,8 @@ void SigninCreateProfileHandler::ShowProfileCreationWarning( const base::string16& warning) { DCHECK_EQ(SUPERVISED_PROFILE_CREATION, profile_creation_type_); - web_ui()->CallJavascriptFunction("signin.ProfileApi.onCreateProfileWarning", + web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", + base::StringValue("create-profile-warning"), base::StringValue(warning)); }
diff --git a/chrome/browser/ui/webui/signin/signin_create_profile_handler.h b/chrome/browser/ui/webui/signin/signin_create_profile_handler.h index d7a303c..05ebe64 100644 --- a/chrome/browser/ui/webui/signin/signin_create_profile_handler.h +++ b/chrome/browser/ui/webui/signin/signin_create_profile_handler.h
@@ -112,7 +112,7 @@ base::string16 GetProfileCreateErrorMessageSignin() const; #endif - std::string GetJavascriptMethodName(ProfileCreationStatus status) const; + base::StringValue GetWebUIListenerName(ProfileCreationStatus status) const; // Used to allow cancelling a profile creation (particularly a supervised-user // registration) in progress. Set when profile creation is begun, and
diff --git a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc index 10b3d4f..1ea5094 100644 --- a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc +++ b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
@@ -371,7 +371,7 @@ args->GetString(0, &url_hash_); SendUserList(); - web_ui()->CallJavascriptFunction("cr.ui.Oobe.showUserManagerScreen", + web_ui()->CallJavascriptFunction("cr.ui.UserManager.showUserManagerScreen", base::FundamentalValue(IsGuestModeEnabled()), base::FundamentalValue(IsAddPersonEnabled())); @@ -915,7 +915,7 @@ ProfileMetrics::SWITCH_PROFILE_UNLOCK); } else { web_ui()->CallJavascriptFunction( - "cr.ui.Oobe.showSignInError", + "cr.ui.UserManager.showSignInError", base::FundamentalValue(0), base::StringValue(l10n_util::GetStringUTF8( auth == ProfileMetrics::AUTH_FAILED_OFFLINE ?
diff --git a/chrome/browser_tests.isolate b/chrome/browser_tests.isolate index 4b6e6c3..107a0903 100644 --- a/chrome/browser_tests.isolate +++ b/chrome/browser_tests.isolate
@@ -259,7 +259,6 @@ '<(PRODUCT_DIR)/chromevox_test_data/', '<(PRODUCT_DIR)/content_shell.pak', '<(PRODUCT_DIR)/keyboard_resources.pak', - '<(PRODUCT_DIR)/libexif.so', '<(PRODUCT_DIR)/locales/', '<(PRODUCT_DIR)/nacl_helper', '<(PRODUCT_DIR)/nacl_irt_x86_64.nexe',
diff --git a/chrome/chrome.isolate b/chrome/chrome.isolate index 90b3c48..796e53d 100644 --- a/chrome/chrome.isolate +++ b/chrome/chrome.isolate
@@ -69,7 +69,6 @@ '<(PRODUCT_DIR)/<(mac_product_name) Framework.framework/', '<(PRODUCT_DIR)/<(mac_product_name) Helper.app/', '<(PRODUCT_DIR)/<(mac_product_name).app/', - '<(PRODUCT_DIR)/exif.so', ], }, }], @@ -79,7 +78,6 @@ '<(PRODUCT_DIR)/<(mac_product_name) Framework.framework.dSYM/', '<(PRODUCT_DIR)/<(mac_product_name) Helper.app.dSYM/', '<(PRODUCT_DIR)/<(mac_product_name).app.dSYM/', - '<(PRODUCT_DIR)/exif.so.dSYM/', ], }, }], @@ -90,7 +88,6 @@ '<(PRODUCT_DIR)/chrome_200_percent.pak', '<(PRODUCT_DIR)/chrome.dll', '<(PRODUCT_DIR)/chrome_elf.dll', - '<(PRODUCT_DIR)/libexif.dll', '<(PRODUCT_DIR)/osmesa.dll', ], },
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 4daba223..2954929 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi
@@ -1210,6 +1210,7 @@ 'browser/lifetime/keep_alive_types.h', 'browser/lifetime/keep_alive_registry.cc', 'browser/lifetime/keep_alive_registry.h', + 'browser/lifetime/keep_alive_state_observer.h', 'browser/lifetime/scoped_keep_alive.cc', 'browser/lifetime/scoped_keep_alive.h', 'browser/media/tab_desktop_media_list.cc',
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index 6916ba7..fc4fe14d 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi
@@ -60,6 +60,9 @@ 'browser/chromeos/arc/arc_intent_helper_bridge.h', 'browser/chromeos/arc/arc_service_launcher.cc', 'browser/chromeos/arc/arc_service_launcher.h', + 'browser/chromeos/arc/arc_process.h', + 'browser/chromeos/arc/arc_process_service.cc', + 'browser/chromeos/arc/arc_process_service.h', 'browser/chromeos/arc/settings_bridge.cc', 'browser/chromeos/arc/settings_bridge.h', 'browser/chromeos/attestation/attestation_ca_client.cc', @@ -124,8 +127,6 @@ 'browser/chromeos/display/output_protection_delegate.h', 'browser/chromeos/display/overscan_calibrator.cc', 'browser/chromeos/display/overscan_calibrator.h', - 'browser/chromeos/policy/display_rotation_default_handler.cc', - 'browser/chromeos/policy/display_rotation_default_handler.h', 'browser/chromeos/drive/debug_info_collector.cc', 'browser/chromeos/drive/debug_info_collector.h', 'browser/chromeos/drive/download_handler.cc', @@ -630,10 +631,12 @@ 'browser/chromeos/login/ui/lock_window_aura.h', 'browser/chromeos/login/ui/login_display.cc', 'browser/chromeos/login/ui/login_display.h', - 'browser/chromeos/login/ui/login_display_host.h', 'browser/chromeos/login/ui/login_display_host.cc', + 'browser/chromeos/login/ui/login_display_host.h', 'browser/chromeos/login/ui/login_display_host_impl.cc', 'browser/chromeos/login/ui/login_display_host_impl.h', + 'browser/chromeos/login/ui/login_feedback.cc', + 'browser/chromeos/login/ui/login_feedback.h', 'browser/chromeos/login/ui/login_web_dialog.cc', 'browser/chromeos/login/ui/login_web_dialog.h', 'browser/chromeos/login/ui/models/user_board_model.cc', @@ -661,12 +664,12 @@ 'browser/chromeos/login/users/avatar/user_image_manager_impl.h', 'browser/chromeos/login/users/avatar/user_image_sync_observer.cc', 'browser/chromeos/login/users/avatar/user_image_sync_observer.h', - 'browser/chromeos/login/users/chrome_user_manager_util.cc', - 'browser/chromeos/login/users/chrome_user_manager_util.h', 'browser/chromeos/login/users/chrome_user_manager.cc', 'browser/chromeos/login/users/chrome_user_manager.h', 'browser/chromeos/login/users/chrome_user_manager_impl.cc', 'browser/chromeos/login/users/chrome_user_manager_impl.h', + 'browser/chromeos/login/users/chrome_user_manager_util.cc', + 'browser/chromeos/login/users/chrome_user_manager_util.h', 'browser/chromeos/login/users/default_user_image/default_user_images.cc', 'browser/chromeos/login/users/default_user_image/default_user_images.h', 'browser/chromeos/login/users/multi_profile_user_controller.cc', @@ -804,6 +807,8 @@ 'browser/chromeos/policy/device_policy_decoder_chromeos.h', 'browser/chromeos/policy/device_status_collector.cc', 'browser/chromeos/policy/device_status_collector.h', + 'browser/chromeos/policy/display_rotation_default_handler.cc', + 'browser/chromeos/policy/display_rotation_default_handler.h', 'browser/chromeos/policy/enrollment_config.cc', 'browser/chromeos/policy/enrollment_config.h', 'browser/chromeos/policy/enrollment_handler_chromeos.cc',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index 40e3cd0..f715dfc 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi
@@ -1883,15 +1883,12 @@ 'browser/ui/webui/ntp/core_app_launcher_handler.h', 'browser/ui/webui/ntp/favicon_webui_handler.cc', 'browser/ui/webui/ntp/favicon_webui_handler.h', - 'browser/ui/webui/ntp/new_tab_page_sync_handler.cc', - 'browser/ui/webui/ntp/new_tab_page_sync_handler.h', 'browser/ui/webui/ntp/new_tab_ui.cc', 'browser/ui/webui/ntp/new_tab_ui.h', 'browser/ui/webui/ntp/ntp_resource_cache.cc', 'browser/ui/webui/ntp/ntp_resource_cache.h', 'browser/ui/webui/ntp/ntp_resource_cache_factory.cc', 'browser/ui/webui/ntp/ntp_resource_cache_factory.h', - 'browser/ui/webui/ntp/ntp_stats.h', 'browser/ui/webui/options/advanced_options_utils.h', 'browser/ui/webui/options/advanced_options_utils_linux.cc', 'browser/ui/webui/options/advanced_options_utils_mac.mm',
diff --git a/chrome/chrome_dll_bundle.gypi b/chrome/chrome_dll_bundle.gypi index bb43d17..f673ae03 100644 --- a/chrome/chrome_dll_bundle.gypi +++ b/chrome/chrome_dll_bundle.gypi
@@ -132,12 +132,6 @@ ], 'copies': [ { - 'destination': '<(PRODUCT_DIR)/$(CONTENTS_FOLDER_PATH)/Libraries', - 'files': [ - '<(PRODUCT_DIR)/exif.so', - ], - }, - { 'destination': '<(PRODUCT_DIR)/$(CONTENTS_FOLDER_PATH)/Helpers', 'files': [ '<(PRODUCT_DIR)/crashpad_handler',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 9d74e99..049c723 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi
@@ -468,6 +468,7 @@ 'browser/ui/content_settings/content_setting_bubble_model_browsertest.cc', 'browser/ui/content_settings/content_setting_image_model_browsertest.cc', 'browser/ui/exclusive_access/fullscreen_controller_browsertest.cc', + 'browser/ui/extensions/extension_installed_bubble_browsertest.cc', 'browser/ui/extensions/extension_message_bubble_browsertest.cc', 'browser/ui/extensions/extension_message_bubble_browsertest.h', 'browser/ui/extensions/hosted_app_browsertest.cc', @@ -515,7 +516,6 @@ 'browser/ui/webui/log_web_ui_url_browsertest.cc', 'browser/ui/webui/net_internals/net_internals_ui_browsertest.cc', 'browser/ui/webui/net_internals/net_internals_ui_browsertest.h', - 'browser/ui/webui/ntp/new_tab_page_sync_handler_browsertest.cc', 'browser/ui/webui/ntp/new_tab_ui_browsertest.cc', 'browser/ui/webui/options/clear_browser_data_browsertest.cc', 'browser/ui/webui/options/content_settings_exception_area_browsertest.cc', @@ -783,6 +783,7 @@ 'browser/chromeos/login/test/wizard_in_process_browser_test.cc', 'browser/chromeos/login/test/wizard_in_process_browser_test.h', 'browser/chromeos/login/ui/captive_portal_window_browsertest.cc', + 'browser/chromeos/login/ui/login_feedback_browsertest.cc', 'browser/chromeos/login/ui/login_web_dialog_browsertest.cc', 'browser/chromeos/login/ui/simple_web_view_dialog_browsertest.cc', 'browser/chromeos/login/ui/user_adding_screen_browsertest.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index fae9d59b..e19e3c0 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -658,7 +658,6 @@ 'renderer/extensions/renderer_permissions_policy_delegate_unittest.cc', 'renderer/media/cast_ipc_dispatcher_unittest.cc', 'utility/image_writer/image_writer_unittest.cc', - 'utility/media_galleries/image_metadata_extractor_unittest.cc', ], 'chrome_unit_tests_extensions_service_discovery_sources': [ 'browser/extensions/api/gcd_private/privet_v3_context_getter_unittest.cc', @@ -1132,6 +1131,7 @@ 'browser/ui/webui/chromeos/login/l10n_util_unittest.cc', 'browser/ui/webui/chromeos/login/signin_userlist_unittest.cc', 'browser/ui/webui/options/chromeos/cros_language_options_handler_unittest.cc', + 'browser/ui/webui/settings/chromeos/easy_unlock_settings_handler_unittest.cc', 'common/extensions/api/file_browser_handlers/file_browser_handler_manifest_unittest.cc', 'common/extensions/api/file_system_provider/file_system_provider_handler_unittest.cc', ],
diff --git a/chrome/chrome_utility.gypi b/chrome/chrome_utility.gypi index 8ed5511f..0ed6bdf5 100644 --- a/chrome/chrome_utility.gypi +++ b/chrome/chrome_utility.gypi
@@ -83,8 +83,6 @@ 'utility/safe_browsing/mac/udif.h', ], 'chrome_utility_shared_media_sources': [ - 'utility/media_galleries/image_metadata_extractor.cc', - 'utility/media_galleries/image_metadata_extractor.h', 'utility/media_galleries/ipc_data_source.cc', 'utility/media_galleries/ipc_data_source.h', 'utility/media_galleries/itunes_pref_parser_win.cc', @@ -177,7 +175,6 @@ ['enable_extensions==1', { 'dependencies': [ '../extensions/extensions.gyp:extensions_utility', - '../third_party/libexif/libexif.gyp:libexif', 'common/extensions/api/api.gyp:chrome_api', ], 'export_dependent_settings': [
diff --git a/chrome/common/extensions/api/context_menus_internal.json b/chrome/common/extensions/api/context_menus_internal.json index da2a49f7..2e879b06 100644 --- a/chrome/common/extensions/api/context_menus_internal.json +++ b/chrome/common/extensions/api/context_menus_internal.json
@@ -52,6 +52,11 @@ "optional": true, "description": " The URL of the frame of the element where the context menu was clicked, if it was in a frame." }, + "frameId": { + "type": "integer", + "optional": true, + "description": " The <a href='webNavigation#frame_ids'>ID of the frame</a> of the element where the context menu was clicked, if it was in a frame." + }, "selectionText": { "type": "string", "optional": true,
diff --git a/chrome/common/extensions/api/extension_action/action_info.cc b/chrome/common/extensions/api/extension_action/action_info.cc index 9e8d75a0..e247662 100644 --- a/chrome/common/extensions/api/extension_action/action_info.cc +++ b/chrome/common/extensions/api/extension_action/action_info.cc
@@ -45,8 +45,7 @@ } // namespace -ActionInfo::ActionInfo() { -} +ActionInfo::ActionInfo() : synthesized(false) {} ActionInfo::ActionInfo(const ActionInfo& other) = default;
diff --git a/chrome/common/extensions/api/extension_action/action_info.h b/chrome/common/extensions/api/extension_action/action_info.h index e014f31..1e2001d 100644 --- a/chrome/common/extensions/api/extension_action/action_info.h +++ b/chrome/common/extensions/api/extension_action/action_info.h
@@ -66,6 +66,8 @@ GURL default_popup_url; // action id -- only used with legacy page actions API. std::string id; + // Whether or not this action was synthesized to force visibility. + bool synthesized; }; } // namespace extensions
diff --git a/chrome/common/extensions/api/feedback_private.idl b/chrome/common/extensions/api/feedback_private.idl index ba48e72..54990c3 100644 --- a/chrome/common/extensions/api/feedback_private.idl +++ b/chrome/common/extensions/api/feedback_private.idl
@@ -16,6 +16,16 @@ DOMString value; }; + // Supported feedback flows. + enum FeedbackFlow { + // Flow for regular user. This is the default. + regular, + + // Flow on the ChromeOS login screen. URL entry, file attaching and landing + // page is disabled for this flow. + login + }; + dictionary FeedbackInfo { // File to attach to the feedback report. AttachedFile? attachedFile; @@ -50,6 +60,9 @@ // True if we have permission to add histograms to this feedback report. boolean sendHistograms; + // Optional feedback UI flow. Default is the regular user flow. + FeedbackFlow? flow; + // TODO(rkc): Remove these once we have bindings to send blobs to Chrome. // Used internally to store the blob uuid after parameter customization. DOMString? attachedFileBlobUuid;
diff --git a/chrome/common/extensions/api/media_galleries.idl b/chrome/common/extensions/api/media_galleries.idl index 7ef67279..4c21ef7 100644 --- a/chrome/common/extensions/api/media_galleries.idl +++ b/chrome/common/extensions/api/media_galleries.idl
@@ -128,30 +128,17 @@ // The browser sniffed mime type. DOMString mimeType; - // Defined for images and video. In pixels. + // Defined for video. In pixels. long? height; long? width; - // Defined for images only. - double? xResolution; - double? yResolution; - // Defined for audio and video. In seconds. double? duration; - // Defined for images and video. In degrees. + // Defined for video. In degrees. long? rotation; - // Defined for images only. - DOMString? cameraMake; - DOMString? cameraModel; - double? exposureTimeSeconds; - boolean? flashFired; - double? fNumber; - double? focalLengthMm; - double? isoEquivalent; - - // Defined for audio and video only. + // Defined for audio and video. DOMString? album; DOMString? artist; DOMString? comment;
diff --git a/chrome/common/extensions/extension_constants.cc b/chrome/common/extensions/extension_constants.cc index 81bc30f..c6b2bd2 100644 --- a/chrome/common/extensions/extension_constants.cc +++ b/chrome/common/extensions/extension_constants.cc
@@ -37,6 +37,7 @@ const char kDriveHostedAppId[] = "apdfllckaahabafndbhieahigkjlhalf"; const char kEasyUnlockAppId[] = "mkaemigholebcgchlkbankmihknojeak"; const char kEnterpriseWebStoreAppId[] = "afchcafgojfnemjkcbhfekplkmjaldaa"; +const char kFeedbackExtensionId[] = "gfdkimpbcpahaombhbimeihdjnejgicl"; const char kGmailAppId[] = "pjkljhegncpnkpknbcohdijeoejaedia"; const char kGoogleDocAppId[] = "aohghmighlieiainnegkcijnfilokake"; const char kGooglePlayMusicAppId[] = "icppfcnhkcmnfdhfhphakoifcfokfdhg";
diff --git a/chrome/common/extensions/extension_constants.h b/chrome/common/extensions/extension_constants.h index 5fe6cec..a7712827 100644 --- a/chrome/common/extensions/extension_constants.h +++ b/chrome/common/extensions/extension_constants.h
@@ -55,6 +55,9 @@ // The extension id of the Enterprise Web Store component application. extern const char kEnterpriseWebStoreAppId[]; +// The extension id of the feedback component extension. +extern const char kFeedbackExtensionId[]; + // The extension id of GMail application. extern const char kGmailAppId[];
diff --git a/chrome/common/extensions/manifest_handlers/extension_action_handler.cc b/chrome/common/extensions/manifest_handlers/extension_action_handler.cc index 15682c61..3d2a465 100644 --- a/chrome/common/extensions/manifest_handlers/extension_action_handler.cc +++ b/chrome/common/extensions/manifest_handlers/extension_action_handler.cc
@@ -74,7 +74,9 @@ // Set an empty page action. We use a page action (instead of a browser // action) because the action should not be seen as enabled on every page. - ActionInfo::SetPageActionInfo(extension, new ActionInfo()); + scoped_ptr<ActionInfo> action_info(new ActionInfo()); + action_info->synthesized = true; + ActionInfo::SetPageActionInfo(extension, action_info.release()); } return true;
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 32c892f..cb643bb 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -18,6 +18,8 @@ const char kArcApps[] = "arc.apps"; // A preference to keep Android apps enabled state. const char kArcEnabled[] = "arc.enabled"; +// A preference that indicates status of Android sign-in. +const char kArcSignedIn[] = "arc.signedin"; #endif // A bool pref that keeps whether the child status for this profile was already
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 21b75d50..38ff6ae 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -18,6 +18,7 @@ #if defined(OS_CHROMEOS) && defined(ENABLE_APP_LIST) extern const char kArcApps[]; extern const char kArcEnabled[]; +extern const char kArcSignedIn[]; #endif extern const char kChildAccountStatusKnown[]; extern const char kDefaultApps[];
diff --git a/chrome/installer/linux/sysroot_scripts/packagelist.wheezy.mipsel b/chrome/installer/linux/sysroot_scripts/packagelist.wheezy.mipsel index 9531805b..0c5278c 100644 --- a/chrome/installer/linux/sysroot_scripts/packagelist.wheezy.mipsel +++ b/chrome/installer/linux/sysroot_scripts/packagelist.wheezy.mipsel
@@ -58,8 +58,6 @@ main/libc/libcap2/libcap2_2.22-1.2_mipsel.deb main/libc/libcap2/libcap-dev_2.22-1.2_mipsel.deb main/libd/libdrm/libdrm2_2.4.40-1~deb7u2_mipsel.deb -main/libe/libexif/libexif12_0.6.20-3_mipsel.deb -main/libe/libexif/libexif-dev_0.6.20-3_mipsel.deb main/libf/libffi/libffi5_3.0.10-3_mipsel.deb main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u2_mipsel.deb main/libg/libgcrypt11/libgcrypt11-dev_1.5.0-5+deb7u2_mipsel.deb
diff --git a/chrome/installer/mini_installer/chrome.release b/chrome/installer/mini_installer/chrome.release index e554c168..fcbc5311 100644 --- a/chrome/installer/mini_installer/chrome.release +++ b/chrome/installer/mini_installer/chrome.release
@@ -30,7 +30,6 @@ icudt.dll: %(VersionDir)s\ icudtl.dat: %(VersionDir)s\ libEGL.dll: %(VersionDir)s\ -libexif.dll: %(VersionDir)s\ libGLESv2.dll: %(VersionDir)s\ nacl64.exe: %(VersionDir)s\ nacl_irt_x86_32.nexe: %(VersionDir)s\
diff --git a/chrome/interactive_ui_tests.isolate b/chrome/interactive_ui_tests.isolate index 5aa6cb5..1e8c9b3a 100644 --- a/chrome/interactive_ui_tests.isolate +++ b/chrome/interactive_ui_tests.isolate
@@ -130,7 +130,6 @@ 'files': [ '../google_apis/test/', '<(PRODUCT_DIR)/keyboard_resources.pak', - '<(PRODUCT_DIR)/libexif.so', '<(PRODUCT_DIR)/nacl_helper', '<(PRODUCT_DIR)/nacl_irt_x86_64.nexe', '<(PRODUCT_DIR)/resources/chromeos/',
diff --git a/chrome/renderer/OWNERS b/chrome/renderer/OWNERS index db95deb0..2d17dc2 100644 --- a/chrome/renderer/OWNERS +++ b/chrome/renderer/OWNERS
@@ -1,2 +1,4 @@ +# Page Load Histogram files. +per-file page_load_histograms*=file://components/page_load_metrics/OWNERS # Instant/Search files. per-file instant_restricted_id_cache*=file://chrome/browser/search/OWNERS
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 8486b3e..93ef2c2 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -566,7 +566,7 @@ GURL url(params.url); #if defined(ENABLE_PLUGINS) ChromeViewHostMsg_GetPluginInfo_Output output; - WebString top_origin = frame->top()->securityOrigin().toString(); + WebString top_origin = frame->top()->getSecurityOrigin().toString(); render_frame->Send(new ChromeViewHostMsg_GetPluginInfo( render_frame->GetRoutingID(), url, blink::WebStringToGURL(top_origin), orig_mime_type, &output));
diff --git a/chrome/renderer/content_settings_observer.cc b/chrome/renderer/content_settings_observer.cc index 129c3f1..2e48be5 100644 --- a/chrome/renderer/content_settings_observer.cc +++ b/chrome/renderer/content_settings_observer.cc
@@ -92,7 +92,7 @@ static const char kDotHTML[] = ".html"; GURL GetOriginOrURL(const WebFrame* frame) { - WebString top_origin = frame->top()->securityOrigin().toString(); + WebString top_origin = frame->top()->getSecurityOrigin().toString(); // The |top_origin| is unique ("null") e.g., for file:// URLs. Use the // document URL as the primary URL in those cases. // TODO(alexmos): This is broken for --site-per-process, since top() can be a @@ -247,7 +247,7 @@ GURL url = frame->document().url(); // If we start failing this DCHECK, please makes sure we don't regress // this bug: http://code.google.com/p/chromium/issues/detail?id=79304 - DCHECK(frame->document().securityOrigin().toString() == "null" || + DCHECK(frame->document().getSecurityOrigin().toString() == "null" || !url.SchemeIs(url::kDataScheme)); } @@ -255,15 +255,15 @@ const WebString& display_name, unsigned long estimated_size) { WebFrame* frame = render_frame()->GetWebFrame(); - if (frame->securityOrigin().isUnique() || - frame->top()->securityOrigin().isUnique()) + if (frame->getSecurityOrigin().isUnique() || + frame->top()->getSecurityOrigin().isUnique()) return false; bool result = false; Send(new ChromeViewHostMsg_AllowDatabase( routing_id(), - blink::WebStringToGURL(frame->securityOrigin().toString()), - blink::WebStringToGURL(frame->top()->securityOrigin().toString()), + blink::WebStringToGURL(frame->getSecurityOrigin().toString()), + blink::WebStringToGURL(frame->top()->getSecurityOrigin().toString()), name, display_name, &result)); return result; } @@ -271,8 +271,8 @@ void ContentSettingsObserver::requestFileSystemAccessAsync( const WebContentSettingCallbacks& callbacks) { WebFrame* frame = render_frame()->GetWebFrame(); - if (frame->securityOrigin().isUnique() || - frame->top()->securityOrigin().isUnique()) { + if (frame->getSecurityOrigin().isUnique() || + frame->top()->getSecurityOrigin().isUnique()) { WebContentSettingCallbacks permissionCallbacks(callbacks); permissionCallbacks.doDeny(); return; @@ -287,8 +287,8 @@ Send(new ChromeViewHostMsg_RequestFileSystemAccessAsync( routing_id(), current_request_id_, - blink::WebStringToGURL(frame->securityOrigin().toString()), - blink::WebStringToGURL(frame->top()->securityOrigin().toString()))); + blink::WebStringToGURL(frame->getSecurityOrigin().toString()), + blink::WebStringToGURL(frame->top()->getSecurityOrigin().toString()))); } bool ContentSettingsObserver::allowImage(bool enabled_per_settings, @@ -317,15 +317,15 @@ bool ContentSettingsObserver::allowIndexedDB(const WebString& name, const WebSecurityOrigin& origin) { WebFrame* frame = render_frame()->GetWebFrame(); - if (frame->securityOrigin().isUnique() || - frame->top()->securityOrigin().isUnique()) + if (frame->getSecurityOrigin().isUnique() || + frame->top()->getSecurityOrigin().isUnique()) return false; bool result = false; Send(new ChromeViewHostMsg_AllowIndexedDB( routing_id(), - blink::WebStringToGURL(frame->securityOrigin().toString()), - blink::WebStringToGURL(frame->top()->securityOrigin().toString()), + blink::WebStringToGURL(frame->getSecurityOrigin().toString()), + blink::WebStringToGURL(frame->top()->getSecurityOrigin().toString()), name, &result)); return result; } @@ -352,10 +352,9 @@ bool allow = true; if (content_setting_rules_) { ContentSetting setting = GetContentSettingFromRules( - content_setting_rules_->script_rules, - frame, + content_setting_rules_->script_rules, frame, blink::WebStringToGURL( - frame->document().securityOrigin().toString())); + frame->document().getSecurityOrigin().toString())); allow = setting != CONTENT_SETTING_BLOCK; } allow = allow || IsWhitelistedForContentSettings(); @@ -385,13 +384,13 @@ bool ContentSettingsObserver::allowStorage(bool local) { WebFrame* frame = render_frame()->GetWebFrame(); - if (frame->securityOrigin().isUnique() || - frame->top()->securityOrigin().isUnique()) + if (frame->getSecurityOrigin().isUnique() || + frame->top()->getSecurityOrigin().isUnique()) return false; bool result = false; StoragePermissionsKey key( - blink::WebStringToGURL(frame->document().securityOrigin().toString()), + blink::WebStringToGURL(frame->document().getSecurityOrigin().toString()), local); std::map<StoragePermissionsKey, bool>::const_iterator permissions = cached_storage_permissions_.find(key); @@ -400,8 +399,8 @@ Send(new ChromeViewHostMsg_AllowDOMStorage( routing_id(), - blink::WebStringToGURL(frame->securityOrigin().toString()), - blink::WebStringToGURL(frame->top()->securityOrigin().toString()), + blink::WebStringToGURL(frame->getSecurityOrigin().toString()), + blink::WebStringToGURL(frame->top()->getSecurityOrigin().toString()), local, &result)); cached_storage_permissions_[key] = result; return result; @@ -494,7 +493,7 @@ WebFrame* frame = render_frame()->GetWebFrame(); Send(new ChromeViewHostMsg_DidUseKeygen( routing_id(), - blink::WebStringToGURL(frame->securityOrigin().toString()))); + blink::WebStringToGURL(frame->getSecurityOrigin().toString()))); } void ContentSettingsObserver::didNotAllowPlugins() { @@ -563,7 +562,7 @@ bool ContentSettingsObserver::IsPlatformApp() { #if defined(ENABLE_EXTENSIONS) WebFrame* frame = render_frame()->GetWebFrame(); - WebSecurityOrigin origin = frame->document().securityOrigin(); + WebSecurityOrigin origin = frame->document().getSecurityOrigin(); const extensions::Extension* extension = GetExtension(origin); return extension && extension->is_platform_app(); #else @@ -596,8 +595,8 @@ return true; WebFrame* web_frame = render_frame()->GetWebFrame(); - return IsWhitelistedForContentSettings(web_frame->document().securityOrigin(), - web_frame->document().url()); + return IsWhitelistedForContentSettings( + web_frame->document().getSecurityOrigin(), web_frame->document().url()); } bool ContentSettingsObserver::IsWhitelistedForContentSettings(
diff --git a/chrome/renderer/extensions/app_bindings.cc b/chrome/renderer/extensions/app_bindings.cc index 1fc204c..0961814 100644 --- a/chrome/renderer/extensions/app_bindings.cc +++ b/chrome/renderer/extensions/app_bindings.cc
@@ -73,7 +73,7 @@ v8::Local<v8::Value> AppBindings::GetDetailsImpl(blink::WebLocalFrame* frame) { v8::Isolate* isolate = frame->mainWorldScriptContext()->GetIsolate(); - if (frame->document().securityOrigin().isUnique()) + if (frame->document().getSecurityOrigin().isUnique()) return v8::Null(isolate); const Extension* extension = @@ -117,7 +117,7 @@ // To distinguish between ready_to_run and cannot_run states, we need the app // from the top frame. blink::WebSecurityOrigin top_frame_security_origin = - context()->web_frame()->top()->securityOrigin(); + context()->web_frame()->top()->getSecurityOrigin(); const RendererExtensionRegistry* extensions = RendererExtensionRegistry::Get();
diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.cc b/chrome/renderer/extensions/cast_streaming_native_handler.cc index 23ff219..72bf8059 100644 --- a/chrome/renderer/extensions/cast_streaming_native_handler.cc +++ b/chrome/renderer/extensions/cast_streaming_native_handler.cc
@@ -802,10 +802,9 @@ media::AudioParameters params( media::AudioParameters::AUDIO_PCM_LINEAR, - media::CHANNEL_LAYOUT_STEREO, + media::GuessChannelLayout(audio_config.channels), audio_config.rtp_timebase, // sampling rate - 16, - audio_config.rtp_timebase / audio_config.target_frame_rate); + 16, audio_config.rtp_timebase / audio_config.target_frame_rate); if (!params.IsValid()) { args.GetIsolate()->ThrowException(v8::Exception::TypeError( @@ -863,8 +862,24 @@ const media::AudioParameters& params, scoped_refptr<media::AudioCapturerSource> audio, scoped_ptr<media::VideoCapturerSource> video) { - content::AddAudioTrackToMediaStream(audio, params, true, true, url); - content::AddVideoTrackToMediaStream(std::move(video), true, true, url); + blink::WebMediaStream web_stream = + blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(GURL(url)); + if (web_stream.isNull()) { + LOG(DFATAL) << "Stream not found."; + return; + } + if (!content::AddAudioTrackToMediaStream( + audio, params.sample_rate(), params.channel_layout(), + params.frames_per_buffer(), true, // is_remote + true, // is_readonly + &web_stream)) { + LOG(ERROR) << "Failed to add Cast audio track to media stream."; + } + if (!content::AddVideoTrackToMediaStream(std::move(video), true, // is_remote + true, // is_readonly + &web_stream)) { + LOG(ERROR) << "Failed to add Cast video track to media stream."; + } } } // namespace extensions
diff --git a/chrome/renderer/extensions/chrome_extensions_renderer_client.cc b/chrome/renderer/extensions/chrome_extensions_renderer_client.cc index 66fca4c00..0f3d463a 100644 --- a/chrome/renderer/extensions/chrome_extensions_renderer_client.cc +++ b/chrome/renderer/extensions/chrome_extensions_renderer_client.cc
@@ -85,7 +85,8 @@ // in an extension process (other than the Chrome Web Store), we want to // keep it in process to allow the opener to script it. blink::WebDocument opener_document = opener_frame->document(); - blink::WebSecurityOrigin opener_origin = opener_document.securityOrigin(); + blink::WebSecurityOrigin opener_origin = + opener_document.getSecurityOrigin(); bool opener_is_extension_url = !opener_origin.isUnique() && extension_registry->GetExtensionOrAppByURL( opener_document.url()) != nullptr;
diff --git a/chrome/renderer/extensions/media_galleries_custom_bindings.cc b/chrome/renderer/extensions/media_galleries_custom_bindings.cc index a9f4cab..a13ea64 100644 --- a/chrome/renderer/extensions/media_galleries_custom_bindings.cc +++ b/chrome/renderer/extensions/media_galleries_custom_bindings.cc
@@ -37,8 +37,8 @@ blink::WebLocalFrame* webframe = blink::WebLocalFrame::frameForCurrentContext(); - const GURL origin = - blink::WebStringToGURL(webframe->document().securityOrigin().toString()); + const GURL origin = blink::WebStringToGURL( + webframe->document().getSecurityOrigin().toString()); std::string fs_name = storage::GetFileSystemName(origin, storage::kFileSystemTypeExternal); fs_name.append("_");
diff --git a/chrome/renderer/extensions/resource_request_policy.cc b/chrome/renderer/extensions/resource_request_policy.cc index 0a3464f2..4495605 100644 --- a/chrome/renderer/extensions/resource_request_policy.cc +++ b/chrome/renderer/extensions/resource_request_policy.cc
@@ -76,7 +76,7 @@ // but this is ok for the checks below. We only care if it matches the // current extension or has a devtools scheme. GURL page_origin = - blink::WebStringToGURL(frame->top()->securityOrigin().toString()); + blink::WebStringToGURL(frame->top()->getSecurityOrigin().toString()); // Exceptions are: // - empty origin (needed for some edge cases when we have empty origins)
diff --git a/chrome/renderer/plugins/chrome_plugin_placeholder.cc b/chrome/renderer/plugins/chrome_plugin_placeholder.cc index f08b9b8..393e915 100644 --- a/chrome/renderer/plugins/chrome_plugin_placeholder.cc +++ b/chrome/renderer/plugins/chrome_plugin_placeholder.cc
@@ -260,7 +260,8 @@ ChromeViewHostMsg_GetPluginInfo_Output output; std::string mime_type(GetPluginParams().mimeType.utf8()); - blink::WebString top_origin = GetFrame()->top()->securityOrigin().toString(); + blink::WebString top_origin = + GetFrame()->top()->getSecurityOrigin().toString(); render_frame()->Send( new ChromeViewHostMsg_GetPluginInfo(routing_id(), GURL(GetPluginParams().url),
diff --git a/chrome/renderer/plugins/power_saver_info.cc b/chrome/renderer/plugins/power_saver_info.cc index c54ed8ca..2445c4f5 100644 --- a/chrome/renderer/plugins/power_saver_info.cc +++ b/chrome/renderer/plugins/power_saver_info.cc
@@ -102,7 +102,7 @@ info.blocked_for_background_tab = render_frame->IsHidden(); auto status = render_frame->GetPeripheralContentStatus( - render_frame->GetWebFrame()->top()->securityOrigin(), + render_frame->GetWebFrame()->top()->getSecurityOrigin(), url::Origin(params.url), gfx::Size()); // Early-exit from the whole Power Saver system if the content is
diff --git a/chrome/renderer/worker_content_settings_client_proxy.cc b/chrome/renderer/worker_content_settings_client_proxy.cc index cdf81ae..ce38f34 100644 --- a/chrome/renderer/worker_content_settings_client_proxy.cc +++ b/chrome/renderer/worker_content_settings_client_proxy.cc
@@ -19,14 +19,14 @@ blink::WebFrame* frame) : routing_id_(render_frame->GetRoutingID()), is_unique_origin_(false) { - if (frame->document().securityOrigin().isUnique() || - frame->top()->securityOrigin().isUnique()) + if (frame->document().getSecurityOrigin().isUnique() || + frame->top()->getSecurityOrigin().isUnique()) is_unique_origin_ = true; sync_message_filter_ = content::RenderThread::Get()->GetSyncMessageFilter(); document_origin_url_ = - blink::WebStringToGURL(frame->document().securityOrigin().toString()); + blink::WebStringToGURL(frame->document().getSecurityOrigin().toString()); top_frame_origin_url_ = - blink::WebStringToGURL(frame->top()->securityOrigin().toString()); + blink::WebStringToGURL(frame->top()->getSecurityOrigin().toString()); } WorkerContentSettingsClientProxy::~WorkerContentSettingsClientProxy() {}
diff --git a/chrome/sync_integration_tests.isolate b/chrome/sync_integration_tests.isolate index 4bb4ad6..25a2012 100644 --- a/chrome/sync_integration_tests.isolate +++ b/chrome/sync_integration_tests.isolate
@@ -101,13 +101,6 @@ ], }, }], - ['chromeos==1', { - 'variables': { - 'files': [ - '<(PRODUCT_DIR)/libexif.so', - ], - }, - }], ], 'includes': [ '../base/base.isolate',
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCaseBase.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCaseBase.java index d43b0a9f..e3cd02f 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCaseBase.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCaseBase.java
@@ -376,7 +376,7 @@ public Tab loadUrlInNewTab(final String url, final boolean incognito) throws InterruptedException { Tab tab = null; - if (FeatureUtilities.isDocumentMode(getInstrumentation().getContext())) { + if (FeatureUtilities.isDocumentMode(getInstrumentation().getTargetContext())) { Runnable activityTrigger = new Runnable() { @Override public void run() { @@ -471,7 +471,7 @@ prepareUrlIntent(intent, url); final boolean isDocumentMode = - FeatureUtilities.isDocumentMode(getInstrumentation().getContext()); + FeatureUtilities.isDocumentMode(getInstrumentation().getTargetContext()); startActivityCompletely(intent); @@ -535,7 +535,7 @@ protected void newIncognitoTabFromMenu() throws InterruptedException { Tab tab = null; - if (FeatureUtilities.isDocumentMode(getInstrumentation().getContext())) { + if (FeatureUtilities.isDocumentMode(getInstrumentation().getTargetContext())) { final IncognitoDocumentActivity activity = ActivityUtils.waitForActivity( getInstrumentation(), IncognitoDocumentActivity.class, new Runnable() { @@ -617,7 +617,7 @@ @Override public Integer call() { TabModelSelector tabModelSelector; - if (FeatureUtilities.isDocumentMode(getInstrumentation().getContext())) { + if (FeatureUtilities.isDocumentMode(getInstrumentation().getTargetContext())) { tabModelSelector = ChromeApplication.getDocumentTabModelSelector(); } else { tabModelSelector = getActivity().getTabModelSelector();
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java index ebf6240..671c9b2 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.test; +import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; @@ -15,6 +16,7 @@ import org.chromium.base.test.BaseInstrumentationTestRunner; import org.chromium.base.test.BaseTestResult; +import org.chromium.base.test.util.RestrictionSkipCheck; import org.chromium.base.test.util.SkipCheck; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.test.util.ChromeRestriction; @@ -44,13 +46,17 @@ protected void addTestHooks(BaseTestResult result) { super.addTestHooks(result); result.addSkipCheck(new DisableInTabbedModeSkipCheck()); - result.addSkipCheck(new ChromeRestrictionSkipCheck()); + result.addSkipCheck(new ChromeRestrictionSkipCheck(getTargetContext())); result.addPreTestHook(Policies.getRegistrationHook()); } private class ChromeRestrictionSkipCheck extends RestrictionSkipCheck { + public ChromeRestrictionSkipCheck(Context targetContext) { + super(targetContext); + } + @Override protected boolean restrictionApplies(String restriction) { if (TextUtils.equals(restriction, ChromeRestriction.RESTRICTION_TYPE_PHONE) @@ -88,7 +94,7 @@ public boolean shouldSkip(TestCase testCase) { Class<?> testClass = testCase.getClass(); try { - if (!FeatureUtilities.isDocumentMode(getContext())) { + if (!FeatureUtilities.isDocumentMode(getTargetContext())) { Method testMethod = testClass.getMethod(testCase.getName()); if (testMethod.isAnnotationPresent(DisableInTabbedMode.class) || testClass.isAnnotationPresent(DisableInTabbedMode.class)) {
diff --git a/chrome/test/data/extensions/api_test/media_galleries/media_metadata/test.js b/chrome/test/data/extensions/api_test/media_galleries/media_metadata/test.js index f4010e0..96ad361 100644 --- a/chrome/test/data/extensions/api_test/media_galleries/media_metadata/test.js +++ b/chrome/test/data/extensions/api_test/media_galleries/media_metadata/test.js
@@ -35,30 +35,6 @@ RunMetadataTest("test.jpg", {metadataType: 'mimeTypeOnly'}, verifyMetadata); } -function ImageTagsTest() { - function verifyMetadata(metadata) { - chrome.test.assertEq("image/jpeg", metadata.mimeType); - chrome.test.assertEq(5616, metadata.width); - chrome.test.assertEq(3744, metadata.height); - chrome.test.assertEq(0, metadata.rotation); - chrome.test.assertEq(300.0, metadata.xResolution); - chrome.test.assertEq(300.0, metadata.yResolution); - chrome.test.assertEq("Canon", metadata.cameraMake); - chrome.test.assertEq("Canon EOS 5D Mark II", metadata.cameraModel); - chrome.test.assertEq(0.01, metadata.exposureTimeSeconds); - chrome.test.assertFalse(metadata.flashFired); - chrome.test.assertEq(3.2, metadata.fNumber); - chrome.test.assertEq(100, metadata.focalLengthMm); - chrome.test.assertEq(1600, metadata.isoEquivalent); - - chrome.test.assertEq(0, metadata.attachedImages.length); - - chrome.test.succeed(); - } - - RunMetadataTest("test.jpg", {}, verifyMetadata); -} - function InvalidMultimediaFileTest() { function verifyMetadata(metadata) { chrome.test.assertEq(null, metadata); @@ -193,7 +169,6 @@ // Should still be able to sniff MP3 MIME type without proprietary codecs. var testsToRun = [ ImageMIMETypeOnlyTest, - ImageTagsTest, InvalidMultimediaFileTest ];
diff --git a/chrome/test/data/extensions/api_test/media_galleries/read_access/test.js b/chrome/test/data/extensions/api_test/media_galleries/read_access/test.js index 561677a..9e5909d00 100644 --- a/chrome/test/data/extensions/api_test/media_galleries/read_access/test.js +++ b/chrome/test/data/extensions/api_test/media_galleries/read_access/test.js
@@ -42,28 +42,6 @@ TestFirstFilesystem(verifyFilesystem); } -function GetMetadataTest() { - function verifyFilesystem(filesystem) { - filesystem.root.getFile("test.jpg", {create: false}, verifyFileEntry, - chrome.test.fail); - } - - function verifyFileEntry(fileEntry) { - fileEntry.file(verifyFile, chrome.test.fail) - } - - function verifyFile(file) { - mediaGalleries.getMetadata(file, {}, verifyMetadata); - } - - function verifyMetadata(metadata) { - chrome.test.assertEq("image/jpeg", metadata.mimeType); - chrome.test.succeed(); - } - - TestFirstFilesystem(verifyFilesystem); -} - function GetMediaFileSystemMetadataTest() { function verifyFilesystem(filesystem) { var metadata = mediaGalleries.getMediaFileSystemMetadata(filesystem); @@ -83,7 +61,6 @@ chrome.test.runTests([ ReadDirectoryTest, ReadFileToBytesTest, - GetMetadataTest, GetMediaFileSystemMetadataTest, ]); })
diff --git a/chrome/test/data/extensions/context_menus/event_page/test.js b/chrome/test/data/extensions/context_menus/event_page/test.js index 64d7d92d..58357c8 100644 --- a/chrome/test/data/extensions/context_menus/event_page/test.js +++ b/chrome/test/data/extensions/context_menus/event_page/test.js
@@ -10,5 +10,6 @@ chrome.contextMenus.onClicked.addListener(function(info, tab) { chrome.test.assertTrue(tab.id != null); + chrome.test.assertEq(0, info.frameId); // 0 = main frame chrome.test.sendMessage("onClicked fired for " + info.menuItemId); });
diff --git a/chrome/test/data/extensions/context_menus/frames/test.js b/chrome/test/data/extensions/context_menus/frames/test.js index 2a2bad1..f6d9872b 100644 --- a/chrome/test/data/extensions/context_menus/frames/test.js +++ b/chrome/test/data/extensions/context_menus/frames/test.js
@@ -3,8 +3,13 @@ // found in the LICENSE file. window.onload = function() { + function onclick(info, tab) { + chrome.test.sendMessage('pageUrl=' + info.pageUrl + + ', frameUrl=' + info.frameUrl + + ', frameId=' + info.frameId); + } chrome.contextMenus.create( - {"title":"Page item", contexts: ["page"]}, + {'title':'Page item', contexts: ['page'], id: 'item1', onclick: onclick}, function() { if (!chrome.runtime.lastError) { chrome.contextMenus.create(
diff --git a/chrome/test/data/push_messaging/service_worker.js b/chrome/test/data/push_messaging/service_worker.js index e884e89..a338fdc1 100644 --- a/chrome/test/data/push_messaging/service_worker.js +++ b/chrome/test/data/push_messaging/service_worker.js
@@ -10,6 +10,11 @@ // "shownotification-without-waituntil" // - Display a Web Notification without using event.waitUntil(). this.onpush = function(event) { + if (event.data === null) { + sendMessageToClients('push', '[NULL]'); + return; + } + var data = event.data.text(); if (!data.startsWith('shownotification')) { sendMessageToClients('push', data);
diff --git a/chrome/test/data/webui/media_router/media_router_header_tests.js b/chrome/test/data/webui/media_router/media_router_header_tests.js index c3739c17..0df37f80 100644 --- a/chrome/test/data/webui/media_router/media_router_header_tests.js +++ b/chrome/test/data/webui/media_router/media_router_header_tests.js
@@ -72,10 +72,11 @@ setTimeout(done); }); - // Tests for 'close-button-click' event firing when the close button - // is clicked. + // Tests for 'close-dialog' event firing when the close button is + // clicked. test('close button click', function(done) { - header.addEventListener('close-button-click', function() { + header.addEventListener('close-dialog', function(data) { + assertFalse(data.detail.pressEscToClose); done(); }); MockInteractions.tap(header.$['close-button']);
diff --git a/chrome/test/data/webui/settings/certificate_manager_page_test.js b/chrome/test/data/webui/settings/certificate_manager_page_test.js new file mode 100644 index 0000000..b43390d --- /dev/null +++ b/chrome/test/data/webui/settings/certificate_manager_page_test.js
@@ -0,0 +1,142 @@ +// 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. + +cr.define('certificate_manager_page', function() { + /** + * A test version of CertificatesBrowserProxy. Provides helper methods + * for allowing tests to know when a method was called, as well as + * specifying mock responses. + * + * @constructor + * @implements {settings.CertificatesBrowserProxy} + */ + var TestCertificatesBrowserProxy = function() { + /** @private {!Map<string, !PromiseResolver>} */ + this.resolverMap_ = new Map(); + var wrapperMethods = [ + 'getCaCertificateTrust', + 'editCaCertificateTrust', + ]; + wrapperMethods.forEach(this.resetResolver, this); + + /** @private {!CaTrustInfo} */ + this.caTrustInfo_ = {ssl: true, email: true, objSign: true}; + }; + + TestCertificatesBrowserProxy.prototype = { + /** + * @param {string} methodName + * @return {!Promise} A promise that is resolved when the given method + * is called. + */ + whenCalled: function(methodName) { + return this.resolverMap_.get(methodName).promise; + }, + + /** + * Resets the PromiseResolver associated with the given method. + * @param {string} methodName + */ + resetResolver: function(methodName) { + this.resolverMap_.set(methodName, new PromiseResolver()); + }, + + /** + * @param {!CaTrustInfo} caTrustInfo + */ + setCaCertificateTrust: function(caTrustInfo) { + this.caTrustInfo_ = caTrustInfo; + }, + + /** @override */ + getCaCertificateTrust: function(id) { + this.resolverMap_.get('getCaCertificateTrust').resolve(id); + return Promise.resolve(this.caTrustInfo_); + }, + + /** @override */ + editCaCertificateTrust: function(id, ssl, email, objSign) { + this.resolverMap_.get('editCaCertificateTrust').resolve({ + id: id, ssl: ssl, email: email, objSign: objSign, + }); + return Promise.resolve(); + }, + }; + + /** @return {!CertificateSubnode} */ + var createSampleCertificateSubnode = function() { + return { + extractable: false, + id: 'dummyId', + name: 'dummyName', + policy: false, + readonly: false, + untrusted: false, + urlLocked: false, + }; + }; + + function registerCaTrustEditDialogTests() { + /** @type {?SettingsCaTrustEditDialogElement} */ + var dialog = null; + + /** @type {?TestCertificatesBrowserProxy} */ + var browserProxy = null; + + /** @type {!CertificateSubnode} */ + var model = createSampleCertificateSubnode(); + + /** @type {!CaTrustInfo} */ + var caTrustInfo = { ssl: true, email: false, objSign: false }; + + suite('CaTrustEditDialogTests', function() { + setup(function() { + browserProxy = new TestCertificatesBrowserProxy(); + browserProxy.setCaCertificateTrust(caTrustInfo); + + settings.CertificatesBrowserProxyImpl.instance_ = browserProxy; + PolymerTest.clearBody(); + dialog = document.createElement('settings-ca-trust-edit-dialog'); + dialog.model = model; + document.body.appendChild(dialog); + }); + + teardown(function() { dialog.remove(); }); + + test('Dialog', function() { + return browserProxy.whenCalled('getCaCertificateTrust').then( + function(id) { + assertEquals(model.id, id); + assertEquals(caTrustInfo.ssl, dialog.$.ssl.checked); + assertEquals(caTrustInfo.email, dialog.$.email.checked); + assertEquals(caTrustInfo.objSign, dialog.$.objSign.checked); + + // Simulate toggling all checkboxes. + MockInteractions.tap(dialog.$.ssl); + MockInteractions.tap(dialog.$.email); + MockInteractions.tap(dialog.$.objSign); + + // Simulate clicking 'OK'. + MockInteractions.tap(dialog.$.ok); + + return browserProxy.whenCalled('editCaCertificateTrust').then( + function(args) { + assertEquals(model.id, args.id); + // Checking that the values sent to C++ are reflecting the + // changes made by the user (toggling all checkboxes). + assertEquals(caTrustInfo.ssl, !args.ssl); + assertEquals(caTrustInfo.email, !args.email); + assertEquals(caTrustInfo.objSign, !args.objSign); + // Check that the dialog is closed. + assertFalse(dialog.$.dialog.opened); + }); + }); + }); + }); + } + + return { + registerCaTrustEditDialogTests: registerCaTrustEditDialogTests, + }; +});
diff --git a/chrome/test/data/webui/settings/change_picture_browsertest_chromeos.js b/chrome/test/data/webui/settings/change_picture_browsertest_chromeos.js index faa6a035..261f0cd 100644 --- a/chrome/test/data/webui/settings/change_picture_browsertest_chromeos.js +++ b/chrome/test/data/webui/settings/change_picture_browsertest_chromeos.js
@@ -85,13 +85,13 @@ assertTrue(!!cameraIcon); // Force the camera to be absent, even if it's actually present. - settings.ChangePicturePage.receiveCameraPresence(false); + cr.webUIListenerCallback('camera-presence-changed', false); Polymer.dom.flush(); expectTrue(cameraIcon.hidden); expectFalse(settingsCamera.cameraActive); - settings.ChangePicturePage.receiveCameraPresence(true); + cr.webUIListenerCallback('camera-presence-changed', true); Polymer.dom.flush(); expectFalse(cameraIcon.hidden); @@ -127,7 +127,7 @@ assertTrue(oldImage.hidden); return runAndResolveWhenSelectedItemChanged(function() { - settings.ChangePicturePage.receiveOldImage('fake-old-image.jpg'); + cr.webUIListenerCallback('old-image-changed', 'fake-old-image.jpg'); }).then(function() { Polymer.dom.flush(); @@ -172,7 +172,7 @@ function injectAndVerifyOldImage() { return runAndResolveWhenSelectedItemChanged(function() { - settings.ChangePicturePage.receiveOldImage('fake-old-image.jpg'); + cr.webUIListenerCallback('old-image-changed', 'fake-old-image.jpg'); }).then(function() { Polymer.dom.flush(); expectEquals('old', changePicture.selectedItem_.dataset.type);
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index 13cc0002b..1ebb584 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -135,6 +135,32 @@ mocha.run(); }); +/** + * Test fixture for chrome/browser/resources/settings/certificate_manager_page/. + * @constructor + * @extends {CrSettingsBrowserTest} +*/ +function CrSettingsCertificateManagerTest() {} + +CrSettingsCertificateManagerTest.prototype = { + __proto__: CrSettingsBrowserTest.prototype, + + /** @override */ + browsePreload: 'chrome://md-settings/certificate_manager_page/' + + 'certificate_manager_page.html', + + /** @override */ + extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([ + ROOT_PATH + 'ui/webui/resources/js/promise_resolver.js', + 'certificate_manager_page_test.js', + ]), +}; + +TEST_F('CrSettingsCertificateManagerTest', 'CertificateManager', function() { + certificate_manager_page.registerCaTrustEditDialogTests(); + mocha.run(); +}); + GEN('#if defined(OS_CHROMEOS)'); /** * Test fixture for device-page.
diff --git a/chrome/tools/build/chromeos/FILES.cfg b/chrome/tools/build/chromeos/FILES.cfg index cfe7217..855cabaf 100644 --- a/chrome/tools/build/chromeos/FILES.cfg +++ b/chrome/tools/build/chromeos/FILES.cfg
@@ -73,10 +73,6 @@ 'buildtype': ['dev', 'official'], }, { - 'filename': 'lib/libexif.so', - 'buildtype': ['dev', 'official'], - }, - { 'filename': 'locales', 'buildtype': ['dev', 'official'], },
diff --git a/chrome/tools/build/mac/TESTS b/chrome/tools/build/mac/TESTS index d77adcf..75986ce7 100644 --- a/chrome/tools/build/mac/TESTS +++ b/chrome/tools/build/mac/TESTS
@@ -1,2 +1 @@ sync_integration_tests -exif.so
diff --git a/chrome/tools/build/mac/dump_product_syms b/chrome/tools/build/mac/dump_product_syms index 6abe5135..d42f0f6 100755 --- a/chrome/tools/build/mac/dump_product_syms +++ b/chrome/tools/build/mac/dump_product_syms
@@ -80,7 +80,6 @@ "${SRC_APP_NAME} Framework.framework" "${SRC_APP_NAME} Helper.app" "crashpad_handler" - "exif.so" ) # PDF.plugin is optional. Only include it if present.
diff --git a/chrome/tools/build/win/FILES.cfg b/chrome/tools/build/win/FILES.cfg index d245f97..ef62aa1 100644 --- a/chrome/tools/build/win/FILES.cfg +++ b/chrome/tools/build/win/FILES.cfg
@@ -129,11 +129,6 @@ 'optional': ['dev', 'official'], }, { - 'filename': 'libexif.dll', - 'buildtype': ['dev', 'official'], - 'filegroup': ['default', 'symsrc'], - }, - { 'filename': 'locales/ar.pak', 'buildtype': ['dev', 'official'], },
diff --git a/chrome/unit_tests.isolate b/chrome/unit_tests.isolate index b76c4e1..7639374 100644 --- a/chrome/unit_tests.isolate +++ b/chrome/unit_tests.isolate
@@ -96,7 +96,6 @@ 'variables': { 'files': [ '<(PRODUCT_DIR)/<(mac_product_name) Framework.framework/', - '<(PRODUCT_DIR)/exif.so', '<(PRODUCT_DIR)/osmesa.so', '<(PRODUCT_DIR)/test_data/chrome/safe_browsing_dmg/', ], @@ -106,7 +105,6 @@ 'variables': { 'files': [ '<(PRODUCT_DIR)/<(mac_product_name) Framework.framework.dSYM/', - '<(PRODUCT_DIR)/exif.so.dSYM/', '<(PRODUCT_DIR)/osmesa.so.dSYM/', '<(PRODUCT_DIR)/unit_tests.dSYM/', ], @@ -120,7 +118,6 @@ '../ui/base/glib/', '<(PRODUCT_DIR)/blacklist_test_dll_1.dll', '<(PRODUCT_DIR)/chrome_elf.dll', - '<(PRODUCT_DIR)/libexif.dll', '<(PRODUCT_DIR)/osmesa.dll', '<(PRODUCT_DIR)/verifier_test_dll_1.dll', '<(PRODUCT_DIR)/verifier_test_dll_2.dll', @@ -149,7 +146,6 @@ 'files': [ '../chromeos/test/data/network/', '<(PRODUCT_DIR)/keyboard_resources.pak', - '<(PRODUCT_DIR)/libexif.so', '<(PRODUCT_DIR)/test_data/chrome/browser/resources/chromeos/', ], },
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn index 22435b7..f7c0d0e 100644 --- a/chrome/utility/BUILD.gn +++ b/chrome/utility/BUILD.gn
@@ -92,12 +92,6 @@ ".", "..") } - - # Linux should use system libexif - if (!is_linux || is_chromeos) { - # TODO(thestig): Properly support building on Linux and ChromeOS. - deps += [ "//third_party/libexif" ] - } } if (use_nss_certs) {
diff --git a/chrome/utility/extensions/extensions_handler.cc b/chrome/utility/extensions/extensions_handler.cc index fdd6dfd..9518d9d 100644 --- a/chrome/utility/extensions/extensions_handler.cc +++ b/chrome/utility/extensions/extensions_handler.cc
@@ -14,7 +14,6 @@ #include "chrome/common/extensions/chrome_utility_extensions_messages.h" #include "chrome/common/media_galleries/metadata_types.h" #include "chrome/utility/chrome_content_utility_client.h" -#include "chrome/utility/media_galleries/image_metadata_extractor.h" #include "chrome/utility/media_galleries/ipc_data_source.h" #include "chrome/utility/media_galleries/media_metadata_parser.h" #include "content/public/common/content_paths.h" @@ -80,9 +79,6 @@ // static void ExtensionsHandler::PreSandboxStartup() { - // Initialize libexif for image metadata parsing. - metadata::ImageMetadataExtractor::InitializeLibrary(); - // Initialize media libraries for media file validation. media::InitializeMediaLibrary(); }
diff --git a/chrome/utility/media_galleries/image_metadata_extractor.cc b/chrome/utility/media_galleries/image_metadata_extractor.cc deleted file mode 100644 index 471d481a..0000000 --- a/chrome/utility/media_galleries/image_metadata_extractor.cc +++ /dev/null
@@ -1,465 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/utility/media_galleries/image_metadata_extractor.h" - -extern "C" { -#include <libexif/exif-data.h> -#include <libexif/exif-loader.h> -} // extern "C" -#include <stddef.h> -#include <stdint.h> - -#include "base/bind.h" -#include "base/callback.h" -#include "base/files/file_path.h" -#include "base/lazy_instance.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/numerics/safe_conversions.h" -#include "base/path_service.h" -#include "base/scoped_native_library.h" -#include "base/strings/string_number_conversions.h" -#include "build/build_config.h" -#include "content/public/common/content_paths.h" -#include "media/base/data_source.h" -#include "net/base/io_buffer.h" - -namespace metadata { - -namespace { - -const size_t kMaxBufferSize = 50 * 1024 * 1024; // Arbitrary maximum of 50MB. - -typedef base::Callback<void(const scoped_refptr<net::DrainableIOBuffer>&)> - GotImageCallback; - -void FinishGetImageBytes( - const scoped_refptr<net::DrainableIOBuffer>& buffer, - media::DataSource* source, - const GotImageCallback& callback, - int bytes_read) { - if (bytes_read == media::DataSource::kReadError) { - callback.Run(NULL); - return; - } - - buffer->DidConsume(bytes_read); - // Didn't get the whole file. Continue reading to get the rest. - if (buffer->BytesRemaining() > 0) { - source->Read(0, buffer->BytesRemaining(), - reinterpret_cast<uint8_t*>(buffer->data()), - base::Bind(&FinishGetImageBytes, buffer, - base::Unretained(source), callback)); - return; - } - - buffer->SetOffset(0); - callback.Run(buffer); -} - -void GetImageBytes( - media::DataSource* source, - const GotImageCallback& callback) { - int64_t size64 = 0; - if (!source->GetSize(&size64) || - base::saturated_cast<size_t>(size64) > kMaxBufferSize) { - return callback.Run(NULL); - } - int size = base::checked_cast<int>(size64); - - scoped_refptr<net::DrainableIOBuffer> buffer( - new net::DrainableIOBuffer(new net::IOBuffer(size), size)); - source->Read(0, buffer->BytesRemaining(), - reinterpret_cast<uint8_t*>(buffer->data()), - base::Bind(&FinishGetImageBytes, buffer, - base::Unretained(source), callback)); -} - -class ExifFunctions { - public: - ExifFunctions() : exif_loader_write_func_(NULL), - exif_loader_new_func_(NULL), - exif_loader_unref_func_(NULL), - exif_loader_get_data_func_(NULL), - exif_data_free_func_(NULL), - exif_data_get_byte_order_func_(NULL), - exif_get_short_func_(NULL), - exif_get_long_func_(NULL), - exif_get_rational_func_(NULL), - exif_entry_get_value_func_(NULL), - exif_content_get_entry_func_(NULL) { - } - - bool Initialize(const base::FilePath& module_dir) { - if (exif_lib_.is_valid()) - return true; - -#if defined(OS_WIN) - base::FilePath module_path = module_dir.AppendASCII("libexif.dll"); -#elif defined(OS_MACOSX) - base::FilePath module_path = module_dir.AppendASCII("exif.so"); -#elif defined(OS_CHROMEOS) - // On ChromeOS, we build and distribute our own version of libexif. - base::FilePath module_path = module_dir.AppendASCII("libexif.so"); -#else - // On Linux-like systems, we use the system libexif. - base::FilePath module_path = base::FilePath().AppendASCII("libexif.so.12"); -#endif - - base::NativeLibraryLoadError error; - base::ScopedNativeLibrary lib(base::LoadNativeLibrary(module_path, &error)); - if (!lib.is_valid()) { - LOG(ERROR) << "Couldn't load libexif. " << error.ToString(); - return false; - } - - if (!GetFunctionPointer(lib, &exif_loader_write_func_, - "exif_loader_write") || - !GetFunctionPointer(lib, &exif_loader_new_func_, "exif_loader_new") || - !GetFunctionPointer(lib, &exif_loader_unref_func_, - "exif_loader_unref") || - !GetFunctionPointer(lib, &exif_loader_get_data_func_, - "exif_loader_get_data") || - !GetFunctionPointer(lib, &exif_data_free_func_, "exif_data_free") || - !GetFunctionPointer(lib, &exif_data_get_byte_order_func_, - "exif_data_get_byte_order") || - !GetFunctionPointer(lib, &exif_get_short_func_, "exif_get_short") || - !GetFunctionPointer(lib, &exif_get_long_func_, "exif_get_long") || - !GetFunctionPointer(lib, &exif_get_rational_func_, - "exif_get_rational") || - !GetFunctionPointer(lib, &exif_entry_get_value_func_, - "exif_entry_get_value") || - !GetFunctionPointer(lib, &exif_content_get_entry_func_, - "exif_content_get_entry")) { - return false; - } - - exif_lib_.Reset(lib.Release()); - return true; - } - - ExifData* ParseExifFromBuffer(unsigned char* buffer, unsigned int size) { - DCHECK(exif_lib_.is_valid()); - ExifLoader* loader = exif_loader_new_func_(); - exif_loader_write_func_(loader, buffer, size); - - ExifData* data = exif_loader_get_data_func_(loader); - - exif_loader_unref_func_(loader); - loader = NULL; - - return data; - } - - void ExifDataFree(ExifData* data) { - DCHECK(exif_lib_.is_valid()); - return exif_data_free_func_(data); - } - - void ExtractInt(ExifData* data, ExifTag tag, int* result) { - DCHECK(exif_lib_.is_valid()); - DCHECK(result); - - ExifEntry* entry = ExifContentGetEntry(data, tag); - if (!entry) - return; - - ExifByteOrder order = exif_data_get_byte_order_func_(data); - switch (entry->format) { - case EXIF_FORMAT_SHORT: { - ExifShort v = exif_get_short_func_(entry->data, order); - *result = base::checked_cast<int>(v); - break; - } - case EXIF_FORMAT_LONG: { - ExifLong v = exif_get_long_func_(entry->data, order); - // Ignore values that don't fit in a signed int - likely invalid data. - if (base::IsValueInRangeForNumericType<int>(v)) - *result = base::checked_cast<int>(v); - break; - } - default: { - // Ignore all other entry formats. - } - } - } - - void ExtractDouble(ExifData* data, ExifTag tag, double* result) { - DCHECK(exif_lib_.is_valid()); - DCHECK(result); - - ExifEntry* entry = ExifContentGetEntry(data, tag); - if (!entry) - return; - - ExifByteOrder order = exif_data_get_byte_order_func_(data); - - if (entry->format == EXIF_FORMAT_RATIONAL) { - ExifRational v = exif_get_rational_func_(entry->data, order); - *result = base::checked_cast<double>(v.numerator) / - base::checked_cast<double>(v.denominator); - } - } - - void ExtractString(ExifData* data, ExifTag tag, std::string* result) { - DCHECK(exif_lib_.is_valid()); - DCHECK(result); - - ExifEntry* entry = ExifContentGetEntry(data, tag); - if (!entry) - return; - - char buf[1024]; - exif_entry_get_value_func_(entry, buf, sizeof(buf)); - *result = buf; - } - - private: - // Exported by libexif. - typedef unsigned char (*ExifLoaderWriteFunc)(ExifLoader* eld, - unsigned char* buf, - unsigned int len); - typedef ExifLoader* (*ExifLoaderNewFunc)(); - typedef void (*ExifLoaderUnrefFunc)(ExifLoader* loader); - typedef ExifData* (*ExifLoaderGetDataFunc)(ExifLoader* loader); - typedef void (*ExifDataFreeFunc)(ExifData* data); - typedef ExifByteOrder (*ExifDataGetByteOrderFunc)(ExifData* data); - typedef ExifShort (*ExifGetShortFunc)(const unsigned char *buf, - ExifByteOrder order); - typedef ExifLong (*ExifGetLongFunc)(const unsigned char *buf, - ExifByteOrder order); - typedef ExifRational (*ExifGetRationalFunc)(const unsigned char *buf, - ExifByteOrder order); - typedef const char* (*ExifEntryGetValueFunc)(ExifEntry *e, char *val, - unsigned int maxlen); - typedef ExifEntry* (*ExifContentGetEntryFunc)(ExifContent* content, - ExifTag tag); - - template<typename FunctionType> - bool GetFunctionPointer(const base::ScopedNativeLibrary& lib, - FunctionType* function, const char* name) { - DCHECK(lib.is_valid()); - DCHECK(function); - DCHECK(!(*function)); - *function = reinterpret_cast<FunctionType>( - lib.GetFunctionPointer(name)); - DLOG_IF(WARNING, !(*function)) << "Missing " << name; - return *function != NULL; - } - - // Redefines exif_content_get_entry macro in terms of function pointer. - ExifEntry* ExifContentGetEntry(ExifData* data, ExifTag tag) { - DCHECK(exif_lib_.is_valid()); - const ExifIfd ifds[] = - { EXIF_IFD_0, EXIF_IFD_1, EXIF_IFD_EXIF, EXIF_IFD_GPS }; - - for (size_t i = 0; i < arraysize(ifds); ++i) { - ExifEntry* entry = exif_content_get_entry_func_(data->ifd[ifds[i]], tag); - if (entry) - return entry; - } - - return NULL; - } - - ExifLoaderWriteFunc exif_loader_write_func_; - ExifLoaderNewFunc exif_loader_new_func_; - ExifLoaderUnrefFunc exif_loader_unref_func_; - ExifLoaderGetDataFunc exif_loader_get_data_func_; - ExifDataFreeFunc exif_data_free_func_; - ExifDataGetByteOrderFunc exif_data_get_byte_order_func_; - ExifGetShortFunc exif_get_short_func_; - ExifGetLongFunc exif_get_long_func_; - ExifGetRationalFunc exif_get_rational_func_; - ExifEntryGetValueFunc exif_entry_get_value_func_; - ExifContentGetEntryFunc exif_content_get_entry_func_; - - base::ScopedNativeLibrary exif_lib_; - DISALLOW_COPY_AND_ASSIGN(ExifFunctions); -}; - -static base::LazyInstance<ExifFunctions> g_exif_lib = LAZY_INSTANCE_INITIALIZER; - -} // namespace - -// static -bool ImageMetadataExtractor::InitializeLibrary() { - base::FilePath media_path; - if (!PathService::Get(content::DIR_MEDIA_LIBS, &media_path)) - return false; - return g_exif_lib.Get().Initialize(media_path); -} - -// static -bool ImageMetadataExtractor::InitializeLibraryForTesting() { - base::FilePath module_dir; - if (!PathService::Get(base::DIR_EXE, &module_dir)) - return false; - return g_exif_lib.Get().Initialize(module_dir); -} - -ImageMetadataExtractor::ImageMetadataExtractor() - : extracted_(false), - width_(-1), - height_(-1), - rotation_(-1), - x_resolution_(-1), - y_resolution_(-1), - exposure_time_sec_(-1), - flash_fired_(false), - f_number_(-1), - focal_length_mm_(-1), - iso_equivalent_(-1) { -} - -ImageMetadataExtractor::~ImageMetadataExtractor() { -} - -void ImageMetadataExtractor::Extract(media::DataSource* source, - const DoneCallback& callback) { - DCHECK(!extracted_); - - GetImageBytes(source, base::Bind(&ImageMetadataExtractor::FinishExtraction, - base::Unretained(this), callback)); -} - -int ImageMetadataExtractor::width() const { - DCHECK(extracted_); - return width_; -} - -int ImageMetadataExtractor::height() const { - DCHECK(extracted_); - return height_; -} - -int ImageMetadataExtractor::rotation() const { - DCHECK(extracted_); - return rotation_; -} - -double ImageMetadataExtractor::x_resolution() const { - DCHECK(extracted_); - return x_resolution_; -} - -double ImageMetadataExtractor::y_resolution() const { - DCHECK(extracted_); - return y_resolution_; -} - -const std::string& ImageMetadataExtractor::date() const { - DCHECK(extracted_); - return date_; -} - -const std::string& ImageMetadataExtractor::camera_make() const { - DCHECK(extracted_); - return camera_make_; -} - -const std::string& ImageMetadataExtractor::camera_model() const { - DCHECK(extracted_); - return camera_model_; -} - -double ImageMetadataExtractor::exposure_time_sec() const { - DCHECK(extracted_); - return exposure_time_sec_; -} - -bool ImageMetadataExtractor::flash_fired() const { - DCHECK(extracted_); - return flash_fired_; -} - -double ImageMetadataExtractor::f_number() const { - DCHECK(extracted_); - return f_number_; -} - -double ImageMetadataExtractor::focal_length_mm() const { - DCHECK(extracted_); - return focal_length_mm_; -} - -int ImageMetadataExtractor::iso_equivalent() const { - DCHECK(extracted_); - return iso_equivalent_; -} - -void ImageMetadataExtractor::FinishExtraction( - const DoneCallback& callback, - const scoped_refptr<net::DrainableIOBuffer>& buffer) { - if (!buffer.get()) { - callback.Run(false); - return; - } - - ExifData* data = g_exif_lib.Get().ParseExifFromBuffer( - reinterpret_cast<unsigned char*>(buffer->data()), - buffer->BytesRemaining()); - - if (!data) { - callback.Run(false); - return; - } - - g_exif_lib.Get().ExtractInt(data, EXIF_TAG_IMAGE_WIDTH, &width_); - g_exif_lib.Get().ExtractInt(data, EXIF_TAG_IMAGE_LENGTH, &height_); - - // We ignore the mirrored-aspect of the mirrored-orientations and just - // indicate the rotation. Mirrored-orientations are very rare. - int orientation = 0; - g_exif_lib.Get().ExtractInt(data, EXIF_TAG_ORIENTATION, &orientation); - switch (orientation) { - case 1: - case 2: - rotation_ = 0; - break; - case 3: - case 4: - rotation_ = 180; - break; - case 5: - case 6: - rotation_ = 90; - break; - case 7: - case 8: - rotation_ = 270; - break; - } - - g_exif_lib.Get().ExtractDouble(data, EXIF_TAG_X_RESOLUTION, &x_resolution_); - g_exif_lib.Get().ExtractDouble(data, EXIF_TAG_Y_RESOLUTION, &y_resolution_); - - g_exif_lib.Get().ExtractString(data, EXIF_TAG_DATE_TIME, &date_); - - g_exif_lib.Get().ExtractString(data, EXIF_TAG_MAKE, &camera_make_); - g_exif_lib.Get().ExtractString(data, EXIF_TAG_MODEL, &camera_model_); - g_exif_lib.Get().ExtractDouble(data, EXIF_TAG_EXPOSURE_TIME, - &exposure_time_sec_); - - int flash_value = -1; - g_exif_lib.Get().ExtractInt(data, EXIF_TAG_FLASH, &flash_value); - if (flash_value >= 0) { - flash_fired_ = (flash_value & 0x1) != 0; - } - - g_exif_lib.Get().ExtractDouble(data, EXIF_TAG_FNUMBER, &f_number_); - g_exif_lib.Get().ExtractDouble(data, EXIF_TAG_FOCAL_LENGTH, - &focal_length_mm_); - g_exif_lib.Get().ExtractInt(data, EXIF_TAG_ISO_SPEED_RATINGS, - &iso_equivalent_); - - g_exif_lib.Get().ExifDataFree(data); - - extracted_ = true; - - callback.Run(true); -} - -} // namespace metadata
diff --git a/chrome/utility/media_galleries/image_metadata_extractor.h b/chrome/utility/media_galleries/image_metadata_extractor.h deleted file mode 100644 index 5a5e9b0..0000000 --- a/chrome/utility/media_galleries/image_metadata_extractor.h +++ /dev/null
@@ -1,95 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_UTILITY_MEDIA_GALLERIES_IMAGE_METADATA_EXTRACTOR_H_ -#define CHROME_UTILITY_MEDIA_GALLERIES_IMAGE_METADATA_EXTRACTOR_H_ - -#include <string> - -#include "base/callback_forward.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" - -namespace media { -class DataSource; -} - -namespace net { -class DrainableIOBuffer; -} - -namespace metadata { - -// Extracts a basic set of image metadata tags. Users must initialize the -// library before use. Each class instance is 'one-time-use', and cannot be used -// to extract metadata from multiple images. -class ImageMetadataExtractor { - public: - typedef base::Callback<void(bool)> DoneCallback; - - // One of these two is required before use of this class. - static bool InitializeLibrary(); - static bool InitializeLibraryForTesting(); - - ImageMetadataExtractor(); - ~ImageMetadataExtractor(); - - // |callback| called with whether or not the extraction succeeded. Should - // only be called once. - void Extract(media::DataSource* source, const DoneCallback& callback); - - // All below methods require Extract to have already succeeded. - // Returns -1 if file does not define a width or height. - int width() const; - int height() const; - - // In degrees. - int rotation() const; - - // In pixels per inch. - double x_resolution() const; - double y_resolution() const; - - // In the same string form as the original file. - const std::string& date() const; - - const std::string& camera_make() const; - const std::string& camera_model() const; - double exposure_time_sec() const; - bool flash_fired() const; - double f_number() const; - double focal_length_mm() const; - int iso_equivalent() const; - - private: - // Second half of the Extract method. - void FinishExtraction(const DoneCallback& callback, - const scoped_refptr<net::DrainableIOBuffer>& buffer); - - bool extracted_; - - int width_; - int height_; - - int rotation_; - - double x_resolution_; - double y_resolution_; - - std::string date_; - - std::string camera_make_; - std::string camera_model_; - double exposure_time_sec_; - bool flash_fired_; - double f_number_; - double focal_length_mm_; - int iso_equivalent_; - - DISALLOW_COPY_AND_ASSIGN(ImageMetadataExtractor); -}; - -} // namespace metadata - -#endif // CHROME_UTILITY_MEDIA_GALLERIES_IMAGE_METADATA_EXTRACTOR_H_
diff --git a/chrome/utility/media_galleries/image_metadata_extractor_unittest.cc b/chrome/utility/media_galleries/image_metadata_extractor_unittest.cc deleted file mode 100644 index 06206bb..0000000 --- a/chrome/utility/media_galleries/image_metadata_extractor_unittest.cc +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/bind.h" -#include "base/files/file_path.h" -#include "base/path_service.h" -#include "base/run_loop.h" -#include "chrome/common/chrome_paths.h" -#include "chrome/utility/media_galleries/image_metadata_extractor.h" -#include "media/filters/file_data_source.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace metadata { - -void QuitLoop(base::RunLoop* loop, bool* output, bool success) { - loop->Quit(); - *output = success; -} - -base::FilePath GetTestDataFilePath(const std::string& filename) { - base::FilePath path; - EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); - path = path.AppendASCII("extensions").AppendASCII("api_test") - .AppendASCII("wallpaper").AppendASCII(filename); - return path; -} - -scoped_ptr<ImageMetadataExtractor> GetExtractor( - const std::string& filename, - bool expected_result) { - EXPECT_TRUE(ImageMetadataExtractor::InitializeLibraryForTesting()); - - media::FileDataSource source; - base::FilePath test_path; - - EXPECT_TRUE(source.Initialize(GetTestDataFilePath(filename))); - - scoped_ptr<ImageMetadataExtractor> extractor(new ImageMetadataExtractor); - - base::RunLoop loop; - bool extracted = false; - extractor->Extract(&source, base::Bind(&QuitLoop, &loop, &extracted)); - EXPECT_EQ(expected_result, extracted); - - return extractor; -} - -TEST(ImageMetadataExtractorTest, JPGFile) { - scoped_ptr<ImageMetadataExtractor> extractor = - GetExtractor("test.jpg", true); - - EXPECT_EQ(5616, extractor->width()); - EXPECT_EQ(3744, extractor->height()); - EXPECT_EQ(0, extractor->rotation()); - EXPECT_EQ(300.0, extractor->x_resolution()); - EXPECT_EQ(300.0, extractor->y_resolution()); - EXPECT_EQ("2012:03:01 17:06:07", extractor->date()); - EXPECT_EQ("Canon", extractor->camera_make()); - EXPECT_EQ("Canon EOS 5D Mark II", extractor->camera_model()); - EXPECT_EQ(0.01, extractor->exposure_time_sec()); - EXPECT_FALSE(extractor->flash_fired()); - EXPECT_EQ(3.2, extractor->f_number()); - EXPECT_EQ(100, extractor->focal_length_mm()); - EXPECT_EQ(1600, extractor->iso_equivalent()); -} - -TEST(ImageMetadataExtractorTest, PNGFile) { - GetExtractor("test.png", false); -} - -TEST(ImageMetadataExtractorTest, NonImageFile) { - GetExtractor("test.js", false); -} - -} // namespace metadata
diff --git a/chrome/utility/media_galleries/media_metadata_parser.cc b/chrome/utility/media_galleries/media_metadata_parser.cc index 3d6e733..d5df856 100644 --- a/chrome/utility/media_galleries/media_metadata_parser.cc +++ b/chrome/utility/media_galleries/media_metadata_parser.cc
@@ -12,7 +12,6 @@ #include "base/strings/string_util.h" #include "base/task_runner_util.h" #include "base/threading/thread.h" -#include "chrome/utility/media_galleries/image_metadata_extractor.h" #include "media/base/audio_video_metadata_extractor.h" #include "media/base/data_source.h" #include "net/base/mime_sniffer.h" @@ -36,17 +35,6 @@ destination->reset(new int(value)); } -void SetDoubleScopedPtr(double value, scoped_ptr<double>* destination) { - DCHECK(destination); - if (value >= 0) - destination->reset(new double(value)); -} - -void SetBoolScopedPtr(bool value, scoped_ptr<bool>* destination) { - DCHECK(destination); - destination->reset(new bool(value)); -} - // This runs on |media_thread_|, as the underlying FFmpeg operation is // blocking, and the utility thread must not be blocked, so the media file // bytes can be sent from the browser process to the utility process. @@ -124,38 +112,6 @@ callback.Run(*metadata, *attached_images); } -void FinishParseImageMetadata( - ImageMetadataExtractor* extractor, const std::string& mime_type, - MediaMetadataParser::MetadataCallback callback, bool extract_success) { - DCHECK(extractor); - MediaMetadataParser::MediaMetadata metadata; - metadata.mime_type = mime_type; - - if (!extract_success) { - callback.Run(metadata, std::vector<AttachedImage>()); - return; - } - - SetIntScopedPtr(extractor->height(), &metadata.height); - SetIntScopedPtr(extractor->width(), &metadata.width); - - SetIntScopedPtr(extractor->rotation(), &metadata.rotation); - - SetDoubleScopedPtr(extractor->x_resolution(), &metadata.x_resolution); - SetDoubleScopedPtr(extractor->y_resolution(), &metadata.y_resolution); - SetBoolScopedPtr(extractor->flash_fired(), &metadata.flash_fired); - SetStringScopedPtr(extractor->camera_make(), &metadata.camera_make); - SetStringScopedPtr(extractor->camera_model(), &metadata.camera_model); - SetDoubleScopedPtr(extractor->exposure_time_sec(), - &metadata.exposure_time_seconds); - - SetDoubleScopedPtr(extractor->f_number(), &metadata.f_number); - SetDoubleScopedPtr(extractor->focal_length_mm(), &metadata.focal_length_mm); - SetDoubleScopedPtr(extractor->iso_equivalent(), &metadata.iso_equivalent); - - callback.Run(metadata, std::vector<AttachedImage>()); -} - } // namespace MediaMetadataParser::MediaMetadataParser(media::DataSource* source, @@ -186,15 +142,6 @@ return; } - if (base::StartsWith(mime_type_, "image/", base::CompareCase::SENSITIVE)) { - ImageMetadataExtractor* extractor = new ImageMetadataExtractor; - extractor->Extract( - source_, - base::Bind(&FinishParseImageMetadata, base::Owned(extractor), - mime_type_, callback)); - return; - } - callback.Run(MediaMetadata(), std::vector<AttachedImage>()); }
diff --git a/chrome/utility/media_galleries/media_metadata_parser.h b/chrome/utility/media_galleries/media_metadata_parser.h index 44c44acc..aee7a7fe 100644 --- a/chrome/utility/media_galleries/media_metadata_parser.h +++ b/chrome/utility/media_galleries/media_metadata_parser.h
@@ -25,10 +25,9 @@ namespace metadata { // This class takes a MIME type and data source and parses its metadata. It -// handles audio, video, and images. It delegates its operations to FFMPEG, -// libexif, etc. This class lives and operates on the utility thread of the -// utility process, as we wish to sandbox potentially dangerous operations -// on user-provided data. +// handles audio, video, and images. It delegates its operations to FFMPEG. +// This class lives and operates on the utility thread of the utility process, +// as we wish to sandbox potentially dangerous operations on user-provided data. class MediaMetadataParser { public: typedef extensions::api::media_galleries::MediaMetadata MediaMetadata;
diff --git a/chromecast/base/metrics/cast_metrics_helper.cc b/chromecast/base/metrics/cast_metrics_helper.cc index 8f12042b..75cfa6d 100644 --- a/chromecast/base/metrics/cast_metrics_helper.cc +++ b/chromecast/base/metrics/cast_metrics_helper.cc
@@ -4,14 +4,21 @@ #include "chromecast/base/metrics/cast_metrics_helper.h" +#include <string> +#include <vector> + #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/json/json_string_value_serializer.h" #include "base/location.h" +#include "base/memory/scoped_ptr.h" #include "base/metrics/histogram.h" #include "base/metrics/user_metrics.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" +#include "base/time/time.h" +#include "base/values.h" #include "chromecast/base/metrics/cast_histograms.h" #include "chromecast/base/metrics/grouped_histogram.h" @@ -33,6 +40,14 @@ const char kMetricsNameAppInfoDelimiter = '#'; +scoped_ptr<std::string> SerializeToJson(const base::Value& value) { + scoped_ptr<std::string> json_str(new std::string()); + JSONStringValueSerializer serializer(json_str.get()); + if (!serializer.Serialize(value)) + json_str.reset(nullptr); + return json_str; +} + } // namespace // static @@ -276,5 +291,16 @@ 50); } +void CastMetricsHelper::RecordSimpleActionWithValue(const std::string& event, + int value) { + scoped_ptr<base::DictionaryValue> cast_event(new base::DictionaryValue()); + cast_event->SetString("name", event); + base::TimeTicks now = base::TimeTicks::Now(); + cast_event->SetDouble("time", now.ToInternalValue()); + cast_event->SetInteger("value", value); + const std::string message = *SerializeToJson(*cast_event.get()).get(); + RecordSimpleAction(message); +} + } // namespace metrics } // namespace chromecast
diff --git a/chromecast/base/metrics/cast_metrics_helper.h b/chromecast/base/metrics/cast_metrics_helper.h index 251261de..e8af9cf7 100644 --- a/chromecast/base/metrics/cast_metrics_helper.h +++ b/chromecast/base/metrics/cast_metrics_helper.h
@@ -77,6 +77,9 @@ // This is used as an in-place replacement of content::RecordComputedAction(). virtual void RecordSimpleAction(const std::string& action); + // Logs an event with an integer value + virtual void RecordSimpleActionWithValue(const std::string& event, int value); + // Logs UMA record of the time the app made its first paint. virtual void LogTimeToFirstPaint();
diff --git a/chromecast/chromecast.gyp b/chromecast/chromecast.gyp index daab117a..6bb8a14 100644 --- a/chromecast/chromecast.gyp +++ b/chromecast/chromecast.gyp
@@ -297,7 +297,7 @@ ], }], ], - 'pak_output': '<(PRODUCT_DIR)/assets/cast_shell.pak', + 'pak_output': '<(PRODUCT_DIR)/cast_shell.pak', }, 'includes': [ '../build/repack_action.gypi' ], }, @@ -563,6 +563,7 @@ 'target_name': 'cast_shell_icudata', 'type': 'none', 'dependencies': [ + 'cast_shell_pak', '../third_party/icu/icu.gyp:icudata', '../v8/tools/gyp/v8.gyp:v8_external_snapshot', ], @@ -570,6 +571,7 @@ 'dest_path': '<(cast_shell_assets_path)', 'src_files': [ '<(PRODUCT_DIR)/icudtl.dat', + '<(PRODUCT_DIR)/cast_shell.pak', ], 'renaming_sources': [ '<(PRODUCT_DIR)/natives_blob.bin',
diff --git a/chromecast/media/cma/base/buffering_controller.cc b/chromecast/media/cma/base/buffering_controller.cc index 8137d9ce..4e32804c 100644 --- a/chromecast/media/cma/base/buffering_controller.cc +++ b/chromecast/media/cma/base/buffering_controller.cc
@@ -22,6 +22,7 @@ buffering_notification_cb_(buffering_notification_cb), is_buffering_(false), begin_buffering_time_(base::Time()), + last_buffer_end_time_(base::Time()), initial_buffering_(true), weak_factory_(this) { weak_this_ = weak_factory_.GetWeakPtr(); @@ -151,9 +152,10 @@ // End buffering. if (is_buffering_prv && !is_buffering_) { - // TODO(damienv): |buffering_user_time| could be a UMA histogram. base::Time current_time = base::Time::Now(); base::TimeDelta buffering_user_time = current_time - begin_buffering_time_; + chromecast::metrics::CastMetricsHelper* metrics_helper = + chromecast::metrics::CastMetricsHelper::GetInstance(); CMALOG(kLogControl) << "Buffering took: " << buffering_user_time.InMilliseconds() << "ms"; @@ -161,10 +163,22 @@ initial_buffering_ ? chromecast::metrics::CastMetricsHelper::kInitialBuffering : chromecast::metrics::CastMetricsHelper::kBufferingAfterUnderrun; - chromecast::metrics::CastMetricsHelper::GetInstance()->LogTimeToBufferAv( - buffering_type, buffering_user_time); + metrics_helper->LogTimeToBufferAv(buffering_type, buffering_user_time); + if (!initial_buffering_) { + base::TimeDelta time_between_buffering = + begin_buffering_time_ - last_buffer_end_time_; + CMALOG(kLogControl) + << "Time since last buffering event: " + << time_between_buffering.InMilliseconds() << "ms"; + metrics_helper->RecordSimpleActionWithValue( + "Cast.Platform.PlayTimeBeforeAutoPause", + time_between_buffering.InMilliseconds()); + metrics_helper->RecordSimpleActionWithValue( + "Cast.Platform.AutoPauseTime", buffering_user_time.InMilliseconds()); + } // Only the first buffering report is considered "initial buffering". + last_buffer_end_time_ = current_time; initial_buffering_ = false; }
diff --git a/chromecast/media/cma/base/buffering_controller.h b/chromecast/media/cma/base/buffering_controller.h index b0ccece..92ed40a 100644 --- a/chromecast/media/cma/base/buffering_controller.h +++ b/chromecast/media/cma/base/buffering_controller.h
@@ -92,6 +92,7 @@ // Start time of a re-buffering phase. base::Time begin_buffering_time_; + base::Time last_buffer_end_time_; bool initial_buffering_; // Buffering level for each individual stream.
diff --git a/chromeos/cryptohome/homedir_methods.cc b/chromeos/cryptohome/homedir_methods.cc index 81bf153..bd276ece 100644 --- a/chromeos/cryptohome/homedir_methods.cc +++ b/chromeos/cryptohome/homedir_methods.cc
@@ -278,6 +278,14 @@ weak_ptr_factory_.GetWeakPtr(), callback)); } + void RenameCryptohome(const Identification& id_from, + const Identification& id_to, + const Callback& callback) override { + DBusThreadManager::Get()->GetCryptohomeClient()->RenameCryptohome( + id_from, id_to, base::Bind(&HomedirMethodsImpl::OnBaseReplyCallback, + weak_ptr_factory_.GetWeakPtr(), callback)); + } + private: void OnGetKeyDataExCallback(const GetKeyDataCallback& callback, chromeos::DBusMethodCallStatus call_status,
diff --git a/chromeos/cryptohome/homedir_methods.h b/chromeos/cryptohome/homedir_methods.h index 17f0f55..3f40f4a 100644 --- a/chromeos/cryptohome/homedir_methods.h +++ b/chromeos/cryptohome/homedir_methods.h
@@ -89,6 +89,12 @@ const std::string& label, const Callback& callback) = 0; + // Asks cryptohomed to change cryptohome identification |id_from| to |id_to|, + // which results in cryptohome directory renaming. + virtual void RenameCryptohome(const Identification& id_from, + const Identification& id_to, + const Callback& callback) = 0; + // Creates the global HomedirMethods instance. static void Initialize();
diff --git a/chromeos/cryptohome/mock_homedir_methods.h b/chromeos/cryptohome/mock_homedir_methods.h index 81a82a2..b2e5e8a 100644 --- a/chromeos/cryptohome/mock_homedir_methods.h +++ b/chromeos/cryptohome/mock_homedir_methods.h
@@ -51,6 +51,10 @@ const KeyDefinition& key, const std::string& signature, const Callback& callback)); + MOCK_METHOD3(RenameCryptohome, + void(const Identification& id_from, + const Identification& id_to, + const Callback& callback)); private: bool success_;
diff --git a/chromeos/dbus/cryptohome_client.cc b/chromeos/dbus/cryptohome_client.cc index 0df97a3..bdf5125 100644 --- a/chromeos/dbus/cryptohome_client.cc +++ b/chromeos/dbus/cryptohome_client.cc
@@ -128,6 +128,26 @@ } // CryptohomeClient override. + void RenameCryptohome(const cryptohome::Identification& cryptohome_id_from, + const cryptohome::Identification& cryptohome_id_to, + const ProtobufMethodCallback& callback) override { + const char* method_name = cryptohome::kCryptohomeRenameCryptohome; + dbus::MethodCall method_call(cryptohome::kCryptohomeInterface, method_name); + + cryptohome::AccountIdentifier id_from_proto; + cryptohome::AccountIdentifier id_to_proto; + FillIdentificationProtobuf(cryptohome_id_from, &id_from_proto); + FillIdentificationProtobuf(cryptohome_id_to, &id_to_proto); + + dbus::MessageWriter writer(&method_call); + writer.AppendProtoAsArrayOfBytes(id_from_proto); + writer.AppendProtoAsArrayOfBytes(id_to_proto); + proxy_->CallMethod(&method_call, kTpmDBusTimeoutMs, + base::Bind(&CryptohomeClientImpl::OnBaseReplyMethod, + weak_ptr_factory_.GetWeakPtr(), callback)); + } + + // CryptohomeClient override. void GetSystemSalt(const GetSystemSaltCallback& callback) override { dbus::MethodCall method_call(cryptohome::kCryptohomeInterface, cryptohome::kCryptohomeGetSystemSalt);
diff --git a/chromeos/dbus/cryptohome_client.h b/chromeos/dbus/cryptohome_client.h index 233ff93..15ce84f 100644 --- a/chromeos/dbus/cryptohome_client.h +++ b/chromeos/dbus/cryptohome_client.h
@@ -139,6 +139,13 @@ virtual void AsyncRemove(const cryptohome::Identification& cryptohome_id, const AsyncMethodCallback& callback) = 0; + // Calls RenameCryptohome method. |callback| is called after the method + // call succeeds. + virtual void RenameCryptohome( + const cryptohome::Identification& cryptohome_id_from, + const cryptohome::Identification& cryptohome_id_to, + const ProtobufMethodCallback& callback) = 0; + // Calls GetSystemSalt method. |callback| is called after the method call // succeeds. virtual void GetSystemSalt(const GetSystemSaltCallback& callback) = 0;
diff --git a/chromeos/dbus/fake_cryptohome_client.cc b/chromeos/dbus/fake_cryptohome_client.cc index 2ae91976..e85161c 100644 --- a/chromeos/dbus/fake_cryptohome_client.cc +++ b/chromeos/dbus/fake_cryptohome_client.cc
@@ -93,6 +93,14 @@ ReturnAsyncMethodResult(callback, false); } +void FakeCryptohomeClient::RenameCryptohome( + const cryptohome::Identification& cryptohome_id_from, + const cryptohome::Identification& cryptohome_id_to, + const ProtobufMethodCallback& callback) { + cryptohome::BaseReply reply; + ReturnProtobufMethodCallback(reply, callback); +} + void FakeCryptohomeClient::GetSystemSalt( const GetSystemSaltCallback& callback) { base::MessageLoop::current()->PostTask(
diff --git a/chromeos/dbus/fake_cryptohome_client.h b/chromeos/dbus/fake_cryptohome_client.h index 20402dc..9fb1f493 100644 --- a/chromeos/dbus/fake_cryptohome_client.h +++ b/chromeos/dbus/fake_cryptohome_client.h
@@ -38,6 +38,9 @@ const AsyncMethodCallback& callback) override; void AsyncRemove(const cryptohome::Identification& cryptohome_id, const AsyncMethodCallback& callback) override; + void RenameCryptohome(const cryptohome::Identification& cryptohome_id_from, + const cryptohome::Identification& cryptohome_id_to, + const ProtobufMethodCallback& callback) override; void GetSystemSalt(const GetSystemSaltCallback& callback) override; void GetSanitizedUsername(const cryptohome::Identification& cryptohome_id, const StringDBusMethodCallback& callback) override;
diff --git a/chromeos/dbus/mock_cryptohome_client.h b/chromeos/dbus/mock_cryptohome_client.h index c4e166b..35b683b 100644 --- a/chromeos/dbus/mock_cryptohome_client.h +++ b/chromeos/dbus/mock_cryptohome_client.h
@@ -42,6 +42,10 @@ MOCK_METHOD2(AsyncRemove, void(const cryptohome::Identification& cryptohome_id, const AsyncMethodCallback& callback)); + MOCK_METHOD3(RenameCryptohome, + void(const cryptohome::Identification& id_from, + const cryptohome::Identification& id_to, + const ProtobufMethodCallback& callback)); MOCK_METHOD1(GetSystemSalt, void(const GetSystemSaltCallback& callback)); MOCK_METHOD2(GetSanitizedUsername,
diff --git a/chromeos/login/auth/cryptohome_authenticator.cc b/chromeos/login/auth/cryptohome_authenticator.cc index 913af5d..afae8d96 100644 --- a/chromeos/login/auth/cryptohome_authenticator.cc +++ b/chromeos/login/auth/cryptohome_authenticator.cc
@@ -13,6 +13,8 @@ #include "base/location.h" #include "base/logging.h" #include "base/memory/weak_ptr.h" +#include "base/metrics/histogram_macros.h" +#include "chromeos/chromeos_switches.h" #include "chromeos/cryptohome/async_method_caller.h" #include "chromeos/cryptohome/cryptohome_parameters.h" #include "chromeos/cryptohome/homedir_methods.h" @@ -27,6 +29,7 @@ #include "chromeos/login_event_recorder.h" #include "components/device_event_log/device_event_log.h" #include "components/signin/core/account_id/account_id.h" +#include "components/user_manager/known_user.h" #include "components/user_manager/user_type.h" #include "third_party/cros_system_api/dbus/service_constants.h" @@ -45,6 +48,30 @@ // credentials is stored. const char kKeyProviderDataSaltName[] = "salt"; +// Name of UMA histogram. +const char kCryptohomeMigrationToGaiaId[] = "Cryptohome.MigrationToGaiaId"; + +// This enum is used to define the buckets for an enumerated UMA histogram. +// Hence, +// (a) existing enumerated constants should never be deleted or reordered, and +// (b) new constants should only be appended at the end of the enumeration. +// +// This must be kept in sync with enum CryptohomeMigrationToGaiaId in +// histograms.xml . +enum CryptohomeMigrationToGaiaId { + NOT_STARTED = 0, + ALREADY_MIGRATED = 1, + SUCCESS = 2, + FAILURE = 3, + ENTRIES_COUNT +}; + +// Report to UMA. +void UMACryptohomeMigrationToGaiaId(const CryptohomeMigrationToGaiaId status) { + UMA_HISTOGRAM_ENUMERATION(kCryptohomeMigrationToGaiaId, status, + CryptohomeMigrationToGaiaId::ENTRIES_COUNT); +} + // Hashes |key| with |system_salt| if it its type is KEY_TYPE_PASSWORD_PLAIN. // Returns the keys unmodified otherwise. scoped_ptr<Key> TransformKeyIfNeeded(const Key& key, @@ -154,6 +181,86 @@ base::Bind(&OnMount, attempt, resolver)); } +// Handle cryptohome migration status. +void OnCryptohomeRenamed(const base::WeakPtr<AuthAttemptState>& attempt, + scoped_refptr<CryptohomeAuthenticator> resolver, + bool ephemeral, + bool create_if_nonexistent, + bool success, + cryptohome::MountError return_code) { + chromeos::LoginEventRecorder::Get()->AddLoginTimeMarker( + "CryptohomeRename-End", false); + const AccountId account_id = attempt->user_context.GetAccountId(); + if (success) { + cryptohome::SetGaiaIdMigrationStatusDone(account_id); + UMACryptohomeMigrationToGaiaId(CryptohomeMigrationToGaiaId::SUCCESS); + } else { + LOG(ERROR) << "Failed to rename cryptohome for account_id='" + << account_id.Serialize() << "' (return_code=" << return_code + << ")"; + // If rename fails, we can still use legacy cryptohome identifier. + // Proceed to DoMount. + UMACryptohomeMigrationToGaiaId(CryptohomeMigrationToGaiaId::FAILURE); + } + DoMount(attempt, resolver, ephemeral, create_if_nonexistent); +} + +// This method migrates cryptohome identifier to gaia id (if needed), +// and then calls Mount. +void EnsureCryptohomeMigratedToGaiaId( + const base::WeakPtr<AuthAttemptState>& attempt, + scoped_refptr<CryptohomeAuthenticator> resolver, + bool ephemeral, + bool create_if_nonexistent) { + const bool is_gaiaid_migration_started = switches::IsGaiaIdMigrationStarted(); + if (!is_gaiaid_migration_started) { + UMACryptohomeMigrationToGaiaId(CryptohomeMigrationToGaiaId::NOT_STARTED); + DoMount(attempt, resolver, ephemeral, create_if_nonexistent); + return; + } + const bool already_migrated = cryptohome::GetGaiaIdMigrationStatus( + attempt->user_context.GetAccountId()); + const bool has_gaia_id = + !attempt->user_context.GetAccountId().GetGaiaId().empty(); + + bool need_migration = false; + if (!create_if_nonexistent && !already_migrated) { + if (has_gaia_id) { + need_migration = true; + } else { + LOG(WARNING) << "Account '" + << attempt->user_context.GetAccountId().Serialize() + << "' has no gaia id. Cryptohome migration skipped."; + } + } + if (need_migration) { + chromeos::LoginEventRecorder::Get()->AddLoginTimeMarker( + "CryptohomeRename-Start", false); + const std::string& cryptohome_id_from = + attempt->user_context.GetAccountId().GetUserEmail(); // Migrated + const std::string cryptohome_id_to = + attempt->user_context.GetAccountId().GetGaiaIdKey(); + + cryptohome::HomedirMethods::GetInstance()->RenameCryptohome( + cryptohome::Identification::FromString(cryptohome_id_from), + cryptohome::Identification::FromString(cryptohome_id_to), + base::Bind(&OnCryptohomeRenamed, attempt, resolver, ephemeral, + create_if_nonexistent)); + return; + } + if (!already_migrated && has_gaia_id) { + // Mark new users migrated. + cryptohome::SetGaiaIdMigrationStatusDone( + attempt->user_context.GetAccountId()); + } + if (already_migrated) { + UMACryptohomeMigrationToGaiaId( + CryptohomeMigrationToGaiaId::ALREADY_MIGRATED); + } + + DoMount(attempt, resolver, ephemeral, create_if_nonexistent); +} + // Callback invoked when the system salt has been retrieved. Transforms the key // in |attempt->user_context| using Chrome's default hashing algorithm and the // system salt, then calls MountEx(). @@ -169,7 +276,8 @@ Key::KEY_TYPE_SALTED_SHA256_TOP_HALF, system_salt); - DoMount(attempt, resolver, ephemeral, create_if_nonexistent); + EnsureCryptohomeMigratedToGaiaId(attempt, resolver, ephemeral, + create_if_nonexistent); } // Callback invoked when cryptohome's GetKeyDataEx() method has finished. @@ -228,7 +336,8 @@ attempt->user_context.GetKey()->Transform( static_cast<Key::KeyType>(*type), *salt); - DoMount(attempt, resolver, ephemeral, create_if_nonexistent); + EnsureCryptohomeMigratedToGaiaId(attempt, resolver, ephemeral, + create_if_nonexistent); return; } } else { @@ -261,7 +370,8 @@ if (attempt->user_context.GetKey()->GetKeyType() != Key::KEY_TYPE_PASSWORD_PLAIN) { - DoMount(attempt, resolver, ephemeral, create_if_nonexistent); + EnsureCryptohomeMigratedToGaiaId(attempt, resolver, ephemeral, + create_if_nonexistent); return; }
diff --git a/components/arc/common/auth.mojom b/components/arc/common/auth.mojom index f996d31..186ef20f 100644 --- a/components/arc/common/auth.mojom +++ b/components/arc/common/auth.mojom
@@ -4,12 +4,27 @@ module arc; +// These values describe failure reason of sign-in. +enum ArcSignInFailureReason { + UNKNOWN_ERROR = 0, + NETWORK_ERROR = 1, + SERVICE_UNAVAILABLE = 2, + BAD_AUTHENTICATION = 3, + GMS_CORE_NOT_AVAILABLE = 4, + CLOUD_PROVISION_FLOW_FAIL = 5, +}; + interface AuthHost { // Returns an authorization code, which can be used to sign in. GetAuthCodeDeprecated@0() => (string auth_code); // Returns an authorization code in case is_enforced is set, which can be used // to sign in. [MinVersion=1] GetAuthCode@1() => (string auth_code, bool is_enforced); + // Notifies Chrome that the sign-in is completed successfully. + [MinVersion=2] OnSignInComplete@2(); + // Notifies Chrome that the sign-in fails to complete and provides failure + // reason. + [MinVersion=2] OnSignInFailed@3(ArcSignInFailureReason reason); }; interface AuthInstance {
diff --git a/components/autofill/content/browser/content_autofill_driver_unittest.cc b/components/autofill/content/browser/content_autofill_driver_unittest.cc index 633908f..68fe6f2 100644 --- a/components/autofill/content/browser/content_autofill_driver_unittest.cc +++ b/components/autofill/content/browser/content_autofill_driver_unittest.cc
@@ -6,6 +6,7 @@ #include <stdint.h> #include <algorithm> +#include <tuple> #include <utility> #include <vector> @@ -94,13 +95,13 @@ process()->sink().GetFirstMessageMatching(kMsgID); if (!message) return false; - base::Tuple<int, FormData> autofill_param; + std::tuple<int, FormData> autofill_param; if (!AutofillMsg_FillForm::Read(message, &autofill_param)) return false; if (page_id) - *page_id = base::get<0>(autofill_param); + *page_id = std::get<0>(autofill_param); if (results) - *results = base::get<1>(autofill_param); + *results = std::get<1>(autofill_param); process()->sink().ClearMessages(); return true; } @@ -115,13 +116,13 @@ process()->sink().GetFirstMessageMatching(kMsgID); if (!message) return false; - base::Tuple<int, FormData> autofill_param; + std::tuple<int, FormData> autofill_param; if (!AutofillMsg_PreviewForm::Read(message, &autofill_param)) return false; if (page_id) - *page_id = base::get<0>(autofill_param); + *page_id = std::get<0>(autofill_param); if (results) - *results = base::get<1>(autofill_param); + *results = std::get<1>(autofill_param); process()->sink().ClearMessages(); return true; } @@ -138,12 +139,12 @@ process()->sink().GetFirstMessageMatching(kMsgID); if (!message) return false; - base::Tuple<std::vector<FormDataPredictions> > autofill_param; + std::tuple<std::vector<FormDataPredictions> > autofill_param; if (!AutofillMsg_FieldTypePredictionsAvailable::Read(message, &autofill_param)) return false; if (predictions) - *predictions = base::get<0>(autofill_param); + *predictions = std::get<0>(autofill_param); process()->sink().ClearMessages(); return true; @@ -158,7 +159,7 @@ process()->sink().GetFirstMessageMatching(messageID); if (!message) return false; - base::Tuple<base::string16> autofill_param; + std::tuple<base::string16> autofill_param; switch (messageID) { case AutofillMsg_FillFieldWithValue::ID: if (!AutofillMsg_FillFieldWithValue::Read(message, &autofill_param)) @@ -177,7 +178,7 @@ NOTREACHED(); } if (value) - *value = base::get<0>(autofill_param); + *value = std::get<0>(autofill_param); process()->sink().ClearMessages(); return true; }
diff --git a/components/autofill/content/browser/request_autocomplete_manager_unittest.cc b/components/autofill/content/browser/request_autocomplete_manager_unittest.cc index 37f5afc..8d9db483 100644 --- a/components/autofill/content/browser/request_autocomplete_manager_unittest.cc +++ b/components/autofill/content/browser/request_autocomplete_manager_unittest.cc
@@ -4,6 +4,8 @@ #include <stdint.h> +#include <tuple> + #include "base/macros.h" #include "components/autofill/content/browser/content_autofill_driver.h" #include "components/autofill/content/browser/request_autocomplete_manager.h" @@ -125,10 +127,10 @@ process()->sink().GetFirstMessageMatching(kMsgID); if (!message) return false; - base::Tuple<blink::WebFormElement::AutocompleteResult, base::string16, - FormData> autofill_param; + std::tuple<blink::WebFormElement::AutocompleteResult, base::string16, + FormData> autofill_param; AutofillMsg_RequestAutocompleteResult::Read(message, &autofill_param); - *result = base::get<0>(autofill_param); + *result = std::get<0>(autofill_param); process()->sink().ClearMessages(); return true; }
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index d18ff7b..ba1b36c 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -529,13 +529,13 @@ // identical origin. blink::WebFrame* cur_frame = password_element.document().frame(); blink::WebString bottom_frame_origin = - cur_frame->securityOrigin().toString(); + cur_frame->getSecurityOrigin().toString(); DCHECK(cur_frame); while (cur_frame->parent()) { cur_frame = cur_frame->parent(); - if (!bottom_frame_origin.equals(cur_frame->securityOrigin().toString())) + if (!bottom_frame_origin.equals(cur_frame->getSecurityOrigin().toString())) return false; } @@ -977,7 +977,7 @@ blink::WebFrame* frame = render_frame()->GetWebFrame(); // Make sure that this security origin is allowed to use password manager. - blink::WebSecurityOrigin origin = frame->document().securityOrigin(); + blink::WebSecurityOrigin origin = frame->document().getSecurityOrigin(); if (logger) { logger->LogURL(Logger::STRING_SECURITY_ORIGIN, GURL(origin.toString().utf8()));
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc index 1cbd613..c41310de 100644 --- a/components/autofill/content/renderer/password_generation_agent.cc +++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -239,7 +239,7 @@ // Make sure that this security origin is allowed to use password manager. // Generating a password that can't be saved is a bad idea. blink::WebSecurityOrigin origin = - render_frame()->GetWebFrame()->document().securityOrigin(); + render_frame()->GetWebFrame()->document().getSecurityOrigin(); if (!origin.canAccessPasswordManager()) { VLOG(1) << "No PasswordManager access"; return false;
diff --git a/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc b/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc index 22cd852e..73c2bd8 100644 --- a/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc +++ b/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc
@@ -6,6 +6,8 @@ #include <stdint.h> +#include <tuple> + #include "components/autofill/content/common/autofill_messages.h" #include "ipc/ipc_test_sink.h" #include "testing/gtest/include/gtest/gtest.h" @@ -32,9 +34,9 @@ const IPC::Message* message = sink_.GetFirstMessageMatching(kMsgID); if (!message) return false; - base::Tuple<std::string> param; + std::tuple<std::string> param; AutofillHostMsg_RecordSavePasswordProgress::Read(message, ¶m); - *log = base::get<0>(param); + *log = std::get<0>(param); sink_.ClearMessages(); return true; }
diff --git a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc index ad6b86b..66dc2d9 100644 --- a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc +++ b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
@@ -31,8 +31,7 @@ issuer_icon_id_(CreditCard::IconResourceId( CreditCard::GetCreditCardType(card.GetRawInfo(CREDIT_CARD_NUMBER)))), #endif - // Prepend the midline horizontal ellipsis (U+22EF). - card_label_(base::UTF8ToUTF16("\xE2\x8B\xAF") + card.LastFourDigits()), + card_label_(base::string16(kMidlineEllipsis) + card.LastFourDigits()), card_sub_label_(card.AbbreviatedExpirationDateForDisplay()) { if (legal_message) LegalMessageLine::Parse(*legal_message, &legal_messages_);
diff --git a/components/autofill/core/browser/credit_card.cc b/components/autofill/core/browser/credit_card.cc index 29f0101..9ea2ee7 100644 --- a/components/autofill/core/browser/credit_card.cc +++ b/components/autofill/core/browser/credit_card.cc
@@ -37,9 +37,12 @@ namespace autofill { +const base::char16 kMidlineEllipsis[] = { 0x22ef, 0 }; + namespace { const base::char16 kCreditCardObfuscationSymbol = '*'; +const base::char16 kNonBreakingSpace[] = { 0x00a0, 0 }; bool ConvertYear(const base::string16& year, int* num) { // If the |year| is empty, clear the stored value. @@ -489,10 +492,9 @@ if (digits.empty()) return type; - // The separator character is a non breaking space and a horizontal midline - // ellipsis. // TODO(estade): i18n? - return type + base::UTF8ToUTF16("\xC2\xA0\xE2\x8B\xAF") + digits; + return type + base::string16(kNonBreakingSpace) + + base::string16(kMidlineEllipsis) + digits; } base::string16 CreditCard::AbbreviatedExpirationDateForDisplay() const {
diff --git a/components/autofill/core/browser/credit_card.h b/components/autofill/core/browser/credit_card.h index 6c077638..73f138c0 100644 --- a/components/autofill/core/browser/credit_card.h +++ b/components/autofill/core/browser/credit_card.h
@@ -17,6 +17,9 @@ namespace autofill { +// A midline horizontal ellipsis (U+22EF). +extern const base::char16 kMidlineEllipsis[]; + // A form group that stores credit card information. class CreditCard : public AutofillDataModel { public:
diff --git a/components/bookmarks/browser/bookmark_index.cc b/components/bookmarks/browser/bookmark_index.cc index e953df8..d4fbf32 100644 --- a/components/bookmarks/browser/bookmark_index.cc +++ b/components/bookmarks/browser/bookmark_index.cc
@@ -56,8 +56,7 @@ // Sort functor for NodeTypedCountPairs. We sort in decreasing order of typed // count so that the best matches will always be added to the results. -struct NodeTypedCountPairSortFunctor - : std::binary_function<NodeTypedCountPair, NodeTypedCountPair, bool> { +struct NodeTypedCountPairSortFunctor { bool operator()(const NodeTypedCountPair& a, const NodeTypedCountPair& b) const { return a.second > b.second; @@ -65,8 +64,7 @@ }; // Extract the const Node* stored in a BookmarkClient::NodeTypedCountPair. -struct NodeTypedCountPairExtractNodeFunctor - : std::unary_function<NodeTypedCountPair, const BookmarkNode*> { +struct NodeTypedCountPairExtractNodeFunctor { const BookmarkNode* operator()(const NodeTypedCountPair& pair) const { return pair.first; }
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index 3b502760..51d0f50d 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc
@@ -47,10 +47,7 @@ // Comparator used when sorting permanent nodes. Nodes that are initially // visible are sorted before nodes that are initially hidden. -class VisibilityComparator - : public std::binary_function<const BookmarkPermanentNode*, - const BookmarkPermanentNode*, - bool> { +class VisibilityComparator { public: explicit VisibilityComparator(BookmarkClient* client) : client_(client) {} @@ -68,9 +65,7 @@ // Comparator used when sorting bookmarks. Folders are sorted first, then // bookmarks. -class SortComparator : public std::binary_function<const BookmarkNode*, - const BookmarkNode*, - bool> { +class SortComparator { public: explicit SortComparator(icu::Collator* collator) : collator_(collator) {}
diff --git a/components/bookmarks/common/android/java/src/org/chromium/components/bookmarks/BookmarkId.java b/components/bookmarks/common/android/java/src/org/chromium/components/bookmarks/BookmarkId.java index 9dc1179..f54383c2 100644 --- a/components/bookmarks/common/android/java/src/org/chromium/components/bookmarks/BookmarkId.java +++ b/components/bookmarks/common/android/java/src/org/chromium/components/bookmarks/BookmarkId.java
@@ -79,7 +79,7 @@ } /** - * @return The bookmark type. + * Returns the bookmark type: {@link BookmarkType#NORMAL} or {@link BookmarkType#PARTNER}. */ @CalledByNative public int getType() {
diff --git a/components/component_updater/component_updater_service.cc b/components/component_updater/component_updater_service.cc index fce7e99..8f0515bd 100644 --- a/components/component_updater/component_updater_service.cc +++ b/components/component_updater/component_updater_service.cc
@@ -18,11 +18,13 @@ #include "base/logging.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" +#include "base/metrics/histogram_macros.h" #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" #include "base/thread_task_runner_handle.h" #include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_checker.h" +#include "base/time/time.h" #include "base/timer/timer.h" #include "components/component_updater/component_updater_service_internal.h" #include "components/component_updater/timer.h" @@ -35,6 +37,16 @@ using CrxInstaller = update_client::CrxInstaller; using UpdateClient = update_client::UpdateClient; +namespace { + +enum UpdateType { + UPDATE_TYPE_MANUAL = 0, + UPDATE_TYPE_AUTOMATIC, + UPDATE_TYPE_COUNT, +}; + +} // namespace + namespace component_updater { CrxUpdateService::CrxUpdateService( @@ -235,15 +247,23 @@ bool CrxUpdateService::OnDemandUpdateInternal(const std::string& id) { DCHECK(thread_checker_.CalledOnValidThread()); + UMA_HISTOGRAM_ENUMERATION("ComponentUpdater.Calls", UPDATE_TYPE_MANUAL, + UPDATE_TYPE_COUNT); + update_client_->Install( id, base::Bind(&CrxUpdateService::OnUpdate, base::Unretained(this)), - base::Bind(&CrxUpdateService::OnUpdateComplete, base::Unretained(this))); + base::Bind(&CrxUpdateService::OnUpdateComplete, base::Unretained(this), + base::TimeTicks::Now())); return true; } bool CrxUpdateService::CheckForUpdates() { DCHECK(thread_checker_.CalledOnValidThread()); + + UMA_HISTOGRAM_ENUMERATION("ComponentUpdater.Calls", UPDATE_TYPE_AUTOMATIC, + UPDATE_TYPE_COUNT); + std::vector<std::string> ids; for (const auto id : components_order_) { DCHECK(components_.find(id) != components_.end()); @@ -252,7 +272,8 @@ update_client_->Update( ids, base::Bind(&CrxUpdateService::OnUpdate, base::Unretained(this)), - base::Bind(&CrxUpdateService::OnUpdateComplete, base::Unretained(this))); + base::Bind(&CrxUpdateService::OnUpdateComplete, base::Unretained(this), + base::TimeTicks::Now())); return true; } @@ -296,10 +317,15 @@ } } -void CrxUpdateService::OnUpdateComplete(int error) { +void CrxUpdateService::OnUpdateComplete(const base::TimeTicks& start_time, + int error) { DCHECK(thread_checker_.CalledOnValidThread()); VLOG(1) << "Update completed with error " << error; + UMA_HISTOGRAM_BOOLEAN("ComponentUpdater.UpdateCompleteResult", error != 0); + UMA_HISTOGRAM_LONG_TIMES_100("ComponentUpdater.UpdateCompleteTime", + base::TimeTicks::Now() - start_time); + for (const auto id : components_pending_unregistration_) { if (!update_client_->IsUpdating(id)) { const auto component = GetComponent(id);
diff --git a/components/component_updater/component_updater_service_internal.h b/components/component_updater/component_updater_service_internal.h index 29c5d31..3e262c0 100644 --- a/components/component_updater/component_updater_service_internal.h +++ b/components/component_updater/component_updater_service_internal.h
@@ -17,6 +17,10 @@ #include "base/threading/thread_checker.h" #include "components/component_updater/timer.h" +namespace base { +class TimeTicks; +} + namespace component_updater { class OnDemandUpdater; @@ -44,13 +48,15 @@ void MaybeThrottle(const std::string& id, const base::Closure& callback) override; scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner() override; - bool OnDemandUpdate(const std::string& id) override; bool GetComponentDetails(const std::string& id, CrxUpdateItem* item) const override; // Overrides for Observer. void OnEvent(Events event, const std::string& id) override; + // Overrides for OnDemandUpdater. + bool OnDemandUpdate(const std::string& id) override; + private: void Start(); void Stop(); @@ -68,7 +74,7 @@ void OnUpdate(const std::vector<std::string>& ids, std::vector<CrxComponent>* components); - void OnUpdateComplete(int error); + void OnUpdateComplete(const base::TimeTicks& start_time, int error); base::ThreadChecker thread_checker_;
diff --git a/components/component_updater/component_updater_service_unittest.cc b/components/component_updater/component_updater_service_unittest.cc index 15b62bb8..83d5874e 100644 --- a/components/component_updater/component_updater_service_unittest.cc +++ b/components/component_updater/component_updater_service_unittest.cc
@@ -15,6 +15,7 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/histogram_tester.h" #include "base/test/sequenced_worker_pool_owner.h" #include "base/thread_task_runner_handle.h" #include "base/values.h" @@ -215,6 +216,7 @@ void OnUpdate(const std::vector<std::string>& ids, const UpdateClient::CrxDataCallback& crx_data_callback, const UpdateClient::CompletionCallback& completion_callback) { + completion_callback.Run(0); static int cnt = 0; ++cnt; if (cnt >= max_cnt_) @@ -226,6 +228,8 @@ base::Closure quit_closure_; }; + base::HistogramTester ht; + scoped_refptr<MockInstaller> installer(new MockInstaller()); EXPECT_CALL(*installer, Uninstall()).WillOnce(Return(true)); @@ -260,8 +264,11 @@ EXPECT_TRUE(component_updater().RegisterComponent(crx_component2)); RunThreads(); - EXPECT_TRUE(component_updater().UnregisterComponent(id1)); + + ht.ExpectUniqueSample("ComponentUpdater.Calls", 1, 2); + ht.ExpectUniqueSample("ComponentUpdater.UpdateCompleteResult", 0, 2); + ht.ExpectTotalCount("ComponentUpdater.UpdateCompleteTime", 2); } // Tests that on-demand updates invoke UpdateClient::Install. @@ -275,6 +282,7 @@ const std::string& ids, const UpdateClient::CrxDataCallback& crx_data_callback, const UpdateClient::CompletionCallback& completion_callback) { + completion_callback.Run(0); static int cnt = 0; ++cnt; if (cnt >= max_cnt_) @@ -286,6 +294,8 @@ base::Closure quit_closure_; }; + base::HistogramTester ht; + auto config = configurator(); config->SetInitialDelay(3600); @@ -312,6 +322,10 @@ EXPECT_TRUE(OnDemandTester::OnDemand(&cus, id)); RunThreads(); + + ht.ExpectUniqueSample("ComponentUpdater.Calls", 0, 1); + ht.ExpectUniqueSample("ComponentUpdater.UpdateCompleteResult", 0, 1); + ht.ExpectTotalCount("ComponentUpdater.UpdateCompleteTime", 1); } // Tests that throttling an update invokes UpdateClient::Install. @@ -325,6 +339,7 @@ const std::string& ids, const UpdateClient::CrxDataCallback& crx_data_callback, const UpdateClient::CompletionCallback& completion_callback) { + completion_callback.Run(0); static int cnt = 0; ++cnt; if (cnt >= max_cnt_) @@ -336,6 +351,8 @@ base::Closure quit_closure_; }; + base::HistogramTester ht; + auto config = configurator(); config->SetInitialDelay(3600); @@ -359,6 +376,10 @@ base::Bind(&ComponentUpdaterTest::ReadyCallback)); RunThreads(); + + ht.ExpectUniqueSample("ComponentUpdater.Calls", 0, 1); + ht.ExpectUniqueSample("ComponentUpdater.UpdateCompleteResult", 0, 1); + ht.ExpectTotalCount("ComponentUpdater.UpdateCompleteTime", 1); } } // namespace component_updater
diff --git a/components/dom_distiller/core/distilled_content_store.cc b/components/dom_distiller/core/distilled_content_store.cc index 1cb1d9e..e6885cb 100644 --- a/components/dom_distiller/core/distilled_content_store.cc +++ b/components/dom_distiller/core/distilled_content_store.cc
@@ -9,8 +9,7 @@ namespace dom_distiller { InMemoryContentStore::InMemoryContentStore(const int max_num_entries) - : cache_(max_num_entries, CacheDeletor(this)) { -} + : cache_(max_num_entries) {} InMemoryContentStore::~InMemoryContentStore() { // Clear the cache before destruction to ensure the CacheDeletor is not called @@ -52,7 +51,7 @@ } scoped_ptr<DistilledArticleProto> distilled_article; if (success) { - distilled_article.reset(new DistilledArticleProto(it->second)); + distilled_article.reset(new DistilledArticleProto(*it->second)); } else { distilled_article.reset(new DistilledArticleProto()); } @@ -63,7 +62,9 @@ void InMemoryContentStore::InjectContent(const ArticleEntry& entry, const DistilledArticleProto& proto) { - cache_.Put(entry.entry_id(), proto); + cache_.Put(entry.entry_id(), + scoped_ptr<DistilledArticleProto, CacheDeletor>( + new DistilledArticleProto(proto), CacheDeletor(this))); AddUrlToIdMapping(entry, proto); } @@ -96,11 +97,12 @@ } void InMemoryContentStore::CacheDeletor::operator()( - const DistilledArticleProto& proto) { + DistilledArticleProto* proto) { // When InMemoryContentStore is deleted, the |store_| pointer becomes invalid, // but since the ContentMap is cleared in the InMemoryContentStore destructor, // this should never be called after the destructor. - store_->EraseUrlToIdMapping(proto); + store_->EraseUrlToIdMapping(*proto); + delete proto; } } // namespace dom_distiller
diff --git a/components/dom_distiller/core/distilled_content_store.h b/components/dom_distiller/core/distilled_content_store.h index e83501a..62bbb49e 100644 --- a/components/dom_distiller/core/distilled_content_store.h +++ b/components/dom_distiller/core/distilled_content_store.h
@@ -64,7 +64,7 @@ public: explicit CacheDeletor(InMemoryContentStore* store); ~CacheDeletor(); - void operator()(const DistilledArticleProto& proto); + void operator()(DistilledArticleProto* proto); private: InMemoryContentStore* store_; @@ -75,10 +75,9 @@ void EraseUrlToIdMapping(const DistilledArticleProto& proto); - typedef base::MRUCacheBase<std::string, - DistilledArticleProto, - std::less<std::string>, - InMemoryContentStore::CacheDeletor> + typedef base::MRUCache<std::string, + scoped_ptr<DistilledArticleProto, CacheDeletor>> + ContentMap; typedef base::hash_map<std::string, std::string> UrlMap;
diff --git a/components/domain_reliability/OWNERS b/components/domain_reliability/OWNERS index aa977fd75..6abaef7 100644 --- a/components/domain_reliability/OWNERS +++ b/components/domain_reliability/OWNERS
@@ -2,5 +2,5 @@ rdsmith@chromium.org ttuttle@chromium.org -per-file quic_error_mapping*=rtc@chromium.org +per-file quic_error_mapping*=rch@chromium.org per-file quic_error_mapping*=rtenneti@chromium.org
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc index 82e2dbd..91aa526 100644 --- a/components/exo/wayland/server.cc +++ b/components/exo/wayland/server.cc
@@ -20,6 +20,7 @@ #include "ash/display/display_info.h" #include "ash/display/display_manager.h" +#include "ash/display/screen_ash.h" #include "ash/shell.h" #include "base/bind.h" #include "base/cancelable_callback.h" @@ -43,6 +44,7 @@ #include "third_party/skia/include/core/SkRegion.h" #include "ui/aura/window_property.h" #include "ui/events/keycodes/dom/keycode_converter.h" +#include "ui/gfx/display_observer.h" #if defined(USE_OZONE) #include <drm_fourcc.h> @@ -893,43 +895,105 @@ //////////////////////////////////////////////////////////////////////////////// // wl_output_interface: +wl_output_transform OutputTransform(gfx::Display::Rotation rotation) { + switch (rotation) { + case gfx::Display::ROTATE_0: + return WL_OUTPUT_TRANSFORM_NORMAL; + case gfx::Display::ROTATE_90: + return WL_OUTPUT_TRANSFORM_90; + case gfx::Display::ROTATE_180: + return WL_OUTPUT_TRANSFORM_180; + case gfx::Display::ROTATE_270: + return WL_OUTPUT_TRANSFORM_270; + } + NOTREACHED(); + return WL_OUTPUT_TRANSFORM_NORMAL; +} + +class WaylandDisplayObserver : public gfx::DisplayObserver { + public: + WaylandDisplayObserver(const gfx::Display& display, + wl_resource* output_resource) + : display_id_(display.id()), output_resource_(output_resource) { + gfx::Screen::GetScreen()->AddObserver(this); + SendDisplayMetrics(display); + } + ~WaylandDisplayObserver() override { + gfx::Screen::GetScreen()->RemoveObserver(this); + } + + // Overridden from gfx::DisplayObserver: + void OnDisplayAdded(const gfx::Display& new_display) override {} + void OnDisplayRemoved(const gfx::Display& new_display) override {} + void OnDisplayMetricsChanged(const gfx::Display& display, + uint32_t changed_metrics) override { + if (display.id() != display_id_) + return; + + if (changed_metrics & + (DISPLAY_METRIC_BOUNDS | DISPLAY_METRIC_DEVICE_SCALE_FACTOR | + DISPLAY_METRIC_ROTATION)) { + SendDisplayMetrics(display); + } + } + + private: + void SendDisplayMetrics(const gfx::Display& display) { + const ash::DisplayInfo& info = + ash::Shell::GetInstance()->display_manager()->GetDisplayInfo( + display.id()); + + const float kInchInMm = 25.4f; + const char* kUnknownMake = "unknown"; + const char* kUnknownModel = "unknown"; + + gfx::Rect bounds = info.bounds_in_native(); + wl_output_send_geometry( + output_resource_, bounds.x(), bounds.y(), + static_cast<int>(kInchInMm * bounds.width() / info.device_dpi()), + static_cast<int>(kInchInMm * bounds.height() / info.device_dpi()), + WL_OUTPUT_SUBPIXEL_UNKNOWN, kUnknownMake, kUnknownModel, + OutputTransform(display.rotation())); + + if (wl_resource_get_version(output_resource_) >= + WL_OUTPUT_SCALE_SINCE_VERSION) { + wl_output_send_scale(output_resource_, display.device_scale_factor()); + } + + // TODO(reveman): Send real list of modes. + wl_output_send_mode( + output_resource_, WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED, + bounds.width(), bounds.height(), static_cast<int>(60000)); + + if (wl_resource_get_version(output_resource_) >= + WL_OUTPUT_DONE_SINCE_VERSION) { + wl_output_send_done(output_resource_); + } + } + + // The identifier associated with the observed display. + int64_t display_id_; + + // The output resource associated with the display. + wl_resource* const output_resource_; + + DISALLOW_COPY_AND_ASSIGN(WaylandDisplayObserver); +}; + const uint32_t output_version = 2; void bind_output(wl_client* client, void* data, uint32_t version, uint32_t id) { wl_resource* resource = wl_resource_create( client, &wl_output_interface, std::min(version, output_version), id); - // TODO(reveman): Watch for display changes and report them. // TODO(reveman): Multi-display support. - ash::DisplayManager* display_manager = - ash::Shell::GetInstance()->display_manager(); - const gfx::Display& primary = display_manager->GetPrimaryDisplayCandidate(); + const gfx::Display& display = ash::Shell::GetInstance() + ->display_manager() + ->GetPrimaryDisplayCandidate(); - const ash::DisplayInfo& info = display_manager->GetDisplayInfo(primary.id()); - const float kInchInMm = 25.4f; - const char* kUnknownMake = "unknown"; - const char* kUnknownModel = "unknown"; - gfx::Rect bounds = info.bounds_in_native(); - // TODO(reveman): Send the actual active device rotation. - wl_output_send_geometry( - resource, bounds.x(), bounds.y(), - static_cast<int>(kInchInMm * bounds.width() / info.device_dpi()), - static_cast<int>(kInchInMm * bounds.height() / info.device_dpi()), - WL_OUTPUT_SUBPIXEL_UNKNOWN, kUnknownMake, kUnknownModel, - WL_OUTPUT_TRANSFORM_NORMAL); - - // TODO(reveman): Send correct device scale factor when surface API respects - // scale. - if (version >= WL_OUTPUT_SCALE_SINCE_VERSION) - wl_output_send_scale(resource, primary.device_scale_factor()); - - // TODO(reveman): Send real list of modes after adding multi-display support. - wl_output_send_mode(resource, - WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED, - bounds.width(), bounds.height(), static_cast<int>(60000)); - - if (version >= WL_OUTPUT_DONE_SINCE_VERSION) - wl_output_send_done(resource); + SetImplementation( + resource, nullptr, + make_scoped_ptr(new WaylandDisplayObserver(display, resource))); } ////////////////////////////////////////////////////////////////////////////////
diff --git a/components/gcm_driver/gcm_driver_desktop.cc b/components/gcm_driver/gcm_driver_desktop.cc index 5ecc3cc..2c65b08e 100644 --- a/components/gcm_driver/gcm_driver_desktop.cc +++ b/components/gcm_driver/gcm_driver_desktop.cc
@@ -1315,17 +1315,17 @@ bool GCMDriverDesktop::TokenTupleComparer::operator()( const TokenTuple& a, const TokenTuple& b) const { - if (base::get<0>(a) < base::get<0>(b)) + if (std::get<0>(a) < std::get<0>(b)) return true; - if (base::get<0>(a) > base::get<0>(b)) + if (std::get<0>(a) > std::get<0>(b)) return false; - if (base::get<1>(a) < base::get<1>(b)) + if (std::get<1>(a) < std::get<1>(b)) return true; - if (base::get<1>(a) > base::get<1>(b)) + if (std::get<1>(a) > std::get<1>(b)) return false; - return base::get<2>(a) < base::get<2>(b); + return std::get<2>(a) < std::get<2>(b); } } // namespace gcm
diff --git a/components/gcm_driver/gcm_driver_desktop.h b/components/gcm_driver/gcm_driver_desktop.h index a162df1..51f002e8 100644 --- a/components/gcm_driver/gcm_driver_desktop.h +++ b/components/gcm_driver/gcm_driver_desktop.h
@@ -7,6 +7,7 @@ #include <map> #include <string> +#include <tuple> #include <vector> #include "base/compiler_specific.h" @@ -128,7 +129,7 @@ private: class IOWorker; - typedef base::Tuple<std::string, std::string, std::string> TokenTuple; + typedef std::tuple<std::string, std::string, std::string> TokenTuple; struct TokenTupleComparer { bool operator()(const TokenTuple& a, const TokenTuple& b) const; };
diff --git a/components/guest_view/renderer/guest_view_request.cc b/components/guest_view/renderer/guest_view_request.cc index 45edac41..d0aa0611 100644 --- a/components/guest_view/renderer/guest_view_request.cc +++ b/components/guest_view/renderer/guest_view_request.cc
@@ -4,6 +4,7 @@ #include "components/guest_view/renderer/guest_view_request.h" +#include <tuple> #include <utility> #include "components/guest_view/common/guest_view_messages.h" @@ -83,7 +84,7 @@ return; content::RenderView* guest_proxy_render_view = - content::RenderView::FromRoutingID(base::get<1>(param)); + content::RenderView::FromRoutingID(std::get<1>(param)); // TODO(fsamuel): Should we be reporting an error to JavaScript or DCHECKing? if (!guest_proxy_render_view) return;
diff --git a/components/mus/mus_app.cc b/components/mus/mus_app.cc index 2d714799..d5dd633 100644 --- a/components/mus/mus_app.cc +++ b/components/mus/mus_app.cc
@@ -20,6 +20,7 @@ #include "components/mus/ws/window_tree.h" #include "components/mus/ws/window_tree_binding.h" #include "components/mus/ws/window_tree_factory.h" +#include "components/mus/ws/window_tree_host_factory.h" #include "components/resource_provider/public/cpp/resource_loader.h" #include "mojo/public/c/system/main.h" #include "mojo/services/tracing/public/cpp/tracing_impl.h" @@ -56,16 +57,20 @@ // TODO(sky): this is a pretty typical pattern, make it easier to do. struct MandolineUIServicesApp::PendingRequest { - scoped_ptr<mojo::InterfaceRequest<mojom::DisplayManager>> dm_request; + mojo::Connection* connection; scoped_ptr<mojo::InterfaceRequest<mojom::WindowTreeFactory>> wtf_request; }; -MandolineUIServicesApp::MandolineUIServicesApp() - : connector_(nullptr) {} +struct MandolineUIServicesApp::UserState { + scoped_ptr<ws::WindowTreeFactory> window_tree_factory; + scoped_ptr<ws::WindowTreeHostFactory> window_tree_host_factory; +}; + +MandolineUIServicesApp::MandolineUIServicesApp() {} MandolineUIServicesApp::~MandolineUIServicesApp() { - if (gpu_state_) - gpu_state_->StopThreads(); + if (platform_display_init_params_.gpu_state) + platform_display_init_params_.gpu_state->StopThreads(); // Destroy |connection_manager_| first, since it depends on |event_source_|. connection_manager_.reset(); } @@ -95,11 +100,26 @@ resource_loader.ReleaseFile(kResourceFile200), ui::SCALE_FACTOR_200P); } +MandolineUIServicesApp::UserState* MandolineUIServicesApp::GetUserState( + mojo::Connection* connection) { + const ws::UserId& user_id = connection->GetRemoteIdentity().user_id(); + auto it = user_id_to_user_state_.find(user_id); + if (it != user_id_to_user_state_.end()) + return it->second.get(); + user_id_to_user_state_[user_id] = make_scoped_ptr(new UserState); + return user_id_to_user_state_[user_id].get(); +} + +void MandolineUIServicesApp::AddUserIfNecessary(mojo::Connection* connection) { + connection_manager_->user_id_tracker()->AddUserId( + connection->GetRemoteIdentity().user_id()); +} + void MandolineUIServicesApp::Initialize(mojo::Connector* connector, const mojo::Identity& identity, uint32_t id) { - connector_ = connector; - surfaces_state_ = new SurfacesState; + platform_display_init_params_.connector = connector; + platform_display_init_params_.surfaces_state = new SurfacesState; base::PlatformThread::SetName("mus"); @@ -131,8 +151,9 @@ // TODO(rjkroege): It is possible that we might want to generalize the // GpuState object. - gpu_state_ = new GpuState(); - connection_manager_.reset(new ws::ConnectionManager(this, surfaces_state_)); + platform_display_init_params_.gpu_state = new GpuState(); + connection_manager_.reset(new ws::ConnectionManager( + this, platform_display_init_params_.surfaces_state)); tracing_.Initialize(connector, identity.name()); } @@ -140,22 +161,18 @@ bool MandolineUIServicesApp::AcceptConnection(Connection* connection) { connection->AddInterface<Gpu>(this); connection->AddInterface<mojom::DisplayManager>(this); + connection->AddInterface<mojom::UserAccessManager>(this); + connection->AddInterface<WindowTreeHostFactory>(this); connection->AddInterface<mojom::WindowManagerFactoryService>(this); connection->AddInterface<mojom::WindowTreeFactory>(this); - connection->AddInterface<WindowTreeHostFactory>(this); return true; } void MandolineUIServicesApp::OnFirstDisplayReady() { PendingRequests requests; requests.swap(pending_requests_); - for (auto& request : requests) { - // TODO(sky): this needs to cache user id too! - if (request->dm_request) - Create(nullptr, std::move(*request->dm_request)); - else - Create(nullptr, std::move(*request->wtf_request)); - } + for (auto& request : requests) + Create(request->connection, std::move(*request->wtf_request)); } void MandolineUIServicesApp::OnNoMoreDisplays() { @@ -174,69 +191,68 @@ void MandolineUIServicesApp::CreateDefaultDisplays() { // Display manages its own lifetime. - ws::Display* host_impl = new ws::Display( - connection_manager_.get(), connector_, gpu_state_, surfaces_state_); + ws::Display* host_impl = + new ws::Display(connection_manager_.get(), platform_display_init_params_); host_impl->Init(nullptr); } void MandolineUIServicesApp::Create(mojo::Connection* connection, mojom::DisplayManagerRequest request) { - // TODO(sky): validate id. connection_manager_->display_manager() ->GetUserDisplayManager(connection->GetRemoteIdentity().user_id()) ->AddDisplayManagerBinding(std::move(request)); } +void MandolineUIServicesApp::Create(mojo::Connection* connection, + mojom::UserAccessManagerRequest request) { + connection_manager_->user_id_tracker()->Bind(std::move(request)); +} + void MandolineUIServicesApp::Create( mojo::Connection* connection, mojom::WindowManagerFactoryServiceRequest request) { + AddUserIfNecessary(connection); connection_manager_->window_manager_factory_registry()->Register( connection->GetRemoteIdentity().user_id(), std::move(request)); } void MandolineUIServicesApp::Create(Connection* connection, mojom::WindowTreeFactoryRequest request) { + AddUserIfNecessary(connection); if (!connection_manager_->display_manager()->has_displays()) { scoped_ptr<PendingRequest> pending_request(new PendingRequest); + pending_request->connection = connection; pending_request->wtf_request.reset( new mojo::InterfaceRequest<mojom::WindowTreeFactory>( std::move(request))); pending_requests_.push_back(std::move(pending_request)); return; } - if (!window_tree_factory_) { - window_tree_factory_.reset( - new ws::WindowTreeFactory(connection_manager_.get())); + AddUserIfNecessary(connection); + UserState* user_state = GetUserState(connection); + if (!user_state->window_tree_factory) { + user_state->window_tree_factory.reset(new ws::WindowTreeFactory( + connection_manager_.get(), connection->GetRemoteIdentity().user_id())); } - window_tree_factory_->AddBinding(std::move(request)); + user_state->window_tree_factory->AddBinding(std::move(request)); } void MandolineUIServicesApp::Create( Connection* connection, mojom::WindowTreeHostFactoryRequest request) { - factory_bindings_.AddBinding(this, std::move(request)); + UserState* user_state = GetUserState(connection); + if (!user_state->window_tree_host_factory) { + user_state->window_tree_host_factory.reset(new ws::WindowTreeHostFactory( + connection_manager_.get(), connection->GetRemoteIdentity().user_id(), + platform_display_init_params_)); + } + user_state->window_tree_host_factory->AddBinding(std::move(request)); } void MandolineUIServicesApp::Create(mojo::Connection* connection, mojom::GpuRequest request) { - DCHECK(gpu_state_); - new GpuImpl(std::move(request), gpu_state_); -} - -void MandolineUIServicesApp::CreateWindowTreeHost( - mojom::WindowTreeHostRequest host, - mojom::WindowTreeClientPtr tree_client) { - DCHECK(connection_manager_); - - // TODO(fsamuel): We need to make sure that only the window manager can create - // new roots. - ws::Display* host_impl = new ws::Display( - connection_manager_.get(), connector_, gpu_state_, surfaces_state_); - - scoped_ptr<ws::DisplayBindingImpl> display_binding(new ws::DisplayBindingImpl( - std::move(host), host_impl, std::move(tree_client), - connection_manager_.get())); - host_impl->Init(std::move(display_binding)); + DCHECK(platform_display_init_params_.gpu_state); + new GpuImpl(std::move(request), platform_display_init_params_.gpu_state); } } // namespace mus
diff --git a/components/mus/mus_app.h b/components/mus/mus_app.h index e82f7d6..b6a431f 100644 --- a/components/mus/mus_app.h +++ b/components/mus/mus_app.h
@@ -14,11 +14,13 @@ #include "base/memory/scoped_ptr.h" #include "components/mus/public/interfaces/display.mojom.h" #include "components/mus/public/interfaces/gpu.mojom.h" +#include "components/mus/public/interfaces/user_access_manager.mojom.h" #include "components/mus/public/interfaces/window_manager_factory.mojom.h" #include "components/mus/public/interfaces/window_tree.mojom.h" #include "components/mus/public/interfaces/window_tree_host.mojom.h" #include "components/mus/ws/connection_manager_delegate.h" -#include "mojo/public/cpp/bindings/binding_set.h" +#include "components/mus/ws/platform_display_init_params.h" +#include "components/mus/ws/user_id.h" #include "mojo/services/tracing/public/cpp/tracing_impl.h" #include "mojo/shell/public/cpp/interface_factory.h" #include "mojo/shell/public/cpp/shell_client.h" @@ -32,25 +34,20 @@ } namespace mus { - -class GpuState; -class SurfacesState; - namespace ws { class ConnectionManager; class ForwardingWindowManager; -class WindowTreeFactory; } class MandolineUIServicesApp : public mojo::ShellClient, public ws::ConnectionManagerDelegate, public mojo::InterfaceFactory<mojom::DisplayManager>, + public mojo::InterfaceFactory<mojom::UserAccessManager>, public mojo::InterfaceFactory<mojom::WindowManagerFactoryService>, public mojo::InterfaceFactory<mojom::WindowTreeFactory>, public mojo::InterfaceFactory<mojom::WindowTreeHostFactory>, - public mojo::InterfaceFactory<mojom::Gpu>, - public mojom::WindowTreeHostFactory { + public mojo::InterfaceFactory<mojom::Gpu> { public: MandolineUIServicesApp(); ~MandolineUIServicesApp() override; @@ -59,9 +56,20 @@ // Holds InterfaceRequests received before the first WindowTreeHost Display // has been established. struct PendingRequest; + struct UserState; + + using UserIdToUserState = std::map<ws::UserId, scoped_ptr<UserState>>; void InitializeResources(mojo::Connector* connector); + // Returns the user specific state for the user id of |connection|. MusApp + // owns the return value. + // TODO(sky): if we allow removal of user ids then we need to close anything + // associated with the user (all incoming pipes...) on removal. + UserState* GetUserState(mojo::Connection* connection); + + void AddUserIfNecessary(mojo::Connection* connection); + // mojo::ShellClient: void Initialize(mojo::Connector* connector, const mojo::Identity& identity, uint32_t id) override; @@ -81,6 +89,10 @@ void Create(mojo::Connection* connection, mojom::DisplayManagerRequest request) override; + // mojo::InterfaceFactory<mojom::UserAccessManager> implementation. + void Create(mojo::Connection* connection, + mojom::UserAccessManagerRequest request) override; + // mojo::InterfaceFactory<mojom::WindowManagerFactoryService> implementation. void Create(mojo::Connection* connection, mojom::WindowManagerFactoryServiceRequest request) override; @@ -96,22 +108,14 @@ // mojo::InterfaceFactory<mojom::Gpu> implementation. void Create(mojo::Connection* connection, mojom::GpuRequest request) override; - // mojom::WindowTreeHostFactory implementation. - void CreateWindowTreeHost(mojom::WindowTreeHostRequest host, - mojom::WindowTreeClientPtr tree_client) override; - - mojo::BindingSet<mojom::WindowTreeHostFactory> factory_bindings_; - mojo::Connector* connector_; + ws::PlatformDisplayInitParams platform_display_init_params_; scoped_ptr<ws::ConnectionManager> connection_manager_; - scoped_refptr<GpuState> gpu_state_; scoped_ptr<ui::PlatformEventSource> event_source_; mojo::TracingImpl tracing_; using PendingRequests = std::vector<scoped_ptr<PendingRequest>>; PendingRequests pending_requests_; - scoped_ptr<ws::WindowTreeFactory> window_tree_factory_; - // Surfaces - scoped_refptr<SurfacesState> surfaces_state_; + UserIdToUserState user_id_to_user_state_; DISALLOW_COPY_AND_ASSIGN(MandolineUIServicesApp); };
diff --git a/components/mus/public/cpp/tests/BUILD.gn b/components/mus/public/cpp/tests/BUILD.gn index f89b23f..d0c6a05 100644 --- a/components/mus/public/cpp/tests/BUILD.gn +++ b/components/mus/public/cpp/tests/BUILD.gn
@@ -20,6 +20,8 @@ testonly = true sources = [ + "window_server_shelltest_base.cc", + "window_server_shelltest_base.h", "window_server_test_base.cc", "window_server_test_base.h", ] @@ -27,10 +29,13 @@ deps = [ "//base", "//base/test:test_config", + "//components/mus/common:mus_common", "//components/mus/public/cpp", + "//mojo/shell/public/cpp:shell_test_support", "//mojo/shell/public/cpp:sources", "//mojo/shell/public/cpp:test_support", "//testing/gtest", + "//ui/gl", ] }
diff --git a/components/mus/public/cpp/tests/test_window_tree.cc b/components/mus/public/cpp/tests/test_window_tree.cc index 398a6613..ba9ebed 100644 --- a/components/mus/public/cpp/tests/test_window_tree.cc +++ b/components/mus/public/cpp/tests/test_window_tree.cc
@@ -91,6 +91,8 @@ uint32_t change_id, uint32_t transient_window_id) {} +void TestWindowTree::SetModal(uint32_t change_id, uint32_t window_id) {} + void TestWindowTree::ReorderWindow(uint32_t change_id, uint32_t window_id, uint32_t relative_window_id,
diff --git a/components/mus/public/cpp/tests/test_window_tree.h b/components/mus/public/cpp/tests/test_window_tree.h index d3923411..8165c702 100644 --- a/components/mus/public/cpp/tests/test_window_tree.h +++ b/components/mus/public/cpp/tests/test_window_tree.h
@@ -65,6 +65,7 @@ uint32_t transient_window_id) override; void RemoveTransientWindowFromParent(uint32_t change_id, uint32_t window_id) override; + void SetModal(uint32_t change_id, uint32_t window_id) override; void ReorderWindow(uint32_t change_id, uint32_t window_id, uint32_t relative_window_id,
diff --git a/components/mus/public/cpp/tests/window_server_shelltest_base.cc b/components/mus/public/cpp/tests/window_server_shelltest_base.cc new file mode 100644 index 0000000..030c7e0 --- /dev/null +++ b/components/mus/public/cpp/tests/window_server_shelltest_base.cc
@@ -0,0 +1,58 @@ +// 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 "components/mus/public/cpp/tests/window_server_shelltest_base.h" + +#include "base/command_line.h" +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "components/mus/common/args.h" +#include "mojo/shell/public/cpp/shell_client.h" +#include "mojo/shell/public/cpp/shell_test.h" +#include "ui/gl/gl_switches.h" + +namespace mus { + +namespace { + +const char kTestAppName[] = "mojo:mus_ws_unittests_app"; + +class WindowServerShellTestClient : public mojo::test::ShellTestClient { + public: + explicit WindowServerShellTestClient(WindowServerShellTestBase* test) + : ShellTestClient(test), test_(test) {} + ~WindowServerShellTestClient() override {} + + private: + // mojo::test::ShellTestClient: + bool AcceptConnection(mojo::Connection* connection) override { + return test_->AcceptConnection(connection); + } + + WindowServerShellTestBase* test_; + + DISALLOW_COPY_AND_ASSIGN(WindowServerShellTestClient); +}; + +void EnsureCommandLineSwitch(const std::string& name) { + base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); + if (!cmd_line->HasSwitch(name)) + cmd_line->AppendSwitch(name); +} + +} // namespace + +WindowServerShellTestBase::WindowServerShellTestBase() + : ShellTest(kTestAppName) { + EnsureCommandLineSwitch(kUseX11TestConfig); + EnsureCommandLineSwitch(switches::kOverrideUseGLWithOSMesaForTests); +} + +WindowServerShellTestBase::~WindowServerShellTestBase() {} + +scoped_ptr<mojo::ShellClient> WindowServerShellTestBase::CreateShellClient() { + return make_scoped_ptr(new WindowServerShellTestClient(this)); +} + +} // namespace mus
diff --git a/components/mus/public/cpp/tests/window_server_shelltest_base.h b/components/mus/public/cpp/tests/window_server_shelltest_base.h new file mode 100644 index 0000000..8fdb19e --- /dev/null +++ b/components/mus/public/cpp/tests/window_server_shelltest_base.h
@@ -0,0 +1,31 @@ +// 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 COMPONENTS_MUS_PUBLIC_CPP_TESTS_WINDOW_SERVER_SHELLTEST_BASE_H_ +#define COMPONENTS_MUS_PUBLIC_CPP_TESTS_WINDOW_SERVER_SHELLTEST_BASE_H_ + +#include "base/macros.h" +#include "mojo/shell/public/cpp/connection.h" +#include "mojo/shell/public/cpp/shell_test.h" + +namespace mus { + +// Base class for all window manager shelltests to perform some common setup. +class WindowServerShellTestBase : public mojo::test::ShellTest { + public: + WindowServerShellTestBase(); + ~WindowServerShellTestBase() override; + + virtual bool AcceptConnection(mojo::Connection* connection) = 0; + + private: + // mojo::test::ShellTest: + scoped_ptr<mojo::ShellClient> CreateShellClient() override; + + DISALLOW_COPY_AND_ASSIGN(WindowServerShellTestBase); +}; + +} // namespace mus + +#endif // COMPONENTS_MUS_PUBLIC_CPP_TESTS_WINDOW_SERVER_SHELLTEST_BASE_H_
diff --git a/components/mus/public/cpp/tests/window_server_test_base.cc b/components/mus/public/cpp/tests/window_server_test_base.cc index affbf31..fe7a922c0 100644 --- a/components/mus/public/cpp/tests/window_server_test_base.cc +++ b/components/mus/public/cpp/tests/window_server_test_base.cc
@@ -63,7 +63,7 @@ } void WindowServerTestBase::SetUp() { - ApplicationTestBase::SetUp(); + WindowServerShellTestBase::SetUp(); CreateWindowTreeHost(connector(), this, &host_, this); @@ -71,10 +71,6 @@ std::swap(window_manager_, most_recent_connection_); } -mojo::ShellClient* WindowServerTestBase::GetShellClient() { - return this; -} - bool WindowServerTestBase::AcceptConnection(mojo::Connection* connection) { connection->AddInterface<mojom::WindowTreeClient>(this); return true;
diff --git a/components/mus/public/cpp/tests/window_server_test_base.h b/components/mus/public/cpp/tests/window_server_test_base.h index 149fe26..7e04589 100644 --- a/components/mus/public/cpp/tests/window_server_test_base.h +++ b/components/mus/public/cpp/tests/window_server_test_base.h
@@ -7,22 +7,21 @@ #include "base/macros.h" #include "base/memory/scoped_ptr.h" +#include "components/mus/public/cpp/tests/window_server_shelltest_base.h" #include "components/mus/public/cpp/window_manager_delegate.h" #include "components/mus/public/cpp/window_tree_delegate.h" #include "components/mus/public/interfaces/window_tree.mojom.h" #include "components/mus/public/interfaces/window_tree_host.mojom.h" -#include "mojo/shell/public/cpp/application_test_base.h" #include "mojo/shell/public/cpp/interface_factory.h" namespace mus { -// WindowServerTestBase is a base class for use with app tests that use +// WindowServerTestBase is a base class for use with shell tests that use // WindowServer. SetUp() connects to the WindowServer and blocks until OnEmbed() // has been invoked. window_manager() can be used to access the WindowServer // established as part of SetUp(). class WindowServerTestBase - : public mojo::test::ApplicationTestBase, - public mojo::ShellClient, + : public WindowServerShellTestBase, public WindowTreeDelegate, public WindowManagerDelegate, public mojo::InterfaceFactory<mojom::WindowTreeClient> { @@ -62,10 +61,7 @@ // testing::Test: void SetUp() override; - // test::ApplicationTestBase: - mojo::ShellClient* GetShellClient() override; - - // mojo::ShellClient: + // WindowServerShellTestBase: bool AcceptConnection(mojo::Connection* connection) override; // WindowTreeDelegate:
diff --git a/components/mus/public/interfaces/BUILD.gn b/components/mus/public/interfaces/BUILD.gn index 7cba5cec..9b7a778 100644 --- a/components/mus/public/interfaces/BUILD.gn +++ b/components/mus/public/interfaces/BUILD.gn
@@ -19,6 +19,7 @@ "mus_constants.mojom", "quads.mojom", "surface_id.mojom", + "user_access_manager.mojom", "window_manager.mojom", "window_manager_constants.mojom", "window_manager_factory.mojom",
diff --git a/components/mus/public/interfaces/user_access_manager.mojom b/components/mus/public/interfaces/user_access_manager.mojom new file mode 100644 index 0000000..ad0eeed --- /dev/null +++ b/components/mus/public/interfaces/user_access_manager.mojom
@@ -0,0 +1,11 @@ +// 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. + +module mus.mojom; + +// Used to change the active user. +interface UserAccessManager { + // Sets the active user. By default the root user is the active user. + SetActiveUser(string user_id); +};
diff --git a/components/mus/public/interfaces/window_tree.mojom b/components/mus/public/interfaces/window_tree.mojom index 51142974..6ad39901 100644 --- a/components/mus/public/interfaces/window_tree.mojom +++ b/components/mus/public/interfaces/window_tree.mojom
@@ -179,6 +179,13 @@ // This does not change transient window's position in the window hierarchy. RemoveTransientWindowFromParent(uint32 change_id, uint32 transient_window_id); + // Sets |window_id| to be modal to its transient parent. + // This fails if |window_id| does not identify a valid window. + // TODO(mohsen): If |window_id| does not have a transient parent, this will + // have no effect. Plan is to make a window modal to system if it does not + // have a transient parent. + SetModal(uint32 change_id, uint32 window_id); + // Reorders a window in its parent, relative to |relative_window_id| according // to |direction|. Only the connection that created the window's parent can // reorder its children.
diff --git a/components/mus/ws/BUILD.gn b/components/mus/ws/BUILD.gn index e9f94f0..15ec984 100644 --- a/components/mus/ws/BUILD.gn +++ b/components/mus/ws/BUILD.gn
@@ -37,6 +37,8 @@ "platform_display.h", "platform_display_delegate.h", "platform_display_factory.h", + "platform_display_init_params.cc", + "platform_display_init_params.h", "server_window.cc", "server_window.h", "server_window_delegate.h", @@ -74,6 +76,8 @@ "window_tree_binding.h", "window_tree_factory.cc", "window_tree_factory.h", + "window_tree_host_factory.cc", + "window_tree_host_factory.h", ] deps = [ @@ -132,8 +136,7 @@ group("tests") { testonly = true deps = [ - ":apptests", - ":window_manager_unittests", + ":mus_ws_unittests", ] if (!is_android) { deps += @@ -141,7 +144,7 @@ } } -test("window_manager_unittests") { +test("mus_ws_unittests") { sources = [ "display_unittest.cc", "event_dispatcher_unittest.cc", @@ -157,6 +160,7 @@ "user_display_manager_unittest.cc", "window_coordinate_conversions_unittest.cc", "window_finder_unittest.cc", + "window_manager_client_unittest.cc", "window_tree_unittest.cc", ] @@ -168,66 +172,44 @@ "//cc:cc", "//components/mus/common:mus_common", "//components/mus/public/cpp", + "//components/mus/public/cpp/tests:test_support", "//components/mus/public/interfaces", "//components/mus/surfaces", "//mojo/converters/geometry", "//mojo/converters/input_events", "//mojo/converters/transform", - "//mojo/edk/test:run_all_unittests", "//mojo/gles2", - "//mojo/platform_handle:for_shared_library", + "//mojo/platform_handle:for_component", "//mojo/public/cpp/bindings:bindings", + "//mojo/shell/public/cpp:shell_test_support", + "//mojo/shell/public/cpp:sources", + "//mojo/shell/public/cpp:test_support", + "//mojo/shell/public/cpp/test:run_all_shelltests", "//mojo/shell/public/interfaces", "//testing/gtest", "//ui/events", "//ui/gfx", "//ui/gfx:test_support", "//ui/gfx/geometry", + "//ui/gl", "//ui/mojo/geometry:interfaces", + "//ui/mojo/geometry:util", ] if (!is_android) { # TODO(GYP) Enable on Android when osmesa links. deps += [ "//third_party/mesa:osmesa" ] } -} - -mojo_native_application("apptests") { - output_name = "mus_apptests" - testonly = true - - sources = [ - "window_manager_client_apptest.cc", - "window_tree_apptest.cc", - ] - - deps = [ - ":manifest", - ":test_support", - "//base", - "//base/test:test_config", - "//components/mus/common:mus_common", - "//components/mus/public/cpp", - "//components/mus/public/cpp/tests:test_support", - "//components/mus/public/interfaces", - "//mojo/converters/geometry", - "//mojo/shell/public/cpp:sources", - "//mojo/shell/public/cpp:test_support", - "//ui/gfx:test_support", - "//ui/gfx/geometry", - "//ui/mojo/geometry:interfaces", - "//ui/mojo/geometry:util", - ] - - data_deps = [ - ":lib", - ] if (use_x11) { deps += [ "//tools/xdisplaycheck" ] } + + data_deps = [ + ":mus_ws_unittests_app_manifest", + ] } -mojo_application_manifest("manifest") { - application_name = "mus_apptests" - source = "apptest_manifest.json" +mojo_application_manifest("mus_ws_unittests_app_manifest") { + application_name = "mus_ws_unittests_app" + source = "mus_ws_unittests_app_manifest.json" }
diff --git a/components/mus/ws/access_policy.h b/components/mus/ws/access_policy.h index 81e2d3b..4ce1540 100644 --- a/components/mus/ws/access_policy.h +++ b/components/mus/ws/access_policy.h
@@ -32,6 +32,7 @@ const ServerWindow* child) const = 0; virtual bool CanRemoveTransientWindowFromParent( const ServerWindow* window) const = 0; + virtual bool CanSetModal(const ServerWindow* window) const = 0; virtual bool CanReorderWindow(const ServerWindow* window, const ServerWindow* relative_window, mojom::OrderDirection direction) const = 0;
diff --git a/components/mus/ws/apptest_manifest.json b/components/mus/ws/apptest_manifest.json deleted file mode 100644 index 6306189c2..0000000 --- a/components/mus/ws/apptest_manifest.json +++ /dev/null
@@ -1,5 +0,0 @@ -{ - "name": "mojo:mus_apptests", - "display_name": "Mus Apptests", - "capabilities": { "*": [ "*" ] } -}
diff --git a/components/mus/ws/connection_manager.cc b/components/mus/ws/connection_manager.cc index 4ef84619..2e1dd134 100644 --- a/components/mus/ws/connection_manager.cc +++ b/components/mus/ws/connection_manager.cc
@@ -69,8 +69,10 @@ WindowTree* ConnectionManager::EmbedAtWindow( ServerWindow* root, uint32_t policy_bitmask, + const UserId& user_id, mojom::WindowTreeClientPtr client) { - scoped_ptr<WindowTree> tree_ptr(new WindowTree(this, root, policy_bitmask)); + scoped_ptr<WindowTree> tree_ptr( + new WindowTree(this, user_id, root, policy_bitmask)); WindowTree* tree = tree_ptr.get(); mojom::WindowTreePtr window_tree_ptr; @@ -96,12 +98,13 @@ WindowTree* ConnectionManager::CreateTreeForWindowManager( Display* display, mojom::WindowManagerFactory* factory, - ServerWindow* root) { + ServerWindow* root, + const UserId& user_id) { mojom::DisplayPtr display_ptr = display->ToMojomDisplay(); mojom::WindowTreeClientPtr tree_client; factory->CreateWindowManager(std::move(display_ptr), GetProxy(&tree_client)); - scoped_ptr<WindowTree> tree_ptr( - new WindowTree(this, root, mojom::WindowTree::kAccessPolicyEmbedRoot)); + scoped_ptr<WindowTree> tree_ptr(new WindowTree( + this, user_id, root, mojom::WindowTree::kAccessPolicyEmbedRoot)); WindowTree* tree = tree_ptr.get(); scoped_ptr<DefaultWindowTreeBinding> binding(new DefaultWindowTreeBinding( tree_ptr.get(), this, std::move(tree_client))); @@ -461,6 +464,11 @@ if (in_destructor_) return; + WindowManagerState* wms = + display_manager_->GetWindowManagerAndDisplay(window).window_manager_state; + if (wms) + wms->ReleaseCaptureBlockedByAnyModalWindow(); + ProcessWindowHierarchyChanged(window, new_parent, old_parent); // TODO(beng): optimize. @@ -526,6 +534,16 @@ } } +void ConnectionManager::OnWindowVisibilityChanged(ServerWindow* window) { + if (in_destructor_) + return; + + WindowManagerState* wms = + display_manager_->GetWindowManagerAndDisplay(window).window_manager_state; + if (wms) + wms->ReleaseCaptureBlockedByModalWindow(window); +} + void ConnectionManager::OnWindowPredefinedCursorChanged(ServerWindow* window, int32_t cursor_id) { if (in_destructor_)
diff --git a/components/mus/ws/connection_manager.h b/components/mus/ws/connection_manager.h index fe3bc95..3fe49874 100644 --- a/components/mus/ws/connection_manager.h +++ b/components/mus/ws/connection_manager.h
@@ -71,6 +71,7 @@ // |transport_window_id| is valid. WindowTree* EmbedAtWindow(ServerWindow* root, uint32_t policy_bitmask, + const UserId& user_id, mojom::WindowTreeClientPtr client); // Adds |tree_impl_ptr| to the set of known trees. Use DestroyTree() to @@ -80,7 +81,8 @@ mojom::WindowTreePtr tree_ptr); WindowTree* CreateTreeForWindowManager(Display* display, mojom::WindowManagerFactory* factory, - ServerWindow* root); + ServerWindow* root, + const UserId& user_id); // Invoked when a WindowTree's connection encounters an error. void DestroyTree(WindowTree* tree); @@ -240,6 +242,7 @@ ServerWindow* relative, mojom::OrderDirection direction) override; void OnWillChangeWindowVisibility(ServerWindow* window) override; + void OnWindowVisibilityChanged(ServerWindow* window) override; void OnWindowSharedPropertyChanged( ServerWindow* window, const std::string& name,
diff --git a/components/mus/ws/default_access_policy.cc b/components/mus/ws/default_access_policy.cc index d55c860..7c8c062 100644 --- a/components/mus/ws/default_access_policy.cc +++ b/components/mus/ws/default_access_policy.cc
@@ -51,6 +51,11 @@ WasCreatedByThisConnection(window->transient_parent())); } +bool DefaultAccessPolicy::CanSetModal(const ServerWindow* window) const { + return delegate_->HasRootForAccessPolicy(window) || + WasCreatedByThisConnection(window); +} + bool DefaultAccessPolicy::CanReorderWindow( const ServerWindow* window, const ServerWindow* relative_window,
diff --git a/components/mus/ws/default_access_policy.h b/components/mus/ws/default_access_policy.h index da8db324..af93e78 100644 --- a/components/mus/ws/default_access_policy.h +++ b/components/mus/ws/default_access_policy.h
@@ -31,6 +31,7 @@ const ServerWindow* child) const override; bool CanRemoveTransientWindowFromParent( const ServerWindow* window) const override; + bool CanSetModal(const ServerWindow* window) const override; bool CanReorderWindow(const ServerWindow* window, const ServerWindow* relative_window, mojom::OrderDirection direction) const override;
diff --git a/components/mus/ws/display.cc b/components/mus/ws/display.cc index b2a97fe..19291f91 100644 --- a/components/mus/ws/display.cc +++ b/components/mus/ws/display.cc
@@ -13,6 +13,7 @@ #include "components/mus/ws/display_manager.h" #include "components/mus/ws/focus_controller.h" #include "components/mus/ws/platform_display.h" +#include "components/mus/ws/platform_display_init_params.h" #include "components/mus/ws/window_manager_factory_service.h" #include "components/mus/ws/window_manager_state.h" #include "components/mus/ws/window_tree.h" @@ -25,13 +26,10 @@ namespace ws { Display::Display(ConnectionManager* connection_manager, - mojo::Connector* connector, - const scoped_refptr<GpuState>& gpu_state, - const scoped_refptr<SurfacesState>& surfaces_state) + const PlatformDisplayInitParams& platform_display_init_params) : id_(connection_manager->display_manager()->GetAndAdvanceNextDisplayId()), connection_manager_(connection_manager), - platform_display_( - PlatformDisplay::Create(connector, gpu_state, surfaces_state)), + platform_display_(PlatformDisplay::Create(platform_display_init_params)), last_cursor_(0) { platform_display_->Init(this); @@ -286,7 +284,7 @@ WindowManagerState* wms = wms_ptr.get(); window_manager_state_map_[service->user_id()] = std::move(wms_ptr); wms->tree_ = connection_manager_->CreateTreeForWindowManager( - this, service->window_manager_factory(), wms->root()); + this, service->window_manager_factory(), wms->root(), service->user_id()); } ServerWindow* Display::GetRootWindow() {
diff --git a/components/mus/ws/display.h b/components/mus/ws/display.h index 1ec923f..0df8dff 100644 --- a/components/mus/ws/display.h +++ b/components/mus/ws/display.h
@@ -32,6 +32,7 @@ class DisplayBinding; class DisplayManager; class FocusController; +struct PlatformDisplayInitParams; class WindowManagerState; class WindowTree; @@ -56,14 +57,8 @@ public UserIdTrackerObserver, public WindowManagerFactoryRegistryObserver { public: - // TODO(fsamuel): All these parameters are just plumbing for creating - // PlatformDisplays. We should probably just store these common parameters - // in the PlatformDisplayFactory and pass them along on - // PlatformDisplay::Create. Display(ConnectionManager* connection_manager, - mojo::Connector* connector, - const scoped_refptr<GpuState>& gpu_state, - const scoped_refptr<SurfacesState>& surfaces_state); + const PlatformDisplayInitParams& platform_display_init_params); ~Display() override; // Initializes state that depends on the existence of a Display.
diff --git a/components/mus/ws/display_binding.cc b/components/mus/ws/display_binding.cc index 4226da5c..4ccb390 100644 --- a/components/mus/ws/display_binding.cc +++ b/components/mus/ws/display_binding.cc
@@ -7,15 +7,18 @@ #include "components/mus/ws/connection_manager.h" #include "components/mus/ws/display.h" #include "components/mus/ws/window_tree.h" +#include "mojo/shell/public/interfaces/connector.mojom.h" namespace mus { namespace ws { DisplayBindingImpl::DisplayBindingImpl(mojom::WindowTreeHostRequest request, Display* display, + const UserId& user_id, mojom::WindowTreeClientPtr client, ConnectionManager* manager) : connection_manager_(manager), + user_id_(user_id), binding_(display, std::move(request)), client_(std::move(client)) {} @@ -23,7 +26,8 @@ WindowTree* DisplayBindingImpl::CreateWindowTree(ServerWindow* root) { WindowTree* tree = connection_manager_->EmbedAtWindow( - root, mojom::WindowTree::kAccessPolicyEmbedRoot, std::move(client_)); + root, mojom::WindowTree::kAccessPolicyEmbedRoot, user_id_, + std::move(client_)); tree->ConfigureWindowManager(); return tree; }
diff --git a/components/mus/ws/display_binding.h b/components/mus/ws/display_binding.h index 9ee1f51f31..6bfc3c9 100644 --- a/components/mus/ws/display_binding.h +++ b/components/mus/ws/display_binding.h
@@ -9,6 +9,7 @@ #include "base/memory/scoped_ptr.h" #include "components/mus/public/interfaces/window_tree_host.mojom.h" #include "components/mus/ws/display.h" +#include "components/mus/ws/user_id.h" #include "mojo/public/cpp/bindings/binding.h" namespace mus { @@ -35,6 +36,7 @@ public: DisplayBindingImpl(mojom::WindowTreeHostRequest request, Display* display, + const UserId& user_id, mojom::WindowTreeClientPtr client, ConnectionManager* connection_manager); ~DisplayBindingImpl() override; @@ -44,6 +46,7 @@ WindowTree* CreateWindowTree(ServerWindow* root) override; ConnectionManager* connection_manager_; + const UserId user_id_; mojo::Binding<mojom::WindowTreeHost> binding_; mojom::WindowTreeClientPtr client_;
diff --git a/components/mus/ws/event_dispatcher.cc b/components/mus/ws/event_dispatcher.cc index c7eca9ec..57efcc1d9 100644 --- a/components/mus/ws/event_dispatcher.cc +++ b/components/mus/ws/event_dispatcher.cc
@@ -235,14 +235,18 @@ UpdateCursorProviderByLastKnownLocation(); } -void EventDispatcher::SetCaptureWindow(ServerWindow* window, +bool EventDispatcher::SetCaptureWindow(ServerWindow* window, bool in_nonclient_area) { if (window == capture_window_) - return; + return true; + + // A window that is blocked by a modal window cannot gain capture. + if (window && window->IsBlockedByModalWindow()) + return false; if (capture_window_) { // Stop observing old capture window. |pointer_targets_| are cleared on - // intial setting of a capture window. + // initial setting of a capture window. delegate_->OnServerWindowCaptureLost(capture_window_); capture_window_->RemoveObserver(this); } else { @@ -264,7 +268,7 @@ pair.second.is_mouse_event ? ui::EventPointerType::POINTER_TYPE_MOUSE : ui::EventPointerType::POINTER_TYPE_TOUCH; // TODO(jonross): Track previous location in PointerTarget for sending - // cancels + // cancels. ui::PointerEvent event(event_type, pointer_type, gfx::Point(), gfx::Point(), ui::EF_NONE, pair.first, ui::EventTimeForNow()); @@ -286,6 +290,7 @@ capture_window_ = window; capture_window_in_nonclient_area_ = in_nonclient_area; + return true; } void EventDispatcher::UpdateCursorProviderByLastKnownLocation() { @@ -470,10 +475,12 @@ const ui::PointerEvent& event) const { PointerTarget pointer_target; gfx::Point location(event.location()); - pointer_target.window = + ServerWindow* target_window = FindDeepestVisibleWindowForEvents(root_, surface_id_, &location); + pointer_target.window = target_window->GetModalTarget(); pointer_target.is_mouse_event = event.IsMousePointerEvent(); pointer_target.in_nonclient_area = + target_window != pointer_target.window || IsLocationInNonclientArea(pointer_target.window, location); pointer_target.is_pointer_down = event.type() == ui::ET_POINTER_DOWN; return pointer_target;
diff --git a/components/mus/ws/event_dispatcher.h b/components/mus/ws/event_dispatcher.h index 800ba8a..30868e8 100644 --- a/components/mus/ws/event_dispatcher.h +++ b/components/mus/ws/event_dispatcher.h
@@ -57,7 +57,9 @@ // details. ServerWindow* capture_window() { return capture_window_; } const ServerWindow* capture_window() const { return capture_window_; } - void SetCaptureWindow(ServerWindow* capture_window, bool in_nonclient_area); + // Setting capture can fail if the window is blocked by a modal window + // (indicated by returning |false|). + bool SetCaptureWindow(ServerWindow* capture_window, bool in_nonclient_area); // Retrieves the ServerWindow of the last mouse move. ServerWindow* mouse_cursor_source_window() const {
diff --git a/components/mus/ws/event_dispatcher_unittest.cc b/components/mus/ws/event_dispatcher_unittest.cc index ea34f1c..3273c3c 100644 --- a/components/mus/ws/event_dispatcher_unittest.cc +++ b/components/mus/ws/event_dispatcher_unittest.cc
@@ -183,9 +183,10 @@ bool AreAnyPointersDown() const; // Deletes everything created during SetUp() void ClearSetup(); - // Creates a window which is a child of |root_window_|. It is not owned by - // EventDispatcherTest. - ServerWindow* CreateChildWindow(const WindowId& id); + scoped_ptr<ServerWindow> CreateChildWindowWithParent(const WindowId& id, + ServerWindow* parent); + // Creates a window which is a child of |root_window_|. + scoped_ptr<ServerWindow> CreateChildWindow(const WindowId& id); bool IsMouseButtonDown() const; bool IsWindowPointerTarget(ServerWindow* window) const; int NumberPointerTargetsForWindow(ServerWindow* window) const; @@ -214,14 +215,21 @@ event_dispatcher_.reset(); } -ServerWindow* EventDispatcherTest::CreateChildWindow(const WindowId& id) { - ServerWindow* child = new ServerWindow(window_delegate_.get(), id); - root_window_->Add(child); +scoped_ptr<ServerWindow> EventDispatcherTest::CreateChildWindowWithParent( + const WindowId& id, + ServerWindow* parent) { + scoped_ptr<ServerWindow> child(new ServerWindow(window_delegate_.get(), id)); + parent->Add(child.get()); child->SetVisible(true); - EnableHitTest(child); + EnableHitTest(child.get()); return child; } +scoped_ptr<ServerWindow> EventDispatcherTest::CreateChildWindow( + const WindowId& id) { + return CreateChildWindowWithParent(id, root_window_.get()); +} + bool EventDispatcherTest::IsMouseButtonDown() const { return EventDispatcherTestApi(event_dispatcher_.get()).is_mouse_button_down(); } @@ -253,7 +261,7 @@ } TEST_F(EventDispatcherTest, ProcessEvent) { - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -377,7 +385,7 @@ TEST_F(EventDispatcherTest, Capture) { ServerWindow* root = root_window(); - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -419,7 +427,7 @@ } TEST_F(EventDispatcherTest, CaptureMultipleMouseButtons) { - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -462,7 +470,7 @@ } TEST_F(EventDispatcherTest, ClientAreaGoesToOwner) { - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -531,7 +539,7 @@ } TEST_F(EventDispatcherTest, AdditionalClientArea) { - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -557,8 +565,8 @@ } TEST_F(EventDispatcherTest, DontFocusOnSecondDown) { - scoped_ptr<ServerWindow> child1(CreateChildWindow(WindowId(1, 3))); - scoped_ptr<ServerWindow> child2(CreateChildWindow(WindowId(1, 4))); + scoped_ptr<ServerWindow> child1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> child2 = CreateChildWindow(WindowId(1, 4)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child1->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -592,8 +600,8 @@ } TEST_F(EventDispatcherTest, TwoPointersActive) { - scoped_ptr<ServerWindow> child1(CreateChildWindow(WindowId(1, 3))); - scoped_ptr<ServerWindow> child2(CreateChildWindow(WindowId(1, 4))); + scoped_ptr<ServerWindow> child1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> child2 = CreateChildWindow(WindowId(1, 4)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child1->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -651,7 +659,7 @@ } TEST_F(EventDispatcherTest, DestroyWindowWhileGettingEvents) { - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -681,7 +689,7 @@ TEST_F(EventDispatcherTest, MouseInExtendedHitTestRegion) { ServerWindow* root = root_window(); - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -731,8 +739,8 @@ // TODO(moshayedi): crbug.com/590226. Enable this after we support wheel events // in mus event dispatcher. TEST_F(EventDispatcherTest, DISABLED_WheelWhileDown) { - scoped_ptr<ServerWindow> child1(CreateChildWindow(WindowId(1, 3))); - scoped_ptr<ServerWindow> child2(CreateChildWindow(WindowId(1, 4))); + scoped_ptr<ServerWindow> child1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> child2 = CreateChildWindow(WindowId(1, 4)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child1->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -761,7 +769,7 @@ // appropriate target window. TEST_F(EventDispatcherTest, SetExplicitCapture) { ServerWindow* root = root_window(); - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -855,7 +863,7 @@ // capture. TEST_F(EventDispatcherTest, ExplicitCaptureOverridesImplicitCapture) { ServerWindow* root = root_window(); - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -977,8 +985,8 @@ // Tests that when explicit capture is changed, that the previous window with // capture is no longer being observed. TEST_F(EventDispatcherTest, UpdatingCaptureStopsObservingPreviousCapture) { - scoped_ptr<ServerWindow> child1(CreateChildWindow(WindowId(1, 3))); - scoped_ptr<ServerWindow> child2(CreateChildWindow(WindowId(1, 4))); + scoped_ptr<ServerWindow> child1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> child2 = CreateChildWindow(WindowId(1, 4)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child1->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -1000,7 +1008,7 @@ // Tests that destroying a window with explicit capture clears the capture // state. TEST_F(EventDispatcherTest, DestroyingCaptureWindowRemovesExplicitCapture) { - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); EventDispatcher* dispatcher = event_dispatcher(); @@ -1042,7 +1050,7 @@ } TEST_F(EventDispatcherTest, ProcessPointerEvents) { - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -1089,7 +1097,7 @@ } TEST_F(EventDispatcherTest, ResetClearsPointerDown) { - scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3))); + scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3)); root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); child->SetBounds(gfx::Rect(10, 10, 20, 20)); @@ -1125,6 +1133,179 @@ EXPECT_EQ(nullptr, event_dispatcher()->capture_window()); } +// Tests that events on a modal parent target the modal child. +TEST_F(EventDispatcherTest, ModalWindowEventOnModalParent) { + scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5)); + + root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + + w1->AddTransientWindow(w2.get()); + w2->SetModal(); + + // Send event that is over |w1|. + const ui::PointerEvent mouse_pressed(ui::MouseEvent( + ui::ET_MOUSE_PRESSED, gfx::Point(15, 15), gfx::Point(15, 15), + base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON)); + event_dispatcher()->ProcessEvent(mouse_pressed); + + scoped_ptr<DispatchedEventDetails> details = + test_event_dispatcher_delegate()->GetAndAdvanceDispatchedEventDetails(); + ASSERT_TRUE(details); + EXPECT_EQ(w2.get(), details->window); + EXPECT_TRUE(details->in_nonclient_area); + + ASSERT_TRUE(details->event); + ASSERT_TRUE(details->event->IsPointerEvent()); + + ui::PointerEvent* dispatched_event = details->event->AsPointerEvent(); + EXPECT_EQ(gfx::Point(15, 15), dispatched_event->root_location()); + EXPECT_EQ(gfx::Point(-35, 5), dispatched_event->location()); +} + +// Tests that events on a modal child target the modal child itself. +TEST_F(EventDispatcherTest, ModalWindowEventOnModalChild) { + scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5)); + + root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + + w1->AddTransientWindow(w2.get()); + w2->SetModal(); + + // Send event that is over |w2|. + const ui::PointerEvent mouse_pressed(ui::MouseEvent( + ui::ET_MOUSE_PRESSED, gfx::Point(55, 15), gfx::Point(55, 15), + base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON)); + event_dispatcher()->ProcessEvent(mouse_pressed); + + scoped_ptr<DispatchedEventDetails> details = + test_event_dispatcher_delegate()->GetAndAdvanceDispatchedEventDetails(); + ASSERT_TRUE(details); + EXPECT_EQ(w2.get(), details->window); + EXPECT_FALSE(details->in_nonclient_area); + + ASSERT_TRUE(details->event); + ASSERT_TRUE(details->event->IsPointerEvent()); + + ui::PointerEvent* dispatched_event = details->event->AsPointerEvent(); + EXPECT_EQ(gfx::Point(55, 15), dispatched_event->root_location()); + EXPECT_EQ(gfx::Point(5, 5), dispatched_event->location()); +} + +// Tests that events on an unrelated window are not affected by the modal +// window. +TEST_F(EventDispatcherTest, ModalWindowEventOnUnrelatedWindow) { + scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5)); + scoped_ptr<ServerWindow> w3 = CreateChildWindow(WindowId(1, 6)); + + root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + w3->SetBounds(gfx::Rect(70, 10, 10, 10)); + + w1->AddTransientWindow(w2.get()); + w2->SetModal(); + + // Send event that is over |w3|. + const ui::PointerEvent mouse_pressed(ui::MouseEvent( + ui::ET_MOUSE_PRESSED, gfx::Point(75, 15), gfx::Point(75, 15), + base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON)); + event_dispatcher()->ProcessEvent(mouse_pressed); + + scoped_ptr<DispatchedEventDetails> details = + test_event_dispatcher_delegate()->GetAndAdvanceDispatchedEventDetails(); + ASSERT_TRUE(details); + EXPECT_EQ(w3.get(), details->window); + EXPECT_FALSE(details->in_nonclient_area); + + ASSERT_TRUE(details->event); + ASSERT_TRUE(details->event->IsPointerEvent()); + + ui::PointerEvent* dispatched_event = details->event->AsPointerEvent(); + EXPECT_EQ(gfx::Point(75, 15), dispatched_event->root_location()); + EXPECT_EQ(gfx::Point(5, 5), dispatched_event->location()); +} + +// Tests that events events on a descendant of a modal parent target the modal +// child. +TEST_F(EventDispatcherTest, ModalWindowEventOnDescendantOfModalParent) { + scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> w11 = + CreateChildWindowWithParent(WindowId(1, 4), w1.get()); + scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5)); + + root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + w11->SetBounds(gfx::Rect(10, 10, 10, 10)); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + + w1->AddTransientWindow(w2.get()); + w2->SetModal(); + + // Send event that is over |w11|. + const ui::PointerEvent mouse_pressed(ui::MouseEvent( + ui::ET_MOUSE_PRESSED, gfx::Point(25, 25), gfx::Point(25, 25), + base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON)); + event_dispatcher()->ProcessEvent(mouse_pressed); + + scoped_ptr<DispatchedEventDetails> details = + test_event_dispatcher_delegate()->GetAndAdvanceDispatchedEventDetails(); + ASSERT_TRUE(details); + EXPECT_EQ(w2.get(), details->window); + EXPECT_TRUE(details->in_nonclient_area); + + ASSERT_TRUE(details->event); + ASSERT_TRUE(details->event->IsPointerEvent()); + + ui::PointerEvent* dispatched_event = details->event->AsPointerEvent(); + EXPECT_EQ(gfx::Point(25, 25), dispatched_event->root_location()); + EXPECT_EQ(gfx::Point(-25, 15), dispatched_event->location()); +} + + +// Tests that setting capture to a descendant of a modal parent fails. +TEST_F(EventDispatcherTest, ModalWindowSetCaptureDescendantOfModalParent) { + scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> w11 = + CreateChildWindowWithParent(WindowId(1, 4), w1.get()); + scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5)); + + root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + w11->SetBounds(gfx::Rect(10, 10, 10, 10)); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + + w1->AddTransientWindow(w2.get()); + w2->SetModal(); + + EXPECT_FALSE(event_dispatcher()->SetCaptureWindow(w11.get(), false)); + EXPECT_EQ(nullptr, event_dispatcher()->capture_window()); +} + +// Tests that setting capture to a window unrelated to a modal parent works. +TEST_F(EventDispatcherTest, ModalWindowSetCaptureUnrelatedWindow) { + scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); + scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5)); + scoped_ptr<ServerWindow> w3 = CreateChildWindow(WindowId(1, 6)); + + root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + w3->SetBounds(gfx::Rect(70, 10, 10, 10)); + + w1->AddTransientWindow(w2.get()); + w2->SetModal(); + + EXPECT_TRUE(event_dispatcher()->SetCaptureWindow(w3.get(), false)); + EXPECT_EQ(w3.get(), event_dispatcher()->capture_window()); +} + } // namespace test } // namespace ws } // namespace mus
diff --git a/components/mus/ws/mus_ws_unittests_app_manifest.json b/components/mus/ws/mus_ws_unittests_app_manifest.json new file mode 100644 index 0000000..ad68fd6c --- /dev/null +++ b/components/mus/ws/mus_ws_unittests_app_manifest.json
@@ -0,0 +1,5 @@ +{ + "name": "mojo:mus_ws_unittests_app", + "display_name": "Mus Window Server Unittests", + "capabilities": { "*": [ "*" ] } +}
diff --git a/components/mus/ws/platform_display.cc b/components/mus/ws/platform_display.cc index 73ff810..4e7536e 100644 --- a/components/mus/ws/platform_display.cc +++ b/components/mus/ws/platform_display.cc
@@ -155,22 +155,18 @@ // static PlatformDisplay* PlatformDisplay::Create( - mojo::Connector* connector, - const scoped_refptr<GpuState>& gpu_state, - const scoped_refptr<SurfacesState>& surfaces_state) { + const PlatformDisplayInitParams& init_params) { if (factory_) - return factory_->CreatePlatformDisplay(connector, gpu_state, - surfaces_state); - return new DefaultPlatformDisplay(connector, gpu_state, surfaces_state); + return factory_->CreatePlatformDisplay(); + + return new DefaultPlatformDisplay(init_params); } DefaultPlatformDisplay::DefaultPlatformDisplay( - mojo::Connector* connector, - const scoped_refptr<GpuState>& gpu_state, - const scoped_refptr<SurfacesState>& surfaces_state) - : connector_(connector), - gpu_state_(gpu_state), - surfaces_state_(surfaces_state), + const PlatformDisplayInitParams& init_params) + : connector_(init_params.connector), + gpu_state_(init_params.gpu_state), + surfaces_state_(init_params.surfaces_state), delegate_(nullptr), draw_timer_(false, false), frame_pending_(false),
diff --git a/components/mus/ws/platform_display.h b/components/mus/ws/platform_display.h index 3f04483f..ea11212 100644 --- a/components/mus/ws/platform_display.h +++ b/components/mus/ws/platform_display.h
@@ -19,6 +19,7 @@ #include "components/mus/public/interfaces/window_manager_constants.mojom.h" #include "components/mus/public/interfaces/window_tree.mojom.h" #include "components/mus/ws/platform_display_delegate.h" +#include "components/mus/ws/platform_display_init_params.h" #include "mojo/public/cpp/bindings/callback.h" #include "ui/gfx/geometry/rect.h" #include "ui/platform_window/platform_window_delegate.h" @@ -61,10 +62,7 @@ public: virtual ~PlatformDisplay() {} - static PlatformDisplay* Create( - mojo::Connector* connector, - const scoped_refptr<GpuState>& gpu_state, - const scoped_refptr<SurfacesState>& surfaces_state); + static PlatformDisplay* Create(const PlatformDisplayInitParams& init_params); virtual void Init(PlatformDisplayDelegate* delegate) = 0; @@ -111,9 +109,7 @@ class DefaultPlatformDisplay : public PlatformDisplay, public ui::PlatformWindowDelegate { public: - DefaultPlatformDisplay(mojo::Connector* connector, - const scoped_refptr<GpuState>& gpu_state, - const scoped_refptr<SurfacesState>& surfaces_state); + explicit DefaultPlatformDisplay(const PlatformDisplayInitParams& init_params); ~DefaultPlatformDisplay() override; // PlatformDisplay:
diff --git a/components/mus/ws/platform_display_factory.h b/components/mus/ws/platform_display_factory.h index 040393c..1cad7dd8 100644 --- a/components/mus/ws/platform_display_factory.h +++ b/components/mus/ws/platform_display_factory.h
@@ -5,15 +5,7 @@ #ifndef COMPONENTS_MUS_WS_PLATFORM_DISPLAY_FACTORY_H_ #define COMPONENTS_MUS_WS_PLATFORM_DISPLAY_FACTORY_H_ -#include "components/mus/gles2/gpu_state.h" -#include "mojo/public/cpp/bindings/callback.h" - -namespace mojo { -class Connector; -} - namespace mus { - namespace ws { class PlatformDisplay; @@ -22,14 +14,10 @@ // PlatformDisplays. class PlatformDisplayFactory { public: - virtual PlatformDisplay* CreatePlatformDisplay( - mojo::Connector* connector, - const scoped_refptr<mus::GpuState>& gpu_state, - const scoped_refptr<mus::SurfacesState>& surfaces_state) = 0; + virtual PlatformDisplay* CreatePlatformDisplay() = 0; }; } // namespace ws - } // namespace mus #endif // COMPONENTS_MUS_WS_PLATFORM_DISPLAY_FACTORY_H_
diff --git a/components/mus/ws/platform_display_init_params.cc b/components/mus/ws/platform_display_init_params.cc new file mode 100644 index 0000000..398a6ba --- /dev/null +++ b/components/mus/ws/platform_display_init_params.cc
@@ -0,0 +1,17 @@ +// 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 "components/mus/ws/platform_display_init_params.h" + +#include "components/mus/gles2/gpu_state.h" +#include "components/mus/surfaces/surfaces_state.h" + +namespace mus { +namespace ws { + +PlatformDisplayInitParams::PlatformDisplayInitParams() {} +PlatformDisplayInitParams::~PlatformDisplayInitParams() {} + +} // namespace ws +} // namespace mus
diff --git a/components/mus/ws/platform_display_init_params.h b/components/mus/ws/platform_display_init_params.h new file mode 100644 index 0000000..81cc1b0 --- /dev/null +++ b/components/mus/ws/platform_display_init_params.h
@@ -0,0 +1,33 @@ +// 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 COMPONENTS_MUS_WS_PLATFORM_DISPLAY_INIT_PARAMS_H_ +#define COMPONENTS_MUS_WS_PLATFORM_DISPLAY_INIT_PARAMS_H_ + +#include "base/memory/ref_counted.h" + +namespace mojo { +class Connector; +} + +namespace mus { + +class GpuState; +class SurfacesState; + +namespace ws { + +struct PlatformDisplayInitParams { + PlatformDisplayInitParams(); + ~PlatformDisplayInitParams(); + + mojo::Connector* connector = nullptr; + scoped_refptr<GpuState> gpu_state; + scoped_refptr<SurfacesState> surfaces_state; +}; + +} // namespace ws +} // namespace mus + +#endif // COMPONENTS_MUS_WS_PLATFORM_DISPLAY_INIT_PARAMS_H_
diff --git a/components/mus/ws/server_window.cc b/components/mus/ws/server_window.cc index 518c0640..8c546a1 100644 --- a/components/mus/ws/server_window.cc +++ b/components/mus/ws/server_window.cc
@@ -18,6 +18,28 @@ namespace ws { +namespace { + +const ServerWindow* GetModalChildForWindowAncestor(const ServerWindow* window) { + for (const ServerWindow* ancestor = window; ancestor; + ancestor = ancestor->parent()) { + for (const auto& transient_child : ancestor->transient_children()) { + if (transient_child->is_modal() && transient_child->IsDrawn()) + return transient_child; + } + } + return nullptr; +} + +const ServerWindow* GetModalTargetForWindow(const ServerWindow* window) { + const ServerWindow* modal_window = GetModalChildForWindowAncestor(window); + if (!modal_window) + return window; + return GetModalTargetForWindow(modal_window); +} + +} // namespace + ServerWindow::ServerWindow(ServerWindowDelegate* delegate, const WindowId& id) : ServerWindow(delegate, id, Properties()) {} @@ -29,6 +51,7 @@ parent_(nullptr), stacking_target_(nullptr), transient_parent_(nullptr), + is_modal_(false), visible_(false), cursor_id_(mojom::Cursor::CURSOR_NULL), opacity_(1), @@ -241,6 +264,18 @@ OnTransientWindowRemoved(this, child)); } +void ServerWindow::SetModal() { + is_modal_ = true; +} + +bool ServerWindow::IsBlockedByModalWindow() const { + return !!GetModalChildForWindowAncestor(this); +} + +const ServerWindow* ServerWindow::GetModalTarget() const { + return GetModalTargetForWindow(this); +} + bool ServerWindow::Contains(const ServerWindow* window) const { for (const ServerWindow* parent = window; parent; parent = parent->parent_) { if (parent == this)
diff --git a/components/mus/ws/server_window.h b/components/mus/ws/server_window.h index 46a1b21b..6987f91 100644 --- a/components/mus/ws/server_window.h +++ b/components/mus/ws/server_window.h
@@ -108,6 +108,20 @@ const Windows& transient_children() const { return transient_children_; } + bool is_modal() const { return is_modal_; } + void SetModal(); + + bool IsBlockedByModalWindow() const; + + // Returns the window that events targeted to this window should be retargeted + // to; according to modal windows. If any modal window is blocking this + // window, returns the topmost one; otherwise, returns this window. + const ServerWindow* GetModalTarget() const; + ServerWindow* GetModalTarget() { + return const_cast<ServerWindow*>( + static_cast<const ServerWindow*>(this)->GetModalTarget()); + } + // Returns true if this contains |window| or is |window|. bool Contains(const ServerWindow* window) const; @@ -197,6 +211,7 @@ ServerWindow* transient_parent_; Windows transient_children_; + bool is_modal_; bool visible_; gfx::Rect bounds_; gfx::Insets client_area_;
diff --git a/components/mus/ws/test_utils.cc b/components/mus/ws/test_utils.cc index 1f3b0dc..2cb74915 100644 --- a/components/mus/ws/test_utils.cc +++ b/components/mus/ws/test_utils.cc
@@ -87,10 +87,7 @@ TestPlatformDisplayFactory::~TestPlatformDisplayFactory() {} -PlatformDisplay* TestPlatformDisplayFactory::CreatePlatformDisplay( - mojo::Connector* connector, - const scoped_refptr<GpuState>& gpu_state, - const scoped_refptr<mus::SurfacesState>& surfaces_state) { +PlatformDisplay* TestPlatformDisplayFactory::CreatePlatformDisplay() { return new TestPlatformDisplay(cursor_id_storage_); } @@ -280,8 +277,7 @@ for (int i = 0; i < num_displays_to_create_; ++i) { // Display manages its own lifetime. Display* display = - new Display(connection_manager_, nullptr, scoped_refptr<GpuState>(), - scoped_refptr<mus::SurfacesState>()); + new Display(connection_manager_, PlatformDisplayInitParams()); display->Init(nullptr); } }
diff --git a/components/mus/ws/test_utils.h b/components/mus/ws/test_utils.h index d431e24..f8d615df 100644 --- a/components/mus/ws/test_utils.h +++ b/components/mus/ws/test_utils.h
@@ -139,10 +139,7 @@ ~TestPlatformDisplayFactory(); // PlatformDisplayFactory: - PlatformDisplay* CreatePlatformDisplay( - mojo::Connector* connector, - const scoped_refptr<GpuState>& gpu_state, - const scoped_refptr<mus::SurfacesState>& surfaces_state) override; + PlatformDisplay* CreatePlatformDisplay() override; private: int32_t* cursor_id_storage_;
diff --git a/components/mus/ws/user_display_manager_unittest.cc b/components/mus/ws/user_display_manager_unittest.cc index bf02e01fd..d2ff1c26 100644 --- a/components/mus/ws/user_display_manager_unittest.cc +++ b/components/mus/ws/user_display_manager_unittest.cc
@@ -20,6 +20,7 @@ #include "components/mus/ws/ids.h" #include "components/mus/ws/platform_display.h" #include "components/mus/ws/platform_display_factory.h" +#include "components/mus/ws/platform_display_init_params.h" #include "components/mus/ws/server_window.h" #include "components/mus/ws/test_utils.h" #include "components/mus/ws/window_manager_state.h" @@ -208,8 +209,7 @@ // Add another display. Display* display2 = - new Display(connection_manager_.get(), nullptr, scoped_refptr<GpuState>(), - scoped_refptr<mus::SurfacesState>()); + new Display(connection_manager_.get(), PlatformDisplayInitParams()); display2->Init(nullptr); // Observer should not have been notified yet as frame decorations not set.
diff --git a/components/mus/ws/user_id.h b/components/mus/ws/user_id.h index f0197018..dbb59965 100644 --- a/components/mus/ws/user_id.h +++ b/components/mus/ws/user_id.h
@@ -12,6 +12,10 @@ using UserId = std::string; +inline UserId InvalidUserId() { + return std::string(); +} + } // namespace ws } // namespace mus
diff --git a/components/mus/ws/user_id_tracker.cc b/components/mus/ws/user_id_tracker.cc index 3a54f64..ac9062e 100644 --- a/components/mus/ws/user_id_tracker.cc +++ b/components/mus/ws/user_id_tracker.cc
@@ -10,10 +10,10 @@ namespace mus { namespace ws { -UserIdTracker::UserIdTracker() - : active_id_(mojo::shell::mojom::kRootUserID) {} +UserIdTracker::UserIdTracker() : active_id_(mojo::shell::mojom::kRootUserID) { + ids_.insert(active_id_); +} UserIdTracker::~UserIdTracker() { - DCHECK(ids_.empty()); } bool UserIdTracker::IsValidUserId(const UserId& id) const { @@ -31,7 +31,9 @@ } void UserIdTracker::AddUserId(const UserId& id) { - DCHECK(!IsValidUserId(id)); + if (IsValidUserId(id)) + return; + ids_.insert(id); FOR_EACH_OBSERVER(UserIdTrackerObserver, observers_, OnUserIdAdded(id)); } @@ -50,5 +52,15 @@ observers_.RemoveObserver(observer); } +void UserIdTracker::Bind(mojom::UserAccessManagerRequest request) { + bindings_.AddBinding(this, std::move(request)); +} + +void UserIdTracker::SetActiveUser(const mojo::String& user_id) { + if (!IsValidUserId(user_id)) + AddUserId(user_id); + SetActiveUserId(user_id); +} + } // namespace ws } // namespace mus
diff --git a/components/mus/ws/user_id_tracker.h b/components/mus/ws/user_id_tracker.h index e1f5cf3..c0b2ca5 100644 --- a/components/mus/ws/user_id_tracker.h +++ b/components/mus/ws/user_id_tracker.h
@@ -11,7 +11,9 @@ #include "base/macros.h" #include "base/observer_list.h" +#include "components/mus/public/interfaces/user_access_manager.mojom.h" #include "components/mus/ws/user_id.h" +#include "mojo/public/cpp/bindings/binding_set.h" namespace mus { namespace ws { @@ -19,15 +21,16 @@ class UserIdTrackerObserver; // Tracks the set of known/valid user ids. -class UserIdTracker { +class UserIdTracker : public mojom::UserAccessManager { public: UserIdTracker(); - ~UserIdTracker(); + ~UserIdTracker() override; bool IsValidUserId(const UserId& id) const; const UserId& active_id() const { return active_id_; } + // Adds a new known user. Does nothing if |id| is not known. void SetActiveUserId(const UserId& id); void AddUserId(const UserId& id); void RemoveUserId(const UserId& id); @@ -35,13 +38,21 @@ void AddObserver(UserIdTrackerObserver* observer); void RemoveObserver(UserIdTrackerObserver* observer); + void Bind(mojom::UserAccessManagerRequest request); + private: using UserIdSet = std::set<UserId>; + // mojom::UserAccessManager: + void SetActiveUser(const mojo::String& user_id) override; + base::ObserverList<UserIdTrackerObserver> observers_; + UserIdSet ids_; UserId active_id_; + mojo::BindingSet<mojom::UserAccessManager> bindings_; + DISALLOW_COPY_AND_ASSIGN(UserIdTracker); };
diff --git a/components/mus/ws/window_manager_access_policy.cc b/components/mus/ws/window_manager_access_policy.cc index e31bac59..d8be6ac 100644 --- a/components/mus/ws/window_manager_access_policy.cc +++ b/components/mus/ws/window_manager_access_policy.cc
@@ -42,6 +42,11 @@ return true; } +bool WindowManagerAccessPolicy::CanSetModal( + const ServerWindow* window) const { + return true; +} + bool WindowManagerAccessPolicy::CanReorderWindow( const ServerWindow* window, const ServerWindow* relative_window,
diff --git a/components/mus/ws/window_manager_access_policy.h b/components/mus/ws/window_manager_access_policy.h index bed716b4..67f0e73 100644 --- a/components/mus/ws/window_manager_access_policy.h +++ b/components/mus/ws/window_manager_access_policy.h
@@ -30,6 +30,7 @@ const ServerWindow* child) const override; bool CanRemoveTransientWindowFromParent( const ServerWindow* window) const override; + bool CanSetModal(const ServerWindow* window) const override; bool CanReorderWindow(const ServerWindow* window, const ServerWindow* relative_window, mojom::OrderDirection direction) const override;
diff --git a/components/mus/ws/window_manager_client_apptest.cc b/components/mus/ws/window_manager_client_unittest.cc similarity index 99% rename from components/mus/ws/window_manager_client_apptest.cc rename to components/mus/ws/window_manager_client_unittest.cc index fe3cc179..33623de 100644 --- a/components/mus/ws/window_manager_client_apptest.cc +++ b/components/mus/ws/window_manager_client_unittest.cc
@@ -16,7 +16,6 @@ #include "components/mus/public/cpp/window_tree_connection_observer.h" #include "components/mus/public/cpp/window_tree_delegate.h" #include "mojo/converters/geometry/geometry_type_converters.h" -#include "mojo/shell/public/cpp/application_test_base.h" #include "ui/gfx/geometry/rect.h" #include "ui/mojo/geometry/geometry_util.h" @@ -845,8 +844,7 @@ ValidIndexOf(parent->children(), child1)); } -// Very flaky: http://crbug.com/592313. -TEST_F(WindowServerTest, DISABLED_ActivationNext) { +TEST_F(WindowServerTest, ActivationNext) { Window* parent = GetFirstWMRoot(); Window* child1 = NewVisibleWindow(parent, window_manager()); Window* child2 = NewVisibleWindow(parent, window_manager());
diff --git a/components/mus/ws/window_manager_state.cc b/components/mus/ws/window_manager_state.cc index 2a6d983..2ae1a24 100644 --- a/components/mus/ws/window_manager_state.cc +++ b/components/mus/ws/window_manager_state.cc
@@ -106,15 +106,36 @@ ->OnFrameDecorationValuesChanged(this); } -void WindowManagerState::SetCapture(ServerWindow* window, +bool WindowManagerState::SetCapture(ServerWindow* window, bool in_nonclient_area) { // TODO(sky): capture should be a singleton. Need to route to // ConnectionManager so that all other EventDispatchers are updated. DCHECK(IsActive()); if (capture_window() == window) - return; + return true; DCHECK(!window || root_->Contains(window)); - event_dispatcher_.SetCaptureWindow(window, in_nonclient_area); + return event_dispatcher_.SetCaptureWindow(window, in_nonclient_area); +} + +void WindowManagerState::ReleaseCaptureBlockedByModalWindow( + const ServerWindow* modal_window) { + if (!capture_window() || !modal_window->is_modal() || + !modal_window->IsDrawn()) + return; + + if (modal_window->transient_parent() && + !modal_window->transient_parent()->Contains(capture_window())) { + return; + } + + SetCapture(nullptr, false); +} + +void WindowManagerState::ReleaseCaptureBlockedByAnyModalWindow() { + if (!capture_window() || !capture_window()->IsBlockedByModalWindow()) + return; + + SetCapture(nullptr, false); } mojom::DisplayPtr WindowManagerState::ToMojomDisplay() const {
diff --git a/components/mus/ws/window_manager_state.h b/components/mus/ws/window_manager_state.h index af6f389..b93cbfdc 100644 --- a/components/mus/ws/window_manager_state.h +++ b/components/mus/ws/window_manager_state.h
@@ -66,12 +66,20 @@ return got_frame_decoration_values_; } - void SetCapture(ServerWindow* window, bool in_nonclient_area); + bool SetCapture(ServerWindow* window, bool in_nonclient_area); ServerWindow* capture_window() { return event_dispatcher_.capture_window(); } const ServerWindow* capture_window() const { return event_dispatcher_.capture_window(); } + // Checks if |modal_window| is a visible modal window that blocks current + // capture window and if that's the case, releases the capture. + void ReleaseCaptureBlockedByModalWindow(const ServerWindow* modal_window); + + // Checks if the current capture window is blocked by any visible modal window + // and if that's the case, releases the capture. + void ReleaseCaptureBlockedByAnyModalWindow(); + // Returns true if this is the WindowManager of the active user. bool IsActive() const;
diff --git a/components/mus/ws/window_tree.cc b/components/mus/ws/window_tree.cc index 90e5c57..cf7179e 100644 --- a/components/mus/ws/window_tree.cc +++ b/components/mus/ws/window_tree.cc
@@ -66,9 +66,11 @@ }; WindowTree::WindowTree(ConnectionManager* connection_manager, + const UserId& user_id, ServerWindow* root, uint32_t policy_bitmask) : connection_manager_(connection_manager), + user_id_(user_id), id_(connection_manager_->GetAndAdvanceNextConnectionId()), next_window_id_(1), event_ack_id_(0), @@ -196,8 +198,7 @@ (!current_capture_window || access_policy_->CanSetCapture(current_capture_window)) && event_ack_id_) { - wms->SetCapture(window, !HasRoot(window)); - return true; + return wms->SetCapture(window, !HasRoot(window)); } return false; } @@ -244,6 +245,18 @@ return false; } +bool WindowTree::SetModal(const ClientWindowId& window_id) { + ServerWindow* window = GetWindowByClientId(window_id); + if (window && access_policy_->CanSetModal(window)) { + window->SetModal(); + WindowManagerState* wms = GetWindowManagerState(window); + if (wms) + wms->ReleaseCaptureBlockedByModalWindow(window); + return true; + } + return false; +} + std::vector<const ServerWindow*> WindowTree::GetWindowTree( const ClientWindowId& window_id) const { const ServerWindow* window = GetWindowByClientId(window_id); @@ -274,8 +287,10 @@ return false; ServerWindow* window = GetWindowByClientId(window_id); PrepareForEmbed(window); + // When embedding we don't know the user id of where the TreeClient came + // from. Use an invalid id, which limits what the client is able to do. WindowTree* new_tree = connection_manager_->EmbedAtWindow( - window, policy_bitmask, std::move(client)); + window, policy_bitmask, InvalidUserId(), std::move(client)); if (is_embed_root_) *connection_id = new_tree->id(); return true; @@ -925,12 +940,14 @@ DCHECK(!waiting_for_top_level_window_info_); const ClientWindowId client_window_id(transport_window_id); // TODO(sky): need a way for client to provide context to figure out display. - // TODO(sky): get WMS for user_id for this connection. Display* display = display_manager()->displays().empty() ? nullptr : *(display_manager()->displays().begin()); + // TODO(sky): move checks to accesspolicy. WindowManagerState* wms = - display ? display->GetFirstWindowManagerState() : nullptr; + display && user_id_ != InvalidUserId() + ? display->GetWindowManagerStateForUser(user_id_) + : nullptr; if (!wms || wms->tree() == this || !IsValidIdForNewWindow(client_window_id)) { client()->OnChangeCompleted(change_id, false); return; @@ -1008,6 +1025,10 @@ client()->OnChangeCompleted(change_id, success); } +void WindowTree::SetModal(uint32_t change_id, Id window_id) { + client()->OnChangeCompleted(change_id, SetModal(ClientWindowId(window_id))); +} + void WindowTree::ReorderWindow(uint32_t change_id, Id window_id, Id relative_window_id, @@ -1048,7 +1069,7 @@ window == current_capture_window; if (success) { Operation op(this, connection_manager_, OperationType::RELEASE_CAPTURE); - wms->SetCapture(nullptr, false); + success = wms->SetCapture(nullptr, false); } client()->OnChangeCompleted(change_id, success); }
diff --git a/components/mus/ws/window_tree.h b/components/mus/ws/window_tree.h index 4dcb880..4810bd45 100644 --- a/components/mus/ws/window_tree.h +++ b/components/mus/ws/window_tree.h
@@ -20,6 +20,7 @@ #include "components/mus/public/interfaces/window_tree.mojom.h" #include "components/mus/ws/access_policy_delegate.h" #include "components/mus/ws/ids.h" +#include "components/mus/ws/user_id.h" #include "components/mus/ws/window_tree_binding.h" #include "mojo/public/cpp/bindings/associated_binding.h" @@ -58,6 +59,7 @@ public mojom::WindowManagerClient { public: WindowTree(ConnectionManager* connection_manager, + const UserId& user_id, ServerWindow* root, uint32_t policy_bitmask); ~WindowTree() override; @@ -70,6 +72,8 @@ ConnectionSpecificId id() const { return id_; } + const UserId& user_id() const { return user_id_; } + mojom::WindowTreeClient* client() { return binding_->client(); } // Returns the Window with the specified id. @@ -128,6 +132,7 @@ const ClientWindowId& child_id); bool AddTransientWindow(const ClientWindowId& window_id, const ClientWindowId& transient_window_id); + bool SetModal(const ClientWindowId& window_id); std::vector<const ServerWindow*> GetWindowTree( const ClientWindowId& window_id) const; bool SetWindowVisibility(const ClientWindowId& window_id, bool visible); @@ -312,6 +317,7 @@ Id transient_window) override; void RemoveTransientWindowFromParent(uint32_t change_id, Id transient_window_id) override; + void SetModal(uint32_t change_id, Id window_id) override; void ReorderWindow(uint32_t change_Id, Id window_id, Id relative_window_id, @@ -388,6 +394,8 @@ ConnectionManager* connection_manager_; + const UserId user_id_; + // Id of this tree as assigned by ConnectionManager. const ConnectionSpecificId id_;
diff --git a/components/mus/ws/window_tree_apptest.cc b/components/mus/ws/window_tree_client_unittest.cc similarity index 96% rename from components/mus/ws/window_tree_apptest.cc rename to components/mus/ws/window_tree_client_unittest.cc index 89704350..7401a9a 100644 --- a/components/mus/ws/window_tree_apptest.cc +++ b/components/mus/ws/window_tree_client_unittest.cc
@@ -10,13 +10,14 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" +#include "components/mus/public/cpp/tests/window_server_shelltest_base.h" #include "components/mus/public/interfaces/window_tree.mojom.h" #include "components/mus/public/interfaces/window_tree_host.mojom.h" #include "components/mus/ws/ids.h" #include "components/mus/ws/test_change_tracker.h" #include "mojo/converters/geometry/geometry_type_converters.h" #include "mojo/public/cpp/bindings/associated_binding.h" -#include "mojo/shell/public/cpp/application_test_base.h" +#include "mojo/shell/public/cpp/shell_test.h" using mojo::Array; using mojo::Callback; @@ -472,12 +473,12 @@ } // namespace -class WindowTreeAppTest : public mojo::test::ApplicationTestBase, - public mojo::ShellClient { +class WindowTreeClientTest : public WindowServerShellTestBase { public: - WindowTreeAppTest() + WindowTreeClientTest() : connection_id_1_(0), connection_id_2_(0), root_window_id_(0) {} - ~WindowTreeAppTest() override {} + + ~WindowTreeClientTest() override {} protected: // Returns the changes from the various connections. @@ -567,12 +568,17 @@ return client; } - // ApplicationTestBase: - mojo::ShellClient* GetShellClient() override { return this; } + // WindowServerShellTestBase: + bool AcceptConnection(mojo::Connection* connection) override { + connection->AddInterface(client_factory_.get()); + return true; + } + void SetUp() override { - ApplicationTestBase::SetUp(); client_factory_.reset(new WindowTreeClientFactory()); + WindowServerShellTestBase::SetUp(); + mojom::WindowTreeHostFactoryPtr factory; connector()->ConnectToInterface("mojo:mus", &factory); @@ -599,12 +605,6 @@ changes1()->clear(); } - // mojo::ShellClient implementation. - bool AcceptConnection(Connection* connection) override { - connection->AddInterface(client_factory_.get()); - return true; - } - scoped_ptr<TestWindowTreeClientImpl> wt_client1_; scoped_ptr<TestWindowTreeClientImpl> wt_client2_; scoped_ptr<TestWindowTreeClientImpl> wt_client3_; @@ -617,11 +617,11 @@ int connection_id_2_; Id root_window_id_; - DISALLOW_COPY_AND_ASSIGN(WindowTreeAppTest); + DISALLOW_COPY_AND_ASSIGN(WindowTreeClientTest); }; // Verifies two clients/connections get different ids. -TEST_F(WindowTreeAppTest, TwoClientsGetDifferentConnectionIds) { +TEST_F(WindowTreeClientTest, TwoClientsGetDifferentConnectionIds) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); ASSERT_EQ(1u, changes2()->size()); @@ -629,7 +629,7 @@ } // Verifies when Embed() is invoked any child windows are removed. -TEST_F(WindowTreeAppTest, WindowsRemovedWhenEmbedding) { +TEST_F(WindowTreeClientTest, WindowsRemovedWhenEmbedding) { // Two windows 1 and 2. 2 is parented to 1. Id window_1_1 = wt_client1()->NewWindow(1); ASSERT_TRUE(window_1_1); @@ -699,7 +699,7 @@ // Verifies once Embed() has been invoked the parent connection can't see any // children. -TEST_F(WindowTreeAppTest, CantAccessChildrenOfEmbeddedWindow) { +TEST_F(WindowTreeClientTest, CantAccessChildrenOfEmbeddedWindow) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -748,7 +748,7 @@ } // Verifies once Embed() has been invoked the parent can't mutate the children. -TEST_F(WindowTreeAppTest, CantModifyChildrenOfEmbeddedWindow) { +TEST_F(WindowTreeClientTest, CantModifyChildrenOfEmbeddedWindow) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -773,7 +773,7 @@ } // Verifies client gets a valid id. -TEST_F(WindowTreeAppTest, NewWindow) { +TEST_F(WindowTreeClientTest, NewWindow) { Id window_1_1 = wt_client1()->NewWindow(1); ASSERT_TRUE(window_1_1); EXPECT_TRUE(changes1()->empty()); @@ -789,7 +789,7 @@ } // Verifies AddWindow fails when window is already in position. -TEST_F(WindowTreeAppTest, AddWindowWithNoChange) { +TEST_F(WindowTreeClientTest, AddWindowWithNoChange) { // Create the embed point now so that the ids line up. ASSERT_TRUE(wt_client1()->NewWindow(1)); Id window_1_2 = wt_client1()->NewWindow(2); @@ -807,7 +807,7 @@ } // Verifies AddWindow fails when window is already in position. -TEST_F(WindowTreeAppTest, AddAncestorFails) { +TEST_F(WindowTreeClientTest, AddAncestorFails) { // Create the embed point now so that the ids line up. ASSERT_TRUE(wt_client1()->NewWindow(1)); Id window_1_2 = wt_client1()->NewWindow(2); @@ -825,7 +825,7 @@ } // Verifies adding to root sends right notifications. -TEST_F(WindowTreeAppTest, AddToRoot) { +TEST_F(WindowTreeClientTest, AddToRoot) { // Create the embed point now so that the ids line up. Id window_1_1 = wt_client1()->NewWindow(1); ASSERT_TRUE(window_1_1); @@ -851,7 +851,7 @@ } // Verifies HierarchyChanged is correctly sent for various adds/removes. -TEST_F(WindowTreeAppTest, WindowHierarchyChangedWindows) { +TEST_F(WindowTreeClientTest, WindowHierarchyChangedWindows) { // Create the embed point now so that the ids line up. Id window_1_1 = wt_client1()->NewWindow(1); // 1,2->1,11. @@ -922,7 +922,7 @@ } } -TEST_F(WindowTreeAppTest, WindowHierarchyChangedAddingKnownToUnknown) { +TEST_F(WindowTreeClientTest, WindowHierarchyChangedAddingKnownToUnknown) { // Create the following structure: root -> 1 -> 11 and 2->21 (2 has no // parent). ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); @@ -970,7 +970,7 @@ } } -TEST_F(WindowTreeAppTest, ReorderWindow) { +TEST_F(WindowTreeClientTest, ReorderWindow) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_2_1 = wt_client2()->NewWindow(1); @@ -1043,7 +1043,7 @@ } // Verifies DeleteWindow works. -TEST_F(WindowTreeAppTest, DeleteWindow) { +TEST_F(WindowTreeClientTest, DeleteWindow) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); Id window_2_1 = wt_client2()->NewWindow(1); @@ -1073,14 +1073,14 @@ } // Verifies DeleteWindow isn't allowed from a separate connection. -TEST_F(WindowTreeAppTest, DeleteWindowFromAnotherConnectionDisallowed) { +TEST_F(WindowTreeClientTest, DeleteWindowFromAnotherConnectionDisallowed) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); EXPECT_FALSE(wt_client2()->DeleteWindow(BuildWindowId(connection_id_1(), 1))); } // Verifies if a window was deleted and then reused that other clients are // properly notified. -TEST_F(WindowTreeAppTest, ReuseDeletedWindowId) { +TEST_F(WindowTreeClientTest, ReuseDeletedWindowId) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); Id window_2_1 = wt_client2()->NewWindow(1); @@ -1125,7 +1125,7 @@ } // Assertions for GetWindowTree. -TEST_F(WindowTreeAppTest, GetWindowTree) { +TEST_F(WindowTreeClientTest, GetWindowTree) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -1183,7 +1183,7 @@ } } -TEST_F(WindowTreeAppTest, SetWindowBounds) { +TEST_F(WindowTreeClientTest, SetWindowBounds) { Id window_1_1 = wt_client1()->NewWindow(1); ASSERT_TRUE(window_1_1); ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1)); @@ -1211,7 +1211,7 @@ } // Verify AddWindow fails when trying to manipulate windows in other roots. -TEST_F(WindowTreeAppTest, CantMoveWindowsFromOtherRoot) { +TEST_F(WindowTreeClientTest, CantMoveWindowsFromOtherRoot) { // Create 1 and 2 in the first connection. Id window_1_1 = wt_client1()->NewWindow(1); Id window_1_2 = wt_client1()->NewWindow(2); @@ -1231,7 +1231,7 @@ // Verify RemoveWindowFromParent fails for windows that are descendants of the // roots. -TEST_F(WindowTreeAppTest, CantRemoveWindowsInOtherRoots) { +TEST_F(WindowTreeClientTest, CantRemoveWindowsInOtherRoots) { // Create 1 and 2 in the first connection and parent both to the root. Id window_1_1 = wt_client1()->NewWindow(1); Id window_1_2 = wt_client1()->NewWindow(2); @@ -1274,7 +1274,7 @@ } // Verify GetWindowTree fails for windows that are not descendants of the roots. -TEST_F(WindowTreeAppTest, CantGetWindowTreeOfOtherRoots) { +TEST_F(WindowTreeClientTest, CantGetWindowTreeOfOtherRoots) { // Create 1 and 2 in the first connection and parent both to the root. Id window_1_1 = wt_client1()->NewWindow(1); Id window_1_2 = wt_client1()->NewWindow(2); @@ -1303,7 +1303,7 @@ windows[0].ToString()); } -TEST_F(WindowTreeAppTest, EmbedWithSameWindowId) { +TEST_F(WindowTreeClientTest, EmbedWithSameWindowId) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); changes2()->clear(); @@ -1327,7 +1327,7 @@ } } -TEST_F(WindowTreeAppTest, EmbedWithSameWindowId2) { +TEST_F(WindowTreeClientTest, EmbedWithSameWindowId2) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); changes2()->clear(); @@ -1398,7 +1398,7 @@ } // Assertions for SetWindowVisibility. -TEST_F(WindowTreeAppTest, SetWindowVisibility) { +TEST_F(WindowTreeClientTest, SetWindowVisibility) { // Create 1 and 2 in the first connection and parent both to the root. Id window_1_1 = wt_client1()->NewWindow(1); Id window_1_2 = wt_client1()->NewWindow(2); @@ -1474,7 +1474,7 @@ } // Test that we hear the cursor change in other connections. -TEST_F(WindowTreeAppTest, SetCursor) { +TEST_F(WindowTreeClientTest, SetCursor) { // Get a second connection to listen in. ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -1489,7 +1489,7 @@ } // Assertions for SetWindowVisibility sending notifications. -TEST_F(WindowTreeAppTest, SetWindowVisibilityNotifications) { +TEST_F(WindowTreeClientTest, SetWindowVisibilityNotifications) { // Create 1,1 and 1,2. 1,2 is made a child of 1,1 and 1,1 a child of the root. Id window_1_1 = wt_client1()->NewWindow(1); ASSERT_TRUE(window_1_1); @@ -1581,7 +1581,7 @@ } } -TEST_F(WindowTreeAppTest, SetWindowProperty) { +TEST_F(WindowTreeClientTest, SetWindowProperty) { Id window_1_1 = wt_client1()->NewWindow(1); ASSERT_TRUE(window_1_1); @@ -1629,7 +1629,7 @@ } } -TEST_F(WindowTreeAppTest, OnEmbeddedAppDisconnected) { +TEST_F(WindowTreeClientTest, OnEmbeddedAppDisconnected) { // Create connection 2 and 3. ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -1657,7 +1657,7 @@ // Verifies when the parent of an Embed() is destroyed the embedded app gets // a WindowDeleted (and doesn't trigger a DCHECK). -TEST_F(WindowTreeAppTest, OnParentOfEmbedDisconnects) { +TEST_F(WindowTreeClientTest, OnParentOfEmbedDisconnects) { // Create connection 2 and 3. ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -1681,7 +1681,7 @@ // Verifies WindowTreeImpl doesn't incorrectly erase from its internal // map when a window from another connection with the same window_id is removed. -TEST_F(WindowTreeAppTest, DontCleanMapOnDestroy) { +TEST_F(WindowTreeClientTest, DontCleanMapOnDestroy) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); ASSERT_TRUE(wt_client2()->NewWindow(1)); @@ -1696,7 +1696,7 @@ } // Verifies Embed() works when supplying a WindowTreeClient. -TEST_F(WindowTreeAppTest, EmbedSupplyingWindowTreeClient) { +TEST_F(WindowTreeClientTest, EmbedSupplyingWindowTreeClient) { ASSERT_TRUE(wt_client1()->NewWindow(1)); TestWindowTreeClientImpl client2; @@ -1709,7 +1709,7 @@ SingleChangeToDescription(*client2.tracker()->changes())); } -TEST_F(WindowTreeAppTest, EmbedFailsFromOtherConnection) { +TEST_F(WindowTreeClientTest, EmbedFailsFromOtherConnection) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -1729,7 +1729,7 @@ } // Verifies Embed() from window manager on another connections window works. -TEST_F(WindowTreeAppTest, EmbedFromOtherConnection) { +TEST_F(WindowTreeClientTest, EmbedFromOtherConnection) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -1746,7 +1746,7 @@ EXPECT_EQ(std::string(), SingleChangeToDescription(*changes2())); } -TEST_F(WindowTreeAppTest, CantEmbedFromConnectionRoot) { +TEST_F(WindowTreeClientTest, CantEmbedFromConnectionRoot) { // Shouldn't be able to embed into the root. ASSERT_FALSE(EmbedUrl(connector(), wt1(), test_name(), root_window_id())); @@ -1778,7 +1778,7 @@ } // Verifies that a transient window tracks its parent's lifetime. -TEST_F(WindowTreeAppTest, TransientWindowTracksTransientParentLifetime) { +TEST_F(WindowTreeClientTest, TransientWindowTracksTransientParentLifetime) { ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); Id window_1_1 = BuildWindowId(connection_id_1(), 1); @@ -1823,7 +1823,7 @@ ChangesToDescription1(*changes1())[1]); } -TEST_F(WindowTreeAppTest, Ids) { +TEST_F(WindowTreeClientTest, Ids) { const Id window_1_100 = wt_client1()->NewWindow(100); ASSERT_TRUE(window_1_100); ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_100)); @@ -1869,7 +1869,7 @@ // Tests that setting capture fails when no input event has occurred, and there // is no notification of lost capture. -TEST_F(WindowTreeAppTest, ExplicitCaptureWithoutInput) { +TEST_F(WindowTreeClientTest, ExplicitCaptureWithoutInput) { Id window_1_1 = wt_client1()->NewWindow(1); // Add the window to the root, so that they have a Display to handle input @@ -1891,7 +1891,7 @@ // TODO(jonross): Enable this once apptests can send input events to the server. // Enabling capture requires that the connection be processing events. -TEST_F(WindowTreeAppTest, DISABLED_ExplicitCapturePropagation) { +TEST_F(WindowTreeClientTest, DISABLED_ExplicitCapturePropagation) { Id window_1_1 = wt_client1()->NewWindow(1); Id window_1_2 = wt_client1()->NewWindow(2);
diff --git a/components/mus/ws/window_tree_factory.cc b/components/mus/ws/window_tree_factory.cc index 14231ccb..56654ce 100644 --- a/components/mus/ws/window_tree_factory.cc +++ b/components/mus/ws/window_tree_factory.cc
@@ -11,8 +11,9 @@ namespace mus { namespace ws { -WindowTreeFactory::WindowTreeFactory(ConnectionManager* connection_manager) - : connection_manager_(connection_manager) {} +WindowTreeFactory::WindowTreeFactory(ConnectionManager* connection_manager, + const UserId& user_id) + : connection_manager_(connection_manager), user_id_(user_id) {} WindowTreeFactory::~WindowTreeFactory() {} @@ -24,8 +25,9 @@ void WindowTreeFactory::CreateWindowTree( mojo::InterfaceRequest<mojom::WindowTree> tree_request, mojom::WindowTreeClientPtr client) { - scoped_ptr<ws::WindowTree> service(new ws::WindowTree( - connection_manager_, nullptr, mojom::WindowTree::kAccessPolicyDefault)); + scoped_ptr<ws::WindowTree> service( + new ws::WindowTree(connection_manager_, user_id_, nullptr, + mojom::WindowTree::kAccessPolicyDefault)); scoped_ptr<ws::DefaultWindowTreeBinding> binding( new ws::DefaultWindowTreeBinding(service.get(), connection_manager_, std::move(tree_request),
diff --git a/components/mus/ws/window_tree_factory.h b/components/mus/ws/window_tree_factory.h index e0569c0..fcc2862a 100644 --- a/components/mus/ws/window_tree_factory.h +++ b/components/mus/ws/window_tree_factory.h
@@ -7,6 +7,7 @@ #include "base/macros.h" #include "components/mus/public/interfaces/window_tree.mojom.h" +#include "components/mus/ws/user_id.h" #include "mojo/public/cpp/bindings/binding_set.h" namespace mus { @@ -16,7 +17,8 @@ class WindowTreeFactory : public mus::mojom::WindowTreeFactory { public: - explicit WindowTreeFactory(ConnectionManager* connection_manager); + WindowTreeFactory(ConnectionManager* connection_manager, + const UserId& user_id); ~WindowTreeFactory() override; void AddBinding( @@ -28,6 +30,7 @@ private: ConnectionManager* connection_manager_; + const UserId user_id_; mojo::BindingSet<mus::mojom::WindowTreeFactory> binding_;
diff --git a/components/mus/ws/window_tree_host_factory.cc b/components/mus/ws/window_tree_host_factory.cc new file mode 100644 index 0000000..c8886b7 --- /dev/null +++ b/components/mus/ws/window_tree_host_factory.cc
@@ -0,0 +1,43 @@ +// 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 "components/mus/ws/window_tree_host_factory.h" + +#include "components/mus/gles2/gpu_state.h" +#include "components/mus/surfaces/surfaces_state.h" +#include "components/mus/ws/connection_manager.h" +#include "components/mus/ws/display.h" +#include "components/mus/ws/display_binding.h" + +namespace mus { +namespace ws { + +WindowTreeHostFactory::WindowTreeHostFactory( + ConnectionManager* connection_manager, + const UserId& user_id, + const PlatformDisplayInitParams& platform_display_init_params) + : connection_manager_(connection_manager), + user_id_(user_id), + platform_display_init_params_(platform_display_init_params) {} + +WindowTreeHostFactory::~WindowTreeHostFactory() {} + +void WindowTreeHostFactory::AddBinding( + mojom::WindowTreeHostFactoryRequest request) { + bindings_.AddBinding(this, std::move(request)); +} + +void WindowTreeHostFactory::CreateWindowTreeHost( + mojom::WindowTreeHostRequest host, + mojom::WindowTreeClientPtr tree_client) { + Display* display = + new Display(connection_manager_, platform_display_init_params_); + scoped_ptr<DisplayBindingImpl> display_binding( + new DisplayBindingImpl(std::move(host), display, user_id_, + std::move(tree_client), connection_manager_)); + display->Init(std::move(display_binding)); +} + +} // namespace ws +} // namespace mus
diff --git a/components/mus/ws/window_tree_host_factory.h b/components/mus/ws/window_tree_host_factory.h new file mode 100644 index 0000000..51090c8 --- /dev/null +++ b/components/mus/ws/window_tree_host_factory.h
@@ -0,0 +1,46 @@ +// 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 COMPONENTS_MUS_WS_WINDOW_TREE_HOST_FACTORY_H_ +#define COMPONENTS_MUS_WS_WINDOW_TREE_HOST_FACTORY_H_ + +#include <stdint.h> + +#include "components/mus/public/interfaces/window_tree_host.mojom.h" +#include "components/mus/ws/platform_display_init_params.h" +#include "components/mus/ws/user_id.h" +#include "mojo/public/cpp/bindings/binding_set.h" + +namespace mus { +namespace ws { + +class ConnectionManager; + +class WindowTreeHostFactory : public mojom::WindowTreeHostFactory { + public: + WindowTreeHostFactory( + ConnectionManager* connection_manager, + const UserId& user_id, + const PlatformDisplayInitParams& platform_display_init_params); + ~WindowTreeHostFactory() override; + + void AddBinding(mojom::WindowTreeHostFactoryRequest request); + + private: + // mojom::WindowTreeHostFactory implementation. + void CreateWindowTreeHost(mojom::WindowTreeHostRequest host, + mojom::WindowTreeClientPtr tree_client) override; + + ConnectionManager* connection_manager_; + const UserId user_id_; + const PlatformDisplayInitParams platform_display_init_params_; + mojo::BindingSet<mojom::WindowTreeHostFactory> bindings_; + + DISALLOW_COPY_AND_ASSIGN(WindowTreeHostFactory); +}; + +} // namespace ws +} // namespace mus + +#endif // COMPONENTS_MUS_WS_WINDOW_TREE_HOST_FACTORY_H_
diff --git a/components/mus/ws/window_tree_unittest.cc b/components/mus/ws/window_tree_unittest.cc index 61b1d66..ce37fe7 100644 --- a/components/mus/ws/window_tree_unittest.cc +++ b/components/mus/ws/window_tree_unittest.cc
@@ -20,6 +20,7 @@ #include "components/mus/ws/ids.h" #include "components/mus/ws/platform_display.h" #include "components/mus/ws/platform_display_factory.h" +#include "components/mus/ws/platform_display_init_params.h" #include "components/mus/ws/server_window.h" #include "components/mus/ws/server_window_surface_manager_test_api.h" #include "components/mus/ws/test_change_tracker.h" @@ -28,6 +29,7 @@ #include "components/mus/ws/window_tree_binding.h" #include "mojo/converters/geometry/geometry_type_converters.h" #include "mojo/services/network/public/interfaces/url_loader.mojom.h" +#include "mojo/shell/public/interfaces/connector.mojom.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/event.h" #include "ui/events/event_utils.h" @@ -105,7 +107,7 @@ WindowTree* CreateWindowTree(ServerWindow* root) override { return connection_manager_->EmbedAtWindow( root, mus::mojom::WindowTree::kAccessPolicyEmbedRoot, - mus::mojom::WindowTreeClientPtr()); + mojo::shell::mojom::kRootUserID, mus::mojom::WindowTreeClientPtr()); } Display* display_; @@ -217,15 +219,28 @@ WindowTree** window_tree, ServerWindow** window); + // Creates a new tree as the specified user. This does what creation via + // a WindowTreeFactory does. + WindowTree* CreateNewTree(const UserId& user_id, + TestWindowTreeBinding** binding) { + WindowTree* tree = + new WindowTree(connection_manager_.get(), user_id, nullptr, + mojom::WindowTree::kAccessPolicyDefault); + *binding = new TestWindowTreeBinding; + connection_manager_->AddTree(make_scoped_ptr(tree), + make_scoped_ptr(*binding), nullptr); + return tree; + } + protected: // testing::Test: void SetUp() override { PlatformDisplay::set_factory_for_testing(&platform_display_factory_); connection_manager_.reset( new ConnectionManager(&delegate_, surfaces_state_)); - display_ = new Display(connection_manager_.get(), nullptr, - scoped_refptr<GpuState>(), - surfaces_state_); + PlatformDisplayInitParams display_init_params; + display_init_params.surfaces_state = surfaces_state_; + display_ = new Display(connection_manager_.get(), display_init_params); display_binding_ = new TestDisplayBinding(display_, connection_manager_.get()); display_->Init(make_scoped_ptr(display_binding_)); @@ -567,26 +582,25 @@ TEST_F(WindowTreeTest, NewTopLevelWindow) { TestWindowManager wm_internal; set_window_manager_internal(wm_tree(), &wm_internal); - TestWindowTreeClient* embed_connection = nullptr; - WindowTree* tree = nullptr; - ServerWindow* window = nullptr; - ASSERT_NO_FATAL_FAILURE( - SetupEventTargeting(&embed_connection, &tree, &window)); - embed_connection->tracker()->changes()->clear(); - embed_connection->set_record_on_change_completed(true); + + TestWindowTreeBinding* child_binding; + WindowTree* child_tree = CreateNewTree(wm_tree()->user_id(), &child_binding); + child_binding->client()->tracker()->changes()->clear(); + child_binding->client()->set_record_on_change_completed(true); // Create a new top level window. mojo::Map<mojo::String, mojo::Array<uint8_t>> properties; const uint32_t initial_change_id = 17; // Explicitly use an id that does not contain the connection id. const ClientWindowId embed_window_id2_in_child(45 << 16 | 27); - static_cast<mojom::WindowTree*>(tree)->NewTopLevelWindow( - initial_change_id, embed_window_id2_in_child.id, std::move(properties)); + static_cast<mojom::WindowTree*>(child_tree) + ->NewTopLevelWindow(initial_change_id, embed_window_id2_in_child.id, + std::move(properties)); // The binding should be paused until the wm acks the change. uint32_t wm_change_id = 0u; ASSERT_TRUE(wm_internal.did_call_create_top_level_window(&wm_change_id)); - EXPECT_TRUE(last_binding()->is_paused()); + EXPECT_TRUE(child_binding->is_paused()); // Create the window for |embed_window_id2_in_child|. const ClientWindowId embed_window_id2 = BuildClientWindowId(wm_tree(), 2); @@ -597,12 +611,13 @@ // Ack the change, which should resume the binding. static_cast<mojom::WindowManagerClient*>(wm_tree()) ->OnWmCreatedTopLevelWindow(wm_change_id, embed_window_id2.id); - EXPECT_FALSE(last_binding()->is_paused()); + EXPECT_FALSE(child_binding->is_paused()); EXPECT_EQ("TopLevelCreated id=17 window_id=" + WindowIdToString( WindowIdFromTransportId(embed_window_id2_in_child.id)), - SingleChangeToDescription(*embed_connection->tracker()->changes())); - embed_connection->tracker()->changes()->clear(); + SingleChangeToDescription( + *child_binding->client()->tracker()->changes())); + child_binding->client()->tracker()->changes()->clear(); // Change the visibility of the window from the owner and make sure the // client sees the right id. @@ -616,10 +631,12 @@ WindowIdToString( WindowIdFromTransportId(embed_window_id2_in_child.id)) + " visible=true", - SingleChangeToDescription(*embed_connection->tracker()->changes())); + SingleChangeToDescription( + *child_binding->client()->tracker()->changes())); // Set the visibility from the child using the client assigned id. - ASSERT_TRUE(tree->SetWindowVisibility(embed_window_id2_in_child, false)); + ASSERT_TRUE( + child_tree->SetWindowVisibility(embed_window_id2_in_child, false)); EXPECT_FALSE(embed_window->visible()); } @@ -665,6 +682,224 @@ EXPECT_EQ(nullptr, GetCaptureWindow(display)); } +// Tests that showing a modal window releases the capture if the capture is on a +// descendant of the modal parent. +TEST_F(WindowTreeTest, ShowModalWindowWithDescendantCapture) { + TestWindowTreeClient* embed_connection = nullptr; + WindowTree* tree = nullptr; + ServerWindow* w1 = nullptr; + EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&embed_connection, &tree, &w1)); + + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + const ServerWindow* root_window = *tree->roots().begin(); + ClientWindowId root_window_id = ClientWindowIdForWindow(tree, root_window); + ClientWindowId w1_id = ClientWindowIdForWindow(tree, w1); + Display* display = tree->GetDisplay(w1); + + // Create |w11| as a child of |w1| and make it visible. + ClientWindowId w11_id = BuildClientWindowId(tree, 11); + ASSERT_TRUE(tree->NewWindow(w11_id, ServerWindow::Properties())); + ServerWindow* w11 = tree->GetWindowByClientId(w11_id); + w11->SetBounds(gfx::Rect(10, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(w1_id, w11_id)); + ASSERT_TRUE(tree->SetWindowVisibility(w11_id, true)); + + // Create |w2| as a child of |root_window| and modal to |w1| and leave it + // hidden. + ClientWindowId w2_id = BuildClientWindowId(tree, 2); + ASSERT_TRUE(tree->NewWindow(w2_id, ServerWindow::Properties())); + ServerWindow* w2 = tree->GetWindowByClientId(w2_id); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(root_window_id, w2_id)); + ASSERT_TRUE(tree->AddTransientWindow(w1_id, w2_id)); + ASSERT_TRUE(tree->SetModal(w2_id)); + + // Set capture to |w11|. + DispatchEventWithoutAck(CreatePointerDownEvent(25, 25)); + ASSERT_TRUE(tree->SetCapture(w11_id)); + EXPECT_EQ(w11, GetCaptureWindow(display)); + AckPreviousEvent(); + + // Make |w2| visible. This should release capture as capture is set to a + // descendant of the modal parent. + ASSERT_TRUE(tree->SetWindowVisibility(w2_id, true)); + EXPECT_EQ(nullptr, GetCaptureWindow(display)); +} + +// Tests that setting a visible window as modal releases the capture if the +// capture is on a descendant of the modal parent. +TEST_F(WindowTreeTest, VisibleWindowToModalWithDescendantCapture) { + TestWindowTreeClient* embed_connection = nullptr; + WindowTree* tree = nullptr; + ServerWindow* w1 = nullptr; + EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&embed_connection, &tree, &w1)); + + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + const ServerWindow* root_window = *tree->roots().begin(); + ClientWindowId root_window_id = ClientWindowIdForWindow(tree, root_window); + ClientWindowId w1_id = ClientWindowIdForWindow(tree, w1); + Display* display = tree->GetDisplay(w1); + + // Create |w11| as a child of |w1| and make it visible. + ClientWindowId w11_id = BuildClientWindowId(tree, 11); + ASSERT_TRUE(tree->NewWindow(w11_id, ServerWindow::Properties())); + ServerWindow* w11 = tree->GetWindowByClientId(w11_id); + w11->SetBounds(gfx::Rect(10, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(w1_id, w11_id)); + ASSERT_TRUE(tree->SetWindowVisibility(w11_id, true)); + + // Create |w2| as a child of |root_window| and make it visible. + ClientWindowId w2_id = BuildClientWindowId(tree, 2); + ASSERT_TRUE(tree->NewWindow(w2_id, ServerWindow::Properties())); + ServerWindow* w2 = tree->GetWindowByClientId(w2_id); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(root_window_id, w2_id)); + ASSERT_TRUE(tree->SetWindowVisibility(w2_id, true)); + + // Set capture to |w11|. + DispatchEventWithoutAck(CreatePointerDownEvent(25, 25)); + ASSERT_TRUE(tree->SetCapture(w11_id)); + EXPECT_EQ(w11, GetCaptureWindow(display)); + AckPreviousEvent(); + + // Set |w2| modal to |w1|. This should release the capture as the capture is + // set to a descendant of the modal parent. + ASSERT_TRUE(tree->AddTransientWindow(w1_id, w2_id)); + ASSERT_TRUE(tree->SetModal(w2_id)); + EXPECT_EQ(nullptr, GetCaptureWindow(display)); +} + +// Tests that showing a modal window does not change capture if the capture is +// not on a descendant of the modal parent. +TEST_F(WindowTreeTest, ShowModalWindowWithNonDescendantCapture) { + TestWindowTreeClient* embed_connection = nullptr; + WindowTree* tree = nullptr; + ServerWindow* w1 = nullptr; + EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&embed_connection, &tree, &w1)); + + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + const ServerWindow* root_window = *tree->roots().begin(); + ClientWindowId root_window_id = ClientWindowIdForWindow(tree, root_window); + ClientWindowId w1_id = ClientWindowIdForWindow(tree, w1); + Display* display = tree->GetDisplay(w1); + + // Create |w2| as a child of |root_window| and modal to |w1| and leave it + // hidden.. + ClientWindowId w2_id = BuildClientWindowId(tree, 2); + ASSERT_TRUE(tree->NewWindow(w2_id, ServerWindow::Properties())); + ServerWindow* w2 = tree->GetWindowByClientId(w2_id); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(root_window_id, w2_id)); + ASSERT_TRUE(tree->AddTransientWindow(w1_id, w2_id)); + ASSERT_TRUE(tree->SetModal(w2_id)); + + // Create |w3| as a child of |root_window| and make it visible. + ClientWindowId w3_id = BuildClientWindowId(tree, 3); + ASSERT_TRUE(tree->NewWindow(w3_id, ServerWindow::Properties())); + ServerWindow* w3 = tree->GetWindowByClientId(w3_id); + w3->SetBounds(gfx::Rect(70, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(root_window_id, w3_id)); + ASSERT_TRUE(tree->SetWindowVisibility(w3_id, true)); + + // Set capture to |w3|. + DispatchEventWithoutAck(CreatePointerDownEvent(25, 25)); + ASSERT_TRUE(tree->SetCapture(w3_id)); + EXPECT_EQ(w3, GetCaptureWindow(display)); + AckPreviousEvent(); + + // Make |w2| visible. This should not change the capture as the capture is not + // set to a descendant of the modal parent. + ASSERT_TRUE(tree->SetWindowVisibility(w2_id, true)); + EXPECT_EQ(w3, GetCaptureWindow(display)); +} + +// Tests that setting a visible window as modal does not change the capture if +// the capture is not set to a descendant of the modal parent. +TEST_F(WindowTreeTest, VisibleWindowToModalWithNonDescendantCapture) { + TestWindowTreeClient* embed_connection = nullptr; + WindowTree* tree = nullptr; + ServerWindow* w1 = nullptr; + EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&embed_connection, &tree, &w1)); + + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + const ServerWindow* root_window = *tree->roots().begin(); + ClientWindowId root_window_id = ClientWindowIdForWindow(tree, root_window); + ClientWindowId w1_id = ClientWindowIdForWindow(tree, w1); + Display* display = tree->GetDisplay(w1); + + // Create |w2| and |w3| as children of |root_window| and make them visible. + ClientWindowId w2_id = BuildClientWindowId(tree, 2); + ASSERT_TRUE(tree->NewWindow(w2_id, ServerWindow::Properties())); + ServerWindow* w2 = tree->GetWindowByClientId(w2_id); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(root_window_id, w2_id)); + ASSERT_TRUE(tree->SetWindowVisibility(w2_id, true)); + + ClientWindowId w3_id = BuildClientWindowId(tree, 3); + ASSERT_TRUE(tree->NewWindow(w3_id, ServerWindow::Properties())); + ServerWindow* w3 = tree->GetWindowByClientId(w3_id); + w3->SetBounds(gfx::Rect(70, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(root_window_id, w3_id)); + ASSERT_TRUE(tree->SetWindowVisibility(w3_id, true)); + + // Set capture to |w3|. + DispatchEventWithoutAck(CreatePointerDownEvent(25, 25)); + ASSERT_TRUE(tree->SetCapture(w3_id)); + EXPECT_EQ(w3, GetCaptureWindow(display)); + AckPreviousEvent(); + + // Set |w2| modal to |w1|. This should not release the capture as the capture + // is not set to a descendant of the modal parent. + ASSERT_TRUE(tree->AddTransientWindow(w1_id, w2_id)); + ASSERT_TRUE(tree->SetModal(w2_id)); + EXPECT_EQ(w3, GetCaptureWindow(display)); +} + +// Tests that moving the capture window to a modal parent releases the capture +// as capture cannot be blocked by a modal window. +TEST_F(WindowTreeTest, MoveCaptureWindowToModalParent) { + TestWindowTreeClient* embed_connection = nullptr; + WindowTree* tree = nullptr; + ServerWindow* w1 = nullptr; + EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&embed_connection, &tree, &w1)); + + w1->SetBounds(gfx::Rect(10, 10, 30, 30)); + const ServerWindow* root_window = *tree->roots().begin(); + ClientWindowId root_window_id = ClientWindowIdForWindow(tree, root_window); + ClientWindowId w1_id = ClientWindowIdForWindow(tree, w1); + Display* display = tree->GetDisplay(w1); + + // Create |w2| and |w3| as children of |root_window| and make them visible. + ClientWindowId w2_id = BuildClientWindowId(tree, 2); + ASSERT_TRUE(tree->NewWindow(w2_id, ServerWindow::Properties())); + ServerWindow* w2 = tree->GetWindowByClientId(w2_id); + w2->SetBounds(gfx::Rect(50, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(root_window_id, w2_id)); + ASSERT_TRUE(tree->SetWindowVisibility(w2_id, true)); + + ClientWindowId w3_id = BuildClientWindowId(tree, 3); + ASSERT_TRUE(tree->NewWindow(w3_id, ServerWindow::Properties())); + ServerWindow* w3 = tree->GetWindowByClientId(w3_id); + w3->SetBounds(gfx::Rect(70, 10, 10, 10)); + ASSERT_TRUE(tree->AddWindow(root_window_id, w3_id)); + ASSERT_TRUE(tree->SetWindowVisibility(w3_id, true)); + + // Set |w2| modal to |w1|. + ASSERT_TRUE(tree->AddTransientWindow(w1_id, w2_id)); + ASSERT_TRUE(tree->SetModal(w2_id)); + + // Set capture to |w3|. + DispatchEventWithoutAck(CreatePointerDownEvent(25, 25)); + ASSERT_TRUE(tree->SetCapture(w3_id)); + EXPECT_EQ(w3, GetCaptureWindow(display)); + AckPreviousEvent(); + + // Make |w3| child of |w1|. This should release capture as |w3| is now blocked + // by a modal window. + ASSERT_TRUE(tree->AddWindow(w1_id, w3_id)); + EXPECT_EQ(nullptr, GetCaptureWindow(display)); +} + } // namespace test } // namespace ws } // namespace mus
diff --git a/components/nacl/loader/nacl_ipc_adapter.cc b/components/nacl/loader/nacl_ipc_adapter.cc index d8ac1c7f..e1508b3 100644 --- a/components/nacl/loader/nacl_ipc_adapter.cc +++ b/components/nacl/loader/nacl_ipc_adapter.cc
@@ -6,6 +6,7 @@ #include <limits.h> #include <string.h> +#include <tuple> #include <utility> #include "base/bind.h" @@ -809,7 +810,7 @@ if (!open_resource_cb_.is_null() && message->type() == PpapiHostMsg_OpenResource::ID && PpapiHostMsg_OpenResource::ReadSendParam(message.get(), &send_params)) { - const std::string key = base::get<0>(send_params); + const std::string key = std::get<0>(send_params); // Both open_resource_cb_ and SaveOpenResourceMessage must be invoked // from the I/O thread. if (open_resource_cb_.Run(
diff --git a/components/nacl/renderer/ppb_nacl_private_impl.cc b/components/nacl/renderer/ppb_nacl_private_impl.cc index 57c7874..eb325e4 100644 --- a/components/nacl/renderer/ppb_nacl_private_impl.cc +++ b/components/nacl/renderer/ppb_nacl_private_impl.cc
@@ -108,7 +108,7 @@ // same-origin policy which prevents the app from requesting resources from // another app. blink::WebSecurityOrigin security_origin = - plugin_instance->GetContainer()->element().document().securityOrigin(); + plugin_instance->GetContainer()->element().document().getSecurityOrigin(); return security_origin.canRequest(gurl); } @@ -333,7 +333,7 @@ // Options settings here follow the original behavior in the trusted // plugin and PepperURLLoaderHost. - if (document.securityOrigin().canRequest(gurl)) { + if (document.getSecurityOrigin().canRequest(gurl)) { options.allowCredentials = true; } else { // Allow CORS.
diff --git a/components/omnibox/browser/history_quick_provider_unittest.cc b/components/omnibox/browser/history_quick_provider_unittest.cc index da6abd4..a5e19dd 100644 --- a/components/omnibox/browser/history_quick_provider_unittest.cc +++ b/components/omnibox/browser/history_quick_provider_unittest.cc
@@ -237,8 +237,7 @@ HistoryQuickProviderTest() {} protected: - class SetShouldContain : public std::unary_function<const std::string&, - std::set<std::string> > { + class SetShouldContain { public: explicit SetShouldContain(const ACMatches& matched_urls);
diff --git a/components/omnibox/browser/url_index_private_data.h b/components/omnibox/browser/url_index_private_data.h index a7348cc..0a327e5 100644 --- a/components/omnibox/browser/url_index_private_data.h +++ b/components/omnibox/browser/url_index_private_data.h
@@ -198,7 +198,7 @@ // A helper class which performs the final filter on each candidate // history URL match, inserting accepted matches into |scored_matches_|. - class AddHistoryMatch : public std::unary_function<HistoryID, void> { + class AddHistoryMatch { public: AddHistoryMatch(bookmarks::BookmarkModel* bookmark_model, TemplateURLService* template_url_service, @@ -230,8 +230,7 @@ // A helper predicate class used to filter excess history items when the // candidate results set is too large. - class HistoryItemFactorGreater - : public std::binary_function<HistoryID, HistoryID, void> { + class HistoryItemFactorGreater { public: explicit HistoryItemFactorGreater(const HistoryInfoMap& history_info_map); ~HistoryItemFactorGreater();
diff --git a/components/password_manager/content/browser/content_password_manager_driver_unittest.cc b/components/password_manager/content/browser/content_password_manager_driver_unittest.cc index fc0b4606..551fcb5 100644 --- a/components/password_manager/content/browser/content_password_manager_driver_unittest.cc +++ b/components/password_manager/content/browser/content_password_manager_driver_unittest.cc
@@ -6,6 +6,8 @@ #include <stdint.h> +#include <tuple> + #include "base/macros.h" #include "components/autofill/content/common/autofill_messages.h" #include "components/autofill/core/browser/test_autofill_client.h" @@ -56,9 +58,9 @@ process()->sink().GetFirstMessageMatching(kMsgID); if (!message) return false; - base::Tuple<bool> param; + std::tuple<bool> param; AutofillMsg_SetLoggingState::Read(message, ¶m); - *activation_flag = base::get<0>(param); + *activation_flag = std::get<0>(param); process()->sink().ClearMessages(); return true; }
diff --git a/components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc b/components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc index e59d4e3..897c484 100644 --- a/components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc +++ b/components/password_manager/content/browser/credential_manager_dispatcher_unittest.cc
@@ -7,6 +7,7 @@ #include <stdint.h> #include <string> +#include <tuple> #include <vector> #include "base/bind.h" @@ -269,7 +270,7 @@ CredentialManagerMsg_SendCredential::Read(message, &send_param); EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, - base::get<1>(send_param).type); + std::get<1>(send_param).type); } void ExpectZeroClickSignInSuccess(CredentialType type) { @@ -287,7 +288,7 @@ CredentialManagerMsg_SendCredential::Param send_param; CredentialManagerMsg_SendCredential::Read(message, &send_param); - EXPECT_EQ(type, base::get<1>(send_param).type); + EXPECT_EQ(type, std::get<1>(send_param).type); } CredentialManagerDispatcher* dispatcher() { return dispatcher_.get(); } @@ -547,7 +548,7 @@ EXPECT_TRUE(message); CredentialManagerMsg_SendCredential::Param param; CredentialManagerMsg_SendCredential::Read(message, ¶m); - EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, base::get<1>(param).type); + EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, std::get<1>(param).type); process()->sink().ClearMessages(); } @@ -573,7 +574,7 @@ EXPECT_TRUE(message); CredentialManagerMsg_SendCredential::Param param; CredentialManagerMsg_SendCredential::Read(message, ¶m); - EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, base::get<1>(param).type); + EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, std::get<1>(param).type); process()->sink().ClearMessages(); } @@ -616,7 +617,7 @@ CredentialManagerMsg_SendCredential::Param send_param; CredentialManagerMsg_SendCredential::Read(message, &send_param); EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, - base::get<1>(send_param).type); + std::get<1>(send_param).type); } TEST_F(CredentialManagerDispatcherTest, @@ -828,7 +829,7 @@ // With two items in the password store, we shouldn't get credentials back. EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, - base::get<1>(send_param).type); + std::get<1>(send_param).type); } TEST_F(CredentialManagerDispatcherTest, @@ -856,7 +857,7 @@ // With two items in the password store, we shouldn't get credentials back, // even though only one item has |skip_zero_click| set |false|. EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, - base::get<1>(send_param).type); + std::get<1>(send_param).type); } TEST_F(CredentialManagerDispatcherTest, @@ -885,7 +886,7 @@ // We only have cross-origin zero-click credentials; they should not be // returned. EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, - base::get<1>(send_param).type); + std::get<1>(send_param).type); } TEST_F(CredentialManagerDispatcherTest, @@ -910,7 +911,7 @@ CredentialManagerMsg_RejectCredentialRequest::Param reject_param; CredentialManagerMsg_RejectCredentialRequest::Read(message, &reject_param); EXPECT_EQ(blink::WebCredentialManagerPendingRequestError, - base::get<1>(reject_param)); + std::get<1>(reject_param)); EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _, _)) .Times(testing::Exactly(1)); EXPECT_CALL(*client_, NotifyUserAutoSigninPtr(_)).Times(testing::Exactly(0)); @@ -927,7 +928,7 @@ CredentialManagerMsg_SendCredential::Param send_param; CredentialManagerMsg_SendCredential::Read(message, &send_param); EXPECT_NE(CredentialType::CREDENTIAL_TYPE_EMPTY, - base::get<1>(send_param).type); + std::get<1>(send_param).type); process()->sink().ClearMessages(); } @@ -1026,7 +1027,7 @@ ASSERT_TRUE(message); CredentialManagerMsg_SendCredential::Param param; CredentialManagerMsg_SendCredential::Read(message, ¶m); - EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, base::get<1>(param).type); + EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, std::get<1>(param).type); } TEST_F(CredentialManagerDispatcherTest,
diff --git a/components/password_manager/content/renderer/credential_manager_client_browsertest.cc b/components/password_manager/content/renderer/credential_manager_client_browsertest.cc index cb8c750..d7318d7 100644 --- a/components/password_manager/content/renderer/credential_manager_client_browsertest.cc +++ b/components/password_manager/content/renderer/credential_manager_client_browsertest.cc
@@ -4,6 +4,8 @@ #include <stdint.h> +#include <tuple> + #include "components/password_manager/content/common/credential_manager_messages.h" #include "components/password_manager/content/renderer/credential_manager_client.h" #include "content/public/test/render_view_test.h" @@ -56,23 +58,23 @@ switch (message_id) { case CredentialManagerHostMsg_Store::ID: { - base::Tuple<int, CredentialInfo> param; + std::tuple<int, CredentialInfo> param; CredentialManagerHostMsg_Store::Read(message, ¶m); - request_id = base::get<0>(param); + request_id = std::get<0>(param); break; } case CredentialManagerHostMsg_RequireUserMediation::ID: { - base::Tuple<int> param; + std::tuple<int> param; CredentialManagerHostMsg_RequireUserMediation::Read(message, ¶m); - request_id = base::get<0>(param); + request_id = std::get<0>(param); break; } case CredentialManagerHostMsg_RequestCredential::ID: { - base::Tuple<int, bool, bool, std::vector<GURL>> param; + std::tuple<int, bool, bool, std::vector<GURL>> param; CredentialManagerHostMsg_RequestCredential::Read(message, ¶m); - request_id = base::get<0>(param); + request_id = std::get<0>(param); break; }
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc index 9e781d5..897c155f 100644 --- a/components/password_manager/core/browser/login_database.cc +++ b/components/password_manager/core/browser/login_database.cc
@@ -141,7 +141,11 @@ s->BindInt64(COLUMN_DATE_SYNCED, form.date_synced.ToInternalValue()); s->BindString16(COLUMN_DISPLAY_NAME, form.display_name); s->BindString(COLUMN_ICON_URL, form.icon_url.spec()); - s->BindString(COLUMN_FEDERATION_URL, form.federation_origin.Serialize()); + // An empty Origin serializes as "null" which would be strange to store here. + s->BindString(COLUMN_FEDERATION_URL, + form.federation_origin.unique() + ? std::string() + : form.federation_origin.Serialize()); s->BindInt(COLUMN_SKIP_ZERO_CLICK, form.skip_zero_click); s->BindInt(COLUMN_GENERATION_UPLOAD_STATUS, form.generation_upload_status); } @@ -941,8 +945,7 @@ s.BindInt(11, form.type); s.BindString16(12, form.display_name); s.BindString(13, form.icon_url.spec()); - // We serialize unique origins as "", in order to make other systems that - // read from the login database happy. https://crbug.com/591310 + // An empty Origin serializes as "null" which would be strange to store here. s.BindString(14, form.federation_origin.unique() ? std::string() : form.federation_origin.Serialize());
diff --git a/components/password_manager/core/browser/password_syncable_service.cc b/components/password_manager/core/browser/password_syncable_service.cc index aba613b..9d82dea 100644 --- a/components/password_manager/core/browser/password_syncable_service.cc +++ b/components/password_manager/core/browser/password_syncable_service.cc
@@ -61,8 +61,8 @@ base::UTF16ToUTF8(password_form.display_name) == password_specifics.display_name() && password_form.icon_url.spec() == password_specifics.avatar_url() && - password_form.federation_origin.Serialize() == - password_specifics.federation_url()); + url::Origin(GURL(password_specifics.federation_url())).Serialize() == + password_form.federation_origin.Serialize()); } syncer::SyncChange::SyncChangeType GetSyncChangeType( @@ -464,7 +464,9 @@ CopyStringField(display_name); password_specifics->set_avatar_url(password_form.icon_url.spec()); password_specifics->set_federation_url( - password_form.federation_origin.Serialize()); + password_form.federation_origin.unique() + ? std::string() + : password_form.federation_origin.Serialize()); #undef CopyStringField #undef CopyField
diff --git a/components/password_manager/core/browser/password_syncable_service_unittest.cc b/components/password_manager/core/browser/password_syncable_service_unittest.cc index f853360..64a3fc0 100644 --- a/components/password_manager/core/browser/password_syncable_service_unittest.cc +++ b/components/password_manager/core/browser/password_syncable_service_unittest.cc
@@ -586,6 +586,29 @@ scoped_ptr<syncer::SyncErrorFactory>()); } +// Serialize and deserialize empty federation_origin and make sure it's an empty +// string. +TEST_F(PasswordSyncableServiceTest, SerializeEmptyFederation) { + autofill::PasswordForm form; + EXPECT_TRUE(form.federation_origin.unique()); + syncer::SyncData data = SyncDataFromPassword(form); + const sync_pb::PasswordSpecificsData& specifics = GetPasswordSpecifics(data); + EXPECT_TRUE(specifics.has_federation_url()); + EXPECT_EQ(std::string(), specifics.federation_url()); + + // Deserialize back. + form = PasswordFromSpecifics(specifics); + EXPECT_TRUE(form.federation_origin.unique()); + + // Make sure that the Origins uploaded incorrectly are still deserialized + // correctly. + // crbug.com/593380. + sync_pb::PasswordSpecificsData specifics1; + specifics1.set_federation_url("null"); + form = PasswordFromSpecifics(specifics1); + EXPECT_TRUE(form.federation_origin.unique()); +} + } // namespace } // namespace password_manager
diff --git a/components/plugins/renderer/loadable_plugin_placeholder.cc b/components/plugins/renderer/loadable_plugin_placeholder.cc index b13ece5..11495d8 100644 --- a/components/plugins/renderer/loadable_plugin_placeholder.cc +++ b/components/plugins/renderer/loadable_plugin_placeholder.cc
@@ -209,8 +209,8 @@ // On a size update check if we now qualify as a essential plugin. url::Origin content_origin = url::Origin(GetPluginParams().url); auto status = render_frame()->GetPeripheralContentStatus( - render_frame()->GetWebFrame()->top()->securityOrigin(), content_origin, - gfx::Size(width, height)); + render_frame()->GetWebFrame()->top()->getSecurityOrigin(), + content_origin, gfx::Size(width, height)); if (status != content::RenderFrame::CONTENT_STATUS_PERIPHERAL) { MarkPluginEssential( heuristic_run_before_
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index aeb9b6c..1f383fa 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -209,6 +209,13 @@ ይህ መመሪያ የሚከበረው የ «DefaultSearchProviderEnabled» መመሪያው ሲነቃ ብቻ ነው።</translation> <translation id="1859633270756049523">የክፍለ ጊዜውን ርዝመት ይገድቡ</translation> +<translation id="1859859319036806634">ማስጠንቀቂያ፦ የTLS ስሪት መጠባበቂያ ከ<ph name="PRODUCT_NAME" /> ከስሪት 52 (ሴፕቴምበር 2016 አካባቢ) በኋላ ይወገዳል፣ እና ይህ መመሪያ ከዚያ በኋላ መሥራቱን ያቆማል። + + አንድ የTLS ቅብብል ሳይሳካ ሲቀር <ph name="PRODUCT_NAME" /> በኤችቲቲፒኤስ አገልጋዮች ውስጥ ያሉትን ሳንካዎች መወጣት እንዲችል ግንኙነቱን ባነሱ የTLS ስሪቶች እንደገና ይሞክራል። ይህ ቅንብር ይህ የመጠባበቂያ ሂደት የሚቆምበትን ስሪት ያዋቅራል። አንድ አገልጋይ የስሪት ድርድር በትክክል ከሠራ (ለምሳሌ፦ ግንኙነቱን ሳያቋርጥ) ይህ ቅንብር አይተገበርም። ውጤቱ ምንም ይሁን ምን የሚገኘው ግንኙነት አሁንም ለSSLVersionMin ተገዢ መሆን አለበት። + + ይህ መመሪያ ካልተዋቀረ ወይም ወደ «tls1.2» ከተዋቀረ <ph name="PRODUCT_NAME" /> ከእንግዲህ ይህን መጠባበቂያ አያከናውንም። ይሄ <ph name="PRODUCT_NAME" /> በትክክል ስሪቶችን መደራደር የማይችሉ ሳንካዎች ያሉባቸው አገልጋዮችን ይወጣ እንደሆነ ብቻ ይወስናል እንጂ ከዚህ ቀደም ለነበሩ የTLS ስሪቶች ድጋፍን እንደማያሰናክል ልብ ይበሉ። + + አለበለዚያ ሳንካ ካለበት አገልጋይ ጋር ተኳሃኝነት መጠበቅ የሚያስፈልግ ከሆነ ይህ መመሪያ ወደ «tls1.1» ሊቀናበር ይችላል። ይህ ጊዜያዊ መፍትሔ ነው እንጂ አገልጋዩ በአስቸኳይ መስተካከል አለበት።</translation> <translation id="1861037019115362154">በ<ph name="PRODUCT_NAME" /> ውስጥ የተሰናከሉ የተሰኪዎች ዝርዝርን የሚገልጽ እና ተጠቃሚዎች ይህን ቅንብር እንዳይቀይሩት የሚያግድ ነው። የልቅ ምልክት ቁምፊዎቹ «*» እና «?» የዘፈቀደ የሆኑ ቁምፊዎች ተከታታይነቶች ለመዛመድ ሊያገለግሉ ይችላሉ። «*» የዘፈቀደ ከሆኑ የቁምፊዎች ብዛት ጋር የሚዛመድ ሲሆን «?» ደግሞ አማራጭ የሆነ ነጠላ ቁምፊ ይገልጻል፣ ማለትም ከዜሮ ወይም አንድ ቁምፊዎች ጋር ይዛመዳል። የማምለጫ ቁምፊው «\» ነው፣ እናም ከትክክለኛው የ«*»፣ «?» ወይም «\» ቁምፊዎችን ጋር ለመዛመድ ፊታቸው ላይ «\» ማስቀመጥ ይችላሉ። @@ -596,6 +603,7 @@ የTLS ጎራ ጋር የተሳሰረው የምስክር ወረቀቶች ቅጥያ መንቃት እንዳለበት ይገልጻል። ይህ ቅንብር የTLS ጎራ የተሳሰሩ የምስክር ወረቀቶች ቅጥያን ለሙከራ ለማንቃት ጥቅም ላይ ይውላል። ይህ የሙከራ ቅንብር ወደፊት ይወገዳል።</translation> +<translation id="2957506574938329824">ምንም ዓይነት ጣቢያ በድር ብሉቱዝ ኤፒአይ በኩል የብሉቱዝ መሣሪያዎች መዳረሻን እንዲጠይቅ አትፍቀድ</translation> <translation id="2957513448235202597">የመለያ አይነት ለ<ph name="HTTP_NEGOTIATE" /> ማረጋገጫ</translation> <translation id="2959898425599642200">የተኪ ማለፊያ ደንቦች</translation> <translation id="2960691910306063964">ፒን የሌለው ማረጋገጫ ለርቀት መዳረሻ አስተናጋጆች ያንቁ ወይም ያሰናክሉ</translation> @@ -609,6 +617,7 @@ የመመሪያ ዋጋው በሚሊሰከንዶች ነው መገለጽ ያለበት። ዋጋዎች ከማያ ገጽ መጥፋት መዘግየት (ከተዋቀረ) እና ስራ ፈትቶ መዘግየት ያነሱ ወይም እኩል ነው የሚሆኑት።</translation> <translation id="2987155890997901449">ARCን ያንቁ</translation> +<translation id="2987227569419001736">የድር ብሉቱዝ ኤፒአይን አጠቃቀም ይቆጣጠሩ</translation> <translation id="2998881342848488968">ይህ መመሪያ <ph name="PRODUCT_OS_NAME" /> ለተያዥ መግቢያ ማረጋገጫ ማንኛውንም ተኪ እንዲያልፍ ያደርጋል። ተኪ ከተዋቀረ ብቻ ነው ይህ መመሪያ ተፈፃሚ የሚሆነው (ለምሳሌ፦ በመመሪያ በኩል፣ chrome://settings ውስጥ ባለ ተጠቃሚ ወይም በቅጥያዎች)። @@ -1613,6 +1622,9 @@ ይህ መመሪያ እንዳልተቀናበረ ከተተወ የመግቢያ ገጹ መጀመሪያ ሲታይ የማያ ገጽ ላይ ቁልፍ ሰሌዳው ይሰናከላል። ተጠቃሚዎች የማያ ገጽ ቁልፍ ሰሌዳውን ሊያነቁት ወይም ሊያሰናክሉት ይችላሉ፣ እና በመግቢያ ገጹ ላይ ያለው ሁኔታ በተጠቃሚዎች መካከል ዘላቂነት አለው።</translation> <translation id="6598235178374410284">የተጠቃሚ አምሳያ ምስል</translation> +<translation id="6628646143828354685">ድር ጣቢያዎች በአቅራቢያ ያሉ የብሉቱዝ መሣሪያዎች መዳረሻ ይኖራቸው ወይም አይኖራቸው እንደሆነ እንዲያዋቅሩ ያስችልዎታል። መዳረሻ ሙሉ በሙሉ ሊታገድ ወይም የድር ጣቢያ በአቅራቢያ ያሉ የብሉቱዝ መሣሪያዎች መዳረሻ ለማግኘት በፈለገ ቁጥር ተጠቃሚው ሊጠየቅ ይችላል። + + ይህ መምሪያ ሳይዋቀር ከተተወ «3» ሥራ ላይ ይውላል፣ እና ተጠቃሚው ሊቀይረው ይችላል።</translation> <translation id="6636268606788232221">ተጠቃሚው ስራ ሲፈታ የኃይል አስተዳደር ቅንብሮችን አዋቅር። ይህ መመሪያ ተጠቃሚው ስራ ሲፈታ ያለው በርካታ የኃይል አስተዳዳሪ ስትራተጂ ቅንብሮችን ይቆጣጠራል። @@ -1705,6 +1717,7 @@ እርስዎ ይህን መመሪያ እንዳልተቀናበረ ተጠቃሚዎች ሊቀይሩት ወይም ሊሽሩት አይችሉም። ይህ መመሪያ እንዳልተቀናበረ ከተተወ የተደራሽነት አማራጮች በስርዓቱ የመሳቢያ ምናሌ ላይ አይታዩም፣ ነገር ግን ተጠቃሚው የተደራሽነት አማራጮቹ በቅንብሮች ገጽ በኩል እንዲታይ ማድረግ ይችላል።</translation> +<translation id="6766216162565713893">ጣቢያዎች በአቅራቢያ ያሉ የብሉቱዝ መሣሪያዎች መዳረሻ ለማግኘት ተጠቃሚውን እንዲጠይቁ ፍቀድ</translation> <translation id="6770454900105963262">ስለንቁ የኪዮስ ክፍለ-ጊዜዎች መረጃን ሪፓርት ያድርጉ</translation> <translation id="6774533686631353488">የተጠቃሚ ደረጃ ቤተኛ መልዕክት መላላኪያ አስተናጋጆችን ይፍቀዱ (ያለአስተዳደር ፍቃዶች የተጫኑ)።</translation> <translation id="6786747875388722282">ቅጥያዎች</translation>
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb index a75e327..44260940 100644 --- a/components/policy/resources/policy_templates_ar.xtb +++ b/components/policy/resources/policy_templates_ar.xtb
@@ -186,6 +186,13 @@ يتم الالتزام بهذه السياسة فقط في حال تمكين سياسة "DefaultSearchProviderEnabled".</translation> <translation id="1859633270756049523">تحديد طول الجلسة</translation> +<translation id="1859859319036806634">تحذير: ستتم إزالة الإصدار الاحتياطي لطبقة النقل الآمنة من <ph name="PRODUCT_NAME" /> بعد الإصدار 52 (في أيلول (سبتمبر) 2016 تقريبًا) وستتوقف هذه السياسة عن العمل عندئذٍ. + + عند إخفاق تأكيد اتصال طبقة النقل الآمنة، سيعيد <ph name="PRODUCT_NAME" /> محاولة الاتصال بإصدار أقل من طبقة النقل الآمنة مسبقًا لمعالجة الأخطاء في خوادم HTTPS. ويعمل هذا الإعداد على تهيئة الإصدار حيث ستتوقف معالجة هذا الإصدار الاحتياطي. إذا نفذ الخادم تفاوض الإصدار بشكلٍ صحيح (أي دون قطع الاتصال) فحينئذٍ لا ينطبق هذا الإعداد. وبصرف النظر عن ذلك، يجب أن يظل الاتصال الناتج متوافقًا مع SSLVersionMin. + + إذا لم تتم تهيئة هذه السياسة أو إذا تم تعيينها على "tls1.2"، فحينئذٍ لن يجري <ph name="PRODUCT_NAME" /> هذا الإصدار الاحتياطي بعد ذلك. لاحظ أن هذا لا يعطل دعم إصدارات طبقة النقل الآمنة الأقدم، إلا إذا كان <ph name="PRODUCT_NAME" /> سيعالج الخوادم التي تحتوي على أخطاء والتي لا تستطيع أن تفاوض الإصدارات بشكلٍ صحيح. + + وبخلاف ذلك، إذا وجب حدوث توافق مع أحد الخوادم التي تحتوي على أخطاء، فقد يتم تعيين هذه السياسة إلى "tls1.1". وهذا إجراء مؤقت ومن المفترض أن يتم إصلاح الخادم بسرعة.</translation> <translation id="1861037019115362154">لتحديد قائمة بالمكونات الإضافية التي يتم تعطيلها في <ph name="PRODUCT_NAME" /> ومنع المستخدمين من تغيير هذا الإعداد. يمكن استخدام حرفي البدل '*' و'?' @@ -539,6 +546,7 @@ <translation id="2956777931324644324">تم إيقاف هذه السياسة اعتبارًا من <ph name="PRODUCT_NAME" /> الإصدار 36. تحدد إذا ما كان يجب تمكين إضافة شهادات تعتمد على نطاق TLS. يتم استخدام هذا الإعداد لتمكين إضافة شهادات تعتمد على نطاق TLS للاختبار. سيتم حذف هذا الإعداد التجريبي مستقبلاً.</translation> +<translation id="2957506574938329824">عدم السماح لأي موقع بطلب الدخول إلى أجهزة بلوتوث عبر واجهة برمجة تطبيقات بلوتوث الويب</translation> <translation id="2957513448235202597">نوع الحساب لمصادقة <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">قواعد تجاوز الخادم الوكيل</translation> <translation id="2960691910306063964">تمكين المصادقة دون رقم تعريف شخصي أو تعطيلها لمضيفات الوصول البعيد</translation> @@ -552,6 +560,7 @@ يجب تحديد قيمة السياسة بالمللي ثانية. يجب أن تكون القيم أقل من أو مساوية لمهلة إيقاف تشغيل الشاشة (في حالة تعيينها) ومهلة وضع الخمول.</translation> <translation id="2987155890997901449">تمكين ARC</translation> +<translation id="2987227569419001736">التحكم في استخدام واجهة برمجة تطبيقات بلوتوث الويب</translation> <translation id="2998881342848488968">تسمح هذه السياسة لـ <ph name="PRODUCT_OS_NAME" /> بتخطي أي خادم وكيل لمصادقة البوابات المقيدة. لا تُفعل هذه السياسة إلا عند تهيئة الخادم الوكيل (على سبيل المثال، من خلال سياسة أو من قبل المستخدم في chrome://settings أو عن طريق الإضافات). @@ -1401,6 +1410,9 @@ عند ترك هذه السياسة بدون تعيين، يتم تعطيل لوحة المفاتيح على الشاشة عندما تظهر شاشة تسجيل الدخول لأول مرة. ويمكن للمستخدمين تمكين لوحة المفاتيح على الشاشة أو تعطيلها في أي وقت وتكون حالتها على شاشة تسجيل الدخول مستمرة بين المستخدمين.</translation> <translation id="6598235178374410284">الصورة الرمزية للمستخدم</translation> +<translation id="6628646143828354685">للسماح لك بتعيين ما إذا كان يُسمح لمواقع الويب بالحصول على إمكانية الدخول إلى أجهزة البلوتوث المجاورة. ويمكن حظر إمكانية الدخول تمامًا، أو يمكن سؤال المستخدم في كل مرة يريد فيها أحد مواقع الويب الحصول على إمكانية الدخول إلى أجهزة البلوتوث المجاورة. + + إذا تم ترك هذه السياسة بدون تعيينها، فسيتم استخدام "3"، وسيتمكن المستخدم من تغييرها.</translation> <translation id="6636268606788232221">تهيئة إعدادات إدارة الطاقة عندما يصبح المستخدم بعيدًا. تتحكم هذه السياسة في عدة إعدادات لإستراتيجية إدارة الطاقة عندما يدخل المستخدم في وضع بعيد. @@ -1476,6 +1488,7 @@ عند تعيين هذه السياسة، لن يتمكن المستخدمون من تغييرها أو إلغائها. عند ترك هذه السياسة بدون تعيين، لن تظهر خيارات إمكانية الوصول في قائمة لوحة النظام، ولكن يمكن أن يعمل المستخدم على إظهار خيارات إمكانية الوصول عبر صفحة "الإعدادات".</translation> +<translation id="6766216162565713893">السماح للمواقع بأن تطلب من المستخدم منح إمكانية الدخول إلى جهاز بلوتوث مجاور</translation> <translation id="6770454900105963262">إبلاغ المعلومات حول جلسات الكشك النشطة</translation> <translation id="6774533686631353488">السماح بمضيفات الرسائل الأصلية على مستوى المستخدمين (التي تم تثبيتها بدون إذن المشرف).</translation> <translation id="6786747875388722282">الإضافات</translation>
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb index 2db2b2d..14144b43 100644 --- a/components/policy/resources/policy_templates_bg.xtb +++ b/components/policy/resources/policy_templates_bg.xtb
@@ -172,6 +172,13 @@ То се спазва само ако правилото „DefaultSearchProviderEnabled“ е активирано.</translation> <translation id="1859633270756049523">Ограничаване на продължителността на сесията</translation> +<translation id="1859859319036806634">Предупреждение: Използването на резервен вариант за TLS в <ph name="PRODUCT_NAME" /> няма да е възможно след версия 52 (около септември 2016 г.) и тогава това правило ще спре да работи. + +По-рано при неуспешен диалог през TLS <ph name="PRODUCT_NAME" /> опитваше да установи връзка с помощта на по-стара версия на TLS, за да избегне програмните грешки в HTTPS сървърите. С това правило се конфигурира коя да е минималната резервна версия на протокола. Настройката няма ефект, ако сървърът съгласува версиите правилно (т.е. без прекъсване на връзката). При всички случаи установената връзка трябва да е съобразена с параметъра за минимална версия на SSL (SSLVersionMin). + +Ако правилото не е конфигурирано или е зададено „tls1.2“, <ph name="PRODUCT_NAME" /> вече няма да преминава към резервния вариант. Обърнете внимание, че поддръжката за по-стари версии на TLS няма да се деактивира. Ще бъде засегната само възможността на <ph name="PRODUCT_NAME" /> да избягва неизправните сървъри, които не могат да съгласуват версиите правилно. + +В случай че трябва да се поддържа съвместимост с неизправен сървър, може да се използва опцията „tls1.1“. Това е временна мярка и сървърът трябва да се поправи бързо.</translation> <translation id="1861037019115362154">Посочва списък с деактивираните в <ph name="PRODUCT_NAME" /> приставки и не разрешава на потребителите да променят тази настройка. Заместващите знаци „*“ и „?“ могат да се използват за намиране на съответствия на последователности от произволни знаци. „*“ съответства на произволен брой знаци, а „?“ посочва незадължителен отделен знак, т.е. съвпада с нула или единица. Знакът за освобождаване е „\“, така че за намиране на съответствие на действителните „*“, „?“ или „\“ можете да поставите „\“ пред тях. @@ -525,6 +532,7 @@ Посочва дали разширението за обвързани с домейна сертификати за TLS трябва да бъде активирано. Тази експериментална настройка се използва, за да се активира съответното разширение с цел тестване. Тя ще бъде премахната в бъдеще.</translation> +<translation id="2957506574938329824">Забраняване на сайтовете да заявяват достъп до устройства с Bluetooth през приложния програмен интерфейс (API) Web Bluetooth</translation> <translation id="2957513448235202597">Тип на профилите за удостоверяване чрез <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Правила за заобикаляне на прокси сървъра</translation> <translation id="2960691910306063964">Активиране или деактивиране на удостоверяването без ПИН код за хостовете за отдалечен достъп</translation> @@ -538,6 +546,7 @@ Съответната стойност трябва да се посочи в милисекунди. Тя се променя така, че да е по-малка или равна на забавянето преди изключване на екрана (ако е зададено) и на това при неактивност.</translation> <translation id="2987155890997901449">Активиране на ARC</translation> +<translation id="2987227569419001736">Контролиране на използването на приложния програмен интерфейс (API) Web Bluetooth</translation> <translation id="2998881342848488968">Това правило дава възможност на <ph name="PRODUCT_OS_NAME" /> да заобикаля всички прокси сървъри при удостоверяване през портал за целта. Правилото влиза в сила само при конфигуриран прокси сървър (например настроен чрез правило, от потребителя чрез chrome://settings или от разширения). @@ -835,6 +844,7 @@ То се спазва само ако правилото „DefaultSearchProviderEnabled“ е активирано.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 или по-нова версия</translation> +<translation id="4322842393287974810">Разрешаване на павилионното приложение, което се стартира автоматично без забавяне, да контролира версията на <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Добавяне на бутон за изход към системната област</translation> <translation id="4347908978527632940">Ако е зададено true и потребителят е контролиран, останалите приложения за Android могат да изпращат запитвания за наложените му ограничения в мрежата чрез доставчик на съдържание. @@ -1437,6 +1447,9 @@ В случай че правилото не е зададено, екранната клавиатура е деактивирана при първото показване на екрана за вход. Тя може да се активира или деактивира по всяко време и състоянието й за този екран се запазва за различните потребители.</translation> <translation id="6598235178374410284">Изображение на потребителския аватар</translation> +<translation id="6628646143828354685">Позволява да зададете дали уебсайтовете да имат достъп до разположени наблизо устройства с Bluetooth. Той може да е блокиран напълно или е възможно потребителят да получава запитване всеки път, когато уебсайт иска достъп до такива устройства. + +Ако това правило не е зададено, ще се използва стойността „3“ и потребителят ще може да я променя.</translation> <translation id="6636268606788232221">Конфигурирайте настройките за управление на захранването при потребителска неактивност. Това правило контролира няколко настройки за стратегията за управление на захранването при потребителска неактивност. @@ -1528,6 +1541,7 @@ В случай че зададете това правило, потребителите не могат да го променят, нито да го отменят. Ако то не е зададено, опциите за достъпност няма да се показват в менюто на системната област, но потребителят може да ги направи видими чрез страницата „Настройки“.</translation> +<translation id="6766216162565713893">Разрешаване на сайтовете да искат от потребителя достъп до разположени наблизо устройства с Bluetooth</translation> <translation id="6770454900105963262">Изпращане на информация за активните сесии в павилионен режим</translation> <translation id="6774533686631353488">Разрешаване на хостовете на ниво потребител (инсталирани без администраторски разрешения) за обмен на съобщения с приложения с директно изпълнение.</translation> <translation id="6786747875388722282">Разширения</translation> @@ -1702,6 +1716,13 @@ <translation id="7340034977315324840">Съобщаване на времената на активност на устройствата</translation> <translation id="7381326101471547614">Деактивира използването на протокол SPDY в <ph name="PRODUCT_NAME" />. Ако това правило е активирано, той няма да е налице в <ph name="PRODUCT_NAME" />. В случай че е деактивирано, ще се разреши използването на SPDY. Ако правилото е оставено незададено, SPDY ще бъде налице.</translation> <translation id="7384999953864505698">Разрешаване на протокола QUIC</translation> +<translation id="7406651467768226499">Изберете дали да разрешите на павилионното приложение, което се стартира автоматично без забавяне, да контролира версията на <ph name="PRODUCT_OS_NAME" />. + +Чрез това правило се управлява възможността на гореспоменатото павилионно приложение да контролира версията на <ph name="PRODUCT_OS_NAME" />, като декларира ключ required_platform_version в манифеста си и го използва като префикс за целевата версия за автоматично актуализиране. + +Ако правилото е true, стойността на ключа required_platform_version в манифеста на съответното павилионно приложение се използва като префикс за целевата версия за автоматично актуализиране. + +В случай че правилото не е конфигурирано или е false, required_platform_version се пренебрегва и автоматичното актуализиране се извършва по обичайния начин.</translation> <translation id="7417972229667085380">Процент на промяна на забавянето при неактивност в режим за презентации (оттеглено)</translation> <translation id="7421483919690710988">Задаване на размер на медийния кеш на диска в байтове</translation> <translation id="7424751532654212117">Изключения от списъка с деактивирани приставки</translation>
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index bf09900..8323e0f 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -206,6 +206,13 @@ যদি 'DefaultSearchProviderEnabled' নীতিটি সক্ষম থাকে তাহলেই কেবল এই নীতিটি মেনে চলা হয়৷</translation> <translation id="1859633270756049523">অধিবেশন সময় দ্বারা সীমাবদ্ধ করুন</translation> +<translation id="1859859319036806634">সতর্কতা: সংস্করণ ৫২ (সেপ্টেম্বর ২০১৬ এর কাছাকাছি) এর পর TLS সংস্করণ ফলব্যাক <ph name="PRODUCT_NAME" /> থেকে সরিয়ে ফেলা হবে এবং তখন এই নীতি কাজ করবে না। + + যখন একটি TLS হ্যান্ডশেক ব্যর্থ হয়, তখন HTTPS সার্ভারগুলিতে ত্রুটি এড়িয়ে যেতে TLS এর পূর্বের একটি সংস্করণের সাথে <ph name="PRODUCT_NAME" /> আগে পুনরায় সংযোগের চেষ্টা করবে। এই সেটিংটি সেই সংস্করণ কনফিগার করে যেটিতে এই ফলব্যাক প্রক্রিয়া বন্ধ হবে। যদি কোনো সার্ভার সঠিকভাবে সংস্করণ নেগোশিয়েশন সম্পাদন করে (অর্থাৎ, সংযোগ নষ্ট না করে), তাহলে এই সেটিংয়ের প্রয়োগ হয় না। তথাপি, এর ফলাফল স্বরূপ পাওয়া সংযোগ এখনও SSLVersionMin মেনে চলবে। + + এই নীতিটি কনফিগার করা না থাকলে বা এটি "tls1.2" এ সেট করা থাকলে, <ph name="PRODUCT_NAME" /> আর ফলব্যাক ব্যবহার করে না। লক্ষ্য করুন যে, এটি TLS সংস্করণগুলির জন্য সমর্থন অক্ষম করে না, কেবলমাত্র সঠিকভাবে সংস্করণ নেগোশিয়েট করতে না পারা ত্রুটিপূর্ণ সার্ভারগুলি এড়িয়ে চলতে <ph name="PRODUCT_NAME" /> কাজ করে যাবে। + + অন্যথায়, যদি একটি ক্রুটিযুক্ত সার্ভারের সাথে সঙ্গতি বজায় রাখা আবশ্যক হয়, তাহলে একে "tls1.1" এ সেট করা যেতে পারে। এটি একটি অস্থায়ী সমাধান এবং সার্ভারটি দ্রুত সংশোধন করা উচিত।</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> এ অক্ষম থাকা প্লাগইনগুলির একটি তালিকা নির্দিষ্ট করে এবং এই সেটিংটি পরিবর্তন করা থেকে ব্যবহারকারীদের আটকায়৷ '*' এবং '?' ওয়াইল্ডকার্ড অক্ষরগুলি অবাধ অক্ষরের ক্রমের সাথে মেলাতে ব্যবহার করা যেতে পারে৷ '*' অক্ষরগুলি একটি অবাধ সংখ্যার সাথে মেলে অন্যদিকে '?' একটি ঐচ্ছিক একক অক্ষরকে নির্দিষ্ট করে, অর্থাত্ শূন্য বা এক অক্ষরের সাথে মেলে৷ এড়ানোর অক্ষরটি হ'ল '\', তাই প্রকৃত '*', '?', বা '\' অক্ষরগুলির সাথে মেলাতে আপনি সেগুলির আগে একটি '\' লাগাতে পারেন৷ @@ -580,6 +587,7 @@ TLS ডোমেন-বাউন্ড সার্টিফিকেট এক্সটেনশান সক্ষম করা হবে কিনা তা নির্দিষ্ট করে। এই সেটিংস পরীক্ষা করার জন্য TLS ডোমেন-বাউন্ড সার্টিফিকেট এক্সটেনশান সক্ষম করতে ব্যবহার হয়। এই পরীক্ষামূলক সেটিং ভবিষ্যতে সরানো হবে।</translation> +<translation id="2957506574938329824">ওয়েব Bluetooth API এর মাধ্যমে কোনো সাইটকে Bluetooth ডিভাইসগুলি অ্যাক্সেসের জন্য অনুরোধ করার অনুমতি দেয় না</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> প্রমাণীকরণের জন্য অ্যাকাউন্টের ধরন</translation> <translation id="2959898425599642200">প্রক্সি বাইপাস বিধিসমূহ</translation> <translation id="2960691910306063964">দূরবর্তী অ্যাক্সেস হোস্টের জন্য PIN বিহীন প্রমাণীকরণ অক্ষম বা সক্ষম করে</translation> @@ -593,6 +601,7 @@ নীতির মানটি মিলিসেকেন্ডে নির্ধারণ করা উচিত৷ মানগুলি স্ক্রীন বন্ধ হওয়ার এবং নিষ্ক্রিয়তা বিলম্বের থেকে কম বা সমান হিসাবে ধার্য করা হয়ে থাকে (যদি সেট থাকে)৷</translation> <translation id="2987155890997901449">ARC সক্ষম করে</translation> +<translation id="2987227569419001736">ওয়েব Bluetooth API এর ব্যবহার নিয়ন্ত্রণ করে</translation> <translation id="2998881342848488968">এই নীতিটি <ph name="PRODUCT_OS_NAME" /> কে অন্তরীণ পোর্টাল প্রমাণীকরণের জন্য কোনো প্রক্সীকে উপেক্ষা করতে সক্ষম করে। এই নীতি কেবলমাত্র একটি প্রক্সী কনফিগার করলেই কার্যকর হয় (উদাহরণস্বরূপ, নীতির মাধ্যমে, chrome://settings এ ব্যবহারকারী দ্বারা অথবা এক্সটেনশান দ্বারা)। @@ -904,6 +913,7 @@ যদি 'DefaultSearchProviderEnabled' নীতিটি সক্ষম করা থাকে তাহলেই কেবল এই নীতিটি মেনে চলা হয়৷</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 বা পরবর্তী</translation> +<translation id="4322842393287974810">শূন্য বিলম্ব সহ স্বয়ংক্রিয় লঞ্চ হওয়া কিয়স্ক অ্যাপ্লিকেশানকে <ph name="PRODUCT_OS_NAME" /> সংস্করণ নিয়ন্ত্রণের অনুমতি দিন</translation> <translation id="4325690621216251241">সিস্টেম ট্রেতে একটি লগ আউট বোতাম জুড়ুন</translation> <translation id="4347908978527632940">সত্য হলে এবং ব্যবহারকারী একটি তত্ত্বাবধানে থাকা ব্যবহারকারী হলে, অন্যান্য Android অ্যাপ্লিকেশানগুলি একটি সামগ্রী প্রদানকারীর মাধ্যমে ব্যবহারকারীর ওয়েব বিধিনিষেধ বিষয়ে জানতে চাইতে পারে। @@ -1554,6 +1564,9 @@ যদি এই নীতি সেট না করা অবস্থায় রেখে দেওয়া হয় তবে যখন লগইন স্ক্রীণ প্রথম বার প্রদর্শিত হয় অন-স্ক্রীণ কীবোর্ড প্রাথমিকভাবে অক্ষম থাকে৷ কিন্তু ব্যবহারকারী যেকোনো সময় অন-স্ক্রীণ কীবোর্ড সক্ষম বা অক্ষম করতে পারবেন এবং লগইন স্ক্রীণে এটির স্থিতি ব্যবহারকারীদের মধ্যে বজায় রাখা হয়৷</translation> <translation id="6598235178374410284">অবতার চিত্র ব্যবহার করুন</translation> +<translation id="6628646143828354685">ওয়েবসাইটগুলিকে আশেপাশের Bluetooth ডিভাইসে অ্যাক্সেসের মঞ্জুরি দেওয়া হবে কি না আপনাকে তা সেট করার মঞ্জুরি দেয়। অ্যাক্সেস পুরোপুরি অবরুদ্ধ করা যাবে, অথবা যখনই কোনো ওয়েবসাইট আশেপাশের Bluetooth ডিভাইসগুলিতে অ্যাক্সেস করতে চায় তখনই ব্যবহারকারিকে জিজ্ঞাসা করা যেতে পারে। + + এই নীতিটি সেট না করে রাখা হলে, '৩' ব্যবহার করা হবে এবং ব্যবহারকারি এটি পরিবর্তন করতে পারবেন না।</translation> <translation id="6636268606788232221">যখন ব্যবহারকারী নিষ্ক্রিয় অবস্থায় থাকবে সেই সময়ের জন্য পাওয়ার ব্যবস্থাপনার সেটিংস কনফিগার করে৷ যখন ব্যবহারকারী নিষ্ক্রিয় অবস্থায় থাকে তখন পাওয়ার ব্যবস্থাপনার জন্য এই নীতিটি একাধিক সেটিংসের নিয়ন্ত্রণ করে৷ @@ -1647,6 +1660,7 @@ যদি আপনি এই নীতিটি সেট করেন, তাহলে ব্যবহারকারী এটিকে পরিবর্তন বা ওভাররাইড করতে পারবে না৷ যদি এই নীতিটি সেট না করে ফেলে রাখা হয়, তাহলে অ্যাক্সেসযোগ্যতার বিকল্পগুলি সিস্টেম ট্রের মেনুতে প্রদর্শিত হবে না, কিন্তু ব্যবহারকারী অ্যাক্সেসযোগ্যতার বিকল্পগুলি সেটিংস পৃষ্ঠার মাধ্যমে প্রদর্শিত হবে কিনা তা নির্ধারণ করতে পারেন৷</translation> +<translation id="6766216162565713893">আশেপাশের Bluetooth ডিভাইসে অ্যাক্সেস মঞ্জুরি দিতে ব্যবহারকারিকে যেন অনুরোধ করতে পারে তার অনুমতি দেয়</translation> <translation id="6770454900105963262">সক্রিয় কিয়স্ক অধিবেশনগুলি সম্পর্কে তথ্য প্রতিবেদন করে</translation> <translation id="6774533686631353488">ব্যবহারকারী লেভেলের নেটিভ বার্তাপ্রেরণ হোস্টগুলিকে অনুমতি দিন (প্রশাসকের অনুমতি ছাড়াই ইনস্টল করা)৷</translation> <translation id="6786747875388722282">এক্সটেনশানসমূহ</translation> @@ -1837,6 +1851,13 @@ অক্ষম করার জন্য এই নীতির সেটিংটি SPDY ব্যবহারকে মঞ্জুরি দেবে৷ যদি এই নীতিটি সেট না করেই ছেড়ে যাওয়া হয়, SPDY উপলব্ধ হবে৷</translation> <translation id="7384999953864505698">QUIC প্রোটোকলকে মঞ্জুরি দেয়</translation> +<translation id="7406651467768226499">শূন্য বিলম্ব সহ স্বয়ংক্রিয় লঞ্চ হওয়া কিয়স্ক অ্যাপ্লিকেশানকে <ph name="PRODUCT_OS_NAME" /> সংস্করণ নিয়ন্ত্রণ করতে দেওয়া হবে কিনা। + + শূন্য বিলম্ব সহ স্বয়ংক্রিয় লঞ্চ হওয়া কিয়স্ক অ্যাপ্লিকেশানকে <ph name="PRODUCT_OS_NAME" /> সংস্করণ নিয়ন্ত্রণ করতে দেওয়া হবে কিনা তা এই নীতি একটি মেনিফেস্টে প্রয়োজনীয়_প্ল্যাটফর্ম_সংস্করণ ঘোষণার মাধ্যমে এবং এটিকে স্বয়ংক্রিয় আপডেট লক্ষ্যের সংস্করণের প্রেফিক্স হিসেবে ব্যবহার করে নিয়ন্ত্রণ করে। + + এই নীতিটি সত্যতে সেট করা হলে, শূন্য বিলম্ব সহ স্বয়ংক্রিয় লঞ্চ হওয়া কিয়স্ক অ্যাপ্লিকেশানের প্রয়োজনীয়_প্ল্যাটফর্ম_সংস্করণের মেনিফেস্ট কী’র মানকে স্বয়ংক্রিয় আপডেট লক্ষ্যের সংস্করণের প্রেফিক্স হিসেবে ব্যবহার হয়। + + এই নীতি কনফিগার করা না হলে বা মিথ্যাতে সেট করা হলে, প্রয়োজনীয়_প্ল্যাটফর্ম_সংস্করণের মেনিফেস্ট কী উপেক্ষা করা হয় এবং স্বয়ংক্রিয় আপডেট বরাবরের মতো চলতে থাকে।</translation> <translation id="7417972229667085380">উপস্থাপন মোডে নিষ্ক্রিয়তা বিলম্ব স্কেল করার জন্য শতাংশ (থামানো হয়েছে)</translation> <translation id="7421483919690710988">বাইটে মিডিয়া ডিস্ক ক্যাশে আকার সেট করুন</translation> <translation id="7424751532654212117">অক্ষম থাকা প্লাগইনগুলির তালিকাটিতে ব্যতিক্রমগুলির তালিকা</translation>
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index d1e6832c..334aa25e 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -191,6 +191,13 @@ Aquesta política només es respecta si la política "DefaultSearchProviderEnabled" està activada.</translation> <translation id="1859633270756049523">Limita la durada de la sessió</translation> +<translation id="1859859319036806634">Advertiment: a partir de la versió 52 (cap al setembre de 2016), aquesta política deixarà de funcionar i la versió alternativa de TLS ja no estarà disponible a <ph name="PRODUCT_NAME" />. + + Abans, quan un protocol d'enllaç de TLS fallava, <ph name="PRODUCT_NAME" /> provava d'establir de nou la connexió amb una versió anterior de TLS per solucionar els errors dels servidors HTTPS. Aquesta opció configura la versió en què es detindrà el procés alternatiu. Si un servidor negocia correctament les versions (és a dir, sense interrompre la connexió), aquesta opció no s'aplica. En qualsevol cas, la connexió que en resulti ha de complir la política SSLVersionMin. + + Si aquesta política no es configura o s'hi estableix el valor "tls1.2", <ph name="PRODUCT_NAME" /> ja no segueix el procés alternatiu. Tingueu en compte que aquesta configuració no desactiva la compatibilitat amb versions anteriors de TLS, sinó que només defineix si <ph name="PRODUCT_NAME" /> evita els servidors amb errors que no puguin negociar correctament les versions. + + Si cal mantenir la compatibilitat amb un servidor amb errors, es pot establir el valor "tls1.1" a la política. És un recurs temporal que no treu la necessitat de reparar el servidor ràpidament.</translation> <translation id="1861037019115362154">Especifica una llista de connectors que estan desactivats a <ph name="PRODUCT_NAME" /> i impedeix que els usuaris puguin canviar aquesta configuració. Els caràcters comodí "*" i "?" es poden utilitzar per fer coincidir les seqüències de caràcters arbitraris. "*" coincideix amb un nombre arbitrari de caràcters, mentre que "?" especifica un sol caràcter opcional (per exemple, coincideix amb els caràcters zero o un). El caràcter d'escapada és "\", de manera que, per tal que coincideixi amb els caràcters "*", "?" o "\" reals, podeu col·locar el caràcter "\" al davant. @@ -533,6 +540,7 @@ Especifica si l'extensió de certificats lligats al domini TLS ha d'estar activada. Aquesta configuració s'utilitza per activar l'extensió de certificats lligats al domini TLS per a proves. Aquesta configuració experimental se suprimirà properament.</translation> +<translation id="2957506574938329824">No permetis que cap lloc sol·liciti accés a dispositius Bluetooth mitjançant l'API Web Bluetooth</translation> <translation id="2957513448235202597">Tipus de compte per a l'autenticació <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Regles d'evitació de servidors intermediaris</translation> <translation id="2960691910306063964">Activa o desactiva l'autenticació sense PIN per als amfitrions d'accés remot</translation> @@ -546,6 +554,7 @@ El valor de la política s'ha d'indicar en mil·lisegons i es limita perquè sigui inferior o igual al retard de desactivació (si s'ha definit) i al retard d'inactivitat.</translation> <translation id="2987155890997901449">Activa ARC</translation> +<translation id="2987227569419001736">Controla l'ús de l'API Web Bluetooth</translation> <translation id="2998881342848488968">Aquesta política permet que <ph name="PRODUCT_OS_NAME" /> eviti qualsevol servidor intermediari a l'autenticació de portals captius. Aquesta política només es fa efectiva si hi ha un servidor intermediari configurat (per exemple, mitjançant la política, configurat per l'usuari a chrome://settings o configurat per alguna extensió). @@ -830,6 +839,7 @@ Aquesta política només es respecta si la política "DefaultSearchProviderEnabled" està activada.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 o una versió posterior</translation> +<translation id="4322842393287974810">Permet que l'aplicació de quiosc d'inici automàtic sense retards controli la versió de <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Afegeix un botó de tancament de sessió a la safata del sistema</translation> <translation id="4347908978527632940">Si la política s'estableix en "true" i l'usuari és un usuari supervisat, altres aplicacions d'Android poden sol·licitar les restriccions web de l'usuari a un proveïdor de contingut. @@ -1422,6 +1432,9 @@ Si aquesta política es deixa sense configurar, el teclat en pantalla estarà desactivat la primera vegada que es mostri la pantalla d'inici de sessió. Els usuaris podran activar o desactivar el teclat en pantalla en qualsevol moment i l'estat que tingui a la pantalla d'inici de sessió es conservarà entre els usuaris.</translation> <translation id="6598235178374410284">Imatge d'avatar de l'usuari</translation> +<translation id="6628646143828354685">Us permet definir si els llocs web poden obtenir accés a dispositius Bluetooth propers. Es pot bloquejar completament o es pot consultar a l'usuari cada cop que un lloc web vulgui obtenir accés a dispositius Bluetooth propers. + + Si aquesta política es deixa sense establir, es farà servir el valor "3" i l'usuari podrà canviar-lo.</translation> <translation id="6636268606788232221">Configura l'administració de l'energia quan l'usuari està inactiu. Amb aquesta política es controlen diverses opcions de configuració de l'estratègia de la gestió de l'energia quan l'usuari està inactiu. @@ -1496,6 +1509,7 @@ Si configureu aquesta política, els usuaris no la podran canviar ni substituir. Si aquesta política es deixa sense configurar, les opcions d'accessibilitat no apareixeran al menú de la safata del sistema, però l'usuari podrà fer que les opcions d'accessibilitat apareguin mitjançant la pàgina "Configuració".</translation> +<translation id="6766216162565713893">Permet que els llocs demanin a l'usuari que els concedeixi accés a un dispositiu Bluetooth proper</translation> <translation id="6770454900105963262">Ofereix informació de les sessions de quiosc actives</translation> <translation id="6774533686631353488">Permetre amfitrions de missatgeria nadius per a l'usuari (instal·lació sense permisos d'administrador)</translation> <translation id="6786747875388722282">Extensions</translation> @@ -1674,6 +1688,13 @@ Si no definiu aquesta política, SPDY estarà disponible.</translation> <translation id="7384999953864505698">Permet el protocol QUIC</translation> +<translation id="7406651467768226499">Aquesta política defineix si es permet que l'aplicació de quiosc d'inici automàtic sense retards controli la versió de <ph name="PRODUCT_OS_NAME" />. + + Per poder controlar la versió de <ph name="PRODUCT_OS_NAME" />, la política declara una required_platform_version (versió obligatòria de la plataforma) al fitxer de manifest i la utilitza com a prefix per a la versió desitjada a la qual cal actualitzar automàticament. + + Si la política s'estableix en "true", el valor de la clau de manifest de required_platform_version atorgat a l'aplicació de quiosc d'inici automàtic sense retards s'utilitza com a prefix per a la versió desitjada a la qual cal actualitzar automàticament. + + Si la política no es configura o s'estableix en "false", la clau de manifest de required_platform_version s'ignora i l'actualització automàtica continua com de costum.</translation> <translation id="7417972229667085380">Percentatge que permet ajustar el retard d'inactivitat en mode de presentació (desactivat)</translation> <translation id="7421483919690710988">Defineix la mida de la memòria cau del disc multimèdia en bytes</translation> <translation id="7424751532654212117">Llista d'excepcions de la llista de connectors desactivats</translation>
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb index 1a6c8dd..081172b 100644 --- a/components/policy/resources/policy_templates_cs.xtb +++ b/components/policy/resources/policy_templates_cs.xtb
@@ -193,6 +193,13 @@ Tato zásada je respektována pouze v případě, že je aktivována zásada DefaultSearchProviderEnabled.</translation> <translation id="1859633270756049523">Omezit délku trvání relace</translation> +<translation id="1859859319036806634">Upozornění: Po verzi 52 (přibližně v září 2016) bude používání záložních nižších verzí TLS z prohlížeče <ph name="PRODUCT_NAME" /> odstraněno a tato zásada přestane fungovat. + + Pokud metoda handshake protokolu TLS selže, prohlížeč <ph name="PRODUCT_NAME" /> se pokusí o připojení znovu, ale jako dočasné řešení pro případ chyby serveru HTTPS použije nižší verzi protokolu TLS. Toto nastavení konfiguruje verzi, u které se tento záložní proces zastaví. Pokud server provede vyjednávání verze správně (tj. bez přerušení spojení), toto nastavení se nepoužije. Bez ohledu na toto nastavení musí výsledné připojení odpovídat také zásadě SSLVersionMin. + + Pokud tato zásada není nakonfigurována nebo je nastavena na hodnotu „tls1.2“, prohlížeč <ph name="PRODUCT_NAME" /> tento záložní postup neprovede. Tato zásada nedeaktivuje podporu starších verzí protokolu TLS, pouze určuje, zda se bude prohlížeč <ph name="PRODUCT_NAME" /> snažit řešit potíže s chybně fungujícími servery, které nedokážou správně vyjednávat verze. + + Pokud je třeba zajistit kompatibilitu s chybným serverem, lze nastavit hodnotu „tls1.1“. Jedná se však o nouzové řešení a server by měl být co nejrychleji opraven.</translation> <translation id="1861037019115362154">Určuje seznam deaktivovaných pluginů aplikace <ph name="PRODUCT_NAME" /> a brání uživatelům, aby toto nastavení změnili. Jako zástupné znaky lze použít znaky „*“ a „?“. Znak „*“ slouží jako zástupný znak pro několik libovolných znaků, zatímco znak „?“ zastupuje jeden znak (může zastupovat libovolný znak nebo také žádný znak). Řídicí znak je „\“, pokud tedy chcete zadat znaky „*“, „?“ nebo „\“ jako takové, stačí před ně umístit znak „\“. @@ -565,6 +572,7 @@ Určuje, zda má být povoleno rozšíření certifikátů svázaných s doménami. Toto nastavení se používá k aktivaci rozšíření certifikátů TLS svázaných s doménami pro účely testování. Toto experimentální nastavení bude v budoucnu odebráno.</translation> +<translation id="2957506574938329824">Nedovolit žádnému webu požadovat přístup k zařízením Bluetooth pomocí rozhraní Web Bluetooth API</translation> <translation id="2957513448235202597">Typ účtu pro ověření protokolu <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Pravidla vynechání proxy serveru</translation> <translation id="2960691910306063964">Aktivovat nebo deaktivovat ověřování bez kódu PIN u hostitelů vzdáleného přístupu</translation> @@ -578,6 +586,7 @@ Hodnotu zásady zadávejte v milisekundách. Maximální hodnota je stejná jako prodleva vypnutí obrazovky (pokud je nastavena) a prodleva režimu spánku.</translation> <translation id="2987155890997901449">Povolit rozšíření ARC</translation> +<translation id="2987227569419001736">Ovládat používání rozhraní Web Bluetooth API</translation> <translation id="2998881342848488968">Tato zásada umožňuje operačnímu systému <ph name="PRODUCT_OS_NAME" /> obejít jakýkoliv proxy server pro ověření captive portálu. Tato zásada bude použita pouze v případě, že je proxy server nakonfigurován (například pomocí zásady, uživatelským nastavením na stránce chrome://settings nebo pomocí rozšíření). @@ -898,6 +907,7 @@ Tato zásada je respektována pouze v případě, že je aktivována zásada DefaultSearchProviderEnabled.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 nebo novější</translation> +<translation id="4322842393287974810">Povolit automaticky spouštěné terminálové aplikaci s nulovým zpožděním ovládat verzi systému <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Přidat na hlavní panel systému tlačítko pro odhlášení</translation> <translation id="4347908978527632940">Pokud je tato zásada nastavena na hodnotu true a jedná se o dozorovaného uživatele, ostatní aplikace pro Android mohou prostřednictvím poskytovatele obsahu zjišťovat, jaká omezení přístupu k webu se na uživatele vztahují. @@ -1564,6 +1574,9 @@ Pokud tuto zásadu nenastavíte, bude při prvním zobrazení přihlašovací obrazovky softwarová klávesnice deaktivována. Uživatelé budou moci softwarovou klávesnici kdykoli aktivovat nebo deaktivovat a zvolený stav na přihlašovací obrazovce přetrvá i u jiných uživatelů.</translation> <translation id="6598235178374410284">Obrázek avatara uživatele</translation> +<translation id="6628646143828354685">Umožňuje nastavit, zda weby mají povoleno získat přístup k blízkým zařízením Bluetooth. Přístup lze zcela zablokovat nebo je možné uživatele požádat pokaždé, když web chce získat přístup k blízkým zařízením Bluetooth. + + Pokud je tato zásada ponechána nenastavená, použije se hodnota „3“ a uživatel ji bude moci změnit.</translation> <translation id="6636268606788232221">Konfigurace řízení spotřeby při neaktivitě uživatele. Tato zásada udává několik nastavení strategie řízení spotřeby pro případ, že uživatel přestane být aktivní. @@ -1655,6 +1668,7 @@ Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat. Není-li tato zásada nastavena, možnosti usnadnění přístupu se na panelu systémové nabídky nezobrazí, avšak uživatelé je mohou zpřístupnit na stránce Nastavení.</translation> +<translation id="6766216162565713893">Povolit webům žádat uživatele o udělení přístupu k blízkému zařízení Bluetooth</translation> <translation id="6770454900105963262">Nahlásit aktivní relace veřejného terminálu</translation> <translation id="6774533686631353488">Povolit hostitele zasílání nativních zpráv na úrovni uživatele (nainstalované bez oprávnění správce).</translation> <translation id="6786747875388722282">Rozšíření</translation> @@ -1845,6 +1859,13 @@ Pokud zásadu nenastavíte, bude protokol SPDY k dispozici.</translation> <translation id="7384999953864505698">Povoluje protokol QUIC</translation> +<translation id="7406651467768226499">Udává, zda má mít automaticky spouštěná terminálová aplikace s nulovým zpožděním povoleno ovládat verzi systému <ph name="PRODUCT_OS_NAME" />. + + Tato zásada řídí, zda bude mít automaticky spouštěná terminálová aplikace s nulovým zpožděním povoleno ovládat verzi systému <ph name="PRODUCT_OS_NAME" /> tím, že ve svém manifestu deklaruje klíč required_platform_version, který se použije jako předpona cílové verze u automatických aktualizací. + + Je-li tato zásada nastavena na hodnotu true, hodnota klíče required_platform_version v manifestu automaticky spouštěné terminálové aplikace s nulovým zpožděním se použije jako předpona cílové verze automatických aktualizací. + + Pokud tato zásada není nakonfigurována nebo je nastavena na hodnotu false, klíč manifestu required_platform_version je ignorován a automatické aktualizace fungují běžným způsobem.</translation> <translation id="7417972229667085380">Procento prodloužení prodlevy režimu nečinnosti v režimu prezentace (podpora ukončena)</translation> <translation id="7421483919690710988">Nastavit velikost diskové mezipaměti médií v bajtech</translation> <translation id="7424751532654212117">Seznam výjimek ze seznamu deaktivovaných pluginů</translation>
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb index dbf600e..7c31950 100644 --- a/components/policy/resources/policy_templates_da.xtb +++ b/components/policy/resources/policy_templates_da.xtb
@@ -192,6 +192,13 @@ Denne politik respekteres kun, hvis politikken "DefaultSearchProviderEnabled" er aktiveret.</translation> <translation id="1859633270756049523">Begræns sessionslængden</translation> +<translation id="1859859319036806634">Advarsel! Denne TLS-alternativversion fjernes fra <ph name="PRODUCT_NAME" /> efter version 52 (omkring september 2016), og denne politik er da ikke længere aktuel. + +Når TLS-dataudveksling mislykkes, ville <ph name="PRODUCT_NAME" /> tidligere prøve at oprette forbindelse igen med en ældre TLS-version for at løse problemet med fejl i HTTPS-servere. Denne indstilling konfigurerer den version, hvor fallback-processen stopper. Hvis en server udfører versionsforhanding korrekt (dvs. uden at afbryde forbindelsen), anvendes denne indstilling ikke. Uanset hvad skal den resulterende forbindelse stadig være i overensstemmelse med SSLVersionMin. + +Hvis denne politik ikke konfigureres, eller hvis den indstilles til "tls1.2", udfører <ph name="PRODUCT_NAME" /> ikke længere dette fallback. Bemærk, at dette ikke deaktiverer understøttelse af ældre TLS-versioner, kun hvorvidt <ph name="PRODUCT_NAME" /> vil løse problemet med fejlbehæftede servere, som ikke kan forhandle versioner korrekt. + +Hvis kompatabilitet med en fejlbehæftet server skal opretholdes, kan denne politik indstilles til "tls1.1". Dette er en midlertidig løsning, og problemet med serveren bør snarest udbedres.</translation> <translation id="1861037019115362154">Angiver en liste over plugins, der er deaktiveret i <ph name="PRODUCT_NAME" />, og forhindrer brugerne i at ændre denne indstilling. Jokertegnene "*" og "?" kan bruges til at angive sekvenser af vilkårlige tegn. "*" svarer til et vilkårligt antal tegn, mens "?" angiver et enkelt valgfrit tegn, dvs. tegnene 0 eller 1. Afslutningstegnet er "\", så for at angive de faktiske tegn "*", "?" eller "\" kan du sætte "\" foran dem. @@ -533,6 +540,7 @@ Angiver, om udvidelsen for certifikater, der er bundet af TLS-domænet, skal aktiveres. Denne indstilling bruges til at aktivere udvidelsen for certifikater, der er bundet af TLS-domænet, til testformål. Denne eksperimentelle indstilling vil blive fjernet senere hen.</translation> +<translation id="2957506574938329824">Tillad ikke, at websites får adgang til Bluetooth-enheder via Web Bluetooth API</translation> <translation id="2957513448235202597">Kontotype for <ph name="HTTP_NEGOTIATE" />-godkendelse</translation> <translation id="2959898425599642200">Regler for omgåelse af proxy</translation> <translation id="2960691910306063964">Aktivér eller deaktiver godkendelse uden pinkode for hosts til fjernadgang</translation> @@ -546,6 +554,7 @@ Politikkens værdi skal angives i millisekunder. Værdierne reduceres, så de er mindre end eller lig med skærmslukforsinkelsen (hvis angivet) og inaktivitetsforsinkelsen.</translation> <translation id="2987155890997901449">Aktivér ARC</translation> +<translation id="2987227569419001736">Kontrollér brugen af Web Bluetooth API</translation> <translation id="2998881342848488968">Denne politik giver <ph name="PRODUCT_OS_NAME" /> tilladelse til at omgå enhver proxy, der kræver godkendelse via en loginportal. Denne politik træder kun i kraft, hvis der er konfigureret en proxy (f.eks. via en politik, af en bruger på chrome://settings eller via udvidelser). @@ -836,6 +845,7 @@ Denne politik respekteres kun, hvis politikken "DefaultSearchProviderEnabled" er aktiveret.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 eller nyere</translation> +<translation id="4322842393287974810">Tillad, at den automatisk startede terminalapp uden forsinkelse kontrollerer <ph name="PRODUCT_OS_NAME" />-versionen</translation> <translation id="4325690621216251241">Tilføj en log ud-knap til systembakken</translation> <translation id="4347908978527632940">Hvis den er sand, og brugeren er en administreret bruger, kan andre Android-apps sende forespørgsler vedrørende brugerens webbegrænsninger via en indholdsudbyder. @@ -1443,6 +1453,9 @@ Hvis denne politik ikke indstilles, deaktiveres skærmtastaturet, når loginskærmen vises første gang. Brugerne kan til enhver tid aktivere eller deaktivere skærmtastaturet, og status for skærmtastaturet på loginskærmen bibeholdes for de enkelte brugere.</translation> <translation id="6598235178374410284">Brugerens avatarbillede</translation> +<translation id="6628646143828354685">Giver dig mulighed for at angive, om websites må få adgang til Bluetooth-enheder i nærheden. Adgangen kan være fuldstændig blokeret, eller brugeren kan få en anmodning, hver gang et website vil have adgang til en Bluetooth-enhed i nærheden. + + Hvis denne politik ikke indstilles, bruges "3", og brugeren kan ændre denne indstilling.</translation> <translation id="6636268606788232221">Konfigurer indstillinger for strømstyring, når brugeren bliver inaktiv. Denne politik kontrollerer flere indstillinger for strømstyringsstrategien, når brugeren bliver inaktiv. @@ -1518,6 +1531,7 @@ Hvis du har indstillet denne politik, kan brugerne ikke ændre eller tilsidesætte den. Hvis denne politik ikke er indstillet, vises hjælpeindstillingerne ikke i proceslinjemenuen, men brugeren kan forårsage, at hjælpeindstillingerne vises via siden Indstillinger.</translation> +<translation id="6766216162565713893">Tillad, at websites anmoder en bruger om adgang til en Bluetooth-enhed i nærheden.</translation> <translation id="6770454900105963262">Rapportér oplysninger om aktive terminalsessioner</translation> <translation id="6774533686631353488">Tillad indbyggede beskedhosts, der er installeret på brugerniveau (installeret uden administratortilladelser).</translation> <translation id="6786747875388722282">Udvidelser</translation> @@ -1695,6 +1709,13 @@ <translation id="7340034977315324840">Rapportér tidspunkter for aktiviteter på enheden</translation> <translation id="7381326101471547614">Deaktiverer brug af SPDY-protokollen i <ph name="PRODUCT_NAME" />. Hvis denne politik er aktiveret, vil SPDY-protokollen ikke være tilgængelig i <ph name="PRODUCT_NAME" />. Hvis du deaktiverer denne politik, tillades brug af SPDY. Hvis retningslinjerne for denne politik ikke angives, vil SPDY være tilgængelig.</translation> <translation id="7384999953864505698">Tillader QUIC-protokol</translation> +<translation id="7406651467768226499">Om den automatisk startede terminalapp uden forsinkelse skal kunne kontrollere <ph name="PRODUCT_OS_NAME" />-versionen. + + Denne politik bestemmer, om den automatisk startede terminalapp uden forsinkelse skal kunne styre <ph name="PRODUCT_OS_NAME" />-versionen ved at angive en required_platform_version i sit manifest og bruge den som et præfiks for en automatisk opdateret målversion. + + Hvis politikken er angivet til sand, bruges værdien i manifestnøglen required_platform_version fra den automatisk startede terminalapp uden forsinkelse til automatisk at opdatere præfikset for målversionen. + + Hvis politikken ikke konfigureres, eller den indstilles til falsk, ignoreres manifestnøglen required_platform_version, og den automatiske opdatering fortsætter som normalt.</translation> <translation id="7417972229667085380">Den procentdel, som inaktivitetsforsinkelsen i præsentationstilstand skaleres efter (udfases)</translation> <translation id="7421483919690710988">Angiv størrelsen på mediediskcache i bytes</translation> <translation id="7424751532654212117">Liste over undtagelser for listen over deaktiverede plugins</translation>
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index e89da380..f050474 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -187,6 +187,13 @@ Diese Richtlinie wird nur berücksichtigt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist.</translation> <translation id="1859633270756049523">Sitzungsdauer begrenzen</translation> +<translation id="1859859319036806634">Achtung: Der TLS-Versions-Fallback wird nach Version 52 (ungefähr im September 2016) aus <ph name="PRODUCT_NAME" /> entfernt. Diese Richtlinie funktioniert dann nicht mehr. + + Bei einem TLS-Handshake-Fehler hat <ph name="PRODUCT_NAME" /> früher versucht, eine Verbindung mit einer niedrigeren TLS-Version herzustellen, um Programmfehler bei HTTPS-Servern zu umgehen. Mit dieser Einstellung wird die Version festgelegt, bei der dieser Fallback-Vorgang beendet wird. Wenn ein Server die Versionsaushandlung korrekt, d. h. ohne Unterbrechung der Verbindung durchführt, wird diese Einstellung nicht angewendet. Ungeachtet dessen muss die sich daraus ergebende Verbindung dem Parameter "SSLVersionMin" entsprechen. + + Ist diese Richtlinie nicht konfiguriert oder auf "tls1.2" eingestellt, führt <ph name="PRODUCT_NAME" /> diesen Fallback nicht mehr durch. Die Unterstützung älterer TLS-Versionen wird dadurch nicht deaktiviert, es wird lediglich festgelegt, ob <ph name="PRODUCT_NAME" /> fehlerträchtige Server umgeht, die keine korrekten Versionsaushandlungen durchführen können. + + Wenn die Kompatibilität mit einem fehlerträchtigen Server aufrechterhalten werden muss, kann "tls1.1" eingestellt werden. Hierbei handelt es sich um einen provisorischen Wert und der Server sollte schnell repariert werden.</translation> <translation id="1861037019115362154">Gibt eine Liste von Plug-ins an, die in <ph name="PRODUCT_NAME" /> deaktiviert sind, und verhindert, dass Nutzer diese Einstellung ändern können. Die Platzhalterzeichen "*" und "?" können verwendet werden, um Übereinstimmungen mit beliebigen Zeichenfolgen herbeizuführen. "*" ergibt Übereinstimmungen mit einer beliebigen Anzahl von Zeichen, während "?" für ein einziges optionales Zeichen steht, also keinem oder einem Zeichen entspricht. Das Escape-Zeichen ist "\", um also wirkliche Übereinstimmungen mit den Zeichen "*", "?" und "\" zu finden, können Sie das "\"-Zeichen davor platzieren. @@ -529,6 +536,7 @@ Sie legt fest, ob die Erweiterung für domaingebundene TLS-Zertifikate aktiviert werden soll. Anhand dieser Einstellung wird die Erweiterung für domaingebundene TLS-Zertifikate zu Testzwecken aktiviert. Diese experimentelle Einstellung wird in absehbarer Zukunft entfernt.</translation> +<translation id="2957506574938329824">Keine Website darf Zugriff auf Bluetooth-Geräte über die Web Bluetooth API anfordern</translation> <translation id="2957513448235202597">Kontotyp für die <ph name="HTTP_NEGOTIATE" />-Authentifizierung</translation> <translation id="2959898425599642200">Proxy-Umgehungsregeln</translation> <translation id="2960691910306063964">Authentifizierung ohne PIN für Hosts für den Remotezugriff aktivieren oder deaktivieren</translation> @@ -542,6 +550,7 @@ Der Wert für die Richtlinie muss in Millisekunden angegeben werden. Werte müssen kleiner oder gleich dem Wert der Verzögerung für die Bildschirmabschaltung (falls angegeben) und der Inaktivitätsverzögerung sein.</translation> <translation id="2987155890997901449">ARC aktivieren</translation> +<translation id="2987227569419001736">Verwendung der Web Bluetooth API steuern</translation> <translation id="2998881342848488968">Diese Richtlinie ermöglicht <ph name="PRODUCT_OS_NAME" />, zur Captive-Portal-Authentifizierung alle Proxys zu umgehen. Die Richtlinie kommt nur dann zum Einsatz, wenn ein Proxy konfiguriert ist, zum Beispiel über eine Richtlinie, vom Nutzer unter chrome://settings oder von Erweiterungen. @@ -823,6 +832,7 @@ Diese Richtlinie wird nur berücksichtigt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 oder höher</translation> +<translation id="4322842393287974810">Der automatisch ohne Verzögerung gestarteten Kiosk-App die Steuerung der <ph name="PRODUCT_OS_NAME" />-Version gestatten</translation> <translation id="4325690621216251241">Schaltfläche "Abmelden" zur Taskleiste hinzufügen</translation> <translation id="4347908978527632940">Wenn "true" eingestellt ist und der Nutzer ein betreuter Nutzer ist, können andere Android-Apps die Webeinschränkungen des Nutzers über einen Contentanbieter abfragen. @@ -1410,6 +1420,9 @@ Wird diese Richtlinie nicht konfiguriert, ist die Bildschirmtastatur beim erstmaligen Aufrufen der Anmeldeseite deaktiviert. Nutzer können die Bildschirmtastatur jederzeit aktivieren oder deaktivieren, wobei ihr Status auf der Anmeldeseite bei einem Nutzerwechsel erhalten bleibt.</translation> <translation id="6598235178374410284">Nutzer-Avatarbild</translation> +<translation id="6628646143828354685">Mit dieser Richtlinie können Sie festlegen, ob Websites Zugriff auf Bluetooth-Geräte in der Nähe erhalten. Der Zugriff kann vollständig gesperrt werden oder der Nutzer wird jedes Mal gefragt, wenn eine Website auf Bluetooth-Geräte in der Nähe zugreifen möchte. + + Wenn diese Richtlinie nicht konfiguriert ist, wird die Einstellung "3" verwendet, die vom Nutzer später geändert werden kann.</translation> <translation id="6636268606788232221">Einstellungen der Energieverwaltung bei Inaktivität des Nutzers konfigurieren Mit dieser Richtlinie können Sie mehrere Einstellungen zur Energieverwaltungsstrategie bei Inaktivität des Nutzers festlegen. @@ -1485,6 +1498,7 @@ Wenn Sie diese Richtlinie konfigurieren, können die Nutzer sie nicht ändern oder außer Kraft setzen. Wenn diese Richtlinie nicht konfiguriert wird, erscheinen keine Optionen für Bedienungshilfen im Taskleistenmenü, der Nutzer kann deren Anzeige jedoch auf der Seite "Einstellungen" aktivieren.</translation> +<translation id="6766216162565713893">Websites dürfen den Nutzer um Zugriff auf ein Bluetooth-Gerät in der Nähe bitten</translation> <translation id="6770454900105963262">Informationen zu aktiven Kiosksitzungen senden</translation> <translation id="6774533686631353488">Hosts für natives Messaging, die ohne Berechtigung des Administrators installiert wurden, auf Nutzerebene zulassen</translation> <translation id="6786747875388722282">Erweiterungen</translation> @@ -1658,6 +1672,13 @@ <translation id="7340034977315324840">Aktivitätszeit von Geräten melden</translation> <translation id="7381326101471547614">Hiermit wird die Verwendung des SPDY-Protokolls in <ph name="PRODUCT_NAME" /> verhindert. Wenn diese Richtlinie aktiviert ist, steht das SPDY-Protokoll in <ph name="PRODUCT_NAME" /> nicht zur Verfügung. Sollte sie deaktiviert werden, kann SPDY genutzt werden. Ist die Richtlinie nicht konfiguriert, steht SPDY zur Verfügung.</translation> <translation id="7384999953864505698">Lässt das QUIC-Protokoll zu</translation> +<translation id="7406651467768226499">Gibt an, ob der automatisch ohne Verzögerung gestarteten Kiosk-App die Steuerung der <ph name="PRODUCT_OS_NAME" />-Version gestattet werden soll. + + Durch diese Richtlinie wird festgelegt, ob der automatisch ohne Verzögerung gestarteten Kiosk-App die Steuerung der <ph name="PRODUCT_OS_NAME" />-Version gestattet wird, indem in ihrem Manifest eine erforderliche Plattformversion (required_platform_version) deklariert und als Zielversionspräfix beim automatischen Update verwendet wird. + + Wenn die Richtlinie auf "true" gesetzt ist, wird der Wert des Manifestschlüssels "required_platform_version" der automatisch ohne Verzögerung gestarteten Kiosk-App als Zielversionspräfix beim automatischen Update verwendet. + + Wenn die Richtlinie nicht konfiguriert oder auf "false" gesetzt ist, wird der Manifestschlüssel "required_platform_version" ignoriert und das automatische Update erfolgt wie gewohnt.</translation> <translation id="7417972229667085380">Prozentsatz für die Skalierung der Inaktivitätsspanne im Präsentationsmodus (veraltet)</translation> <translation id="7421483919690710988">Cache-Größe für Mediendatenträger in Byte festlegen</translation> <translation id="7424751532654212117">Liste der Ausnahmen von der Liste der deaktivierten Plug-ins</translation>
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb index eb27edd..7d15c067 100644 --- a/components/policy/resources/policy_templates_el.xtb +++ b/components/policy/resources/policy_templates_el.xtb
@@ -209,6 +209,13 @@ Αυτή η πολιτική εφαρμόζεται μόνο εάν έχει ενεργοποιηθεί η πολιτική "DefaultSearchProviderEnabled".</translation> <translation id="1859633270756049523">Περιορισμός διάρκειας περιόδου σύνδεσης</translation> +<translation id="1859859319036806634">Προειδοποίηση: Η εναλλακτική έκδοση TLS θα καταργηθεί από το <ph name="PRODUCT_NAME" /> μετά από την έκδοση 52 (περίπου τον Σεπτέμβριο του 2016) και αυτή η πολιτική θα σταματήσει να λειτουργεί εκείνη την ημερομηνία. + + Στο παρελθόν, όταν μια χειραψία TLS αποτύγχανε, το <ph name="PRODUCT_NAME" /> προσπαθούσε να δοκιμάσει ξανά τη σύνδεση με μια προγενέστερη έκδοση του TLS ώστε να παρακάμψει τα σφάλματα στους διακομιστές HTTPS. Αυτή η ρύθμιση διαμορφώνει την έκδοση στην οποία θα σταματήσει αυτή η εναλλακτική διαδικασία. Αν ένας διακομιστής εκτελέσει σωστά τη διαπραγμάτευση έκδοσης (δηλαδή, χωρίς να τερματίσει τη σύνδεση), τότε αυτή η ρύθμιση δεν εφαρμόζεται. Παρόλα αυτά, η σύνδεση που θα δημιουργηθεί θα πρέπει να εξακολουθεί να συμμορφώνεται με το SSLVersionMin. + + Αν η πολιτική δεν ρυθμιστεί ή οριστεί ως "tls1.2", τότε το <ph name="PRODUCT_NAME" /> δεν εκτελεί πλέον αυτήν την εναλλακτική διαδικασία. Έχετε υπόψη, ότι αυτή η ενέργεια δεν απενεργοποιεί την υποστήριξη για παλαιότερες εκδόσεις TLS, αλλά ορίζει μόνο αν το <ph name="PRODUCT_NAME" /> θα παρακάμπτει τους διακομιστές που περιέχουν σφάλματα και δεν μπορούν να διαπραγματευτούν σωστά τις εκδόσεις. + + Αλλιώς, αν πρέπει να διατηρηθεί η συμβατότητα με έναν προβληματικό διακομιστή, αυτή η πολιτική μπορεί να οριστεί ως "tls1.1". Αυτή είναι μια πρόχειρη λύση και ο διακομιστής θα πρέπει να διορθωθεί το συντομότερο.</translation> <translation id="1861037019115362154">Καθορίζει μια λίστα προσθηκών που είναι απενεργοποιημένες στο <ph name="PRODUCT_NAME" /> και αποτρέπει την αλλαγή αυτής της ρύθμισης από τους χρήστες. Οι χαρακτήρες μπαλαντέρ "*" και "?" μπορούν να χρησιμοποιηθούν για την αντιστοίχιση ακολουθιών αυθαίρετων χαρακτήρων. Ο χαρακτήρας "*" αντιστοιχεί σε έναν αυθαίρετο αριθμό χαρακτήρων ενώ ο χαρακτήρας "?" προσδιορίζει έναν προαιρετικό μεμονωμένο χαρακτήρα, π.χ. αντιστοιχεί σε μηδέν ή έναν χαρακτήρα. Ο χαρακτήρας διαφυγής είναι το "\", επομένως για να αντιστοιχίσετε τους τρέχοντες χαρακτήρες "*", "?" ή "\", μπορείτε να τοποθετήσετε τον χαρακτήρα "\" πριν από αυτούς. @@ -594,6 +601,7 @@ Καθορίζει εάν θα πρέπει να ενεργοποιείται η επέκταση πιστοποιητικών TLS βάσει τομέα. Αυτή η ρύθμιση χρησιμοποιείται για την ενεργοποίηση της επέκτασης πιστοποιητικών TLS βάσει τομέα για δοκιμή. Αυτή η πειραματική ρύθμιση θα καταργηθεί στο μέλλον.</translation> +<translation id="2957506574938329824">Να μην επιτρέπεται σε κανέναν ιστότοπο η υποβολή αιτημάτων πρόσβασης για συσκευές Bluetooth μέσω του API Bluetooth ιστού</translation> <translation id="2957513448235202597">Τύπος λογαριασμού για έλεγχο ταυτότητας <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Κανόνες παράκαμψης διακομιστή μεσολάβησης</translation> <translation id="2960691910306063964">Ενεργοποίηση ή απενεργοποίηση του ελέγχου ταυτότητας χωρίς PIN για κεντρικούς υπολογιστές απομακρυσμένης πρόσβασης</translation> @@ -607,6 +615,7 @@ Η τιμή πολιτικής πρέπει να προσδιορίζεται σε χιλιοστά δευτερολέπτου. Οι τιμές καθορίζονται έτσι ώστε να είναι μικρότερες από ή ίσες με την καθυστέρηση απενεργοποίησης οθόνης (αν έχει οριστεί) και την καθυστέρηση αδράνειας.</translation> <translation id="2987155890997901449">Ενεργοποίηση ARC</translation> +<translation id="2987227569419001736">Έλεγχος της χρήσης του API Bluetooth ιστού</translation> <translation id="2998881342848488968">Αυτή η πολιτική επιτρέπει στο <ph name="PRODUCT_OS_NAME" /> την παράκαμψη οποιουδήποτε διακομιστή διαμεσολάβησης για έλεγχο ταυτότητας πύλης υποδοχής. Αυτή η πολιτική εφαρμόζεται μόνο αν έχει διαμορφωθεί διακομιστής διαμεσολάβησης (για παράδειγμα μέσω της πολιτικής, από το χρήστη στο chrome://settings ή από τις επεκτάσεις). @@ -1595,6 +1604,9 @@ Εάν δεν ρυθμιστεί αυτή η πολιτική, το πληκτρολόγιο οθόνης απενεργοποιείται όταν εμφανίζεται για πρώτη φορά η οθόνη σύνδεσης. Οι χρήστες μπορούν να ενεργοποιήσουν ή να απενεργοποιήσουν το πληκτρολόγιο οθόνης ανά πάσα στιγμή και η κατάστασή του στην οθόνη σύνδεσης παραμένει ίδια από χρήστη σε χρήστη.</translation> <translation id="6598235178374410284">Εικόνα άβαταρ χρήστη</translation> +<translation id="6628646143828354685">Σας επιτρέπει να ορίσετε αν οι ιστότοποι θα μπορούν να αποκτούν πρόσβαση σε κοντινές συσκευές Bluetooth. Μπορείτε να επιλέξετε αν θα γίνει πλήρης αποκλεισμός της πρόσβασης ή αν θα γίνεται ερώτηση στο χρήστη κάθε φορά που ένας ιστότοπος ζητάει πρόσβαση σε κοντινές συσκευές Bluetooth. + + Εάν δεν ορίσετε αυτήν την πολιτική, θα χρησιμοποιηθεί η επιλογή "3" με δυνατότητα αλλαγής της από το χρήστη.</translation> <translation id="6636268606788232221">Διαμορφώστε τις ρυθμίσεις διαχείρισης ενέργειας όταν ο χρήστης είναι αδρανής. Αυτή η πολιτική ελέγχει πολλές ρυθμίσεις για τη στρατηγική διατήρησης της ενέργειας όταν ο χρήστης είναι αδρανής. @@ -1687,6 +1699,7 @@ Εάν ρυθμίσετε αυτήν την πολιτική, οι χρήστες δεν μπορούν να την αλλάξουν ή να την παρακάμψουν. Εάν δεν ρυθμίσετε αυτήν την πολιτική, οι Επιλογές προσβασιμότητας δεν θα εμφανίζονται στη γραμμή ειδοποιήσεων, αλλά ο χρήστης θα μπορεί να εμφανίσει τις Επιλογές προσβασιμότητας μέσω της σελίδας Ρυθμίσεων.</translation> +<translation id="6766216162565713893">Να επιτρέπεται στους ιστότοπους η υποβολή αιτημάτων παροχής πρόσβασης στο χρήστη για κοντινές συσκευές Bluetooth</translation> <translation id="6770454900105963262">Αναφορά πληροφοριών σχετικά με ενεργές περιόδους σύνδεσης kiosk</translation> <translation id="6774533686631353488">Επιτρέπει τους κεντρικούς υπολογιστές της Εγγενούς ανταλλαγής μηνυμάτων σε επίπεδο χρήστη (που έχουν εγκατασταθεί χωρίς δικαιώματα διαχειριστή).</translation> <translation id="6786747875388722282">Επεκτάσεις</translation>
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index a1a3791..79ec6d3 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -208,6 +208,13 @@ This policy is only respected if the 'DefaultSearchProviderEnabled' policy is enabled.</translation> <translation id="1859633270756049523">Limit the session length</translation> +<translation id="1859859319036806634">Warning: The TLS version fallback will be removed from <ph name="PRODUCT_NAME" /> after version 52 (around September 2016) and this policy will stop working then. + + When a TLS handshake fails, <ph name="PRODUCT_NAME" /> would previously retry the connection with a lesser version of TLS in order to work around bugs in HTTPS servers. This setting configures the version at which this fallback process will stop. If a server performs version negotiation correctly (i.e. without breaking the connection) then this setting doesn't apply. Regardless, the resulting connection must still comply with SSLVersionMin. + + If this policy is not configured or if it is set to "tls1.2" then <ph name="PRODUCT_NAME" /> no longer performs this fallback. Note that this does not disable support for older TLS versions, only whether <ph name="PRODUCT_NAME" /> will work around buggy servers which cannot negotiate versions correctly. + + Otherwise, if compatibility with a buggy server must be maintained, this policy may be set to "tls1.1". This is a stopgap measure and the server should be rapidly fixed.</translation> <translation id="1861037019115362154">Specifies a list of plugins that are disabled in <ph name="PRODUCT_NAME" /> and prevents users from changing this setting. The wildcard characters '*' and '?' can be used to match sequences of arbitrary characters. '*' matches an arbitrary number of characters while '?' specifies an optional single character, i.e. matches zero or one characters. The escape character is '\', so to match actual '*', '?', or '\' characters, you can put a '\' in front of them. @@ -595,6 +602,7 @@ Specifies whether the TLS domain-bound certificates extension should be enabled. This setting is used to enable the TLS domain-bound certificates extension for testing. This experimental setting will be removed in the future.</translation> +<translation id="2957506574938329824">Do not allow any site to request access to Bluetooth devices via the Web Bluetooth API</translation> <translation id="2957513448235202597">Account type for <ph name="HTTP_NEGOTIATE" /> authentication</translation> <translation id="2959898425599642200">Proxy bypass rules</translation> <translation id="2960691910306063964">Enable or disable PIN-less authentication for remote access hosts</translation> @@ -608,6 +616,7 @@ The policy value should be specified in milliseconds. Values are clamped to be less than or equal the screen off delay (if set) and the idle delay.</translation> <translation id="2987155890997901449">Enable ARC</translation> +<translation id="2987227569419001736">Control use of the Web Bluetooth API</translation> <translation id="2998881342848488968">This policy allows <ph name="PRODUCT_OS_NAME" /> to bypass any proxy for captive portal authentication. This policy only takes effect if a proxy is configured (for example through policy, by the user in chrome://settings or by extensions). @@ -1610,6 +1619,9 @@ If this policy is left unset, the on-screen keyboard is disabled when the login screen is first shown. Users can enable or disable the on-screen keyboard any time and its status on the login screen is persisted between users.</translation> <translation id="6598235178374410284">User avatar image</translation> +<translation id="6628646143828354685">Allows you to set whether websites are allowed to get access to nearby Bluetooth devices. Access can be completely blocked, or the user can be asked every time a website wants to get access to nearby Bluetooth devices. + + If this policy is left not set, '3' will be used, and the user will be able to change it.</translation> <translation id="6636268606788232221">Configure power management settings when the user becomes idle. This policy controls multiple settings for the power management strategy when the user becomes idle. @@ -1702,6 +1714,7 @@ If you set this policy, users cannot change or override it. If this policy is left unset, Accessibility options will not appear in the system tray menu, but the user can cause the Accessibility options to appear via the Settings page.</translation> +<translation id="6766216162565713893">Allow sites to ask the user to grant access to a nearby Bluetooth device</translation> <translation id="6770454900105963262">Report information about active kiosk sessions</translation> <translation id="6774533686631353488">Allow user-level Native Messaging hosts (installed without admin permissions).</translation> <translation id="6786747875388722282">Extensions</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 1826352..b5880b53 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -187,6 +187,13 @@ Esta política solo se respeta si se habilita la política "DefaultSearchProviderEnabled".</translation> <translation id="1859633270756049523">Limitar la duración de la sesión</translation> +<translation id="1859859319036806634">Advertencia: El resguardo de la versión de TLS se quitará de <ph name="PRODUCT_NAME" /> después de la versión 52 (alrededor de septiembre de 2016), y esta política dejará de funcionar. + + Cuando se produce un error con el protocolo de enlace TLS, <ph name="PRODUCT_NAME" /> intenta conectarse con una versión anterior de TLS para evitar los errores en los servidores HTTPS. Esta configuración establece la versión en la que se detendrá este proceso de resguardo. Si el servidor realiza la negociación de la versión correctamente (es decir, sin que se interrumpa la conexión), no se aplica esta configuración. Independientemente de esto, la conexión resultante debe cumplir con SSLVersionMin. + + Si no se configura esta política o si se establece con el valor "tls1.2", <ph name="PRODUCT_NAME" /> ya no realiza este resguardo. Ten en cuenta que esto no inhabilita la compatibilidad para las versiones de TLS anteriores. Esto solo sucede si <ph name="PRODUCT_NAME" /> evita los servidores con errores que no pueden negociar las versiones correctamente. + + Caso contrario, si debe mantenerse la compatibilidad con un servidor con errores, esta política puede configurarse en "tls1.1". Esta es una medida provisoria, y el servidor debe arreglarse rápidamente.</translation> <translation id="1861037019115362154">Especifica una lista de complementos que están inhabilitados en <ph name="PRODUCT_NAME" /> y evita que los usuarios cambien esta configuración. Se pueden utilizar los caracteres comodín "*" y "?" para hacer coincidir las secuencias de caracteres arbitrarios. "*" coincide con un número arbitrario de caracteres, mientras que "?" especifica un solo carácter opcional, es decir, coincide con un carácter o con ninguno. El carácter de escape es "\", de manera que para hacer coincidir los caracteres "*", "?" o "\" reales, puedes colocar "\" delante de ellos. @@ -522,6 +529,7 @@ Especifica si debe habilitarse la extensión TLS de certificados vinculados al dominio. Esta configuración se utiliza para habilitar la extensión TLS de certificados vinculados al dominio para realizar pruebas. Es una configuración experimental que se eliminará en el futuro.</translation> +<translation id="2957506574938329824">No permitir que ningún sitio solicite acceso a dispositivos Bluetooth mediante la API de Bluetooth web</translation> <translation id="2957513448235202597">Tipo de cuenta para la autenticación <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Reglas de omisión de proxy</translation> <translation id="2960691910306063964">Habilitar o inhabilitar la autenticación sin PIN para hosts de acceso remoto</translation> @@ -535,6 +543,7 @@ El valor de la política debe especificarse en milisegundos. Los valores se establecerán para que sean inferiores o equivalentes a la demora de pantalla apagada (si está configurada) y la demora de inactividad.</translation> <translation id="2987155890997901449">Habilitar ARC</translation> +<translation id="2987227569419001736">Controlar el uso de la API de Bluetooth web</translation> <translation id="2998881342848488968">Esta política permite que <ph name="PRODUCT_OS_NAME" /> omita cualquier proxy para la autenticación de portales cautivos. Esta política se aplica únicamente si hay un proxy configurado (por ejemplo, a través de la política, por el usuario en chrome://settings o por extensiones). @@ -815,6 +824,7 @@ Esta política solo se respeta si se habilita la política "DefaultSearchProviderEnabled".</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 o posterior</translation> +<translation id="4322842393287974810">Permitir que la aplicación de kiosko con lanzamiento automático sin tiempo de espera controle la versión de <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Agregar un botón para cerrar sesión en la bandeja del sistema</translation> <translation id="4347908978527632940">Si la política se establece en true y el usuario es uno supervisado, otras apps de Android pueden consultar las restricciones web del usuario mediante un proveedor de contenido. @@ -1401,6 +1411,9 @@ Si no se establece esta política, el teclado en pantalla se inhabilita la primera vez que aparece la pantalla de acceso. Los usuarios pueden habilitarlo o inhabilitarlo en cualquier momento, y esta selección persiste en el resto de los usuarios.</translation> <translation id="6598235178374410284">Imagen de avatar del usuario</translation> +<translation id="6628646143828354685">Te permite establecer si los sitios web pueden acceder a dispositivos Bluetooth cercanos. El acceso se puede bloquear por completo o se puede preguntar al usuario cada vez que un sitio web desea acceder a dispositivos Bluetooth cercanos. + + Si no se configura esta política, se usará el valor "3" y el usuario podrá cambiarlo.</translation> <translation id="6636268606788232221">Configura la administración de energía cuando el usuario está inactivo. Esta política controla distintas configuraciones de la estrategia de administración de energía cuando el usuario está inactivo. @@ -1476,6 +1489,7 @@ Si estableces esta política, los usuarios no pueden modificarla ni anularla. Si esta política no se establece, las opciones de accesibilidad no aparecerán en el menú de la bandeja del sistema, pero el usuario puede modificar esto en la página de configuración.</translation> +<translation id="6766216162565713893">Permitir que los sitios soliciten permiso al usuario para acceder a un dispositivo Bluetooth cercano</translation> <translation id="6770454900105963262">Informar datos sobre las sesiones de kiosco activas</translation> <translation id="6774533686631353488">Permite el uso de hosts de mensajería nativa en el nivel de usuario (instalados sin permisos de administrador).</translation> <translation id="6786747875388722282">Extensiones</translation> @@ -1653,6 +1667,13 @@ <translation id="7340034977315324840">Notificar tiempo de actividad del dispositivo</translation> <translation id="7381326101471547614">Permite inhabilitar el protocolo SPDY en <ph name="PRODUCT_NAME" />. Si se habilita esta política, el protocolo SPDY no estará disponible en <ph name="PRODUCT_NAME" />. Si se inhabilita esta política, se podrá utilizar el protocolo SPDY. Si no se establece esta política, el protocolo SPDY estará disponible.</translation> <translation id="7384999953864505698">Permite el protocolo QUIC</translation> +<translation id="7406651467768226499">Determina si se permite que la aplicación de kiosko con lanzamiento automático sin tiempo de espera controle la versión de <ph name="PRODUCT_OS_NAME" />. + + Mediante esta política, se determina si se permite que la aplicación de kiosko con lanzamiento automático sin tiempo de espera controle la versión de <ph name="PRODUCT_OS_NAME" /> al declarar un valor de required_platform_version en su manifiesto y al usarlo como el prefijo para la versión de destino de actualizaciones automáticas. + + Si se aplica la política, el valor de la clave de manifiestos required_platform_version de la aplicación de kiosko con lanzamiento automático sin tiempo de espera se utiliza como prefijo para la versión de destino de actualizaciones automáticas. + + Si la política no se configura o se decide no aplicarla, se ignora la clave de manifiestos required_platform_version, y la actualización automática se realiza normalmente.</translation> <translation id="7417972229667085380">Indica el porcentaje en el que debe ajustarse la demora de inactividad en el modo de presentación (en desuso).</translation> <translation id="7421483919690710988">Establecer tamaño de caché de disco de medios en bytes</translation> <translation id="7424751532654212117">Lista de excepciones para la lista de complementos inhabilitados</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index c185bcd..1e0acc3 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -209,6 +209,13 @@ Esta política solo se respeta si se habilita la política "DefaultSearchProviderEnabled".</translation> <translation id="1859633270756049523">Limitar la duración de la sesión</translation> +<translation id="1859859319036806634">Advertencia: La alternativa de la versión de TLS se retirará de <ph name="PRODUCT_NAME" /> después de la versión 52 (en septiembre de 2016, aproximadamente) y esta política dejará de funcionar. + + Cuando no es posible establecer el protocolo de enlace TLS, <ph name="PRODUCT_NAME" /> ya habrá intentado intentar establecer la conexión con una versión anterior de TLS para evitar errores en los servidores HTTPS. Esta opción configura la versión en la que se detendrá el proceso alternativo. Si un servidor lleva a cabo la negociación de la versión correctamente (es decir, sin interrumpir la conexión) esta opción no se aplica. En cualquier caso, la conexión resultante debe cumplir la política SSLVersionMin. + + Si no se configura esta política o si se le asigna el valor tls1.2, <ph name="PRODUCT_NAME" /> ya no utiliza esta alternativa. Ten en cuenta que, solo si <ph name="PRODUCT_NAME" /> evita el uso de servidores con errores que no puedan negociar las versiones correctamente, no se inhabilita la compatibilidad con versiones anteriores de TLS. + + De lo contrario, el valor tls 1.1 puede asignarse a la política si se debe mantener la compatibilidad con un servidor con errores. Esta es una medida provisional y el servidor debería arreglarse rápidamente.</translation> <translation id="1861037019115362154">Permite especificar una lista de complementos inhabilitados en <ph name="PRODUCT_NAME" /> y evita que los usuarios modifiquen esta opción. Se pueden utilizar los caracteres comodín "*" y "?" para obtener coincidencias con secuencias de caracteres arbitrarios. El carácter "*" permite obtener coincidencias con un número arbitrario de caracteres y "?" especifica un único carácter opcional (puede coincidir con un carácter o con ninguno). Se puede escribir el carácter de escape ("\") delante de los caracteres "*", "?" o "\" para obtener coincidencias con los propios caracteres. @@ -596,6 +603,7 @@ Especifica si se debe habilitar la extensión de certificados TLS limitados a dominios. Esta opción se utiliza para habilitar la extensión de certificados TLS limitados a dominios para pruebas. Esta opción experimental se eliminará en el futuro.</translation> +<translation id="2957506574938329824">No permitir que los sitios web soliciten acceso a los dispositivos Bluetooth a través de la API Bluetooth web</translation> <translation id="2957513448235202597">Tipo de cuenta para la autenticación <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Reglas de omisión de proxy</translation> <translation id="2960691910306063964">Habilitar o inhabilitar la autenticación sin PIN para host de acceso remoto</translation> @@ -609,6 +617,7 @@ El valor de la política se debe especificar en milisegundos. Los valores están establecidos para ser inferiores o iguales al retraso de desconexión de pantalla (si está establecido) y al retraso de inactividad.</translation> <translation id="2987155890997901449">Habilitar ARC</translation> +<translation id="2987227569419001736">Controlar el uso de la API Bluetooth web</translation> <translation id="2998881342848488968">Esta política permite a <ph name="PRODUCT_OS_NAME" /> omitir cualquier proxy para la autenticación de portal cautivo. Esta política solo tendrá validez si se ha configurado un proxy (por ejemplo, a través de una política o de las extensiones, o si lo ha configurado el usuario en chrome://settings). @@ -930,6 +939,7 @@ Esta política solo se respeta si se habilita la política "DefaultSearchProviderEnabled".</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 o posterior</translation> +<translation id="4322842393287974810">Permite que la aplicación de kiosco sin retardo con inicio automático controle la versión de <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Añadir un botón para cerrar sesión en la bandeja del sistema</translation> <translation id="4347908978527632940">Si la política está activada y se trata de un usuario supervisado, otras aplicaciones de Android pueden consultar las restricciones web del usuario a través de un proveedor de contenido. @@ -1602,6 +1612,9 @@ Si no se establece esta política, el teclado en pantalla se inhabilitará la primera vez que se muestre la pantalla de inicio de sesión. Los usuarios podrán habilitar o inhabilitar el teclado en pantalla en cualquier momento y su estado en la pantalla de inicio de sesión se mantendrá para todos los usuarios.</translation> <translation id="6598235178374410284">Imagen de avatar del usuario</translation> +<translation id="6628646143828354685">Permite establecer si los sitios web pueden acceder a los dispositivos Bluetooth cercanos. Se puede bloquear completamente el acceso o se puede establecer que se pida permiso al usuario cada vez que un sitio web quiera acceder a los dispositivos Bluetooth cercanos. + + Si no se establece esta política, se utilizará la política 3 y el usuario podrá cambiarla.</translation> <translation id="6636268606788232221">Modifica la configuración de la administración de energía cuando el usuario está inactivo. Esta política controla diferentes opciones de configuración de la estrategia de administración de energía cuando el usuario está inactivo. @@ -1694,6 +1707,7 @@ Si estableces esta política, los usuarios no podrán cambiarla ni anularla. Si no se establece esta política, las opciones de accesibilidad no aparecerán en el menú de la bandeja del sistema, pero el usuario podrá provocar que las opciones de accesibilidad aparezcan a través de la página de configuración.</translation> +<translation id="6766216162565713893">Permitir que los sitios web le pidan permiso al usuario para acceder a dispositivos Bluetooth cercanos</translation> <translation id="6770454900105963262">Informar sobre sesiones del kiosco activas</translation> <translation id="6774533686631353488">Permitir hosts de mensajes nativos en nivel de usuario (instalados sin permisos de administrador).</translation> <translation id="6786747875388722282">Extensiones</translation> @@ -1885,6 +1899,13 @@ Si no se establece esta política, el protocolo SPDY estará disponible.</translation> <translation id="7384999953864505698">Permitir protocolo QUIC</translation> +<translation id="7406651467768226499">Permitir que la aplicación de kiosco sin retardo con inicio automático controle la versión de <ph name="PRODUCT_OS_NAME" />. + + Esta política controla si se permitirá que la aplicación de kiosco sin retardo con inicio automático controle la versión de <ph name="PRODUCT_OS_NAME" /> incluyendo required_platform_version en su archivo de manifiesto y la utilice como el prefijo de la versión de destino de actualización automática. + + Si se asigna el valor true a esta política, el valor de la clave de manifiesto required_platform_version de la aplicación de kiosco sin retardo con inicio automático se utilizará como un prefijo de la versión de destino de actualización automática. + + Si esta política no se configura o se le asigna el valor false, la clave de manifiesto required_platform_version se ignorará y la actualización automática se realizará con normalidad.</translation> <translation id="7417972229667085380">Porcentaje que permite ajustar el retraso de inactividad en el modo de presentación (política obsoleta)</translation> <translation id="7421483919690710988">Establecer tamaño de caché de disco de medios en bytes</translation> <translation id="7424751532654212117">Lista de excepciones de la lista de complementos inhabilitados</translation>
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb index f3163941..e8995f5 100644 --- a/components/policy/resources/policy_templates_et.xtb +++ b/components/policy/resources/policy_templates_et.xtb
@@ -209,6 +209,13 @@ Reeglit järgitakse ainult siis, kui lubatud on reegel „DefaultSearchProviderEnabled”.</translation> <translation id="1859633270756049523">Piira seansi pikkust</translation> +<translation id="1859859319036806634">Hoiatus. TLS-i versiooni taandeversioon eemaldatakse teenusest <ph name="PRODUCT_NAME" /> pärast versiooni 52 (umbes 2016. aasta septembris), misjärel lakkab see reegel töötamast. + + Kui TLS-i käitlus ebaõnnestub, üritab teenus <ph name="PRODUCT_NAME" /> esmalt uuesti ühendust luua TLS-i vanema versiooniga, et vältida HTTPS-serverites esinevaid vigu. See seade määrab versiooni, mille juures taandeprotsess peatub. Seade ei kehti, kui versiooni läbirääkimine serveris õnnestub (st ühendus ei katke). Sellele vaatamata peab loodav ühendus vastama reeglile SSLVersionMin. + + Kui seda reeglit ei seadistata või see kasutab väärtust „tls1.2”, siis ei taanda teenus <ph name="PRODUCT_NAME" /> enam versiooni. Pange tähele, et see ei keela TLS-i vanemate versioonide tuge, vaid määrab, kas teenus <ph name="PRODUCT_NAME" /> väldib vigadega servereid, milles versioonide läbirääkimine ei õnnestu. + + Kui ühilduvus vigadega serveriga peab säilima, võib valida väärtuse „tls1.1”. See on ajutine abinõu ja server tuleb kiiresti parandada.</translation> <translation id="1861037019115362154">Määrab rakenduses <ph name="PRODUCT_NAME" /> keelatud pistikprogrammide loendi ja takistab kasutajatel selle seade muutmist. Metamärke „*” ja „?” saab kasutada määramata märgijadade vastendamiseks. Metamärk „*” vastendab suvalise arvu märke ja metamärk „?” määrab valikulise üksiku tähemärgi, st see vastab ühele või mitte ühelegi tähemärgile. Paomärk on „\”, seetõttu saate märkide „*”, „?” ja „\” vastendamiseks lisada nende ette paomärgi „\”. @@ -594,6 +601,7 @@ Määrab, kas TLS-i domeenisuunaline sertifikaatide laiendus peab olema lubatud. Selle seadega lubatakse testimiseks TLS-i domeenisuunaline sertifikaatide laiendus. See katseline seade eemaldatakse tulevikus.</translation> +<translation id="2957506574938329824">Ära luba ühelgi seadmel taotleda Web Bluetooth API kaudu juurdepääsu Bluetoothi seadmetele</translation> <translation id="2957513448235202597">Üksuse <ph name="HTTP_NEGOTIATE" /> autentimisel kasutatava konto tüüp</translation> <translation id="2959898425599642200">Puhverserveri möödumisreeglid</translation> <translation id="2960691910306063964">Kaugjuurdepääsu hostide PIN-koodita autentimise lubamine või keelamine</translation> @@ -607,6 +615,7 @@ Reegli väärtus tuleb määrata millisekundites. Väärtused tuleb kinnitada väiksematena kui ekraani väljalülitamise viiteaeg (kui see on määratud) ja jõudeoleku viiteaeg või nendega võrdsetena.</translation> <translation id="2987155890997901449">ARC lubamine</translation> +<translation id="2987227569419001736">Web Bluetooth API kasutuse kontrollimine</translation> <translation id="2998881342848488968">See reegel võimaldab teenusel <ph name="PRODUCT_OS_NAME" /> kontrollportaali autentimisel puhverserverit vältida. See reegel jõustatakse vaid siis, kui puhverserver on seadistatud (nt kasutaja on seda teinud reegli kaudu aadressil chrome://settings või on seda teinud laiendused). @@ -916,6 +925,7 @@ Reeglit järgitakse ainult siis, kui lubatud on reegel „DefaultSearchProviderEnabled”.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 või uuem</translation> +<translation id="4322842393287974810">Luba automaatselt käivitatud viivituseta kioskirakendusel juhtida operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> versiooni</translation> <translation id="4325690621216251241">Lisa väljalogimisnupp süsteemisalve</translation> <translation id="4347908978527632940">Kui see on tõene ja kasutaja on jälgitav kasutaja, siis saavad teised Androidi rakendused sisupakkuja kaudu esitada päringuid kasutaja veebipiirangute kohta. @@ -1590,6 +1600,9 @@ Kui jätate reegli määramata, keelatakse ekraanil kuvatav klaviatuur sisselogimiskuva esmakordsel ilmumisel. Kasutajad saavad ekraanil kuvatava klaviatuuri igal ajal lubada või keelata ja selle olek sisselogimiskuval on kõikide kasutajate jaoks jääv.</translation> <translation id="6598235178374410284">Kasutaja avatarkujutis</translation> +<translation id="6628646143828354685">Võimaldab määrata, kas veebisaitidel on lubatud juurde pääseda läheduses asuvatele Bluetoothi seadmetele. Juurdepääsu saab täielikult blokeerida või kasutajalt võidakse iga kord küsida, kui veebisait soovib läheduses asuvatele Bluetoothi seadmetele juurde pääseda. + + Kui seda reeglit ei määrata, kasutatakse väärtust „3” ja kasutaja saab seda muuta.</translation> <translation id="6636268606788232221">Seadistage toitehalduse seaded kasutaja tegevusetuse korral. See reegel juhib mitut seadet, mis reguleerivad toitehalduse strateegiat kasutaja tegevusetuse ajal. @@ -1682,6 +1695,7 @@ Kui määrate reegli, ei saa kasutajad seda muuta ega alistada. Kui jätate reegli määramata, ei kuvata süsteemisalve menüüs hõlbustusvalikuid, kuid kasutaja võib lehel Seaded lubada hõlbustussuvandite kuvamise.</translation> +<translation id="6766216162565713893">Luba saitidel paluda kasutajatelt juurdepääsu läheduses asuvatele Bloetoothi seadmetele</translation> <translation id="6770454900105963262">Aruandeteave aktiivsete kioskiseansside kohta</translation> <translation id="6774533686631353488">Kasutaja tasemel omasõnumside hostide (installitud administraatori loata) lubamine.</translation> <translation id="6786747875388722282">Laiendused</translation> @@ -1874,6 +1888,13 @@ <translation id="7340034977315324840">Saada teavet seadme aktiivsuse aja kohta</translation> <translation id="7381326101471547614">Keelab SPDY-protokolli kasutamise rakenduses <ph name="PRODUCT_NAME" />. Kui reegel on lubatud, siis ei ole SPDY-protokoll rakenduses <ph name="PRODUCT_NAME" /> saadaval. Reegli keelamisel on SPDY kasutamine lubatud. Kui jätate reegli määramata, siis on SPDY saadaval.</translation> <translation id="7384999953864505698">Lubab QUIC-protokolli</translation> +<translation id="7406651467768226499">Kas lubada automaatselt käivitatud viivituseta kioskirakendusel juhtida operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> versiooni. + + See reegel juhib seda, kas lubada automaatselt käivitatud viivituseta kioskirakendusel juhtida operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> versiooni, määrates manifesti võtme required_platform_version ja kasutades seda automaatvärskenduse sihtversiooni eesliitena. + + Kui reegel on määratud väärtusele Tõene, siis kasutatakse automaatselt käivitatud viivituseta kioskirakenduse manifesti võtme required_platform_version väärtust automaatvärskenduse sihtversiooni eesliitena. + + Kui reeglit pole seadistatud või see on määratud väärtusele Väär, eiratakse manifesti võtit required_platform_version ja automaatvärskendus toimub tavapäraselt.</translation> <translation id="7417972229667085380">Esitlusrežiimis tegevusetu oleku viivituse skaleerimise määr protsentides (tugi on katkestatud)</translation> <translation id="7421483919690710988">Määrake meediumiketta vahemälu suurus baitides</translation> <translation id="7424751532654212117">Keelatud pistikprogrammide loendi erandite loend</translation>
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index 9bcdd42..6aec9f8 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -191,6 +191,13 @@ این قانون اختیاری است. اگر تنظیم نشود، درخواست جستجوی پیشنهادی با استفاده از روش GET ارسال خواهد شد. این قانون فقط در صورتی رعایت میشود که قانون «DefaultSearchProviderEnabled» فعال شده باشد.</translation> <translation id="1859633270756049523">محدودکردن مدت جلسه</translation> +<translation id="1859859319036806634">اخطار: نسخه جایگزین TLS (امنیت لایه انتقال) پس از نسخه ۵۲ (حدود سپتامبر ۲۰۱۶) از <ph name="PRODUCT_NAME" /> برداشته میشود و این خطمشی دیگر کار نخواهد کرد. + + اگر ایجاد ارتباط با TLS ناموفق باشد، <ph name="PRODUCT_NAME" /> تلاش میکند اتصال را با نسخه پایینتری از TLS دوباره برقرار کند تا روی اشکالات در سرورهای HTTPS کار کند. این تنظیم نسخهای را پیکربندی میکند که این روند جایگزین در آن متوقف میشود. اگر سروری بهدرستی انتقال نسخه را انجام دهد (یعنی بدون قطع اتصال)، این گزینه اعمال نمیشود. بدون در نظر گرفتن این موضوع، اتصال حاصله همچنان باید با SSLVersionMin سازگار باشد. + + اگر این خطمشی پیکربندی نشود یا اگر روی «tls1.2» تنظیم شود، <ph name="PRODUCT_NAME" /> دیگر این روند جایگزینی را انجام نمیدهد. توجه داشته باشید تنها در صورتی که <ph name="PRODUCT_NAME" /> روی سرورهای دارای اشکال کار کند که نمیتوانند نسخهها را بهدرستی منتقل کنند، این کار پشتیبانی برای نسخههای TLS قدیمی را غیرفعال نمیکند. + + اما اگر سازگاری با یک سرور دارای اشکال باید حفظ شود، میتوان این خطمشی را روی «tls1.1» تنظیم کرد. این یک چاره موقت است و اشکال سرور باید سریعاً برطرف شود.</translation> <translation id="1861037019115362154">فهرستی از افزایههایی را مشخص میکند که در <ph name="PRODUCT_NAME" /> غیرفعال شدهاند و نمیگذارند کاربران این تنظیم را تغییر دهند. نویسههای عام '*' و '?' را میتوان برای تطبیق زنجیره نویسههای اختیاری استفاده کرد. '*' با تعداد نویسههای اختیاری مطابق است در حالیکه '?' یک نویسه اختیاری را مشخص میکند یعنی برابر با نویسههای صفر یا یک است. نویسه گریز '\' است بنابراین برای تطابق با نویسههای واقعی '*' ،'?' ، و '\' میتوانید شما '\' را جلوی آنها قرار دهید. @@ -526,6 +533,7 @@ تعیین میکند آیا برنامه افزودنی مجوزهای مربوط به دامنه TLS باید فعال شوند. از این تنظیم برای فعالسازی برنامه افزودنی مجوزهای مربوط به دامنه TLS به منظور آزمایش استفاده میکند. این تنظیم آزمایشی در آینده حذف میشود.</translation> +<translation id="2957506574938329824">به هیچ وبسایتی برای درخواست دسترسی به دستگاههای بلوتوث از طریق Web Bluetooth API اجازه داده نشود</translation> <translation id="2957513448235202597">نوع حساب برای احراز هویت <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">قوانین نادیده گرفتن پروکسی</translation> <translation id="2960691910306063964">فعال یا غیرفعال کردن احراز هویت بدون پین برای میزبان دسترسی راه دور</translation> @@ -539,6 +547,7 @@ مقدار خطمشی باید بر حسب میلی ثانیه باشد. مقادیر باید کمتر یا برابر با تأخیر خاموشی صفحه (در صورت تنظیم) و تأخیر بیحرکتی باشد.</translation> <translation id="2987155890997901449">فعال کردن ARC</translation> +<translation id="2987227569419001736">کنترل استفاده از Web Bluetooth API</translation> <translation id="2998881342848488968">این خط مشی به <ph name="PRODUCT_OS_NAME" /> اجازه میدهد تا پروکسی را برای احراز هویت درگاه محدود نادیده بگیرد. این خط مشی فقط در صورتی اعمال میشود که پروکسی پیکربندی شده باشد (مثلاً از طریق خط مشی، توسط کاربر در تنظیمات Chrome یا توسط افزونهها). @@ -1079,7 +1088,7 @@ درصورتیکه این تنظیم غیرفعال باشد یا تنظیم نشده باشد، کاربران راه دور و محلی میتوانند با میزبان هنگامی که به اشتراک گذاشته میشود ارتباط برقرار کنند.</translation> <translation id="5423001109873148185">این قانون، اگر فعال باشد، موتورهای جستجو را وادار میکند که از مرورگر کنونی پیشفرض وارد شوند. در صورت فعال بودن، این قانون بر روی پیام وارد کردن نیز تأثیر میگذارد. اگر غیرفعال باشد، موتور جستجوی پیشفرض وارد نمیشود. اگر تنظیم نشده باشد، ممکن است از کاربر در مورد وارد کردن پرسیده شود یا بهطور خودکار وارد کردن انجام شود.</translation> -<translation id="5423197884968724595">نام محدودیت Android WebView:</translation> +<translation id="5423197884968724595">نام محدودیت وبنمای Android:</translation> <translation id="5447306928176905178">فعال کردن گزارشدهی اطلاعات حافظه (اندازه هیپ جاوااسکریپت) به صفحه (منسوخ شده)</translation> <translation id="5457065417344056871">فعال کردن حالت مهمان در مرورگر</translation> <translation id="5457924070961220141">به شما امکان میدهد تا در صورت نصب بودن <ph name="PRODUCT_FRAME_NAME" />، اجراکننده پیشفرض HTML را پیکربندی کنید. اگر این قانون تنظیم نشده باقی بماند، مقدار پیشفرض که به معنی اجازه دادن به مرورگر میزبان برای اجرا است، استفاده میشود، اما شما میتوانید به صورت اختیاری این را لغو کنید و بهطور پیشفرض <ph name="PRODUCT_FRAME_NAME" /> را اجراکننده صفحات HTML کنید.</translation> @@ -1402,6 +1411,9 @@ اگر این خطمشی تنظیم نشده باقی بماند، وقتی صفحه ورود به سیستم ابتدا نشان داده میشود، صفحهکلید روی صفحه غیرفعال میشود. کاربران میتوانند هر وقت خواستند صفحهکلید روی صفحه را فعال یا غیرفعال کنند و این وضعیت در صفحه ورود به سیستم بین کاربران ثابت است.</translation> <translation id="6598235178374410284">تصویر چهرهنمای کاربر</translation> +<translation id="6628646143828354685">به شما امکان میدهد تعیین کنید وبسایتها برای دسترسی به دستگاههای بلوتوث اطراف مجاز هستند یا نه. میتوان دسترسی را کاملاً مسدود کرد یا تنظیمات را بهگونهای انجام داد که هر بار وبسایتی میخواهد به دستگاههای بلوتوث اطراف دسترسی پیدا کند از کاربر درخواست کند. + + اگر این خطمشی تنظیمنشده رها شود، از «۳» استفاده میشود و کاربر میتواند آن را تغییر دهد.</translation> <translation id="6636268606788232221">پیکربندی تنظیمات مدیریت نیرو هنگامی که کاربر فعالیتی ندارد. این خطمشی چندین تنظیم را برای راهبرد مدیریت نیرو هنگام بدون فعالیت بودن کاربر کنترل میکند. @@ -1477,6 +1489,7 @@ اگر این خطمشی را تنظیم کنید، کاربران نمیتوانند آن را تغییر دهند یا آن را لغو کنند. اگر این خطمشی تنظیم نشود، گزینههای دسترسپذیری در منوی سینی سیستم نمایش داده نمیشود اما کاربر میتواند کاری کند که گزینههای دسترسپذیری از طریق صفحه تنظیمات نمایش داده شود.</translation> +<translation id="6766216162565713893">سایتها مجاز هستند از کاربر بخواهند به دستگاه بلوتوث اطراف اجازه دسترسی بدهد</translation> <translation id="6770454900105963262">گزارش دادن اطلاعات کیوسک فعال</translation> <translation id="6774533686631353488">میزبانهای پیامرسانی محلی سطح کاربر (نصب شده بدون مجوزهای سرپرست) مجاز است.</translation> <translation id="6786747875388722282">افزونهها</translation>
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb index 8836266..487c2e11 100644 --- a/components/policy/resources/policy_templates_fi.xtb +++ b/components/policy/resources/policy_templates_fi.xtb
@@ -188,6 +188,13 @@ Käytäntö on voimassa vain, jos käytäntö DefaultSearchProviderEnabled on käytössä.</translation> <translation id="1859633270756049523">Rajoita käyttökerran pituutta</translation> +<translation id="1859859319036806634">Varoitus: <ph name="PRODUCT_NAME" /> ei enää versiosta 52 alkaen tue TLS:n aiempien versioiden käyttöä varatoimenpiteenä. Version arvioitu julkaisupäivä on syyskuussa 2016, ja muutoksen jälkeen tämä käytäntö ei enää toimi. + + TLS-kättelyn epäonnistuessa <ph name="PRODUCT_NAME" /> yritti aiemmin kiertää HTTPS-palvelimien virheet muodostamalla yhteyden uudelleen aiempaa TLS-versiota käyttämällä. Tämä asetus määrittää version, jota vanhempia versioita ei kokeilla. Jos palvelin suorittaa versioneuvottelun oikein (eli se ei katkaise yhteyttä), tätä asetusta ei käytetä. Muodostetun yhteyden täytyy joka tapauksessa noudattaa käytäntöä SSLVersionMin. + + Jos tätä käytäntöä ei ole määritetty tai sen arvo on tls1.2, <ph name="PRODUCT_NAME" /> ei enää suorita tätä varatoimenpidettä. Huomaa, että tämä ei poista käytöstä vanhempien TLS-versioiden tukea, vaan se määrittää vain, voiko <ph name="PRODUCT_NAME" /> kiertää palvelimien virheitä silloin, kun versioneuvottelua ei suoriteta oikein. + + Jos yhteensopivuus virheitä sisältävän palvelimen kanssa täytyy säilyttää, tämän käytännön arvoksi voidaan määrittää tls1.1. Tämä on kuitenkin tilapäinen toimenpide, ja palvelin tulee korjata mahdollisimman pian.</translation> <translation id="1861037019115362154">Määrittää laajennukset, jotka eivät ole käytössä tuotteessa <ph name="PRODUCT_NAME" />, ja estää käyttäjiä muuttamasta tätä asetusta. Jokerimerkkejä * ja ? voidaan käyttää vastaamaan satunnaisten merkkien jaksoja. * vastaa satunnaista merkkien lukumäärää ja ? määrittää yhden valinnaisen merkin, eli se vastaa nollaa tai yhtä merkkiä. Vaihtomerkki on \. Jos haluat käyttää merkkejä *, ? tai \ muussa kuin jokerimerkki- tai vaihtomerkityksessä, niiden eteen täytyy lisätä merkki \. @@ -529,6 +536,7 @@ Määrittää, tuleeko TLS domain-bound -varmennelaajennuksien olla käytössä. Tämän asetuksen avulla voidaan ottaa TLS domain-bound -varmennelaajennus testikäyttöön. Asetus on kokeellinen ja se poistetaan myöhemmin.</translation> +<translation id="2957506574938329824">Älä salli sivustojen pyytää Bluetooth-laitteiden käyttöoikeutta Web Bluetooth ‑sovellusliittymän kautta</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> -todennuksen tilityyppi</translation> <translation id="2959898425599642200">Välityspalvelimen ohitussäännöt</translation> <translation id="2960691910306063964">Ota käyttöön tai poista käytöstä etäkäytön isäntien PIN-kooditon todennus</translation> @@ -542,6 +550,7 @@ Tämän käytännön arvo täytyy määrittää millisekunteina. Arvo rajoitetaan korkeintaan mahdollisen ruudun sammutuksen viiveen ja käyttämättömyysajan suuruiseksi.</translation> <translation id="2987155890997901449">Ota ARC käyttöön.</translation> +<translation id="2987227569419001736">Hallinnoi Web Bluetooth ‑sovellusliittymän käyttöä</translation> <translation id="2998881342848488968">Tämä käytäntö määrittää, että <ph name="PRODUCT_OS_NAME" /> voi ohittaa välityspalvelimet captive portal -todennuksessa. Tämä käytäntö on voimassa vain, jos esimerkiksi käytäntö, käyttäjä tai laajennus on määrittänyt välityspalvelinasetukset. @@ -1418,6 +1427,9 @@ Jos tätä käytäntöä ei määritetä, ruutunäppäimistö ei tule näkyviin kirjautumisruudussa. Käyttäjät voivat ottaa ruutunäppäimistön käyttöön tai poistaa sen käytöstä milloin tahansa, ja käyttäjän tekemä ruutunäppäimistön tilan muutos säilyy kaikilla käyttäjillä, kunnes sitä muutetaan.</translation> <translation id="6598235178374410284">Käyttäjän avatar-kuva</translation> +<translation id="6628646143828354685">Määritä, sallitaanko sivustojen käyttää lähistöllä olevia Bluetooth-laitteita. Käyttö on mahdollista estää kokonaan, tai käyttäjältä voidaan pyytää vahvistusta aina, kun verkkosivusto haluaa käyttää lähistöllä olevaa Bluetooth-laitetta. + + Jos tätä käytäntöä ei ole määritetty, sen arvoksi asetetaan 3 ja käyttäjä voi halutessaan muokata sitä.</translation> <translation id="6636268606788232221">Määritä virransäästöasetukset, kun käyttäjä on toimettomana. Tämä käytäntö ohjaa useita virransäästöstrategian asetuksia, kun käyttäjä on toimettomana. @@ -1493,6 +1505,7 @@ Jos määrität tämän käytännön, käyttäjät eivät voi muuttaa tai ohittaa sitä. Jos tätä käytäntöä ei määritetä, esteettömyysasetuksia ei näytetä ilmaisinalueen valikossa mutta käyttäjä voi ottaa esteettömyysasetukset näkyviin Asetukset-sivulta.</translation> +<translation id="6766216162565713893">Salli sivustojen pyytää käyttäjältä lupaa lähistöllä olevien Bluetooth-laitteiden käyttämiseen</translation> <translation id="6770454900105963262">Aktiivisten kioskikäyttökertojen tietojen raportointi</translation> <translation id="6774533686631353488">Salli laitteen oman viestijärjestelmän käyttäjätason isännät (asennettu ilman järjestelmänvalvojan oikeuksia).</translation> <translation id="6786747875388722282">Laajennukset</translation>
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index ec3c7ec..18a6f1b 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -209,6 +209,13 @@ Iginagalang lang ang patakarang ito kung naka-enable ang patakarang 'DefaultSearchProviderEnabled.'</translation> <translation id="1859633270756049523">Limitahan ang haba ng session</translation> +<translation id="1859859319036806634">Babala: Aalisin na ang fallback na bersyon ng TLS mula sa <ph name="PRODUCT_NAME" /> pagkatapos ng bersyon 52 (bandang Setyembre 2016) at hindi na gagana ang patakarang ito pagkatapos noon. + + Kapag hindi nakumpleto ang isang TLS handshake, susubukang muli ng <ph name="PRODUCT_NAME" /> ang koneksyon gamit ang mas mababang bersyon ng TLS upang makahanap ng paraan sa mga bug sa mga HTTPS server. Kino-configure ng setting na ito ang bersyon kung saan hihinto ang fallback na prosesong ito. Kung maisasagawa nang tama ng isang server ang paghahanap ng kompromiso sa bersyon (ibig sabihin, nang hindi nawawala ang koneksyon), hindi malalapat ang setting na ito. Anuman ang mangyari, dapat pa ring sumusunod sa SSLVersionMin ang magreresultang koneksyon. + + Kung hindi naka-configure ang patakarang ito o kung ito ay nakatakda sa "tls1.2," hindi na isasagawa ng <ph name="PRODUCT_NAME" /> ang fallback na ito. Tandaang hindi nito dini-disable ang suporta para sa mga mas lumang bersyon ng TLS, kung gagana lang ang <ph name="PRODUCT_NAME" /> sa mga server na may maraming bug na hindi makakahanap ng kompromiso sa mga bersyon nang tama. + + Kung hindi, kung kailangang panatilihin ang compatibility sa isang server na maraming bug, maaaring itakda ang patakarang ito sa "tls1.1". Isa itong pansamantalang solusyon at dapat na maayos kaagad ang server.</translation> <translation id="1861037019115362154">Tumutukoy ng listahan ng mga plugin na hindi pinapagana sa <ph name="PRODUCT_NAME" /> at pinipigilan ang mga user na baguhin ang setting na ito. Maaaring gamitin ang mga wildcard na character na '*' at '?' upang itugma ang mga pagkakasunud-sunod ng mga arbitrary na character. Itinutugma ng '*' ang isang arbitrary na dami ng character habang tinutukoy ng '?' ang isang opsyonal na isahang character, hal. itinutugma ang zero o isang character. Ang escape character ay '\', kaya upang tumugma sa aktwal na '*', '?', o '\' na mga character, makakapaglagay ka ng '\' sa unahan ng mga ito. @@ -595,6 +602,7 @@ Tinutukoy kung dapat i-enable ang mga extension ng TLS domain-bound na certificate. Ginagamit ang setting na ito upang i-enable ang extension ng mga TLS domain-bound na certificate para sa pagsusubok. Aalisin ang pang-eksperimentong setting na ito sa hinaharap.</translation> +<translation id="2957506574938329824">Huwag payagan ang anumang site na humiling ng access sa mga Bluetooth device sa pamamagitan ng Web Bluetooth API</translation> <translation id="2957513448235202597">Uri ng account para sa pagpapatotoo ng <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Mga panuntunan sa pag-bypass ng proxy</translation> <translation id="2960691910306063964">I-enable o i-disable ang pagpapatotoo na hindi gumagamit ng PIN para sa mga host ng malayuang access</translation> @@ -608,6 +616,7 @@ Dapat tukuyin ang halaga ng patakaran ayon sa millisecond. Kinakailangang mas mababa kaysa sa o katumbas ng delay ng pag-off ng screen (kung nakatakda) at idle delay ang mga halaga.</translation> <translation id="2987155890997901449">I-enable ang ARC</translation> +<translation id="2987227569419001736">Kontrolin ang paggamit ng Web Bluetooth API</translation> <translation id="2998881342848488968">Binibigyang-daan ng patakarang ito ang <ph name="PRODUCT_OS_NAME" /> na i-bypass ang anumang proxy para sa pagpapatotoo ng captive portal. Magkakaroon lang ng epekto ang patakaran na ito kung naka-configure ang isang proxy (halimbawa, sa pamamagitan ng patakaran, sa pamamagitan ng user sa chrome://settings, o sa pamamagitan ng mga extension). @@ -925,6 +934,7 @@ Iginagalang lang ang patakarang ito kung naka-enable ang patakarang 'DefaultSearchProviderEnabled.'</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 o mas bago</translation> +<translation id="4322842393287974810">Payagan ang awtomatikong inilunsad na walang pagkaantalang kiosk app na kontrolin ang bersyon ng <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Magdagdag ng button sa pag-logout sa tray ng system</translation> <translation id="4347908978527632940">Kung true at ang user ay isang pinangangasiwaang user, maaaring i-query ng iba pang mga Android app ang mga paghihigpit ng user sa web sa pamamagitan ng isang content provider. @@ -1600,6 +1610,9 @@ Kung iniwang hindi nakatakda ang patakarang ito, naka-disable ang on-screen na keyboard kapag unang ipinakita ang screen sa pag-log in. Maaaring i-enable o i-disable ng mga user ang on-screen na keyboard anumang oras at magpapatuloy ang status nito sa screen sa pag-log in sa pagitan ng mga user.</translation> <translation id="6598235178374410284">Larawan ng avatar ng user</translation> +<translation id="6628646143828354685">Binibigyang-daan kang magtakda kung pinapayagan ang mga website na kumuha ng access sa malalapit na Bluetooth device. Maaaring ganap na i-block ang access, o maaaring tanungin ang user sa tuwing gusto ng website na kumuha ng access sa malalapit na Bluetooth device. + + Kung hinayaang hindi nakatakda ang patakarang ito, gagamitin ang '3,' at magagawa ng user na baguhin ito.</translation> <translation id="6636268606788232221">I-configure ang mga setting ng pamamahala ng power kapag naging idle ang user. Maraming kinokontrol ang patakarang ito na mga setting ng diskarte sa pamamahala ng power kapag naging idle ang user. @@ -1692,6 +1705,7 @@ Kung itinakda mo ang patakarang ito, hindi ito mababago o ma-o-override ng mga user. Kung iniwang hindi nakatakda ang patakarang ito, hindi lalabas ang mga opsyon sa Pagiging naa-access sa menu ng system tray, ngunit maaaring idulot ng user ang paglabas ng mga opsyon sa Pagiging naa-access sa pamamagitan ng pahina ng Mga Setting.</translation> +<translation id="6766216162565713893">Payagan ang mga site na hilingin sa user na magbigay ng access sa malapit na Bluetooth device</translation> <translation id="6770454900105963262">Mag-ulat ng impormasyon tungkol sa mga aktibong session ng kiosk</translation> <translation id="6774533686631353488">Bigyang-daan ang mga host ng Native na Pagmemensahe sa antas ng user (na-install nang walang mga pahintulot ng admin).</translation> <translation id="6786747875388722282">Mga Extension</translation> @@ -1883,6 +1897,13 @@ <translation id="7340034977315324840">Iulat ang mga panahon ng aktibidad ng device</translation> <translation id="7381326101471547614">Hindi pinapagana ang paggamit ng SPDY protocol sa <ph name="PRODUCT_NAME" />. Kung pinagana ang patakarang ito, ang SPDY protocol ay hindi magiging available sa <ph name="PRODUCT_NAME" />. Ang pagtatakda ng patakarang ito sa hindi pinagana ay papayagan ang paggamit ng SPDY. Kung iwanang hindi nakatakda ang SPDY na ito, magiging available ang Spf.</translation> <translation id="7384999953864505698">Pinapayagan ang QUIC protocol</translation> +<translation id="7406651467768226499">Kung papayagan ba ang awtomatikong inilunsad na walang pagkaantalang kiosk app na kontrolin ang bersyon ng <ph name="PRODUCT_OS_NAME" />. + + Kinokontrol ng patakarang ito kung papayagan ang awtomatikong inilunsad na walang pagkaantalang kiosk app na kontrolin ang bersyon ng <ph name="PRODUCT_OS_NAME" /> sa pamamagitan ng pagpapahayag ng required_platform_version sa manifest nito at gamitin ito bilang ang prefix ng bersyon ng target ng awtomatikong pag-update. + + Kung itatakda sa true ang patakaran, ang value ng required_platform_version manifest key ng awtomatikong inilunsad na walang pagkaantalang kiosk app ay gagamitin bilang prefix ng bersyon ng target ng awtomatikong pag-update. + + Kung hindi naka-configure o nakatakda sa false ang patakaran, babalewalain ang required_platform_version manifest key at magpapatuloy ayon sa nakasanayan ang awtomatikong pag-update.</translation> <translation id="7417972229667085380">Porsyento ng pag-scale ng idle delay kapag nasa presentation mode (hindi na ginagamit)</translation> <translation id="7421483919690710988">Itakda ang laki ng cache ng disk ng media sa bytes</translation> <translation id="7424751532654212117">Listahan ng mga pagbubukod sa listahan ng hindi pinaganang mga plugin</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 9529f6d..09b0a57 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -210,6 +210,13 @@ Cette règle n'est respectée que si la règle "DefaultSearchProviderEnabled" est activée.</translation> <translation id="1859633270756049523">Limiter la durée de la session</translation> +<translation id="1859859319036806634">Avertissement : Le traitement de secours de la version TLS sera supprimé de <ph name="PRODUCT_NAME" /> après la version 52 (vers le mois de septembre 2016), et cette règle ne sera alors plus applicable. + + En cas d'échec d'un handshake TLS, <ph name="PRODUCT_NAME" /> tente de se connecter à nouveau avec une version inférieure de TLS afin de contourner les bugs des serveurs HTTPS. Ce paramètre permet de configurer la version à partir de laquelle le processus de traitement de secours s'arrêtera. Si un serveur effectue correctement une négociation de version (c'est-à-dire sans interrompre la connexion), alors ce paramètre ne s'applique pas. Dans tous les cas, la connexion qui en résulte doit être conforme à SSLVersionMin. + + Si cette règle n'est pas configurée ou si elle est définie sur "tls1.2", <ph name="PRODUCT_NAME" /> n'effectue plus ce traitement de secours. Notez que cela ne désactive pas la compatibilité avec les versions TLS antérieures, mais n'affecte que la façon dont <ph name="PRODUCT_NAME" /> contournera les serveurs qui comportent des bugs et qui sont incapables de procéder correctement à la négociation de version. + + Sinon, si la compatibilité avec un serveur comportant des bugs doit être maintenue, cette règle peut être définie sur "tls1.1". Il s'agit là d'une solution provisoire qui exige parallèlement de dépanner le serveur rapidement.</translation> <translation id="1861037019115362154">Spécifie une liste de plug-ins désactivés dans <ph name="PRODUCT_NAME" /> et empêche les utilisateurs de modifier ce paramètre. Les caractères génériques "*" et "?" peuvent être utilisés pour représenter des séquences de caractères arbitraires. "*" représente un nombre arbitraire de caractères tandis que "?" représente un caractère unique facultatif. Ce dernier correspond soit à un seul caractère, soit à aucun caractère. Pour représenter les caractères "*", "?" ou "\" eux-mêmes, le caractère d'échappement "\" doit être placé devant eux. @@ -599,6 +606,7 @@ Elle indique si l'extension des certificats TLS liés au domaine doit être activée. Ce paramètre permet d'activer ces certificats à des fins de test. Ce paramètre expérimental sera supprimé à l'avenir.</translation> +<translation id="2957506574938329824">Interdire à tous les sites de demander l'accès à des appareils Bluetooth via l'API Web Bluetooth</translation> <translation id="2957513448235202597">Type de compte pour l'authentification <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Règles de contournement de proxy</translation> <translation id="2960691910306063964">Activer ou désactiver l'authentification sans code d'accès pour les hôtes d'accès à distance</translation> @@ -612,6 +620,7 @@ La valeur de cette règle doit être indiquée en millisecondes. Les valeurs doivent être inférieures ou égales au délai d'arrêt de l'écran (le cas échéant) et au délai d'inactivité.</translation> <translation id="2987155890997901449">Activer ARC</translation> +<translation id="2987227569419001736">Contrôler l'utilisation de l'API Web Bluetooth</translation> <translation id="2998881342848488968">Cette règle permet à <ph name="PRODUCT_OS_NAME" /> de contourner les proxy pour l'authentification du portail captif. Cette règle n'est active que si un proxy est configuré (par exemple par une règle définie par l'utilisateur dans chrome://settings ou par des extensions). @@ -936,6 +945,7 @@ Cette règle n'est respectée que si la règle "DefaultSearchProviderEnabled" est activée.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 ou version ultérieure</translation> +<translation id="4322842393287974810">Autoriser l'application kiosque lancée automatiquement sans délai à contrôler la version de l'application <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Ajouter un bouton de déconnexion dans la barre d'état système</translation> <translation id="4347908978527632940">Si la valeur est définie sur "True" et si l'utilisateur est supervisé, d'autres applications Android peuvent envoyer une requête concernant les restrictions Web de ce dernier via un fournisseur de contenu. @@ -1615,6 +1625,9 @@ Si vous ne définissez pas cette règle, le clavier à l'écran est désactivé la première fois que l'écran de connexion s'affiche. Les utilisateurs peuvent activer ou désactiver à tout moment le clavier à l'écran, et son état est permanent d'un utilisateur à l'autre sur le même écran de connexion.</translation> <translation id="6598235178374410284">Avatar de l'utilisateur</translation> +<translation id="6628646143828354685">Permet d'indiquer si les sites Web sont autorisés à accéder aux appareils Bluetooth à proximité. Soit l'accès est complètement bloqué, soit l'utilisateur reçoit un message chaque fois qu'un site Web souhaite accéder aux appareils Bluetooth à proximité. + + Si cette règle n'est pas configurée, la valeur "3" est utilisée et peut être modifiée par l'utilisateur.</translation> <translation id="6636268606788232221">Configurer les paramètres de gestion de l'alimentation lorsque l'utilisateur est inactif Cette règle contrôle plusieurs paramètres pour la stratégie de gestion de l'alimentation lorsque l'utilisateur est inactif. @@ -1707,6 +1720,7 @@ Si vous définissez cette règle, les utilisateurs ne peuvent ni la modifier, ni l'ignorer. Si vous ne définissez pas cette règle, les options d'accessibilité ne s'affichent pas dans le menu système, mais l'utilisateur peut en activer l'affichage via la page "Paramètres".</translation> +<translation id="6766216162565713893">Autoriser les sites à demander à l'utilisateur d'accorder l'accès à un appareil Bluetooth à proximité</translation> <translation id="6770454900105963262">Envoyer des rapports sur les sessions Kiosque actives</translation> <translation id="6774533686631353488">Autoriser les hôtes de messagerie native au niveau de l'utilisateur (installés sans autorisations de propriétaire).</translation> <translation id="6786747875388722282">Extensions</translation> @@ -1897,6 +1911,13 @@ <translation id="7340034977315324840">Indiquer les périodes d'activité de l'appareil</translation> <translation id="7381326101471547614">Désactiver l'utilisation du protocole SPDY dans <ph name="PRODUCT_NAME" />. Si cette règle est activée, le protocole SPDY ne sera pas disponible dans <ph name="PRODUCT_NAME" />. La désactivation de cette règle permet l'utilisation du protocole SPDY. En outre, si cette règle n'est pas définie, le protocole SPDY sera disponible.</translation> <translation id="7384999953864505698">Permet d'utiliser le protocole QUIC</translation> +<translation id="7406651467768226499">Autoriser ou non l'application kiosque lancée automatiquement sans délai à contrôler la version de l'application <ph name="PRODUCT_OS_NAME" />. + + Cette règle détermine si l'application kiosque lancée automatiquement sans délai est autorisée à contrôler la version de l'application <ph name="PRODUCT_OS_NAME" /> en déclarant un élément "required_platform_version" dans son fichier manifeste et en l'utilisant en tant que préfixe de version cible de la mise à jour automatique. + + Si la règle est définie sur "true", la valeur de la clé du fichier manifeste "required_platform_version" de l'application kiosque lancée automatiquement sans délai est utilisée en tant que préfixe de version cible de la mise à jour automatique. + + Si la règle n'est pas configurée, ou si elle est définie sur "false", la clé du fichier manifeste "required_platform_version" est ignorée et la mise à jour automatique a lieu de manière normale.</translation> <translation id="7417972229667085380">Pourcentage d'adaptation du délai d'inactivité en mode Présentation (abandonné)</translation> <translation id="7421483919690710988">Définir la taille du cache du disque de support en octets</translation> <translation id="7424751532654212117">Liste des exceptions à la liste des plug-ins désactivés</translation>
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb index a508abb..8d541b0 100644 --- a/components/policy/resources/policy_templates_gu.xtb +++ b/components/policy/resources/policy_templates_gu.xtb
@@ -209,6 +209,13 @@ આ નીતિનું ફક્ત ત્યારે જ પાલન થાય છે જો 'DefaultSearchProviderEnabled' નીતિ સક્ષમ હોય.</translation> <translation id="1859633270756049523">સત્ર લંબાઈને સીમિત કરો</translation> +<translation id="1859859319036806634">ચેતવણી: સંસ્કરણ 52 પછી (લગભગ સપ્ટેમ્બર 2016) <ph name="PRODUCT_NAME" /> માંથી TLS સંસ્કરણ ફોલબેક દૂર કરવામાં આવશે અને ત્યારપછી આ નીતિ પછી કામ કરવાનું બંધ કરશે. + + જ્યારે TLS હેન્ડશેક નિષ્ફળ જાય, ત્યારે HTTPS સર્વર્સમાં બગ્સ પર કામ કરવા માટે TLS નાં પહેલાંના સંસ્કરણ વડે કનેક્શન માટે <ph name="PRODUCT_NAME" /> પહેલાંથી ફરી પ્રયાસ કરશે. આ સેટિંગ એવું સંસ્કરણ ગોઠવે છે જેના પર આ ફોલબેક પ્રક્રિયા બંધ થશે. જો સર્વર યોગ્ય રીતે સંસ્કરણ નિગોશિએશન કરે (એટલે કે કનેક્શનને અવરોધ્યાં વગર) તો આ સેટિંગ લાગુ પડતી નથી. તેમછતાં, પરિણામી કનેક્શન માટે એ આવશ્યક છે કે તે SSLVersionMin નું પાલન કરતું હોય. + + જો આ નીતિ ગોઠવવામાં ન આવી હોય અથવા તે "tls1.2" પર સેટ થયેલી હોય તો <ph name="PRODUCT_NAME" /> હવે આ ફોલબેકનો અમલ કરશે નહીં. નોંધો કે આ જૂના TLS સંસ્કરણો માટેના સમર્થનને અક્ષમ કરતું નથી, પછી ભલે સંસ્કરણોને યોગ્ય રીતે નિગોશિએટ ન કરી શકતા, બગવાળા સર્વર્સને ઠીક કરવા માટે <ph name="PRODUCT_NAME" /> કામ કરે કે ન કરે. + + અન્યથા, જો બગ ધરાવતાં સર્વર માટે સુસંગતતા જાળવવી આવશ્યક હોય, તો આ નીતિ "tls1.1" પર સેટ કરવામાં આવી શકે છે. આ એક કામચલાઉ પગલું છે અને સર્વરને ઝડપથી ઠીક કરવું જોઈએ.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> માં અક્ષમ પ્લગઇન્સની સૂચિનો ઉલ્લેખ કરે છે અને વપરાશકર્તાઓને આ સેટિંગ બદલતા અટકાવે છે. આર્બીટ્રેરી અક્ષરોના ક્રમ સાથે મેચ કરવા માટે '*' અને '?' વાઇલ્ડ કાર્ડ અક્ષરોનો ઉપયોગ કરી શકાય છે. '*' એ આર્બીટ્રેરી અક્ષરોની સંખ્યા સાથે મેળ ખાય છે જ્યારે '?' એ એક વૈકલ્પિક એકલ અક્ષરનો ઉલ્લેખ કરે છે, એટલે કે શૂન્ય અથવા એક સાથે મેળ ખાતાં અક્ષરો. એસ્કેપ અક્ષર એ '\' છે, તેથી ચોક્કસ '*', '?', અથવા '\' અક્ષરો સાથે મેળ કરવા, તમે તેમની આગળ એક '\' મૂકી શકો છો. @@ -586,6 +593,7 @@ TLS ડોમેન-બાઉન્ડ પ્રમાણપત્રો એક્સ્ટેન્શનને સક્ષમ કરવું જોઈએ કે કેમ તેનો ઉલ્લેખ કરે છે. આ સેટિંગનો ઉપયોગ પરીક્ષણ માટે TLS ડોમેન-બાઉન્ડ પ્રમાણપત્રો એક્સ્ટેન્શનને સક્ષમ કરવા માટે થાય છે. ભવિષ્યમાં આ પ્રાયોગિક સેટિંગને દૂર કરવામાં આવશે.</translation> +<translation id="2957506574938329824">વેબ Bluetooth API દ્વારા કોઇપણ સાઇટને Bluetooth ઉપકરણોની ઍક્સેસની વિનંતી કરવાની મંજૂરી આપશો નહીં</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> પ્રમાણીકરણ માટે એકાઉન્ટનો પ્રકાર</translation> <translation id="2959898425599642200">પ્રોક્સી બાયપાસ નિયમો</translation> <translation id="2960691910306063964">રિમોટ ઍક્સેસ હોસ્ટ માટે PIN-રહિત પ્રમાણીકરણ સક્ષમ અથવા અક્ષમ કરવું</translation> @@ -599,6 +607,7 @@ નીતિ મૂલ્ય મિલિસેકન્ડ્સમાં નિર્દિષ્ટ થવું જોઈએ. મૂલ્યો સ્ક્રીન બંધ વિલંબ (જો સેટ હોય) તેના કરતાં ઓછા અથવા તેના જેટલા અને નિષ્ક્રિય વિલંબ હોવા ફરજિયાત છે.</translation> <translation id="2987155890997901449">ARC સક્ષમ કરે છે</translation> +<translation id="2987227569419001736">વેબ Bluetooth API નો ઉપયોગ નિયંત્રિત કરો</translation> <translation id="2998881342848488968">આ નીતિ <ph name="PRODUCT_OS_NAME" /> ને કેપ્ટિવ પોર્ટલ પ્રમાણીકરણ માટે કોઈપણ પ્રોક્સીને બાયપાસ કરવાની મંજૂરી આપે છે. જો પ્રોક્સી ગોઠવવામાં આવી હોય, તો જ આ નીતિ અસરકર્તા બને છે (ઉદાહરણ તરીકે નીતિ દ્વારા, chrome://settings માં વપરાશકર્તા દ્વારા અથવા એક્સ્ટેન્શન્સ દ્વારા). @@ -922,6 +931,7 @@ આ નીતિનું ફક્ત ત્યારે જ પાલન થાય છે જો 'DefaultSearchProviderEnabled' નીતિ સક્ષમ હોય.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 અથવા તે પછીનું</translation> +<translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> સંસ્કરણને નિયંત્રિત કરવા માટે શૂન્ય વિલંબ કિઓસ્ક ઍપ્લિકેશન સાથે સ્વતઃ લોંચની મંજૂરી આપો</translation> <translation id="4325690621216251241">સિસ્ટમ ટ્રે પર એક બટન લૉગઆઉટ ઉમેરો</translation> <translation id="4347908978527632940">જો true હોય અને વપરાશકર્તા એક નિરીક્ષિત વપરાશકર્તા હોય તો પછી અન્ય Android ઍપ્લિકેશનો સામગ્રી પ્રદાતા મારફતે વપરાશકર્તાના વેબ પ્રતિબંધોને ક્વેરી કરી શકે છે. @@ -1594,6 +1604,9 @@ જો આ નીતિ સેટ કર્યા વગરની રહેવા દીધી છે, તો જ્યારે લોગિન સ્ક્રીન પહેલા બતાવવામાં આવે ત્યારે ઓન-સ્ક્રીન કીબોર્ડ અક્ષમ કરેલ હોય છે. વપરાશકર્તાઓ કોઈપણ સમયે ઓન-સ્ક્રીન કીબોર્ડને સક્ષમ અથવા અક્ષમ કરી શકે છે અને વપરાશકર્તાઓ વચ્ચે લોગિન સ્ક્રીન પર તેની સ્થિતિ સ્થિર રહે છે.</translation> <translation id="6598235178374410284">વપરાશકર્તા અવતાર છબી</translation> +<translation id="6628646143828354685">વેબસાઇટ્સને નજીકના Bluetooth ઉપકરણોની ઍક્સેસ મેળવવાની મંજૂરી આપવી કે નહીં તે તમને સેટ કરવા દે છે. ઍક્સેસ સંપૂર્ણપણે અવરોધિત હોઇ શકે છે અથવા કોઇ વેબસાઇટ નજીકના Bluetooth ઉપકરણોની ઍક્સેસ મેળવવા માંગે ત્યારે દર વખતે વપરાશકર્તાને પૂછવામાં આવી શકે છે. + + જો આ નીતિ સેટ કર્યા વિના છોડેલી છે, તો '3' નો ઉપયોગ કરવામાં આવશે અને વપરાશકર્તાને તેને બદલી શકશે.</translation> <translation id="6636268606788232221">જ્યારે વપરાશકર્તા નિષ્ક્રિય થાય ત્યારે પાવર સંચાલન સેટિંગ્સને ગોઠવો. જ્યારે વપરાશકર્તા નિષ્ક્રિય થાય ત્યારે આ નીતિ પાવર સંચાલન વ્યૂહરચના માટે બહુવિધ સેટિંગ્સને નિયંત્રિત કરે છે. @@ -1671,6 +1684,7 @@ જો તમે નીતિને સેટ કરો છો, તો વપરાશકર્તાઓ તેને બદલી અથવા ઓવરરાઇડ કરી શકતાં નથી. જો આ નીતિ સેટ કર્યા વિનાની રહેવા દીધી છે, તો સિસ્ટમ ટ્રે મેનૂમાં ઍક્સેસિબિલિટી વિકલ્પો દેખાશે નહીં, પરંતુ સેટિંગ્સ પૃષ્ઠ મારફતે વપરાશકર્તા ઍક્સેસિબિલિટી વિકલ્પો બતાવી શકે છે.</translation> +<translation id="6766216162565713893">સાઇટ્સને નજીકના Bluetooth ઉપકરણની ઍક્સેસ આપવા માટે વપરાશકર્તાને પૂછવાની મંજૂરી આપો</translation> <translation id="6770454900105963262">સક્રિય કિઓસ્ક સત્રો વિશે માહિતીની જાણ કરવી</translation> <translation id="6774533686631353488">વપરાશકર્તા-સ્તરના મૂળ મેસેજિંગ હોસ્ટ્સને મંજૂરી આપો (વ્યવસ્થાપક પરવાનગીઓ વિના ઇન્સટોલ કરેલ).</translation> <translation id="6786747875388722282">એક્સ્ટેન્શન્સ</translation> @@ -1868,6 +1882,13 @@ જો આ નીતિ સેટ કરેલી નથી, તો SPDY ઉપલબ્ધ રહેશે.</translation> <translation id="7384999953864505698">QUIC પ્રોટોકોલને મંજૂરી આપે છે</translation> +<translation id="7406651467768226499"><ph name="PRODUCT_OS_NAME" /> સંસ્કરણને નિયંત્રિત કરવા માટે શૂન્ય વિલંબ કિઓસ્ક ઍપ્લિકેશન સાથે સ્વતઃ લોંચની મંજૂરી આપવી કે કેમ. + + આ નીતિ તેના મેનિફેસ્ટમાં required_platform_version ને સ્પષ્ટ કરીને <ph name="PRODUCT_OS_NAME" /> સંસ્કરણને નિયંત્રિત કરવા માટે શૂન્ય વિલંબ કિઓસ્ક ઍપ્લિકેશન સાથે સ્વતઃ લોંચની મંજૂરી આપવી કે કેમ તેનું નિયંત્રણ કરે છે અને સ્વતઃ અપડેટ લક્ષિત સંસ્કરણના ઉપસર્ગ તરીકે તેનો ઉપયોગ કરે છે. + + જો નીતિ true પર સેટ થયેલી હોય, તો શૂન્ય વિલંબ કિઓસ્ક ઍપ્લિકેશન સાથે સ્વતઃ લોંચનું required_platform_version ની મેનિફેસ્ટ કીના મૂલ્યનો સ્વતઃ અપડેટ લક્ષિત સંસ્કરણના ઉપસર્ગ તરીકે ઉપયોગ કરવામાં આવે છે. + + જો નીતિ ગોઠવવામાં આવી ન હોય અથવા false પર સેટ થયેલી હોય, તો required_platform_version ની મેનિફેસ્ટ કીને અવગણવામાં આવે છે અને સ્વતઃ અપડેટની પ્રક્રિયા સામાન્ય તરીકે ચાલે છે.</translation> <translation id="7417972229667085380">પ્રસ્તુતિ મોડમાં નિષ્ક્રિય વિલંબને માપવા માટેની ટકાવારી (ટાળેલ)</translation> <translation id="7421483919690710988">મીડિયા ડિસ્ક કૅસ કદને બાઇટ્સમાં સેટ કરો</translation> <translation id="7424751532654212117">અક્ષમ પ્લગિન્સની સૂચિમાંથી અપવાદોની સૂચિ </translation>
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index d55d4f1..cd550a4c 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -210,6 +210,13 @@ इस नीति का पालन केवल तभी किया जाता है यदि 'DefaultSearchProviderEnabled' नीति सक्षम हो.</translation> <translation id="1859633270756049523">सत्र की अवधि सीमित करना</translation> +<translation id="1859859319036806634">चेतावनी: TLS वर्शन वापसी की प्रक्रिया को <ph name="PRODUCT_NAME" /> से वर्शन 52 (सितंबर 2016 के आस-पास) के बाद निकाल दिया जाएगा और उसके बाद यह पॉलिसी काम करना बंद कर देगी. + + जब कोई TLS हैंडशेक विफल होता है, तो <ph name="PRODUCT_NAME" /> HTTPS सर्वर में मौजूद बग पर काम करने के लिए TLS के किसी पहले वाले वर्शन के साथ कनेक्शन का पुनः प्रयास करेगा. यह सेटिंग वर्शन को इस तरह कॉन्फ़िगर करेगी जिससे यह वापसी की प्रक्रिया काम करना बंद कर देगी. यदि सर्वर के द्वारा वर्शन व्यवहार को सही तरीके से (अर्थात् कनेक्शन को भंग किए बिना) निष्पादित करता है, तो फिर यह सेटिंग लागू नहीं होती है. इस पर ध्यान दिए बिना, परिणामी कनेक्शन को अभी भी SSLVersionMin का अनुपालन करना होगा. + + यदि यह पॉलिसी कॉन्फ़िगर नहीं है या इसे "tls1.2" पर सेट किया हुआ है, तो फिर <ph name="PRODUCT_NAME" /> वापसी की इस प्रक्रिया को अब निष्पादित नहीं करता है. ध्यान दें कि इससे पहले वाले TLS वर्शन का समर्थन अक्षम नहीं होता, केवल <ph name="PRODUCT_NAME" /> बग वाले सर्वर पर काम करेगा या नहीं जो वर्शन से ठीक से व्यवहार नहीं कर सकते हैं. + + अन्यथा, यदि बग वाले सर्वर के साथ संगतता बनाए रखना अनिवार्य हो, तो इस पॉलिसी को "tls1.1" पर सेट किया जा सकता है. यह एक अस्थायी उपाय है और सर्वर को जल्दी ही ठीक किया जाना चाहिए.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> में अक्षम किए गए प्लग इन की सूची निर्दिष्ट करती है और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकती है. वाइल्डकार्ड वर्ण '*' और '?' का उपयोग स्वैच्छिक वर्णों के क्रम मिलाने के लिए किया जा सकता है. '*' का मिलान वर्णों की स्वैच्छिक संख्या से होता है जबकि '?' एक वैकल्पिक एकल वर्ण निर्दिष्ट करता है, जो शून्य या एक से मिलान करता है. एस्केप वर्ण '\' है, इसलिए वास्तविक '*', '?', या '\' वर्णों के मिलान के लिए आप उनके आगे '\' रख सकते हैं. @@ -571,6 +578,7 @@ निर्दिष्ट करती है कि क्या TLS डोमेन-सीमित प्रमाणपत्रों को सक्षम किया जाना चाहिए. इस सेटिंग का उपयोग परीक्षण के लिए TLS डोमेन-आबद्ध प्रमाणपत्र एक्सटेंशन को सक्षम करने में किया जाता है. भविष्य में इस प्रयोगात्मक सेटिंग को निकाल दिया जाएगा.</translation> +<translation id="2957506574938329824">किसी भी साइट को वेब ब्लूटूथ API के द्वारा ब्लूटूथ डिवाइस के एक्सेस अनुरोध की अनुमति ना दें</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> प्रमाणीकरण के लिए खाता प्रकार</translation> <translation id="2959898425599642200">प्रॉक्सी बायपास नियम</translation> <translation id="2960691910306063964">दूरस्थ ऐक्सेस होस्ट के लिए बिना पिन वाला प्रमाणीकरण सक्षम या अक्षम करें</translation> @@ -584,6 +592,7 @@ नीति का मान मिलीसेकंड में निर्दिष्ट किया जाना चाहिए. मानों को स्क्रीन बंद विलंब (यदि सेट हो) और प्रयोग में नहीं विलंब से कम या उसके बराबर होने के लिए क्लैम्प किया जाता है.</translation> <translation id="2987155890997901449">ARC सक्षम करें</translation> +<translation id="2987227569419001736">वेब ब्लूटूथ API के उपयोग को नियंत्रित करें</translation> <translation id="2998881342848488968">यह नीति <ph name="PRODUCT_OS_NAME" /> को कैप्टिव पोर्टल प्रमाणीकरण के लिए किसी भी प्रॉक्सी को बायपास करने देती है. यह नीति केवल तभी प्रभावी होती है जबकि कोई प्रॉक्सी कॉन्फ़िगर किया गया हो (उदाहरण के लिए नीति के माध्यम से, उपयोगकर्ता द्वारा chrome://settings में या एक्सटेंशन के द्वारा). @@ -888,6 +897,7 @@ इस नीति का पालन केवल तभी किया जाता है यदि 'DefaultSearchProviderEnabled' नीति सक्षम हो.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 या बाद का वर्शन</translation> +<translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> वर्शन को नियंत्रित करने के लिए शून्य विलंब किओस्क ऐप वाले स्वत: लॉन्च को अनुमति दें</translation> <translation id="4325690621216251241">सिस्टम ट्रे में एक प्रस्थान करें बटन जोड़ें</translation> <translation id="4347908978527632940">यदि सत्य है और उपयोगकर्ता एक पर्यवेक्षित उपयोगकर्ता है, तो अन्य Android ऐप्स किसी सामग्री प्रदाता के माध्यम से उपयोगकर्ता के वेब प्रतिबंधों के लिए क्वेरी कर सकते हैं. @@ -1520,6 +1530,9 @@ यदि यह नीति सेट किए बिना छोड़ दी जाती है, तो पहली बार लॉगिन स्क्रीन दिखाए जाने पर ऑन-स्क्रीन कीबोर्ड अक्षम हो जाता है. उपयोगकर्ता ऑन-स्क्रीन कीबोर्ड को किसी भी समय सक्षम या अक्षम कर सकते हैं और लॉगिन स्क्रीन पर उसकी स्थिति उपयोगकर्ताओं के बीच सतत बनी रहती है.</translation> <translation id="6598235178374410284">उपयोगकर्ता अवतार चित्र</translation> +<translation id="6628646143828354685">आपको यह सेट करने की सुविधा देती है कि वेबसाइट को आस-पास के ब्लूटूथ डिवाइस का एक्सेस प्राप्त करने की अनुमति है या नहीं. एक्सेस पूरी तरह अवरुद्ध किया जा सकता है या कोई वेबसाइट आस-पास के ब्लूटूथ डिवाइस का एक्सेस चाहती है, तो हर बार उपयोगकर्ता से पूछा जा सकता है. + + यदि यह पॉलिसी सेट किए बिना छोड़ दी जाती है, तो '3' का उपयोग किया जाएगा और उपयोगकर्ता उसे बदल सकेगा.</translation> <translation id="6636268606788232221">उपयोगकर्ता के निष्क्रिय होने जाने पर पावर प्रबंधन सेटिंग कॉन्फ़िगर करें. यह पॉलिसी उपयोगकर्ता निष्क्रिय हो जाने पर पावर प्रबंधन रणनीति के लिए एकाधिक सेटिंग को नियंत्रित करती है. @@ -1613,6 +1626,7 @@ यदि आप इस नीति को सेट करते हैं, तो उपयोगकर्ता उसे बदल या ओवरराइड नहीं कर सकते हैं. यदि यह नीति सेट किए बिना छोड़ दी जाती है, तो पहुंच-योग्यता विकल्प सिस्टम ट्रे मेनू में दिखाई नहीं देंगे, लेकिन उपयोगकर्ता पहुंच-योग्यता विकल्पों को सेटिंग पृष्ठ के द्वारा दिखा सकता है.</translation> +<translation id="6766216162565713893">उपयोगकर्ता से किसी आस-पास के ब्लूटूथ डिवाइस का एक्सेस मांगने की अनुमति दें</translation> <translation id="6770454900105963262">सक्रिय कियोस्क सत्रों के बारे में जानकारी की रिपोर्ट करना</translation> <translation id="6774533686631353488">उपयोगकर्ता-स्तर स्थानीय संदेश सेवा होस्ट की अनुमति दें (व्यवस्थापक अनुमतियों के बिना इंस्टॉल किया गया).</translation> <translation id="6786747875388722282">एक्सटेंशन</translation> @@ -1804,6 +1818,13 @@ यदि यह नीति बिना सेट किए छोड़ दी गई है, तो SPDY उपलब्ध होगा.</translation> <translation id="7384999953864505698">QUIC प्रोटोकॉल की अनुमति देती है</translation> +<translation id="7406651467768226499"><ph name="PRODUCT_OS_NAME" /> वर्शन को नियंत्रित करने के लिए शून्य विलंब किओस्क ऐप वाले स्वत: लॉन्च को अनुमति दें या नहीं. + + यह पॉलिसी अपने मेनिफेस्ट में required_platform_version को घोषित करके यह नियंत्रित करती है कि <ph name="PRODUCT_OS_NAME" /> वर्शन को नियंत्रित करने के लिए शून्य विलंब किओस्क ऐप वाले स्वत: लॉन्च को अनुमति दें या नहीं और उसका उपयोग स्वतः अपडेट लक्ष्य वर्शन के प्रारंभिक भाग के रूप में करती है. + + यदि इस पॉलिसी को सही पर सेट किया जाता है, तो शून्य विलंब किओस्क ऐप वाले स्वत: लॉन्च की required_platform_version मेनिफेस्ट कुंजी के मान का उपयोग स्वतः अपडेट लक्ष्य वर्शन के प्रारंभिक भाग के रूप में किया जाता है. + + यदि इस पॉलिसी को कॉन्फ़िगर नहीं किया जाता है या गलत पर सेट किया जाता है, तो required_platform_version मेनिफेस्ट कुंजी को अनदेखा किया जाता है और स्वतः अपडेट सामान्य रूप से काम करता है.</translation> <translation id="7417972229667085380">प्रस्तुतिकरण मोड में प्रयोग में नहीं विलंब मापने का प्रतिशत (बहिष्कृत)</translation> <translation id="7421483919690710988">मीडिया डिस्क संचय को बाइट में सेट करें</translation> <translation id="7424751532654212117">अक्षम प्लग इन सूची से अपवादों की सूची</translation>
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb index feda08e..8afbbf7 100644 --- a/components/policy/resources/policy_templates_hr.xtb +++ b/components/policy/resources/policy_templates_hr.xtb
@@ -192,6 +192,13 @@ To se pravilo poštuje samo ako je omogućeno pravilo "DefaultSearchProviderEnabled".</translation> <translation id="1859633270756049523">Ograničava duljinu sesije</translation> +<translation id="1859859319036806634">Upozorenje: rezervni postupak za verziju TLS-a uklonit će se iz preglednika <ph name="PRODUCT_NAME" /> nakon verzije 52 (otprilike u rujnu 2016.) i ovo će pravilo tada prestati funkcionirati. + + U slučaju neuspjelog rukovanja TLS-a <ph name="PRODUCT_NAME" /> prije je ponovo isprobavao vezu sa starijom verzijom TLS-a da bi zaobišao programske pogreške na HTTPS poslužiteljima. Ta postavka konfigurira verziju na kojoj će se rezervni postupak zaustaviti. Ako poslužitelj ispravno dogovori verziju (tj., bez prekidanja veze), ta se postavka neće primijeniti. Neovisno o tome, postignuta veza mora i dalje biti u skladu s pravilom SSLVersionMin. + + Ako se to pravilo ne konfigurira ili se postavi na "tls1.2", <ph name="PRODUCT_NAME" /> više neće izvršavati rezervni postupak. Time se ne onemogućuje podrška za starije verzije TLS-a, već se samo određuje hoće li <ph name="PRODUCT_NAME" /> zaobilaziti poslužitelje s pogreškama koji ne mogu ispravno dogovoriti verzije. + + No ako se mora održati kompatibilnost s poslužiteljem koji sadrži pogreške, pravilo se može postaviti na "tls1.1". To je samo privremena mjera i problem na poslužitelju potrebno je brzo riješiti.</translation> <translation id="1861037019115362154">Određuje popis dodataka koji su onemogućeni u proizvodu <ph name="PRODUCT_NAME" /> i sprječava korisnike da promijene tu postavku. Zamjenski znakovi "*" i "?" mogu se upotrijebiti za podudarne nizove proizvoljnih znakova. "*" odgovara proizvoljnom broju znakova, dok "?" određuje izborni pojedinačni znak, tj. ne odgovara nijednom ili odgovara jednom znaku. Prespojni je znak "\", tako da za podudaranje sa stvarnim znakovima "*", "?" ili "\" ispred njih morate staviti znak "\". @@ -533,6 +540,7 @@ Određuje hoće li proširenje TLS certifikata vezanih uz domenu biti omogućeno. Ta se postavka upotrebljava za omogućivanje proširenja TLS certifikata vezanih uz domenu za testiranje. Ta će se eksperimentalna postavka ukloniti.</translation> +<translation id="2957506574938329824">Nemoj dopustiti nijednoj web-lokaciji da traži pristup Bluetooth uređajima putem API-ja Web Bluetooth</translation> <translation id="2957513448235202597">Vrsta računa za <ph name="HTTP_NEGOTIATE" /> autentifikaciju</translation> <translation id="2959898425599642200">Pravila zaobilaženja proxyja</translation> <translation id="2960691910306063964">Omogući ili onemogući autentifikaciju bez PIN-a za hostove daljinskog pristupa</translation> @@ -546,6 +554,7 @@ Vrijednost pravila treba navesti u milisekundama. Vrijednosti su ograničene na vrijeme kraće od odgode isključivanja zaslona i odgode neaktivnosti ili jednako tom vremenu (ako je postavljeno).</translation> <translation id="2987155890997901449">Omogući ARC</translation> +<translation id="2987227569419001736">Upravljanje upotrebom API-ja Web Bluetooth</translation> <translation id="2998881342848488968">To pravilo omogućuje proizvodu <ph name="PRODUCT_OS_NAME" /> da zaobiđe bilo koji proxy za autentifikaciju zaštitnim portalom. To pravilo djeluje samo ako je proxy konfiguriran (na primjer, pravilom, korisnički u chrome://settings ili proširenjima). @@ -1418,6 +1427,9 @@ Ako ne postavite to pravilo, tipkovnica na zaslonu onemogućena je prilikom prvog prikazivanja zaslona za prijavu. Korisnici mogu omogućiti ili onemogućiti tipkovnicu na zaslonu u bilo kojem trenutku i njen status na zaslonu za prijavu zadržava se među korisnicima.</translation> <translation id="6598235178374410284">Slika avatara korisnika</translation> +<translation id="6628646143828354685">Omogućuje vam da odredite smiju li web-lokacije dobivati pristup Bluetooth uređajima u blizini. Pristup se može potpuno blokirati ili se može tražiti dopuštenje korisnika svaki put kad neka web-lokacija želi pristupiti Bluetooth uređajima u blizini. + + Ako se pravilo ne postavi, upotrebljavat će se vrijednost "3" i korisnik će to moći promijeniti.</translation> <translation id="6636268606788232221">Konfiguriraj postavke upravljanja napajanjem kada korisnik postane neaktivan. To pravilo nadzire više postavki za strategiju upravljanja napajanjem kada korisnik postane neaktivan. @@ -1493,6 +1505,7 @@ Ako postavite ovo pravilo, korisnici ga ne mogu mijenjati niti nadjačati. Ako ne postavite to pravilo, opcije pristupačnosti neće se pojaviti u izborniku programske trake, ali ih korisnik može prikazati putem stranice Postavke.</translation> +<translation id="6766216162565713893">Dopusti web-lokacijama da traže dopuštenje korisnika za pristup Bluetooth uređajima u blizini</translation> <translation id="6770454900105963262">Izvješćivanje o informacijama o aktivnim sesijama kioska</translation> <translation id="6774533686631353488">Dopusti hostove Lokalnog slanja poruka na razini korisnika (instaliranih bez administratorskih dopuštenja).</translation> <translation id="6786747875388722282">Proširenja</translation>
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index 2740f2a4..c5d2a8e 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -192,6 +192,13 @@ A házirend csak akkor érvényesül, ha a „DefaultSearchProviderEnabled” házirend engedélyezve van.</translation> <translation id="1859633270756049523">Munkamenet hosszának korlátozása</translation> +<translation id="1859859319036806634">Figyelmeztetés: A TLS-tartalékverziót eltávolítjuk a <ph name="PRODUCT_NAME" /> böngészőből az 52-es verzió után (körülbelül 2016 szeptemberében), és onnantól kezdve ez a házirend nem fog működni. + + Amikor a TLS-kapcsolatfelvétel sikertelen, a <ph name="PRODUCT_NAME" /> korábban újrapróbálta a kapcsolódást a TLS egy korábbi verziójával a HTTPS-szerverek hibáinak kiküszöbölése érdekében. Ez a beállítás azt a verziót konfigurálja, amelynél a tartalékfolyamat leáll. Ha a szerver helyesen (azaz a kapcsolat megszakítása nélkül) hajtja végre a verzióegyeztetést, akkor a böngésző nem alkalmazza ezt a beállítást. Mindettől függetlenül az ennek eredményeként létrejövő kapcsolatnak meg kell felelnie az SSLVersionMin paraméternek. + + Ha ez a házirend nincs beállítva, illetve a beállítása „tls1.2”, akkor a <ph name="PRODUCT_NAME" /> a továbbiakban nem hajtja végre ezt a tartalékfolyamatot. Lényeges, hogy ez nem kapcsolja ki a TLS korábbi verzióinak támogatását, hanem csupán azt, hogy a <ph name="PRODUCT_NAME" /> keressen-e megoldást azoknál a hibásan működő szervereknél, amelyek nem tudják helyesen egyeztetni a verziókat. + + Ha fenn kell tartani a kompatibilitást a hibásan működő szerverrel, akkor a házirend a „tls1.1” értékre állítható. Ez átmeneti intézkedés, és a szervert mielőbb meg kell javítani.</translation> <translation id="1861037019115362154">Megadja a(z) <ph name="PRODUCT_NAME" /> számára tiltott bővítmények listáját, és megakadályozza, hogy a felhasználók megváltoztassák ezt a beállítást. A „*” és a „?” helyettesítő karakterek használata megengedett tetszőleges karaktersorozatok helyettesítésére. A „*” tetszőleges számú karaktert helyettesít, míg a „?” egyetlen opcionális karaktert határoz meg, azaz nullát vagy egy karaktert. Az escape-karakter a „\”, így a tényleges „*”, „?” vagy „\” karakterek beírásához azok elé „\” karaktert kell tenni. @@ -531,6 +538,7 @@ Azt adja meg, hogy a TLS-domainhez kötött tanúsítványbővítmények engedélyezve legyenek-e. Ez a beállítás arra szolgál, hogy tesztelési célból engedélyezze a TLS-domainhez kötött tanúsítványbővítményeket. Ezt a kísérleti beállítást a jövőben eltávolítjuk.</translation> +<translation id="2957506574938329824">Nem engedélyezi, hogy a webhelyek hozzáférést kérjenek a Bluetooth-eszközökhöz a Web Bluetooth API-n keresztül</translation> <translation id="2957513448235202597">Fióktípus a <ph name="HTTP_NEGOTIATE" /> hitelesítés egyeztetéséhez</translation> <translation id="2959898425599642200">Proxy figyelmen kívül hagyásának szabályai</translation> <translation id="2960691910306063964">A PIN-kód nélküli hitelesítés engedélyezése vagy kikapcsolása a távoli elérésű gazdagépek számára</translation> @@ -544,6 +552,7 @@ A házirend értékét ezredmásodpercben kell megadni. Az értéknek kisebbnek kell lennie a képernyő kikapcsolásának késleltetésénél (ha be van állítva) és a tétlenségi késleltetésnél.</translation> <translation id="2987155890997901449">ARC engedélyezése</translation> +<translation id="2987227569419001736">A Web Bluetooth API használatának irányítása</translation> <translation id="2998881342848488968">Lehetővé teszi a <ph name="PRODUCT_OS_NAME" /> számára, hogy megkerülje a proxyt a hitelesítési portálokon történő hitelesítéskor. Ez a házirend csak akkor lép érvénybe, ha be van állítva proxy (például házirend vagy bővítmény révén, illetve a felhasználó által a chrome://settings oldalon). @@ -826,6 +835,7 @@ Ez a házirend csak akkor érvényesül, ha a „DefaultSearchProviderEnabled” házirend engedélyezve van.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 vagy újabb</translation> +<translation id="4322842393287974810">Annak engedélyezése, hogy a <ph name="PRODUCT_OS_NAME" /> verziójának ellenőrzését a késés nélkül, automatikusan indított kioszkalkalmazás végezze.</translation> <translation id="4325690621216251241">Kijelentkezés gomb elhelyezése a tálcán</translation> <translation id="4347908978527632940">Ha a felhasználó felügyelt felhasználó, akkor tartalomszolgáltatón keresztül az egyéb Android-alkalmazások lekérdezhetik a felhasználó webkorlátozásait. @@ -1416,6 +1426,9 @@ Ha nem állítja be ezt a házirendet, akkor a képernyő-billentyűzet le lesz tiltva a bejelentkezési képernyő első megjelenítésekor. A felhasználók bármikor engedélyezhetik vagy letilthatják a képernyő-billentyűzetet, és annak állapota a bejelentkezési képernyőn megmarad a felhasználók között.</translation> <translation id="6598235178374410284">Felhasználó avatarképe</translation> +<translation id="6628646143828354685">Lehetővé teszi annak beállítását, hogy a webhelyek hozzáférhetnek-e a közeli Bluetooth-eszközökhöz. A hozzáférés teljes mértékben letiltható, vagy a rendszer minden olyan alkalommal rákérdezhet a felhasználónál az engedélyezésre, amikor egy webhely közeli Bluetooth-eszközökhöz szeretne hozzáférni. + + Ha nincs beállítva a házirend, akkor az érték „3” lesz, amit a felhasználó bármikor módosíthat.</translation> <translation id="6636268606788232221">Az energiagazdálkodási beállítások konfigurálása olyankor, amikor a felhasználó tétlen. Ez a házirend többféle, az energiagazdálkodási stratégiára vonatkozó beállítást vezérel arra vonatkozóan, amikor a felhasználó tétlenné válik. @@ -1491,6 +1504,7 @@ Ha beállítja ezt a házirendet, a felhasználók nem módosíthatják vagy bírálhatják felül. Ha nem állítja be ezt a házirendet, a kisegítő lehetőségek nem jelennek meg a tálca menüjében, de a felhasználó a Beállítások oldalon beállíthatja azok megjelenítését.</translation> +<translation id="6766216162565713893">Engedélyezi azt, hogy a felhasználótól hozzáférést kérjenek a webhelyek egy közeli Bluetooth-eszköz használatára</translation> <translation id="6770454900105963262">Az aktív kioszkmunkamenetekkel kapcsolatos információk jelentése</translation> <translation id="6774533686631353488">Felhasználói szintű (rendszergazdai engedély nélkül telepített) natív üzenetváltási szerverek használatának engedélyezése.</translation> <translation id="6786747875388722282">Bővítmények</translation> @@ -1666,6 +1680,13 @@ <translation id="7340034977315324840">Az eszköz aktív idejének jelentése</translation> <translation id="7381326101471547614">Letiltja az SPDY protokoll használatát a(z) <ph name="PRODUCT_NAME" /> termékben. Ha ez a házirend engedélyezve van, akkor az SPDY protokoll nem lesz elérhető a(z) <ph name="PRODUCT_NAME" /> termékben. E házirend kikapcsolása lehetővé teszi az SPDY használatát. Ha ez a házirend beállítatlanul marad, az SPDY elérhető lesz.</translation> <translation id="7384999953864505698">Engedélyezi a QUIC-protokollt</translation> +<translation id="7406651467768226499">Annak meghatározása, hogy a késés nélkül, automatikusan elindított kioszkalkalmazás irányítsa-e a <ph name="PRODUCT_OS_NAME" /> verzióját. + + Ez a házirend határozza meg, hogy Ön engedélyezi-e a késés nélkül, automatikusan elindított kioszkalkalmazás számára a <ph name="PRODUCT_OS_NAME" /> verziójának irányítását a required_platform_version kulcs jegyzékben való meghatározásával annak érdekében, hogy ez a kulcs adja a célverzió előtagját az automatikus frissítéseknél. + + Ha a házirend értéke „true” (igaz), akkor a késés nélkül, automatikusan elindított kioszkalkalmazás required_platform_version jegyzékkulcsát használja a rendszer a célverzió automatikus frissítésének előtagjaként. + + Ha a házirend nincs konfigurálva, vagy értéke „false” (hamis), akkor a rendszer figyelmen kívül hagyja a required_platform_version jegyzékkulcsot, és az automatikus frissítés a megszokottak szerint megy végbe.</translation> <translation id="7417972229667085380">Az a százalék, amelynek alapján a tétlenségi késleltetés skálázódik prezentációs módban (megszűnt)</translation> <translation id="7421483919690710988">A médialemez gyorsítótárméretének beállítása bájtban</translation> <translation id="7424751532654212117">A tiltott bővítmények listájának kivétellistája</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index d7b9964..df1148c 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -192,6 +192,13 @@ Kebijakan ini hanya dipatuhi jika kebijakan 'DefaultSearchProviderEnabled' diaktifkan.</translation> <translation id="1859633270756049523">Batasi lamanya sesi</translation> +<translation id="1859859319036806634">Peringatan: TLS versi fallback akan dihapus dari <ph name="PRODUCT_NAME" /> setelah versi 52 (sekitar bulan September 2016) dan kebijakan ini tidak akan berlaku lagi. + + Jika penyambungan TLS gagal, <ph name="PRODUCT_NAME" /> akan terlebih dahulu mencoba ulang sambungan dengan versi TLS yang lebih rendah guna memperbaiki bug di server HTTPS. Setelan ini mengonfigurasi versi tempat proses fallback ini akan berhenti. Jika server menjalankan negosiasi versi dengan tepat (tanpa memutuskan sambungan), setelan ini tidak akan berlaku. Namun demikian, sambungan yang dihasilkan tetap harus mematuhi SSLVersionMin. + + Jika kebijakan ini tidak dikonfigurasi atau jika disetel ke "tls1.2", <ph name="PRODUCT_NAME" /> tidak lagi menjalankan fallback ini. Perhatikan bahwa tindakan ini tidak menonaktifkan dukungan untuk TLS versi lebih lama, hanya jika <ph name="PRODUCT_NAME" /> akan memperbaiki server berisi bug yang tidak dapat melakukan negosiasi versi dengan tepat. + + Sebaliknya, jika kompatibilitas dengan server berisi bug harus dipertahankan, kebijakan ini akan disetel ke "tls1.1". Hal ini merupakan ukuran sementara dan server harus segera diperbaiki.</translation> <translation id="1861037019115362154">Menentukan daftar plugin yang dinonaktifkan di <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubah setelan ini. Karakter pengganti '*' dan '?' dapat digunakan untuk mencocokkan urutan karakter sembarang. '*' cocok dengan sembarang jumlah karakter sedangkan '?' menentukan karakter tunggal opsional, yaitu yang cocok dengan nol atau satu karakter. Karakter hindar adalah '\', jadi untuk mencocokkan dengan karakter '*', '?', atau '\', jadi '\' di depannya. @@ -534,6 +541,7 @@ Menentukan apakah ekstensi sertifikat terikat domain TLS sebaiknya diaktifkan atau tidak. Setelan ini digunakan untuk mengaktifkan ekstensi sertifikat terikat domain TLS untuk pengujian. Setelan eksperimental ini akan dibuang di masa mendatang.</translation> +<translation id="2957506574938329824">Jangan izinkan situs apa pun meminta akses ke perangkat Bluetooth melalui API Bluetooth Web</translation> <translation id="2957513448235202597">Jenis akun untuk autentikasi <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Peraturan mengabaikan proxy</translation> <translation id="2960691910306063964">Mengaktifkan atau menonaktifkan autentikasi tanpa PIN untuk host akses jarak jauh</translation> @@ -547,6 +555,7 @@ Nilai kebijakan harus ditentukan dalam milidetik. Nilai dijepit hingga kurang dari atau setara dengan penundaan mematikan layar (jika disetel) dan penundaan waktu menganggur.</translation> <translation id="2987155890997901449">Aktifkan ARC</translation> +<translation id="2987227569419001736">Mengontrol penggunaan API Bluetooth Web</translation> <translation id="2998881342848488968">Kebijakan ini memungkinkan <ph name="PRODUCT_OS_NAME" /> melewati proxy apa pun untuk autentikasi portal tawanan. Kebijakan ini hanya berlaku jika proxy dikonfigurasi (misalnya melalui kebijakan, oleh pengguna di chrome://settings, atau dengan ekstensi). @@ -1420,6 +1429,9 @@ Jika kebijakan ini tidak disetel, keyboard di layar akan dinonaktifkan ketika layar masuk ditampilkan untuk pertama kali. Pengguna dapat mengaktifkan atau menonaktifkan keyboard di layar kapan saja dan statusnya pada layar masuk bersifat tetap antarpengguna.</translation> <translation id="6598235178374410284">Gambar avatar pengguna</translation> +<translation id="6628646143828354685">Memungkinkan Anda menyetel apakah situs web dapat mengakses perangkat Bluetooth di sekitar. Akses dapat diblokir sepenuhnya, atau pengguna dapat dimintai izin setiap kali situs web ingin mengakses perangkat Bluetooth di sekitar. + + Jika kebijakan ini belum disetel, '3' akan digunakan, dan pengguna dapat mengubahnya.</translation> <translation id="6636268606788232221">Mengonfigurasi setelan pengelolaan daya saat pengguna menganggur. Kebijakan ini mengontrol beberapa setelan untuk strategi pengelolaan daya saat pengguna menganggur. @@ -1495,6 +1507,7 @@ Jika Anda menyetel kebijakan ini, pengguna tidak dapat mengubah atau menggantinya. Jika kebijakan ini tidak disetel, opsi Aksesibilitas tidak akan muncul di menu baki sistem, namun pengguna dapat menyebabkan opsi Aksesibilitas untuk muncul via laman Setelan.</translation> +<translation id="6766216162565713893">Izinkan situs meminta pengguna memberikan akses ke perangkat Bluetooth di sekitar</translation> <translation id="6770454900105963262">Melaporkan informasi tentang sesi kios aktif</translation> <translation id="6774533686631353488">Izinkan host Native Messaging tingkat pengguna (dipasang tanpa izin admin).</translation> <translation id="6786747875388722282">Ekstensi</translation> @@ -1670,9 +1683,9 @@ <translation id="7340034977315324840">Laporkan waktu aktivitas perangkat</translation> <translation id="7381326101471547614">Menonaktifkan penggunaan protokol SPDY di <ph name="PRODUCT_NAME" />. Jika kebijakan ini diaktifkan, protokol SPDY tidak akan tersedia di <ph name="PRODUCT_NAME" />. Menyetel kebijakan ini sebagai dinonaktifkan akan mengizinkan penggunaan SPDY. Jika kebijakan ini tidak disetel, SPDY akan tersedia.</translation> <translation id="7384999953864505698">Memungkinkan protokol QUIC</translation> -<translation id="7406651467768226499">Apakah mengizinkan peluncuran otomatis dengan aplikasi kios tanpa penundaan untuk mengontrol versi <ph name="PRODUCT_OS_NAME" /> atau tidak. +<translation id="7406651467768226499">Mengizinkan peluncuran otomatis dengan aplikasi kios tanpa penundaan untuk mengontrol versi <ph name="PRODUCT_OS_NAME" /> atau tidak. - Kebijakan ini mengontrol apakah peluncuran otomatis dengan aplikasi kios tanpa penundaan untuk mengontrol versi <ph name="PRODUCT_OS_NAME" /> diizinkan atau tidak dengan mendeklarasikan required_platform_version di dalam manifes dan menggunakannya sebagai awalan versi target pembaruan otomatis. + Kebijakan ini mengontrol apakah peluncuran otomatis dengan aplikasi kios tanpa penundaan untuk mengontrol versi <ph name="PRODUCT_OS_NAME" /> diizinkan atau tidak, dengan menyatakan required_platform_version di dalam manifes dan menggunakannya sebagai awalan versi target pembaruan otomatis. Jika kebijakan ini disetel ke True, nilai kunci manifes required_platform_version peluncuran otomatis dengan aplikasi kios tanpa penundaan akan digunakan sebagai awalan versi target pembaruan otomatis.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 1928efe..e0daa57 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -181,6 +181,13 @@ Questa norma viene rispettata soltanto se la norma "DefaultSearchProviderEnabled" è attiva.</translation> <translation id="1859633270756049523">Limita la durata della sessione</translation> +<translation id="1859859319036806634">Avviso. Il fallback della versione TLS sarà rimosso da <ph name="PRODUCT_NAME" /> dopo la versione 52 (nel periodo settembre 2016), dopodiché questa norma non sarà più attiva. + + Se lo handshake non riesce TLS, <ph name="PRODUCT_NAME" /> proverà a stabilire una connessione con una versione precedente di TLS per risolvere i bug nei server HTTPS. Con questa impostazione viene configurata la versione in cui si interrompe il processo di fallback. Se un server esegue correttamente la negoziazione della versione (cioè senza interrompere la connessione), questa impostazione non viene applicata. In ogni caso, la connessione risultante deve essere conforme a SSLVersionMin. + + Se questa norma non è configurata o se viene impostata su "tls1.2", <ph name="PRODUCT_NAME" /> non eseguirà più il fallback. Il supporto per le versioni precedenti di TLS non viene disattivato, solo se <ph name="PRODUCT_NAME" /> ovvierà ai server con errori che non sono in grado di negoziare correttamente le versioni. + + In caso contrario, se è necessario mantenere la compatibilità con un server con errori, è possibile impostare la norma su "tls1.1". Si tratta di una misura temporanea ed è necessario correggere rapidamente il server.</translation> <translation id="1861037019115362154">Consente di specificare un elenco di plug-in non attivi in <ph name="PRODUCT_NAME" /> e di impedire agli utenti di modificare questa impostazione. È possibile utilizzare i caratteri jolly "*" e "?" in corrispondenza delle sequenze di caratteri arbitrari. Il carattere "*" corrisponde a un numero arbitrario di caratteri, mentre "?" indica un singolo carattere facoltativo, cioè corrisponde a zero caratteri o a uno solo. Il carattere di escape è "\" e quindi, per indicare i caratteri "*", "?" e "\" effettivi, puoi inserire prima di tali caratteri un simbolo "\". @@ -516,6 +523,7 @@ Consente di specificare se attivare o meno l'estensione di certificati associati al dominio TLS. Questa impostazione viene utilizzata per attivare l'estensione di certificati associati al dominio TLS per l'esecuzione di test. Questa impostazione sperimentale verrà rimossa in futuro.</translation> +<translation id="2957506574938329824">Non consentire ad alcun sito di richiedere l'accesso ai dispositivi Bluetooth tramite l'API Web Bluetooth</translation> <translation id="2957513448235202597">Tipo di account per l'autenticazione <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Regole di bypass proxy</translation> <translation id="2960691910306063964">Consente di attivare o disattivare l'autenticazione senza PIN per gli host di accesso remoto</translation> @@ -529,6 +537,7 @@ Il valore della norma deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di disattivazione dello schermo (se impostato) e al ritardo di inattività.</translation> <translation id="2987155890997901449">Attiva ARC</translation> +<translation id="2987227569419001736">Controlla l'utilizzo dell'API Web Bluetooth</translation> <translation id="2998881342848488968">Questa norma consente a <ph name="PRODUCT_OS_NAME" /> di aggirare qualsiasi proxy per l'autenticazione tramite captive portal. Questa norma viene applicata soltanto se viene configurato un proxy (ad esempio tramite la norma, dall'utente in chrome://settings o tramite estensioni). @@ -1379,6 +1388,9 @@ Se questa norma non viene impostata, la tastiera sullo schermo è disattivata alla prima visualizzazione della schermata di accesso. Gli utenti possono attivare o disattivare la tastiera sullo schermo in qualsiasi momento e il relativo stato sulla schermata di accesso viene mantenuto tra utenti differenti.</translation> <translation id="6598235178374410284">Immagine avatar utente</translation> +<translation id="6628646143828354685">Permette di stabilire se consentire o meno l'accesso ai dispositivi Bluetooth nelle vicinanze. L'accesso può essere bloccato completamente oppure l'utente può ricevere una richiesta ogni volta che un sito web desidera accedere ai dispositivi Bluetooth nelle vicinanze. + + Se questa norma non viene impostata, verrà utilizzato il valore "3", che potrà essere modificato dall'utente.</translation> <translation id="6636268606788232221">Consente di configurare le impostazioni di gestione dell'alimentazione quando l'utente diventa inattivo. Questa norma consente di controllare diverse impostazioni relative alla strategia di gestione dell'alimentazione quando l'utente diventa inattivo. @@ -1454,6 +1466,7 @@ Se imposti questa norma, gli utenti non possono modificarla o ignorarla. Se questa norma non viene impostata, le opzioni di accesso non vengono visualizzate nel menu della barra delle applicazioni, tuttavia l'utente può impostarne la visualizzazione tramite la pagina Impostazioni.</translation> +<translation id="6766216162565713893">Consenti ai siti di chiedere all'utente di concedere l'accesso a un dispositivo Bluetooth nelle vicinanze.</translation> <translation id="6770454900105963262">Segnala informazioni sulle sessioni kiosk attive</translation> <translation id="6774533686631353488">Consenti host di messaggistica nativi a livello di utente (installati senza privilegi di amministratore).</translation> <translation id="6786747875388722282">Estensioni</translation>
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index 9a824614..83e85c4 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -186,6 +186,13 @@ מדיניות זו מכובדת רק אם המדיניות 'DefaultSearchProviderEnabled' מופעלת.</translation> <translation id="1859633270756049523">הגבלת משך הפעילות</translation> +<translation id="1859859319036806634">אזהרה: השימוש בגירסה קודמת של ה-TLS (אבטחת שכבת התעבורה) כגיבוי יוסר מ-<ph name="PRODUCT_NAME" /> לאחר גירסה 52 (בערך בספטמבר 2016) והמדיניות הזו תפסיק לפעול במועד זה. + + קודם לכן, כאשר לחיצת יד של TLS הייתה נכשלת, <ph name="PRODUCT_NAME" /> היה מנסה לבצע את החיבור עם גירסה קודמת של TLS על מנת לעקוף באגים בשרתי HTTPS. ההגדרה הזו קובעת את הגירסה האחרונה לתהליך הגיבוי הזה. אם שרת יבצע התאמת גירסאות בצורה תקינה (כלומר, בלי לנתק את החיבור), ההגדרה הזו לא תהיה רלוונטית. ללא קשר לכך, החיבור שייווצר עדיין יהיה חייב לעמוד בדרישות התאימות של SSLVersionMin. + + אם המדיניות הזו לא תוגדר או תיקבע כ-"tls1.2", <ph name="PRODUCT_NAME" /> לא יבצע עוד את הגיבוי הזה. שים לב ששינוי זה אינו משבית את התמיכה בגירסאות ישנות יותר של TLS, אלא רק קובע האם <ph name="PRODUCT_NAME" /> יעקוף שרתים עם באגים שלא יכולים להתאים גירסאות בצורה תקינה. + + לחלופין, אם יש לשמור על תאימות לשרת שבו קיימים באגים, ייתכן שהמדיניות הזו תיקבע כ-"tls1.1". זהו פתרון זמני ויש לתקן במהירות את השרת.</translation> <translation id="1861037019115362154">קובע רשימה של יישומי פלאגין שמושבתים ב-<ph name="PRODUCT_NAME" /> ומונע ממשתמשים לשנות הגדרה זו. ניתן להשתמש בתווים הכלליים לחיפוש '*' ו-'?' כדי להתאים לרצפים של תווים שרירותיים. '*' תואם למספר שרירותי של תווים ואילו '?' מציין תו בודד אופציונלי, כלומר תואם לתווים אפס או אחד. תו היציאה הוא '\', ולכן כדי למצוא התאמה בפועל לתווים '*', '?' או '\', תוכל להוסיף לפניהם את התו '\'. @@ -527,6 +534,7 @@ מציינת האם יש להפעיל את תוסף האישורים המאוגד לדומיין TLS. ההגדרה הזו משמשת להפעלת תוסף האישורים המאוגד לדומיין TLS לביצוע בדיקות. ההגדרה הניסיונית הזו תוסר בעתיד.</translation> +<translation id="2957506574938329824">אל תאפשר לאף אתר לבקש גישה אל התקני Bluetooth דרך ה-Web Bluetooth API</translation> <translation id="2957513448235202597">סוג חשבון לאימות <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">כללי עקיפת Proxy</translation> <translation id="2960691910306063964">הפעלה או השבתה של אימות ללא PIN עבור מארחי גישה מרחוק</translation> @@ -540,6 +548,7 @@ ערך המדיניות צריך להיות באלפיות שנייה. הערכים מצומצמים כך שיהיו קטנים ממשך ההשהיה לפני מצב לא פעיל.</translation> <translation id="2987155890997901449">הפעל את ARC</translation> +<translation id="2987227569419001736">שליטה על השימוש ב-Web Bluetooth API</translation> <translation id="2998881342848488968">מדיניות זו מאפשרת ל-<ph name="PRODUCT_OS_NAME" /> לעקוף כל שרת proxy לצורך אימות פורטל חובה. מדיניות זו תקפה רק אם מוגדר שרת proxy (למשל מתוקף מדיניות, על ידי המשתמש ב-chrome://settings, או על ידי תוספים). @@ -822,6 +831,7 @@ מדיניות זו מכובדת רק אם המדיניות 'DefaultSearchProviderEnabled' מופעלת.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 ואילך</translation> +<translation id="4322842393287974810">התר ליישום הקיוסק המופעל באופן אוטומטי ללא השהייה לקבוע את הגירסה של <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">הוסף לחצן התנתקות למגש המערכת</translation> <translation id="4347908978527632940">אם הערך הוא true וזהו משתמש בפיקוח, אפליקציות Android נוספות יכולות לבצע שאילתות ביחס להגבלות האינטרנט של המשתמש באמצעות ספק תוכן. @@ -1396,6 +1406,9 @@ אם המדיניות הזו לא מוגדרת, המקלדת על המסך מושבתת כשמסך ההתחברות מוצג בפעם הראשונה. משתמשים יכולים להפעיל או להשבית את המקלדת על המסך בכל עת, והסטטוס שלה במסך ההתחברות נשמר בין משתמשים שונים.</translation> <translation id="6598235178374410284">תמונה של דמות משתמש</translation> +<translation id="6628646143828354685">מאפשרת לך לקבוע האם אתרים יכולים לקבל גישה אל התקני Bluetooth קרובים. ניתן לחסום את הגישה לחלוטין, או שהמשתמש יתבקש להעניק אישור בכל פעם שאתר רוצה לקבל גישה אל התקני Bluetooth קרובים. + + אם המדיניות הזו לא תוגדר, יעשה שימוש ב-'3' והמשתמש יוכל לשנות את ההגדרה.</translation> <translation id="6636268606788232221">קבע את ההגדרות לניהול צריכת חשמל בזמן של חוסר פעילות מצד המשתמש. מדיניות זו קובעת הגדרות מרובות לניהול צריכת החשמל בזמן של חוסר פעילות מצד המשתמש. @@ -1471,6 +1484,7 @@ אם תגדיר את המדיניות הזו, משתמשים לא יוכלו לשנות או לעקוף אותה. אם המדיניות הזו לא תוגדר, אפשרויות הנגישות לא יופיעו בתפריט מגש המערכת, אבל המשתמש יוכל להציג את אפשרויות הנגישות באמצעות דף ההגדרות.</translation> +<translation id="6766216162565713893">התר לאתרים לבקש מהמשתמש רשות לגשת אל התקן Bluetooth קרוב</translation> <translation id="6770454900105963262">דיווח מידע על הפעלות פעילות של קיוסק</translation> <translation id="6774533686631353488">אפשר מארחי העברת הודעות מקוריים ברמת המשתמש (מותקנים ללא הרשאות ניהול).</translation> <translation id="6786747875388722282">תוספים</translation> @@ -1643,6 +1657,13 @@ <translation id="7340034977315324840">דווח על זמני הפעילות של המכשיר</translation> <translation id="7381326101471547614">משבית את השימוש בפרוטוקול SPDY ב-<ph name="PRODUCT_NAME" />. אם תאפשר מדיניות זו, פרוטוקול SPDY לא יהיה זמין ב-<ph name="PRODUCT_NAME" />. הגדרת מדיניות זו כמושבתת תאפשר את השימוש ב-SPDY. אם לא תוגדר מדיניות זו, SPDY יהיה זמין.</translation> <translation id="7384999953864505698">הפעלה של פרוטוקול QUIC</translation> +<translation id="7406651467768226499">האם להתיר ליישום הקיוסק המופעל באופן אוטומטי ללא השהייה לקבוע את הגירסה של <ph name="PRODUCT_OS_NAME" />. + + המדיניות הזו קובעת אם להתיר ליישום הקיוסק המופעל באופן אוטומטי ללא השהייה לקבוע את הגירסה של <ph name="PRODUCT_OS_NAME" /> על-ידי הצהרה על required_platform_version במניפסט שלו ולהשתמש בכך בתור תחילית גירסת היעד לעדכון אוטומטי. + + אם המדיניות מוגדרת כ-true, הערך של מפתח המניפסט required_platform_version של יישום הקיוסק המופעל באופן אוטומטי ללא השהייה משמש כתחילית גירסת היעד לעדכון אוטומטי. + + אם המדיניות אינה מוגדרת או אם היא מוגדרת כ-false, מפתח המניפסט required_platform_version אינו מובא בחשבון והעדכון האוטומטי ממשיך כרגיל.</translation> <translation id="7417972229667085380">האחוז שלפיו יש לדרג את ההשהיה לפני כניסה למצב לא פעיל במצב מצגת (הוצא משימוש)</translation> <translation id="7421483919690710988">הגדר גודל קובץ שמור של דיסק בבייטיים</translation> <translation id="7424751532654212117">רשימת חריגים לרשימת יישומי הפלאגין המושבתים</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 3671677..fab29bb 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -193,6 +193,13 @@ このポリシーは「DefaultSearchProviderEnabled」ポリシーが有効な場合にのみ適用されます。</translation> <translation id="1859633270756049523">セッションの時間を制限する</translation> +<translation id="1859859319036806634">警告: TLS バージョン フォールバックは、<ph name="PRODUCT_NAME" /> のバージョン 52 で削除され(2016 年 9 月頃)、このポリシーもそれ以降機能しなくなります。 + + TLS ハンドシェイクが失敗すると、<ph name="PRODUCT_NAME" /> ではこれまで HTTPS サーバーでのバグを回避するため、前のバージョンの TLS を使用して接続を再試行していました。この設定では、このフォールバック プロセスを停止するバージョンを指定します。サーバーでバージョン ネゴシエーションが正しく(つまり接続が切断することなく)実行された場合、この設定は適用されません。いずれにしても、確立された接続は SSLVersionMin に準拠していることになります。 + + このポリシーが設定されていないか、「tls1.2」に設定されている場合、<ph name="PRODUCT_NAME" /> でこのフォールバックは実行されなくなります。なお、これは以前の TLS バージョンのサポートを無効にするものではなく、バージョン ネゴシエーションを正しく実行できないサーバーのバグを <ph name="PRODUCT_NAME" /> で回避するかどうかを決めるものです。 + + バグが発生したサーバーとの互換性を維持する必要がある場合は、このポリシーを「tls1.1」に設定します。これは暫定的な措置であり、サーバーのバグは速やかに修正する必要があります。</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> で無効にするプラグインのリストを指定し、ユーザーがこの設定を変更できないようにします。 任意の文字列に一致するワイルドカード文字「*」と「?」を使用できます。「*」は任意の文字数の文字列に一致しますが、「?」は省略可能な 1 文字を示します。つまり、0 または 1 文字に一致します。エスケープ文字は「\」であり、実際の「*」、「?」、「\」文字に一致させるには、これらの文字の前に「\」を指定します。 @@ -528,6 +535,7 @@ TLS ドメイン固定証明書の拡張機能を有効にするかどうかを指定します。 この設定は、テスト目的で TLS ドメイン固定証明書の拡張機能を有効にするために使用されます。この設定は試験運用的なものであり、今後削除される予定です。</translation> +<translation id="2957506574938329824">すべてのサイトに対して Web Bluetooth API による Bluetooth デバイスへのアクセスを許可しない</translation> <translation id="2957513448235202597">「<ph name="HTTP_NEGOTIATE" />」認証用のアカウントの種類</translation> <translation id="2959898425599642200">プロキシ バイパス ルール</translation> <translation id="2960691910306063964">リモート アクセス ホストの PIN 入力なしの認証を有効または無効にする</translation> @@ -541,6 +549,7 @@ ポリシーの値はミリ秒単位で指定してください。画面がオフになるまでの時間(設定している場合)やアイドル時間より長い値は指定できません。</translation> <translation id="2987155890997901449">ARC を有効にする</translation> +<translation id="2987227569419001736">Web Bluetooth API の使用を管理する</translation> <translation id="2998881342848488968">このポリシーでは、<ph name="PRODUCT_OS_NAME" /> がキャプティブ ポータル認証のプロキシをパイパスすることを許可します。 このポリシーは、プロキシが(ポリシーの使用、ユーザーによる chrome://settings の設定、拡張機能などによって)設定されている場合のみ有効となります。 @@ -823,6 +832,7 @@ このポリシーは「DefaultSearchProviderEnabled」ポリシーが有効な場合にのみ適用されます。</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 以降</translation> +<translation id="4322842393287974810">遅延なしで自動開始されるキオスクアプリから <ph name="PRODUCT_OS_NAME" /> のバージョンを制御できるようにする</translation> <translation id="4325690621216251241">システム トレイにログアウト ボタンを追加する</translation> <translation id="4347908978527632940">true に設定した場合、監視対象ユーザーについて、他の Android アプリからコンテンツ プロバイダを介してウェブ制限を問い合わせることができます。 @@ -1414,6 +1424,9 @@ このポリシーが未設定の場合、ログイン画面が表示された時点では画面キーボードが無効になります。ユーザーはいつでも画面キーボードを有効または無効にでき、ユーザーが変わってもログイン画面はその状態のままとなります。</translation> <translation id="6598235178374410284">ユーザーのアバター画像</translation> +<translation id="6628646143828354685">ウェブサイトによる近くの Bluetooth デバイスへのアクセスを許可するかどうかを設定できます。アクセスを完全に禁止することや、ウェブサイトが近くの Bluetooth デバイスにアクセスしてもよいかユーザーにその都度確認することができます。 + + このポリシーが未設定の場合は「3」に設定されます。ユーザーはこの設定を変更できません。</translation> <translation id="6636268606788232221">ユーザーがアイドル状態になったときの電源管理設定を行います。 このポリシーでは、ユーザーがアイドル状態になったときの電源管理の方法に関する複数の設定を管理します。 @@ -1489,6 +1502,7 @@ このポリシーを設定した場合、ユーザーがそれを変更したりオーバーライドしたりすることはできません。 このポリシーが未設定の場合、ユーザー補助オプションはシステム メニューには表示されませんが、ユーザーは [設定] ページからユーザー補助オプションを表示できます。</translation> +<translation id="6766216162565713893">サイトによる近くの Bluetooth デバイスへのアクセスをユーザーに確認する</translation> <translation id="6770454900105963262">有効なキオスク セッションの情報を報告する</translation> <translation id="6774533686631353488">ユーザー レベルのネイティブ メッセージング ホスト(管理者権限なしでインストールされたホスト)を許可する</translation> <translation id="6786747875388722282">拡張機能</translation> @@ -1669,6 +1683,13 @@ このポリシーが未設定の場合、SPDY プロトコルを使用できます。</translation> <translation id="7384999953864505698">QUIC プロトコルを許可する</translation> +<translation id="7406651467768226499">遅延なしで自動開始されるキオスクアプリから <ph name="PRODUCT_OS_NAME" /> のバージョンを制御できるようにするかどうかを設定します。 + + このポリシーでは、マニフェストに required_platform_version を宣言し、それを自動更新対象バージョンの接頭辞として使用することで、遅延なしで自動開始されるキオスクアプリから <ph name="PRODUCT_OS_NAME" /> のバージョンを制御できるようにします。 + + このポリシーが true に設定されている場合は、遅延なしで自動開始されるキオスクアプリの required_platform_version マニフェスト キーの値が、自動更新対象バージョンの接頭辞として使用されます。 + + このポリシーが設定されていないか false に設定されている場合、required_platform_version マニフェスト キーは無視され、自動更新は通常どおりに進められます。</translation> <translation id="7417972229667085380">プレゼンテーション モードでのアイドル時間に掛ける倍率(サポート終了)</translation> <translation id="7421483919690710988">メディア ディスク キャッシュ サイズをバイト単位で設定する</translation> <translation id="7424751532654212117">無効なプラグインのリストに対する例外のリスト</translation>
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index ce48d68..d05188a9 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -185,6 +185,12 @@ 'DefaultSearchProviderEnabled' ನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ ಮಾತ್ರ ಈ ನೀತಿಯನ್ನು ಪರಿಗಣಿಸಲಾಗುವುದು.</translation> <translation id="1859633270756049523">ಸೆಶನ್ ಉದ್ದವನ್ನು ಸೀಮಿತಗೊಳಿಸಿ</translation> +<translation id="1859859319036806634">ಎಚ್ಚರಿಕೆ: ಆವೃತ್ತಿ 52 ನಂತರ <ph name="PRODUCT_NAME" /> ನಿಂದ TLS ಆವೃತ್ತಿ ಫಾಲ್ಬ್ಯಾಕ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ (ಸುಮಾರು ಸೆಪ್ಟೆಂಬರ್ 2016) ಮತ್ತು ಈ ನೀತಿಯು ಅದರ ಮೇಲೆ ಕಾರ್ಯಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ. + + TLS ಹ್ಯಾಂಡ್ಶೇಕ್ ವಿಫಲವಾದಾಗ, HTTPS ಸರ್ವರ್ಗಳಲ್ಲಿನ ಬಗ್ಗಳನ್ನು ನಿವಾರಿಸುವಲ್ಲಿ ಕೆಲಸ ಮಾಡಲು TLS ನ ಲೇಸರ್ ಆವೃತ್ತಿಯ ಮೂಲಕ <ph name="PRODUCT_NAME" /> ಈ ಹಿಂದಿನ ಸಂಪರ್ಕವನ್ನು ಮರುಪ್ರಯತ್ನಿಸುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆಯು ನಿಲ್ಲಿಸುವಂತಹ ಆವೃತ್ತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ. ಸರ್ವರ್ ಸರಿಯಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸುವ ಆವೃತ್ತಿಯನ್ನು ನಿರ್ವಹಿಸಿದಲ್ಲಿ (ಅಂದರೆ ಸಂಪರ್ಕದ ಅಡಚಣೆಯಿಲ್ಲದೆ) ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ವಯವಾಗುವುದಿಲ್ಲ. ಇದನ್ನು ಹೊರತುಪಡಿಸಿ, ಫಲಿತಾಂಶ ಸಂಪರ್ಕವು SSLVersionMin ಜೊತೆಗೆ ಅನುಸರಣೆ ಹೊಂದಿರಬೇಕು. + ಈ ನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ ಅಥವಾ ಅದನ್ನು "tls1.2" ಗೆ ಹೊಂದಿಸಿದ್ದರೆ <ph name="PRODUCT_NAME" /> ಇನ್ನು ಮುಂದೆ ಈ ಫಾಲ್ಬ್ಯಾಕ್ ಕುರಿತು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ. ಇದು ಹಳೆಯ TLS ಆವೃತ್ತಿಗಳಿಗೆ ಬೆಂಬಲವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನದಲ್ಲಿರಿಸಿಕೊಳ್ಳಿ, <ph name="PRODUCT_NAME" /> ಮಾತ್ರ ಸರಿಯಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸದ ಆವೃತ್ತಿಗಳಲ್ಲಿ ದೋಷ ಸರ್ವರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ. + + ಇಲ್ಲವಾದರೆ, ದೋಷಯುಕ್ತ ಸರ್ವರ್ಗೆ ಹೊಂದಾಣಿಕೆ ಮಾಡಿದಲ್ಲಿ ನಿರ್ವಹಿಸಬೇಕಾಗುವದು, ಈ ನೀತಿಯನ್ನು "tls1.1" ಗೆ ಹೊಂದಿಸಬಹುದು. ಇದು ಸ್ಟಾಪ್ಗ್ಯಾಪ್ ಕ್ರಮವಾಗಿದೆ ಮತ್ತು ಸರ್ವರ್ ಅನ್ನು ವೇಗವಾಗಿ ಅಳವಡಿಸಬೇಕಾಗಿರುತ್ತದೆ.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾದ ಪ್ಲಗಿನ್ಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ ಮತ್ತು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸುವುದರಿಂದ ಬಳಕೆದಾರರನ್ನು ತಡೆಯುತ್ತದೆ. ಅನಿಯಂತ್ರಿತ ಅಕ್ಷರಗಳ ಸರಣಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಲು ವೈಲ್ಡ್ಕಾರ್ಡ್ ಅಕ್ಷರಗಳಾದ '*' ಮತ್ತು '?' ಅನ್ನು ಬಳಸಬಹುದಾಗಿದೆ. '*' ಅನಿಯಂತ್ರಿತ ಅಕ್ಷರಗಳ ಸಂಖ್ಯೆಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತದೆ ಅದೇ ಸಮಯದಲ್ಲಿ '?' ಐಚ್ಖಿಕ ಒಂದು ಅಕ್ಷರವನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ, ಅಂದರೆ ಸೊನ್ನೆ ಅಥವಾ ಒಂದು ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡುತ್ತದೆ. ಎಸ್ಕೇಪ್ ಅಕ್ಷರವು '\' ಆಗಿದೆ, ಇದರಿಂದಾಗಿ ನೈಜವಾದ '*', '?', ಅಥವಾ '\' ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಲು, ಅದರ ಮುಂದೆ ನೀವು '\' ಅನ್ನು ಹಾಕಬಹುದು. @@ -528,6 +534,7 @@ TLS ಡೊಮೇನ್-ಪರಿಧಿ ಪ್ರಮಾಣಪತ್ರಗಳ ವಿಸ್ತರಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕೇ ಎಂಬುದನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. ಪರೀಕ್ಷಿಸುವ ಸಲುವಾಗಿ TLS ಡೊಮೇನ್-ಪರಿಧಿ ಪ್ರಮಾಣಪತ್ರಗಳ ವಿಸ್ತರಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಈ ಪ್ರಾಯೋಗಿಕ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಭವಿಷ್ಯದಲ್ಲಿ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.</translation> +<translation id="2957506574938329824">Web Bluetooth API ಮೂಲಕ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶ ವಿನಂತಿಸಲು ಯಾವುದೇ ಸೈಟ್ ಅನ್ನು ಅನುಮತಿಸಬೇಡಿ</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಖಾತೆ ಪ್ರಕಾರ</translation> <translation id="2959898425599642200">ಪ್ರಾಕ್ಸಿ ಬೈಪಾಸ್ ನಿಯಮಗಳು</translation> <translation id="2960691910306063964">ರಿಮೋಟ್ ಪ್ರವೇಶ ಹೋಸ್ಟ್ಗಳಿಗೆ ಪಿನ್ ರಹಿತ ದೃಢೀಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -540,6 +547,7 @@ ನೀತಿ ಮೌಲ್ಯವನ್ನು ಮಿಲಿಸೆಕುಂಡುಗಳಲ್ಲಿ ಹೊಂದಿಸಬೇಕು. ಪರದೆ ಆಫ್ ವಿಳಂಬ ಮತ್ತು (ಹೊಂದಿಸಿದ್ದರೆ) ನಿಷ್ಪಲ ವಿಳಂಬಕ್ಕಿಂತ ಕಡಿಮೆಗೆ ಅಥವಾ ಸಮನಾಗಿ ಮೌಲ್ಯಗಳನ್ನು ಬಂಧಿಸಲಾಗುವುದು.</translation> <translation id="2987155890997901449">ARC ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> +<translation id="2987227569419001736">Web Bluetooth API ನ ನಿಯಂತ್ರಣ ಬಳಕೆ</translation> <translation id="2998881342848488968">ಕ್ಯಾಪ್ಟಿವ್ ಅಥವಾ ಪೋರ್ಟಲ್ ಪ್ರಮಾಣೀಕರಣಕ್ಕೆ ಯಾವುದೇ ಪ್ರಾಕ್ಸಿಯನ್ನು ಬೈಪಾಸ್ ಮಾಡಲು ಈ ನೀತಿಯು <ph name="PRODUCT_OS_NAME" /> ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಈ ಪ್ರಾಕ್ಸಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದ್ದರೆ ಮಾತ್ರ ಈ ನೀತಿಯು ಕಾರ್ಯಗತಗೊಳ್ಳುತ್ತದೆ (ನೀತಿ ಮೂಲಕ ಉದಾಹರಣೆಗೆ, chrome://settings ನಲ್ಲಿ ಬಳಕೆದಾರರಿಂದ ಅಥವಾ ವಿಸ್ತರಣೆಗಳಿಂದ). @@ -830,6 +838,7 @@ 'DefaultSearchProviderEnabled' ನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ ಮಾತ್ರ ಈ ನೀತಿಯನ್ನು ಪರಿಗಣಿಸಲಾಗುವುದು.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 ಅಥವಾ ನಂತರದ್ದು</translation> +<translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> ಆವೃತ್ತಿಯನ್ನು ನಿಯಂತ್ರಿಸಲು ಸ್ವಯಂ ಪ್ರಾರಂಭಗೊಂಡ ಶೂನ್ಯ ವಿಳಂಬದ ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸಿ</translation> <translation id="4325690621216251241">ಸಿಸ್ಟಂ ಟ್ರೇ ಗೆ ಲಾಗ್ಔಟ್ ಬಟನ್ ಅನ್ನು ಸೇರಿಸಿ</translation> <translation id="4347908978527632940">ನಿಜವಾಗಿದ್ದರೆ ಮತ್ತು ಬಳಕೆದಾರರು ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರಾಗಿದ್ದರೆ ವಿಷಯ ಒದಗಿಸುವವರ ಮೂಲಕ ಬಳಕೆದಾರರ ವೆಬ್ ನಿಯಂತ್ರಣಗಳನ್ನು Android ಅಪ್ಲಿಕೇಶನ್ಗಳು ಪ್ರಶ್ನೆಮಾಡಬಹುದು. @@ -1417,6 +1426,9 @@ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟಲ್ಲಿ, ಲಾಗಿನ್ ಪರದೆಯನ್ನು ಮೊದಲ ಬಾರಿ ತೋರಿಸುವಾಗ ಆನ್-ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ನಿಷ್ರಿಯಗೊಳ್ಳುತ್ತದೆ. ಬಳಕೆದಾರರು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಆನ್-ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು ಮತ್ತು ಅದರ ಲಾಗಿನ್ ಪರದೆಯ ಸ್ಥಿತಿಯು ಬಳಕೆದಾರರ ನಡುವೆ ಮುಂದುವರಿಯುತ್ತದೆ.</translation> <translation id="6598235178374410284">ಬಳಕೆದಾರರ ಅವತಾರ್ ಚಿತ್ರ</translation> +<translation id="6628646143828354685">ಹತ್ತಿರದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆಯಲು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಹೊಂದಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಪ್ರವೇಶವನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ನಿರ್ಬಂಧಿಸಬಹುದು ಅಥವಾ ಬಳಕೆದಾರರು ಹತ್ತಿರದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆಯಲು ಪ್ರತಿ ಬಾರಿಯೂ ಕೇಳಬಹುದು. + + ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಇದ್ದಲ್ಲಿ, '3' ಬಳಸಲಾಗುತ್ತದೆ, ಮತ್ತು ಅದನ್ನು ಬಳಕೆದಾರರಿಗೆ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation> <translation id="6636268606788232221">ಬಳಕೆದಾರರು ತಟಸ್ಥವಾದಾಗ ಪವರ್ ನಿರ್ವಹಣೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ. ಬಳಕೆದಾರರು ತಟಸ್ಥವಾದಾಗ ಪವರ್ ನಿರ್ವಹಣೆ ಕಾರ್ಯತಂತ್ರಕ್ಕಾಗಿ ಈ ನೀತಿಯು ಬಹು ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ. @@ -1515,6 +1527,7 @@ ಈ ನೀತಿಗಳನ್ನು ನೀವು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರಿಗೆ ಅದನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಹಾಗೆ ಬಿಟ್ಟರೆ, ಪ್ರವೇಶಿಸುವಿಕೆ ಆಯ್ಕೆಗಳು ಸಿಸ್ಟಮ್ ಟ್ರೇ ಮೆನುವಿನಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ, ಆದರೆ ಸೆಟ್ಟಿಂಗ್ ಪುಟದ ಮೂಲಕ ಪ್ರವೇಶಿಸುವಿಕೆ ಆಯ್ಕೆಗಳು ಗೋಚರಿಸುವಂತೆ ಬಳಕೆದಾರರು ಮಾಡಬಹುದಾಗಿರುತ್ತದೆ.</translation> +<translation id="6766216162565713893">ಹತ್ತಿರದ ಬ್ಲೂಟೂತ್ ಸಾಧನಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲು ಬಳಕೆದಾರರನ್ನು ಕೇಳಲು ಸೈಟ್ಗಳನ್ನು ಅನುಮತಿಸಿ</translation> <translation id="6770454900105963262">ಸಕ್ರಿಯ ಕಿಯೋಸ್ಕ್ ಸೆಷನ್ಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ವರದಿ ಮಾಡಿ</translation> <translation id="6774533686631353488">ಬಳಕೆದಾರರ ಮಟ್ಟದ ಸ್ಥಳೀಯ ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಹೋಸ್ಟ್ಗಳನ್ನು ಅನುಮತಿಸು (ನಿರ್ವಾಹಕರ ಅನುಮತಿ ಇಲ್ಲದೆ ಸ್ಥಾಪಿಸಲಾಗಿರುವುದು).</translation> <translation id="6786747875388722282">ವಿಸ್ತರಣೆಗಳು</translation> @@ -1688,6 +1701,13 @@ <translation id="7340034977315324840">ಸಾಧನ ಚಟುವಟಿಕೆಯ ಸಮಯವನ್ನು ವರದಿಮಾಡಿ</translation> <translation id="7381326101471547614"><ph name="PRODUCT_NAME" /> SPDY ಪ್ರೋಟೊಕಾಲ್ನ ಬಳಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ ಈ ನೀತಿಯನ್ನು SPDY ಪ್ರೋಟೊಕಾಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸದಿದ್ದರೆ <ph name="PRODUCT_NAME" /> ರಲ್ಲಿ ಲಭ್ಯವಿರುವುದಿಲ್ಲ. ಈ ನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿರುವುದಕ್ಕೆ ಹೊಂದಿಸುವ ಮೂಲಕ SPDY ನ ಬಳಕೆಯನ್ನು ಅನುಮತಿಸುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, SPDY ಲಭ್ಯವಾಗುತ್ತದೆ.</translation> <translation id="7384999953864505698">QUIC ಪ್ರೊಟೋಕಾಲ್ ಅನುಮತಿಸುತ್ತದೆ</translation> +<translation id="7406651467768226499"><ph name="PRODUCT_OS_NAME" /> ಆವೃತ್ತಿಯನ್ನು ನಿಯಂತ್ರಿಸಲು ಸ್ವಯಂ ಪ್ರಾರಂಭಗೊಂಡ ಶೂನ್ಯ ವಿಳಂಬದ ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುವುದೇ. + + ತನ್ನ ಮ್ಯಾನಿಫೆಸ್ಟ್ನಲ್ಲಿ required_platform_version ಘೋಷಿಸುವ ಮೂಲಕ ಮತ್ತು ಅದನ್ನು ಸ್ವಯಂ ಅಪ್ಡೇಟ್ ಗುರಿಯ ಆವೃತ್ತಿಯ ಪೂರ್ವಪ್ರತ್ಯಯವಾಗಿ ಬಳಸುವ ಮೂಲಕ <ph name="PRODUCT_OS_NAME" /> ಆವೃತ್ತಿಯನ್ನು ನಿಯಂತ್ರಿಸಲು ಸ್ವಯಂ ಪ್ರಾರಂಭಗೊಂಡ ಶೂನ್ಯ ವಿಳಂಬದ ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸಬೇಕೇ ಎಂಬುದನ್ನು ಈ ನೀತಿಯು ನಿಯಂತ್ರಿಸುತ್ತದೆ. + + ನೀತಿಯನ್ನು ಸರಿ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ, ಸ್ವಯಂ ಪ್ರಾರಂಭಗೊಂಡ ಶೂನ್ಯ ವಿಳಂಬದ ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ನ ಮ್ಯಾನಿಫೆಸ್ಟ್ ಕೀ ಅನ್ನು ಸ್ವಯಂ ಅಪ್ಡೇಟ್ ಗುರಿ ಆವೃತ್ತಿ ಪೂರ್ವಪ್ರತ್ಯಯವಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ. + + ನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದೇ ಇದ್ದರೆ ಅಥವಾ ತಪ್ಪು ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ, required_platform_version ಮ್ಯಾನಿಫೆಸ್ಟ್ ಕೀ ಅನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಸಾಮಾನ್ಯದಂತೆ ಸ್ವಯಂ ಅಪ್ಡೇಟ್ ಮುಂದುವರಿಯುತ್ತದೆ.</translation> <translation id="7417972229667085380">ಪ್ರಸ್ತುತಿ ಮೋಡ್ನಲ್ಲಿರುವಾಗ ನಿಷ್ಫಲ ವಿಳಂಬ ಅಳತೆಯನ್ನು ಅವಲಂಬಿಸಿ ಶೇಕಡಾವಾರು (ಅಸಮ್ಮತಿಸಲಾಗಿದೆ)</translation> <translation id="7421483919690710988">ಮಾಧ್ಯಮ ಡಿಸ್ಕ್ ಸಂಗ್ರಹ ಗಾತ್ರವನ್ನು ಬೈಟ್ಗಳಲ್ಲಿ ಹೊಂದಿಸಿ</translation> <translation id="7424751532654212117">ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾದ ಪ್ಲಗಿನ್ಗಳ ಪಟ್ಟಿಗೆ ವಿನಾಯಿತಿಗಳ ಪಟ್ಟಿ</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 02e95a1..2acfd54 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -209,6 +209,13 @@ 이 정책은 'DefaultSearchProviderEnabled' 정책을 사용하도록 설정한 경우에만 적용됩니다.</translation> <translation id="1859633270756049523">세션 길이 제한</translation> +<translation id="1859859319036806634">경고: TLS 버전 대체 수단이 2016년 9월경 버전 52 이후부터 <ph name="PRODUCT_NAME" />에서 삭제되며 그 이후부터 이 정책이 작동 중지됩니다. + + TLS 핸드셰이크에 실패하면 <ph name="PRODUCT_NAME" />에서 HTTPS 서버의 버그를 해결하기 위해 먼저 이전 버전의 TLS에 연결하기 위해 다시 시도합니다. 이 설정은 해당 대체 프로세스를 중지할 버전을 설정합니다. 서버에서 버전 협상을 올바르게 실행하면(즉, 연결을 끊지 않고 실행) 설정이 적용되지 않습니다. 이와 관계없이 최종 연결은 반드시 SSLVersionMin을 준수해야 합니다. + + 이 정책이 설정되어 있지 않거나 'tls1.2'로 설정된 경우 <ph name="PRODUCT_NAME" />에서 더 이상 이 대체 프로세스를 수행하지 않습니다. 이 경우에도 오래된 TLS 버전 지원이 중단되지 않으며, 버전을 올바르게 협상하지 못하는 버그가 있는 서버 문제를 <ph name="PRODUCT_NAME" />에서 해결할 것인지만 결정합니다. + + 버그가 발생한 서버와의 호환성이 유지되어야 하는 경우 이 정책을 'tls1.1'로 설정해야 합니다. 이는 임시 조치이며 신속하게 서버 문제를 해결해야 합니다.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" />에서 사용 중지되는 플러그인 목록을 지정하고 사용자가 이 설정을 변경하지 못하게 합니다. 와일드카드 문자('*' 및 '?')를 사용하여 일련의 임의 문자를 비교할 수 있습니다. '*'는 임의의 여러 문자와 일치하며 '?'는 선택적인 단일 문자를 지정합니다(즉, 일치하는 문자가 없거나 한 글자와 일치시킴). 실제 '*', '?' 또는 '\' 문자를 비교할 때는 이스케이프 문자인 '\'자를 이러한 문자 앞에 배치하여 사용합니다. @@ -594,6 +601,7 @@ TLS 도메인 바인딩 인증서 확장 프로그램 사용 설정 여부를 지정합니다. 이 설정은 TLS 도메인 바인딩 인증서를 테스트용으로 설정하는 데 사용됩니다. 이 실험적 설정은 향후 삭제됩니다.</translation> +<translation id="2957506574938329824">모든 사이트에서 Web Bluetooth API를 통해 블루투스 기기에 대한 액세스를 요청하도록 허용하지 않습니다.</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> 인증의 계정 유형</translation> <translation id="2959898425599642200">프록시 우회 규칙</translation> <translation id="2960691910306063964">원격 액세스 호스트에서 PIN을 사용하지 않는 인증을 사용 또는 사용 중지합니다.</translation> @@ -607,6 +615,7 @@ 정책 값은 밀리초 단위로 지정해야 하며, 화면 꺼짐 지연 시간(설정된 경우) 및 유휴 지연 시간보다 작거나 같도록 값이 잘립니다.</translation> <translation id="2987155890997901449">ARC 사용</translation> +<translation id="2987227569419001736">Web Bluetooth API 사용 조정</translation> <translation id="2998881342848488968">이 정책을 사용하면 <ph name="PRODUCT_OS_NAME" />이(가) 캡티브 포털 인증을 위해 프록시를 우회할 수 있습니다. 이 정책은 프록시를 설정(예: 정책을 통해, chrome://settings에서 사용자에 의해, 확장 프로그램에 의해 설정)하는 경우에만 적용됩니다. @@ -924,6 +933,7 @@ 이 정책은 'DefaultSearchProviderEnabled' 정책을 사용하도록 설정된 경우에만 적용됩니다.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 이상</translation> +<translation id="4322842393287974810">지연 없이 자동 실행된 키오스크 앱에서 <ph name="PRODUCT_OS_NAME" /> 버전을 제어하도록 허용합니다.</translation> <translation id="4325690621216251241">작업 표시줄에 로그아웃 버튼 추가</translation> <translation id="4347908978527632940">true로 설정되어 있고 사용자가 관리 대상 사용자인 경우 다른 Android 앱에서 콘텐츠 제공업체를 통해 사용자의 웹 제한사항을 검색할 수 있습니다. @@ -1600,6 +1610,9 @@ 이 정책을 설정하지 않으면 로그인 화면이 처음 표시될 때 터치 키보드가 사용 중지됩니다. 사용자는 언제든지 터치 키보드를 사용 설정 또는 사용 중지할 수 있으며 로그인 화면에서의 상태가 사용자별로 유지됩니다.</translation> <translation id="6598235178374410284">사용자 아바타 이미지</translation> +<translation id="6628646143828354685">근처 블루투스 기기에 대한 웹사이트의 액세스 허용 여부를 설정할 수 있습니다. 액세스를 완전히 차단하거나 웹사이트에서 근처 블루투스 기기에 액세스하려고 할 때마다 사용자에게 확인을 요청할 수 있습니다. + + 이 정책을 설정하지 않으면 '3'으로 설정되며 사용자가 변경할 수 있습니다.</translation> <translation id="6636268606788232221">사용자가 유휴 상태가 될 때 전원 관리를 설정합니다. 이 정책은 사용자가 유휴 상태가 될 때 전원 관리 전략을 위한 여러 설정을 관리합니다. @@ -1692,6 +1705,7 @@ 이 정책을 설정하면 사용자는 변경하거나 재정의할 수 없습니다. 이 정책을 설정하지 않으면 작업 표시줄 메뉴에 접근성 옵션이 표시되지 않지만 사용자가 설정 페이지에서 접근성 옵션을 표시하도록 설정할 수 있습니다.</translation> +<translation id="6766216162565713893">사이트에서 사용자에게 근처 블루투스 기기에 대한 액세스 권한을 부여할 것인지 묻도록 허용합니다.</translation> <translation id="6770454900105963262">활성 키오스크 세션에 관한 정보 보고</translation> <translation id="6774533686631353488">사용자 수준 기본 메시지 호스트를 허용합니다(관리자 권한 없이 설치됨).</translation> <translation id="6786747875388722282">확장 프로그램</translation> @@ -1888,6 +1902,13 @@ 이 정책을 설정하지 않으면 SPDY를 사용할 수 있습니다.</translation> <translation id="7384999953864505698">QUIC 프로토콜 허용</translation> +<translation id="7406651467768226499">지연 없이 자동 실행된 키오스크 앱에서 <ph name="PRODUCT_OS_NAME" /> 버전을 제어하도록 허용할지 여부 + + 이 정책은 매니페스트에서 required_platform_version을 선언하여 지연 없이 자동 실행된 키오스크 앱이 <ph name="PRODUCT_OS_NAME" /> 버전을 제어하도록 하고 자동 업데이트 타겟 버전 프리픽스로 사용할지 여부를 관리합니다. + + 이 정책이 true로 설정되면 지연 없이 자동 실행된 키오스크 앱의 required_platform_version 매니페스트 키의 값이 자동 업데이트 타겟 버전 프리픽스로 사용됩니다. + + 정책이 설정되지 않거나 false로 설정되면 required_platform_version 매니페스트 키가 무시되고 자동 업데이트가 평소대로 진행됩니다.</translation> <translation id="7417972229667085380">프레젠테이션 모드에서 유휴 지연 시간이 조정되는 비율(지원 중단됨)</translation> <translation id="7421483919690710988">미디어 디스크 캐시 크기 설정(바이트)</translation> <translation id="7424751532654212117">사용 중지된 플러그인 목록에 대한 예외 목록</translation>
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index 365df9c..7d242d6 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -209,6 +209,13 @@ Šios politikos laikomasi, tik jei įgalinta politika „DefaultSearchProviderEnabled“.</translation> <translation id="1859633270756049523">Apriboti sesijos trukmę</translation> +<translation id="1859859319036806634">Įspėjimas: atsarginės TLS versijos naudojimas bus pašalintas iš „<ph name="PRODUCT_NAME" />“ įdiegus 52 versiją (maždaug 2016 m. rugsėjo mėn.), tada ši politika nustos veikti. + + Įvykus TLS išankstinio suderinimo klaidai, „<ph name="PRODUCT_NAME" />“ anksčiau iš naujo bandydavo užmegzti ryšį su senesnės versijos TLS, kad išvengtų riktų HTTPS serveriuose. Nustačius šį nustatymą konfigūruojama versija, kurią pasiekus šis surogato procesas bus sustabdytas. Jei serveris tinkamai suderina versiją (t. y. nenutraukdamas ryšio), šis nustatymas netaikomas. Nepaisant to, užmegztas ryšys vis tiek turi atitikti „SSLVersionMin“. + + Jei ši politika nesukonfigūruota arba nustatyta į „tls1.2“, tada „<ph name="PRODUCT_NAME" />“ nebevykdo šio surogato proceso. Atminkite, kad neišjungiamas ankstesnių TLS versijų palaikymas, tik nustatoma, ar „<ph name="PRODUCT_NAME" />“ pašalins serverių, kurie negali tinkamai suderinti versijų, riktus. + + Kitu atveju, jei reikia išlaikyti suderinamumą su serveriu, kuriame yra riktų, šią politiką galima nustatyti į „tls1.1“. Tai laikina priemonė; serverį reikia greitai sutvarkyti.</translation> <translation id="1861037019115362154">Nurodomas „<ph name="PRODUCT_NAME" />“ neleidžiamų papildinių sąrašas ir naudotojams šio nustatymo keisti neleidžiama. Kad įrašai atitiktų atsitiktinių simbolių sekas, galima naudoti pakaitos simbolius „*“ ir „?“. „*“ atitinka atsitiktinį simbolių skaičių, o „?“ nurodo vieną pasirinktinį simbolį, t. y. atitinka nulio arba vieneto simbolį. Kaitos simbolis yra „\“, todėl, kad simboliai atitiktų faktinius „*“, „?“ arba „\“ simbolius, prieš juos galite įvesti „\“. @@ -596,6 +603,7 @@ Nurodoma, ar TLS domeno sertifikatų plėtinys turėtų būti įgalintas. Šis nustatymas naudojamas TLS domeno sertifikatų plėtiniui įgalinti bandymo tikslais. Ateityje šis eksperimentinis nustatymas bus pašalintas.</translation> +<translation id="2957506574938329824">Neleisti jokiai svetainei pateikti užklausos pasiekti „Bluetooth“ įrenginių naudojant „Web Bluetooth“ API</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> autentifikavimo paskyros tipas</translation> <translation id="2959898425599642200">Tarpinio serverio apėjimo taisyklės</translation> <translation id="2960691910306063964">Nuotolinės prieigos prieglobų autentifikavimo be PIN kodo įjungimas arba išjungimas</translation> @@ -609,6 +617,7 @@ Politikos vertė turėtų būti nurodyta milisekundėmis. Vertės sumažinamos, kad neviršytų ekrano išjungimo delsos laiko (jei jis nustatytas) ar neveikos delsos laiko arba būtų jam lygios.</translation> <translation id="2987155890997901449">ARC įgalinimas</translation> +<translation id="2987227569419001736">Valdyti „Web Bluetooth“ API naudojimą</translation> <translation id="2998881342848488968">Įgalinus šią politiką „<ph name="PRODUCT_OS_NAME" />“ gali apeiti fiksuotojo portalo autentifikavimo tarpinį serverį. Ši politika taikoma, tik jei sukonfigūruotas tarpinis serveris (pvz., kai naudotojas pakeičia politiką apsilankęs adresu chrome://settings arba kai tai atlieka plėtiniai). @@ -932,6 +941,7 @@ Šios politikos laikomasi, tik jei įgalinta politika „DefaultSearchProviderEnabled“.</translation> <translation id="4320376026953250541">„Microsoft Windows XP“ SP2 arba naujesnė versija</translation> +<translation id="4322842393287974810">Leisti automatiškai be delsos paleistai viešojo terminalo programai valdyti „<ph name="PRODUCT_OS_NAME" />“ versiją</translation> <translation id="4325690621216251241">Pridėti atsijungimo mygtuką prie sistemos dėklo</translation> <translation id="4347908978527632940">Jei nustatyta „true“ ir naudotojas yra prižiūrimas naudotojas, tada kitos „Android“ programos gali teikti naudotojo žiniatinklio apribojimų užklausas per turinio teikėją. @@ -1610,6 +1620,9 @@ Jei ši politika nenustatyta, ekrano klaviatūra išjungiama, kai prisijungimo ekranas parodomas pirmą kartą. Naudotojai gali įgalinti arba išjungti ekrano klaviatūrą bet kuriuo metu. Ekrano klaviatūros būsena prisijungimo ekrane yra nuolatinė visiems naudotojams.</translation> <translation id="6598235178374410284">Naudotojo pseudoportreto vaizdas</translation> +<translation id="6628646143828354685">Galite nustatyti, ar svetainės gali pasiekti netoliese esančius „Bluetooth“ įrenginius. Galimybę pasiekti įrenginius galima visiškai užblokuoti arba naudotojo gali būti paklausta kiekvieną kartą, kai svetainė nori pasiekti netoliese esančius „Bluetooth“ įrenginius. + + Jei ši politika nenustatyta, bus naudojama vertė „3“ ir naudotojas galės ją pakeisti.</translation> <translation id="6636268606788232221">Maitinimo valdymo nustatymų, kai naudotojas tampa neaktyvus, konfigūravimas. Ši politika valdo kelis maitinimo valdymo strategijos, kai naudotojas tampa neaktyvus, nustatymus. @@ -1702,6 +1715,7 @@ Jei nustatysite šią politiką, naudotojai negalės jos pakeisti ar nepaisyti. Jei ši politika nenustatyta, pasiekiamumo parinktys nebus rodomos sistemos dėklo meniu, bet „Nustatymų“ puslapyje naudotojas galės nustatyti, kad pasiekiamumo parinktys būtų rodomos.</translation> +<translation id="6766216162565713893">Leisti svetainėms prašyti naudotojo suteikti leidimą pasiekti netoliese esantį „Bluetooth“ įrenginį</translation> <translation id="6770454900105963262">Informacijos apie aktyvias viešojo terminalo sesijas ataskaitos pateikimas</translation> <translation id="6774533686631353488">Leisti savosios susirašinėjimo pranešimais programos prieglobą naudotojo lygiu (įdiegiama be administratoriaus leidimo).</translation> <translation id="6786747875388722282">Plėtiniai</translation> @@ -1899,6 +1913,13 @@ Jei politika palikta nenustatyta, SPDY bus galima naudoti.</translation> <translation id="7384999953864505698">Leidžiamas protokolas QUIC</translation> +<translation id="7406651467768226499">Ar automatiškai be delsos paleistai viešojo terminalo programai bus leidžiama valdyti „<ph name="PRODUCT_OS_NAME" />“ versiją. + + Ši politika valdo, ar automatiškai be delsos paleistai viešojo terminalo programai bus leidžiama valdyti „<ph name="PRODUCT_OS_NAME" />“ versiją (jos apraše nurodžius required_platform_version) ir ją naudoti, kaip automatinio naujinio tikslinės versijos priešdėlį. + + Jei politika nustatyta į „true“, automatiškai be delsos paleistos viešojo terminalo programos aprašo rakto „required_platform_version“ vertė naudojama kaip automatinio naujinio tikslinės versijos priešdėlis. + + Jei politika nesukonfigūruota arba nustatyta į „false“, aprašo raktos required_platform_version nepaisoma ir automatinis atnaujinimas tęsiamas kaip įprasta.</translation> <translation id="7417972229667085380">Procentas, pagal kurį bus keičiamas neveikos delsos mastelis dirbant pristatymo režimu (nebenaudojama)</translation> <translation id="7421483919690710988">Nustatyti medijos disko talpyklos dydį baitais</translation> <translation id="7424751532654212117">Neleidžiamų papildinių sąrašo išimčių sąrašas</translation>
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb index b84e0a9..e354d17c 100644 --- a/components/policy/resources/policy_templates_lv.xtb +++ b/components/policy/resources/policy_templates_lv.xtb
@@ -209,6 +209,13 @@ Šī politika ir spēkā tikai tad, ja ir iespējota politika “DefaultSearchProviderEnabled”.</translation> <translation id="1859633270756049523">Sesijas ilguma ierobežošana</translation> +<translation id="1859859319036806634">Brīdinājums: TLS versijas atkāpšanās protokols tiks noņemts no pārlūka <ph name="PRODUCT_NAME" /> pēc 52. versijas izlaišanas (ap 2016. gada septembri), un pēc tam šī politika vairs nedarbosies. + + Ja neizdodas izveidot TLS savienojumu, iepriekš <ph name="PRODUCT_NAME" /> mēģinātu atkārtoti izveidot savienojumu ar vecāku TLS versiju, lai apietu kļūdas HTTPS serveros. Ar šo iestatījumu tiek konfigurēta versija, kurā tiks pārtraukts šis atkāpšanās process. Ja serverī tiek pareizi veikta versiju saskaņošana (proti, nepārtraucot savienojumu), šis iestatījums netiek izmantots. Neatkarīgi no šī iestatījuma izveidotajam savienojumam joprojām ir jāatbilst politikai SSLVersionMin. + + Ja šī politika nav konfigurēta vai ir iestatīta uz “tls1.2”, pārlūkā <ph name="PRODUCT_NAME" /> vairs netiek veikts šis atkāpšanās process. Ņemiet vērā, ka šādi netiek atspējots vecāku TLS versiju atbalsts, bet tikai tas, vai <ph name="PRODUCT_NAME" /> apies kļūdainos serverus, kuri nevar pareizi saskaņot versijas. + + Pretējā gadījumā, ja ir jāuztur saderība ar kļūdainu serveri, šo politiku var iestatīt uz “tls1.1”. Tas ir pagaidu risinājums, un serveris ir steidzami jālabo.</translation> <translation id="1861037019115362154">Norāda atspējoto spraudņu sarakstu pārlūkā <ph name="PRODUCT_NAME" /> un neļauj lietotājiem mainīt šo iestatījumu. Var lietot aizstājējzīmes “*” un “?”, lai aizstātu dažādas rakstzīmes. Rakstzīme “*” atbilst vairāku rakstzīmju virknei, bet rakstzīme “?” var norādīt vienu noteiktu rakstzīmi, t.i., var atbilst vienai rakstzīmei vai neatbilst nevienai. Atsoļa rakstzīme ir “\”, tādējādi, lai veidotu atbilstību faktiskajām rakstzīmēm “*”, “?” un “\”, pirms tām jāievieto rakstzīme “\”. @@ -597,6 +604,7 @@ Norāda, vai jāiespējo TLS domēnam piesaistītais sertifikātu paplašinājums. Šis iestatījums tiek izmantots, lai testēšanai iespējotu TLS domēnam piesaistītos sertifikātu paplašinājumus. Šis eksperimentālais iestatījums vēlāk tiks noņemts.</translation> +<translation id="2957506574938329824">Neatļaut neviena vietnei pieprasīt piekļuvi Bluetooth ierīcēm, izmantojot Web Bluetooth API</translation> <translation id="2957513448235202597">Konta veids <ph name="HTTP_NEGOTIATE" /> autentifikācijas saskaņošanai</translation> <translation id="2959898425599642200">Starpniekserveru apiešanas kārtulas</translation> <translation id="2960691910306063964">Autentifikācijas bez PIN iespējošana vai atspējošana attālās piekļuves saimniekdatoriem</translation> @@ -610,6 +618,7 @@ Politikas vērtību nedrīkst norādīt milisekundēs. Ir jānorāda vērtības, kas ir mazākas par aizkavi līdz ekrāna izslēgšanai (ja tāda ir iestatīta) un dīkstāvei vai kas ir vienādas ar to.</translation> <translation id="2987155890997901449">ARC iespējošana</translation> +<translation id="2987227569419001736">Web Bluetooth API lietošanas pārvaldība</translation> <translation id="2998881342848488968">Šī politika ļauj operētājsistēmai <ph name="PRODUCT_OS_NAME" /> apiet visus caurlaides lapu autentifikācijas starpniekserverus. Šī politika ir spēkā tikai tad, ja ir konfigurēts starpniekserveris (piemēram, izmantojot politiku, lietotāja iestatījumus lapā chrome://settings vai paplašinājumus). @@ -931,6 +940,7 @@ Šī politika ir spēkā tikai tad, ja ir iespējota politika “DefaultSearchProviderEnabled”.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 vai jaunāka versija</translation> +<translation id="4322842393287974810">Atļaut kioska lietotnei, kas tiek automātiski palaista ar nulles aizkavi, kontrolēt <ph name="PRODUCT_OS_NAME" /> versiju</translation> <translation id="4325690621216251241">Atteikšanās pogas pievienošana sistēmas teknei</translation> <translation id="4347908978527632940">Ja ir iestatīta vērtība “true” un lietotājs ir uzraudzīts lietotājs, citas Android lietotnes var nosūtīt vaicājumus par lietotāja tīmekļa ierobežojumiem, izmantojot satura nodrošinātāju. @@ -1605,6 +1615,9 @@ Ja šī politika netiek iestatīta, ekrāna tastatūra ir atspējota, pirmoreiz atverot pieteikšanās ekrānu. Lietotāji jebkurā laikā var iespējot vai atspējot ekrāna tastatūru, un tastatūras statuss pieteikšanās ekrānā tiek saglabāts arī citiem lietotājiem.</translation> <translation id="6598235178374410284">Lietotāja iemiesojuma attēls</translation> +<translation id="6628646143828354685">Ļauj iestatīt, vai vietnēm ir atļauts iegūt piekļuvi tuvumā esošām Bluetooth ierīcēm. Piekļuvi var pilnībā bloķēt, vai lietotājam var tikt parādīta uzvedne ar jautājumu katru reizi, kad vietne vēlas iegūt piekļuvi tuvumā esošām Bluetooth ierīcēm. + + Ja šī politika nav iestatīta, tiks izmantota vērtība “3”, un lietotājs to varēs mainīt.</translation> <translation id="6636268606788232221">Konfigurējiet barošanas pārvaldības iestatījumus gadījumiem, kad lietotājs kļūst neaktīvs. Šī politika nosaka vairākus iestatījumus barošanas pārvaldības stratēģijai, kura tiek iespējota pēc tam, kad lietotājs ir kļuvis neaktīvs. @@ -1697,6 +1710,7 @@ Ja iestatīsiet šo politiku, lietotāji to nevarēs mainīt vai ignorēt. Ja šī politika netiek iestatīta, pieejamības opcijas netiks rādītas sistēmas teknes izvēlnē, taču lietotājs varēs skatīt pieejamības opcijas, izmantojot lapu Iestatījumi.</translation> +<translation id="6766216162565713893">Ļaut vietnēm pieprasīt, lai lietotājs piešķirtu piekļuvi tuvumā esošai Bluetooth ierīcei</translation> <translation id="6770454900105963262">Ziņošana par aktīvām kioska sesijām</translation> <translation id="6774533686631353488">Atļaut izmantot lietotāja līmeņa vietējās ziņojumapmaiņas saimniekdatorus (tiks instalēti bez administratora atļaujas).</translation> <translation id="6786747875388722282">Paplašinājumi</translation> @@ -1894,6 +1908,13 @@ Ja šī politika nav iestatīta, SPDY būs pieejams.</translation> <translation id="7384999953864505698">Atļauja lietot QUIC protokolu</translation> +<translation id="7406651467768226499">Atļauja kioska lietotnei, kas tiek automātiski palaista ar nulles aizkavi, kontrolēt <ph name="PRODUCT_OS_NAME" /> versiju. + + Šī politika nosaka, vai atļaut kioska lietotnei, kas tiek automātiski palaista ar nulles aizkavi, kontrolēt <ph name="PRODUCT_OS_NAME" /> versiju, manifestā norādot parametru required_platform_version, un izmantot to kā automātiskās atjaunināšanas mērķa versijas prefiksu. + + Ja politikai ir iestatīta vērtība “Patiesa”, tās kioska lietotnes, kura tiek automātiski palaista ar nulles aizkavi, manifesta atslēgas required_platform_version vērtība tiek izmantota kā automātiskās atjaunināšanas mērķa versijas prefikss. + + Ja politika nav konfigurēta vai tai ir iestatīta vērtība “Nepatiesa”, manifesta atslēga required_platform_version tiek ignorēta un automātiskā atjaunināšana tiek veikta kā parasti.</translation> <translation id="7417972229667085380">Aizkaves līdz dīkstāvei norādīšana procentos (prezentācijas režīmā; pārtraukta)</translation> <translation id="7421483919690710988">Iestatīt datu nesēja kešatmiņas lielumu baitos</translation> <translation id="7424751532654212117">Atspējoto spraudņu saraksta izņēmumu saraksts</translation>
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index 632e6b72..94c58bc6 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -209,6 +209,13 @@ 'DefaultSearchProviderEnabled' നയം പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ നയം ബാധകമാകൂ.</translation> <translation id="1859633270756049523">സെഷൻ ദൈർഘ്യം നിയന്ത്രിക്കുക</translation> +<translation id="1859859319036806634">മുന്നറിയിപ്പ്: പതിപ്പ് 52-നുശേഷം <ph name="PRODUCT_NAME" /> എന്നതിൽ നിന്ന് ഈ TLS പതിപ്പ് ഫാൾബാക്ക് നീക്കംചെയ്യുകയും (ഏകദേശം 2016 സെപ്റ്റംബറോടുകൂടി) തുടർന്ന് ഈ നയം പ്രവർത്തിക്കാതാകുകയും ചെയ്യും. + + TLS ഹാൻഡ്ഷേക്ക് പരാജയപ്പെടുമ്പോൾ, HTTPS സെർവറുകളിലെ ബഗുകൾ പരിഹരിക്കുന്നതിനായി, TLS-ന്റെ ഒരു കുറഞ്ഞ പതിപ്പുപയോഗിച്ച് കണക്ഷൻ ലഭ്യമാക്കാൻ ആദ്യം <ph name="PRODUCT_NAME" /> വീണ്ടും ശ്രമിക്കും. ഈ ഫാൾബാക്ക് പ്രോസസ്സ് അവസാനിക്കുന്ന പതിപ്പിനെ ഈ ക്രമീകരണം കോൺഫിഗർ ചെയ്യുന്നു. സെർവർ പതിപ്പ് ശരിയായി മാറുന്നുണ്ടെങ്കിൽ (അതായത്, കണക്ഷൻ നിർത്താതെതന്നെ), ഈ ക്രമീകരണം പ്രയോഗിക്കുന്നതല്ല. തൽഫലമായുണ്ടാകുന്ന കണക്ഷൻ ഇത് പരിഗണിക്കാതെ തന്നെ, SSLVersionMin എന്നതുമായി ചേർന്ന് പ്രവർത്തിക്കുകയും വേണം. + + ഈ നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിലോ "tls1.2" എന്ന് സജ്ജമാക്കിയിരിക്കുന്നെങ്കിലോ, <ph name="PRODUCT_NAME" /> ഇനി ഈ ഫാൾബാക്ക് നടത്തുന്നതല്ല. ഇത് പഴയ TLS പതിപ്പുകൾക്കുള്ള പിന്തുണ പ്രവർത്തനരഹിതമാക്കില്ലെന്നും, <ph name="PRODUCT_NAME" /> ബഗ് ഉള്ള സെർവറുകളിൽ മാത്രം പ്രവർത്തിക്കുകയും അത് ശരിയായി പതിപ്പുകളെ മാറ്റില്ലെന്നതും ശ്രദ്ധിക്കുക. + + അല്ലെങ്കിൽ, ബഗ് ഉള്ള സെർവറുമായി അനുയോജ്യമായിരിക്കേണ്ടതാണെങ്കിൽ, ഈ നയത്തെ "tls1.1" എന്ന് സജ്ജമാക്കാം. ഇതൊരു താൽക്കാലിക പരിഹാരം മാത്രമാണ്, അതിനാൽ സെർവർ പ്രശ്നം ഉടൻ തന്നെ പരിഹരിക്കേണ്ടതാണ്.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> എന്നതിൽ അപ്രാപ്തമാക്കിയ പ്ലഗിനുകളുടെ ഒരു ലിസ്റ്റ് വ്യക്തമാക്കുകയും ഉപയോക്താക്കളെ ഈ ക്രമീകരണം മാറ്റുന്നതിൽ നിന്നും തടയുകയും ചെയ്യുന്നു. വൈൽഡ് കാർഡ് പ്രതീകങ്ങളായ '*', '?' എന്നിവ ആർബിട്രറി പ്രതീകങ്ങളുടെ ശ്രേണികളെ പൊരുത്തപ്പെടുത്തുന്നതിനായി ഉപയോഗിച്ചേക്കാം. ഏക ഓപ്ഷണൽ പ്രതീകത്തെ '?' വ്യക്തമാക്കുമ്പോൾ പ്രതീകങ്ങളുടെ ഒരു ആർബിട്രറി നമ്പറിനെ '*' പൊരുത്തപ്പെടുത്തുന്നു, അതായത് പൂജ്യമോ ഒന്നോ പ്രതീകങ്ങളുമായി പൊരുത്തപ്പെടുത്തുന്നു. '\' എസ്ക്കേപ്പ് പ്രതീകമാണ്, അതുകൊണ്ട് '*', '?', അല്ലെങ്കിൽ '\' തുടങ്ങിയ ശരിക്കുള്ള പ്രതീകങ്ങളുമായി പൊരുത്തപ്പെടുത്തുന്നതിന് അവയ്ക്ക് മുന്നിൽ ഒരു '\' ഇട്ടാൽ മതി. @@ -598,6 +605,7 @@ TLS ഡൊമെയ്ൻ-ബൗണ്ട് സർട്ടിഫിക്കറ്റ് വിപുലീകരണം പ്രവർത്തനക്ഷമമാക്കണോയെന്ന് വ്യക്തമാക്കുന്നു. ഈ ക്രമീകരണം TLS ഡൊമെയ്ൻ-ബൗണ്ട് സർട്ടിഫിക്കറ്റ് വിപുലീകരണം പരീക്ഷണത്തിനായി പ്രവർത്തനക്ഷമമാക്കാൻ ഉപയോഗിക്കുന്നു. ഈ പരീക്ഷണാത്മക ക്രമീകരണം ഭാവിയിൽ നീക്കംചെയ്യും.</translation> +<translation id="2957506574938329824">വെബ് Bluetooth API വഴി, Bluetooth ഉപകരണങ്ങളിലേക്ക് ആക്സസ്സ് അഭ്യർത്ഥിക്കാൻ ഒരു സൈറ്റിനെയും അനുവദിക്കരുത്</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> പ്രാമാണീകരണത്തിനുള്ള അക്കൗണ്ട് തരം</translation> <translation id="2959898425599642200">പ്രോക്സിയെ മറികടക്കുന്നതിനുള്ള നിയമങ്ങള്</translation> <translation id="2960691910306063964">റിമോട്ട് ആക്സസ്സ് ഹോസ്റ്റുകൾക്കായി PIN-ഇതര പ്രമാണീകരണം പ്രവർത്തനക്ഷമമാക്കുക അല്ലെങ്കിൽ പ്രവർത്തനരഹിതമാക്കുക</translation> @@ -611,6 +619,7 @@ നയ മൂല്യം മില്ല്ലിസെക്കൻഡുകളിൽ വ്യക്തമാക്കണം. മൂല്യങ്ങൾ സ്ക്രീൻ ഓഫാകുന്നതിന്റെ കാലതാമസം (സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ), നിഷ്ക്രിയ കാലതാമസം എന്നിവയേക്കാൾ കുറവോ അതിന് തുല്യമോ ആയി നിശ്ചയിക്കണം.</translation> <translation id="2987155890997901449">ARC പ്രവർത്തനക്ഷമമാക്കുക</translation> +<translation id="2987227569419001736">വെബ് Bluetooth API ഉപയോഗം നിയന്ത്രിക്കുക</translation> <translation id="2998881342848488968">ക്യാപ്റ്റീവ് പോർട്ടൽ പ്രാമാണീകരണത്തിനായി ഏത് പ്രോക്സിയും മറികടക്കുന്നതിന് ഈ നയം <ph name="PRODUCT_OS_NAME" /> എന്നതിനെ അനുവദിക്കുന്നു. പ്രോക്സി കോൺഫിഗർചെയ്തെങ്കിൽ മാത്രമേ ഈ നയം പ്രാബല്യത്തിൽ വരൂ (ഉദാഹരണമായി, നയം മുഖേനയോ chrome://settings എന്നതിലെ ഉപയോക്താവോ വിപുലീകരണം വഴിയോ). @@ -932,6 +941,7 @@ 'DefaultSearchProviderEnabled' നയം പ്രവർത്തനക്ഷമമാകിയിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ നയം ബാധകമാകൂ.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 അല്ലെങ്കില് അതിനുശേഷമുള്ളത്</translation> +<translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> പതിപ്പ് നിയന്ത്രിക്കാൻ, കാലതാമസമില്ലാതെ കിയോസ്ക് അപ്ലിക്കേഷൻ സ്വയം സമാരംഭിക്കുന്നതിന് അനുവദിക്കുക.</translation> <translation id="4325690621216251241">സിസ്റ്റം ട്രേയിൽ ഒരു ലോഗ്ഔട്ട് ബട്ടൺ ചേർക്കുക</translation> <translation id="4347908978527632940">ശരിയാണെങ്കിലും ഉപയോക്താവ് ഒരു സൂപ്പർവൈസുചെയ്ത ഉപയോക്താവാണെങ്കിലും മറ്റ് Android ആപ്സിന് ഒരു ഉള്ളടക്ക ദാതാവിലൂടെ ഉപയോക്താവിന്റെ വെബ് നിയന്ത്രണങ്ങളെ ചോദ്യം ചെയ്യാനാകും. @@ -1611,6 +1621,9 @@ ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, ലോഗിൻ സ്ക്രീൻ ആദ്യമായി ദൃശ്യമാകുമ്പോൾ ഓൺ-സ്ക്രീൻ കീബോർഡ് പ്രവർത്തനരഹിതമാകും. ഉപയോക്താക്കൾക്ക് ഏതുസമയത്തും ഓൺ-സ്ക്രീൻ കീബോർഡ് പ്രവർത്തനക്ഷമമാക്കാനോ പ്രവർത്തനരഹിതമാക്കാനോ കഴിയും, ലോഗിൻ സ്ക്രീനിലെ അതിന്റെ സ്റ്റാറ്റസ് ഉപയോക്താക്കൾക്കിടയിൽ നിലനിൽക്കുന്നു.</translation> <translation id="6598235178374410284">അവതാർ ചിത്രം ഉപയോഗിക്കുക</translation> +<translation id="6628646143828354685">അടുത്തുള്ള Bluetooth ഉപകരണങ്ങളിലേക്ക് വെബ്സൈറ്റുകൾക്ക് ആക്സസ്സ് അനുവദിക്കണോ എന്ന് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. ആക്സസ്സ് പൂർണ്ണമായും ബ്ലോക്കുചെയ്യാം, അല്ലെങ്കിൽ വെബ്സൈറ്റിന് അടുത്തുള്ള Bluetooth ഉപകരണങ്ങളിലേക്ക് ആക്സസ്സ് ആവശ്യമുള്ളപ്പോഴെല്ലാം ഉപയോക്താവിനോട് അക്കാര്യം ചോദിക്കാം. + + ഈ നയം സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിൽ, '3' ഉപയോഗിക്കും. അതിനാൽ ഉപയോക്താവിന് ഇത് മാറ്റാനാകും.</translation> <translation id="6636268606788232221">ഉപയോക്താവ് നിഷ്ക്രിയമായിരിക്കുമ്പോൾ പവർ മാനേജുമെന്റ് ക്രമീകരണം കോൺഫിഗർചെയ്യുക. ഉപയോക്താവ് നിഷ്ക്രിയമായിരിക്കുമ്പോൾ പവർ മാനേജുമെന്റ് തന്ത്രത്തിനായി ഈ നയം ഒന്നിലേറെ ക്രമീകരണങ്ങൾ നിയന്ത്രിക്കുന്നു. @@ -1703,6 +1716,7 @@ ഈ നയം സജ്ജീകരിക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല. ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, സിസ്റ്റം ട്രേ മെനുവിൽ പ്രവേശനക്ഷമത ഓപ്ഷനുകൾ ദൃശ്യമാകില്ലെങ്കിലും ക്രമീകരണങ്ങളുടെ പേജ് വഴി ഉപയോക്താക്കൾക്ക് പ്രവേശനക്ഷമത ഓപ്ഷനുകൾ ദൃശ്യമാക്കാനാകും.</translation> +<translation id="6766216162565713893">അടുത്തുള്ള ഒരു Bluetooth ഉപകരണത്തിലേക്ക് ഉപയോക്താവിനോട് ആക്സസ്സ് ആവശ്യപ്പെടാൻ സൈറ്റുകളെ അനുവദിക്കുക</translation> <translation id="6770454900105963262">സജീവ കിയോസ്ക് സെഷനുകളെക്കുറിച്ചുള്ള വിവരം റിപ്പോർട്ടുചെയ്യുക</translation> <translation id="6774533686631353488">ഉപയോക്തൃനില പ്രാദേശിക സന്ദേശമയയ്ക്കൽ ഹോസ്റ്റുകളെ അനുവദിക്കുക (അഡ്മിൻ അനുമതികളില്ലാതെ ഇൻസ്റ്റാൾചെയ്തത്).</translation> <translation id="6786747875388722282">വിപുലീകരണങ്ങള്</translation> @@ -1899,6 +1913,13 @@ ഈ നയത്തെ സജ്ജമാക്കാതെ വിട്ടാൽ, SPDY ലഭ്യമാകും.</translation> <translation id="7384999953864505698">QUIC പ്രോട്ടോക്കോൾ അനുവദിക്കുന്നു</translation> +<translation id="7406651467768226499"><ph name="PRODUCT_OS_NAME" /> പതിപ്പ് നിയന്ത്രിക്കുന്നതിന്, കാലതാമസമില്ലാതെ കിയോസ്ക് അപ്ലിക്കേഷൻ സ്വയം സമാരംഭിക്കുന്നതിന് അനുവദിക്കണോ വേണ്ടയോ എന്ന് തീരുമാനിക്കുക. + + <ph name="PRODUCT_OS_NAME" /> പതിപ്പ് നിയന്ത്രിക്കുന്നതിന്, ഇതിന്റെ മാനിഫെസ്റ്റിൽ required_platform_version വ്യക്തമാക്കുന്നതിലൂടെ കാലതാമസമില്ലാതെ കിയോസ്ക് അപ്ലിക്കേഷൻ സ്വയം സമാരംഭിക്കുന്നതിന് അനുവദിക്കണോ എന്ന് ഈ നയം നിയന്ത്രിക്കുന്നു, ഒപ്പം ഇത് സ്വയം അപ്ഡേറ്റുചെയ്യുന്ന ടാർഗെറ്റ് പതിപ്പ് പ്രിഫിക്സായി ഉപയോഗിക്കുകയും ചെയ്യും. + + നയം ശരി എന്നാണ് സജ്ജമാക്കിയിട്ടുള്ളതെങ്കിൽ, സ്വയം സമാരംഭിക്കുന്ന, കാലതാമസമില്ലാത്ത കിയോസ്ക് അപ്ലിക്കേഷന്റെ required_platform_version മാനിഫെസ്റ്റ് കീയുടെ മൂല്യം സ്വയം അപ്ഡേറ്റുചെയ്യുന്ന ടാർഗെറ്റ് പതിപ്പ് പ്രിഫിക്സായി ഉപയോഗിക്കും. + + നയം കോൺഫിഗർ ചെയ്തിട്ടില്ല അല്ലെങ്കിൽ തെറ്റ് എന്നാണ് സജ്ജമാക്കിയിട്ടുള്ളതെങ്കിൽ, required_platform_version മാനിഫെസ്റ്റ് കീയെ അവഗണിക്കുകയും സാധാരണയായി സ്വയം അപ്ഡേറ്റുചെയ്യുന്ന നിലയിൽത്തന്നെ തുടരുകയും ചെയ്യും.</translation> <translation id="7417972229667085380">അവതരണ മോഡിൽ നിഷ്ക്രിയ കാലതാമസം സ്കെയിൽ ചെയ്യുന്നതിനനുസരിച്ചുള്ള ശതമാനം (ഒഴിവാക്കി)</translation> <translation id="7421483919690710988">മീഡിയ ഡിസ്ക് കാഷെ വലുപ്പം ബൈറ്റുകളിൽ സജ്ജമാക്കുക</translation> <translation id="7424751532654212117">അപ്രാപ്തമാക്കിയ പ്ലഗിനുകളുടെ ലിസ്റ്റിലേക്കുള്ള അപവാദങ്ങളുടെ ലിസ്റ്റ്</translation>
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb index 86531af..765a85d 100644 --- a/components/policy/resources/policy_templates_mr.xtb +++ b/components/policy/resources/policy_templates_mr.xtb
@@ -201,6 +201,13 @@ 'DefaultSearchProviderEnabled' धोरण सक्षम असल्यासच या धोरणाचा फक्त आदर केला जातो.</translation> <translation id="1859633270756049523">सत्राची लांबी मर्यादित करा</translation> +<translation id="1859859319036806634">चेतावणी: 52 आवृत्ती (सप्टेंबर 2016 च्या आसपास) नंतर TLS आवृत्ती फॉलबॅक <ph name="PRODUCT_NAME" /> मधून काढली जाईल आणि हे धोरण त्यानंतर कार्य करणे थांबवेल. + + TLS करार निश्चित अयशस्वी झाल्यावर, <ph name="PRODUCT_NAME" /> HTTPS सर्व्हरमध्ये दोषांवर कार्य करण्यासाठी TLS च्या लहान आवृत्तीसह कनेक्शनसाठी मागीलप्रमाणे पुन्हा प्रयत्न करेल. हे सेटिंग ही फॉलबॅक प्रक्रिया ज्या आवृत्तीवर थांबेल ती आवृत्ती कॉन्फिगर करते. सर्व्हर आवृत्ती निगोशिएशन अचूकपणे करीत असल्यास (म्हणजे कनेक्शन खंडित न करता) हे सेटिंग लागू होत नाही. त्याकडे दुर्लक्ष करून, परिणामी कनेक्शनने अद्याप SSLVersionMin चे पालन करणे आवश्यक आहे. + + हे धोरण कॉन्फिगर न केल्यास किंवा ते "tls1.2" वर सेट केल्यास <ph name="PRODUCT_NAME" /> हे फॉलबॅक करणार नाही. लक्षात ठेवा हे जुन्या TLS आवृत्त्यांसाठी समर्थन अक्षम करीत नाही, हे केवळ <ph name="PRODUCT_NAME" /> आवृत्त्यांशी अचूकपणे निगोशिएट करू शकत नसलेल्या दोष असलेल्या सर्व्हरवर कार्य करेल. + + अन्यथा, दोष असलेल्या सर्व्हरसह सुसंगतता राखून ठेवल्यास, हे धोरण "tls1.1" वर सेट केले जाऊ शकते. ही तात्पुरती उपाययोजना आहे आणि सर्व्हरचे जलदगतीने निराकरण केले जावे.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> मध्ये अक्षम केलेल्या प्लगिनची सूची निर्दिष्ट करते आणि वापरकर्त्यांना हे सेटिंग बदलण्यास प्रतिबंधित करते. @@ -583,6 +590,7 @@ TLS डोमेन-बद्ध प्रमाणपत्रे विस्तार सक्षम केला जावा किंवा नाही हे निर्दिष्ट करते. हे सेटिंग चाचणीसाठी TLS डोमेन-बद्ध प्रमाणपत्रे सक्षम करण्यासाठी वापरली जाते. भविष्यात हे प्रायोगिक सेटिंग काढले जाईल.</translation> +<translation id="2957506574938329824">कोणत्याही साइटला Web Bluetooth API द्वारे Bluetooth डिव्हाइसेसमध्ये प्रवेशाची विनंती करण्याची अनुमती देऊ नका</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> प्रमाणीकरणासाठी खाते प्रकार</translation> <translation id="2959898425599642200">प्रॉक्सी स्थलांतर नियम</translation> <translation id="2960691910306063964">दूरस्थ प्रवेश होस्टसाठी पिन नसलेले प्रमाणीकरण अक्षम किंवा सक्षम करा</translation> @@ -596,6 +604,7 @@ धोरण मूल्य मिलिसेकंदांमध्ये निर्दिष्ट केले जावे. मूल्ये स्क्रीन बंद विलंब (सेट केल्यास) आणि निष्क्रिय विलंब कमी करण्यासाठी किंवा समान करण्यासाठी पकडली जातात.</translation> <translation id="2987155890997901449">ARC सक्षम करा</translation> +<translation id="2987227569419001736">Web Bluetooth API चा वापर नियंत्रित करा</translation> <translation id="2998881342848488968">हे धोरण <ph name="PRODUCT_OS_NAME" /> ला कॅप्टिव्ह पोर्टल प्रमाणीकरणासाठी कोणतीही प्रॉक्सी बायपास करण्याची अनुमती देते. हे धोरण केवळ प्रॉक्सी कॉन्फिगर केली असेल तरच प्रभावी होते (उदाहरणार्थ धोरणामधून, वापरकर्त्याद्वारे chrome://settings मध्ये किंवा विस्तारांद्वारे). @@ -916,6 +925,7 @@ 'DefaultSearchProviderEnabled' धोरण सक्षम असल्यासच या धोरणाचा फक्त आदर केला जातो.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 किंवा त्यानंतरची</translation> +<translation id="4322842393287974810">विलंब न होणाऱ्या कियोस्क अॅपसह स्वयं लाँच केलेली <ph name="PRODUCT_OS_NAME" /> आवृत्ती नियंत्रित करण्याची अनुमती द्या</translation> <translation id="4325690621216251241">सिस्टम ट्रेवर लॉगआउट बटण जोडा</translation> <translation id="4347908978527632940">सत्य असल्यास आणि वापरकर्ता पर्यवेक्षी वापरकर्ता असल्यास अन्य Android अॅप्स सामग्री प्रदात्याद्वारे वापरकर्त्याच्या वेब प्रतिबंधांची क्वेरी करू शकतात. @@ -1566,6 +1576,9 @@ हे धोरण सेट न केलेले सोडल्यास, लॉगिन स्क्रीन प्रथम दर्शविली जाते तेव्हा ऑन-स्क्रीन कीबोर्ड अक्षम केेले असते. वापरकर्ते कोणत्याही वेळी ऑन-स्क्रीन कीबोर्ड सक्षम किंवा अक्षम करू शकतात आणि लॉग इन स्क्रीनवरील तिची स्थिती वापरकर्त्यांमध्ये कायम रहाते.</translation> <translation id="6598235178374410284">वापरकर्ता अवतार प्रतिमा</translation> +<translation id="6628646143828354685">वेबसाइटना जवळपासच्या Bluetooth डिव्हाइसेसमध्ये प्रवेश मिळविण्याची अनुमती द्यावी किंवा नाही ते सेट करण्याची आपल्याला अनुमती देते. प्रवेश पूर्णपणे अवरोधित केला जाऊ शकतो किंवा वेबसाइट जवळपासच्या Bluetooth डिव्हाइसेसमध्ये प्रवेश करू इच्छिते तेव्हा प्रत्येक वेळी वापरकर्त्यास विचारले जाऊ शकते. + + हे धोरण सेट न केलेले ठेवल्यास, '3' वापरले जाईल आणि वापरकर्ता ते बदलण्यास सक्षम असेल.</translation> <translation id="6636268606788232221">वापरकर्ता निष्क्रिय असतो तेव्हा उर्जा व्यवस्थापन सेटिंग्ज कॉन्फिगर करा. हे धोरण वापरकर्ता निष्क्रिय होतो तेव्हा उर्जा व्यवस्थापन योजनेसाठी एकाधिक सेटिंग्ज नियंत्रित करते. @@ -1656,6 +1669,7 @@ आपण हे धोरण सेट केल्यास, वापरकर्ते ते बदलू किंवा अधिशून्य करू शकत नाहीत. हे धोरण सेट न करता सोडल्यास, प्रवेशयोग्यता पर्याय सिस्टीम ट्रे मध्ये दिसणार नाहीत परंतु वापरकर्त्यामुळे सेटिंग्ज पृष्ठाद्वारे प्रवेशयोग्यता पर्याय दिसू शकतात.</translation> +<translation id="6766216162565713893">जवळपासच्या Bluetooth डिव्हाइसमध्ये प्रवेशाची मंजूरी देण्यासाठी वापरकर्त्यास विचारण्याची साइटना अनुमती देते</translation> <translation id="6770454900105963262">सक्रिय कियोस्क सत्राविषयी माहितीचा अहवाल द्या</translation> <translation id="6774533686631353488">वापरकर्ता-स्तर मूळ संदेशन होस्टला (प्रशासनाच्या परवानग्यांशिवाय स्थापित) अनुमती द्या.</translation> <translation id="6786747875388722282">विस्तार</translation> @@ -1849,6 +1863,13 @@ हे धोरण सेट न करता सोडल्यास, SPDY उपलब्ध असेल.</translation> <translation id="7384999953864505698">QUIC प्रोटोकॉलला अनुमती देते</translation> +<translation id="7406651467768226499">विलंब न होणाऱ्या कियोस्क अॅपसह स्वयं लाँच केलेली <ph name="PRODUCT_OS_NAME" /> आवृत्ती नियंत्रित करण्याची अनुमती द्यायची किंवा नाही. + + हे धोरण त्याच्या मॅनिफेस्ट मध्ये एक आवश्यक_प्लॅटफॉर्म_आवृत्ती घोषित करून विलंब न होणाऱ्या कियोस्क अॅपसह स्वयं लाँच केलेली <ph name="PRODUCT_OS_NAME" /> आवृत्ती नियंत्रित करण्याची अनुमती द्यायची किंवा नाही ते निर्धारित करते आणि तिचा स्वयं अद्यतन लक्ष्य आवृत्ती उपसर्ग म्हणून वापर करते. + + धोरण सत्यवर सेट केले असल्यास, विलंब न होणाऱ्या कियोस्क अॅपसह स्वयं लाँच केलेल्या आवश्यक_प्लॅटफॉर्म_आवृत्ती मॅनिफेस्ट की चे मूल्य स्वयं अद्यतन लक्ष्य आवृत्ती उपसर्ग म्हणून वापरले जाते. + + धोरण कॉन्फिगर केले नसल्यास किंवा असत्यवर सेट केले असल्यास, आवश्यक_प्लॅटफॉर्म_आवृत्ती मॅनिफेस्ट की दुर्लक्षित केली जाते आणि स्वयं अद्यतन सामान्य म्हणून सुरु राहते.</translation> <translation id="7417972229667085380">ज्याद्वारे सादरीकरण मोडमधील निष्क्रिय विलंब मोजता येतो अशी टक्केवारी (बहिष्कृत केलेली)</translation> <translation id="7421483919690710988">मीडिया डिस्क कॅशे आकार बाइटमध्ये सेट करा</translation> <translation id="7424751532654212117">अक्षम केलेल्या प्लगइनच्या सूचीतील अपवादांची सूची</translation>
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb index b845d354..ea6a1a0 100644 --- a/components/policy/resources/policy_templates_ms.xtb +++ b/components/policy/resources/policy_templates_ms.xtb
@@ -213,6 +213,13 @@ Dasar ini hanya dipatuhi jika dasar 'DefaultSearchProviderEnabled' didayakan.</translation> <translation id="1859633270756049523">Hadkan panjang sesi</translation> +<translation id="1859859319036806634">Amaran: Jatuh balik versi TLS akan dialih keluar daripada <ph name="PRODUCT_NAME" /> selepas versi 52 (lebih kurang September 2016) dan selepas itu dasar ini akan berhenti berfungsi. + + Apabila jabat tangan TLS gagal, <ph name="PRODUCT_NAME" /> akan mencuba semula sambungan dengan versi TLS yang lebih rendah bagi membetulkan pepijat dalam pelayan HTTPS. Tetapan ini mengkonfigurasikan versi pada takat mana proses jatuh balik ini berhenti. Jika pelayan melaksanakan rundingan versi dengan betul (iaitu tanpa memutuskan sambungan) maka tetapan ini tidak akan digunakan. Walau apa pun, sambungan yang terhasil tetap perlu mematuhi SSLVersionMin. + + Jika dasar ini tidak dikonfigurasikan atau jika ditetapkan kepada "tls1.2" maka <ph name="PRODUCT_NAME" /> tidak lagi akan melaksanakan jatuh balik ini. Perhatian, ini tidak melumpuhkan sokongan untuk versi TLS yang lebih lama, hanya sama ada <ph name="PRODUCT_NAME" /> akan membetulkan pelayan berpepijat yang tidak dapat merundingkan versi dengan betul. + + Sebaliknya, jika keserasian dengan pelayan berpepijat mesti dikekalkan, dasar ini mungkin ditetapkan kepada "tls1.1". Ini ialah langkah sementara dan pelayan harus dibetulkan dengan segera.</translation> <translation id="1861037019115362154">Menentukan senarai pemalam yang dilumpuhkan dalam <ph name="PRODUCT_NAME" /> dan menghalang pengguna daripada mengubah tetapan ini. Aksara kad bebas '*' dan '?' boleh digunakan untuk memadankan urutan aksara rawak. Aksara '*' sepadan dengan bilangan aksara rawak manakala '?' menentukan aksara pilihan tunggal iaitu sepadan dengan sifar atau satu aksara. Aksara lepasan ialah '\', oleh itu untuk memadankan aksara '*', '?' atau '\' sebenar, anda boleh meletakkan '\' di hadapannya. @@ -596,6 +603,7 @@ Menyatakan sama ada sambungan sijil hala domain TLS harus didayakan. Tetapan ini digunakan untuk mendayakan sambungan sijil hala domain TLS untuk ujian. Tetapan eksperimen ini akan dialih keluar pada masa hadapan.</translation> +<translation id="2957506574938329824">Jangan benarkan mana-mana tapak meminta akses kepada peranti Bluetooth melalui API Bluetooth Web</translation> <translation id="2957513448235202597">Jenis akaun untuk pengesahan <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Peraturan memintas proksi</translation> <translation id="2960691910306063964">Dayakan atau lumpuhkan pengesahan tanpa PIN untuk hos akses jauh</translation> @@ -609,6 +617,7 @@ Nilai dasar ini harus ditetapkan dalam milisaat. Nilai diapit supaya kurang daripada atau sama dengan kelewatan pemadaman skrin (jika ditetapkan) dan kelewatan melahu.</translation> <translation id="2987155890997901449">Dayakan ARC</translation> +<translation id="2987227569419001736">Kawal penggunaan API Bluetooth Web</translation> <translation id="2998881342848488968">Dasar ini membenarkan <ph name="PRODUCT_OS_NAME" /> memintas mana-mana proksi untuk pengesahan portal tawanan. Dasar ini hanya berkuat kuasa jika proksi dikonfigurasikan (contohnya menerusi dasar, oleh pengguna dalam chrome://settings atau oleh sambungan). @@ -1607,6 +1616,9 @@ Jika dasar ini dibiarkan tidak ditetapkan, papan kekunci pada skrin dilumpuhkan apabila skrin log masuk mula-mula ditunjukkan. Pengguna boleh mendayakan atau melumpuhkan papan kekunci pada skrin pada bila-bila masa dan status pada skrin log masuk diteruskan antara pengguna.</translation> <translation id="6598235178374410284">Imej avatar pengguna</translation> +<translation id="6628646143828354685">Membenarkan anda menetapkan sama ada tapak web dibenarkan untuk mendapatkan akses kepada peranti Bluetooth berhampiran. Akses boleh disekat sepenuhnya atau pengguna boleh ditanya setiap kali tapak web ingin mendapatkan akses kepada peranti Bluetooth berhampiran. + + Jika dasar ini dibiarkan tanpa ditetapkan, '3' akan digunakan dan pengguna akan dapat mengubahnya.</translation> <translation id="6636268606788232221">Konfigurasikan tetapan pengurusan kuasa apabila pengguna melahu. Dasar ini mengawal berbilang tetapan untuk strategi pengurusan kuasa apabila pengguna melahu. @@ -1699,6 +1711,7 @@ Jika anda menetapkan dasar ini, pengguna tidak boleh menukar atau mengatasinya. Jika dasar ini dibiarkan tidak ditetapkan, pilihan Kebolehaksesan tidak akan terpapar dalam menu dulang sistem, tetapi pengguna boleh menyebabkan pilihan Kebolehaksesan dipaparkan melalui halaman Tetapan.</translation> +<translation id="6766216162565713893">Benarkan tapak web meminta pengguna memberikan akses kepada peranti Bluetooth berhampiran</translation> <translation id="6770454900105963262">Laporkan maklumat tentang sesi kios aktif</translation> <translation id="6774533686631353488">Benarkan hos Pemesejan Asli tahap pengguna (dipasang tanpa kebenaran pentadbir).</translation> <translation id="6786747875388722282">Pelanjutan</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 3e128c2f..c015386 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -200,6 +200,13 @@ Dit beleid wordt alleen gerespecteerd als het beleid 'DefaultSearchProviderEnabled' is ingeschakeld.</translation> <translation id="1859633270756049523">De sessielengte beperken</translation> +<translation id="1859859319036806634">Waarschuwing: De TLS-versiefallback wordt na de lancering van versie 52 (rond september 2016) uit <ph name="PRODUCT_NAME" /> verwijderd. Vanaf dat moment werkt dit beleid niet meer. + + Wanneer een TLS-handshake mislukt, probeerde <ph name="PRODUCT_NAME" /> voorheen opnieuw verbinding te maken met een lagere versie van TLS om bugs in HTTPS-servers te omzeilen. Deze instelling configureert de versie waarbij dit fallbackproces wordt stopgezet. Als een server de versieonderhandeling correct uitvoert (dat wil zeggen, zonder de verbinding te verbreken), is deze instelling niet van toepassing. Desondanks moet de resulterende verbinding nog steeds voldoen aan SSLVersionMin. + + Als dit beleid niet is geconfigureerd of als het is ingesteld op 'tls1.2', voert <ph name="PRODUCT_NAME" /> deze fallback niet meer uit. Let op: Hiermee wordt de ondersteuning voor oudere TLS-versies niet uitgeschakeld, maar alleen het proces van <ph name="PRODUCT_NAME" /> om servers met bugs te omzeilen die versieonderhandelingen niet correct kunnen uitvoeren. + + Als de compatibiliteit met een server met bugs moet worden behouden, kan dit beleid worden ingesteld op 'tls1.1'. Dit is slechts een noodoplossing. De server moet snel worden gerepareerd.</translation> <translation id="1861037019115362154">Hiermee geef je een lijst met plug-ins op die zijn uitgeschakeld <ph name="PRODUCT_NAME" /> en voorkom je dat gebruikers deze instelling kunnen wijzigen. De jokertekens '*' en '?' kunnen worden gebruikt om overeenkomsten met willekeurige tekens te zoeken. '*' komt overeen met een willekeurig aantal tekens terwijl '?' één optioneel teken aangeeft (dat wil zeggen, overeenkomsten met nul of één teken). Het escape-teken '\' kan worden gebruikt om deze tekens te escapen, dus als je overeenkomsten voor de letterlijke tekens '*', '?' of '\' wilt zoeken, kun je een '\' vóór deze tekens plaatsen. @@ -586,6 +593,7 @@ Geeft aan of de extensie voor TLS-domeingebonden certificaten moet worden ingeschakeld. Deze instelling wordt gebruikt om de extensie voor TLS-domeingebonden certificaten in te schakelen voor testdoeleinden. Deze experimentele instelling wordt in de toekomst verwijderd.</translation> +<translation id="2957506574938329824">Niet toestaan dat sites toegang tot Bluetooth-apparaten vragen via de Web Bluetooth API</translation> <translation id="2957513448235202597">Accounttype voor <ph name="HTTP_NEGOTIATE" />-verificatie</translation> <translation id="2959898425599642200">Regels voor proxyomzeiling</translation> <translation id="2960691910306063964">Verificatie zonder pincode in- of uitschakelen voor hosts voor externe toegang</translation> @@ -599,6 +607,7 @@ De beleidswaarde moet worden opgegeven in milliseconden. Waarden moeten lager zijn dan of gelijk zijn aan de vertraging van scherm uitschakelen (indien ingesteld) en de inactieve vertraging.</translation> <translation id="2987155890997901449">ARC inschakelen</translation> +<translation id="2987227569419001736">Gebruik van de Web Bluetooth API beheren</translation> <translation id="2998881342848488968">Met dit beleid kan <ph name="PRODUCT_OS_NAME" /> elke proxy voor captive portal-verificatie omzeilen. Dit beleid wordt alleen geactiveerd als een proxy wordt geconfigureerd (bijvoorbeeld via een beleid, door de gebruiker in chrome://settings of met extensies). @@ -1591,6 +1600,9 @@ Als dit beleid niet is ingesteld, wordt het schermtoetsenbord uitgeschakeld wanneer het inlogscherm voor de eerste keer wordt weergegeven. Gebruikers kunnen het schermtoetsenbord op elk moment in- of uitschakelen en de status op het inlogscherm is van toepassing op alle gebruikers.</translation> <translation id="6598235178374410284">Avatarafbeelding van gebruiker</translation> +<translation id="6628646143828354685">Hiermee kun je instellen of websites toegang mogen krijgen tot Bluetooth-apparaten in de buurt. De toegang kan volledig worden geblokkeerd of de gebruiker kan elke keer om toestemming worden gevraagd wanneer een website toegang wil hebben tot Bluetooth-apparaten in de buurt. + + Als dit beleid niet is ingesteld, wordt '3' gebruikt en kan de gebruiker dit wijzigen.</translation> <translation id="6636268606788232221">Energiebeheer configureren wanneer de gebruiker inactief is. Dit beleid beheert meerdere instellingen voor de energiebeheerstrategie wanneer de gebruiker inactief is. @@ -1683,6 +1695,7 @@ Als je dit beleid instelt, kunnen gebruikers dit niet wijzigen of negeren. Als dit beleid niet is ingesteld, worden toegankelijkheidsopties niet weergegeven in het systeemvakmenu, maar kan de gebruiker er via de pagina 'Instellingen' voor zorgen dat de toegankelijkheidsopties worden weergegeven.</translation> +<translation id="6766216162565713893">Toestaan dat sites de gebruiker vragen om toegang te verlenen tot een Bluetooth-apparaat in de buurt</translation> <translation id="6770454900105963262">Informatie over actieve kiosk-sessies melden</translation> <translation id="6774533686631353488">Hosts voor systeemeigen berichten op gebruikersniveau toestaan (geïnstalleerd zonder beheerdersrechten).</translation> <translation id="6786747875388722282">Extensies</translation>
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb index 4f72c598..1e62196 100644 --- a/components/policy/resources/policy_templates_no.xtb +++ b/components/policy/resources/policy_templates_no.xtb
@@ -204,6 +204,13 @@ Denne innstillingen brukes bare hvis «DefaultSearchProviderEnabled»-innstillingen er aktivert.</translation> <translation id="1859633270756049523">Begrens innloggingstiden</translation> +<translation id="1859859319036806634">Advarsel: TLS-versjonen som fungerer som reserveløsning, fjernes fra <ph name="PRODUCT_NAME" /> etter versjon 52 (rundt september 2016), og da slutter denne regelen å fungere. + + Når et TLS-håndtrykk mislykkes, ville <ph name="PRODUCT_NAME" /> tidligere prøvd å koble til på nytt med en dårligere versjon av TLS for å omgå feil på HTTPS-tjenere. Denne tjenesten konfigurerer hvilken versjon denne reserveprosessen stopper på. Hvis en tjener utfører versjonsforhandlingen riktig (det vil si uten å bryte tilkoblingen), gjelder ikke denne innstillingen. Tilkoblingen som opprettes, må uansett rette seg etter SSLVersionMin. + + Hvis denne regelen ikke er konfigurert, eller hvis den er satt til «tls1.2», gjennomfører ikke <ph name="PRODUCT_NAME" /> denne reserveprosessen lenger. Vær oppmerksom på at dette ikke slår av støtten for eldre TLS-versjoner, det avgjør bare om <ph name="PRODUCT_NAME" /> omgår problemer med tjenere som ikke kan forhandle versjoner riktig. + + Hvis det er nødvendig å beholde kompatibiliteten med en tjener med feil, kan denne regelen settes til «tls1.1». Dette er en midlertidig løsning, og tjeneren må fikses så fort som mulig.</translation> <translation id="1861037019115362154">Angir en liste over programtillegg deaktivert på <ph name="PRODUCT_NAME" />, og forhindrer brukere fra å endre denne innstillingen. Du kan bruke jokertegnene «*» og «?» til å matche sekvenser av vilkårlige tegn. «*» matcher et vilkårlig antall tegn, mens «?» spesifiserer et valgfritt enkelttegn – det matcher med andre ord null eller ett tegn. Escape-tegnet er «\», så om du vil matche tegnene «*», «?», eller «\», kan du plassere «\» foran dem. @@ -573,6 +580,7 @@ Angi om TLS-domenebetingende sertifikatsutvidelser bør aktiveres. Disse innstillingene blir brukt til å aktivere den TLS-domenebetingede sertifikatsutvidelsen for testing. Denne eksperimentelle innstillingen blir fjernet i fremtiden.</translation> +<translation id="2957506574938329824">Ikke tillat nettsteder å be om tilgang til Bluetooth-enheter via Web Bluetooth API</translation> <translation id="2957513448235202597">Kontotype for <ph name="HTTP_NEGOTIATE" />-autentisering</translation> <translation id="2959898425599642200">Regler for å omgå mellomtjener</translation> <translation id="2960691910306063964">Slå på eller av autentisering uten PIN-kode for fjerntilgangsverter</translation> @@ -586,6 +594,7 @@ Innstillingsverdien må spesifiseres i millisekunder. Verdien er låst til å være lavere enn eller samsvarende med forsinkelsen for å slå av skjermen (hvis den er konfigurert) og inaktivitetsforsinkelsen.</translation> <translation id="2987155890997901449">Slå på ARC</translation> +<translation id="2987227569419001736">Kontrollér bruken av Web Bluetooth API</translation> <translation id="2998881342848488968">Med denne innstillingen kan <ph name="PRODUCT_OS_NAME" /> omgå eventuelle proxy-tjenere for autentisering via obligatoriske sider. Denne regelen trer bare i kraft hvis en proxy-tjener er konfigurert (for eksempel gjennom administratorinnstillingene, av brukeren i chrome://settings eller av utvidelser). @@ -882,6 +891,7 @@ Denne innstillingen brukes bare hvis «DefaultSearchProviderEnabled»-innstillingen er aktivert.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 eller nyere</translation> +<translation id="4322842393287974810">La den automatisk startede kioskappen uten forsinkelse kontrollere <ph name="PRODUCT_OS_NAME" />-versjonen</translation> <translation id="4325690621216251241">Legg til en avloggingsknapp for systemstatusfeltet</translation> <translation id="4347908978527632940">Hvis verdien er «true» (sann) og brukeren er en administrert bruker, kan andre Android-apper sende forespørsler om brukerens nettbegrensninger gjennom en innholdsleverandør. @@ -1542,6 +1552,9 @@ Hvis denne innstillingen ikke angis, deaktiveres skjermtastaturet når påloggingsskjermen først vises. Brukere kan aktivere eller deaktivere skjermtastaturet når som helst og statusen den har på påloggingsskjermen er vedvarende mellom brukerne.</translation> <translation id="6598235178374410284">Brukerbilde</translation> +<translation id="6628646143828354685">Gjør det mulig å velge om nettsteder har lov til å få tilgang til Bluetooth-enheter i nærheten. Tilgangen kan blokkeres helt, eller brukeren kan bli spurt hver gang et nettsted vil ha tilgang til Bluetooth-enheter i nærheten. + + Hvis denne regelen ikke angis, brukes «3», og brukeren kan endre denne innstillingen.</translation> <translation id="6636268606788232221">Konfigurer innstillingene for strømstyring når brukeren er inaktiv. Denne regelen kontrollerer flere innstillinger for strømstyring når brukeren er inaktiv. @@ -1634,6 +1647,7 @@ Hvis du angir denne innstillingen, kan ikke brukere endre eller overstyre den. Hvis denne innstillingen ikke angis, vises ikke tilgjengelighetsalternativer i systemstatusfeltet, men brukeren kan få tilgjengelighetsalternativene frem via Innstillinger-siden.</translation> +<translation id="6766216162565713893">La nettsteder be brukeren om tilgang til Bluetooth-enheter i nærheten</translation> <translation id="6770454900105963262">Rapportér informasjon om aktive kioskøkter</translation> <translation id="6774533686631353488">Tillat bruk av integrerte meldingsverter på brukernivå (installert uten administratorrettigheter).</translation> <translation id="6786747875388722282">Utvidelser</translation> @@ -1822,6 +1836,13 @@ Hvis disse retningslinjene ikke angis, blir SPDY tilgjengelig.</translation> <translation id="7384999953864505698">Tillater QUIC-protokollen</translation> +<translation id="7406651467768226499">Spesifiserer om den automatisk startede kioskappen uten forsinkelse skal kunne kontrollere <ph name="PRODUCT_OS_NAME" />-versjonen. + + Denne regelen kontrollerer om den automatisk startede kioskappen uten forsinkelse skal kunne kontrollere <ph name="PRODUCT_OS_NAME" />-versjonen ved å erklære en required_platform_version i manifestet og bruke den som prefiks for den automatisk oppdaterte målversjonen. + + Hvis regelen er satt til «true» (sann), brukes verdien i manifestnøkkelen required_platfrom_version for den automatisk startede kioskappen uten forsinkelse som prefiks for den automatisk oppdaterte målversjonen. + + Hvis regelen ikke er konfigurert eller er satt til «false» (usann), skal manifestnøkkelen required_platform_version ignoreres, og den automatiske oppdateringen fortsetter som normalt.</translation> <translation id="7417972229667085380">Prosentandelen for skalering av inaktivitetsforsinkelsen i presentasjonsmodus (avviklet)</translation> <translation id="7421483919690710988">Angi størrelse på mediediskbuffer i byte</translation> <translation id="7424751532654212117">Liste over unntak fra listen over deaktiverte programtillegg</translation>
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb index 333befe..56b11de5 100644 --- a/components/policy/resources/policy_templates_pl.xtb +++ b/components/policy/resources/policy_templates_pl.xtb
@@ -192,6 +192,13 @@ Ta zasada jest uwzględniana tylko wtedy, gdy włączona jest zasada „DefaultSearchProviderEnabled”.</translation> <translation id="1859633270756049523">Ogranicz długość sesji</translation> +<translation id="1859859319036806634">Ostrzeżenie: możliwość zastępczego użycia starszej wersji protokołu TLS zostanie wycofana z <ph name="PRODUCT_NAME" /> po wersji 52 (w okolicach września 2016 roku), a zasada przestanie działać. + + Jeśli uzgadnianie połączenia w protokole TLS nie udało się, <ph name="PRODUCT_NAME" /> wcześniej podejmował ponowną próbę nawiązania połączenia przy użyciu starszej wersji protokołu TLS, by obejść błędy w działaniu serwerów HTTPS. To ustawienie pozwala skonfigurować wersję, przy której ten proces zastępczego używania starszej wersji się zatrzyma. Jeśli serwer prawidłowo (tj. bez przerywania połączenia) przeprowadzi negocjowanie wersji, ustawienie nie będzie stosowane. Niezależnie od sposobu, w jaki zostanie nawiązane połączenie, musi być ono zgodne z wartością SSLVersionMin. + + Jeśli ta zasada nie jest skonfigurowana lub jest ustawiona na „tls1.2”, <ph name="PRODUCT_NAME" /> nie stosuje już tego rozwiązania zastępczego. Pamiętaj, że nie wyłącza to obsługi starszych wersji protokołu TLS, tylko określa, czy <ph name="PRODUCT_NAME" /> będzie mieć możliwość obejścia wadliwie działających serwerów, które nie są w stanie przeprowadzić prawidłowego negocjowania wersji. + + Jeśli utrzymanie zgodności z wadliwie działającym serwerem jest konieczne, można wybrać „tls1.1”. To jednak tylko rozwiązanie tymczasowe – serwer trzeba jak najszybciej naprawić.</translation> <translation id="1861037019115362154">Pozwala określić listę wtyczek wyłączonych w <ph name="PRODUCT_NAME" /> i uniemożliwia użytkownikom zmianę tego ustawienia. Możesz użyć symboli wieloznacznych „*” i „?”, by dopasować sekwencje dowolnych znaków. Symbol „*” odpowiada dowolnej liczbie znaków, natomiast „?” oznacza jeden opcjonalny znak (czyli jeden lub zero znaków). Znakiem zmiany znaczenia jest „\”, dlatego by wprowadzić faktyczny znak „*”, „?” lub „\”, musisz umieścić przed nim znak „\”. Jeśli włączysz to ustawienie, wtyczki wymienione na liście nigdy nie będą używane w <ph name="PRODUCT_NAME" />. Wtyczki są oznaczone jako wyłączone na stronie „about:plugins”, a użytkownicy nie mogą ich włączyć. Pamiętaj, że ta zasada jest zastępowana przez zasady EnabledPlugins i DisabledPluginsExceptions. Jeśli zasada nie zostanie ustawiona, użytkownik będzie mógł korzystać ze wszystkich wtyczek zainstalowanych w systemie oprócz przestarzałych, niebezpiecznych i niezgodnych wbudowanych wtyczek.</translation> <translation id="1865417998205858223">Uprawnienia klucza</translation> <translation id="186719019195685253">Działanie, jakie ma zostać podjęte po osiągnięciu opóźnienia bezczynności przy zasilaniu prądem zmiennym</translation> @@ -529,6 +536,7 @@ Określa, czy ma być włączone rozszerzenie certyfikatów TLS powiązanych z domeną. To ustawienie umożliwia testowanie rozszerzenia certyfikatów TLS powiązanych z domeną. Jest eksperymentalne i zostanie usunięte w przyszłości.</translation> +<translation id="2957506574938329824">Nie pozwalaj żadnym witrynom na wysyłanie żądań dostępu do urządzeń Bluetooth poprzez interfejs API Web Bluetooth</translation> <translation id="2957513448235202597">Rodzaj konta na potrzeby uwierzytelniania <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Reguły omijania serwera proxy</translation> <translation id="2960691910306063964">Włącz lub wyłącz uwierzytelnianie hostów dostępu zdalnego bez kodu PIN</translation> @@ -542,6 +550,7 @@ Wartość tej zasady powinna być określona w milisekundach. Wartości nie mogą być większe niż opóźnienie wyłączenia ekranu (jeśli jest ustawione) i opóźnienie bezczynności.</translation> <translation id="2987155890997901449">Włączenie ARC</translation> +<translation id="2987227569419001736">Kontrolowanie użycia interfejsu API Web Bluetooth</translation> <translation id="2998881342848488968">Ta zasada umożliwia <ph name="PRODUCT_OS_NAME" /> ominięcie dowolnego serwera proxy w celu uwierzytelnienia portalu przechwytującego. Zasada działa tylko wtedy, gdy serwer proxy jest skonfigurowany (np. przez zasadę, użytkownika na chrome://settings lub rozszerzenie). @@ -826,6 +835,7 @@ Ta zasada jest uwzględniana tyko wtedy, gdy włączona jest zasada „DefaultSearchProviderEnabled”.</translation> <translation id="4320376026953250541">Microsoft Windows XP z dodatkiem SP2 lub nowszy</translation> +<translation id="4322842393287974810">Zezwalaj aplikacji kiosku uruchamianej automatycznie z zerowym opóźnieniem na kontrolowanie wersji <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Dodaj przycisk wylogowania do paska zadań</translation> <translation id="4347908978527632940">Jeśli jest włączona i użytkownik jest nadzorowany, inne aplikacje na Androida mogą sprawdzać ograniczenia dostępu do internetu dla użytkownika za pośrednictwem dostawcy treści. @@ -1416,6 +1426,9 @@ Jeśli nie skonfigurujesz tej zasady, klawiatura ekranowa będzie wyłączona po pierwszym wyświetleniu ekranu logowania. Użytkownicy będą mogli ją włączyć i wyłączyć w każdej chwili i jej stan na tym ekranie będzie utrzymywany między użytkownikami.</translation> <translation id="6598235178374410284">Obraz awatara użytkownika</translation> +<translation id="6628646143828354685">Pozwala określić, czy strony mogą korzystać z urządzeń Bluetooth w pobliżu. Dostęp może być całkowicie zablokowany lub użytkownik może być pytany za każdym razem, gdy strona chce użyć takiego urządzenia. + + Jeśli ta zasada nie zostanie ustawiona, będzie stosowane ustawienie „3”, a użytkownik będzie mógł je zmienić.</translation> <translation id="6636268606788232221">Skonfiguruj ustawienia zarządzania energią, gdy użytkownik jest nieaktywny. Ta zasada określa szereg ustawień strategii zarządzania energią, gdy użytkownik jest nieaktywny. @@ -1491,6 +1504,7 @@ Jeśli skonfigurujesz tę zasadę, użytkownicy nie będą mogli jej zmienić ani zastąpić. Jeśli nie skonfigurujesz tej zasady, Opcje ułatwień dostępu nie będą widoczne w menu na pasku zadań, ale użytkownik będzie mógł włączyć ich wyświetlanie na stronie Ustawień.</translation> +<translation id="6766216162565713893">Zezwól, by witryny prosiły użytkownika o przyznanie dostępu do urządzeń Bluetooth w pobliżu</translation> <translation id="6770454900105963262">Informuj o aktywnych sesjach kiosku</translation> <translation id="6774533686631353488">Zezwól na hosty Wiadomości natywnych na poziomie użytkownika (instalowane bez uprawnień administratora).</translation> <translation id="6786747875388722282">Rozszerzenia</translation> @@ -1656,6 +1670,13 @@ <translation id="7340034977315324840">Zgłoś godziny aktywności urządzenia</translation> <translation id="7381326101471547614">Wyłącza protokół SPDY w <ph name="PRODUCT_NAME" />. Po włączeniu tej zasady protokół SPDY jest niedostępny w <ph name="PRODUCT_NAME" />. W przeciwnym razie protokołu można używać. Jeśli zasada nie zostanie ustawiona, protokół SPDY będzie dostępny.</translation> <translation id="7384999953864505698">Zezwala na protokół QUIC</translation> +<translation id="7406651467768226499">Czy zezwolić aplikacji kiosku uruchamianej automatycznie z zerowym opóźnieniem na kontrolowanie wersji <ph name="PRODUCT_OS_NAME" />. + + Ta zasada określa, czy uruchamiana automatycznie z zerowym opóźnieniem aplikacja kiosku może kontrolować wersję <ph name="PRODUCT_OS_NAME" /> przez zadeklarowanie w swoim pliku manifestu wartości klucza required_platform_version i używanie jej jako przedrostka docelowej wersji po aktualizacji automatycznej. + + Jeśli ustawisz w niej wartość prawda, wartość klucza manifestu required_platform_version uruchamianej automatycznie z zerowym opóźnieniem aplikacji kiosku będzie używana jako przedrostek docelowej wersji po aktualizacji automatycznej. + + Jeśli nie skonfigurujesz tej zasady lub ustawisz w niej wartość fałsz, klucz manifestu required_platform_version będzie ignorowany i aktualizacje automatyczne będą przebiegać normalnie.</translation> <translation id="7417972229667085380">Wartość procentowa skalowania opóźnienia bezczynności w trybie prezentacji (wycofana)</translation> <translation id="7421483919690710988">Ustaw rozmiar dyskowej pamięci podręcznej multimediów w bajtach</translation> <translation id="7424751532654212117">Lista wyjątków od listy wyłączonych wtyczek</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 2f9c110..c8e55cb 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -180,6 +180,13 @@ Esta política só é seguida se a política "DefaultSearchProviderEnabled" estiver ativada.</translation> <translation id="1859633270756049523">Limitar a duração da sessão</translation> +<translation id="1859859319036806634">Aviso: o substituto da versão do TLS será removido de <ph name="PRODUCT_NAME" /> após a versão 52 (por volta de setembro de 2016), e esta política deixará de funcionar. + + Quando um handshake de TLS falha, o <ph name="PRODUCT_NAME" /> recupera a conexão com uma versão inferior do TLS para evitar bugs nos servidores HTTPS. Essa definição configura a versão na qual o processo de substituição será interrompido. Se um servidor cumpre corretamente a negociação da versão (isto é, sem cortar a conexão), esta definição não é aplicável. Independentemente disso, a conexão resultante ainda deve estar em conformidade com SSLVersionMin. + + Se esta política não for configurada ou for definida como "tls1.2", o <ph name="PRODUCT_NAME" /> não realizará mais essa substituição. Isso não desativa a compatibilidade com versões de TLS mais antigas, apenas controla se o <ph name="PRODUCT_NAME" /> evitará servidores com bugs que não conseguem negociar versões corretamente. + + Caso contrário, se for necessário manter a compatibilidade com um servidor com bugs, esta política pode ser definida como "tls1.1". Esta é uma medida temporária, e o servidor deve ser corrigido rapidamente.</translation> <translation id="1861037019115362154">Especifica uma lista de plug-ins desativados no <ph name="PRODUCT_NAME" /> e impede os usuários de alterar essa definição. Os caracteres curinga "*" e "?" podem ser usados para associar sequências de caracteres arbitrários. "*" corresponde a um número arbitrário de caracteres, enquanto "?" especifica um único caractere opcional; ou seja, corresponde a zero ou um caractere. O caractere de escape é "\"; portanto, para associar os caracteres "*", "?" ou "\" propriamente ditos, você pode adicionar "\" na frente deles. @@ -517,6 +524,7 @@ Especifica se a extensão dos certificados vinculados ao domínio TLS deve ser ativada. Essa extensão é usada para ativar a extensão dos certificados vinculados ao domínio TLS para testes. Essa configuração experimental será removida no futuro.</translation> +<translation id="2957506574938329824">Não permitir que nenhum site solicite acesso a dispositivos Bluetooth por meio da API Web Bluetooth</translation> <translation id="2957513448235202597">Tipo de conta para autenticação <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Regras de proxies ignoráveis</translation> <translation id="2960691910306063964">Ativar ou desativar autenticação sem PIN para hosts de acesso remoto</translation> @@ -530,6 +538,7 @@ O valor da política deve ser especificado em milissegundos. Os valores são fixos de modo a serem inferiores ou iguais ao intervalo de desligamento da tela (se definido) e ao intervalo de inatividade.</translation> <translation id="2987155890997901449">Ativar ARC</translation> +<translation id="2987227569419001736">Controlar o uso da API Web Bluetooth</translation> <translation id="2998881342848488968">Esta política permite que o <ph name="PRODUCT_OS_NAME" /> ignore qualquer proxy de autenticação de portal cativo. Esta política só entra em vigor se um proxy é configurado (por exemplo, por meio de política pelo usuário em chrome://settings ou por extensões). @@ -1390,6 +1399,9 @@ Se essa política não for definida, o teclado na tela será desativado quando a tela de login for exibida pela primeira vez. Os usuários podem ativá-lo ou desativá-lo a qualquer momento e seu status na tela de login é mantido entre os usuários.</translation> <translation id="6598235178374410284">Imagem do avatar do usuário</translation> +<translation id="6628646143828354685">Permite definir se os websites podem ter acesso aos dispositivos Bluetooth nas proximidades. O acesso pode ser completamente bloqueado, ou uma pergunta será feita ao usuário cada vez que um website quiser ter acesso a dispositivos Bluetooth próximos. + + Se esta política não for definida, será usado "3", e o usuário poderá fazer alterações.</translation> <translation id="6636268606788232221">Definir as configurações de gerenciamento de energia quando o usuário se torna inativo. Esta política controla várias configurações relativas à estratégia de gerenciamento de energia quando o usuário se torna inativo. @@ -1465,6 +1477,7 @@ Se você definir essa política, os usuários não poderão alterá-la ou modificá-la. Se essa política não for definida, as opções de acessibilidade não serão exibidas no menu da bandeja do sistema, mas o usuário poderá fazer com que elas sejam exibidas por meio da página "Configurações".</translation> +<translation id="6766216162565713893">Permitir que os sites solicitem acesso ao usuário a um dispositivo Bluetooth próximo</translation> <translation id="6770454900105963262">Denunciar informações sobre sessões de quiosque ativas</translation> <translation id="6774533686631353488">Permite hosts de Mensagem nativos em nível de usuário (instalados sem permissão do administrador).</translation> <translation id="6786747875388722282">Extensões</translation> @@ -1644,7 +1657,7 @@ Esta política controla se o app em Kiosk aberto automaticamente com zero de atraso tem permissão para controlar a versão do <ph name="PRODUCT_OS_NAME" />, declarando um required_platform_version em seu manifesto e usando-o como o prefixo de atualização automática de versão de destino. - Se a política for definida como "true", o valor da chave de manifesto required_platform_version do app em Kiosk aberto automaticamente com zero d atraso será usado como prefixo de atualização automática de versão de destino. + Se a política for definida como "true", o valor da chave de manifesto required_platform_version do app em Kiosk aberto automaticamente com zero de atraso será usado como prefixo de atualização automática de versão de destino. Se a política não estiver configurada ou estiver definida como "false", a chave de manifesto required_platform_version será ignorada, e a atualização automática prosseguirá normalmente.</translation> <translation id="7417972229667085380">Percentual pelo qual calcular o intervalo de inatividade no modo de apresentação (uso suspenso)</translation>
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb index 76bc8f25..cb3e3ba 100644 --- a/components/policy/resources/policy_templates_pt-PT.xtb +++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -199,6 +199,13 @@ Esta política só será seguida se a política "DefaultSearchProviderEnabled" estiver ativada.</translation> <translation id="1859633270756049523">Limitar a duração da sessão</translation> +<translation id="1859859319036806634">Aviso: a alternativa da versão do TLS será removida do <ph name="PRODUCT_NAME" /> após a versão 52 (em meados de setembro de 2016) e esta política deixa de funcionar nessa altura. + + Anteriormente, quando um handshake de TLS falhava, o <ph name="PRODUCT_NAME" /> tentava estabelecer novamente ligação com uma versão inferior do TLS para contornar os erros dos servidores HTTPS. Esta definição configura a versão na qual este processo alternativo para. Se um servidor executar corretamente a negociação da versão (ou seja, sem interromper a ligação), esta definição não se aplica. Independentemente disso, a ligação resultante deve, mesmo assim, estar em conformidade com a política SSLVersionMin. + + Se esta política não estiver configurada ou estiver definida para "tls1.2", o <ph name="PRODUCT_NAME" /> já não executa este processo alternativo. Tenha em atenção que esta operação não desativa o suporte para versões mais antigas do TLS, mas determina apenas se o <ph name="PRODUCT_NAME" /> deve contornar servidores com erros que não consigam negociar versões corretamente. + + Caso contrário, se for necessário manter a compatibilidade com um servidor com erros, é possível definir esta política para "tls1.1". Esta é uma medida temporária e o servidor deve ser reparado rapidamente.</translation> <translation id="1861037019115362154">Especifica uma lista de plug-ins desativados no <ph name="PRODUCT_NAME" /> e impede que os utilizadores alterem esta definição. Os caracteres universais "*" e "?" podem ser utilizados para estabelecer correspondência com sequências de caracteres arbitrários. "*" corresponde a um número arbitrário de caracteres, ao passo que "?" indica um carácter único opcional, ou seja, corresponde aos caracteres zero ou um. O carácter de escape é "\", pelo que, para fazer corresponder os caracteres reais "*", "?" ou "\", pode colocar um "\" à frente deles. @@ -540,6 +547,7 @@ Especifica se a extensão de certificados de vinculação ao domínio TLS deveria ser ativada. Esta definição é utilizada para ativar os certificados de vinculação ao domínio TLS para testes. Esta definição experimental será removida no futuro.</translation> +<translation id="2957506574938329824">Não permitir que os sites solicitem acesso a dispositivos Bluetooth através da API Web Bluetooth</translation> <translation id="2957513448235202597">Tipo de conta para a autenticação <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Regras para ignorar o proxy</translation> <translation id="2960691910306063964">Ativar ou desativar a autenticação sem PIN para anfitriões de acesso remoto</translation> @@ -553,6 +561,7 @@ O valor da política deve ser especificado em milissegundos. Os valores devem ser inferiores ou iguais ao atraso para desligar o ecrã (se estiver definido) e ao atraso de inatividade.</translation> <translation id="2987155890997901449">Ativar ARC</translation> +<translation id="2987227569419001736">Controlar a utilização da API Web Bluetooth</translation> <translation id="2998881342848488968">Esta política permite ao <ph name="PRODUCT_OS_NAME" /> ignorar qualquer proxy para autenticação do portal cativo. Esta política apenas é efetiva se um proxy estiver configurado (por exemplo através da política, pelo utilizador em chrome://settings ou por extensões). @@ -1426,6 +1435,9 @@ Se esta política não for definida, o teclado no ecrã é desativado quando o ecrã de início de sessão é apresentado pela primeira vez. Os utilizadores podem ativar ou desativar o teclado no ecrã a qualquer momento e o seu estado no ecrã de início de sessão persiste entre utilizadores.</translation> <translation id="6598235178374410284">Imagem do avatar do utilizador</translation> +<translation id="6628646143828354685">Permite definir se os Websites estão autorizados a obter acesso a dispositivos Bluetooth próximos. É possível bloquear completamente o acesso ou o utilizador pode ser consultado sempre que um Website pretenda obter acesso a dispositivos Bluetooth próximos. + + Se esta política não for definida, é utilizada a definição "3" e o utilizador pode alterá-la.</translation> <translation id="6636268606788232221">Configure definições de gestão de energia quando o utilizador fica inativo. Esta política controla várias definições para a estratégia de gestão de energia quando o utilizador fica inativo. @@ -1501,6 +1513,7 @@ Se definir esta política, os utilizadores não a podem alterar nem substituir. Se esta política não for definida, as opções de Acessibilidade não aparecerão no menu do tabuleiro do sistema, mas o utilizador pode fazer com que as opções de Acessibilidade apareçam através da página Definições.</translation> +<translation id="6766216162565713893">Permitir que os sites solicitem ao utilizador a concessão de acesso a dispositivos Bluetooth próximos</translation> <translation id="6770454900105963262">Comunicar informações acerca de sessões ativas do quiosque</translation> <translation id="6774533686631353488">Permitir anfitriões de Mensagens nativas de nível de utilizador (instalados sem autorizações de administração).</translation> <translation id="6786747875388722282">Extensões</translation>
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb index 54decd6..4f06344 100644 --- a/components/policy/resources/policy_templates_ro.xtb +++ b/components/policy/resources/policy_templates_ro.xtb
@@ -197,6 +197,13 @@ Această politică este urmată numai dacă este activată politica „DefaultSearchProviderEnabled”.</translation> <translation id="1859633270756049523">Limitați durata sesiunii</translation> +<translation id="1859859319036806634">Avertisment: revenirea la versiunea TLS va fi eliminată din <ph name="PRODUCT_NAME" /> după versiunea 52 (aproximativ în septembrie 2016), iar această politică nu va mai funcționa de la data respectivă. + + Când un dialog de confirmare TLS nu se finaliza, <ph name="PRODUCT_NAME" /> încerca anterior să se conecteze folosind o versiune TLS inferioară pentru a evita erorile de pe serverele HTTPS. Această setare configurează versiunea la care se va opri procesul de revenire. Dacă un server efectuează corect negocierea versiunii (de ex., fără să întrerupă conexiunea), atunci setarea nu se aplică. În orice caz, conexiunea rezultată trebuie totuși să respecte SSLVersionMin. + + Dacă această politică nu este configurată sau este setată la „tls1.2”, atunci <ph name="PRODUCT_NAME" /> nu mai efectuează această revenire. Reține că astfel nu se dezactivează compatibilitatea pentru versiunile TLS mai vechi, ci doar se stabilește dacă <ph name="PRODUCT_NAME" /> va ocoli serverele cu erori care nu pot negocia corect versiunile. + + În caz contrar, dacă trebuie menținută compatibilitatea cu un server cu erori, politica poate fi setată la „tls1”. Aceasta este o măsură temporară, iar problemele de pe server trebuie să fie remediate rapid.</translation> <translation id="1861037019115362154">Specifică o listă de pluginuri dezactivate în <ph name="PRODUCT_NAME" /> și nu le permite utilizatorilor să modifice această setare. Pentru a găsi secvențe de caractere arbitrare, pot fi folosite metacaracterele „*” și „?”. „*” corespunde unui număr arbitrar de caractere, în timp ce „?” specifică un caracter opțional unic, adică înlocuiește zero caractere sau un singur caracter. Caracterul escape este „\”, astfel încât pentru a obține caracterele „*”, „?” și „\” în sine, puteți adăuga caracterul „\” în fața acestora. @@ -540,6 +547,7 @@ Specifică dacă extensia pentru certificatele TLS legate la domeniu trebuie să fie activată. Setarea este folosită pentru a activa extensia pentru certificatele TLS legate la domeniu în vederea testării. Pe viitor, această setare experimentală va fi eliminată.</translation> +<translation id="2957506574938329824">Nu permite niciunui site să solicite acces la dispozitivele Bluetooth prin API-ul Web Bluetooth</translation> <translation id="2957513448235202597">Tipul de cont pentru autentificarea <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Reguli de ocolire a proxy-ului</translation> <translation id="2960691910306063964">Activează sau dezactivează autentificarea fără cod PIN pentru gazdele de acces la distanță</translation> @@ -553,6 +561,7 @@ Valoarea politicii trebuie specificată în milisecunde. Valorile trebuie să fie mai mici sau egale cu intervalul pentru oprirea ecranului (dacă este setat) și cu intervalul de inactivitate.</translation> <translation id="2987155890997901449">Activează ARC</translation> +<translation id="2987227569419001736">Controlează folosirea API-ului Web Bluetooth</translation> <translation id="2998881342848488968">Această politică permite <ph name="PRODUCT_OS_NAME" /> să ocolească orice proxy pentru autentificarea prin portalul captiv. Această politică are efect numai dacă este configurat un proxy (de exemplu, conform unei politici, de utilizatori în chrome://settings sau prin extensii). @@ -841,6 +850,7 @@ Această politică este urmată numai dacă este activată politica „DefaultSearchProviderEnabled”.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 sau o versiune ulterioară</translation> +<translation id="4322842393287974810">Permite aplicației chioșc lansate automat fără nicio întârziere să controleze versiunea <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Adăugați un buton de deconectare în bara de sistem</translation> <translation id="4347908978527632940">Dacă este activată, iar utilizatorul este unul monitorizat, alte aplicații Android pot interoga restricțiile web ale utilizatorului printr-un furnizor de conținut. @@ -1435,6 +1445,9 @@ Dacă politica nu este configurată, tastatura pe ecran este dezactivată la prima afișare a ecranului de conectare. Utilizatorii pot activa sau dezactiva oricând tastatura pe ecran, iar starea acesteia pe ecranul de conectare se păstrează de la un utilizator la altul.</translation> <translation id="6598235178374410284">Imagine cu avatarul de utilizator</translation> +<translation id="6628646143828354685">Îți permite să setezi dacă site-urile primesc acces la dispozitivele Bluetooth din apropiere. Accesul poate fi blocat complet sau utilizatorul poate fi întrebat de fiecare dată când un site dorește să primească acces la dispozitivele Bluetooth din apropiere. + + Dacă această politică nu este configurată, va fi folosită valoarea „3”, iar utilizatorul o va putea modifica.</translation> <translation id="6636268606788232221">Configurează setările pentru gestionarea consumului de energie când utilizatorul devine inactiv. Această politică controlează mai multe setări pentru strategia de gestionare a consumului de energie atunci când utilizatorul devine inactiv. @@ -1510,6 +1523,7 @@ Dacă politica este configurată, utilizatorii nu o pot modifica sau suprascrie. Dacă politica nu este configurată, opțiunile de accesibilitate nu vor apărea în meniul barei de sistem, dar utilizatorul poate afișa opțiunile de accesibilitate prin intermediul paginii Setări.</translation> +<translation id="6766216162565713893">Permite site-urilor să solicite utilizatorului să acorde accesul la un dispozitiv Bluetooth din apropiere</translation> <translation id="6770454900105963262">Raportează informații despre sesiunile chioșc active</translation> <translation id="6774533686631353488">Permiteți gazde de mesagerie nativă la nivel de utilizator (instalate fără permisiuni de administrator)</translation> <translation id="6786747875388722282">Extensii</translation> @@ -1686,6 +1700,13 @@ <translation id="7340034977315324840">Raportați perioadele de activitate ale dispozitivului</translation> <translation id="7381326101471547614">Dezactivează utilizarea protocolul SPDY în <ph name="PRODUCT_NAME" />. Dacă această politică este activată, protocolul SPDY nu va fi disponibil în <ph name="PRODUCT_NAME" />. Dezactivarea acestei politici va permite utilizarea protocolului SPDY. Dacă această politică rămâne nesetată, SPDY va fi disponibil.</translation> <translation id="7384999953864505698">Permite protocolul QUIC</translation> +<translation id="7406651467768226499">Dacă aplicația chioșc lansată automat fără nicio întârziere poate să controleze versiunea <ph name="PRODUCT_OS_NAME" />. + + Această politică stabilește dacă aplicația chioșc lansată automat fără nicio întârziere poate să controleze versiunea <ph name="PRODUCT_OS_NAME" /> declarând o valoare pentru required_platform_version în manifestul său și să o folosească drept prefixul versiunii țintă de actualizare automată. + + Dacă politica este activată, valoarea cheii din manifest required_platform_version a aplicației chioșc lansate automat fără nicio întârziere este folosită drept prefixul versiunii țintă de actualizare automată. + + Dacă politica nu este configurată sau este dezactivată, cheia din manifest required_platform_version este ignorată, iar actualizarea automată se face ca de obicei.</translation> <translation id="7417972229667085380">Procentul cu care se ajustează intervalul de inactivitate în modul de prezentare (politică învechită)</translation> <translation id="7421483919690710988">Setați dimensiunea în octeți a memoriei cache pe disc pentru conținut media</translation> <translation id="7424751532654212117">Lista de excepții de la lista cu pluginuri dezactivate</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index d996e49..071a8094 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -173,6 +173,13 @@ Данная политика действует только в случае, если включена политика 'DefaultSearchProviderEnabled'.</translation> <translation id="1859633270756049523">Продолжительность сеанса</translation> +<translation id="1859859319036806634">Внимание! После выхода версии 52 (примерно в сентябре 2016 г.) возможность отката TLS будет удалена из <ph name="PRODUCT_NAME" />, и это правило перестанет работать. + + Когда установить соединение по TLS не удается из-за ошибок на HTTPS-серверах, <ph name="PRODUCT_NAME" /> пытается использовать TLS предыдущей версии. Это правило позволяет указать версию, по достижении которой откат будет остановлен. Если сервер согласует версии без разрыва соединения, правило не применяется. Так или иначе, итоговое подключение должно соответствовать SSLVersionMin. + + Если правило не настроено либо для него задано значение tls1.2, <ph name="PRODUCT_NAME" /> не выполняет откат. При этом поддержка предыдущих версий TLS не отключается. Правило лишь определяет, будет ли <ph name="PRODUCT_NAME" /> пытаться установить соединение с серверами, которые не могут выполнить согласование версий. + + Если поддерживать совместимость с неисправным сервером необходимо, установите значение tls1.1. Однако помните, что это временная мера и ошибки на сервере следует устранить как можно скорее.</translation> <translation id="1861037019115362154">Задает список плагинов, которые должны быть отключены в <ph name="PRODUCT_NAME" />, и запрещает пользователям изменять его. Для замены отдельных символов или их последовательностей можно использовать подстановочные знаки: звездочку (*) и вопросительный знак (?). Звездочка заменяет любое количество символов, а вопросительный знак соответствует одному символу или его отсутствию. Чтобы ввести символ звездочки или вопросительный знак как таковой, добавьте перед ним обратную косую черту (\). @@ -512,6 +519,7 @@ Оно определяет, использовать ли TLS-расширение для сертификатов, привязанных к домену. Эта настройка используется для тестирования TLS-расширения для сертификатов, привязанных к домену. Она является экспериментальной, и в будущем мы ее удалим.</translation> +<translation id="2957506574938329824">Запретить всем сайтам запрашивать доступ к Bluetooth-устройствам через Web Bluetooth API</translation> <translation id="2957513448235202597">Тип аккаунта для аутентификации <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Правила игнорирования прокси-серверов</translation> <translation id="2960691910306063964">Включает/отключает аутентификацию без PIN-кода для хостов удаленного доступа</translation> @@ -525,6 +533,7 @@ Значение правила следует указывать в миллисекундах. Оно не должно быть больше времени задержки отключения экрана (если оно задано) и перехода в спящий режим.</translation> <translation id="2987155890997901449">Включить ARC</translation> +<translation id="2987227569419001736">Контроль использования Web Bluetooth API</translation> <translation id="2998881342848488968">Это правило позволяет <ph name="PRODUCT_OS_NAME" /> обходить прокси-серверы при аутентификации на адаптивных порталах. Правило срабатывает лишь в том случае, когда настроен прокси-сервер (например, через правила, лично пользователем в chrome://settings или через расширения). @@ -803,6 +812,7 @@ Данная политика действует только в случае, если включена политика 'DefaultSearchProviderEnabled'.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 или более поздней версии</translation> +<translation id="4322842393287974810">Разрешает киоск-приложению, которое запускается автоматически и без задержек, управлять версией <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Кнопка выхода в области уведомлений</translation> <translation id="4347908978527632940">Если вы укажете значение True, то другие приложения для Android смогут запрашивать данные об ограничениях контролируемого профиля у поставщика контента. @@ -1395,6 +1405,9 @@ Если это правило не настроено, экранная клавиатура будет отключена при первом открытии экрана входа. Пользователи смогут включить и отключить ее в любой момент, и выбранный ими режим будет действовать для экрана входа.</translation> <translation id="6598235178374410284">Изображение для профиля пользователя</translation> +<translation id="6628646143828354685">Позволяет указать, разрешен ли сайтам доступ к находящимся поблизости Bluetooth-устройствам. В зависимости от выбранных настроек, доступ полностью блокируется либо запрашивается при каждой попытке подключиться к Bluetooth-устройству. + + Если правило не настроено, используется значение 3, однако пользователь может изменить его.</translation> <translation id="6636268606788232221">Управление электропитанием в режиме неактивности. Это правило регулирует сразу несколько параметров электропитания. @@ -1470,6 +1483,7 @@ Если правило настроено, пользователи не могут его изменить. Если правило не настроено, специальных возможностей не будет в меню на панели задач, но пользователь сможет их туда добавить на странице настроек.</translation> +<translation id="6766216162565713893">Разрешить сайтам запрашивать доступ к находящимся поблизости Bluetooth-устройствам</translation> <translation id="6770454900105963262">Показывать информацию об активных сеансах киоска</translation> <translation id="6774533686631353488">Разрешить установку хостов на уровне пользователей для обмена сообщениями с оригинальными приложениями (без разрешения администратора)</translation> <translation id="6786747875388722282">Расширения</translation> @@ -1645,6 +1659,13 @@ <translation id="7340034977315324840">Сообщать о продолжительности работы устройства</translation> <translation id="7381326101471547614">Данная политика отключает использование в <ph name="PRODUCT_NAME" /> протокола SPDY. Если она включена, этот протокол будет недоступен в <ph name="PRODUCT_NAME" />. Его можно будет использовать, если не настраивать эту политику или отключить ее.</translation> <translation id="7384999953864505698">Разрешает использование протокола QUIC</translation> +<translation id="7406651467768226499">Разрешает киоск-приложению, которое запускается автоматически и без задержек, управлять версией <ph name="PRODUCT_OS_NAME" />. + +С помощью этого правила можно разрешить киоск-приложению, которое запускается автоматически и без задержек, управлять версией <ph name="PRODUCT_OS_NAME" />. Для этого в манифесте необходимо указать нужную версию платформы (required_platform_version) в виде префикса. Система будет обновлена до этой версии автоматически. + + Если для правила задано значение true, система будет обновлена до версии, соответствующей префиксу required_platform_version в манифесте киоск-приложения. + + Если задано значение false, префикс версии из манифеста киоск-приложения игнорируется, а автоматическое обновление системы происходит в обычном режиме.</translation> <translation id="7417972229667085380">Коэффициент увеличения задержки перехода в ждущий режим в режиме презентации (больше не поддерживается)</translation> <translation id="7421483919690710988">Задать размер кеша для медиаданных в байтах</translation> <translation id="7424751532654212117">Список исключений для отключенных плагинов</translation>
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index 51a9f00c..56b7161 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -204,6 +204,13 @@ Toto pravidlo sa rešpektuje iba v prípade, ak je povolené pravidlo DefaultSearchProviderEnabled.</translation> <translation id="1859633270756049523">Obmedziť dĺžku relácie</translation> +<translation id="1859859319036806634">Upozornenie: Po verzii 52 (približne v septembri 2016) bude záložná verzia protokolu TLS odstránená z prehliadača <ph name="PRODUCT_NAME" /> a toto pravidlo prestane fungovať. + + Ak sa nepodarí nadviazať pripojenie prostredníctvom protokolu TLS, <ph name="PRODUCT_NAME" /> sa ho pokúsi nadviazať pomocou nižšej verzie protokolu TLS, aby tak bolo možné obísť chyby v serveroch HTTPS. Toto nastavenie umožňuje nakonfigurovať verziu, pri ktorej sa tento záložný proces zastaví. Ak server verziu vyjedná správne (t. j. bez prerušenia pripojenia), toto nastavenie sa nepoužije. Napriek tomu však musí byť výsledné pripojenie v súlade s pravidlom SSLVersionMin. + + Ak toto pravidlo nie je nakonfigurované alebo je nastavené na hodnotu „tls1.2“, prehliadač <ph name="PRODUCT_NAME" /> tento záložný postup nevykoná. Upozorňujeme, že touto akciou sa neruší podpora pre staršie verzie protokolu TLS, ale iba to, či sa bude prehliadač <ph name="PRODUCT_NAME" /> obchádzať chybné servery, ktoré nedokážu správne vyjednávať verzie. + + Ak musí byť zachovaná kompatibilita s chybným serverom, pravidlo môže byť nastavené na hodnotu „tls1“. Ide o krátkodobé riešenie a príslušný server by mal byť urýchlene opravený.</translation> <translation id="1861037019115362154">Určuje zoznam zakázaných doplnkov aplikácie <ph name="PRODUCT_NAME" /> a bráni používateľom toto nastavenie zmeniť. Ako zástupné znaky je možné použiť znaky „*“ a „?“. Znak „*“ slúži ako zástupný znak pre ľubovoľný počet znakov, zatiaľ čo znak „?“ určuje jeden voliteľný znak (môže teda zastupovať jeden ľubovoľný znak alebo znak chýbajúci). Znak zrušenia významu je „\“, takže ak chcete zadať samotné znaky „*“, „?“ alebo „\“, stačí pred nich umiestniť znak „\“. @@ -593,6 +600,7 @@ Určuje, či má byť povolené rozšírenie pre certifikáty TLS typu domain-bound. Toto nastavenie slúži na povolenie rozšírenia pre certifikáty TLS typu domain-bound na testovacie účely. Toto experimentálne nastavenie bude v budúcnosti odstránené.</translation> +<translation id="2957506574938329824">Nepovoliť žiadnemu webu požadovať prístup k zariadeniam Bluetooth prostredníctvom rozhrania Web Bluetooth API</translation> <translation id="2957513448235202597">Typ účtu pre overenie <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Pravidlá vynechania servera proxy</translation> <translation id="2960691910306063964">Povolenie alebo zakázanie overenia totožnosti bez použitia kódu PIN pre hostiteľov vzdialeného prístupu</translation> @@ -606,6 +614,7 @@ Hodnota pravidla by mala byť uvedená v milisekundách. Hodnoty musia byť nižšie alebo rovnaké ako oneskorenie vypnutia obrazovky (pokiaľ je nastavené) a oneskorenie režimu nečinnosti.</translation> <translation id="2987155890997901449">Povoliť funkciu ARC</translation> +<translation id="2987227569419001736">Ovládať používanie rozhrania Web Bluetooth API</translation> <translation id="2998881342848488968">Toto pravidlo umožňuje operačnému systému <ph name="PRODUCT_OS_NAME" /> obísť akýkoľvek proxy server na overenie totožnosti pomocou prihlasovacieho portálu. Toto pravidlo sa použije iba v prípade, že je nakonfigurovaný proxy server (napríklad pomocou pravidla, používateľským nastavením na stránke chrome://settings alebo pomocou rozšírení). @@ -1595,6 +1604,9 @@ Ak toto pravidlo nenastavíte, bude pri prvom zobrazení prihlasovacej obrazovky klávesnica na obrazovke deaktivovaná. Používatelia budú môcť klávesnicu na obrazovke kedykoľvek aktivovať alebo deaktivovať a zvolený stav na prihlasovacej obrazovke pretrvá aj u iných používateľov.</translation> <translation id="6598235178374410284">Obrázok avatara používateľa</translation> +<translation id="6628646143828354685">Umožňuje nastaviť, či môžu weby získať prístup k zariadeniam Bluetooth v blízkosti. Prístup môže byť úplne zablokovaný alebo je možné používateľa požiadať, keď chce web získať prístup k zariadeniam Bluetooth v blízkosti. + + Ak toto pravidlo ponecháte nenastavené, použije sa hodnota 3 a používateľ ju bude môcť zmeniť.</translation> <translation id="6636268606788232221">Nastavte správu spotreby energie, keď je používateľ nečinný. Toto pravidlo ovláda viaceré nastavenia pre stratégiu správy spotreby energie, keď je používateľ nečinný. @@ -1687,6 +1699,7 @@ Ak toto pravidlo nastavíte, používatelia ho nebudú môcť zmeniť ani prepísať. Ak nie je toto pravidlo nastavené, možnosti dostupnosti sa v oblasti oznámení nezobrazia, avšak používatelia ich môžu sprístupniť na stránke Nastavenia.</translation> +<translation id="6766216162565713893">Povoliť webom žiadať používateľa o prístup k zariadeniam Bluetooth v blízkosti</translation> <translation id="6770454900105963262">Nahlásiť informácie o aktívnych reláciách verejného terminálu</translation> <translation id="6774533686631353488">Povolenie hostiteľov zasielania natívnych správ na používateľskej úrovni (nainštalovaných bez administrátorských povolení).</translation> <translation id="6786747875388722282">Rozšírenia</translation>
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb index d9df3bf..ff8fb9d 100644 --- a/components/policy/resources/policy_templates_sl.xtb +++ b/components/policy/resources/policy_templates_sl.xtb
@@ -209,6 +209,13 @@ Ta pravilnik se upošteva samo, če je omogočen pravilnik »DefaultSearchProviderEnabled«.</translation> <translation id="1859633270756049523">Omejitev dolžine seje</translation> +<translation id="1859859319036806634">Opozorilo: preklop na različico TLS-ja bo odstranjen iz brskalnika <ph name="PRODUCT_NAME" /> po različici 52 (približno septembra 2016) in ta pravilnik bo takrat prenehal delovati. + + Če rokovanje TLS ne uspe, <ph name="PRODUCT_NAME" /> pred tem poskusi vzpostaviti povezavo z nižjo različico TLS-ja, da mu ni treba upoštevati napak v strežnikih HTTPS. Ta nastavitev konfigurira različico, pri kateri se postopek preklopa ustavi. Če strežnik pravilno izvede pogajanja glede različice (tj. brez prekinitve povezave), se ta nastavitev ne uporabi. Ne glede na to mora biti vzpostavljena povezava skladna s pravilnikom SSLVersionMin. + + Če ta pravilnik ni konfiguriran ali če je nastavljen na »tls1.2«, <ph name="PRODUCT_NAME" /> ne izvede več tega preklopa. S tem ni onemogočena podpora za starejše različice TLS-ja, temveč je zgolj določeno, ali <ph name="PRODUCT_NAME" /> ne bo upošteval strežnikov z napakami, ki ne morejo pravilno izvesti pogajanj glede različice. + + Če je treba ohraniti združljivost s strežnikom z napakami, je pravilnik lahko nastavljen na »tls1«. To je začasen ukrep in napake v strežniku je treba hitro odpraviti.</translation> <translation id="1861037019115362154">Določi seznam vtičnikov, ki so omogočeni v brskalniku <ph name="PRODUCT_NAME" />, in prepreči uporabnikom spreminjanje te nastavitve. Nadomestna znaka * in ? je mogoče uporabiti za nadomeščanje zaporedij poljubnih znakov. Znak * nadomešča poljubno število znakov, znak ? pa izbirni posamezen znak, tj. nadomešča nič znakov ali en znak. Ubežni znak je \; če torej želite nadomestiti dejanske znake *, ? ali \, lahko postavite prednje znak \. @@ -596,6 +603,7 @@ Določa, ali mora biti razširitev za potrdila, domensko vezana na TLS, omogočena. Ta nastavitev se uporablja, da se razširitev za potrdila, domensko vezana na TLS, omogoči za preskušanje. Ta poskusna nastavitev bo v prihodnosti odstranjena.</translation> +<translation id="2957506574938329824">Ne dovoli nobenemu spletnemu mestu zahtevanja dostopa do naprav Bluetooth prek API-ja za Web Bluetooth</translation> <translation id="2957513448235202597">Vrsta računa za preverjanje pristnosti z razširitvijo <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Pravila, kdaj se obide proxy</translation> <translation id="2960691910306063964">Omogočanje ali onemogočanje preverjanja pristnosti brez kode PIN za gostitelje za oddaljeni dostop</translation> @@ -609,6 +617,7 @@ Vrednost pravilnika naj bo navedena v milisekundah. Vrednosti morajo biti manjše ali enake kot časovni zamik izklopa zaslona (če je nastavljen) in časovnik zamik nedejavnosti.</translation> <translation id="2987155890997901449">Omogočanje ARC-ja</translation> +<translation id="2987227569419001736">Nadzor uporabe API-ja za Web Bluetooth</translation> <translation id="2998881342848488968">Ta pravilnik sistemu <ph name="PRODUCT_OS_NAME" /> omogoča obhod katerega koli strežnika proxy za preverjanje pristnosti v prestreznih portalih. Pravilnik se uveljavi samo, če je nastavljen strežnik proxy (na primer s pravilnikom, z razširitvami ali če ga je nastavil uporabnik v »chrome://settings«). @@ -932,6 +941,7 @@ Ta pravilnik se upošteva samo, če je omogočen pravilnik »DefaultSearchProviderEnabled«.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 ali novejši</translation> +<translation id="4322842393287974810">Dovoli samodejno zagnani aplikaciji za kiosk brez zamika nadzor nad različico sistema <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Dodajanje gumb za odjavo v sistemsko vrstico</translation> <translation id="4347908978527632940">Če je omogočeno in je uporabnik zaščiteni uporabnik, lahko druge aplikacije za Android prek ponudnika vsebine pošljejo poizvedbe o uporabnikovih spletnih omejitvah. @@ -1610,6 +1620,9 @@ Če ta pravilnik ni nastavljen, je zaslonska tipkovnica onemogočena pri prvem prikazu zaslona za prijavo. Uporabniki lahko zaslonsko tipkovnico kadar koli omogočijo ali onemogočijo in njeno stanje na zaslonu za prijavo velja za vse uporabnike.</translation> <translation id="6598235178374410284">Slika za avatar uporabnika</translation> +<translation id="6628646143828354685">Omogoča nastavitev, ali lahko spletna mesta dostopajo do naprav Bluetooth v bližini. Dostop je mogoče v celoti blokirati ali pa je uporabnik vprašan, ko želi spletno mesto dostopati do naprav Bluetooth v bližini. + + Če ta pravilnik ni nastavljen, je uporabljeno »3« in uporabnik lahko to spremeni.</translation> <translation id="6636268606788232221">Konfigurira nastavitve upravljanja energije, ko uporabnik postane nedejaven. Ta pravilnik nadzira različne nastavitve za strategijo upravljanja energije, ko uporabnik postane nedejaven. @@ -1702,6 +1715,7 @@ Če nastavite ta pravilnik, ga uporabniki ne morejo spremeniti ali preglasiti. Če ta pravilnik ni nastavljen, možnosti funkcij za ljudi s posebnimi potrebami niso prikazane v meniju sistemske vrstice, vendar lahko uporabniki nastavijo, da so možnosti funkcij za ljudi s posebnimi potrebami prikazane prek strani z nastavitvami.</translation> +<translation id="6766216162565713893">Dovoli spletnim mestom, da od uporabnika zahtevajo, da omogočijo dostop do naprave Bluetooth v bližini</translation> <translation id="6770454900105963262">Poročanje podatkov o aktivnih sejah kioska</translation> <translation id="6774533686631353488">Dovoli gostitelje izvornega pošiljanja na uporabniški ravni (nameščene brez dovoljenj skrbnika).</translation> <translation id="6786747875388722282">Razširitve</translation> @@ -1899,6 +1913,13 @@ Če pravilnik ni nastavljen, bo protokol SPDY na voljo.</translation> <translation id="7384999953864505698">Dovoli protokol QUIC</translation> +<translation id="7406651467768226499">Ali naj se samodejno zagnani aplikaciji za kiosk brez zamika dovoli nadzor nad različico sistema <ph name="PRODUCT_OS_NAME" />. + + Ta pravilnik nadzira, ali naj se samodejno zagnani aplikaciji za kiosk brez zamika dovoli nadzor nad različico sistema <ph name="PRODUCT_OS_NAME" /> z označitvijo različice required_platform_version v njenem manifestu in njeno uporabo kot predpono za samodejno posodobitev ciljne različice. + + Če je pravilnik omogočen, se vrednost ključa manifesta required_platform_version samodejno zagnane aplikacije za kiosk brez zamika uporabi kot predpona za samodejno posodobitev ciljne različice. + + Če pravilnik ni konfiguriran ali ni omogočen, je ključ manifesta required_platform_version prezrt in samodejna posodobitev se nadaljuje kot običajno.</translation> <translation id="7417972229667085380">Odstotek prilagoditve časovnega zamika nedejavnosti v načinu predstavitve (zastarelo)</translation> <translation id="7421483919690710988">Nastavi velikost predpomnilnika medija v bajtih</translation> <translation id="7424751532654212117">Seznam izjem za seznam onemogočenih vtičnikov</translation>
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index 2bcd6c3..ee12170 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -208,6 +208,13 @@ Производи се придржавају ових смерница само ако су омогућене смернице „DefaultSearchProviderEnabled“.</translation> <translation id="1859633270756049523">Ограничавање дужине сесије</translation> +<translation id="1859859319036806634">Упозорење: Могућност враћања на старију верзију TLS-а ће бити уклоњена из производа <ph name="PRODUCT_NAME" /> после верзије 52 (око септембра 2016) и ове смернице ће тада престати да важе. + + Када TLS не успе да потврди спремност за пренос података, <ph name="PRODUCT_NAME" /> би при ранијим подешавањима поново покушао да успостави везу са старијом верзијом TLS-а како би заобишао грешке на HTTPS серверима. Ово подешавање конфигурише верзију при којој ће овај процес са могућношћу враћања на старије верзије престати. Ако сервер исправно обави прилагођавање верзије (тј. без прекида везе), ово подешавање се не примењује. Без обзира на то, веза која се добија ипак мора да буде у складу са подешавањем SSLVersionMin. + + Ако не конфигуришете ове смернице или их подесите на „tls1.2“, <ph name="PRODUCT_NAME" /> више неће обављати ово враћање на старије верзије. Имајте на уму да овим не онемогућавате подршку за старије верзије TLS-а, већ само одређујете да ли ће <ph name="PRODUCT_NAME" /> функционисати са серверима који садрже пуно грешака и који не могу исправно да обављају прилагођавања верзија. + + У супротном, ако мора да се одржава компатибилност са сервером који садржи пуно грешака, можете да подесите ове смернице на „tls1.1“. То је привремена мера и треба брзо поправити сервер.</translation> <translation id="1861037019115362154">Наводи листу додатних компоненти које су онемогућене у <ph name="PRODUCT_NAME" />-у и спречава кориснике да мењају ово подешавање. Џокерски знакови „*“ и „?“ могу да се користе за подударање низова произвољних знакова. Знак „*“ одговара произвољном броју знакова, а знак „?“ одређује опционални појединачни знак, тј. подудара се са нула или једним знаком. Искочни знак је „\“, па за подударање стварних знакова „*“, „?“ или „\“ можете да ставите „\“ испред њих. @@ -587,6 +594,7 @@ Одређују да ли треба омогућити додатак за TLS сертификате упућене на домен. Ово подешавање се користи да би се додатак за TLS сертификате упућене на домен омогућио за тестирање. Ово експериментално подешавање ће накнадно бити уклоњено.</translation> +<translation id="2957506574938329824">Не дозволи ниједном сајту да захтева приступ Bluetooth уређајима преко API-ја Bluetooth за веб</translation> <translation id="2957513448235202597">Тип налога за <ph name="HTTP_NEGOTIATE" /> потврду аутентичности</translation> <translation id="2959898425599642200">Правила за заобилажење проксија</translation> <translation id="2960691910306063964">Омогући или онемогући потврду аутентичности без PIN-а за хостове са даљинским приступом</translation> @@ -600,6 +608,7 @@ Вредност смерница треба да буде наведена у милисекундама. Вредности се скраћују како би биле краће од времена до искључивања екрана (ако је подешено) и времена до мировања или једнаке њима.</translation> <translation id="2987155890997901449">Омогући ARC</translation> +<translation id="2987227569419001736">Контролиши коришћење API-ја Bluetooth за веб</translation> <translation id="2998881342848488968">Ове смернице омогућавају да <ph name="PRODUCT_OS_NAME" /> заобилази све проксије за потврду аутентичности на порталу за проверу. Ове смернице ступају на снагу само ако је прокси конфигурисан (на пример, помоћу смерница, од стране корисника у chrome://settings или од стране додатака). @@ -917,6 +926,7 @@ Производи се придржавају ових смерница само ако су омогућене смернице „DefaultSearchProviderEnabled“.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 или новији</translation> +<translation id="4322842393287974810">Омогућава да киоск апликација која је аутоматски покренута без кашњења контролише верзију <ph name="PRODUCT_OS_NAME" />-а</translation> <translation id="4325690621216251241">Додавање дугмета за одјављивање на системску палету</translation> <translation id="4347908978527632940">Ако су смернице подешене на Тачно и корисник је под надзором, онда друге Android апликације могу да постављају питања о веб-забранама за корисника преко добављача садржаја. @@ -1589,6 +1599,9 @@ Ако не подесите ове смернице, тастатура на екрану ће бити онемогућена када се екран за пријављивање први пут прикаже. Корисници могу да омогуће или онемогуће тастатуру на екрану у било ком тренутку и њен статус на екрану за пријављивање је сталан за све кориснике.</translation> <translation id="6598235178374410284">Корисничка слика за аватар</translation> +<translation id="6628646143828354685">Омогућавају вам да подешавате да ли је веб-сајтовима дозвољено да добијају приступ оближњим Bluetooth уређајима. Приступ може да буде у потпуности блокиран, односно можемо да питамо корисника сваки пут кадa веб-сајт жели да добије приступ оближњим Bluetooth уређајима. + + Ако не подесите ове смернице, користићемо „3“ и корисник ће то моћи да промени.</translation> <translation id="6636268606788232221">Конфигуришите подешавања за управљање напајањем која се користе када је корисник неактиван. Ова смерница контролише више подешавања за стратегију управљања напајањем која се примењује када је корисник неактиван. @@ -1681,6 +1694,7 @@ Ако подесите ове смернице, корисници не могу да их промене или замене. Ако не подесите ове смернице, Опције приступачности се неће појављивати у менију системске палете, али корисник може да подеси да се Опције приступачности појаве преко странице Подешавања.</translation> +<translation id="6766216162565713893">Дозвољавај сајтовима да затраже од корисника да одобри приступ оближњем Bluetooth уређају</translation> <translation id="6770454900105963262">Шаљи информације о активним сесијама киоска</translation> <translation id="6774533686631353488">Дозволите хостове за основну размену порука на нивоу корисника (инсталиране без администраторских дозвола).</translation> <translation id="6786747875388722282">Додаци</translation> @@ -1876,6 +1890,13 @@ Ако не подесите ове смернице, SPDY ће бити доступан.</translation> <translation id="7384999953864505698">Омогућавају QUIC протокол</translation> +<translation id="7406651467768226499">Контролише да ли ће киоск апликација која је аутоматски покренута без кашњења имати дозволу да контролише верзију <ph name="PRODUCT_OS_NAME" />-а. + + Ове смернице контролишу да ли ће киоск апликација која је аутоматски покренута без кашњења контролисати верзију <ph name="PRODUCT_OS_NAME" />-а тако што ће уврстити required_platform_version у свој манифест и користити га као префикс циљане верзије за аутоматско ажурирање. + + Ако се смернице подесе на Тачно, вредност шифре манифеста required_platform_version киоск апликације која је аутоматски покренута без кашњења користи се као префикс циљане верзије за аутоматско ажурирање. + + Ако се смернице не подесе или подесе на Нетачно, шифра манифеста required_platform_version се занемарује и аутоматско ажурирање се наставља уобичајеним током.</translation> <translation id="7417972229667085380">Проценат до кога треба мењати време до мировања у режиму презентације (застарело је)</translation> <translation id="7421483919690710988">Подешавање величине кеша диска медијума у бајтовима</translation> <translation id="7424751532654212117">Листа изузетака за листу онемогућених додатних компоненти</translation>
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb index 0e2ec060..870a87d 100644 --- a/components/policy/resources/policy_templates_sv.xtb +++ b/components/policy/resources/policy_templates_sv.xtb
@@ -213,6 +213,13 @@ Den här policyn följs endast om policyn DefaultSearchProviderEnabled är aktiverad.</translation> <translation id="1859633270756049523">Begränsa sessionslängd</translation> +<translation id="1859859319036806634">Varning! Den alternativa TLS-versionen tas bort från <ph name="PRODUCT_NAME" /> efter version 52 (i september 2016) och den här principen slutar då att fungera. + + När en TLS-handskakning misslyckas försökte <ph name="PRODUCT_NAME" /> tidigare ansluta igen med en lägre version av TLS för att kunna kringgå fel i HTTPS-servrar. Den här inställningen konfigurerar versionen då den alternativa processen upphör. Om versionsförhandling utförs korrekt i en server (dvs. utan att bryta anslutningen) gäller inte denna inställning. I vilket fall som helst måste den resulterande anslutningen överensstämma med SSLVersionMin. + + Om den här principen inte är konfigurerad eller om den är inställd på tls1.2 använder <ph name="PRODUCT_NAME" /> inte längre den alternativa versionen. Tänk på att detta inte inaktiverar stöd för äldre TLS-versioner. Det avgör bara om <ph name="PRODUCT_NAME" /> kringgår servrar med fel som inte kan förhandla versioner korrekt. + + Om kompatibiliteten med en server med fel måste upprätthållas kan den ställas in på tls1.1. Det här är en nödlösning och servern bör snabbt åtgärdas.</translation> <translation id="1861037019115362154">Policyn anger en lista med plugin-program som inaktiveras i <ph name="PRODUCT_NAME" /> och förhindrar att användarna ändrar inställningen. Jokertecknen * och ? kan användas för att matcha sekvenser med arbiträra tecken. * matchar ett arbiträrt antal tecken medan ? anger ett valfritt enstaka tecken, dvs. noll eller ett tecken. Escape-tecknet är \, så om du vill matcha det faktiska tecknet *, ? eller \ kan du skriva \ framför dem. @@ -600,6 +607,7 @@ Anger om domänbundna TLS-certifikattillägg ska aktiveras. Inställningen används för att aktivera domänbundna TLS-certifikattillägg för testning. De experimentella inställningarna tas bort framöver.</translation> +<translation id="2957506574938329824">Tillåt inte att webbplatser kan begära att få tillgång till Bluetooth-enheter via Web Bluetooth API</translation> <translation id="2957513448235202597">Kontotyp för autentisering av <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Regler för proxybypass</translation> <translation id="2960691910306063964">Aktivera eller inaktivera autentisering utan pinkod för fjärråtkomstvärdar</translation> @@ -613,6 +621,7 @@ Policyns värde anges i millisekunder. Värdena måste vara mindre än eller lika med skärmavstängningstiden (om den har ställts in) och inaktivitetstiden.</translation> <translation id="2987155890997901449">Aktivera ARC</translation> +<translation id="2987227569419001736">Kontrollera användningen av Web Bluetooth API</translation> <translation id="2998881342848488968">Med den här policyn kan <ph name="PRODUCT_OS_NAME" /> kringgå en proxyserver för autentisering av infångstportaler. Den här policyn gäller endast om en proxyserver har konfigurerats (till exempel via en policy, av användaren i chrome://settings eller via tillägg). @@ -936,6 +945,7 @@ Den här policyn följs endast om policyn DefaultSearchProviderEnabled är aktiverad.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 eller senare</translation> +<translation id="4322842393287974810">Tillåt att kioskappen som startas automatiskt utan fördröjning styr <ph name="PRODUCT_OS_NAME" />-versionen</translation> <translation id="4325690621216251241">Lägg till en utloggningsknapp i systemfältet</translation> <translation id="4347908978527632940">Om den här principen är inställd på sant och användaren är en kontrollerad användare så kan andra Android-appar fråga om användarens webbrestriktioner via en innehållsleverantör. @@ -1614,6 +1624,9 @@ Om policyn inte ställs in är skärmtangentbordet inaktiverat när inloggningsskärmen visas första gången. Användaren kan aktivera eller inaktivera skärmtangentbordet när som helst och dess status på inloggningsskärmen sparas för användaren.</translation> <translation id="6598235178374410284">Användarens avatarbild</translation> +<translation id="6628646143828354685">Principen innebär att du kan ange om webbplatser får tillgång till Bluetooth-enheter i närheten. Åtkomsten kan blockeras helt eller så kan användaren bli tillfrågad varje gång en webbplats begär att få tillgång till Bluetooth-enheter i närheten. + + Om policyn inte anges används 3 och användaren kan ändra inställningen.</translation> <translation id="6636268606788232221">Konfigurera energisparinställningarna när användaren är inaktiv. Den här policyn styr flera energisparinställningar när användaren är inaktiv. @@ -1705,6 +1718,7 @@ Om du ställer in policyn kan den inte ändras eller åsidosättas av användaren. Om du inte ställer in policyn visas inte tillgänglighetsalternativ i systemfältsmenyn, men användaren kan välja att tillgänglighetsalternativen ska visas via menyn Inställningar.</translation> +<translation id="6766216162565713893">Tillåt att webbplatser begär att få tillgång till Bluetooth-enheter i närheten</translation> <translation id="6770454900105963262">Rapportera information om aktiva kiosksessioner</translation> <translation id="6774533686631353488">Tillåt Native Messaging-värdar på användarnivå (installerade utan administratörsbehörighet).</translation> <translation id="6786747875388722282">Tillägg</translation> @@ -1901,6 +1915,13 @@ Om den här policyn inte anges kommer SPDY att bli tillgängligt.</translation> <translation id="7384999953864505698">Tillåter QUIC-protokoll</translation> +<translation id="7406651467768226499">Tillåta eller inte tillåta att kioskappen som startas automatiskt utan fördröjning styr <ph name="PRODUCT_OS_NAME" />-versionen. + + Den här policyn styr om kioskappen som startas automatiskt utan fördröjning ska styra <ph name="PRODUCT_OS_NAME" />-versionen genom att en required_platform_version anges i manifestfilen och används som målversionsprefix för automatisk uppdatering. + + Om Sant har angetts för policyn används värdet i manifestnyckeln required_platform_version för kioskappen som startas automatiskt utan fördröjning som målversionsprefix för automatisk uppdatering. + + Om Falskt har angetts för policyn, eller om den inte är konfigurerad, ignoreras manifestnyckeln required_platform_version och den automatiska uppdateringen fortsätter som vanligt.</translation> <translation id="7417972229667085380">Procentsatsen med vilken fördröjningen vid dödtid skalanpassas i presentationsläge (föråldrad)</translation> <translation id="7421483919690710988">Ange medieenhetens cachestorlek i byte</translation> <translation id="7424751532654212117">Lista med undantag till listan med inaktiverade plugin-program</translation>
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb index d876962..cbd3a7da 100644 --- a/components/policy/resources/policy_templates_sw.xtb +++ b/components/policy/resources/policy_templates_sw.xtb
@@ -203,6 +203,13 @@ Sera hii inatumika tu endapo sera ya 'DefaultSearchProviderEnabled' imewashwa.</translation> <translation id="1859633270756049523">Punguza urefu wa kipindi</translation> +<translation id="1859859319036806634">Onyo: Toleo la TLS mbadala litaondolewa kwenye <ph name="PRODUCT_NAME" /> baada ya toleo la 52 (kufikia Septemba 2016) na sera hii itaacha kufanya kazi wakati huo. + + TLS ikishindwa kukubaliana, <ph name="PRODUCT_NAME" /> awali ilijaribu kuunganisha tena kwa kutumia toleo la awali la TLS ili kutatua hitilafu katika seva za HTTPS. Mipangilio hii husanidi toleo ambalo mchakato wa mbadala huu utaacha kufanya kazi. Seva ikitekeleza makubaliano ya toleo vizuri (yaani bila kukata muunganisho) basi mipangilio hii haitumiki. Hata hivyo, lazima muunganisho unaotokea utii SSLVersionMin. + + Ikiwa sera hii haitasanidiwa au ikiwekwa kuwa "tls1.2" basi <ph name="PRODUCT_NAME" /> haitekelezi tena mbadala huu. Kumbuka hili halizimi matumizi ya matoleo ya awali ya TLS, ni iwapo tu <ph name="PRODUCT_NAME" /> itafanya kazi kwenye seva zenye hitilafu ambazo haziwezi kuendesha matoleo vizuri. + + Vinginevyo, ikiwa ni lazima uoanifu na seva zenye hitilafu udumishwe, hii huenda ikawekwa hadi "tls1.1". Huu ni mkakati wa muda tu na seva inapaswa kurekebishwa haraka.</translation> <translation id="1861037019115362154">Inabainisha orodha ya programu jalizi ambazo zinalemazwa katika <ph name="PRODUCT_NAME" /> na huzuia watumiaji kubadilisha mpangilio huu. Vibambo vya kadi egemezi '*' na '?' vinaweza kutumiwa kulinganisha misururu ya vibambo vibadala. '*' inalinganisha vibambo kadhaa vibadala huku '?' ikibainisha kibambo kimoja cha chaguo, yaani inalinganisha sufuri au kibambo kimoja. Kibambo cha kutoka ni '\', kwa hivyo ili kulinganisha '*', '?', halisi au vibambo '\', unaweza kuweka '\' mbele yavyo. @@ -581,6 +588,7 @@ Inabainisha ikiwa kiendelezi cha vyeti vilivyo katika kikoa cha TLS kinastahili kuwashwa. Mpangilio huu unatumiwa kuwasha kiendelezi cha vyeti vilivyo katika kikoa cha TLS kwa uchunguzi. Mpangilio wa majaribio utaondolewa siku zijazo.</translation> +<translation id="2957506574938329824">Usiruhusu tovuti yoyote kuomba idhini ya kufikia vifaa vya Bluetooth kupitia API ya Bluetooth ya Wavuti</translation> <translation id="2957513448235202597">Aina ya Akaunti kwa uthibitishaji wa <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Kanuni za ukwepaji proksi</translation> <translation id="2960691910306063964">Washa au zima uthibitishaji usiotumia PIN kwa seva pangishi za uwezo wa kufikia kwa mbali</translation> @@ -594,6 +602,7 @@ Sera ya thamani inastahili kubainishwa kwa nukta. Thamani zinabanwa ili kuwa chini ya ucheleweshaji wa kutokuwa na shughuli.</translation> <translation id="2987155890997901449">Washa kipengele cha ARC</translation> +<translation id="2987227569419001736">Dhibiti matumizi ya API ya Bluetooth ya Wavuti</translation> <translation id="2998881342848488968">Sera hii inaruhusu <ph name="PRODUCT_OS_NAME" /> kukwepa seva mbadala yoyote kwa uthibitishaji wa ukurasa wa kwanza wa kuingia kwenye wavuti. Sera hii inatumika tu ikiwa seva mbadala imesanidiwa (kwa mfano kupitia sera, na mtumiaji katika mipangilio ya://chrome, au kwa kiendelezi). @@ -1586,6 +1595,9 @@ Sera hii isipowekwa, kibodi ya skrini inawashwa skrini ya kuingia katika akaunti inapoonyeshwa mara ya kwanza. Watumiaji wanaweza wakazima au kuwasha kibodi ya skrini wakati wowote na hali yake kwenye skrini ya kuingia katika akaunti inadumu kati ya watumiaji.</translation> <translation id="6598235178374410284">Picha ya ishara ya mtumiaji</translation> +<translation id="6628646143828354685">Hukuruhusu kuweka ikiwa tovuti zinaruhusiwa kupata idhini ya kufikia vifaa vya karibu vya Bluetooth. Idhini ya kufikia inaweza kuzuiwa kabisa, au mtumiaji anaweza kuulizwa kila wakati tovuti inapotaka kufikia vifaa vya karibu vya Bluetooth. + + Sera hii ikiachwa bila kuwekwa, chaguo la '3' litatumiwa, na mtumiaji ataweza kulibadilisha.</translation> <translation id="6636268606788232221">Sanidi mipangilio ya kusimamia nishati mtumiaji anapokuwa hafanyi kitu. Sera hii hudhibiti mipangilio mingi ya mkakati wa kusimamia nishati mtumiaji anapokuwa hafanyi kitu. @@ -1675,6 +1687,7 @@ Ukiweka sera hii, watumiaji hawawezi kuibadilisha au kuibatilisha. Sera hii isipowekwa, chaguo za Ufikiaji hazitaonekana katika menyu ya treya ya mfumo, lakini mtumiaji anaweza kusababisha chaguo za Ufikiaji zionekane kupitia ukurasa wa Mipangilio.</translation> +<translation id="6766216162565713893">Ruhusu tovuti zimwombe mtumiaji atoe idhini ya kufikia vifaa vya karibu vya Bluetooth</translation> <translation id="6770454900105963262">Ripoti taarifa kuhusu vipindi vya skrini nzima vinavyoendelea</translation> <translation id="6774533686631353488">Ruhusu wapangishi wa Ujumbe Asili wa ngazi ya mtumiaji (wanaosakinishwa bila idhini ya msimamizi).</translation> <translation id="6786747875388722282">Viendelezi</translation>
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index a670cea..d3bec2f 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -185,6 +185,13 @@ 'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டிருந்தால் மட்டுமே இந்தக் கொள்கையானது ஆதரிக்கப்படும்.</translation> <translation id="1859633270756049523">அமர்வின் நீளத்தை வரம்பிடவும்</translation> +<translation id="1859859319036806634">எச்சரிக்கை: பதிப்பு 52க்குப் பின் (செப்டம்பர் 2016 அளவில்) <ph name="PRODUCT_NAME" /> இலிருந்து TLS பதிப்பு மாற்றம் அகற்றப்படும், அதற்குப் பிறகு இந்தக் கொள்கை செயல்படுவது நின்றுவிடும். + + TLS தகவல் பரிமாற்றத்தைச் செய்ய முடியாத போது, HTTPS சேவையகங்களில் உள்ள பிழைகளைத் திருத்தும் பொருட்டு TLS இன் குறைவான பதிப்புடன் இணைக்க <ph name="PRODUCT_NAME" /> முன்னதாக மீண்டும் முயற்சிக்கும். இந்த மாற்றச் செயல்முறை நிறுத்தப்பட வேண்டிய பதிப்பை இந்த அமைப்பு உள்ளமைக்கும். சேவையகமானது பதிப்புத் தகவல் பரிமாற்றத்தைச் சரியாகச் செயல்படுத்தினால் (அதாவது, இணைப்பைத் துண்டிக்காமல்) இந்த அமைப்பு பயன்படுத்தப்படாது. எப்படியிருந்தாலும், தீர்வு செய்யப்படும் இணைப்பானது SSLVersionMin உடன் தொடர்ந்து இணக்கமாக இருக்க வேண்டும். + + இந்தக் கொள்கை உள்ளமைக்கப்படாவிட்டால் அல்லது "tls1.2" என அமைக்கப்பட்டால், இனி <ph name="PRODUCT_NAME" /> இந்த மாற்றத்தை மேற்கொள்ளாது. ஆனால் பதிப்புகளுடன் சரியாக தகவல் பரிமாற்றம் செய்து கொள்ள முடியாத பிழையான சேவையகங்களுடன் <ph name="PRODUCT_NAME" /> இயங்கினாலும், பழைய TLS பதிப்புகளுக்கான ஆதரவு முடக்கப்படாது என்பதை மனதில் கொள்ளவும். + + அல்லது, பிழையான சேவையகத்துடன் இணக்கத்தன்மையாக இருக்க வேண்டும் என்றால், இந்தக் கொள்கையை "tls1.1" என அமைக்கலாம். இது ஒரு இடைக்கால நடவடிக்கையாகும், சேவையகத்தை விரைவில் சரிசெய்ய வேண்டும்.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> இல் முடக்கப்பட்டுள்ள செருகுநிரல்களின் பட்டியலைக் குறிப்பிடுகிறது, மேலும் பயனர்கள் இந்த அமைப்பை மாற்றுவதைத் தடுக்கிறது. '*' மற்றும் '?' ஆகிய வைல்டுகார்டு எழுத்துக்குறிகள், தன்னிச்சையான எழுத்துக்குறிகளின் தொடர்ச்சியைப் பொருத்த பயன்படுத்தப்படும். '?' ஆனது ஒரே ஒரு எழுத்துக்குறியைப் பொருத்தும்போது '*' பல எழுத்துக்குறிகளைப் பொருத்தும், அதாவது பூஜ்ஜியம் அல்லது ஒரு எழுத்துக்குறியைப் பொருத்தும். '\' என்பது விலக்குதல் எழுத்துக்குறியாகும், இது நேரடியாக '*', '?', அல்லது '\' எழுத்துக்குறிகளைப் பொருத்த பயன்படுகிறது. நீங்கள் அவற்றின் முன்னதாக '\' ஐப் பயன்படுத்தலாம். @@ -519,6 +526,7 @@ TLS டொமைன்-சார்ந்த சான்றிதழ்களின் நீட்டிப்பு இயக்கப்பட்டிருக்க வேண்டுமா என்பதைக் குறிப்பிடுகிறது. சோதனைக்கான TLS டொமைன்-சார்ந்த சான்றிதழ்களின் நீட்டிப்பை இயக்க, இந்த அமைப்பு பயன்படுத்தப்படுகிறது. இந்தச் சோதனைக்குரிய அமைப்பு எதிர்காலத்தில் அகற்றப்படும்.</translation> +<translation id="2957506574938329824">இணைய புளூடூத் API வழியாக புளூடூத் சாதனங்களுக்கான அணுகலைக் கோர எந்தத் தளத்தையும் அனுமதிக்க வேண்டாம்</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> அங்கீகரிப்பிற்கான கணக்கு வகை</translation> <translation id="2959898425599642200">ப்ராக்ஸி கடந்துபோதல் விதிகள்</translation> <translation id="2960691910306063964">தொலைநிலை அணுகல் ஹோஸ்ட்களில் PIN-இல்லாத அங்கீகரிப்பை இயக்கும் அல்லது முடக்கும்</translation> @@ -532,6 +540,7 @@ கொள்கை மதிப்பை மில்லிவினாடிகளில் மட்டுமே குறிப்பிட வேண்டும். மதிப்புகள் திரை முடக்கத்தின் தாமதம் (அமைக்கப்பட்டால்) மற்றும் செயலற்ற நிலைக்குக் குறைவாக அல்லது சமமாக இருக்குமாறு அமைக்கப்படும்.</translation> <translation id="2987155890997901449">ARCஐ இயக்கு</translation> +<translation id="2987227569419001736">இணைய புளூடூத் API இன் பயன்பாட்டைக் கட்டுப்படுத்தும்</translation> <translation id="2998881342848488968">இந்த கொள்கை, கேப்டிவ் போர்டல் அங்கீகரிப்பிற்கான ஏதேனும் ப்ராக்ஸியை <ph name="PRODUCT_OS_NAME" /> கடந்துபோகும்படி அனுமதிக்கும் . ப்ராக்ஸி உள்ளமைக்கப்பட்டிருந்தால் மட்டுமே இந்தக் கொள்கை செயலுக்கு வரும் (எடுத்துக்காட்டாக கொள்கை மூலமாக, chrome://settings இல் பயனரால் அல்லது நீட்டிப்புகளால்). @@ -818,6 +827,7 @@ 'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டிருந்தால் மட்டுமே இந்தக் கொள்கையானது ஆதரிக்கப்படும்.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 அல்லது அதற்கு பிந்தைய பதிப்பு</translation> +<translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> பதிப்பைக் கட்டுப்படுத்த, தாமதமின்றி தானாகத் துவங்கும் கியோஸ்க் பயன்பாட்டை அனுமதிக்கவும்</translation> <translation id="4325690621216251241">கணினி ட்ரேயில் வெளியேறு பொத்தனைச் சேர்க்கவும்</translation> <translation id="4347908978527632940">true எனவும், பயனர் கண்காணிக்கப்படும் பயனராகவும் இருந்தால் ஏதேனும் உள்ளடக்க வழங்குநர் மூலம் பயனரின் இணைய வரையறைகளைப் பிற Android பயன்பாடுகள் கோரலாம். @@ -1399,6 +1409,9 @@ இந்தக் கொள்கையை அமைக்காமல் இருந்தால், உள்நுழைவுத் திரை முதலில் தோன்றும்போது திரை விசைப்பலகை முடக்கப்படும். பயனர்கள் எந்நேரத்திலும் திரை விசைப்பலகையை இயக்கவோ, முடக்கவோ செய்யலாம் மற்றும் பயனர்கள் அனைவருக்கும் உள்நுழைவுத் திரையில் திரை விசைப்பலகையின் நிலை நிலையானது.</translation> <translation id="6598235178374410284">பயனரின் தோற்றப் படம்</translation> +<translation id="6628646143828354685">இணையதளங்கள் அருகிலுள்ள புளூடூத் சாதனங்களை அணுக அனுமதிக்கலாமா என்பதை அமைக்க உங்களை அனுமதிக்கிறது. அணுகலை முழுதாகத் தடுக்கலாம் அல்லது இணையதளம் அருகிலுள்ள புளூடூத் சாதனங்களை அணுக விரும்பும் ஒவ்வொரு முறையும் பயனரிடம் கேட்கலாம். + + இந்தக் கொள்கையை அமைக்காமல் விட்டுவிட்டால், '3' பயன்படுத்தப்படும், அதைப் பயனர் மாற்ற முடியும்.</translation> <translation id="6636268606788232221">பயனர் செயல்படாமல் இருக்கும்போது, பயன்படுத்துவதற்கான ஆற்றல் நிர்வாக அமைப்புகளை உள்ளமைத்தல். இந்தக் கொள்கை பயனர் செயல்படாமல் இருக்கும்போது ஆற்றல் நிர்வாகத் திறனுக்கான பல்வேறு அமைப்புகளைக் கட்டுப்படுத்துகிறது. @@ -1475,6 +1488,7 @@ இந்தக் கொள்கையை நீங்கள் அமைத்தால், பயனர்களால் அதை மாற்றவோ, மேலெழுதவோ முடியாது. இந்தக் கொள்கையை அமைக்காமல் விட்டால், கணினி துணை மெனுவில் அணுகல்தன்மை விருப்பங்கள் தோன்றாது ஆனால் அமைப்புகள் பக்கத்தின் வழியாகப் பயனர்களால் அணுகல்தன்மை விருப்பங்களைத் தோன்றவைக்க முடியும்.</translation> +<translation id="6766216162565713893">அருகிலுள்ள புளூடூத் சாதன அணுகலைக் கொடுக்குமாறு பயனரிடம் கேட்க தளங்களை அனுமதிக்கும்</translation> <translation id="6770454900105963262">செயல்பாட்டில் உள்ள கியாஸ்க் அமர்வுகளைப் பற்றிய தகவலை அறிவிக்கும்</translation> <translation id="6774533686631353488">பயனர் அளவிலான நேட்டிவ் செய்தியிடல் ஹோஸ்ட்களை அனுமதி (நிர்வாகியின் அனுமதியில்லாமல் நிறுவப்பட்டது).</translation> <translation id="6786747875388722282">நீட்டிப்புகள்</translation> @@ -1647,6 +1661,13 @@ <translation id="7340034977315324840">சாதனத்தின் செயல்பாட்டு நேரங்களை அறிக்கையிடவும்</translation> <translation id="7381326101471547614"><ph name="PRODUCT_NAME" /> இல் உள்ள SPDY நெறிமுறையின் பயன் முடக்கப்பட்டுள்ளது. இந்தக் கொள்கை இயக்கப்பட்டால் SPDY நெறிமுறை <ph name="PRODUCT_NAME" /> இல் கிடைக்காது. இந்தக் கொள்கை அமைப்பை முடக்கினால், SPDY பயன்பாடு அனுமதிக்கப்படும். இந்தக் கொள்கை அமைக்கப்படவில்லையென்றால், SPDY கிடைக்காது.</translation> <translation id="7384999953864505698">QUIC நெறிமுறையை அனுமதிக்கும்</translation> +<translation id="7406651467768226499"><ph name="PRODUCT_OS_NAME" /> பதிப்பைக் கட்டுப்படுத்த, தாமதமின்றி தானாகத் துவங்கும் கியோஸ்க் பயன்பாட்டை அனுமதிக்க வேண்டுமா என்பது பற்றிய கொள்கை. + + தாமதமின்றி தானாகத் துவங்கும் கியோஸ்க் பயன்பாட்டின் மேனிஃபெஸ்டில் required_platform_version ஐத் தெரிவிப்பதன் மூலம் <ph name="PRODUCT_OS_NAME" /> பதிப்பைக் கட்டுப்படுத்த அந்தப் பயன்பாட்டை அனுமதிக்க வேண்டுமா இல்லையா என்பதை இந்தக் கொள்கை கட்டுப்படுத்துகிறது. அதனையே தானியங்கு புதுப்பிப்புக்கான இலக்குப் பதிப்பு முன்னொட்டாகவும் பயன்படுத்துகிறது. + + இந்தக் கொள்கையை true என அமைத்தால், தாமதமின்றி தானாகத் துவங்கும் கியோஸ்க் பயன்பாட்டின் required_platform_version மேனிஃபெஸ்ட் விசையின் மதிப்பு தானியங்கு புதுப்பிப்புக்கான இலக்குப் பதிப்பு முன்னொட்டாகப் பயன்படுத்தப்படும். + + கொள்கையை உள்ளமைக்காவிட்டால் அல்லது false என அமைத்தால், required_platform_version மேனிஃபெஸ்ட் விசை புறக்கணிக்கப்பட்டு, தானியங்கு புதுப்பித்தல் வழக்கம்போல் தொடரும்.</translation> <translation id="7417972229667085380">விளக்கக்காட்சி பயன்முறையில் செயலற்ற நிலை தாமதத்தை அளவிடுவதற்கான சதவீதம் (தடுக்கப்பட்டது)</translation> <translation id="7421483919690710988">மீடியா வட்டு தற்காலிக சேமிப்பு அளவை பைட்களில் அமை</translation> <translation id="7424751532654212117">முடக்கப்பட்ட செருகுநிரல்களின் பட்டியலின் விதிவிலக்குகளுக்கான பட்டியல்</translation>
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb index ceecf95..afc9bd76 100644 --- a/components/policy/resources/policy_templates_te.xtb +++ b/components/policy/resources/policy_templates_te.xtb
@@ -188,6 +188,13 @@ 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడినప్పుడు మాత్రమే ఈ విధానం గౌరవించబడుతుంది.</translation> <translation id="1859633270756049523">సెషన్ నిడివిని పరిమితం చేయి</translation> +<translation id="1859859319036806634">హెచ్చరిక: TLS సంస్కరణ ఫాల్బ్యాక్ సంస్కరణ 52 (సుమారు సెప్టెంబర్ 2016) తర్వాత <ph name="PRODUCT_NAME" /> నుండి తీసివేయబడుతుంది మరియు ఈ విధానం ఆపై పని చేయడం ఆగిపోతుంది. + + TLS కనెక్షన్ ఏర్పాటు విఫలమైనప్పుడు, <ph name="PRODUCT_NAME" /> HTTPS సర్వర్ల్లో బగ్లపై పని చేసేందుకు మునుపు తక్కువ TLS సంస్కరణతో కనెక్షన్ను మళ్లీ ప్రయత్నించి ఉంటుంది. ఈ ఫాల్బ్యాక్ ప్రాసెస్ ఆపివేయబడే సంస్కరణను ఈ సెట్టింగ్ కాన్ఫిగర్ చేస్తుంది. సర్వర్ సంస్కరణ బదలాయింపు సరిగ్గా (అంటే, కనెక్షన్ను ఆపివేయకుండా) నిర్వహిస్తే, ఈ సెట్టింగ్ వర్తించదు. ఫలితంగా ఏర్పడే కనెక్షన్ తప్పనిసరిగా ఇప్పటికీ SSLVersionMinకి అనుకూలంగా ఉండాలి. + + ఈ విధానాన్ని కాన్ఫిగర్ చేయకుంటే లేదా దీన్ని "tls1.2"కి సెట్ చేస్తే, అప్పుడు <ph name="PRODUCT_NAME" /> ఈ ఫాల్బ్యాక్ను నిర్వహించదు. ఇది పాత TLS సంస్కరణల కోసం మద్దతును నిలిపివేయదు, సంస్కరణలను సరిగ్గా బదలాయించలేని బగ్గీ సర్వర్ల్లో మాత్రమే <ph name="PRODUCT_NAME" /> పని చేయవచ్చని గుర్తుంచుకోండి. + + లేకుంటే, బగ్గీ సర్వర్కు అనుకూలత తప్పనిసరిగా ఉండేలా చూసుకోవాలంటే, ఈ విధానాన్ని "tls1.1"కి సెట్ చేయవచ్చు. ఇది విరామ సమయ ప్రమాణం మరియు వేగంగా సర్వర్ సమస్య పరిష్కరించబడుతుంది.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" />లో నిలిపివేయబడిన ప్లగిన్ల జాబితాను సూచిస్తుంది మరియు వినియోగదారుల ఈ సెట్టింగ్ను మార్చకుండా నిరోధిస్తుంది. వైల్డ్కార్డ్ అక్షరాలు '*' మరియు '?' నిర్హేతుక అక్షరాల వరుసను సరిపోల్చడానికి ఉపయోగించబడతాయి. '?' ఇచ్ఛాపూరిత ఏకైక అక్షరాన్ని పేర్కొంటే అంటే సున్నా లేదా ఒకటి అక్షరాలను సరిపోల్చితే '*' అక్షరాల యొక్క ఏకపక్ష సంఖ్యను సరిపోల్చుతుంది. '\' అనేది ఎస్కేప్ అక్షరం, కాబట్టి వాస్తవ '*', '?', లేదా '\'ను సరిపోల్చడానికి, మీరు వాటి ముందర '\'ను పెట్టవచ్చు. @@ -536,6 +543,7 @@ TLS డొమైన్-బౌండ్ ప్రమాణపత్రాల పొడిగింపు ప్రారంభించబడాలో లేదో పేర్కొంటుంది. పరీక్షించడం కోసం TLS డొమైన్-బౌండ్ ప్రమాణపత్రాల పొడిగింపుని ప్రారంభించడానికి ఈ సెట్టింగ్ ఉపయోగించబడుతుంది. ఈ ప్రయోగాత్మక సెట్టింగ్ భవిష్యత్తులో తీసివేయబడుతుంది.</translation> +<translation id="2957506574938329824">వెబ్ బ్లూటూత్ API ద్వారా బ్లూటూత్ పరికరాలకు ప్రాప్యతను అభ్యర్థించడానికి సైట్ ఏదీ అనుమతించవద్దు</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> ప్రమాణీకరణ కోసం ఖాతా రకం</translation> <translation id="2959898425599642200">ప్రాక్సీ బైపాస్ నియమాలు</translation> <translation id="2960691910306063964">రిమోట్ ప్రాప్యత హోస్ట్ల కోసం PIN రహిత ప్రామాణీకరణను ప్రారంభిస్తుంది లేదా నిలిపివేస్తుంది</translation> @@ -549,6 +557,7 @@ విధానం విలువను మిల్లీసెకన్లలో పేర్కొనాలి. విలువలు స్క్రీన్ ఆఫ్ ఆలస్యం (సెట్ చేస్తే) మరియు నిష్క్రియ ఆలస్యం కంటే తక్కువగా లేదా సమానంగా ఉండేలా అమర్చబడతాయి.</translation> <translation id="2987155890997901449">ARCని ప్రారంభించండి</translation> +<translation id="2987227569419001736">వెబ్ బ్లూటూత్ API వినియోగాన్ని నియంత్రించండి</translation> <translation id="2998881342848488968">ఈ విధానం క్యాప్టివ్ పోర్టల్ ప్రామాణీకరణ కోసం ఏదైనా ప్రాక్సీని దాటవేయడానికి <ph name="PRODUCT_OS_NAME" />ని అనుమతిస్తుంది. ప్రాక్సీ కాన్ఫిగర్ (ఉదాహరణకు విధానం ద్వారా, chrome://settingsలో వినియోగదారు ద్వారా లేదా పొడిగింపుల ద్వారా) అయితే మాత్రమే ఈ విధానం ప్రభావం చూపుతుంది. @@ -837,6 +846,7 @@ 'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడినప్పుడు మాత్రమే ఈ విధానం గౌరవించబడుతుంది.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 లేదా తర్వాత</translation> +<translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> సంస్కరణను నియంత్రించడం కోసం సున్నా జాప్యంతో స్వయంచాలకంగా ప్రారంభించబడిన కియోస్క్ అనువర్తనాన్ని అనుమతించండి</translation> <translation id="4325690621216251241">సిస్టమ్ ట్రేకు లాగ్అవుట్ బటన్ను జోడించండి</translation> <translation id="4347908978527632940">ఒప్పు అయితే మరియు వినియోగదారు పర్యవేక్షించబడే వినియోగదారు అయితే, అప్పుడు ఇతర Android అనువర్తనాలు కంటెంట్ ప్రదాత ద్వారా వినియోగదారు వెబ్ నియంత్రణలను ప్రశ్నించవచ్చు. @@ -1431,6 +1441,9 @@ ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, లాగిన్ స్క్రీన్ ముందుగా చూపబడినప్పుడు స్క్రీన్లో కీబోర్డ్ నిలిపివేయబడి ఉంటుంది. వినియోగదారులు స్క్రీన్లో కీబోర్డ్ను ఎప్పుడైనా ప్రారంభించవచ్చు లేదా నిలిపివేయవచ్చు మరియు లాగిన్ స్క్రీన్లో దీని స్థితి వినియోగదారుల మధ్య స్థిరంగా ఉంటుంది.</translation> <translation id="6598235178374410284">వినియోగదారు అవతార్ చిత్రం</translation> +<translation id="6628646143828354685">సమీప బ్లూటూత్ పరికరాలకు ప్రాప్యతను పొందడానికి వెబ్సైట్లను అనుమతించాలో వద్దో సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ప్రాప్యతను పూర్తిగా బ్లాక్ చేయవచ్చు లేదా వెబ్సైట్ సమీప బ్లూటూత్ పరికరాలకు ప్రాప్యత పొందాలనుకునే ప్రతిసారీ వినియోగదారుని అడిగేలా చేయవచ్చు. + + ఈ విధానాన్ని సెట్ చేయకుండా వదిలివేస్తే, '3' ఉపయోగించబడుతుంది మరియు వినియోగదారు దీన్ని మార్చగలరు.</translation> <translation id="6636268606788232221">వినియోగదారు నిష్క్రియంగా ఉన్నప్పుడు పవర్ నిర్వహణ సెట్టింగ్లను కాన్ఫిగర్ చేస్తుంది. ఈ విధానం వినియోగదారు నిష్క్రియంగా ఉన్నప్పుడు పవర్ నిర్వహణ వ్యూహం కోసం బహుళ సెట్టింగ్లను నియంత్రిస్తుంది. @@ -1506,6 +1519,7 @@ మీరు ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారులు దీన్ని మార్చలేరు లేదా భర్తీ చేయలేరు. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, ప్రాప్యత ఎంపికలు సిస్టమ్ ట్రే మెనులో కనిపించవు, కానీ వినియోగదారు సెట్టింగ్ల పేజీ ద్వారా ప్రాప్యత ఎంపికలు కనిపించేలా చేయవచ్చు.</translation> +<translation id="6766216162565713893">సమీప బ్లూటూత్ పరికరానికి ప్రాప్యతను మంజూరు చేయడం కోసం వినియోగదారుని అడగటానికి సైట్లను అనుమతించండి</translation> <translation id="6770454900105963262">సక్రియ కియోస్క్ సెషన్ల గురించి సమాచారాన్ని నివేదిస్తుంది</translation> <translation id="6774533686631353488">వినియోగదారు స్థాయి స్థానిక సందేశ హోస్ట్లను (నిర్వాహకుని అనుమతులు లేకుండా ఇన్స్టాల్ చేయబడినవి) అనుమతించండి.</translation> <translation id="6786747875388722282">పొడిగింపులు</translation> @@ -1681,6 +1695,13 @@ <translation id="7340034977315324840">పరికరం కార్యాచరణ సమయాలను నివేదించండి</translation> <translation id="7381326101471547614"><ph name="PRODUCT_NAME" />లో SPDY ప్రోటోకాల్ యొక్క ఉపయోగాన్ని నిలిపివేస్తుంది. ఈ విధానం ప్రారంభించబడితే, <ph name="PRODUCT_NAME" />లో SPDY ప్రోటోకాల్ అందుబాటులో ఉండదు. ఈ విధానాన్ని నిలిపివేయికి సెట్ చేయడం వల్ల SPDY యొక్క ఉపయోగానికి అనుమతిస్తుంది. ఈ విధానం సెట్ చేయకుండా వదిలివేయబడితే, SPDY అందుబాటులో ఉంటుంది.</translation> <translation id="7384999953864505698">QUIC ప్రోటోకాల్ను అనుమతిస్తుంది</translation> +<translation id="7406651467768226499"><ph name="PRODUCT_OS_NAME" /> సంస్కరణను నియంత్రించడం కోసం సున్నా జాప్యంతో స్వయంచాలకంగా ప్రారంభించబడిన కియోస్క్ అనువర్తనాన్ని అనుమతించాలా వద్దా అనేదాన్ని నిర్ణయిస్తుంది. + + సున్నా జాప్యంతో స్వయంచాలకంగా ప్రారంభించబడిన కియోస్క్ అనువర్తన మానిఫెస్ట్లో required_platform_versionని పేర్కొనడం ద్వారా <ph name="PRODUCT_OS_NAME" /> సంస్కరణను నియంత్రించడానికి దాన్ని అనుమతించాలా వద్దా మరియు దీన్ని స్వీయ నవీకరణ లక్ష్య సంస్కరణ ఆదిప్రత్యయంగా ఉపయోగించాలా వద్దా అనేవాటిని ఈ విధానం నియంత్రిస్తుంది. + + విధానాన్ని ఒప్పుకు సెట్ చేస్తే, సున్నా జాప్యంతో స్వయంచాలకంగా ప్రారంభించబడిన కియోస్క్ అనువర్తనం యొక్క required_platform_version మానిఫెస్ట్ కీ విలువ స్వీయ నవీకరణ లక్ష్య సంస్కరణ ఆదిప్రత్యయంగా ఉపయోగించబడుతుంది. + + విధానాన్ని కాన్ఫిగర్ చేయకపోతే లేదా తప్పుకు సెట్ చేస్తే, required_platform_version మానిఫెస్ట్ కీ విస్మరించబడుతుంది మరియు స్వీయ నవీకరణ సాధారణంగా కొనసాగుతుంది.</translation> <translation id="7417972229667085380">ప్రెజెంటేషన్ మోడ్లో నిష్క్రియ ఆలస్యాన్ని లెక్కించే శాతం (విస్మరించబడింది)</translation> <translation id="7421483919690710988">మీడియా కాష్ పరిమాణాన్ని బైట్ల్లో సెట్ చేయండి</translation> <translation id="7424751532654212117">ఆపివేయబడిన ప్లగ్ఇన్ల జాబితాకి మినహాయింపుల జాబితా</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 010fb28..4de0a7d 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -188,6 +188,13 @@ นโยบายนี้เป็นที่ยอมรับเฉพาะในกรณีที่นโยบาย 'DefaultSearchProviderEnabled' ถูกเปิดใช้งาน</translation> <translation id="1859633270756049523">จำกัดระยะเวลาเซสชัน</translation> +<translation id="1859859319036806634">คำเตือน: TLS เวอร์ชันสำรองจะถูกนำออกจาก <ph name="PRODUCT_NAME" /> หลังจากเวอร์ชัน 52 (ประมาณเดือนกันยายน 2016) และนโยบายนี้จะหยุดทำงานหลังจากนั้น + + เมื่อแฮนด์เชคของ TLS ล้มเหลว ก่อนหน้านี้ <ph name="PRODUCT_NAME" /> จะเชื่อมต่อใหม่กับ TLS เวอร์ชันต่ำลงมาเพื่อแก้ไขปัญหาชั่วคราวในเซิร์ฟเวอร์ HTTPS การตั้งค่านี้จะกำหนดค่าเวอร์ชันที่ขั้นตอนสำรองจะหยุดทำงาน หากเซิร์ฟเวอร์ต่อรองเวอร์ชันอย่างถูกต้อง (กล่าวคือ โดยไม่ทำให้การเชื่อมต่อถูกตัด) ระบบจะไม่นำการตั้งค่านี้ไปใช้ แต่ไม่ว่าอย่างไรก็ตาม การเชื่อมต่อที่ได้มายังจะต้องสอดคล้องกับ SSLVersionMin + + หากไม่มีการกำหนดค่านโยบายนี้หรือหากกำหนดเป็น "tls1.2" ผลก็คือ <ph name="PRODUCT_NAME" /> จะไม่ใช้ขั้นตอนสำรองอีกต่อไป โปรดทราบว่าการดำเนินการนี้ไม่ได้ปิดการสนับสนุน TLS เวอร์ชันเก่ากว่า เฉพาะว่า <ph name="PRODUCT_NAME" /> จะแก้ปัญหาเซิร์ฟเวอร์ที่มีข้อบกพร่องชั่วคราวซึ่งต่อรองเวอร์ชันอย่างถูกต้องไม่ได้ + + มิเช่นนั้น อาจตั้งค่านโยบายเป็น "tls1.1" หากต้องรักษาความเข้ากันได้กับเซิร์ฟเวอร์ที่มีข้อบกพร่อง ซึ่งการดำเนินการนี้เป็นเพียงมาตรการชั่วคราวและควรมีการแก้ไขเซิร์ฟเวอร์อย่างรวดเร็ว</translation> <translation id="1861037019115362154">ระบุรายการปลั๊กอินที่ปิดใช้งานใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้่ใช้ทำการเปลี่ยนแปลง สัญลักษณ์แทน "*" และ "?" สามารถใช้เพื่อจับคู่กับอักขระต่างๆ ที่เรียงกันอย่างอิสระได้ "*" จะจับคู่กับอักขระจำนวนเท่าใดก็ได้ในขณะที่ "?" จะระบุถึงอักขระเดียวซึ่งจะมีหรือไม่ก็ได้ เช่น จับคู่กับอักขระศูนย์หรือหนึ่งตัว อักขระสำหรับเลี่ยงคือ "\" ซึ่งในกรณีที่คุณต้องการจับคู่กับอักขระ "*", "?" หรือ "\" จริงๆ คุณสามารถวาง "\" ไว้ข้างหน้าอักขระดังกล่าวได้ @@ -527,6 +534,7 @@ ระบุว่าควรเปิดใช้ส่วนขยายใบรับรองที่ผูกกับโดเมน TLS ไหม ใช้การตั้งค่านี้เพื่อเปิดใช้ส่วนขยายใบรับรองที่ผูกกับโดเมน TLS สำหรับการทดสอบ ระบบจะลบการตั้งค่าเวอร์ชันทดลองนี้ในอนาคต</translation> +<translation id="2957506574938329824">ไม่อนุญาตให้เว็บไซต์ใดๆ ขอสิทธิ์เข้าถึงอุปกรณ์บลูทูธผ่าน Web Bluetooth API</translation> <translation id="2957513448235202597">ประเภทบัญชีสำหรับการตรวจสอบสิทธิ์ <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">กฎการข้ามพร็อกซี</translation> <translation id="2960691910306063964">เปิดหรือปิดใช้การตรวจสอบสิทธิ์โดยไม่ใช้ PIN สำหรับโฮสต์การเข้าถึงระยะไกล</translation> @@ -540,6 +548,7 @@ ค่านโยบายควรกำหนดในหน่วยมิลลิวินาที ค่าจะถูกบีบให้น้อยกว่าหรือเท่ากับระยะหน่วงเวลาการปิดหน้าจอ (หากตั้งค่า) และระยะหน่วงเวลาของการไม่ใช้งาน</translation> <translation id="2987155890997901449">เปิดใช้ ARC</translation> +<translation id="2987227569419001736">ควบคุมการใช้ Web Bluetooth API</translation> <translation id="2998881342848488968">นโยบายนี้จะอนุญาตให้ <ph name="PRODUCT_OS_NAME" /> ผ่านพร็อกซีสำหรับการตรวจสอบสิทธิ์แคปทีฟพอร์ทัล นโยบายนี้จะมีผลหากมีการกำหนดค่าพร็อกซี (ตัวอย่างเช่น ผ่านนโยบาย โดยผู้ใช้จาก chrome://settings หรือโดยส่วนขยาย) @@ -822,6 +831,7 @@ นโยบายนี้เป็นที่ยอมรับเฉพาะในกรณีที่นโยบาย "DefaultSearchProviderEnabled" ถูกเปิดใช้</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 หรือใหม่กว่า</translation> +<translation id="4322842393287974810">อนุญาตแอปคีออสก์ที่เปิดอัตโนมัติด้วยความล่าช้าเป็น 0 เพื่อควบคุมเวอร์ชันของ <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">เพิ่มปุ่มออกจากระบบลงในถาดระบบ</translation> <translation id="4347908978527632940">หากเป็น True และผู้ใช้เป็นผู้ใช้ภายใต้การดูแล แอป Android อื่นๆ จะสามารถสืบค้นข้อจำกัดด้านเว็บของผู้ใช้คนดังกล่าวผ่านผู้ให้บริการเนื้อหาได้ @@ -1413,6 +1423,9 @@ หากไม่มีการตั้งค่านโยบาย แป้นพิมพ์บนหน้าจอจะถูกปิดเมื่อหน้าจอการเข้าสู่ระบบปรากฏขึ้นครั้งแรก ผู้ใช้สามารถเปิดหรือปิดแป้นพิมพ์บนหน้าจอเมื่อใดก็ได้ และสถานะของแป้นพิมพ์นั้นบนหน้าจอการเข้าสู่ระบบจะคงอยู่ตลอดระหว่างการใช้งานของผู้ใช้แต่ละคน</translation> <translation id="6598235178374410284">รูปอวาตาร์ของผู้ใช้</translation> +<translation id="6628646143828354685">อนุญาตให้คุณกำหนดได้ว่าจะอนุญาตให้เว็บไซต์ต่างๆ เข้าถึงอุปกรณ์บลูทูธที่อยู่ใกล้เคียงหรือไม่ ซึ่งสามารถเลือกที่จะบล็อกการเข้าถึงโดยสิ้นเชิง หรือให้เว็บไซต์หนึ่งๆ ขออนุญาตจากผู้ใช้ทุกครั้งที่ต้องการเข้าถึงอุปกรณ์บลูทูธที่อยู่ใกล้เคียง + + หากไม่มีการกำหนดค่านโยบายนี้ ระบบจะใช้ "3" และผู้ใช้จะสามารถเปลี่ยนแปลงได้</translation> <translation id="6636268606788232221">กำหนดค่าการตั้งค่าการจัดการพลังงานเมื่อผู้ใช้ไม่มีการใช้งาน นโยบายนี้จะควบคุมการตั้งค่าหลายอย่างสำหรับกลยุทธ์การจัดการพลังงานเมื่อผู้ใช้ไม่มีการใช้งาน @@ -1488,6 +1501,7 @@ หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะไม่สามารถเปลี่ยนแปลงหรือลบล้างได้ หากไม่มีการตั้งค่านโยบาย ตัวเลือกการเข้าถึงจะไม่แสดงในเมนูถาดระบบ แต่ผู้ใช้สามารถทำให้ตัวเลือกการเข้าถึงปรากฏได้จากหน้าการตั้งค่า</translation> +<translation id="6766216162565713893">อนุญาตให้เว็บไซต์ขอสิทธิ์เข้าถึงอุปกรณ์บลูทูธที่อยู่ใกล้เคียงจากผู้ใช้</translation> <translation id="6770454900105963262">รายงานข้อมูลเกี่ยวกับเซสชันคีออสก์ที่ใช้งาน</translation> <translation id="6774533686631353488">อนุญาตให้ใช้โฮสต์การรับส่งข้อความดั้งเดิมระดับผู้ใช้ (ติดตั้งโดยไม่มีสิทธิ์ของผู้ดูแลระบบ)</translation> <translation id="6786747875388722282">ส่วนขยาย</translation> @@ -1662,6 +1676,13 @@ <translation id="7340034977315324840">รายงานจำนวนครั้งของกิจกรรมบนอุปกรณ์</translation> <translation id="7381326101471547614">ปิดใช้งานการใช้โปรโตคอล SPDY ใน <ph name="PRODUCT_NAME" /> หากนโยบายนี้ถูกเปิดใช้งาน โปรโตคอล SPDY จะไม่สามารถใช้ได้ใน <ph name="PRODUCT_NAME" /> การตั้งค่านโยบายนี้เป็นปิดใช้งานจะทำให้สามารถใช้ SPDY ได้ และหากไม่ได้ตั้งค่านโยบายนี้ ก็จะสามารถใช้ SPDY ได้</translation> <translation id="7384999953864505698">อนุญาตโปรโตคอล QUIC</translation> +<translation id="7406651467768226499">การเลือกว่าจะอนุญาตแอปคีออสก์ที่เปิดอัตโนมัติด้วยความล่าช้าเป็น 0 เพื่อควบคุมเวอร์ชันของ <ph name="PRODUCT_OS_NAME" /> หรือไม่ + + นโยบายนี้ควบคุมการอนุญาตแอปคีออสก์ที่เปิดอัตโนมัติด้วยความล่าช้าเป็น 0 เพื่อควบคุมเวอร์ชันของ <ph name="PRODUCT_OS_NAME" /> ด้วยการประกาศ required_platform_version ในไฟล์ Manifest ของแอปและใช้เป็นคำนำหน้าเวอร์ชันเป้าหมายการอัปเดตอัตโนมัติ + + หากตั้งค่านโยบายนี้เป็น True ระบบจะใช้ค่าของคีย์ไฟล์ Manifest required_platform_version ของแอปคีออสก์ที่เปิดอัตโนมัติด้วยความล่าช้าเป็น 0 เป็นคำนำหน้าเวอร์ชันเป้าหมายการอัปเดตอัตโนมัติ + + หากกำหนดค่าหรือตั้งค่านโยบายนี้เป็น False ระบบจะไม่สนใจคีย์ไฟล์ Manifest required_platform_version และการอัปเดตอัตโนมัติจะดำเนินการไปตามปกติ</translation> <translation id="7417972229667085380">เปอร์เซ็นต์สำหรับการปรับการหน่วงเวลาของการไม่ใช้งานในโหมดการนำเสนอ (เลิกใช้งาน)</translation> <translation id="7421483919690710988">ตั้งค่าขนาดแคชของดิสก์สื่อเป็นไบต์</translation> <translation id="7424751532654212117">รายการยกเว้นสำหรับรายการของปลั๊กอินที่ถูกปิดใช้งาน</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 75bb3a4..f4d0015 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -214,6 +214,13 @@ Bu politika sadece is "DefaultSearchProviderEnabled" politikası etkinleştirilmişse dikkate alınır.</translation> <translation id="1859633270756049523">Oturum süresini sınırla</translation> +<translation id="1859859319036806634">Uyarı: TLS sürüm yedeği, sürüm 52'den sonra <ph name="PRODUCT_NAME" /> ürününden kaldırılacak (Eylül 2016 civarı) ve bu politika artık çalışmayacaktır. + + Bir TLS anlaşması başarısız olduğunda <ph name="PRODUCT_NAME" />, HTTPS sunucularındaki hatalardan kaçınmak amacıyla önceden TLS'nin daha düşük bir sürümüyle bağlanmayı tekrar deniyordu. Bu ayar, bu yedek sürümü kullanma işleminin ne kadar eskiye gideceğini yapılandırır. Bir sunucu sürüm pazarlığını doğru şekilde yaparsa (yani bağlantıyı kesmeden) bu ayar uygulanmaz. Yine de, sonuçta yapılan bağlantı SSLVersionMin ile uyumlu olmalıdır. + + Bu politika yapılandırılmazsa veya "tls1.2" değerine ayarlanırsa <ph name="PRODUCT_NAME" />, bu yedek sürümü kullanma işlemini gerçekleştirmez. Bunun daha eski TLS sürümlerine yönelik desteği devre dışı bırakmadığını, yalnızca <ph name="PRODUCT_NAME" /> ürününün, sürümlerle ilgili pazarlığı doğru şekilde yapamayan hatalı sunuculardan kaçınmaya çalışıp çalışmayacağını belirlediğini unutmayın. + + Yapılandırılması durumunda, hatalı bir sunucuyla uyumluluğun korunması gerekiyorsa bu politika, "tls1.1" değerine ayarlanabilir. Bu geçici bir tedbirdir ve sunucudaki sorun kısa sürede çözülmelidir.</translation> <translation id="1861037019115362154"><ph name="PRODUCT_NAME" /> ürününde devre dışı bırakılan eklentilerin bir listesini belirtir ve kullanıcıların bu ayarı değiştirmesini önler. '*' ve '?' joker karakterleri, rastgele karakter sıralarıyla eşleştirme için kullanılabilir. '*' karakteri, rastgele sayıda karakterle eşleşirken '?' karakteri isteğe bağlı tek bir karakterle (sıfır veya bir karakter) eşleşir. '\' kaçış karakteridir; dolayısıyla, gerçek '*', '?' veya '\' karakterleriyle eşleştirme yapmak için bu karakterlerin önüne bir '\' koyabilirsiniz. @@ -599,6 +606,7 @@ TLS alan adına bağlı sertifikalar uzantısının etkinleştirilip etkinleştirilmeyeceğini belirtir. Bu ayar TLS alan adına bağlı sertifikalar uzantısını test etme amacıyla etkinleştirmek için kullanılır. Bu deneysel ayar, gelecekte kaldırılacaktır.</translation> +<translation id="2957506574938329824">Hiçbir sitenin Web Bluetooth API'sı aracılığıyla Bluetooth hizmetlerine erişim istemesine izin verme</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> kimlik doğrulaması için hesap türü</translation> <translation id="2959898425599642200">Proxy atlama kuralları</translation> <translation id="2960691910306063964">Uzaktan erişim ana makineleri için PIN'siz kimlik doğrulamayı etkinleştir veya devre dışı bırak</translation> @@ -612,6 +620,7 @@ Politika değeri milisaniye olarak belirtilmelidir. Değerler ekran kapanma gecikmesinden (ayarlanmışsa) ve boşta kalma gecikmesinden küçük veya ona eşit olacak şekilde bir aralığa sıkıştırılır.</translation> <translation id="2987155890997901449">ARC'yi etkinleştir</translation> +<translation id="2987227569419001736">Web Bluetooth API'sının kullanımını kontrol et</translation> <translation id="2998881342848488968">Bu politika <ph name="PRODUCT_OS_NAME" /> ürününün, giriş portalı kimlik doğrulaması için proxy'leri atlamasına izin verir. Bu politika sadece bir proxy yapılandırıldığında geçerli olur (örneğin, politika aracılığıyla, kullanıcı tarafından chrome://settings bölümünden veya uzantılar tarafından). @@ -930,6 +939,7 @@ Bu politika sadece "DefaultSearchProviderEnabled" politikası etkinleştirilmişse dikkate alınır.</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 veya sonrası</translation> +<translation id="4322842393287974810">Sıfır gecikmeyle otomatik başlatılan kiosk uygulamasının <ph name="PRODUCT_OS_NAME" /> sürümünü kontrol etmesine izin ver</translation> <translation id="4325690621216251241">Sistem tepsisine çıkış düğmesi ekle</translation> <translation id="4347908978527632940">Doğru seçeneğine ayarlanırsa ve kullanıcı denetlenen bir kullanıcıysa, diğer Android uygulamaları kullanıcının web kısıtlamalarını bir içerik sağlayıcısı aracılığıyla sorgulayabilir. @@ -1606,6 +1616,9 @@ Bu politika ayarlanmadan bırakılırsa giriş ekranı ilk gösterildiğinde ekran klavyesi devre dışı bırakılır. Kullanıcılar istedikleri zaman ekran klavyesini etkinleştirebilir veya devre dışı bırakabilirler ve klavyenin giriş ekranındaki durumu kullanıcılar arasında değişmez.</translation> <translation id="6598235178374410284">Kullanıcı avatarı resmi</translation> +<translation id="6628646143828354685">Web sitelerinin yakınlardaki Bluetooth cihazlarına erişim sağlamalarına izin verilip verilmeyeceğini ayarlamanıza olanak tanır. Erişim tamamıyla engellenebilir veya bir web sitesinin yakınlardaki Bluetooth cihazlarına erişim sağlamak istediği her defasında, kullanıcıya onay verip vermediği sorulabilir. + + Bu politika ayarlanmadan bırakılırsa "3" değeri kullanılır ve kullanıcı, bu değeri değiştirebilir.</translation> <translation id="6636268606788232221">Kullanıcı işlem yapmadığında geçerli olacak güç yönetimi ayarlarını yapılandır. Bu politika, kullanıcı işlem yapmadığında güç yönetimi stratejisi için birden fazla ayarı kontrol eder. @@ -1686,7 +1699,7 @@ <translation id="6698424063018171973">Uzaktan erişen ana makine tarafından bu makinede kullanılan UDP bağlantı noktası aralığını kısıtlar. Bu politika ayarlanmadan bırakılır veya boş dize olarak ayarlanırsa uzaktan erişen ana makinenin, kullanılabilir erişim noktalarından herhangi birini kullanmasına izin verilir. Bu durum <ph name="REMOTEACCESSHOSTFIREWALLTRAVERSAL_POLICY_NAME" /> politikası devre dışı olmadığı sürece geçerlidir. Aksi halde, uzaktan erişen ana makine 12400-12409 aralığındaki UDP bağlantı noktalarını kullanır.</translation> -<translation id="6699880231565102694">Uzaktan erişim ana makineleri için iki etmenli kimlik doğrulamayı etkinleştir</translation> +<translation id="6699880231565102694">Uzaktan erişim ana makineleri için iki öğeli kimlik doğrulamayı etkinleştir</translation> <translation id="6757375960964186754">Sistem menüsünde <ph name="PRODUCT_OS_NAME" /> erişilebilirlik seçeneklerini gösterin. Bu politika doğru seçeneğine ayarlanırsa sistem tepsisi menüsünde Erişilebilirlik seçenekleri her zaman görünür. @@ -1696,6 +1709,7 @@ Bu politikayı ayarlarsanız kullanıcılar onu değiştiremez veya geçersiz kılamazlar. Bu politika ayarlanmadan bırakılırsa sistem tepsisi menüsünde Erişilebilirlik seçenekleri görünmez, ancak kullanıcı Ayarlar sayfasından Erişilebilirlik seçeneklerinin görünmesini sağlayabilir.</translation> +<translation id="6766216162565713893">Sitelerin, yakınlardaki bir Bluetooth cihazına erişmek için kullanıcıdan izin istemesine izin ver</translation> <translation id="6770454900105963262">Aktif kiosk oturumlarıyla ilgili bilgileri raporla</translation> <translation id="6774533686631353488">Kullanıcı düzeyinde Yerel Mesajlaşma ana makinelerine izin ver (yönetici şifreleri olmadan yüklenir).</translation> <translation id="6786747875388722282">Uzantılar</translation> @@ -1885,6 +1899,13 @@ <translation id="7340034977315324840">Cihaz etkinlik zamanlarını rapor et</translation> <translation id="7381326101471547614"><ph name="PRODUCT_NAME" /> ürününde SPDY protokolünün kullanımını devre dışı bırakır. Bu politika etkinleştirilirse SPDY protokolü <ph name="PRODUCT_NAME" /> ürününde kullanılamaz. Bu politika devre dışı bırakılırsa, SPDY kullanılabilir. Bu politika ayarlanmamış şekilde bırakılırsa, SPDY kullanılabilir durumda olur.</translation> <translation id="7384999953864505698">QUIC protokolüne izin verir</translation> +<translation id="7406651467768226499">Sıfır gecikmeyle otomatik başlatılan kiosk uygulamasının <ph name="PRODUCT_OS_NAME" /> sürümünü kontrol etmesine izin verilip verilmeyeceğini belirtir. + + Bu politika, sıfır gecikmeyle otomatik başlatılan kiosk uygulamasının, manifest dosyasında bir required_platform_version belirterek <ph name="PRODUCT_OS_NAME" /> sürümünü kontrol etmesine ve bunu otomatik güncelleme hedef sürümü öneki olarak kullanmasına izin verilip verilmeyeceğini denetler. + + Politika doğru değerine ayarlanırsa sıfır gecikmeyle otomatik başlatılan kiosk uygulamasının required_platform_version manifest anahtarı değeri, otomatik güncelleme hedef sürümü öneki olarak kullanılır. + + Politika yapılandırılmazsa veya yanlış değerine ayarlanırsa required_platform_version manifest anahtarı yoksayılır ve otomatik güncelleme işlemi normal bir şekilde ilerler.</translation> <translation id="7417972229667085380">Sunum modundayken boşta gecikme süresini ölçekleme yüzdesi (kullanımdan kaldırıldı)</translation> <translation id="7421483919690710988">Medya disk önbelleği boyutunu bayt olarak ayarla</translation> <translation id="7424751532654212117">Devre dışı bırakılmış eklentiler listesinin istisnalar listesi</translation> @@ -1948,11 +1969,11 @@ <translation id="7715711044277116530">Sunum modunda ekranın kararma gecikmesinin ölçekleneceği yüzde</translation> <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> erişilebilirlik özelliklerini yapılandır.</translation> <translation id="7719251660743813569">Kullanım ölçümlerinin Google'a bildirilip bildirilmeyeceğini denetler. True olarak ayarlanırsa, <ph name="PRODUCT_OS_NAME" /> kullanım ölçümlerini rapor eder. Hiç ayarlanmazsa veya false değerine ayarlanırsa, ölçüm raporlama devre dışı olur.</translation> -<translation id="7749402620209366169">Uzaktan erişim ana makineleri için, kullanıcı tarafından belirlenen PIN yerine iki etmenli kimlik doğrulamayı etkinleştirir. +<translation id="7749402620209366169">Uzaktan erişim ana makineleri için, kullanıcı tarafından belirlenen PIN yerine iki öğeli kimlik doğrulamayı etkinleştirir. - Bu ayar etkinleştirilirse, kullanıcıların bir ana makineye erişirken geçerli bir iki etmenli kimlik doğrulama kodu sağlamaları gerekir. + Bu ayar etkinleştirilirse, kullanıcıların bir ana makineye erişirken geçerli bir iki öğeli kimlik doğrulama kodu sağlamaları gerekir. - Bu ayar devre dışı bırakılır veya ayarlanmazsa, iki etmenli kimlik doğrulama etkinleştirilmez ve varsayılan davranış olan kullanıcı tanımlı bir PIN kullanılır.</translation> + Bu ayar devre dışı bırakılır veya ayarlanmazsa, iki öğeli kimlik doğrulama etkinleştirilmez ve varsayılan davranış olan kullanıcı tanımlı bir PIN kullanılır.</translation> <translation id="7750991880413385988">Yeni Sekme Sayfasını aç</translation> <translation id="7761526206824804472">Herkese açık bir oturum için önerilen yerel ayarlardan bir veya daha fazlasını yapılandırarak, kullanıcıların bunlardan birini kolayca seçmelerine olanak verir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 0caf01ae..9ae1e236 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -194,6 +194,13 @@ Це правило застосовується, лише якщо ввімкнено правило "DefaultSearchProviderEnabled".</translation> <translation id="1859633270756049523">Обмежити тривалість сеансу</translation> +<translation id="1859859319036806634">Застереження. Альтернативний до версії TLS протокол буде видалено у версіях <ph name="PRODUCT_NAME" />, новіших за 52 (це станеться приблизно у вересні 2016 року). Тоді ж перестане працювати це правило. + + Якщо протоколу TLS не вдається обмінятися даними із сервером, <ph name="PRODUCT_NAME" /> спробує під’єднатися ще раз через старішу версію TLS, щоб обійти помилки на серверах HTTPS. Цей параметр налаштовує версію, на якій перестане виконуватися цей резервний процес. Якщо сервер вибирає версію правильно (наприклад, не розриваючи з’єднання), це налаштування не застосовується. У будь-якому випадку з’єднання має відповідати правилу SSLVersionMin. + + Якщо це правило не налаштовано або має значення "tls1.2", <ph name="PRODUCT_NAME" /> більше не виконуватиме цей резервний процес. Зауважте: при цьому не вимикатиметься підтримка старіших версій TLS (це відбуватиметься, лише коли <ph name="PRODUCT_NAME" /> обходитиме помилки на серверах, які не можуть правильно вибрати версію). + + Якщо все ж потрібно під’єднуватися до сервера з помилками, для правила потрібно вибрати значення "tls1.1". Це тимчасовий захід, і помилки на сервері буде незабаром виправлено.</translation> <translation id="1861037019115362154">Визначає список плагінів, вимкнених у <ph name="PRODUCT_NAME" />, і не дозволяє користувачам змінювати це налаштування. Символи підстановки "*" і "?" можуть використовуватися для відповідності з послідовністю довільних символів. Символ "*" відповідає довільній кількості символів, а "?" визначає додатковий єдиний символ, тобто відповідає нулю або одному символу. Символом виходу є "\", тому для встановлення відповідності фактичним символам "*", "?" або "\" перед ними можна поставити "\". @@ -536,6 +543,7 @@ Указує, чи вмикати розширення пов’язаних із доменом сертифікатів TLS. Це налаштування використовується, щоб вмикати розширення пов’язаних із доменом сертифікатів TLS для тестування. Це експериментальне налаштування буде видалено згодом.</translation> +<translation id="2957506574938329824">Заборонити всім сайтам запитувати доступ до пристроїв Bluetooth через API Web Bluetooth</translation> <translation id="2957513448235202597">Тип облікового запису для автентифікації <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Правила обходу проксі-сервера</translation> <translation id="2960691910306063964">Увімкнути або вимкнути автентифікацію без PIN-коду для хостів віддаленого доступу</translation> @@ -549,6 +557,7 @@ Значення правила має вказуватися в мілісекундах. Також значення мають обов’язково бути меншими за затримку вимкнення екрана (якщо встановлено) і затримку через неактивність або дорівнювати їм.</translation> <translation id="2987155890997901449">Увімкнути ARC</translation> +<translation id="2987227569419001736">Контролювати використання API Web Bluetooth</translation> <translation id="2998881342848488968">Це правило дає змогу <ph name="PRODUCT_OS_NAME" /> обходити проксі-сервери для авторизації приєднаного порталу. Це правило діє, лише якщо проксі-сервер налаштовано (наприклад, за допомогою правила, розширень або користувачем у chrome://settings). @@ -831,6 +840,7 @@ Це правило застосовується, лише якщо ввімкнено правило "DefaultSearchProviderEnabled".</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 або пізнішої версії</translation> +<translation id="4322842393287974810">Дозволити додатку-терміналу, який запускається автоматично та без затримки, керувати версією <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Додати кнопку виходу в системну область</translation> <translation id="4347908978527632940">Якщо користувач контрольований і для цього правила вибрано значення "true", інші додатки Android можуть запитувати в постачальника вмісту інформацію про обмеження користувача в Інтернеті. @@ -1422,6 +1432,9 @@ Якщо це правило не встановлено, екранна клавіатура не вмикається під час першої появи екрана входу. Користувачі можуть будь-коли ввімкнути чи вимкнути екранну клавіатуру, і такий вибір на екрані входу буде чинним для всіх користувачів.</translation> <translation id="6598235178374410284">Зображення профілю користувача</translation> +<translation id="6628646143828354685">Дозволяє вказувати, чи можуть веб-сайти отримувати доступ до пристроїв Bluetooth поблизу. Доступ можна заборонити повністю або запитувати користувача щоразу, коли веб-сайт просить доступ до пристроїв Bluetooth поблизу. + + Якщо це правило не налаштовано, застосовується правило "3", і користувач зможе його змінити.</translation> <translation id="6636268606788232221">Налаштування параметрів керування живленням, коли користувач неактивний Це правило контролює кілька параметрів стратегії керування живленням, коли користувач неактивний. @@ -1496,6 +1509,7 @@ Якщо встановити це правило, користувачі не можуть його змінювати або замінювати. Якщо це правило не встановлено, параметри доступності не відображатимуться в системній області меню, але користувачі зможуть ініціювати показ параметрів доступності на сторінці налаштувань.</translation> +<translation id="6766216162565713893">Дозволити сайтам запитувати в користувача доступ до пристрою Bluetooth поблизу</translation> <translation id="6770454900105963262">Повідомляти інформацію про активні сеанси терміналу</translation> <translation id="6774533686631353488">Дозволити хости для обміну повідомленнями з оригінальними додатками на рівні користувача (установлені без дозволу адміністратора).</translation> <translation id="6786747875388722282">Розширення</translation> @@ -1671,6 +1685,13 @@ <translation id="7340034977315324840">Повідомляти про періоди активності пристрою</translation> <translation id="7381326101471547614">Вимикає використання протоколу SPDY у <ph name="PRODUCT_NAME" />. Якщо це правило ввімкнено, протокол SPDY буде не доступний у <ph name="PRODUCT_NAME" />. Якщо це правило вимкнено, використання протоколу SPDY буде дозволено. Якщо це правило не встановлено, протокол SPDY буде доступний.</translation> <translation id="7384999953864505698">Вмикає протокол QUIC</translation> +<translation id="7406651467768226499">Дозволити додатку-терміналу, який запускається автоматично та без затримки, керувати версією <ph name="PRODUCT_OS_NAME" />. + + Це правило визначає, чи дозволяти додатку-терміналу, який запускається автоматично та без затримки, керувати версією <ph name="PRODUCT_OS_NAME" />. Потрібно вказати в маніфесті значення "required_platform_version" і використовувати його як префікс автоматичного оновлення цільової версії. + + Якщо це правило має значення "true", указаний у маніфесті ключ "required_platform_version" додатка-термінала, який запускається автоматично та без затримки, використовується як префікс автоматичного оновлення цільової версії. + + Якщо це правило не налаштовано або має значення "false", ключ маніфесту "required_platform_version" ігнорується, а автоматичне оновлення відбувається у звичайному режимі.</translation> <translation id="7417972229667085380">Відсоток, за яким масштабують затримку неактивності в режимі презентації (більше не підтримується)</translation> <translation id="7421483919690710988">Установити кеш-пам’ять медіадиска в байтах</translation> <translation id="7424751532654212117">Список винятків для списку вимкнених плагінів</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index b6121c8..b88f79e0 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -213,6 +213,13 @@ Chính sách này chỉ được tuân theo nếu kích hoạt chính sách 'DefaultSearchProviderEnabled'.</translation> <translation id="1859633270756049523">Giới hạn độ dài phiên</translation> +<translation id="1859859319036806634">Cảnh báo: Phiên bản dự phòng TLS sẽ bị xóa khỏi <ph name="PRODUCT_NAME" /> sau phiên bản 52 (khoảng tháng 9 năm 2016) và chính sách này sẽ ngừng hoạt động ngay sau đó. + + Khi không kết hợp được qua TLS, trước đó <ph name="PRODUCT_NAME" /> sẽ thử kết nối lại với phiên bản TLS thấp hơn để khắc phục các lỗi trong máy chủ HTTPS. Cài đặt này sẽ định cấu hình phiên bản mà tại đó quá trình dự phòng này sẽ ngừng. Nếu máy chủ thực hiện đúng cách việc dàn xếp phiên bản (tức là không phá vỡ kết nối) thì cài đặt này sẽ không áp dụng. Tuy nhiên, kết nối đầu ra vẫn phải tuân thủ SSLVersionMin. + + Nếu chính sách này không được định cấu hình hoặc được đặt thành "tls1.2" thì <ph name="PRODUCT_NAME" /> không còn thực hiện bản dự phòng này nữa. Xin lưu ý rằng điều này không tắt hỗ trợ dành cho các phiên bản TLS cũ hơn, chỉ khi <ph name="PRODUCT_NAME" /> giải quyết các máy chủ bị lỗi mà không thể dàn xếp phiên bản đúng cách. + + Ngoài ra, nếu phải duy trì khả năng tương thích với máy chủ bị lỗi thì chính sách này có thể được đặt thành "tls1.1". Đây là một giải pháp tạm thời và máy chủ cần được khắc phục nhanh chóng.</translation> <translation id="1861037019115362154">Chỉ định danh sách các plugin bị tắt trong <ph name="PRODUCT_NAME" /> và ngăn người dùng thay đổi cài đặt này. Các ký tự đại diện '*' và '?' có thể được sử dụng để khớp với chuỗi các ký tự ngẫu nhiên. '*' khớp với một số ngẫu nhiên các ký tự còn '?' chỉ định ký tự đơn tùy chọn, tức là khớp với ký tự 0 hoặc 1. Ký tự thoát là '\', vì vậy để khớp với các ký tự '*', '?' hoặc '\' thực, bạn có thể đặt '\' trước các ký tự này. @@ -592,6 +599,7 @@ Chỉ định xem có cần bật tiện ích chứng chỉ giới hạn miền TLS hay không. Cài đặt này được sử dụng để bật tiện ích chứng chỉ giới hạn miền TLS dành cho thử nghiệm. Cài đặt thử nghiệm này sẽ bị xóa trong tương lai.</translation> +<translation id="2957506574938329824">Không cho phép bất kỳ trang web nào yêu cầu quyền truy cập vào thiết bị Bluetooth qua API Web Bluetooth</translation> <translation id="2957513448235202597">Loại tài khoản để xác thực <ph name="HTTP_NEGOTIATE" /></translation> <translation id="2959898425599642200">Quy tắc bỏ qua proxy</translation> <translation id="2960691910306063964">Bật hoặc tắt xác thực không có mã PIN cho các máy chủ truy cập từ xa</translation> @@ -605,6 +613,7 @@ Phải chỉ định giá trị chính sách bằng mili giây. Các giá trị được giới hạn ở mức nhỏ hơn hoặc bằng độ trễ tắt màn hình (nếu được đặt) và độ trễ khi không sử dụng.</translation> <translation id="2987155890997901449">Bật ARC</translation> +<translation id="2987227569419001736">Kiểm soát việc sử dụng API Web Bluetooth</translation> <translation id="2998881342848488968">Chính sách này cho phép <ph name="PRODUCT_OS_NAME" /> bỏ qua proxy bất kỳ để xác thực cổng cố định. Chính sách này chỉ có hiệu lực khi một proxy được định cấu hình (ví dụ: thông qua chính sách, bởi người dùng trong chrome://settings hoặc bởi các tiện ích). @@ -1593,6 +1602,9 @@ Nếu chính sách này không được đặt, bàn phím ảo bị tắt khi màn hình đăng nhập được hiển thị lần đầu tiên. Người dùng có thể bật hoặc tắt bàn phím ảo bất kỳ lúc nào và trạng thái của bàn phím trên màn hình đăng nhập được duy trì giữa những người dùng.</translation> <translation id="6598235178374410284">Hình đại diện của người dùng</translation> +<translation id="6628646143828354685">Cho phép bạn đặt có cho phép trang web truy cập vào các thiết bị Bluetooth lân cận hay không. Quyền truy cập có thể bị chặn hoàn toàn hoặc người dùng có thể được hỏi mỗi lần trang web muốn truy cập vào các thiết bị Bluetooth lân cận. + + Nếu chính sách này không được đặt, '3' sẽ được sử dụng và người dùng có thể thay đổi cài đặt này.</translation> <translation id="6636268606788232221">Định cấu hình cài đặt quản lý nguồn khi người dùng không sử dụng. Chính sách này kiểm soát nhiều cài đặt cho chiến lược quản lý nguồn khi người dùng không sử dụng. @@ -1684,6 +1696,7 @@ Nếu bạn đặt chính sách này, người dùng không thể thay đổi hoặc ghi đè chính sách đó. Nếu chính sách này không được đặt, tùy chọn Trợ năng sẽ không xuất hiện trong menu khay hệ thống nhưng người dùng có thể làm cho tùy chọn Trợ năng hiển thị qua trang Cài đặt.</translation> +<translation id="6766216162565713893">Cho phép trang web yêu cầu người dùng cấp quyền truy cập vào thiết bị Bluetooth lân cận</translation> <translation id="6770454900105963262">Báo cáo thông tin về các phiên kiosk hiện hoạt</translation> <translation id="6774533686631353488">Cho phép các máy chủ Nhắn tin gốc ở mức người dùng (được cài đặt mà không cần có quyền quản trị).</translation> <translation id="6786747875388722282">Tiện ích</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 098575c..71b105e 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -103,7 +103,7 @@ 如果此政策未设置,则对于受企业管理的用户,将使用默认值“MultiProfileUserBehaviorMustBePrimary”;对于不受企业管理的用户,则使用“MultiProfileUserBehaviorUnrestricted”。</translation> <translation id="1465619815762735808">点击运行</translation> -<translation id="1468307069016535757">设置登录屏幕上高反差模式无障碍功能的默认状态。 +<translation id="1468307069016535757">设置登录屏幕上高反差模式辅助功能的默认状态。 如果此政策的值设为 True,则登录屏幕显示时将会启用高反差模式。 @@ -178,6 +178,13 @@ 此政策只在启用了“DefaultSearchProviderEnabled”政策的前提下才会生效。</translation> <translation id="1859633270756049523">限制会话的长度</translation> +<translation id="1859859319036806634">警告:从 52 版开始,<ph name="PRODUCT_NAME" /> 中将取消 TLS 版本回退功能(2016 年 9 月左右)。届时,此政策将不再有效。 + + 如果 TLS 握手失败,<ph name="PRODUCT_NAME" /> 会首先重新尝试使用较低版本的 TLS 建立连接,以便忽略 HTTPS 服务器中的错误。此设置用于指定可回退到的最低版本。如果服务器正确地执行了版本协商(即没有中断连接),系统将不会应用此设置。无论怎样,最终的连接仍必须符合 SSLVersionMin 的规定。 + + 如果此政策未配置或设为“tls1.2”,<ph name="PRODUCT_NAME" /> 将不再执行此回退。请注意,这并不会导致停止支持旧版 TLS,只是用于指定 <ph name="PRODUCT_NAME" /> 是否忽略存在错误且无法正确协商版本的服务器。 + + 在其他情况下,如果必须与存在错误的服务器保持兼容,则可将此政策设为“tls1.1”。这是一种权宜之计,服务器中的错误应该很快会得到解决。</translation> <translation id="1861037019115362154">指定在 <ph name="PRODUCT_NAME" />中停用的插件列表,并禁止用户更改此设置。 可使用通配符“*”和“?”匹配任意字符序列。“*”可匹配任意数量的字符,而“?”可指定单个可选的字符,即匹配零个或一个字符。转义字符为“\”,因此要匹配实际的“*”、“?”或“\”字符,您可以在这些字符前加上“\”。 @@ -247,7 +254,7 @@ <translation id="2170233653554726857">启用WPAD优化</translation> <translation id="2188979373208322108">在 <ph name="PRODUCT_NAME" />中启用书签栏。如果您启用了此设置,<ph name="PRODUCT_NAME" />就会显示书签栏。如果您停用了此设置,用户就从不会看到书签栏。如果您启用或停用了此设置,用户就无法在 <ph name="PRODUCT_NAME" />中更改或替换此设置。如果未进行此设置,用户就可以决定是否使用此功能。</translation> <translation id="2201555246697292490">配置本地消息传递主机白名单</translation> -<translation id="2204753382813641270">控制文件架是否自动隐藏</translation> +<translation id="2204753382813641270">控制任务栏是否自动隐藏</translation> <translation id="2208976000652006649">在使用 POST 的搜索网址中所需的参数</translation> <translation id="2223598546285729819">默认通知设置</translation> <translation id="2231817271680715693">首次运行时,从默认浏览器导入浏览记录</translation> @@ -398,7 +405,7 @@ 如果该政策未设置或设置为True,而设备本地帐户又配置为零延迟自动登录,则当设备无法访问互联网时,<ph name="PRODUCT_OS_NAME" />将显示网络配置提示。 如果该政策设置为False,那么系统将显示错误消息,而不是网络配置提示。</translation> -<translation id="2498238926436517902">始终自动隐藏文件架</translation> +<translation id="2498238926436517902">始终自动隐藏任务栏</translation> <translation id="2514328368635166290">指定默认搜索服务提供商的首选图标网址。此政策是可选的,如果未设置,搜索服务提供商就不会显示任何图标。要实施此政策,必须启用“DefaultSearchProviderEnabled”政策。</translation> <translation id="2516525961735516234">指定视频活动是否影响电源管理。 @@ -510,6 +517,7 @@ 用于指定是否启用TLS网域绑定证书扩展程序。 此政策用于启用TLS网域绑定证书扩展程序,以便进行测试。这一实验性政策日后将会弃用。</translation> +<translation id="2957506574938329824">不允许任何网站通过 Web Bluetooth API 请求访问蓝牙设备</translation> <translation id="2957513448235202597">进行 <ph name="HTTP_NEGOTIATE" />身份验证时使用的帐户类型</translation> <translation id="2959898425599642200">代理绕过规则</translation> <translation id="2960691910306063964">针对远程访问主机启用或停用无 PIN 码身份验证</translation> @@ -523,6 +531,7 @@ 指定的政策值应以毫秒为单位,并且不得大于屏幕关闭延迟时间(如果设置了的话)和闲置延迟时间。</translation> <translation id="2987155890997901449">启用 ARC</translation> +<translation id="2987227569419001736">控制对 Web Bluetooth API 的使用</translation> <translation id="2998881342848488968">此政策允许 <ph name="PRODUCT_OS_NAME" />在进行强制门户身份验证时跳过任何代理服务器。 只有在配置了代理服务器时(例如,通过政策配置、由用户在 chrome://settings 中配置,或通过扩展程序配置),此政策才会生效。 @@ -693,12 +702,12 @@ 如果此政策设为false,用户登录后将无法在设备上使用音频输出。 - 此政策会影响所有类型的音频输出,而不只是影响内置扬声器。音频无障碍功能也受此政策约束。如果用户需要使用屏幕阅读器,请勿启用此政策。 + 此政策会影响所有类型的音频输出,而不只是影响内置扬声器。音频辅助功能也受此政策约束。如果用户需要使用屏幕阅读器,请勿启用此政策。 如果此政策设为true或未配置,用户将可以在其设备上使用所有受支持的音频输出。</translation> <translation id="3808945828600697669">指定已停用插件的列表</translation> <translation id="3816312845600780067">启用停止自动登录的键盘快捷键</translation> -<translation id="3820526221169548563">启用屏幕键盘无障碍功能。 +<translation id="3820526221169548563">启用屏幕键盘辅助功能。 如果此政策设为true,屏幕键盘将始终处于启用状态。 @@ -741,7 +750,7 @@ <translation id="3964909636571393861">允许访问网址列表</translation> <translation id="3965339130942650562">对待机用户执行退出操作前的超时时间</translation> <translation id="3967075520570946456">在操作系统升级后,允许该浏览器首次启动时显示欢迎页面。</translation> -<translation id="3973371701361892765">一律不自动隐藏文件架</translation> +<translation id="3973371701361892765">一律不自动隐藏任务栏</translation> <translation id="3984028218719007910">确定 <ph name="PRODUCT_OS_NAME" />是否要在退出后保留本地帐户数据。如果将此政策设置为 true,<ph name="PRODUCT_OS_NAME" />就不会持续保留帐户,且会在退出后舍弃用户会话中的所有数据。如果未配置此政策或将其设置为 false,设备就会保留(经过加密的)本地用户数据。</translation> <translation id="4001275826058808087">企业设备的IT管理员可以使用此项控制是否允许用户通过注册Chrome操作系统兑换优惠。 @@ -803,6 +812,7 @@ 此政策只在启用了“DefaultSearchProviderEnabled”政策的前提下才会生效。</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 或更高版本</translation> +<translation id="4322842393287974810">允许信息亭模式下的自动启动型零延迟应用控制 <ph name="PRODUCT_OS_NAME" />版本</translation> <translation id="4325690621216251241">向系统任务栏添加退出按钮</translation> <translation id="4347908978527632940">如果设为 true 且该用户是受监管用户,则其他 Android 应用可以通过内容提供方查询该用户的网络限制。 @@ -896,7 +906,7 @@ 如果此政策未设置,那么即使检测到某个服务器在内网上,<ph name="PRODUCT_NAME" /> 也不会委托用户凭据。</translation> <translation id="4752880493649142945">连接到 RemoteAccessHostTokenValidationUrl 时使用的客户端证书</translation> <translation id="4768493164188395498">发送监测信息的频率</translation> -<translation id="4791031774429044540">启用大号光标无障碍功能。 +<translation id="4791031774429044540">启用大号光标辅助功能。 如果此政策的值设为 True,则系统将会始终启用大号光标。 @@ -1101,15 +1111,15 @@ 如果未指定,则不会修改变体种子网址。</translation> <translation id="5564962323737505851">配置密码管理器。如果密码管理器已启用,您可以选择是否允许用户以明文形式显示存储的密码。</translation> -<translation id="556941986578702361">控制 <ph name="PRODUCT_OS_NAME" />文件架是否自动隐藏。 +<translation id="556941986578702361">控制 <ph name="PRODUCT_OS_NAME" />任务栏是否自动隐藏。 - 如果此策略设置为“AlwaysAutoHideShelf”,文件架将始终自动隐藏。 + 如果此策略设置为“AlwaysAutoHideShelf”,任务栏将始终自动隐藏。 - 如果此策略设置为“NeverAutoHideShelf”,文件架一律不自动隐藏。 + 如果此策略设置为“NeverAutoHideShelf”,任务栏一律不自动隐藏。 如果您设置了此策略,那么用户将无法更改或覆盖此策略。 - 如果未设置此策略,那么用户将可以选择是否自动隐藏文件架。</translation> + 如果未设置此策略,那么用户将可以选择是否自动隐藏任务栏。</translation> <translation id="557658534286111200">启用或停用书签修改功能</translation> <translation id="5586942249556966598">不执行任何操作</translation> <translation id="5613179474872285001">配置强制远程访问客户端使用的必要客户端域名,并禁止用户进行更改。 @@ -1177,7 +1187,7 @@ <translation id="5826047473100157858">指定用户是否可以在 <ph name="PRODUCT_NAME" />中以隐身模式打开网页。如果选择“已启用”或未设置此政策,则允许以隐身模式打开网页。如果选择“已停用”,则不能以隐身模式打开网页。如果选择“强制”,则只能以隐身模式打开网页。</translation> <translation id="5836064773277134605">限制远程访问主机使用的UDP端口范围</translation> <translation id="5845159892130426052">启用 ShowModalDialog API,有效期至 2015 年 4 月 30 日</translation> -<translation id="5862253018042179045">设置登录屏幕上语音反馈无障碍功能的默认状态。 +<translation id="5862253018042179045">设置登录屏幕上语音反馈辅助功能的默认状态。 如果此政策的值设为 True,则登录屏幕显示时将会启用语音反馈。 @@ -1208,7 +1218,7 @@ 如果您已停用或未配置此设置,那么系统将不会经由代理处理gnubby身份验证请求。</translation> <translation id="5912364507361265851">允许用户在“密码管理器”中显示密码</translation> <translation id="5921713479449475707">允许通过 HTTP 自动更新下载内容</translation> -<translation id="5921888683953999946">设置登录屏幕上大号光标无障碍功能的默认状态。 +<translation id="5921888683953999946">设置登录屏幕上大号光标辅助功能的默认状态。 如果此政策的值设为 True,则登录屏幕显示时将会启用大号光标。 @@ -1374,7 +1384,7 @@ ChromeOsReleaseChannel 策略将会覆盖用户选择的版本,但是,如果该策略版本比设备上已安装的版本更稳定,那么仅当较稳定版本的版本值高于设备上已安装版本时,系统才会切换版本。</translation> <translation id="6559057113164934677">不允许任何网站使用摄像头和麦克风</translation> <translation id="6561396069801924653">在系统任务栏菜单中显示无障碍选项</translation> -<translation id="6565312346072273043">设置屏幕键盘无障碍功能在登录屏幕上的默认状态。 +<translation id="6565312346072273043">设置屏幕键盘辅助功能在登录屏幕上的默认状态。 如果此政策设为true,登录屏幕打开后,屏幕键盘将处于启用状态。 @@ -1384,6 +1394,9 @@ 如果此政策未设置,登录屏幕初次打开时会停用屏幕键盘。用户可以随时启用或停用屏幕键盘,并且屏幕键盘在登录屏幕上的状态对各用户均有效。</translation> <translation id="6598235178374410284">用户头像图片</translation> +<translation id="6628646143828354685">可让您设置是否允许网站访问附近的蓝牙设备。您可以完全禁止此类访问,也可以设为每当有网站希望访问附近的蓝牙设备时均征求用户同意。 + + 如果此政策未设置,系统将使用“3”,并且用户可以更改此设置。</translation> <translation id="6636268606788232221">配置设备闲置时的电源管理设置。 此政策用于控制设备闲置时电源管理策略中的多个相关设置。 @@ -1460,6 +1473,7 @@ 如果您设置了此政策,用户将无法对其进行更改或覆盖。 如果此政策未设置,系统任务栏菜单中将不会显示无障碍选项,但用户可以通过“设置”页面使无障碍选项显示在系统任务栏菜单中。</translation> +<translation id="6766216162565713893">允许网站请求用户授予对附近蓝牙设备的访问权限</translation> <translation id="6770454900105963262">报告信息亭模式下的当前会话的相关信息</translation> <translation id="6774533686631353488">允许使用用户级本地消息传递主机(安装时没有管理员权限)。</translation> <translation id="6786747875388722282">扩展程序</translation> @@ -1476,7 +1490,7 @@ 确定在演示会话启动时要加载的网址集。此政策将替换其他任何用于设置初始网址的机制,因此仅适用于与特定用户无关的会话。</translation> <translation id="6908640907898649429">配置默认搜索服务提供商。您可以指定用户会使用的默认搜索服务提供商,或选择停用默认搜索。</translation> -<translation id="6915442654606973733">启用语音反馈无障碍功能。 +<translation id="6915442654606973733">启用语音反馈辅助功能。 如果此政策的值设为 True,则系统将始终启用语音反馈。 @@ -1636,6 +1650,13 @@ 如果未设置此政策,就可以使用 SPDY 协议。</translation> <translation id="7384999953864505698">允许使用 QUIC 协议</translation> +<translation id="7406651467768226499">是否允许信息亭模式下的自动启动型零延迟应用控制 <ph name="PRODUCT_OS_NAME" />版本。 + + 该政策通过在清单中声明 required_platform_version 并将其用作自动更新目标版本前缀,来控制是否允许信息亭模式下的自动启动型零延迟应用控制 <ph name="PRODUCT_OS_NAME" />版本。 + + 如果该政策设为“true”,信息亭模式下的自动启动型零延迟应用的 required_platform_version 清单键值便会被用作自动更新目标版本前缀。 + + 如果该政策设为“false”或未配置,required_platform_version 清单键便会被忽略,并且系统会按照常规流程进行自动更新。</translation> <translation id="7417972229667085380">演示模式下待机延迟时间的调整幅度(百分比)(已弃用)</translation> <translation id="7421483919690710988">设置媒体磁盘缓存大小(字节)</translation> <translation id="7424751532654212117">已停用插件列表的例外情况</translation> @@ -1691,7 +1712,7 @@ 此政策仅供 <ph name="PRODUCT_NAME" /> 在内部使用。</translation> <translation id="7712109699186360774">每当有网站要使用摄像头和/或麦克风时都要询问</translation> <translation id="7715711044277116530">演示模式下屏幕变暗延迟时间的调整幅度(百分比)</translation> -<translation id="7717938661004793600">配置 <ph name="PRODUCT_OS_NAME" />无障碍功能。</translation> +<translation id="7717938661004793600">配置 <ph name="PRODUCT_OS_NAME" />辅助功能。</translation> <translation id="7719251660743813569">控制是否要将使用情况指标报告回 Google。如果将此政策设置为 true,<ph name="PRODUCT_OS_NAME" />将报告使用情况指标。如果未配置此政策或将其设置为 false,指标报告就会停用。</translation> <translation id="7749402620209366169">为远程访问主机启用双重身份验证,而不是采用用户指定的 PIN。 @@ -1794,7 +1815,7 @@ 如果此政策设为False,则不报告接口列表。</translation> <translation id="8146727383888924340">允许用户通过注册 Chrome 操作系统来兑换优惠</translation> -<translation id="8148901634826284024">启用高反差模式无障碍功能。 +<translation id="8148901634826284024">启用高反差模式辅助功能。 如果此政策的值设为 True,则系统将始终启用高反差模式。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 25060908..f9725b8 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -192,6 +192,13 @@ 只有在啟用「DefaultSearchProviderEnabled」時,系統才會遵循這項政策。</translation> <translation id="1859633270756049523">限制工作階段長度</translation> +<translation id="1859859319036806634">警告:我們將於 <ph name="PRODUCT_NAME" /> 52 版發佈 (大約在 2016 年 9 月) 之後淘汰 TLS 版本遞補功能,並停止支援這項政策。 + + 當 TLS 交握失敗時,<ph name="PRODUCT_NAME" /> 會先重新嘗試以較低版本的 TLS 建立連線,以忽略 HTTPS 伺服器發生的錯誤。這項設定可讓您指定要在哪個版本停止遞補程序。如果伺服器正確執行版本交涉 (亦即不中斷連線),系統就不會套用這項設定。不過,最終的連線仍然必須符合 SSLVersionMin 要求。 + + 如果未設定這項政策,或是將這項政策的值設為「tls1.2」,<ph name="PRODUCT_NAME" /> 就不會再執行這項遞補程序。請注意,這只會影響 <ph name="PRODUCT_NAME" /> 是否略過發生錯誤的伺服器 (無法正確交涉版本),系統並不會因此停止支援較舊的 TLS 版本。 + + 否則,如果必須與發生錯誤的伺服器維持相容,系統可能會將這項政策的值設為「tls1.1」。這種方法是權宜之計,伺服器錯誤應該很快就會解決。</translation> <translation id="1861037019115362154">指定在 <ph name="PRODUCT_NAME" /> 中停用的外掛程式清單,並且防止使用者變更這項設定。 萬用字元「*」和「?」可與任意字元序列比對。「*」可與任意數量的字元比對,但「?」只能指定選擇性的單一字元,例如與零或一個字元比對。逸出字元為「\」,因此如要與真正的「*」、「?」或「\」字元配對,請在這些字元前方插入「\」。 @@ -530,6 +537,7 @@ 指定是否要啟用 TLS 網域專屬憑證擴充功能。 這項實驗性設定是用來啟用 TLS 網域專屬憑證擴充功能以供測試,我們將於日後移除。</translation> +<translation id="2957506574938329824">不允許任何網站透過 Web Bluetooth API 要求存取藍牙裝置</translation> <translation id="2957513448235202597"><ph name="HTTP_NEGOTIATE" /> 驗證模式的帳戶類型</translation> <translation id="2959898425599642200">Proxy 略過規則</translation> <translation id="2960691910306063964">針對遠端存取主機啟用或停用無 PIN 碼驗證機制</translation> @@ -543,6 +551,7 @@ 指定政策值時需以毫秒為單位。該值需小於或等於螢幕關閉延遲時間 (如有設定) 和閒置延遲時間。</translation> <translation id="2987155890997901449">啟用 ARC</translation> +<translation id="2987227569419001736">控制 Web Bluetooth API 使用權限</translation> <translation id="2998881342848488968">這項政策可讓 <ph name="PRODUCT_OS_NAME" /> 在進行監控式入口網站驗證程序時不要連線到 Proxy 伺服器。 這項政策只會在 Proxy 已設定 (例如透過政策設定、由使用者在 chrome://settings 中設定,或透過擴充功能設定) 時生效。 @@ -825,6 +834,7 @@ 只有在啟用「DefaultSearchProviderEnabled」時,系統才會遵循這項政策。</translation> <translation id="4320376026953250541">Microsoft Windows XP SP2 或更新版本</translation> +<translation id="4322842393287974810">允許使用無延遲資訊站應用程式的自動啟動功能來控制 <ph name="PRODUCT_OS_NAME" /> 版本</translation> <translation id="4325690621216251241">在系統列顯示登出按鈕</translation> <translation id="4347908978527632940">如果設為 true,且使用者是受監管的使用者,其他 Android 應用程式即可透過內容提供者查詢使用者的網路限制。 @@ -1416,6 +1426,9 @@ 如未設定這項政策,那麼登入畫面最初顯示時就會停用螢幕小鍵盤。使用者隨時可以啟用或停用螢幕小鍵盤,這項功能在登入畫面中的狀態,會在不同使用者之間持續下去。</translation> <translation id="6598235178374410284">使用者顯示圖片</translation> +<translation id="6628646143828354685">讓您設定是否允許網站存取附近的藍牙裝置。您可以完全禁止網站存取附近的藍牙裝置,也可以要求網站一律需要經過使用者同意才能存取附近的藍牙裝置。 + + 如果未設定這項政策,系統會使用「3」,而使用者可以自行變更設定。</translation> <translation id="6636268606788232221">設置使用者進入閒置狀態時的電源管理設定。 這項政策是控制各項電源管理策略設定,讓系統在使用者進入閒置狀態時執行相對應的動作。 @@ -1491,6 +1504,7 @@ 如果設定了這項政策,使用者將無法予以變更或覆寫。 如未設定這項政策,系統匣選單雖然不會顯示 [協助工具] 選項,但使用者仍可以透過「設定」網頁顯示 [協助工具] 選項。</translation> +<translation id="6766216162565713893">允許網站要求使用者授權存取附近的藍牙裝置</translation> <translation id="6770454900105963262">回報運作中資訊站工作階段相關資訊</translation> <translation id="6774533686631353488">允許使用者層級的內建訊息傳遞主機 (無管理員授權情況下安裝)。</translation> <translation id="6786747875388722282">擴充功能</translation> @@ -1663,6 +1677,14 @@ <translation id="7340034977315324840">回報裝置活動時間</translation> <translation id="7381326101471547614">停用 <ph name="PRODUCT_NAME" /> 中的 SPDY 通訊協定。如果啟用這項政策,SPDY 通訊協定就不會支援 <ph name="PRODUCT_NAME" />。停用這項政策即可使用 SPDY。如果未設定這項政策,即可使用 SPDY。</translation> <translation id="7384999953864505698">允許 QUIC 通訊協定</translation> +<translation id="7406651467768226499">是否允許使用無延遲資訊站應用程式的自動啟動功能來控制 <ph name="PRODUCT_OS_NAME" /> 版本。 + + 這項政策可控制是否允許使用無延遲資訊站應用程式的自動啟動功能來控制 <ph name="PRODUCT_OS_NAME" /> 版本;做法是在資訊清單中聲明 required_platform_version (需求平台版本),並以該版本做為自動更新目標版本的前置字串。 + + 如果您將這項政策設為 True,使用無延遲資訊站應用程式的自動啟動功能,required_platform_version 資訊清單金鑰的值就是自動更新目標版本的前置字串。 + + + 如果您將這項政策設為 False,系統就會略過 required_platform_version 資訊清單金鑰,自動更新功能則會照常運作。</translation> <translation id="7417972229667085380">簡報模式中的閒置延遲時間延長百分比 (已不適用)</translation> <translation id="7421483919690710988">設定媒體磁碟快取大小 (以位元組為單位)</translation> <translation id="7424751532654212117">停用的外掛程式清單的例外清單</translation>
diff --git a/components/printing/test/print_web_view_helper_browsertest.cc b/components/printing/test/print_web_view_helper_browsertest.cc index 1e601977..8070e1a 100644 --- a/components/printing/test/print_web_view_helper_browsertest.cc +++ b/components/printing/test/print_web_view_helper_browsertest.cc
@@ -4,6 +4,8 @@ #include <stddef.h> +#include <tuple> + #include "base/command_line.h" #include "base/macros.h" #include "base/run_loop.h" @@ -180,7 +182,7 @@ PrintHostMsg_DidGetPrintedPagesCount::Param post_page_count_param; PrintHostMsg_DidGetPrintedPagesCount::Read(page_cnt_msg, &post_page_count_param); - EXPECT_EQ(count, base::get<1>(post_page_count_param)); + EXPECT_EQ(count, std::get<1>(post_page_count_param)); #endif // defined(OS_CHROMEOS) } @@ -196,7 +198,7 @@ PrintHostMsg_DidGetPreviewPageCount::Param post_page_count_param; PrintHostMsg_DidGetPreviewPageCount::Read(page_cnt_msg, &post_page_count_param); - EXPECT_EQ(count, base::get<0>(post_page_count_param).page_count); + EXPECT_EQ(count, std::get<0>(post_page_count_param).page_count); } #endif // defined(ENABLE_PRINT_PREVIEW) @@ -210,7 +212,7 @@ if (printed) { PrintHostMsg_DidPrintPage::Param post_did_print_page_param; PrintHostMsg_DidPrintPage::Read(print_msg, &post_did_print_page_param); - EXPECT_EQ(0, base::get<0>(post_did_print_page_param).page_number); + EXPECT_EQ(0, std::get<0>(post_did_print_page_param).page_number); } } @@ -546,9 +548,9 @@ if (did_get_preview_msg) { PrintHostMsg_MetafileReadyForPrinting::Param preview_param; PrintHostMsg_MetafileReadyForPrinting::Read(preview_msg, &preview_param); - EXPECT_NE(0, base::get<0>(preview_param).document_cookie); - EXPECT_NE(0, base::get<0>(preview_param).expected_pages_count); - EXPECT_NE(0U, base::get<0>(preview_param).data_size); + EXPECT_NE(0, std::get<0>(preview_param).document_cookie); + EXPECT_NE(0, std::get<0>(preview_param).expected_pages_count); + EXPECT_NE(0U, std::get<0>(preview_param).data_size); } } @@ -574,12 +576,12 @@ if (msg->type() == PrintHostMsg_DidPreviewPage::ID) { PrintHostMsg_DidPreviewPage::Param page_param; PrintHostMsg_DidPreviewPage::Read(msg, &page_param); - if (base::get<0>(page_param).page_number == page_number) { + if (std::get<0>(page_param).page_number == page_number) { msg_found = true; if (generate_draft_pages) - EXPECT_NE(0U, base::get<0>(page_param).data_size); + EXPECT_NE(0U, std::get<0>(page_param).data_size); else - EXPECT_EQ(0U, base::get<0>(page_param).data_size); + EXPECT_EQ(0U, std::get<0>(page_param).data_size); break; } } @@ -602,13 +604,13 @@ PrintHostMsg_DidGetDefaultPageLayout::Param param; PrintHostMsg_DidGetDefaultPageLayout::Read(default_page_layout_msg, ¶m); - EXPECT_EQ(content_width, base::get<0>(param).content_width); - EXPECT_EQ(content_height, base::get<0>(param).content_height); - EXPECT_EQ(margin_top, base::get<0>(param).margin_top); - EXPECT_EQ(margin_right, base::get<0>(param).margin_right); - EXPECT_EQ(margin_left, base::get<0>(param).margin_left); - EXPECT_EQ(margin_bottom, base::get<0>(param).margin_bottom); - EXPECT_EQ(page_has_print_css, base::get<2>(param)); + EXPECT_EQ(content_width, std::get<0>(param).content_width); + EXPECT_EQ(content_height, std::get<0>(param).content_height); + EXPECT_EQ(margin_top, std::get<0>(param).margin_top); + EXPECT_EQ(margin_right, std::get<0>(param).margin_right); + EXPECT_EQ(margin_left, std::get<0>(param).margin_left); + EXPECT_EQ(margin_bottom, std::get<0>(param).margin_bottom); + EXPECT_EQ(page_has_print_css, std::get<2>(param)); } }
diff --git a/components/signin/ios/browser/account_consistency_service_unittest.mm b/components/signin/ios/browser/account_consistency_service_unittest.mm index c7db2eca..9cec4a25 100644 --- a/components/signin/ios/browser/account_consistency_service_unittest.mm +++ b/components/signin/ios/browser/account_consistency_service_unittest.mm
@@ -18,7 +18,6 @@ #include "ios/web/public/test/test_browser_state.h" #include "ios/web/public/test/test_web_state.h" #include "ios/web/public/test/test_web_thread_bundle.h" -#include "ios/web/public/test/web_test_util.h" #include "ios/web/public/web_state/web_state_policy_decider.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -216,7 +215,6 @@ // Tests whether the WKWebView is actually stopped when the browser state is // inactive. TEST_F(AccountConsistencyServiceTest, OnInactive) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); [[GetMockWKWebView() expect] stopLoading]; web::BrowserState::GetActiveStateManager(&browser_state_)->SetActive(false); EXPECT_OCMOCK_VERIFY(GetMockWKWebView()); @@ -225,8 +223,6 @@ // Tests that cookies that are added during SignIn and subsequent navigations // are correctly removed during the SignOut. TEST_F(AccountConsistencyServiceTest, SignInSignOut) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - // Check that main Google domains are added. AddPageLoadedExpectation(kGoogleUrl, true /* continue_navigation */); AddPageLoadedExpectation(kYoutubeUrl, true /* continue_navigation */); @@ -257,8 +253,6 @@ // Tests that pending cookie requests are correctly applied when the browser // state becomes active. TEST_F(AccountConsistencyServiceTest, ApplyOnActive) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - // No request is made until the browser state is active, then a WKWebView and // its navigation delegate are created, and the requests are processed. [[GetMockWKWebView() expect] setNavigationDelegate:[OCMArg isNotNil]]; @@ -274,8 +268,6 @@ // browser state becomes inactives and correctly re-started later when the // browser state becomes active. TEST_F(AccountConsistencyServiceTest, CancelOnInactiveReApplyOnActive) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - // The first request starts to get applied and get cancelled as the browser // state becomes inactive. It is resumed after the browser state becomes // active again. @@ -358,8 +350,6 @@ // Tests that domains with cookie are added to the prefs only after the request // has been applied. TEST_F(AccountConsistencyServiceTest, DomainsWithCookiePrefsOnApplied) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - // Second request is not completely applied. Ensure prefs reflect that. AddPageLoadedExpectation(kGoogleUrl, true /* continue_navigation */); AddPageLoadedExpectation(kYoutubeUrl, false /* continue_navigation */); @@ -376,8 +366,6 @@ // Tests that domains with cookie are correctly loaded from the prefs on service // startup. TEST_F(AccountConsistencyServiceTest, DomainsWithCookieLoadedFromPrefs) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - AddPageLoadedExpectation(kGoogleUrl, true /* continue_navigation */); AddPageLoadedExpectation(kYoutubeUrl, true /* continue_navigation */); SignIn(); @@ -392,8 +380,6 @@ // Tests that domains with cookie are cleared when browsing data is removed. TEST_F(AccountConsistencyServiceTest, DomainsClearedOnBrowsingDataRemoved) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - AddPageLoadedExpectation(kGoogleUrl, true /* continue_navigation */); AddPageLoadedExpectation(kYoutubeUrl, true /* continue_navigation */); SignIn();
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 3ddeb70..e8aced47 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው በኮምፒውተርዎ ስርዓተ ክወና የሚታመን አይደለም። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።</translation> <translation id="1152921474424827756">የ<ph name="URL" /> <ph name="BEGIN_LINK" />የተሸጎጠ ቅጂ<ph name="END_LINK" /> ይድረሱ</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ሳይታሰብ ግንኙነቱን ዘግቷል።</translation> +<translation id="1161325031994447685">ከWi-Fi ጋር ዳግም በማገናኘት</translation> <translation id="1175364870820465910">&አትም…</translation> <translation id="1181037720776840403">አስወግድ</translation> <translation id="1195447618553298278">ያልታወቀ ስህተት።</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">የተጠቃሚ መምሪያዎች</translation> <translation id="1644184664548287040">የአውታረ መረቡ ውቅር ልክ ያልሆነ እና ሊመጣ የማይችል ነው።</translation> <translation id="1644574205037202324">ታሪክ</translation> +<translation id="1645368109819982629">የማይደገፍ ፕሮቶኮል</translation> <translation id="1655462015569774233">{1,plural, =1{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ለማረጋገጥ አይችልም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው ትላንትና ጊዜው አልፎበታል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል። የኮምፒውተርዎ ሰዓት አሁን በ<ph name="CURRENT_DATE" /> ተቀናብሯል። ትክክል ይመስልዎታል? ትክክል ካልሆነ፣ የእርስዎን ስርዓት ሰዓት ማስተካከል እና ይህንን ገፅ ማደስ አለብዎ።}one{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ለማረጋገጥ አይችልም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው ከ# ቀኖች በፊት ጊዜው አልፏል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል። የኮምፒውተርዎ ሰዓት አሁን በ<ph name="CURRENT_DATE" /> ተቀናብሯል። ትክክል ይመስልዎታል? ትክክል ካልሆነ፣ የእርስዎን ስርዓት ሰዓት ማስተካከል እና ይህንን ገፅ ማደስ አለብዎ።}other{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ለማረጋገጥ አይችልም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው ከ# ቀኖች በፊት ጊዜው አልፏል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል። የኮምፒውተርዎ ሰዓት አሁን በ<ph name="CURRENT_DATE" /> ተቀናብሯል። ትክክል ይመስልዎታል? ትክክል ካልሆነ፣ የእርስዎን ስርዓት ሰዓት ማስተካከል እና ይህንን ገፅ ማደስ አለብዎ።}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> የእርስዎን መረጃ ለመጠበቅ በመደበኝነት ምስጠራ ይጠቀማል። Google Chrome አሁን ከ<ph name="SITE" /> ጋር ለመገናኘት ሲሞክር ድር ጣቢያው ያልተለመዱ እና ትክክል ያልሆኑ ምስክርነቶችን መልሷል። ይህ አንድ አጥቂ <ph name="SITE" />ን አስመስሎ ለመቅረብ ሲሞክር ነው ወይም አንድ የWi-Fi መግቢያ ገጽ ግንኙነቱን ሲያቋረጥ ሊከሰት ይችላል። Google Chrome ማንኛውም የውሂብ ልውውጥ ከመካሄዱ በፊት ግንኙነቱን ስላቋረጠው የእርስዎ መረጃ ደህንነት አሁንም የተጠበቀ ነው።</translation> <translation id="168841957122794586">የአገልጋይ እውቅና ማረጋገጫው ደካማ የሆነ ባለስውር መረጃ ቁልፍ ነው ያለው።</translation> <translation id="1706954506755087368">{1,plural, =1{ይህ አገልጋይ <ph name="DOMAIN" /> እንደሆነ ማረጋገጥ አልቻለም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው ከነገ የመጣ ነው ይላል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።}one{ይህ አገልጋይ <ph name="DOMAIN" /> እንደሆነ ማረጋገጥ አልቻለም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው የወደፊት # ቀንኖች የመጣ ነው ይላል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።}other{ይህ አገልጋይ <ph name="DOMAIN" /> እንደሆነ ማረጋገጥ አልቻለም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው የወደፊት # ቀንኖች የመጣ ነው ይላል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።}}</translation> <translation id="1710259589646384581">ስርዓተ ክወና</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">የሥርዓት አስተዳዳሪውን ለማነጋገር ይሞክሩ።</translation> <translation id="17513872634828108">ትሮችን ክፈት</translation> <translation id="1753706481035618306">የገጽ ቁጥር</translation> <translation id="1763864636252898013">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው በመሣሪያዎ ስርዓተ ክወና የሚታመን አይደለም። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">ተኪ ወደ ራስ-ውቅር ተዋቅሯል።</translation> <translation id="2025623846716345241">ዳግም መጫን ያረጋግጡ</translation> <translation id="2030481566774242610"><ph name="LINK" />ን ማለትዎ ነው?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />ወኪሉን እና ኬላውን መፈተሽ<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ዚፕ ኮድ</translation> <translation id="2065985942032347596">ማረጋገጫ ያስፈልጋል</translation> <translation id="2079545284768500474">ቀልብስ</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">መመሪያ አልተገኘም</translation> <translation id="2213606439339815911">ግቤቶችን በማምጣት ላይ...</translation> <translation id="2214283295778284209"><ph name="SITE" /> አልተገኘም</translation> +<translation id="2227695659599072496">የአውታረ መረብ ገመዱን ወይም ራውተሩን መፈተሽ</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />የመመርመሪያ መተግበሪያውን<ph name="END_LINK" /> በመጠቀም ግንኙነትዎን ያስተካክሉት</translation> <translation id="225207911366869382">ይህ ዋጋ ለዚህ መመሪያ ተቋርጧል።</translation> <translation id="2262243747453050782">የኤች ቲ ቲ ፒ ስህተት</translation> <translation id="2279770628980885996">አገልጋዩ ጥያቄውን ለማሟሟላት በሚሞክርበት ጊዜ ያልተጠበቀ ሁኔታ አጋጥሟል።</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON ተንታኝ</translation> <translation id="2495093607237746763">ምልክት ከተደረገበት Chromium ለተሻለ የቅጽ አሞላል ፍጥነት የካርድዎን ቅጂ በዚህ መሣሪያ ላይ ያከማቻል።</translation> <translation id="2498091847651709837">አዲስ ካርድ ቃኝ</translation> +<translation id="2515629240566999685">በእርስዎ አካባቢ ያለውን ሲጊናል መፈተሽ</translation> <translation id="2516305470678292029">የበይነገጽ አማራጮች</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> ልክ ያልኾነ ምላሽ ልኳል።</translation> <translation id="2552545117464357659">በጣም አዲስ</translation> @@ -220,6 +227,7 @@ <translation id="3254409185687681395">ለእዚህ ገጽ ዕልባት አብጅ</translation> <translation id="3270847123878663523">&ዳግም ደርድርን ቀልብስ</translation> <translation id="3286538390144397061">አሁን ዳግም አስጀምር</translation> +<translation id="3288003805934695103">ገጹን እንደገና መጫን</translation> <translation id="3305707030755673451">የእርስዎ ውሂብ <ph name="TIME" /> ላይ በእርስዎ የስምረት የይለፍ ቃል ተመስጥሯል። ስምረትን ለመጀመር ያስገቡት።</translation> <translation id="333371639341676808">ይህ ገጽ ተጨማሪ ማገናኛዎችን እንዳይፈጥር አግድ።</translation> <translation id="3340978935015468852">ቅንብሮች</translation> @@ -263,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">በመጫን ላይ...</translation> <translation id="3712624925041724820">ሁሉም ፍቃዶች ተሞክረዋል</translation> +<translation id="3714780639079136834">የሞባይል ውሂብ ወይም Wi-Fi ማብራት</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />ወኪሉን፣ ኬላውን እና የዲኤንኤስ ውቅረትን መፈተሽ<ph name="END_LINK" /></translation> <translation id="3739623965217189342">እርስዎ የቀዱት አገናኝ</translation> <translation id="3744899669254331632">የድር ጣቢያው Chromium ሊያስኬዳቸው የማይችሉ የተዘበራረቁ ምስክርነቶችን ስለላከ አሁን ላይ <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች ብዙውን ጊዜ ጊዜያዊ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ምናልባት ሊሰራ ይችል ይሆናል።</translation> <translation id="3748412725338508953">በርካታ የአድራሻ ቅየራዎች አሉ።</translation> @@ -285,6 +295,7 @@ <translation id="3963721102035795474">የአንባቢ ሁነታ</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ታግዷል</translation> <translation id="4021036232240155012">ዲኤንኤስ የአንድ ድር ጣቢያ ስም ወደ የእሱ የበይነመረብ አድራሻ የሚተረጉም የአውታረ መረብ አገልግሎት ነው።</translation> +<translation id="4021376465026729077">የእርስዎን ቅጥያዎች ማሰናከል</translation> <translation id="4030383055268325496">&አክልን ቀልብስ</translation> <translation id="4032534284272647190">የ<ph name="URL" /> መዳረሻ ተከልክሏል።</translation> <translation id="404928562651467259">ማስጠንቀቂያ</translation> @@ -301,6 +312,7 @@ <translation id="4171400957073367226">መጥፎ የማረጋገጫ ፊርማ</translation> <translation id="4176463684765177261">ተሰናክሏል</translation> <translation id="4196861286325780578">&ውሰድን ድገም</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />የኬላ እና የጸረ-ቫይረስ ውቅረቶችን መፈተሽ<ph name="END_LINK" /></translation> <translation id="4220128509585149162">ብልሽቶች</translation> <translation id="4250680216510889253">አይ</translation> <translation id="4258748452823770588">መጥፎ ፊርማ</translation> @@ -321,6 +333,7 @@ <translation id="443673843213245140">የተኪ መጠቀም ተሰናክሏል ግን ግልጽ የሆነ የተኪ ውቅር ተገልጿል።</translation> <translation id="4492190037599258964">የፍለጋ ውጤቶች ለ'<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">የማረጋገጥ ስህተት፦ <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">የሥርዓት አስተዳዳሪውን ማነጋገር</translation> <translation id="450710068430902550">ከአስተዳዳሪ ጋር ማጋራት</translation> <translation id="4522570452068850558">ዝርዝሮች</translation> <translation id="4535734014498033861">የተኪ አገልጋይ ግንኙነት አልተሳካም።</translation> @@ -358,6 +371,7 @@ <translation id="5031870354684148875">ስለ Google ትርጉም</translation> <translation id="5040262127954254034">ግላዊነት</translation> <translation id="5045550434625856497">ትክክል ያልሆነ የይለፍ ቃል</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />የወኪሉን አድራሻ መፈተሽ<ph name="END_LINK" /></translation> <translation id="5087286274860437796">የአገልጋይ የዕውቅና ማረጋገጫ በዚህ ጊዜ ላይ የሚሰራ አይደለም።</translation> <translation id="5089810972385038852">ግዛት</translation> <translation id="5094747076828555589">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው በChromium የሚታመን አይደለም። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።</translation> @@ -376,6 +390,7 @@ <translation id="5295309862264981122">ዳሰሳን አረጋግጥ</translation> <translation id="5299298092464848405">መምሪያን መተንተን ላይ ስህተት</translation> <translation id="5300589172476337783">አሳይ</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />የእርስዎን ኩኪዎች ማጽዳት<ph name="END_LINK" /></translation> <translation id="5308689395849655368">የብልሽት ሪፖርት ማድረግ ተሰናክሏል።</translation> <translation id="5317780077021120954">አስቀምጥ</translation> <translation id="5327248766486351172">ስም</translation> @@ -405,6 +420,7 @@ <translation id="5556459405103347317">ዳግም ጫን</translation> <translation id="5565735124758917034">ገባሪ</translation> <translation id="560412284261940334">አስተዳደር አይደገፍም</translation> +<translation id="5610142619324316209">ግንኙነቱን መፈተሽ</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> እርስዎን በጣም ብዙ ጊዜ ወደ ሌላ ቦታ መርተዎታል።</translation> <translation id="5629630648637658800">የመምሪያ ቅንብሮችን መጫን አልተሳካም</translation> <translation id="5631439013527180824">ልክ ያልሆነ የመሣሪያ አስተዳደር ማስመሰያ</translation> @@ -437,6 +453,7 @@ <translation id="6093795393556121384">የእርስዎ ካርድ ተረጋግጧል</translation> <translation id="6146055958333702838">ማናቸውም ገመዶችን ይፈትሹና እየተጠቀሙ ሊሆኑ የሚችሏቸውን ማንኛውም ራውተሮች፣ ሞደሞችን ወይም ሌላ አውታረ መረብ መሣሪያዎችን ዳግም ያስጀምሩ።</translation> +<translation id="614940544461990577">ይሞክሩ፦</translation> <translation id="6151417162996330722">የአገልጋይ እውቅና ማረጋገጫው በጣም ረጅም የሆነ የማረጋገጫ ጊዜ አለው።</translation> <translation id="6154808779448689242">የተመለሰው የመምሪያ ማስመሰያ ከአሁኑ ማስመሰያ ጋር አይዛመድም</translation> <translation id="6165508094623778733">ተጨማሪ ለመረዳት</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> ፍለጋ</translation> <translation id="6634865548447745291"><ph name="BEGIN_LINK" />ይህ የእውቅና ማረጋገጫ ስለተሻረ<ph name="END_LINK" /> <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ብቻ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ሊሰራ ይችላል።</translation> <translation id="6637478299472506933">ማውረድ አልተሳካም</translation> +<translation id="6642894344118208103">ሞደሙን ወይም ራውተሩን ዳግም ማስጀመር</translation> <translation id="6644283850729428850">ይህ መመሪያ ተቋርጧል።</translation> <translation id="6646897916597483132">በካርድዎ ፊት ላይ ያለውን ባለ4 አኃዝ CVCን ያስገቡ</translation> <translation id="6656103420185847513">አቃፊ ያርትዑ</translation> <translation id="6660210980321319655"><ph name="CRASH_TIME" /> ላይ በራስ-ሰር ሪፓርት ተደርጓል</translation> <translation id="6671697161687535275">የአስተያየት ጥቆማ ከChromium ይወገድ?</translation> +<translation id="6685834062052613830">ዘግተው ይውጡ እና ቅንብርን ያጠናቅቁ</translation> <translation id="6710213216561001401">ቀዳሚ</translation> <translation id="6711464428925977395">በተኪ አገልጋዩ ላይ የሆነ ችግር አለ ወይም አድራሻው ትክክል አይደለም።</translation> <translation id="674375294223700098">ያልታወቀ የአገልጋይ እውቅና ማረጋገጫ ስህተት።</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">የአግባቢ ፍኖት ወይም ተኪ አገልጋዩ ከምንጭ አገልጋዩ ልክ ያልሆነ ምላሽ ተቀብሏል።</translation> <translation id="7087282848513945231">አውራጃ</translation> <translation id="7088615885725309056">የቆየ</translation> +<translation id="7090678807593890770"><ph name="LINK" />ን በGoogle ላይ ይፈልጉ</translation> <translation id="7108649287766967076">ወደ <ph name="TARGET_LANGUAGE" /> መተርጎም አልተሳካም።</translation> <translation id="7139724024395191329">ኤሚሬት</translation> <translation id="7179921470347911571">አሁን ዳግም ያስጀምሩ</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">ምንም የታሪክ ግቤቶች አልተገኙም።</translation> <translation id="8088680233425245692">ጽሑፉን ማየት አልተቻለም።</translation> <translation id="8091372947890762290">ማግበር በአገልጋዩ ላይ በመጠባበቅ ላይ ነው</translation> +<translation id="8134994873729925007">የ<ph name="HOST_NAME" /> አገልጋይ <ph name="BEGIN_ABBR" />ዲኤንኤስ አድራሻ<ph name="END_ABBR" /> ሊገኝ አልተቻለም።</translation> <translation id="8149426793427495338">የእርስዎ ኮምፒውተ ተኝቷል።</translation> <translation id="8150722005171944719"><ph name="URL" /> ላይ ያለው ፋይል የሚነበብ አይደለም። ተወግዶ፣ ተወስዶ ወይም የፋይል ፍቃዶቹ መዳረሻ እየከለከሉ ሊሆኑ ይችላሉ።</translation> <translation id="8194797478851900357">&ውሰድን ቀልብስ</translation> @@ -632,6 +653,7 @@ <translation id="8311778656528046050">እርግጠኛ ነዎት ይህን ገጽ ዳግም መጫን ይፈልጋሉ?</translation> <translation id="8332188693563227489">የ<ph name="HOST_NAME" /> መዳረሻ ተከልክሏል</translation> <translation id="8349305172487531364">የዕልባቶች አሞሌ</translation> +<translation id="8363502534493474904">የአውሮፕላን ሁነታን ማጥፋት</translation> <translation id="8364627913115013041">አልተዋቀረም።</translation> <translation id="8412145213513410671">ብልሽቶች (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">ተመሳሳዩ የይለፍ ሐረጉን ሁለት ጊዜ ማስገባት አለብዎት።</translation> @@ -689,6 +711,7 @@ <translation id="901974403500617787">በመላው ስርዓት ላይ የሚተገበሩ ጥቆማዎች በባለቤቱ ብቻ ነው ሊዋቀሩ የሚችሉት፦ <ph name="OWNER_EMAIL" />።</translation> <translation id="9020142588544155172">አገልጋዩ ግንኙነቱን አልተቀበለውም።</translation> <translation id="9020542370529661692">ይህ ገጽ ወደ <ph name="TARGET_LANGUAGE" /> ተተርጉሟል</translation> +<translation id="9038649477754266430">ገጾችን ይበልጥ በፍጥነት ለመጫን የግመታ አገልግሎትን ይጠቀሙ</translation> <translation id="9039213469156557790">በተጨማሪ፣ ይህ ገጽ ደህንነታቸው ያልተጠበቀ ሌሎች ንብረቶችን አካትቷል። እነዚህ ንብረቶች በሽግግር ወቅት በሌሎች ሊታዩ ይችላሉ፣ እናም የገጹን ባህሪ ለመለወጥ በአጥቂዎች ሊቀየሩ ይችላሉ።</translation> <translation id="9049981332609050619"><ph name="DOMAIN" />ን ለመድረስ ሞክረው ነበር፣ ግን አገልጋዩ ልክ ያልሆነ የእውቅና ማረጋገጫ ነው ያሳየው።</translation> <translation id="9050666287014529139">የይለፍ ሐረግ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 1c0f19a..6f73878 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -15,7 +15,7 @@ <translation id="1090046120949329821">تم تلقي عدة رؤوس مختلفة لترتيب المحتوى. لا يُسمح بهذا للحماية من هجمات تقسيم ردود HTTP.</translation> <translation id="1091911885099639251">جارٍ التحقق من البطاقة</translation> -<translation id="1103523840287552314">ترجمة اللغة <ph name="LANGUAGE" /> دومًا</translation> +<translation id="1103523840287552314">ترجمة اللغة <ph name="LANGUAGE" /> دائمًا</translation> <translation id="1107591249535594099">إذا تم وضع علامة على هذا الخيار، سيخزّن Chrome نسخة من هذه البطاقة على هذا الجهاز لتعبئة النماذج بشكل أسرع.</translation> <translation id="1113869188872983271">تراجع عن إعادة الت&رتيب</translation> <translation id="111844081046043029">هل تريد بالتأكيد مغادرة هذه الصفحة؟</translation> @@ -26,6 +26,7 @@ <translation id="1150979032973867961">هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ بل إنه شهادة أمان غير موثقة من خلال نظام تشغيل الكمبيوتر. وربما يكون السبب في ذلك خطأ في التكوين أو مهاجمًا يعترض الاتصال.</translation> <translation id="1152921474424827756">الدخول إلى <ph name="BEGIN_LINK" />النسخة المخزنة مؤقتًا<ph name="END_LINK" /> من <ph name="URL" /></translation> <translation id="1158211211994409885">أغلق <ph name="HOST_NAME" /> الاتصال على نحو غير متوقع.</translation> +<translation id="1161325031994447685">إعادة الاتصال بـ Wi-Fi</translation> <translation id="1175364870820465910">ط&باعة...</translation> <translation id="1181037720776840403">إزالة</translation> <translation id="1195447618553298278">خطأ غير محدّد.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">سياسات المستخدم</translation> <translation id="1644184664548287040">تهيئة الشبكة غير صالحة ويتعذر استيرادها.</translation> <translation id="1644574205037202324">السجل</translation> +<translation id="1645368109819982629">بروتوكول غير معتمد</translation> <translation id="1655462015569774233">{1,plural, =1{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه أمس. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}zero{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ # يوم. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}two{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ يومين (#). ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}few{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ # أيام. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}many{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ # يومًا. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}other{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ # يوم. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}}</translation> <translation id="1676269943528358898">يستخدم <ph name="SITE" /> التشفير عادة لحماية معلوماتك. عندما حاول Google Chrome الاتصال بموقع <ph name="SITE" /> هذه المرة، أرجَع موقع الويب بيانات اعتماد غير عادية وغير صحيحة. وقد يحدث هذا عندما يحاول أحد المهاجمين التظاهر بأنه موقع <ph name="SITE" />، أو إذا قاطعت شاشة تسجيل دخول Wi-Fi الاتصال. ولكن لا تزال معلوماتك آمنة نظرًا لأن Google Chrome أوقَف الاتصال قبل تبادل أي بيانات.</translation> <translation id="168841957122794586">تحتوي شهادة الخادم على مفتاح تشفير ضعيف.</translation> <translation id="1706954506755087368">{1,plural, =1{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه من الغد. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}zero{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال # يوم في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}two{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال يومين (#) في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}few{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال # أيام في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}many{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال # يومًا في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}other{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال # يوم في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}}</translation> <translation id="1710259589646384581">نظام التشغيل</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">جرّب الاتصال بمشرف النظام.</translation> <translation id="17513872634828108">علامات التبويب المفتوحة</translation> <translation id="1753706481035618306">رقم الصفحة</translation> <translation id="1763864636252898013">هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ بل إنه شهادة أمان غير موثوقة من خلال نظام تشغيل جهازك. وربما يكون السبب في ذلك خطأ في التكوين أو مهاجمًا يعترض الاتصال.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">تم تعيين الخادم الوكيل على التهيئة التلقائية.</translation> <translation id="2025623846716345241">تأكيد إعادة التحميل</translation> <translation id="2030481566774242610">هل تقصد <ph name="LINK" />؟</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />التحقق من الخادم الوكيل والجدار الناري<ph name="END_LINK" /></translation> <translation id="2053553514270667976">الرمز البريدي</translation> <translation id="2065985942032347596">يجب إدخال اسم المستخدم وكلمة المرور</translation> <translation id="2079545284768500474">تراجع</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">تعذر العثور على السياسة</translation> <translation id="2213606439339815911">جارٍ جلب الإدخالات...</translation> <translation id="2214283295778284209"><ph name="SITE" /> غير متوفّر</translation> +<translation id="2227695659599072496">التحقق من كبل الشبكة أو جهاز التوجيه</translation> +<translation id="2230458221926704099">إصلاح الاتصال باستخدام <ph name="BEGIN_LINK" />تطبيق بيانات التشخيص<ph name="END_LINK" /></translation> <translation id="225207911366869382">تم تجاهل القيمة لهذه السياسة.</translation> <translation id="2262243747453050782">خطأ HTTP</translation> <translation id="2279770628980885996">تمت مواجهة حالة غير متوقعة بينما كان الخادم يحاول إتمام الطلب.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">محلل JSON اللغوي</translation> <translation id="2495093607237746763">عند وضع علامة على هذا الخيار، سيخزّن Chromium نسخة من بطاقتك على هذا الجهاز لتعبئة النماذج بشكل أسرع.</translation> <translation id="2498091847651709837">فحص بطاقة جديدة</translation> +<translation id="2515629240566999685">التحقق من الإشارة في منطقتك</translation> <translation id="2516305470678292029">بدائل عناصر واجهة المستخدم</translation> <translation id="255002559098805027">أرسل <ph name="HOST_NAME" /> استجابة غير صالحة.</translation> <translation id="2552545117464357659">أحدث</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">وضع إشارة على هذه الصفحة</translation> <translation id="3270847123878663523">تراجع عن إعادة الت&رتيب</translation> <translation id="3286538390144397061">إعادة التشغيل الآن</translation> +<translation id="3288003805934695103">إعادة تحميل الصفحة</translation> <translation id="3305707030755673451">تم تشفير بياناتك باستخدام عبارة مرور المزامنة في <ph name="TIME" />. أدخلها لبدء المزامنة.</translation> <translation id="333371639341676808">منع هذه الصفحة من إنشاء مربّعات حوار إضافية.</translation> <translation id="3340978935015468852">الإعدادات</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">تحميل...</translation> <translation id="3712624925041724820">التراخيص مستنفذة</translation> +<translation id="3714780639079136834">تشغيل بيانات شبكة الجوّال أو Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />التحقق من تهيئة الخادم الوكيل والجدار الناري ونظام أسماء النطاقات<ph name="END_LINK" /></translation> <translation id="3739623965217189342">الرابط الذي نسخته</translation> <translation id="3744899669254331632">لا يمكنك زيارة <ph name="SITE" /> في الوقت الحالي لأن الموقع أرسل اعتمادات مختلطة حيث لا يستطيع Chromium المعالجة. أخطاء الشبكة وهجماتها عادةً ما تكون مؤقتة، لذلك من المحتمل أن تعمل هذه الصفحة في وقت لاحق.</translation> <translation id="3748412725338508953">هناك عدد كبير من عمليات إعادة التوجيه.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">وضع القارئ</translation> <translation id="3973234410852337861">تم حظر <ph name="HOST_NAME" /></translation> <translation id="4021036232240155012">يُعد نظام أسماء النطاقات (DNS) هو خدمة الشبكة التي تترجم اسم موقع ويب إلى عنوانه على شبكة الإنترنت.</translation> +<translation id="4021376465026729077">تعطيل الإضافات</translation> <translation id="4030383055268325496">تراجع عن الإ&ضافة</translation> <translation id="4032534284272647190">تم رفض الدخول إلى<ph name="URL" />.</translation> <translation id="404928562651467259">تحذير</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">توقيع تحقق سيئ</translation> <translation id="4176463684765177261">معطل</translation> <translation id="4196861286325780578">إ&عادة النقل</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />التحقق من عمليات تهيئة الجدار الناري وبرامج مكافحة الفيروسات<ph name="END_LINK" /></translation> <translation id="4220128509585149162">الأعطال</translation> <translation id="4250680216510889253">لا</translation> <translation id="4258748452823770588">توقيع غير صالح</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">تم تعطيل استخدام الخادم الوكيل ولكن تم تحديد تهيئة صريحة للخادم الوكيل.</translation> <translation id="4492190037599258964">نتائج البحث عن '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">خطأ في عملية التحقق: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4506599922270137252">الاتصال بمشرف النظام</translation> <translation id="450710068430902550">المشاركة مع المشرف</translation> <translation id="4522570452068850558">التفاصيل</translation> <translation id="4535734014498033861">أخفق اتصال الخادم الوكيل.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">معلومات عن الترجمة من Google</translation> <translation id="5040262127954254034">الخصوصية</translation> <translation id="5045550434625856497">كلمة مرور غير صحيحة</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />التحقق من عنوان الخادم الوكيل<ph name="END_LINK" /></translation> <translation id="5087286274860437796">شهادة الخادم ليست صالحة حاليًا.</translation> <translation id="5089810972385038852">بلد/دولة</translation> <translation id="5094747076828555589">هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ بل إنه شهادة أمان غير موثوقة من قبل Chromium. وربما يكون السبب في ذلك خطأ في التكوين أو مهاجمًا يعترض الاتصال.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">تأكيد التصفح</translation> <translation id="5299298092464848405">خطأ في تحليل السياسة</translation> <translation id="5300589172476337783">عرض</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />محو ملفات تعريف الارتباط<ph name="END_LINK" /></translation> <translation id="5308689395849655368">ميزة الإبلاغ عن الأعطال معطلة.</translation> <translation id="5317780077021120954">حفظ</translation> <translation id="5327248766486351172">الاسم</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">إعادة تحميل</translation> <translation id="5565735124758917034">نشط</translation> <translation id="560412284261940334">الإدارة غير متوفرة</translation> +<translation id="5610142619324316209">التحقق من الاتصال</translation> <translation id="5617949217645503996">أعاد <ph name="HOST_NAME" /> توجيهك مرات كثيرة جدًا.</translation> <translation id="5629630648637658800">أخفق تحميل إعدادات السياسة</translation> <translation id="5631439013527180824">الرمز المميز لإدارة الجهاز غير صالح</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">تم التحقق من صلاحية بطاقتك</translation> <translation id="6146055958333702838">تحقق من أي كابلات وأعد تشغيل أي أجهزة توجيه أو أجهزة مودم أو أجهزة شبكة أخرى ربما تستخدمها.</translation> +<translation id="614940544461990577">جرّب:</translation> <translation id="6151417162996330722">فترة صلاحية شهادة الخادم طويلة جدًا.</translation> <translation id="6154808779448689242">لا يتطابق الرمز المميز لسياسة الإرجاع مع الرمز المميز الحالي</translation> <translation id="6165508094623778733">مزيد من المعلومات</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685">بحث <ph name="ENGINE" /></translation> <translation id="6634865548447745291">لا يمكنك زيارة <ph name="SITE" /> الآن لأنه <ph name="BEGIN_LINK" />تم إبطال هذه الشهادة<ph name="END_LINK" />. أخطاء الشبكة والهجمات عليها عادةً ما تكون مؤقتة، لذا ستعمل هذه الصفحة لاحقًا على الأرجح.</translation> <translation id="6637478299472506933">إخفاق التنزيل</translation> +<translation id="6642894344118208103">إعادة تعيين المودم أو جهاز التوجيه</translation> <translation id="6644283850729428850">تم تجاهل هذه السياسة.</translation> <translation id="6646897916597483132">أدخل رمز التحقق من البطاقة (CVC) المكون من أربعة أرقام من الجزء الأمامي من بطاقتك</translation> <translation id="6656103420185847513">تعديل مجلد</translation> <translation id="6660210980321319655">تم الإبلاغ عنه تلقائيًا <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">هل تريد إزالة اقتراح النموذج من Chromium؟</translation> +<translation id="6685834062052613830">الخروج وإكمال الإعداد</translation> <translation id="6710213216561001401">السابق</translation> <translation id="6711464428925977395">هناك خطأ ما في الخادم الوكيل، أو العنوان غير صحيح.</translation> <translation id="674375294223700098">حدث خطأ غير معروف في شهادة الخادم.</translation> @@ -515,6 +534,7 @@ <translation id="7052500709156631672">تلقت البوابة أو الخادم الوكيل استجابة غير صالحة من خادم رئيسي.</translation> <translation id="7087282848513945231">المقاطعة/الإقليم/المنطقة</translation> <translation id="7088615885725309056">أقدم</translation> +<translation id="7090678807593890770">البحث في Google عن <ph name="LINK" /></translation> <translation id="7108649287766967076">أخفقت الترجمة إلى <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">الإمارة</translation> <translation id="7179921470347911571">إعادة التشغيل الآن</translation> @@ -607,6 +627,7 @@ <translation id="8034955203865359138">لم يتم العثور على أي إدخالات في السجل.</translation> <translation id="8088680233425245692">أخفق عرض المقالة.</translation> <translation id="8091372947890762290">التنشيط قيد الانتظار في الخادم</translation> +<translation id="8134994873729925007">تعذر العثور على <ph name="BEGIN_ABBR" />عنوان نظام أسماء النطاقات<ph name="END_ABBR" /> للخادم <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">خضع جهاز الكمبيوتر إلى وضع السكون.</translation> <translation id="8150722005171944719">الملف الموجود على <ph name="URL" /> غير قابل للقراءة. ربما تمت إزالته، أو ربما تكون أذونات الملف هي التي تمنع الدخول.</translation> <translation id="8194797478851900357">تراجع عن ال&نقل</translation> @@ -634,6 +655,7 @@ <translation id="8311778656528046050">هل تريد بالتأكيد إعادة تحميل هذه الصفحة؟</translation> <translation id="8332188693563227489">تم رفض الدخول إلى <ph name="HOST_NAME" />.</translation> <translation id="8349305172487531364">شريط الإشارات</translation> +<translation id="8363502534493474904">إيقاف تشغيل وضع الطائرة</translation> <translation id="8364627913115013041">لم يتم تعيينها.</translation> <translation id="8412145213513410671">الأعطال (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">يجب إدخال عبارة المرور نفسها مرتين.</translation> @@ -691,6 +713,7 @@ <translation id="901974403500617787">لا يمكن تعيين العلامات التي تسري عبر النظام إلا من قِبل المالك: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">رفض الخادم الاتصال.</translation> <translation id="9020542370529661692">تمت ترجمة هذه الصفحة إلى <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">استخدام إحدى خدمات التوقع لتحميل الصفحات بسرعة أكبر</translation> <translation id="9039213469156557790">إضافة إلى ذلك، تتضمن هذه الصفحة موارد أخرى غير آمنة. ويستطيع الآخرون مشاهدة هذه الموارد أثناء نقلها، كما يستطيع أي مهاجم تعديلها لتغيير سلوك الصفحة.</translation> <translation id="9049981332609050619">لقد حاولت الوصول إلى <ph name="DOMAIN" />, ولكن الخادم قدّم شهادة غير صالحة.</translation> <translation id="9050666287014529139">عبارة المرور</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index cbb8072e..45aceab 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Сървърът не можа да докаже, че е <ph name="DOMAIN" />; операционната система на компютъра ви няма доверие на сертификата му за сигурност. Това може да се дължи на неправилно конфигуриране или на прихващане на връзката ви от атакуващ.</translation> <translation id="1152921474424827756">Вижте <ph name="BEGIN_LINK" />кеширано копие<ph name="END_LINK" /> на <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> неочаквано прекрати връзката.</translation> +<translation id="1161325031994447685">Свържете се отново с Wi-Fi.</translation> <translation id="1175364870820465910">&Печат...</translation> <translation id="1181037720776840403">Премахване</translation> <translation id="1195447618553298278">Неизвестна грешка.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Правила за потребителите</translation> <translation id="1644184664548287040">Конфигурацията на мрежата е невалидна и не можа да се импортира.</translation> <translation id="1644574205037202324">История</translation> +<translation id="1645368109819982629">Неподдържан протокол</translation> <translation id="1655462015569774233">{1,plural, =1{Сървърът не можа да докаже, че е <ph name="DOMAIN" />. Сертификатът му за сигурност е изтекъл вчера. Това може да се дължи на неправилно конфигуриране или на прехващане на връзката ви от извършител на атака. Понастоящем часовникът на компютъра ви показва <ph name="CURRENT_DATE" />. Това изглежда ли правилно? Ако не е, трябва да сверите системния часовник и след това да опресните страницата.}other{Сървърът не можа да докаже, че е <ph name="DOMAIN" />. Сертификатът му за сигурност е изтекъл преди # дни. Това може да се дължи на неправилно конфигуриране или на прехващане на връзката ви от извършител на атака. Понастоящем часовникът на компютъра ви показва <ph name="CURRENT_DATE" />. Това изглежда ли правилно? Ако не е, трябва да сверите системния часовник и след това да опресните страницата.}}</translation> <translation id="1676269943528358898">Обикновено <ph name="SITE" /> използва шифроване за защита на информацията ви. Когато Google Chrome опита да установи връзка с/ъс <ph name="SITE" /> този път, уебсайтът върна необичайни и неправилни идентификационни данни. Това може да се случи, когато извършител на атака пробва да се представи за <ph name="SITE" /> или връзката е прекъсната от екран за вход в Wi-Fi. Информацията ви продължава да е защитена, тъй като Chrome спря връзката, преди да бъдат обменени данни.</translation> <translation id="168841957122794586">Сертификатът на сървъра съдържа слаб криптографски ключ.</translation> <translation id="1706954506755087368">{1,plural, =1{Сървърът не можа да докаже, че е <ph name="DOMAIN" />. Сертификатът му за сигурност е от утре. Това може да се дължи на неправилно конфигуриране или на прехващане на връзката ви от извършител на атака.}other{Сървърът не можа да докаже, че е <ph name="DOMAIN" />. Сертификатът му за сигурност е от # дни в бъдещето. Това може да се дължи на неправилно конфигуриране или на прехващане на връзката ви от извършител на атака.}}</translation> <translation id="1710259589646384581">ОС</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Свържете се със системния администратор.</translation> <translation id="17513872634828108">Отворени раздели</translation> <translation id="1753706481035618306">Номер на страницата</translation> <translation id="1763864636252898013">Сървърът не можа да докаже, че е <ph name="DOMAIN" />; операционната система на устройството ви няма доверие на сертификата му за сигурност. Това може да се дължи на неправилно конфигуриране или на прихващане на връзката ви от атакуващ.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">За прокси сървъра е зададена автоматична конфигурация.</translation> <translation id="2025623846716345241">Потвърждаване на презареждането</translation> <translation id="2030481566774242610">Може би имахте предвид <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Проверете прокси сървъра и защитната стена<ph name="END_LINK" />.</translation> <translation id="2053553514270667976">Пощенски код</translation> <translation id="2065985942032347596">Изисква се удостоверяване на самоличността</translation> <translation id="2079545284768500474">Отмяна</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Правилото не е намерено</translation> <translation id="2213606439339815911">Записите се извличат...</translation> <translation id="2214283295778284209">Няма достъп до <ph name="SITE" /></translation> +<translation id="2227695659599072496">Проверете мрежовия кабел или маршрутизатора.</translation> +<translation id="2230458221926704099">Поправете връзката си посредством <ph name="BEGIN_LINK" />приложението за диагностика<ph name="END_LINK" /></translation> <translation id="225207911366869382">Стойността е оттеглена за това правило.</translation> <translation id="2262243747453050782">HTTP грешка</translation> <translation id="2279770628980885996">Възникна неочаквано състояние, докато сървърът се опитваше да изпълни заявката.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Синтактичен анализ на JSON</translation> <translation id="2495093607237746763">Ако поставите отметка, Chromium ще съхранява на това устройство копие на картата ви с цел по-бързо попълване на формуляри.</translation> <translation id="2498091847651709837">Сканиране на нова карта</translation> +<translation id="2515629240566999685">Проверете сигнала в района.</translation> <translation id="2516305470678292029">Алтернативи на потребителския интерфейс</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> изпрати невалиден отговор.</translation> <translation id="2552545117464357659">По-нова</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Запазване на отметка към тази страница</translation> <translation id="3270847123878663523">&Отмяна на пренареждането</translation> <translation id="3286538390144397061">Рестартиране сега</translation> +<translation id="3288003805934695103">Презаредете страницата.</translation> +<translation id="3305707030755673451">На <ph name="TIME" /> данните ви бяха шифровани с пропуска ви за синхронизиране. Въведете го, за да стартирате синхронизирането.</translation> <translation id="333371639341676808">Да не се показват допълнителни диалогови прозорци от тази страница.</translation> <translation id="3340978935015468852">настройки</translation> <translation id="3355823806454867987">Промяна на настройките на прокси сървъра...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> „<ph name="TITLE" />“ <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Зарежда се...</translation> <translation id="3712624925041724820">Лицензите са изчерпани</translation> +<translation id="3714780639079136834">Включете мобилните данни или Wi-Fi.</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Проверете конфигурацията на прокси сървъра, защитната стена и DNS<ph name="END_LINK" />.</translation> <translation id="3739623965217189342">Копирана от вас връзка</translation> <translation id="3744899669254331632">В момента не можете да посетите <ph name="SITE" />, защото уебсайтът изпрати кодирани идентификационни данни, които Chromium не може да обработи. Обикновено грешките в мрежата и атаките срещу нея са временни, така че тази страница вероятно ще работи по-късно.</translation> <translation id="3748412725338508953">Имаше твърде много пренасочвания.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Режим за четене</translation> <translation id="3973234410852337861">Хостът <ph name="HOST_NAME" /> е блокиран</translation> <translation id="4021036232240155012">DNS е услугата за мрежи, която преобразува имената на уебсайтовете към техните адреси в интернет.</translation> +<translation id="4021376465026729077">Деактивирайте разширенията си.</translation> <translation id="4030383055268325496">&Отмяна на добавянето</translation> <translation id="4032534284272647190">Достъпът до <ph name="URL" /> бе отказан.</translation> <translation id="404928562651467259">ПРЕДУПРЕЖДЕНИЕ</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Невалиден подпис за потвърждаване</translation> <translation id="4176463684765177261">Деактивирано</translation> <translation id="4196861286325780578">&Възстановяване на преместването</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Проверете конфигурацията на защитната стена и антивирусния софтуер<ph name="END_LINK" />.</translation> <translation id="4220128509585149162">Сривове</translation> <translation id="4250680216510889253">Не</translation> <translation id="4258748452823770588">Невалиден подпис</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Използването на прокси сървър е деактивирано, но е посочена изрична негова конфигурация.</translation> <translation id="4492190037599258964">Резултати от търсенето на „<ph name="SEARCH_STRING" />“</translation> <translation id="4506176782989081258">Грешка при потвърждаването: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Свържете се със системния администратор.</translation> <translation id="450710068430902550">Споделяне с администратор</translation> <translation id="4522570452068850558">Подробности</translation> <translation id="4535734014498033861">Връзката с прокси сървъра не бе успешна.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Всичко за Google Преводач</translation> <translation id="5040262127954254034">Поверителност</translation> <translation id="5045550434625856497">Неправилна парола</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Проверете адреса на прокси сървъра<ph name="END_LINK" />.</translation> <translation id="5087286274860437796">Понастоящем сертификатът на сървъра не е валиден.</translation> <translation id="5089810972385038852">Щат</translation> <translation id="5094747076828555589">Сървърът не можа да докаже, че е <ph name="DOMAIN" />; Chromium няма доверие на сертификата му за сигурност. Това може да се дължи на неправилно конфигуриране или на прихващане на връзката ви от атакуващ.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Потвърждение на навигацията</translation> <translation id="5299298092464848405">Грешка при синтактичния анализ на правилото</translation> <translation id="5300589172476337783">Показване</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Изчистете „бисквитките“<ph name="END_LINK" />.</translation> <translation id="5308689395849655368">Изпращането на сигнали за сривове е деактивирано.</translation> <translation id="5317780077021120954">Запазване</translation> <translation id="5327248766486351172">Име</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Повторно зареждане</translation> <translation id="5565735124758917034">Активно</translation> <translation id="560412284261940334">Управлението не се поддържа</translation> +<translation id="5610142619324316209">Проверете връзката.</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> ви пренасочи твърде много пъти.</translation> <translation id="5629630648637658800">Зареждането на настройките за правилото не бе успешно</translation> <translation id="5631439013527180824">Невалидно означение за управление на устройството</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Картата ви е потвърдена</translation> <translation id="6146055958333702838">Проверете всички кабели и рестартирайте маршрутизаторите, модемите или другите мрежови устройства, които може да използвате.</translation> +<translation id="614940544461990577">Изпробвайте следното:</translation> <translation id="6151417162996330722">Сертификатът на сървъра има твърде дълъг период на валидност.</translation> <translation id="6154808779448689242">Изведеното означение на правилото не съответства на текущото</translation> <translation id="6165508094623778733">Научете повече</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685">Търсене с/ъс <ph name="ENGINE" /></translation> <translation id="6634865548447745291">В момента не можете да посетите <ph name="SITE" />, защото <ph name="BEGIN_LINK" />този сертификат е анулиран<ph name="END_LINK" />. Обикновено грешките в мрежата и атаките срещу нея са временни, така че тази страница вероятно ще работи по-късно.</translation> <translation id="6637478299472506933">Неуспешно изтегляне</translation> +<translation id="6642894344118208103">Рестартирайте модема или маршрутизатора.</translation> <translation id="6644283850729428850">Това правило е оттеглено.</translation> <translation id="6646897916597483132">Въведете четирицифрения код за проверка от лицевата страна на картата си</translation> <translation id="6656103420185847513">Редактиране на папката</translation> <translation id="6660210980321319655">Сигналът е подаден автоматично в/ъв <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Предложението за формуляри да се премахне ли от Chromium?</translation> +<translation id="6685834062052613830">Излизане от профила и завършване на настройването</translation> <translation id="6710213216561001401">Предишна</translation> <translation id="6711464428925977395">Нещо не е наред с прокси сървъра или адресът е неправилен.</translation> <translation id="674375294223700098">Неизвестна грешка в сертификата на сървъра.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">Шлюзът или прокси сървърът получи невалиден отговор от последващ сървър.</translation> <translation id="7087282848513945231">Окръг</translation> <translation id="7088615885725309056">По-стара</translation> +<translation id="7090678807593890770">Потърсете „<ph name="LINK" />“ с Google</translation> <translation id="7108649287766967076">Преводът на <ph name="TARGET_LANGUAGE" /> не бе успешен.</translation> <translation id="7139724024395191329">Емирство</translation> <translation id="7179921470347911571">Стартиране отново сега</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Няма намерени записи в историята.</translation> <translation id="8088680233425245692">Преглеждането на статията не бе успешно.</translation> <translation id="8091372947890762290">В сървъра се изчаква активиране</translation> +<translation id="8134994873729925007">Не можа да се намери <ph name="BEGIN_ABBR" />DNS адресът<ph name="END_ABBR" /> на сървъра на <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Компютърът ви премина в спящ режим.</translation> <translation id="8150722005171944719">Файлът на адрес <ph name="URL" /> не може да бъде прочетен. Възможно е да е премахнат, преместен или разрешенията му да предотвратяват достъпа.</translation> <translation id="8194797478851900357">&Отмяна на преместването</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Наистина ли искате да презаредите тази страница?</translation> <translation id="8332188693563227489">Достъпът до <ph name="HOST_NAME" /> бе отказан</translation> <translation id="8349305172487531364">Лента на отметките</translation> +<translation id="8363502534493474904">Изключете самолетния режим.</translation> <translation id="8364627913115013041">Не е зададено.</translation> <translation id="8412145213513410671">Сривове (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Трябва да въведете един и същи пропуск два пъти.</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">Флаговете, които се прилагат за цялата система, могат да бъдат зададени само от собственика: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Сървърът отказа връзката.</translation> <translation id="9020542370529661692">Тази страница е преведена на <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Използване на услуга за предвиждане с цел по-бързо зареждане на страниците</translation> <translation id="9039213469156557790">Освен това тази страница включва други ресурси, които не са защитени. Докато се предават, те могат да бъдат видени от други хора и да бъдат модифицирани от извършител на атака, така че да се промени поведението на страницата.</translation> <translation id="9049981332609050619">Опитахте да отворите <ph name="DOMAIN" />, но сървърът предостави невалиден сертификат.</translation> <translation id="9050666287014529139">Парола</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">&Отмяна</translation> <translation id="917450738466192189">Сертификатът на сървъра е невалиден.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> използва неподдържан протокол.</translation> +<translation id="9205078245616868884">Данните ви са шифровани с пропуска ви за синхронизиране. Въведете го, за да стартирате синхронизирането.</translation> <translation id="9207861905230894330">Добавянето на статията не бе успешно.</translation> <translation id="933612690413056017">Няма връзка с интернет</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index a94c9de6..f4be370 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">এই সার্ভার প্রমাণ করতে পারেনি যে এটি <ph name="DOMAIN" />; এর নিরাপত্তা শংসাপত্রটি আপনার কম্পিউটারের নিকট বিশ্বাসযোগ্য নয়। কোনো ভুল কনফিগারেশনের কারণে অথবা কোনো আক্রমণকারী আপনার সংযোগ মাঝপথে আটকে দিচ্ছে বলে এমনটা হতে পারে।</translation> <translation id="1152921474424827756"><ph name="URL" /> এর <ph name="BEGIN_LINK" />ক্যাশে করা অনুলিপি<ph name="END_LINK" /> অ্যাক্সেস করুন</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> অপ্রত্যাশিতভাবে সংযোগ বন্ধ করেছে।</translation> +<translation id="1161325031994447685">Wi-Fi এ পুনরায় সংযুক্ত করে দেখুন</translation> <translation id="1175364870820465910">&মুদ্রণ...</translation> <translation id="1181037720776840403">সরান</translation> <translation id="1195447618553298278">অজানা ত্রুটি৷</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">ব্যবহারকারীর নীতিসমূহ</translation> <translation id="1644184664548287040">নেটওয়ার্ক কনফিগারেশনটি অবৈধ এবং আমদানি করা যায়নি৷</translation> <translation id="1644574205037202324">ইতিহাস</translation> +<translation id="1645368109819982629">অসমর্থিত প্রোটোকল</translation> <translation id="1655462015569774233">{1,plural, =1{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি গতকাল মেয়াদোত্তীর্ণ হয়েছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে। আপনার কম্পিউটারের ঘড়ি বর্তমানে <ph name="CURRENT_DATE" /> এ সেট করা আছে। এটি কি ঠিক আছে বলে মনে হচ্ছে? যদি তা না হয়, তাহলে আপনার সিস্টেম ঘড়িটি ঠিক করা উচিত হবে এবং তারপর এই পৃষ্ঠাটি রিফ্রেশ করা উচিত।}one{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি # দিন আগে মেয়াদোত্তীর্ণ হয়েছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে। আপনার কম্পিউটারের ঘড়ি বর্তমানে <ph name="CURRENT_DATE" /> এ সেট করা আছে। এটি কি ঠিক আছে বলে মনে হচ্ছে? যদি তা না হয়, তাহলে আপনার সিস্টেম ঘড়িটি ঠিক করা উচিত হবে এবং তারপর এই পৃষ্ঠাটি রিফ্রেশ করা উচিত।}other{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি # দিন আগে মেয়াদোত্তীর্ণ হয়েছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে। আপনার কম্পিউটারের ঘড়ি বর্তমানে <ph name="CURRENT_DATE" /> এ সেট করা আছে। এটি কি ঠিক আছে বলে মনে হচ্ছে? যদি তা না হয়, তাহলে আপনার সিস্টেম ঘড়িটি ঠিক করা উচিত হবে এবং তারপর এই পৃষ্ঠাটি রিফ্রেশ করা উচিত।}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> সাধারণত আপনার তথ্য সুরক্ষিত রাখতে এনক্রিপশান ব্যবহার করে। এইবার যখন Google Chrome <ph name="SITE" /> এর সাথে সংযোগ স্থাপন করার চেষ্টা করেছে, তখন ওয়েবসাইটটি অস্বাভাবিক এবং ভুল শংসাপত্র পাঠিয়েছে। হয় একজন আক্রমণকারী <ph name="SITE" /> হওয়ার ভান করছে, অথবা কোনো Wi-Fi সাইন ইন স্ক্রীণ সংযোগকে বাধা দেওয়া হয়েছে। আপনার তথ্য এখনো নিরাপদ আছে কারণ কোনো ডেটা আদানপ্রদানের আগেই Google Chrome সংযোগটিকে বন্ধ করে দিয়েছে।</translation> <translation id="168841957122794586">সার্ভার শংসাপত্রে একটি দুর্বল কপিরাইট কী আছে৷</translation> <translation id="1706954506755087368">{1,plural, =1{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি আগামীকালের বলে মনে হচ্ছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে।}one{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি আগামী # দিন পরের বলে মনে হচ্ছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে।}other{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি আগামী # দিন পরের বলে মনে হচ্ছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে।}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">সিস্টেম প্রশাসকের সাথে যোগাযোগ করে দেখুন।</translation> <translation id="17513872634828108">খোলা ট্যাব</translation> <translation id="1753706481035618306">পৃষ্ঠা সংখ্যা</translation> <translation id="1763864636252898013">এই সার্ভার প্রমাণ করতে পারেনি যে এটি <ph name="DOMAIN" />; এর নিরাপত্তা শংসাপত্রটি আপনার ডিভােইসের নিকট বিশ্বাসযোগ্য নয়। কোনো ভুল কনফিগারেশনের কারণে অথবা কোনো আক্রমণকারী আপনার সংযোগ মাঝপথে আটকে দিচ্ছে বলে এমনটা হতে পারে।</translation> @@ -95,6 +98,7 @@ <translation id="2025186561304664664">স্বতঃ কনফিগার করতে প্রক্সি সেট করা হয়৷</translation> <translation id="2025623846716345241">পুনঃলোড নিশ্চিত করুন</translation> <translation id="2030481566774242610">আপনি কি <ph name="LINK" /> বোঝাতে চেয়েছিলেন?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />প্রক্সি এবং ফায়ারওয়াল পরীক্ষা করে দেখুন<ph name="END_LINK" /></translation> <translation id="2053553514270667976">পিন কোড</translation> <translation id="2065985942032347596">প্রমাণীকরণ প্রয়োজন</translation> <translation id="2079545284768500474">পূর্বাবস্থায় ফিরুন</translation> @@ -120,6 +124,8 @@ <translation id="2212735316055980242">নীতি পাওয়া যায়নি</translation> <translation id="2213606439339815911">এন্ট্রিগুলি আনা হচ্ছে...</translation> <translation id="2214283295778284209"><ph name="SITE" /> উপলভ্য নয়</translation> +<translation id="2227695659599072496">নেটওয়ার্ক তার বা রাউটার পরীক্ষা করে দেখুন</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />ডায়াগনস্টিক অ্যাপ্লিকেশান<ph name="END_LINK" /> ব্যবহার করে আপনার সংযোগ ঠিক করুন</translation> <translation id="225207911366869382">এই মান এই নীতির জন্য অসমর্থিত হয়েছে৷</translation> <translation id="2262243747453050782">HTTP ত্রুটি</translation> <translation id="2279770628980885996">সার্ভারটি অনুরোধটি পূরণের প্রয়াস করার সময় একটি অপ্রত্যাশিত অবস্থার সম্মুখীন হয়েছিল৷</translation> @@ -147,6 +153,7 @@ <translation id="2495083838625180221">JSON বিশ্লেষক</translation> <translation id="2495093607237746763">টিক চিহ্ণ দেওয়া থাকলে, ফর্ম পূরনের কাজ দ্রুত করতে Chromium এই ডিভাইসে আপনার কার্ডের একটি প্রতিলিপি সঞ্চয় করবে।</translation> <translation id="2498091847651709837">নতুন কার্ড স্ক্যান করুন</translation> +<translation id="2515629240566999685">আপনার এলাকায় সংকেত পরীক্ষা করে দেখুন</translation> <translation id="2516305470678292029">UI বিকল্পগুলি</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> একটি অবৈধ প্রতিক্রিয়া পাঠিয়েছে।</translation> <translation id="2552545117464357659">নবীনতর</translation> @@ -222,6 +229,8 @@ <translation id="3254409185687681395">এই পৃষ্ঠাটি বুকমার্ক করুন</translation> <translation id="3270847123878663523">&পুনর্বিন্যাসকে পূর্বাবস্থায় ফেরান</translation> <translation id="3286538390144397061">এখন পুর্নসূচনা করবেন</translation> +<translation id="3288003805934695103">পৃষ্ঠাটি পুনরায় লোড করে দেখুন</translation> +<translation id="3305707030755673451">আপনার ডেটা আপনার সিঙ্ক পাসফ্রেজ দিয়ে <ph name="TIME" /> এ এনক্রিপ্ট করা হয়েছে। সিঙ্ক শুরু করার জন্য এটি লিখুন।</translation> <translation id="333371639341676808">এই পৃষ্ঠাটিকে অতিরিক্ত কথোপকথন তৈরি করা থেকে আটকান৷</translation> <translation id="3340978935015468852">সেটিংস</translation> <translation id="3355823806454867987">প্রক্সি সেটিংস পরিবর্তন করুন...</translation> @@ -264,6 +273,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">লোড হচ্ছে...</translation> <translation id="3712624925041724820">লাইসেন্সগুলির মেয়াদ শেষ হয়ে গেছে</translation> +<translation id="3714780639079136834">মোবাইল ডেটা বা Wi-Fi চালু করে দেখুন</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />প্রক্সি, ফায়ারওয়াল এবং DNS কনফিগারেশন পরীক্ষা করে দেখুন<ph name="END_LINK" /></translation> <translation id="3739623965217189342">আপনার অনুলিপি করা লিঙ্ক</translation> <translation id="3744899669254331632">এই মূহুর্তে আপনি <ph name="SITE" />-এ যেতে পারবেন না কারণ ওয়েবসাইটি মিশ্রিত প্রমাণপত্রাদি পাঠিয়েছে যা Chromium প্রক্রিয়া করতে পারেনা৷ নেটওয়ার্ক ত্রুটি এবং আক্রমণ সাধারণত অস্থায়ী, তাই এই পৃষ্ঠাটি সম্ভবত পরে কাজ করবে৷</translation> <translation id="3748412725338508953">অত্যধিক পুনঃনির্দেশ ছিল৷</translation> @@ -286,6 +297,7 @@ <translation id="3963721102035795474">পাঠক মোড</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> অবরুদ্ধ হয়ে রয়েছে</translation> <translation id="4021036232240155012">DNS সেই নেটওয়ার্ক পরিষেবা যা কোনো ওয়েবসাইটের নামকে ইন্টারনেট ঠিকানায় রুপান্তরিত করে।</translation> +<translation id="4021376465026729077">আপনার এক্সটেনশানগুলি অক্ষম করে দেখুন</translation> <translation id="4030383055268325496">&যোগ করাকে পূর্বাবস্থায় ফেরান</translation> <translation id="4032534284272647190"><ph name="URL" />তে অ্যাক্সেস অস্বীকৃত৷</translation> <translation id="404928562651467259">সতর্কতা</translation> @@ -302,6 +314,7 @@ <translation id="4171400957073367226">খারাপ যাচাইকরণের স্বাক্ষর</translation> <translation id="4176463684765177261">অক্ষম</translation> <translation id="4196861286325780578">&সরানোর কাজটি পুনরায় করুন</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ফায়ারওয়াল এবং অ্যান্টিভাইরাস কনফিগারেশন পরীক্ষা করে দেখুন<ph name="END_LINK" /></translation> <translation id="4220128509585149162">ক্র্যাশেস</translation> <translation id="4250680216510889253">না</translation> <translation id="4258748452823770588">ত্রুটিপূর্ণ স্বাক্ষর</translation> @@ -322,6 +335,7 @@ <translation id="443673843213245140">প্রক্সির ব্যবহার অক্ষম করা হয়েছে কিন্তু কোনো স্পষ্ট প্রক্সি কনফিগারেশান নির্দিষ্ট করা হয়েছে৷</translation> <translation id="4492190037599258964">'<ph name="SEARCH_STRING" />'-এর অনুসন্ধান ফলাফল</translation> <translation id="4506176782989081258">যাচাইকরণের ত্রুটি: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">সিস্টেম প্রশাসকের সাথে যোগাযোগ করে দেখুন</translation> <translation id="450710068430902550">প্রশাসকের সাথে ভাগ করছে</translation> <translation id="4522570452068850558">বিশদ বিবরণ</translation> <translation id="4535734014498033861">প্রক্সি সার্ভার যোগাযোগ ব্যর্থ৷</translation> @@ -359,6 +373,7 @@ <translation id="5031870354684148875">Google অনুবাদ সম্বন্ধে</translation> <translation id="5040262127954254034">গোপনীয়তা</translation> <translation id="5045550434625856497">ভুল পাসওয়ার্ড</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />প্রক্সি ঠিকানা পরীক্ষা করে দেখুন<ph name="END_LINK" /></translation> <translation id="5087286274860437796">সার্ভারের শংসাপত্র এই সময়ে বৈধ নয়৷</translation> <translation id="5089810972385038852">রাজ্য</translation> <translation id="5094747076828555589">এই সার্ভার প্রমাণ করতে পারেনি যে এটি <ph name="DOMAIN" />; এর নিরাপত্তা শংসাপত্রটি Chromium এর নিকট বিশ্বাসযোগ্য নয়। কোনো ভুল কনফিগারেশনের কারণে অথবা কোনো আক্রমণকারী আপনার সংযোগ মাঝপথে আটকে দিচ্ছে বলে এমনটা হতে পারে।</translation> @@ -377,6 +392,7 @@ <translation id="5295309862264981122">নেভিগেশন নিশ্চিত করুন</translation> <translation id="5299298092464848405">নীতি বিশ্লেষণ করার সময় ত্রুটি</translation> <translation id="5300589172476337783">দেখান</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />আপনার কুকিজ সাফ করে দেখুন<ph name="END_LINK" /></translation> <translation id="5308689395849655368">ক্র্যাশ প্রতিবেদন অক্ষম আছে৷</translation> <translation id="5317780077021120954">সংরক্ষণ করুন</translation> <translation id="5327248766486351172">নাম</translation> @@ -404,6 +420,7 @@ <translation id="5556459405103347317">পুনরায় লোড করুন</translation> <translation id="5565735124758917034">সক্রিয়</translation> <translation id="560412284261940334">পরিচালনা সমর্থিত নয়</translation> +<translation id="5610142619324316209">সংযোগ পরীক্ষা করে দেখুন</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> আপনাকে অনেক বেশিবার পুনঃনির্দেশিত করেছে।</translation> <translation id="5629630648637658800">নীতি সেটিংস লোড করতে ব্যর্থ হয়েছে</translation> <translation id="5631439013527180824">অবৈধ ডিভাইস পরিচালনা টোকেন</translation> @@ -435,6 +452,7 @@ <translation id="6060685159320643512">সাবধান হন, এই পরীক্ষাগুলি সমস্যা সৃষ্টি করতে পারে</translation> <translation id="6093795393556121384">আপনার কার্ডটি যাচাই করা হয়েছে</translation> <translation id="6146055958333702838">সব কেবল পরীক্ষা করুন এবং আপনি ব্যবহার করছেন এমন যেকোনো রাউটার, মডেম বা অন্যান্য নেটওয়ার্ক ডিভাইসগুলি পুনরায় চালু করুন।</translation> +<translation id="614940544461990577">এটি করে দেখুন:</translation> <translation id="6151417162996330722">সার্ভারের শংসাপত্রের বৈধতার সময়সীমা আছে যা খুবই দীর্ঘ।</translation> <translation id="6154808779448689242">ফিরে পাওয়া নীতি টোকেন বর্তমান টোকেনের সঙ্গে মেলে না</translation> <translation id="6165508094623778733">আরো জানুন</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> অনুসন্ধান</translation> <translation id="6634865548447745291">আপনি এখন <ph name="SITE" /> এ যেতে পারবেন না কারণ <ph name="BEGIN_LINK" /> এই শংসাপত্র প্রত্যাহার করা হয়েছে<ph name="END_LINK" />। নেটওয়ার্ক ত্রুটি এবং আক্রমণ সাধারণত সাময়িকভাবে হয়, তাই এই পৃষ্ঠা সম্ভবত পরে কাজ করবে।</translation> <translation id="6637478299472506933">ডাউনলোড ব্যর্থ হয়েছে</translation> +<translation id="6642894344118208103">মডেম বা রাউটার পুনরায় সেট করে দেখুন</translation> <translation id="6644283850729428850">এই নীতিটি অসমর্থিত হয়েছে৷</translation> <translation id="6646897916597483132">আপনার কার্ডের সামনে থেকে ৪ সংখ্যার CVC লিখুন</translation> <translation id="6656103420185847513">ফোল্ডার সম্পাদনা করুন</translation> <translation id="6660210980321319655">স্বয়ংক্রিয়ভাবে প্রতিবেদন করা হয়েছে <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Chromium থেকে ফর্ম প্রস্তাবনা সরাবেন?</translation> +<translation id="6685834062052613830">সাইন আউট করে সেটআপ সম্পূর্ণ করুন</translation> <translation id="6710213216561001401">পূর্ববর্তী</translation> <translation id="6711464428925977395">প্রক্সী সার্ভারের কোনো সমস্যা হয়েছে, অথবা ঠিকানাটি ভুল।</translation> <translation id="674375294223700098">অজানা সার্ভার শংসাপত্র ত্রুটি৷</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">গেটওয়ে বা প্রক্সি সার্ভারটি একটি আপস্ট্রিম সার্ভার থেকে একটি অবৈধ প্রতিক্রিয়া পেয়েছে৷</translation> <translation id="7087282848513945231">দেশ</translation> <translation id="7088615885725309056">পূর্বতর</translation> +<translation id="7090678807593890770">Google এ <ph name="LINK" /> এর অনুসন্ধান করুন</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" /> এ অনুবাদ ব্যর্থ হয়েছে৷</translation> <translation id="7139724024395191329">এমিরেট</translation> <translation id="7179921470347911571">এখনই পুনঃলঞ্চ করুন</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">কোনো ইতিহাস এন্টি পাওয়া যায়নি৷</translation> <translation id="8088680233425245692">নিবন্ধ দেখতে ব্যর্থ হয়েছে৷</translation> <translation id="8091372947890762290">সার্ভারে সক্রিয়করণ বাকি আছে</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> এর সার্ভার <ph name="BEGIN_ABBR" />DNS ঠিকানা<ph name="END_ABBR" />খুঁজে পাওয়া যায়নি।</translation> <translation id="8149426793427495338">আপনার কম্পিউটারটি নিদ্রা মোডে গিয়েছে।</translation> <translation id="8150722005171944719"><ph name="URL" />এ ফাইলটি পাঠযোগ্য নয়৷ এটা মুছে ফেলা হয়েছে পারে, সরিয়ে দেওয়া হয়েছে, অথবা ফাইল অনুমতি প্রবেশাধিকার প্রতিরোধ করতে পারে৷</translation> <translation id="8194797478851900357">&সরানোকে পূর্বাবস্থায় ফেরান</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">আপনি কি এই পৃষ্ঠাটি পুনঃলোড করার ব্যাপারে নিশ্চিত?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> এ অ্যাক্সেস অস্বীকার করা হয়েছে</translation> <translation id="8349305172487531364">বুকমার্কস দণ্ড</translation> +<translation id="8363502534493474904">বিমান মোড বন্ধ করে দেখুন</translation> <translation id="8364627913115013041">সেট করা নেই৷</translation> <translation id="8412145213513410671">ক্র্যাশ (<ph name="CRASH_COUNT" />টি)</translation> <translation id="8412392972487953978">আপনাকে একই পাসফ্রেজ অবশ্যই দু'বার প্রবেশ করাতে হবে৷</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">যে ফ্ল্যাগগুলি সমস্ত সিস্টেম জুড়ে প্রয়োগ করা হয় সেগুলি শুধুমাত্র মালিকের দ্বারা সেট করা যেতে পারে: <ph name="OWNER_EMAIL" />৷</translation> <translation id="9020142588544155172">সার্ভার সংযোগ প্রত্যাখ্যান করেছে৷</translation> <translation id="9020542370529661692">এই পৃষ্ঠাটি <ph name="TARGET_LANGUAGE" /> এ অনুবাদ করা হয়েছে</translation> +<translation id="9038649477754266430">পৃষ্ঠা আরো দ্রুত লোড করার জন্য কোনো পূর্বাভাষ পরিষেবা ব্যবহার করুন</translation> <translation id="9039213469156557790">উপরন্তু, এই পৃষ্ঠাতে অন্যান্য সংস্থান অন্তর্ভুক্ত রয়েছে যা নিরাপদ নয়৷ এই সংস্থানগুলি ট্রানজিটের সময় অন্যরা দেখতে পাবে এবং পৃষ্ঠাটির আচরণ পরিবর্তন করার জন্য কোনো আক্রমণকারী এর পরিবর্তন করতে পারেন৷</translation> <translation id="9049981332609050619">আপনি <ph name="DOMAIN" />-এ পৌছানোর প্রয়াস করছেন, কিন্তু সার্ভার একটি অবৈধ শংসাপত্র উপস্থাপন করেছে|</translation> <translation id="9050666287014529139">পাসফ্রেজ</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">&পূর্বাবস্থায় ফিরুন</translation> <translation id="917450738466192189">সার্ভারের শংসাপত্র অকার্যকর৷</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> একটি অসমর্থিত প্রোটোকল ব্যবহার করে।</translation> +<translation id="9205078245616868884">আপনার ডেটা আপনার সিঙ্ক পাসফ্রেজ দিয়ে এনক্রিপ্ট করা হয়েছে। সিঙ্ক শুরু করার জন্য এটি লিখুন।</translation> <translation id="9207861905230894330">নিবন্ধ যোগ করতে ব্যর্থ হয়েছে৷</translation> <translation id="933612690413056017">কোনো ইন্টারনেট সংযোগ নেই</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 5b9d453c..94a157d 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -23,6 +23,7 @@ <translation id="1150979032973867961">Aquest servidor no ha pogut comprovar que sigui <ph name="DOMAIN" /> perquè el sistema operatiu del vostre ordinador considera que el seu certificat de seguretat no és de confiança. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.</translation> <translation id="1152921474424827756">Accediu a una <ph name="BEGIN_LINK" />còpia emmagatzemada a la memòria cau<ph name="END_LINK" /> de la pàgina <ph name="URL" />.</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ha tancat la connexió de manera inesperada.</translation> +<translation id="1161325031994447685">Torneu-vos a connectar a la xarxa Wi-Fi</translation> <translation id="1175364870820465910">&Imprimeix...</translation> <translation id="1181037720776840403">Suprimeix</translation> <translation id="1195447618553298278">Error desconegut.</translation> @@ -64,12 +65,14 @@ <translation id="1640180200866533862">Polítiques d'usuari</translation> <translation id="1644184664548287040">La configuració de la xarxa no és vàlida i no s'ha pogut importar.</translation> <translation id="1644574205037202324">Historial</translation> +<translation id="1645368109819982629">Protocol no admès</translation> <translation id="1655462015569774233">{1,plural, =1{Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" /> perquè el seu certificat de seguretat va caducar ahir. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió. Actualment, el rellotge del vostre ordinador està configurat amb la data <ph name="CURRENT_DATE" />. És correcta? Si no ho és, corregiu el rellotge del sistema i, a continuació, actualitzeu aquesta pàgina.}other{Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" /> perquè el seu certificat va caducar fa # dies. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió. Actualment, el rellotge del vostre ordinador està configurat amb la data <ph name="CURRENT_DATE" />. És correcta? Si no ho és, corregiu el rellotge del sistema i, a continuació, actualitzeu aquesta pàgina.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> utilitza normalment l'encriptació per protegir la vostra informació. En aquesta ocasió, quan Google Chrome ha provat de connectar-se a <ph name="SITE" />, el lloc web ha enviat credencials poc comunes i incorrectes. Pot ser que un atacant estigui provant de fer-se passar per <ph name="SITE" /> o que una pantalla d'inici de sessió a la xarxa Wi-Fi hagi interromput la connexió. En qualsevol cas, la vostra informació continua estant segura, perquè Google Chrome ha aturat la connexió abans no s'intercanviés cap dada.</translation> <translation id="168841957122794586">El certificat de servidor conté una clau criptogràfica dèbil.</translation> <translation id="1706954506755087368">{1,plural, =1{Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" /> perquè, suposadament, el seu certificat de seguretat té la data de demà. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.}other{Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" />; perquè, suposadament, el seu certificat de seguretat té una data que és d'aquí a # dies. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.}}</translation> <translation id="1710259589646384581">SO</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Proveu de contactar amb l'administrador del sistema.</translation> <translation id="17513872634828108">Pestanyes obertes</translation> <translation id="1753706481035618306">Número de pàgina</translation> <translation id="1763864636252898013">Aquest servidor no ha pogut comprovar que sigui <ph name="DOMAIN" /> perquè el sistema operatiu del vostre dispositiu considera que el seu certificat de seguretat no és de confiança. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.</translation> @@ -91,6 +94,7 @@ <translation id="2025186561304664664">El servidor intermediari està definit perquè es configuri automàticament.</translation> <translation id="2025623846716345241">Confirmació de la càrrega nova</translation> <translation id="2030481566774242610">Volíeu dir <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Comproveu el servidor intermediari i el tallafoc<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Codi postal</translation> <translation id="2065985942032347596">Es necessita autenticació</translation> <translation id="2079545284768500474">Desfés</translation> @@ -116,6 +120,8 @@ <translation id="2212735316055980242">No es troba la política</translation> <translation id="2213606439339815911">S'estan recuperant les entrades...</translation> <translation id="2214283295778284209"><ph name="SITE" /> no està disponible</translation> +<translation id="2227695659599072496">Comproveu el cable de xarxa o l'encaminador</translation> +<translation id="2230458221926704099">Repareu la connexió amb l'<ph name="BEGIN_LINK" />aplicació de diagnòstic<ph name="END_LINK" /></translation> <translation id="225207911366869382">El valor d'aquesta política és obsolet.</translation> <translation id="2262243747453050782">Error d'HTTP</translation> <translation id="2279770628980885996">S'ha detectat una situació inesperada mentre el servidor provava de completar la sol·licitud.</translation> @@ -143,6 +149,7 @@ <translation id="2495083838625180221">Analitzador JSON</translation> <translation id="2495093607237746763">Si s'activa aquesta casella, Chromium desa una còpia de la vostra targeta al dispositiu per agilitzar l'emplenament de formularis.</translation> <translation id="2498091847651709837">Escaneja una targeta nova</translation> +<translation id="2515629240566999685">Comproveu el senyal a la vostra zona</translation> <translation id="2516305470678292029">Alternatives a la IU</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> ha enviat una resposta que no és vàlida.</translation> <translation id="2552545117464357659">Més nova</translation> @@ -218,6 +225,8 @@ <translation id="3254409185687681395">Afegeix aquesta pàgina a les adreces d'interès</translation> <translation id="3270847123878663523">&Desfés el canvi d'ordre</translation> <translation id="3286538390144397061">Reinicia ara</translation> +<translation id="3288003805934695103">Torneu a carregar la pàgina</translation> +<translation id="3305707030755673451">Les vostres dades es van encriptar el dia <ph name="TIME" /> amb la vostra frase de contrasenya de sincronització. Introduïu-la per començar la sincronització.</translation> <translation id="333371639341676808">Evita que aquesta pàgina creï diàlegs addicionals.</translation> <translation id="3340978935015468852">configuració</translation> <translation id="3355823806454867987">Canvia la configuració del servidor intermediari...</translation> @@ -260,6 +269,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">S'està carregant...</translation> <translation id="3712624925041724820">Llicències exhaurides</translation> +<translation id="3714780639079136834">Activeu les dades mòbils o la Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Comproveu el servidor intermediari, el tallafoc i la configuració de DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Enllaç que heu copiat</translation> <translation id="3744899669254331632">En aquest moments no podeu visitar la pàgina <ph name="SITE" /> perquè el lloc web ha enviat credencials aleatòries que Chromium no pot processar. Els atacs i els errors de xarxa acostumen a ser temporals, o sigui que probablement la pàgina funcionarà més endavant.</translation> <translation id="3748412725338508953">Hi havia massa redireccionaments.</translation> @@ -282,6 +293,7 @@ <translation id="3963721102035795474">Mode de lector</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> està bloquejat</translation> <translation id="4021036232240155012">DNS és el servei de xarxa que tradueix el nom d'un lloc web en l'adreça d'Internet corresponent.</translation> +<translation id="4021376465026729077">Desactiveu les extensions</translation> <translation id="4030383055268325496">&Desfés l'addició</translation> <translation id="4032534284272647190">S'ha denegat l'accés a <ph name="URL" />.</translation> <translation id="404928562651467259">ADVERTIMENT</translation> @@ -298,6 +310,7 @@ <translation id="4171400957073367226">La signatura de verificació és incorrecta</translation> <translation id="4176463684765177261">Desactivat</translation> <translation id="4196861286325780578">&Refés el moviment</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Comproveu la configuració del tallafoc i de l'antivirus<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Errors</translation> <translation id="4250680216510889253">No</translation> <translation id="4258748452823770588">Signatura errònia</translation> @@ -318,6 +331,7 @@ <translation id="443673843213245140">L'ús d'un servidor intermediari no està activat, però s'ha especificat una configuració explícita d'un servidor intermediari.</translation> <translation id="4492190037599258964">Resultats de la cerca per a "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Error de validació: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Contacteu amb l'administrador del sistema</translation> <translation id="450710068430902550">Comparteix informació amb l'administrador</translation> <translation id="4522570452068850558">Detalls</translation> <translation id="4535734014498033861">S'ha produït un error en connectar amb el servidor intermediari.</translation> @@ -355,6 +369,7 @@ <translation id="5031870354684148875">Sobre el Traductor de Google</translation> <translation id="5040262127954254034">Privadesa</translation> <translation id="5045550434625856497">Contrasenya incorrecta</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Comproveu l'adreça del servidor intermediari<ph name="END_LINK" /></translation> <translation id="5087286274860437796">En aquest moment el certificat del servidor no és vàlid.</translation> <translation id="5089810972385038852">Estat</translation> <translation id="5094747076828555589">Aquest servidor no ha pogut comprovar que sigui <ph name="DOMAIN" /> perquè Chromium considera que el seu certificat de seguretat no és de confiança. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.</translation> @@ -373,6 +388,7 @@ <translation id="5295309862264981122">Confirma la navegació</translation> <translation id="5299298092464848405">S'ha produït un error en analitzar la política</translation> <translation id="5300589172476337783">Mostra</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Esborreu les galetes<ph name="END_LINK" /></translation> <translation id="5308689395849655368">La creació d'informes de bloqueig està desactivada.</translation> <translation id="5317780077021120954">Desa</translation> <translation id="5327248766486351172">Nom</translation> @@ -400,6 +416,7 @@ <translation id="5556459405103347317">Torna a carregar</translation> <translation id="5565735124758917034">Actiu</translation> <translation id="560412284261940334">Gestió no compatible</translation> +<translation id="5610142619324316209">Comproveu la connexió</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> us ha redirigit massa vegades.</translation> <translation id="5629630648637658800">No s'ha pogut carregar la configuració de la política</translation> <translation id="5631439013527180824">Testimoni de gestió del dispositiu no vàlid</translation> @@ -432,6 +449,7 @@ <translation id="6093795393556121384">La targeta s'ha verificat</translation> <translation id="6146055958333702838">Reviseu els cables i reinicieu els encaminadors, els mòdems o altres dispositius de xarxa que feu servir.</translation> +<translation id="614940544461990577">Proveu aquestes solucions:</translation> <translation id="6151417162996330722">El període de validesa del certificat del servidor és massa gran.</translation> <translation id="6154808779448689242">El testimoni de la política que s'ha retornat no coincideix amb el testimoni actual</translation> <translation id="6165508094623778733">Més informació</translation> @@ -473,11 +491,13 @@ <translation id="6628463337424475685">Cerca de <ph name="ENGINE" /></translation> <translation id="6634865548447745291">En aquest moment no podeu visitar <ph name="SITE" /> perquè <ph name="BEGIN_LINK" />aquest certificat s'ha revocat<ph name="END_LINK" />. Els errors de la xarxa i els atacs solen ser temporals, de manera que és probable que aquesta pàgina torni a funcionar més tard.</translation> <translation id="6637478299472506933">Ha fallat la baixada</translation> +<translation id="6642894344118208103">Restabliu el mòdem o l'encaminador</translation> <translation id="6644283850729428850">Aquesta política ha quedat obsoleta.</translation> <translation id="6646897916597483132">Introduïu el CVC de quatre dígits que trobareu a la part davantera de la targeta</translation> <translation id="6656103420185847513">Edició de la carpeta</translation> <translation id="6660210980321319655">Data i hora del bloqueig notificat automàticament: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Voleu suprimir el suggeriment de formulari de Chromium?</translation> +<translation id="6685834062052613830">Tanqueu la sessió i completeu la configuració</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6711464428925977395">Hi ha hagut algun problema amb el servidor intermediari o l'adreça no és correcta.</translation> <translation id="674375294223700098">Error de certificat del servidor desconegut.</translation> @@ -512,6 +532,7 @@ <translation id="7052500709156631672">La passarel·la o el servidor intermediari ha rebut una resposta no vàlida d'un servidor superior.</translation> <translation id="7087282848513945231">Comptat</translation> <translation id="7088615885725309056">Més antic</translation> +<translation id="7090678807593890770">Cerqueu <ph name="LINK" /> a Google</translation> <translation id="7108649287766967076">La traducció a <ph name="TARGET_LANGUAGE" /> ha fallat.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Torna'l a iniciar ara</translation> @@ -604,6 +625,7 @@ <translation id="8034955203865359138">No s'ha trobat cap entrada a l'historial.</translation> <translation id="8088680233425245692">No s'ha pogut consultar l'article.</translation> <translation id="8091372947890762290">L'activació està pendent al servidor</translation> +<translation id="8134994873729925007">No s'ha trobat l'<ph name="BEGIN_ABBR" />adreça DNS<ph name="END_ABBR" /> del servidor de <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">L'ordinador ha entrat en mode de repòs.</translation> <translation id="8150722005171944719">El fitxer de <ph name="URL" /> no es pot llegir. Pot ser que s'hagi eliminat, que s'hagi traslladat o que els permisos del fitxer n'impedeixin l'accés.</translation> <translation id="8194797478851900357">&Desfés el moviment</translation> @@ -631,6 +653,7 @@ <translation id="8311778656528046050">Esteu segur que voleu tornar a carregar aquesta pàgina?</translation> <translation id="8332188693563227489">S'ha rebutjat l'accés a <ph name="HOST_NAME" /></translation> <translation id="8349305172487531364">Barra d'adreces d'interès</translation> +<translation id="8363502534493474904">Desactiveu el mode d'avió</translation> <translation id="8364627913115013041">No s'ha definit.</translation> <translation id="8412145213513410671">Bloqueigs (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Heu d'introduir la mateixa frase de contrasenya dues vegades.</translation> @@ -688,6 +711,7 @@ <translation id="901974403500617787">Les marques que s'apliquen a tot el sistema només les pot definir l'usuari: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">El servidor ha rebutjat la connexió.</translation> <translation id="9020542370529661692">Aquesta pàgina s'ha traduït a <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Utilitzeu un servei de predicció per poder carregar les pàgines més ràpidament</translation> <translation id="9039213469156557790">A més, aquesta pàgina conté altres recursos que no són segurs. La resta d'usuaris poden visualitzar-los mentre estan en trànsit, i algun atacant podria modificar-los per canviar el comportament de la pàgina.</translation> <translation id="9049981332609050619">Heu provat d'accedir a <ph name="DOMAIN" />, però el servidor ha presentat un certificat no vàlid.</translation> <translation id="9050666287014529139">Frase de contrasenya</translation> @@ -701,6 +725,7 @@ <translation id="9170848237812810038">&Desfés</translation> <translation id="917450738466192189">El certificat del servidor no és vàlid.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> fa servir un protocol no admès.</translation> +<translation id="9205078245616868884">Les vostres dades estan encriptades amb la vostra frase de contrasenya de sincronització. Introduïu-la per començar la sincronització.</translation> <translation id="9207861905230894330">No s'ha pogut afegir l'article.</translation> <translation id="933612690413056017">No hi ha connexió a Internet</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 2d3d447..2061137 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -23,6 +23,7 @@ <translation id="1150979032973867961">Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Operační systém vašeho počítače nedůvěřuje jeho bezpečnostnímu certifikátu.Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.</translation> <translation id="1152921474424827756">Otevřete <ph name="BEGIN_LINK" />archivovanou kopii<ph name="END_LINK" /> stránky <ph name="URL" /></translation> <translation id="1158211211994409885">Web <ph name="HOST_NAME" /> neočekávaně ukončil připojení.</translation> +<translation id="1161325031994447685">Obnovit připojení k síti Wi-Fi</translation> <translation id="1175364870820465910">Tisk...</translation> <translation id="1181037720776840403">Odebrat</translation> <translation id="1195447618553298278">Neznámá chyba.</translation> @@ -64,12 +65,14 @@ <translation id="1640180200866533862">Zásady pro uživatele</translation> <translation id="1644184664548287040">Konfigurace sítě je neplatná a nelze ji importovat.</translation> <translation id="1644574205037202324">Historie</translation> +<translation id="1645368109819982629">Nepodporovaný protokol</translation> <translation id="1655462015569774233">{1,plural, =1{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Platnost jeho bezpečnostního certifikátu včera vypršela. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník. Hodiny ve vašem počítači jsou aktuálně nastaveny na <ph name="CURRENT_DATE" />. Je to správně? Pokud ne, měli byste nastavit správné hodiny systému a poté tuto stránku načíst znovu.}few{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Platnost jeho bezpečnostního certifikátu vypršela před # dny. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník. Hodiny ve vašem počítači jsou aktuálně nastaveny na <ph name="CURRENT_DATE" />. Je to správně? Pokud ne, měli byste čas v počítači opravit a poté tuto stránku načíst znovu.}many{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Platnost jeho bezpečnostního certifikátu vypršela před # dnem. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník. Hodiny ve vašem počítači jsou aktuálně nastaveny na <ph name="CURRENT_DATE" />. Je to správně? Pokud ne, měli byste nastavit správné hodiny systému a poté tuto stránku načíst znovu.}other{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Platnost jeho bezpečnostního certifikátu vypršela před # dny. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník. Hodiny ve vašem počítači jsou aktuálně nastaveny na <ph name="CURRENT_DATE" />. Je to správně? Pokud ne, měli byste nastavit správné hodiny systému a poté tuto stránku načíst znovu.}}</translation> <translation id="1676269943528358898">Web <ph name="SITE" /> vaše informace běžně chrání šifrováním. Když se prohlížeč Chrome k webu <ph name="SITE" /> pokusil připojit tentokrát, web vrátil neobvyklé a nesprávné identifikační údaje. K tomuto problému může dojít, pokud se za web <ph name="SITE" /> pokouší vydávat nějaký útočník nebo pokud bylo připojení přerušeno přihlašovací obrazovkou sítě Wi-Fi. Vaše informace jsou i nadále v bezpečí, protože prohlížeč Google Chrome připojení přerušil dříve, než došlo k odeslání jakýchkoliv dat.</translation> <translation id="168841957122794586">Certifikát serveru obsahuje slabý kryptografický klíč.</translation> <translation id="1706954506755087368">{1,plural, =1{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Uvedené datum vystavení jeho bezpečnostního certifikátu je zítra. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.}few{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Uvedené datum vystavení jeho bezpečnostního certifikátu je až za # dny. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.}many{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Uvedené datum vystavení jeho bezpečnostního certifikátu je až za # dne. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.}other{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Uvedené datum vystavení jeho bezpečnostního certifikátu je až za # dní. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.}}</translation> <translation id="1710259589646384581">Operační systém</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Zkuste kontaktovat administrátora systému.</translation> <translation id="17513872634828108">Otevřené karty</translation> <translation id="1753706481035618306">Číslo stránky</translation> <translation id="1763864636252898013">Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Operační systém vašeho zařízení nedůvěřuje jeho bezpečnostnímu certifikátu. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.</translation> @@ -91,6 +94,7 @@ <translation id="2025186561304664664">Proxy server je nastaven na automatickou konfiguraci.</translation> <translation id="2025623846716345241">Potvrdit opětovné načtení</translation> <translation id="2030481566774242610">Měli jste na mysli <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Zkontrolovat proxy server a firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">PSČ</translation> <translation id="2065985942032347596">Vyžaduje se ověření</translation> <translation id="2079545284768500474">Zpět</translation> @@ -113,6 +117,8 @@ <translation id="2212735316055980242">Zásada nebyla nalezena</translation> <translation id="2213606439339815911">Načítání záznamů...</translation> <translation id="2214283295778284209"><ph name="SITE" /> není dostupná</translation> +<translation id="2227695659599072496">Zkontrolovat síťový kabel nebo směrovač</translation> +<translation id="2230458221926704099">Opravte připojení pomocí <ph name="BEGIN_LINK" />diagnostické aplikace<ph name="END_LINK" /></translation> <translation id="225207911366869382">Tato hodnota již pro tuto zásadu není podporována.</translation> <translation id="2262243747453050782">Chyba protokolu HTTP</translation> <translation id="2279770628980885996">Při pokusu o splnění požadavku došlo na serveru k neočekávané situaci.</translation> @@ -140,6 +146,7 @@ <translation id="2495083838625180221">Analyzátor souborů JSON</translation> <translation id="2495093607237746763">Pokud je tato možnost zaškrtnuta, prohlížeč Chromium do zařízení uloží kopii karty za účelem rychlejšího vyplňování formulářů.</translation> <translation id="2498091847651709837">Naskenovat novou kartu</translation> +<translation id="2515629240566999685">Zkontrolovat, zda máte dostatečně silný signál</translation> <translation id="2516305470678292029">Alternativy uživatelského rozhraní</translation> <translation id="255002559098805027">Web <ph name="HOST_NAME" /> vrátil neplatnou odpověď.</translation> <translation id="2552545117464357659">Novější</translation> @@ -208,6 +215,8 @@ <translation id="3254409185687681395">Přidat stránku do záložek</translation> <translation id="3270847123878663523">&Vrátit změnu uspořádání zpět</translation> <translation id="3286538390144397061">Restartovat</translation> +<translation id="3288003805934695103">Načíst stránku znovu</translation> +<translation id="3305707030755673451">Vaše data byla <ph name="TIME" /> zašifrována pomocí heslové fráze pro synchronizaci. Chcete-li zahájit synchronizaci, zadejte ji.</translation> <translation id="333371639341676808">Bránit této stránce ve vytváření dalších dialogových oken.</translation> <translation id="3340978935015468852">nastavení</translation> <translation id="3355823806454867987">Změna nastavení proxy...</translation> @@ -250,6 +259,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Načítání...</translation> <translation id="3712624925041724820">Byly vyčerpány licence</translation> +<translation id="3714780639079136834">Zapnout mobilní datové připojení nebo Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Zkontrolovat proxy server, firewall a konfiguraci DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Zkopírovaný odkaz</translation> <translation id="3744899669254331632">Web <ph name="SITE" /> nyní nelze navštívit, protože tento web odeslal nesprávné identifikační údaje, které prohlížeč Chromium nedokáže zpracovat. Síťové chyby a útoky jsou obvykle dočasné, tato stránka pravděpodobně později bude fungovat.</translation> <translation id="3748412725338508953">Proběhlo příliš mnoho přesměrování.</translation> @@ -271,6 +282,7 @@ <translation id="3963721102035795474">Režim čtečky</translation> <translation id="3973234410852337861">Web <ph name="HOST_NAME" /> je blokován</translation> <translation id="4021036232240155012">DNS je síťová služba, která překládá názvy webů na internetové adresy.</translation> +<translation id="4021376465026729077">Zakázat rozšíření</translation> <translation id="4030383055268325496">&Vrátit přidání zpět</translation> <translation id="4032534284272647190">Přístup na adresu <ph name="URL" /> odepřen.</translation> <translation id="404928562651467259">UPOZORNĚNÍ</translation> @@ -287,6 +299,7 @@ <translation id="4171400957073367226">Chybný ověřovací podpis</translation> <translation id="4176463684765177261">Deaktivováno</translation> <translation id="4196861286325780578">&Opakovat přesunutí</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Zkontrolovat konfiguraci firewallu a antivirového softwaru<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Selhání</translation> <translation id="4250680216510889253">Ne</translation> <translation id="4258748452823770588">Chybný podpis</translation> @@ -307,6 +320,7 @@ <translation id="443673843213245140">Využití proxy serveru je zakázáno, je však určena explicitní konfigurace proxy serveru.</translation> <translation id="4492190037599258964">Výsledky vyhledávání pro výraz „<ph name="SEARCH_STRING" />“</translation> <translation id="4506176782989081258">Chyba ověřování: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4506599922270137252">Kontaktovat administrátora systému</translation> <translation id="450710068430902550">Sdílení s administrátorem</translation> <translation id="4522570452068850558">Podrobnosti</translation> <translation id="4535734014498033861">Připojení k proxy serveru se nezdařilo.</translation> @@ -344,6 +358,7 @@ <translation id="5031870354684148875">O Překladači Google</translation> <translation id="5040262127954254034">Ochrana soukromí</translation> <translation id="5045550434625856497">Nesprávné heslo</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Zkontrolovat adresu proxy serveru<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Certifikát serveru v tuto chvíli není platný.</translation> <translation id="5089810972385038852">Stát/kraj</translation> <translation id="5094747076828555589">Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Chromium jeho bezpečnostnímu certifikátu nedůvěřuje. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.</translation> @@ -362,6 +377,7 @@ <translation id="5295309862264981122">Potvrdit navigaci</translation> <translation id="5299298092464848405">Při analýze zásady došlo k chybě</translation> <translation id="5300589172476337783">Zobrazit</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Vymazat soubory cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Zprávy o selhání jsou zakázány.</translation> <translation id="5317780077021120954">Uložit</translation> <translation id="5327248766486351172">Název</translation> @@ -389,6 +405,7 @@ <translation id="5556459405103347317">Načíst znovu</translation> <translation id="5565735124758917034">Aktivní</translation> <translation id="560412284261940334">Správa není podporována</translation> +<translation id="5610142619324316209">Zkontrolovat připojení</translation> <translation id="5617949217645503996">Web <ph name="HOST_NAME" /> vás přesměroval příliš mnohokrát.</translation> <translation id="5629630648637658800">Načítání nastavení zásady se nezdařilo</translation> <translation id="5631439013527180824">Neplatný token správy zařízení</translation> @@ -420,6 +437,7 @@ <translation id="6060685159320643512">Pozor, tyto experimenty mohou skončit všelijak.</translation> <translation id="6093795393556121384">Vaše karta je ověřena</translation> <translation id="6146055958333702838">Zkontrolujte všechny kabely a restartujte všechny směrovače, modemy a další síťová zařízení, která používáte.</translation> +<translation id="614940544461990577">Zkuste:</translation> <translation id="6151417162996330722">Certifikát serveru má příliš dlouhé období platnosti.</translation> <translation id="6154808779448689242">Vrácený token zásad neodpovídá aktuálnímu tokenu</translation> <translation id="6165508094623778733">Další informace</translation> @@ -460,11 +478,13 @@ <translation id="6628463337424475685">Vyhledávání <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Web <ph name="SITE" /> nyní nemůžete navštívit, protože <ph name="BEGIN_LINK" />tento certifikát byl zrušen<ph name="END_LINK" />. Síťové chyby a útoky jsou obvykle dočasné, tato stránka pravděpodobně později bude fungovat.</translation> <translation id="6637478299472506933">Stažení se nezdařilo</translation> +<translation id="6642894344118208103">Resetovat modem nebo směrovač</translation> <translation id="6644283850729428850">Tato zásada se již nepoužívá.</translation> <translation id="6646897916597483132">Zadejte čtyřmístný kód CVC z přední strany karty</translation> <translation id="6656103420185847513">Úprava složky</translation> <translation id="6660210980321319655">Automaticky zaznamenáno <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Odstranit návrh položky formuláře z prohlížeče Chromium?</translation> +<translation id="6685834062052613830">Odhlaste se a dokončete nastavení</translation> <translation id="6710213216561001401">Předchozí</translation> <translation id="6711464428925977395">Došlo k chybě proxy serveru nebo jste zadali nesprávnou adresu.</translation> <translation id="674375294223700098">Neznámá chyba certifikátu serveru.</translation> @@ -494,6 +514,7 @@ <translation id="7052500709156631672">Brána nebo proxy server obdržely neplatnou odpověď od nadřazeného serveru.</translation> <translation id="7087282848513945231">Obvod</translation> <translation id="7088615885725309056">Starší</translation> +<translation id="7090678807593890770">Vyhledejte na Googlu <ph name="LINK" /></translation> <translation id="7108649287766967076">Překlad do jazyka <ph name="TARGET_LANGUAGE" /> se nezdařil.</translation> <translation id="7139724024395191329">Emirát</translation> <translation id="7179921470347911571">Spustit znovu</translation> @@ -584,6 +605,7 @@ <translation id="8034955203865359138">Nebyly nalezeny žádné historické záznamy.</translation> <translation id="8088680233425245692">Zobrazení článku se nezdařilo.</translation> <translation id="8091372947890762290">Čeká se na aktivaci na serveru</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />Adresa DNS<ph name="END_ABBR" /> serveru <ph name="HOST_NAME" /> nebyla nalezena.</translation> <translation id="8149426793427495338">Počítač přešel do režimu spánku.</translation> <translation id="8150722005171944719">Soubor na adrese <ph name="URL" /> nelze načíst. Možná byl odstraněn, přesunut nebo mohou přístupu bránit oprávnění souboru.</translation> <translation id="8194797478851900357">&Vrátit přesunutí zpět</translation> @@ -602,6 +624,7 @@ <translation id="8311778656528046050">Opravdu chcete tuto stránku znovu načíst?</translation> <translation id="8332188693563227489">Přístup k webu <ph name="HOST_NAME" /> byl odepřen</translation> <translation id="8349305172487531364">Lišta záložek</translation> +<translation id="8363502534493474904">Vypnout režim Letadlo</translation> <translation id="8364627913115013041">Nenastaveno.</translation> <translation id="8412145213513410671">Selhání (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Stejnou heslovou frázi musíte zadat dvakrát.</translation> @@ -658,6 +681,7 @@ <translation id="901974403500617787">Příznaky, které platí v celém systému, může nastavit pouze vlastník: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Server odmítl připojení.</translation> <translation id="9020542370529661692">Stránka byla přeložena do jazyka <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Používat službu předpovídání k rychlejšímu načítání stránek</translation> <translation id="9039213469156557790">Tato stránka obsahuje ještě další nezabezpečené zdroje. Tyto zdroje budou během přenosu moci zobrazit jiní uživatelé a případní útočníci je mohou upravit a změnit tak chování stránky.</translation> <translation id="9049981332609050619">Pokusili jste se přejít do domény <ph name="DOMAIN" />, ale server předložil certifikát, jehož platnost vypršela.</translation> <translation id="9050666287014529139">Heslová fráze</translation> @@ -671,6 +695,7 @@ <translation id="9170848237812810038">Z&pět</translation> <translation id="917450738466192189">Certifikát serveru je neplatný.</translation> <translation id="9183425211371246419">Web <ph name="HOST_NAME" /> používá nepodporovaný protokol.</translation> +<translation id="9205078245616868884">Vaše data jsou šifrována pomocí heslové fráze pro synchronizaci. Chcete-li zahájit synchronizaci, zadejte ji.</translation> <translation id="9207861905230894330">Přidání článku se nezdařilo.</translation> <translation id="933612690413056017">Připojení k internetu není k dispozici</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index b34e31c..a5ec2d0 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da operativsystemet på din computer ikke har tillid til sikkerhedscertifikatet. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.</translation> <translation id="1152921474424827756">Få adgang til en <ph name="BEGIN_LINK" />cachelagret kopi<ph name="END_LINK" /> af <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> lukkede forbindelsen uventet.</translation> +<translation id="1161325031994447685">Genopretter forbindelse til Wi-Fi</translation> <translation id="1175364870820465910">&Udskriv...</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1195447618553298278">Ukendt fejl.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Brugerpolitikker</translation> <translation id="1644184664548287040">Netværkskonfigurationen er ugyldig og kunne ikke importeres.</translation> <translation id="1644574205037202324">Historik</translation> +<translation id="1645368109819982629">Ikke-understøttet protokol</translation> <translation id="1655462015569774233">{1,plural, =1{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat udløb i går. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse. Computerens ur er angivet til <ph name="CURRENT_DATE" />. Er det korrekt? Hvis ikke, skal du rette systemets ur og derefter opdatere denne side.}one{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat udløb for # dag siden. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse. Computerens ur er angivet til <ph name="CURRENT_DATE" />. Er det korrekt? Hvis ikke, skal du rette systemets ur og derefter opdatere denne side.}other{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat udløb for # dage siden. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse. Computerens ur er angivet til <ph name="CURRENT_DATE" />. Er det korrekt? Hvis ikke, skal du rette systemets ur og derefter opdatere denne side.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> bruger normalt kryptering til at beskytte dine oplysninger. Da Google Chrome forsøgte at oprette forbindelse til <ph name="SITE" /> denne gang, returnerede websitet usædvanlige og forkerte legitimationsoplysninger. Dette kan skyldes, at en hacker forsøger at udgive sig for at være <ph name="SITE" />, eller at en Wi-Fi-loginskærm har forstyrret forbindelsen. Dine oplysninger er stadig sikre, idet Google Chrome afbrød forbindelsen, inden der blev udvekslet data.</translation> <translation id="168841957122794586">Servercertifikatet indeholder en svag kryptografisk nøgle.</translation> <translation id="1706954506755087368">{1,plural, =1{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat tilsyneladende først gælder fra i morgen. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.}one{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat tilsyneladende først gælder fra om # dag. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.}other{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat tilsyneladende først gælder fra om # dage. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Prøv at kontakte systemadministratoren.</translation> <translation id="17513872634828108">Åbne faner</translation> <translation id="1753706481035618306">Sidetal</translation> <translation id="1763864636252898013">Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da operativsystemet på din enhed ikke har tillid til sikkerhedscertifikatet. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxyen konfigureres automatisk.</translation> <translation id="2025623846716345241">Bekræft genindlæsning</translation> <translation id="2030481566774242610">Mente du <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Kontrollere din proxy og din firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Postnummer</translation> <translation id="2065985942032347596">Godkendelse påkrævet</translation> <translation id="2079545284768500474">Fortryd</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Politikken blev ikke fundet</translation> <translation id="2213606439339815911">Indlæg hentes...</translation> <translation id="2214283295778284209"><ph name="SITE" /> er ikke tilgængelig</translation> +<translation id="2227695659599072496">Kontrollere netværkskablet eller routeren</translation> +<translation id="2230458221926704099">Ret problemerne med din forbindelse ved hjælp af <ph name="BEGIN_LINK" />diagnoseappen<ph name="END_LINK" /></translation> <translation id="225207911366869382">Denne værdi er forældet for denne politik.</translation> <translation id="2262243747453050782">HTTP-fejl</translation> <translation id="2279770628980885996">Der opstod en uventet hændelse, mens serveren forsøgte at gennemføre anmodningen.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Værktøj til parsing af JSON-filer</translation> <translation id="2495093607237746763">Hvis dette felt er markeret, gemmer Chromium en kopi af dit kort på denne enhed for at gøre det hurtigere at udfylde formularer.</translation> <translation id="2498091847651709837">Scan et nyt kort</translation> +<translation id="2515629240566999685">Kontrollere signalet i dit område</translation> <translation id="2516305470678292029">Alternative grænseflader</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> sendte et ugyldigt svar.</translation> <translation id="2552545117464357659">Nyere</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Tilføj denne side som bogmærke</translation> <translation id="3270847123878663523">&Fortryd omarrangering</translation> <translation id="3286538390144397061">Genstart nu</translation> +<translation id="3288003805934695103">Genindlæse siden</translation> +<translation id="3305707030755673451">Dine data blev krypteret med din adgangssætning til synkronisering d. <ph name="TIME" />. Indtast adgangssætningen for at starte synkroniseringen.</translation> <translation id="333371639341676808">Undgå, at denne side laver nye dialogbokse.</translation> <translation id="3340978935015468852">indstillinger</translation> <translation id="3355823806454867987">Skift indstillinger for proxy...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Indlæser...</translation> <translation id="3712624925041724820">Licenserne er opbrugt</translation> +<translation id="3714780639079136834">Tænde for mobildata eller Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Tjekke proxy-, firewall- og DNS-konfigurationen<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Link, du har kopieret</translation> <translation id="3744899669254331632">Du kan ikke gå til <ph name="SITE" /> lige nu, da websitet sendte krypterede loginoplysninger, som Chromium ikke kan behandle. Netværksfejl og angreb er normalt midlertidige, så denne side vil sandsynligvis fungere igen senere.</translation> <translation id="3748412725338508953">Der var for mange omdirigeringer.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Læser-tilstand</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> er blokeret</translation> <translation id="4021036232240155012">DNS er den netværkstjeneste, der oversætter navnet på et website til dets internetadresse.</translation> +<translation id="4021376465026729077">Deaktivere dine udvidelser</translation> <translation id="4030383055268325496">&Fortryd tilføjelse</translation> <translation id="4032534284272647190">Der blev nægtet adgang til <ph name="URL" />.</translation> <translation id="404928562651467259">ADVARSEL</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Ugyldig verifikationssignatur</translation> <translation id="4176463684765177261">Deaktiveret</translation> <translation id="4196861286325780578">&Annuller fortryd flytning</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kontrollere firewall- og antiviruskonfigurationer<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Nedbrud</translation> <translation id="4250680216510889253">Nej</translation> <translation id="4258748452823770588">Forkert signatur</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Brug af en proxy er deaktiveret, men en eksplicit proxykonfiguration er angivet.</translation> <translation id="4492190037599258964">Søgeresultater for '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Valideringsfejl: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Kontakte systemadministratoren</translation> <translation id="450710068430902550">Deling med administrator</translation> <translation id="4522570452068850558">Detaljer</translation> <translation id="4535734014498033861">Der kunne ikke oprettes forbindelse til proxyserveren.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Om Google Oversæt</translation> <translation id="5040262127954254034">Beskyttelse af personlige oplysninger</translation> <translation id="5045550434625856497">Ugyldig adgangskode</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Tjekke proxy-adressen<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Serverens certifikatet er ikke gyldigt i øjeblikket.</translation> <translation id="5089810972385038852">Delstat</translation> <translation id="5094747076828555589">Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da Chromium ikke har tillid til sikkerhedscertifikatet. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Bekræft navigation</translation> <translation id="5299298092464848405">Der opstod en fejl ved parsing af politik</translation> <translation id="5300589172476337783">Vis</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Rydde dine cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Rapportering af nedbrud er deaktiveret.</translation> <translation id="5317780077021120954">Gem</translation> <translation id="5327248766486351172">Navn</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Genindlæs</translation> <translation id="5565735124758917034">Aktiv</translation> <translation id="560412284261940334">Administration er ikke understøttet</translation> +<translation id="5610142619324316209">Kontrollere forbindelsen</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> omdirigerede dig for mange gange.</translation> <translation id="5629630648637658800">Der kunne ikke indlæses indstillinger for politik</translation> <translation id="5631439013527180824">Ugyldigt token for enhedsadministration</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Dit kort er bekræftet</translation> <translation id="6146055958333702838">Kontrollér eventuelle kabler, og genstart alle routere, modemmer eller andre netværksenheder, du bruger.</translation> +<translation id="614940544461990577">Prøv at:</translation> <translation id="6151417162996330722">Servercertifikatet har en gyldighedsperiode, der er for lang.</translation> <translation id="6154808779448689242">Det returnerede token for politikken stemmer ikke overens med det nuværende token</translation> <translation id="6165508094623778733">Flere oplysninger</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Søg</translation> <translation id="6634865548447745291">Du kan ikke gå til <ph name="SITE" /> lige nu, da <ph name="BEGIN_LINK" />dette certifikat er blevet tilbagekaldt<ph name="END_LINK" />. Netværksfejl og angreb er normalt midlertidige, så denne side vil sandsynligvis fungere senere.</translation> <translation id="6637478299472506933">Download mislykkedes</translation> +<translation id="6642894344118208103">Nulstille modemmet eller routeren</translation> <translation id="6644283850729428850">Denne politik er forældet.</translation> <translation id="6646897916597483132">Indtast den firecifrede kontrolkode, som ses på forsiden af dit kort</translation> <translation id="6656103420185847513">Rediger mappe</translation> <translation id="6660210980321319655">Rapporteret automatisk <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Vil du fjerne formularforslag fra Chromium?</translation> +<translation id="6685834062052613830">Log ud, og fuldfør konfigurationen</translation> <translation id="6710213216561001401">Forrige</translation> <translation id="6711464428925977395">Der er noget galt med proxyserveren, eller adressen er forkert.</translation> <translation id="674375294223700098">Ukendt fejl i servercertifikatet.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">Gateway'en eller proxyserveren modtog et ugyldigt svar fra en upstreamserver.</translation> <translation id="7087282848513945231">Amt/region</translation> <translation id="7088615885725309056">Ældre</translation> +<translation id="7090678807593890770">Søg efter <ph name="LINK" /> på Google</translation> <translation id="7108649287766967076">Oversættelsen til <ph name="TARGET_LANGUAGE" /> mislykkedes.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Genstart nu</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Der blev ikke fundet nogen poster i historikken.</translation> <translation id="8088680233425245692">Artiklen kunne ikke vises.</translation> <translation id="8091372947890762290">Aktivering afventer serveren</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />DNS-adressen<ph name="END_ABBR" /> for <ph name="HOST_NAME" />'s server kunne ikke findes.</translation> <translation id="8149426793427495338">Din computer gik i dvale.</translation> <translation id="8150722005171944719">Filen i <ph name="URL" /> kan ikke læses. Den kan være blevet fjernet, flyttet, eller også forhindrer filtilladelser muligvis adgangen.</translation> <translation id="8194797478851900357">&Fortryd flytning</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Er du sikker på, at du vil genindlæse denne side?</translation> <translation id="8332188693563227489">Adgangen til <ph name="HOST_NAME" /> blev nægtet</translation> <translation id="8349305172487531364">Bogmærkelinje</translation> +<translation id="8363502534493474904">Deaktivere flytilstand</translation> <translation id="8364627913115013041">Ikke angivet.</translation> <translation id="8412145213513410671">Nedbrud (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Du skal angive den samme adgangssætning to gange.</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">Markeringer, der gælder for hele systemet, kan kun indstilles af ejeren: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Serveren afviste forbindelsen.</translation> <translation id="9020542370529661692">Denne side er oversat til <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Brug en forudsigelsestjeneste til hurtigere sideindlæsning</translation> <translation id="9039213469156557790">Desuden indeholder denne side andre ressourcer, som ikke er sikre. Disse ressourcer kan ses af andre under overførslen og kan ændres af en hacker, så siden opfører sig anderledes.</translation> <translation id="9049981332609050619">Du har forsøgt at nå <ph name="DOMAIN" />, men serveren præsenterede et ugyldigt certifikat.</translation> <translation id="9050666287014529139">Adgangssætning</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">&Fortryd</translation> <translation id="917450738466192189">Serverens certifikat er ugyldigt.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> anvender en ikke-understøttet protokol.</translation> +<translation id="9205078245616868884">Dine data er krypteret med din adgangssætning til synkronisering. Indtast den for at starte synkroniseringen.</translation> <translation id="9207861905230894330">Artiklen kunne ikke tilføjes.</translation> <translation id="933612690413056017">Der er ingen internetforbindelse</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 4bdc543d..8dcf7ce 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -27,6 +27,7 @@ <translation id="1150979032973867961">Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat wird vom Betriebssystem Ihres Computers als nicht vertrauenswürdig eingestuft. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.</translation> <translation id="1152921474424827756">Rufen Sie eine <ph name="BEGIN_LINK" />im Cache gespeicherte Kopie<ph name="END_LINK" /> von <ph name="URL" /> auf.</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> hat die Verbindung unerwartet geschlossen.</translation> +<translation id="1161325031994447685">WLAN-Verbindung erneut herstellen</translation> <translation id="1175364870820465910">&Drucken...</translation> <translation id="1181037720776840403">Entfernen</translation> <translation id="1195447618553298278">Unbekannter Fehler.</translation> @@ -68,12 +69,14 @@ <translation id="1640180200866533862">Nutzerrichtlinien</translation> <translation id="1644184664548287040">Die Netzwerkkonfiguration ist ungültig und konnte nicht importiert werden.</translation> <translation id="1644574205037202324">Verlauf</translation> +<translation id="1645368109819982629">Nicht unterstütztes Protokoll</translation> <translation id="1655462015569774233">{1,plural, =1{Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat ist gestern abgelaufen. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt. Die Uhr Ihres Computers ist derzeit auf <ph name="CURRENT_DATE" /> eingestellt. Ist das korrekt? Falls nicht, stellen Sie die Uhr Ihres Systems richtig ein und aktualisieren Sie anschließend diese Seite.}other{Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat ist vor # Tagen abgelaufen. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt. Die Uhr Ihres Computers ist derzeit auf <ph name="CURRENT_DATE" /> eingestellt. Ist das korrekt? Falls nicht, stellen Sie die Uhr Ihres Systems richtig ein und aktualisieren Sie anschließend diese Seite.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> schützt Ihre Daten in der Regel durch Verschlüsselung. Als Google Chrome dieses Mal versuchte, eine Verbindung zu <ph name="SITE" /> herzustellen, gab die Website ungewöhnliche und falsche Anmeldedaten zurück. Entweder versucht ein Angreifer, sich als <ph name="SITE" /> auszugeben, oder die Verbindung wurde durch eine WLAN-Anmeldeseite unterbrochen. Da Google Chrome die Verbindung vor dem Austausch von Daten unterbrochen hat, sind Ihre Informationen weiterhin sicher.</translation> <translation id="168841957122794586">Das Serverzertifikat weist einen schwachen kryptografischen Schlüssel auf.</translation> <translation id="1706954506755087368">{1,plural, =1{Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat gilt vermutlich erst ab morgen. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.}other{Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat gilt vermutlich erst in # Tagen. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.}}</translation> <translation id="1710259589646384581">Betriebssystem</translation> <translation id="1734864079702812349">American Express</translation> +<translation id="1734878702283171397">Setzen Sie sich mit dem Systemadministrator in Verbindung.</translation> <translation id="17513872634828108">Geöffnete Tabs</translation> <translation id="1753706481035618306">Seitenzahl</translation> <translation id="1763864636252898013">Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat wird vom Betriebssystem Ihres Geräts als nicht vertrauenswürdig eingestuft. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.</translation> @@ -95,6 +98,7 @@ <translation id="2025186561304664664">Proxy ist auf automatische Konfiguration eingestellt.</translation> <translation id="2025623846716345241">Aktualisieren bestätigen</translation> <translation id="2030481566774242610">Meinten Sie <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Proxy und Firewall prüfen<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Postleitzahl</translation> <translation id="2065985942032347596">Authentifizierung erforderlich</translation> <translation id="2079545284768500474">Rückgängig</translation> @@ -120,6 +124,8 @@ <translation id="2212735316055980242">Richtlinie nicht gefunden</translation> <translation id="2213606439339815911">Einträge werden abgerufen...</translation> <translation id="2214283295778284209">Nicht verfügbar: <ph name="SITE" /></translation> +<translation id="2227695659599072496">Netzwerkkabel oder Router prüfen</translation> +<translation id="2230458221926704099">Beheben Sie den Verbindungsfehler mithilfe der <ph name="BEGIN_LINK" />Diagnose-App<ph name="END_LINK" /></translation> <translation id="225207911366869382">Dieser Wert für die Richtlinie ist veraltet.</translation> <translation id="2262243747453050782">HTTP-Fehler</translation> <translation id="2279770628980885996">Beim Versuch des Servers, die Anforderung zu verarbeiten, ist eine unerwartete Bedingung aufgetreten.</translation> @@ -147,6 +153,7 @@ <translation id="2495083838625180221">JSON-Parser</translation> <translation id="2495093607237746763">Wenn Sie diese Option auswählen, speichert Chromium eine Kopie Ihrer Karte auf diesem Gerät, damit Formulare schneller ausgefüllt werden können.</translation> <translation id="2498091847651709837">Neue Karte scannen</translation> +<translation id="2515629240566999685">Signal an Ihrem Standort prüfen</translation> <translation id="2516305470678292029">Alternativen für die Benutzeroberfläche</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> hat eine ungültige Antwort gesendet.</translation> <translation id="2552545117464357659">Neuer</translation> @@ -222,6 +229,8 @@ <translation id="3254409185687681395">Lesezeichen für diese Seite erstellen</translation> <translation id="3270847123878663523">&Neu anordnen rückgängig machen</translation> <translation id="3286538390144397061">Jetzt neu starten</translation> +<translation id="3288003805934695103">Seite aktualisieren</translation> +<translation id="3305707030755673451">Ihre Daten wurden am <ph name="TIME" /> mit Ihrer Synchronisierungspassphrase verschlüsselt. Geben Sie diese ein, um die Synchronisierung zu starten.</translation> <translation id="333371639341676808">Diese Seite am Erstellen zusätzlicher Dialoge hindern</translation> <translation id="3340978935015468852">Einstellungen</translation> <translation id="3355823806454867987">Proxy-Einstellungen ändern...</translation> @@ -264,6 +273,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Wird geladen...</translation> <translation id="3712624925041724820">Lizenzen aufgebraucht</translation> +<translation id="3714780639079136834">Mobile Daten oder WLAN aktivieren</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Proxy, Firewall und DNS-Konfiguration prüfen<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Von Ihnen kopierter Link</translation> <translation id="3744899669254331632">Sie können <ph name="SITE" /> zurzeit nicht aufrufen, weil die Website verschlüsselte Anmeldedaten gesendet hat, die von Chromium nicht verarbeitet werden können. Netzwerkfehler und Angriffe sind in der Regel nur vorübergehend, sodass die Seite wahrscheinlich später wieder funktioniert.</translation> <translation id="3748412725338508953">Zu viele Umleitungen.</translation> @@ -286,6 +297,7 @@ <translation id="3963721102035795474">Lesemodus</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ist gesperrt</translation> <translation id="4021036232240155012">DNS ist der Netzwerkdienst, der den Namen einer Website in die entsprechende Internetadresse umwandelt.</translation> +<translation id="4021376465026729077">Erweiterungen deaktivieren</translation> <translation id="4030383055268325496">&Hinzufügen rückgängig machen</translation> <translation id="4032534284272647190">Zugriff auf <ph name="URL" /> verweigert</translation> <translation id="404928562651467259">Warnung</translation> @@ -302,6 +314,7 @@ <translation id="4171400957073367226">Ungültige Bestätigungssignatur</translation> <translation id="4176463684765177261">Deaktiviert</translation> <translation id="4196861286325780578">&Verschieben wiederholen</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Firewall und Antivirenkonfiguration prüfen<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Abstürze</translation> <translation id="4250680216510889253">Nein</translation> <translation id="4258748452823770588">Fehlerhafte Signatur</translation> @@ -322,6 +335,7 @@ <translation id="443673843213245140">Die Proxy-Nutzung ist deaktiviert, es ist jedoch eine explizite Proxy-Konfiguration festgelegt.</translation> <translation id="4492190037599258964">Suchergebnisse für "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Fehler bei der Überprüfung: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Kontakt mit dem Systemadministrator aufnehmen</translation> <translation id="450710068430902550">Datenfreigabe an Administrator</translation> <translation id="4522570452068850558">Details</translation> <translation id="4535734014498033861">Proxyserver-Verbindung fehlgeschlagen</translation> @@ -359,6 +373,7 @@ <translation id="5031870354684148875">Über Google Übersetzer</translation> <translation id="5040262127954254034">Datenschutz</translation> <translation id="5045550434625856497">Falsches Passwort</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Proxyadresse prüfen<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Das Serverzertifikat ist zurzeit ungültig.</translation> <translation id="5089810972385038852">Bundesstaat/-land</translation> <translation id="5094747076828555589">Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat wird von Chromium als nicht vertrauenswürdig eingestuft. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.</translation> @@ -377,6 +392,7 @@ <translation id="5295309862264981122">Navigation bestätigen</translation> <translation id="5299298092464848405">Fehler beim Parsen der Richtlinie</translation> <translation id="5300589172476337783">Anzeigen</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Cookies löschen<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Die Absturzberichtsfunktion ist deaktiviert.</translation> <translation id="5317780077021120954">Speichern</translation> <translation id="5327248766486351172">Name</translation> @@ -404,6 +420,7 @@ <translation id="5556459405103347317">Neu laden</translation> <translation id="5565735124758917034">Aktiv</translation> <translation id="560412284261940334">Verwaltung wird nicht unterstützt.</translation> +<translation id="5610142619324316209">Verbindung prüfen</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> hat Sie zu oft weitergeleitet.</translation> <translation id="5629630648637658800">Fehler beim Laden der Richtlinieneinstellungen</translation> <translation id="5631439013527180824">Ungültiges Management-Token für das Gerät</translation> @@ -436,6 +453,7 @@ <translation id="6093795393556121384">Ihre Karte wurde bestätigt.</translation> <translation id="6146055958333702838">Überprüfen Sie alle Kabel und starten Sie alle verwendeten Router, Modems und anderen Netzwerkgeräte neu.</translation> +<translation id="614940544461990577">Versuchen Sie Folgendes:</translation> <translation id="6151417162996330722">Die Gültigkeitsdauer des Serverzertifikats ist zu lang.</translation> <translation id="6154808779448689242">Zurückgegebenes Token der Richtlinie entspricht nicht dem aktuellen Token.</translation> <translation id="6165508094623778733">Weitere Informationen</translation> @@ -477,11 +495,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" />-Suche</translation> <translation id="6634865548447745291">Sie können <ph name="SITE" /> zurzeit nicht aufrufen, da <ph name="BEGIN_LINK" />dieses Zertifikat widerrufen wurde<ph name="END_LINK" />. Netzwerkfehler und Angriffe sind in der Regel nur vorübergehend, sodass die Seite wahrscheinlich später wieder funktioniert.</translation> <translation id="6637478299472506933">Fehler beim Download</translation> +<translation id="6642894344118208103">Modem oder Router zurücksetzen</translation> <translation id="6644283850729428850">Diese Richtlinie ist veraltet.</translation> <translation id="6646897916597483132">Geben Sie den vierstelligen CVC-Code auf der Vorderseite Ihrer Karte ein.</translation> <translation id="6656103420185847513">Ordner bearbeiten</translation> <translation id="6660210980321319655">Automatische Meldung am <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Vorschlag für das Formular aus Chromium entfernen?</translation> +<translation id="6685834062052613830">Abmelden und Einrichtung abschließen</translation> <translation id="6710213216561001401">Zurück</translation> <translation id="6711464428925977395">Mit dem Proxyserver ist ein Problem aufgetreten oder die Adresse ist falsch.</translation> <translation id="674375294223700098">Fehler wegen unbekanntem Serverzertifikat</translation> @@ -516,6 +536,7 @@ <translation id="7052500709156631672">Das Gateway oder der Proxyserver hat eine ungültige Antwort von einem Upstream-Server erhalten.</translation> <translation id="7087282848513945231">Landkreis</translation> <translation id="7088615885725309056">Älter</translation> +<translation id="7090678807593890770">Auf Google nach <ph name="LINK" /> suchen</translation> <translation id="7108649287766967076">Bei der Übersetzung (<ph name="TARGET_LANGUAGE" />) ist ein Fehler aufgetreten.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Jetzt neu starten</translation> @@ -608,6 +629,7 @@ <translation id="8034955203865359138">Keine Verlaufseinträge gefunden</translation> <translation id="8088680233425245692">Der Artikel kann nicht angezeigt werden.</translation> <translation id="8091372947890762290">Aktivierung auf dem Server steht noch aus.</translation> +<translation id="8134994873729925007">Die <ph name="BEGIN_ABBR" />DNS-Adresse<ph name="END_ABBR" /> des Servers von <ph name="HOST_NAME" /> wurde nicht gefunden.</translation> <translation id="8149426793427495338">Ihr Computer ist im Ruhemodus.</translation> <translation id="8150722005171944719">Die Datei unter <ph name="URL" /> kann nicht gelesen werden. Sie wurde möglicherweise entfernt oder verschoben oder die Dateiberechtigungen verhindern den Zugriff.</translation> <translation id="8194797478851900357">&Verschieben rückgängig machen</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Möchten Sie diese Seite wirklich aktualisieren?</translation> <translation id="8332188693563227489">Der Zugriff auf <ph name="HOST_NAME" /> wurde verweigert</translation> <translation id="8349305172487531364">Lesezeichenleiste</translation> +<translation id="8363502534493474904">Flugmodus ausschalten</translation> <translation id="8364627913115013041">Nicht eingerichtet</translation> <translation id="8412145213513410671">Abstürze (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Sie müssen zweimal dieselbe Passphrase eingeben.</translation> @@ -692,6 +715,7 @@ <translation id="901974403500617787">Parameter, die systemweit gelten, können nur vom Eigentümer festgelegt werden: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Server hat die Verbindung abgelehnt.</translation> <translation id="9020542370529661692">Die Seite wurde übersetzt und liegt nun auf <ph name="TARGET_LANGUAGE" /> vor.</translation> +<translation id="9038649477754266430">Vervollständigungsdienst zum schnelleren Laden von Seiten verwenden</translation> <translation id="9039213469156557790">Außerdem enthält diese Seite andere, nicht sichere Ressourcen. Diese Ressourcen können während der Übertragung von anderen Nutzern angezeigt und von Angreifern bearbeitet werden, die das Verhalten der Seite verändern.</translation> <translation id="9049981332609050619">Sie haben versucht, auf <ph name="DOMAIN" /> zuzugreifen, der Server hat sich jedoch mit einem ungültigen Zertifikat ausgewiesen.</translation> <translation id="9050666287014529139">Passphrase</translation> @@ -705,6 +729,7 @@ <translation id="9170848237812810038">&Rückgängig</translation> <translation id="917450738466192189">Das Serverzertifikat ist ungültig.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> verwendet ein nicht unterstütztes Protokoll.</translation> +<translation id="9205078245616868884">Ihre Daten sind mit Ihrer Synchronisierungspassphrase verschlüsselt. Geben Sie diese ein, um die Synchronisierung zu starten.</translation> <translation id="9207861905230894330">Der Artikel konnte nicht hinzugefügt werden.</translation> <translation id="933612690413056017">Keine Internetverbindung</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index baa2900..a508ae2 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του δεν θεωρείται έμπιστο από το λειτουργικό σύστημα της συσκευής σας. Αυτό μπορεί να οφείλεται σε λανθασμένη ρύθμιση ή σε κάποιον τρίτο που επιτίθεται στη σύνδεσή σας.</translation> <translation id="1152921474424827756">Πρόσβαση σε <ph name="BEGIN_LINK" />προσωρινό αντίγραφο<ph name="END_LINK" /> της διεύθυνσης <ph name="URL" /></translation> <translation id="1158211211994409885">Ο κεντρικός υπολογιστής <ph name="HOST_NAME" /> τερμάτισε απροσδόκητα τη σύνδεση.</translation> +<translation id="1161325031994447685">Επανασυνδεθείτε στο Wi-Fi</translation> <translation id="1175364870820465910">&Εκτύπωση...</translation> <translation id="1181037720776840403">Κατάργηση</translation> <translation id="1195447618553298278">Άγνωστο σφάλμα.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Πολιτικές χρηστών</translation> <translation id="1644184664548287040">Η διαμόρφωση δικτύου είναι μη έγκυρη και δεν ήταν δυνατή η εισαγωγή της.</translation> <translation id="1644574205037202324">Ιστορικό</translation> +<translation id="1645368109819982629">Μη υποστηριζόμενο πρωτόκολλο</translation> <translation id="1655462015569774233">{1,plural, =1{Αυτός ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι το <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του έληξε χθες. Αυτό μπορεί να οφείλεται σε εσφαλμένη ρύθμιση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας. Το ρολόι του υπολογιστή σας αυτήν τη στιγμή είναι ρυθμισμένο στην ημερομηνία <ph name="CURRENT_DATE" />. Είναι σωστή αυτή η ρύθμιση; Εάν όχι, θα πρέπει να διορθώσετε το ρολόι του συστήματός σας και έπειτα να ανανεώσετε αυτήν τη σελίδα.}other{Αυτός ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι το <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του έληξε πριν από # ημέρες. Αυτό μπορεί να οφείλεται σε εσφαλμένη ρύθμιση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας. Το ρολόι του υπολογιστή σας αυτήν τη στιγμή είναι ρυθμισμένο στην ημερομηνία <ph name="CURRENT_DATE" />. Είναι σωστή αυτή η ρύθμιση; Εάν όχι, θα πρέπει να διορθώσετε το ρολόι του συστήματός σας και έπειτα να ανανεώσετε αυτήν τη σελίδα.}}</translation> <translation id="1676269943528358898">Κανονικά, ο ιστότοπος <ph name="SITE" /> χρησιμοποιεί κρυπτογράφηση για να προστατεύει τα στοιχεία σας. Όταν το Google Chrome επιχείρησε πρόσφατα να συνδεθεί στο <ph name="SITE" />, ο ιστότοπος ανταποκρίθηκε δημιουργώντας ασυνήθιστα και εσφαλμένα διαπιστευτήρια. Αυτό μπορεί να συμβεί όταν κάποιος εισβολέας προσπαθεί να υποκριθεί ότι είναι ο ιστότοπος <ph name="SITE" /> ή όταν κάποια οθόνη σύνδεσης Wi-Fi έχει διακόψει τη σύνδεσή σας. Τα στοιχεία σας εξακολουθούν να είναι ασφαλή επειδή το Google Chrome διέκοψε τη σύνδεση πριν από την ανταλλαγή δεδομένων.</translation> <translation id="168841957122794586">Το πιστοποιητικό διακομιστή περιέχει ένα αδύναμο κρυπτογραφικό κλειδί.</translation> <translation id="1706954506755087368">{1,plural, =1{Αυτός ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι το <ph name="DOMAIN" />. Η ημερομηνία του πιστοποιητικού ασφαλείας του υποτίθεται ότι είναι αυριανή. Αυτό μπορεί να οφείλεται σε εσφαλμένη ρύθμιση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας.}other{Αυτός ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι το <ph name="DOMAIN" />. Η ημερομηνία του πιστοποιητικού ασφαλείας του υποτίθεται ότι είναι από # ημέρες μετά. Αυτό μπορεί να οφείλεται σε εσφαλμένη ρύθμιση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Προσπαθήστε να επικοινωνήσετε με το διαχειριστή συστήματος.</translation> <translation id="17513872634828108">Ανοικτές καρτέλες</translation> <translation id="1753706481035618306">Αριθμός σελίδας</translation> <translation id="1763864636252898013">Ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του δεν θεωρείται έμπιστο από το λειτουργικό σύστημα της συσκευής σας. Αυτό μπορεί να οφείλεται σε λανθασμένη ρύθμιση ή σε κάποιον τρίτο που επιτίθεται στη σύνδεσή σας.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Ο διακομιστής μεσολάβησης έχει ρυθμιστεί σε αυτόματη διαμόρφωση.</translation> <translation id="2025623846716345241">Επιβεβαίωση εκ νέου φόρτωσης</translation> <translation id="2030481566774242610">Μήπως εννοείτε <ph name="LINK" />;</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Ελέγξτε το διακομιστή μεσολάβησης και το τείχος προστασίας<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Ταχυδρομικός κώδικας</translation> <translation id="2065985942032347596">Απαιτείται έλεγχος ταυτότητας</translation> <translation id="2079545284768500474">Αναίρεση</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Η πολιτική δε βρέθηκε</translation> <translation id="2213606439339815911">Ανάκτηση καταχωρίσεων…</translation> <translation id="2214283295778284209">Ο ιστότοπος <ph name="SITE" /> δεν είναι διαθέσιμος</translation> +<translation id="2227695659599072496">Ελέγξτε το καλώδιο ή το δρομολογητή</translation> +<translation id="2230458221926704099">Επιδιορθώστε τη σύνδεσή σας χρησιμοποιώντας την <ph name="BEGIN_LINK" />εφαρμογή διαγνωστικών ελέγχων<ph name="END_LINK" /></translation> <translation id="225207911366869382">Αυτή η πολιτική έχει καταργηθεί για τη συγκεκριμένη πολιτική.</translation> <translation id="2262243747453050782">Σφάλμα HTTP</translation> <translation id="2279770628980885996">Προέκυψε μη αναμενόμενη κατάσταση ενώ ο διακομιστής επιχειρούσε να εκπληρώσει το αίτημα.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Συντακτικός αναλυτής JSON</translation> <translation id="2495093607237746763">Εάν επιλεγεί, το Chromium θα αποθηκεύσει ένα αντίγραφο της κάρτας σας σε αυτήν τη συσκευή για ταχύτερη συμπλήρωση φορμών.</translation> <translation id="2498091847651709837">Σάρωση νέας κάρτας</translation> +<translation id="2515629240566999685">Ελέγξτε το σήμα στην περιοχή σας</translation> <translation id="2516305470678292029">Εναλλακτικές διεπαφές</translation> <translation id="255002559098805027">Ο κεντρικός υπολογιστής <ph name="HOST_NAME" /> έστειλε μια μη έγκυρη απόκριση.</translation> <translation id="2552545117464357659">Νεότερη</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Προσθήκη αυτής της σελίδας στους σελιδοδείκτες</translation> <translation id="3270847123878663523">&Αναίρεση αναδιάταξης</translation> <translation id="3286538390144397061">Άμεση επανεκκίνηση</translation> +<translation id="3288003805934695103">Επαναλάβετε τη φόρτωση της σελίδας</translation> <translation id="3305707030755673451">Τα δεδομένα σας κρυπτογραφήθηκαν με τη δική σας φράση πρόσβασης συγχρονισμού στις <ph name="TIME" />. Πληκτρολογήστε την για να ξεκινήσει ο συγχρονισμός.</translation> <translation id="333371639341676808">Αποτροπή δημιουργίας πρόσθετων πλαισίων διαλόγου από αυτή τη σελίδα.</translation> <translation id="3340978935015468852">ρυθμίσεις</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Φόρτωση...</translation> <translation id="3712624925041724820">Οι άδειες έχουν εξαντληθεί</translation> +<translation id="3714780639079136834">Ενεργοποιήστε τα δεδομένα κινητής τηλεφωνίας ή το Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Ελέγξτε το διακομιστή μεσολάβησης, το τείχος προστασίας και τη διαμόρφωση DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Σύνδεσμος που αντιγρ.</translation> <translation id="3744899669254331632">Δεν μπορείτε να επισκεφτείτε τον ιστότοπο <ph name="SITE" /> αυτήν τη στιγμή, επειδή ο ιστότοπος έστειλε κωδικοποιημένα διαπιστευτήρια τα οποία δεν είναι δυνατό να επεξεργαστεί το Chromium. Τα σφάλματα δικτύου και οι επιθέσεις είναι συνήθως προσωρινά φαινόμενα, συνεπώς η σελίδα πιθανότατα θα λειτουργήσει αργότερα.</translation> <translation id="3748412725338508953">Υπήρξε μεγάλος αριθμός ανακατευθύνσεων.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Λειτουργία αναγνώστη</translation> <translation id="3973234410852337861">Ο κεντρικός υπολογιστής <ph name="HOST_NAME" /> είναι αποκλεισμένος</translation> <translation id="4021036232240155012">Το DNS είναι η υπηρεσία δικτύου που μεταφράζει το όνομα ενός ιστότοπου στη διεύθυνσή του στο διαδίκτυο.</translation> +<translation id="4021376465026729077">Απενεργοποιήστε τις επεκτάσεις σας</translation> <translation id="4030383055268325496">&Αναίρεση προσθήκης</translation> <translation id="4032534284272647190">Απαγορεύεται η πρόσβαση στο <ph name="URL" />.</translation> <translation id="404928562651467259">ΠΡΟΕΙΔΟΠΟΙΗΣΗ</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Εσφαλμένη υπογραφή επαλήθευσης</translation> <translation id="4176463684765177261">Απενεργοποιημένη</translation> <translation id="4196861286325780578">&Επανάληψη μετακίνησης</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Ελέγξτε τις διαμορφώσεις του τείχους προστασίας και της προστασίας από ιούς<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Απότομες διακοπές λειτουργίας</translation> <translation id="4250680216510889253">Όχι</translation> <translation id="4258748452823770588">Εσφαλμένη υπογραφή</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">Η χρήση ενός διακομιστή μεσολάβησης είναι απενεργοποιημένη, αλλά έχει καθοριστεί μια ρητή διαμόρφωση διακομιστή μεσολάβησης.</translation> <translation id="4492190037599258964">Αποτελέσματα αναζήτησης για "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Σφάλμα επικύρωσης: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Επικοινωνήστε με το διαχειριστή συστήματος</translation> <translation id="450710068430902550">Κοινοποίηση στο διαχειριστή</translation> <translation id="4522570452068850558">Λεπτομέρειες</translation> <translation id="4535734014498033861">Η σύνδεση του διακομιστή μεσολάβησης απέτυχε.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">Σχετικά με τη Google Μετάφραση</translation> <translation id="5040262127954254034">Απόρρητο</translation> <translation id="5045550434625856497">Λανθασμένος κωδικός πρόσβασης</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Ελέγξτε τη διεύθυνση του διακομιστή μεσολάβησης<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Το πιστοποιητικό του διακομιστή δεν είναι έγκυρο αυτήν τη στιγμή.</translation> <translation id="5089810972385038852">Πολιτεία</translation> <translation id="5094747076828555589">Ο διακομιστής δεν μπορεί να αποδείξει ότι είναι το <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του δεν θεωρείται έμπιστο από το Chromium. Αυτό μπορεί να οφείλεται σε λανθασμένη ρύθμιση ή σε κάποιον τρίτο που επιτίθεται στη σύνδεσή σας.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Επιβεβαίωση περιήγησης</translation> <translation id="5299298092464848405">Σφάλμα ανάλυσης πολιτικής</translation> <translation id="5300589172476337783">Εμφάνιση</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Διαγράψτε τα cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Η αναφορά σφαλμάτων είναι απενεργοποιημένη.</translation> <translation id="5317780077021120954">Αποθήκευση</translation> <translation id="5327248766486351172">Όνομα</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Επαναφόρτωση</translation> <translation id="5565735124758917034">Ενεργό</translation> <translation id="560412284261940334">Η διαχείριση δεν υποστηρίζεται</translation> +<translation id="5610142619324316209">Ελέγξτε τη σύνδεση</translation> <translation id="5617949217645503996">Ο κεντρικός υπολογιστής <ph name="HOST_NAME" /> έκανε πάρα πολλές ανακατευθύνσεις.</translation> <translation id="5629630648637658800">Αποτυχία φόρτωσης ρυθμίσεων πολιτικής</translation> <translation id="5631439013527180824">Μη έγκυρο διακριτικό διαχείρισης συσκευής</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Η κάρτα σας επαληθεύτηκε</translation> <translation id="6146055958333702838">Ελέγξτε τυχόν καλώδια και επανεκκινήστε δρομολογητές, μόντεμ ή άλλες συσκευές του δικτύου που ενδεχομένως χρησιμοποιείτε.</translation> +<translation id="614940544461990577">Δοκιμάστε να κάνετε τα εξής:</translation> <translation id="6151417162996330722">Το πιστοποιητικό του διακομιστή έχει πολύ μεγάλη περίοδο εγκυρότητας.</translation> <translation id="6154808779448689242">Το εμφανιζόμενο διακριτικό πολιτικής δεν αντιστοιχεί με το τρέχον διακριτικό</translation> <translation id="6165508094623778733">Μάθετε περισσότερα</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685">Αναζήτηση <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Δεν μπορείτε να επισκεφτείτε τον ιστότοπο <ph name="SITE" /> αυτήν τη στιγμή επειδή <ph name="BEGIN_LINK" />αυτό το πιστοποιητικό έχει ανακληθεί<ph name="END_LINK" />. Τα σφάλματα δικτύου και οι επιθέσεις είναι συνήθως προσωρινά, συνεπώς αυτή η σελίδα πιθανότατα θα λειτουργήσει αργότερα.</translation> <translation id="6637478299472506933">Αποτυχία λήψης</translation> +<translation id="6642894344118208103">Επαναφέρετε το μόντεμ ή το δρομολογητή</translation> <translation id="6644283850729428850">Αυτή η πολιτική έχει αποσυρθεί.</translation> <translation id="6646897916597483132">Εισαγάγετε τον τετραψήφιο κωδικό CVC από το μπροστινό μέρος της κάρτας σας</translation> <translation id="6656103420185847513">Επεξεργασία φακέλου</translation> <translation id="6660210980321319655">Αυτόματη αναφορά <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Να καταργηθεί η πρόταση φόρμας από το Chromium;</translation> +<translation id="6685834062052613830">Αποσυνδεθείτε και ολοκληρώστε την εγκατάσταση</translation> <translation id="6710213216561001401">Προηγούμενο</translation> <translation id="6711464428925977395">Υπάρχει κάποιο πρόβλημα με το διακομιστή μεσολάβησης ή η διεύθυνση είναι εσφαλμένη.</translation> <translation id="674375294223700098">Άγνωστο σφάλμα πιστοποιητικού διακομιστή</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">Η πύλη ή ο διακομιστής μεσολάβησης έλαβε μια μη έγκυρη απάντηση από έναν ανιών διακομιστή.</translation> <translation id="7087282848513945231">Περιφέρεια</translation> <translation id="7088615885725309056">Παλαιότερο</translation> +<translation id="7090678807593890770">Αναζητήστε στο Google για <ph name="LINK" /></translation> <translation id="7108649287766967076">Η μετάφραση στα <ph name="TARGET_LANGUAGE" /> απέτυχε.</translation> <translation id="7139724024395191329">Εμιράτο</translation> <translation id="7179921470347911571">Επανεκκίνηση τώρα</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">Δεν βρέθηκαν καταχωρίσεις ιστορικού.</translation> <translation id="8088680233425245692">Αποτυχία προβολής άρθρου.</translation> <translation id="8091372947890762290">Η ενεργοποίηση στο διακομιστή εκκρεμεί</translation> +<translation id="8134994873729925007">Δεν ήταν δυνατή η εύρεση της <ph name="BEGIN_ABBR" />διεύθυνσης DNS<ph name="END_ABBR" /> του διακομιστή <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Ο υπολογιστής σας τέθηκε σε αδράνεια.</translation> <translation id="8150722005171944719">Δεν είναι δυνατή η ανάγνωση του αρχείου στη διεύθυνση <ph name="URL" />. Ενδέχεται να καταργήθηκε, να μετακινήθηκε ή τα δικαιώματα αρχείου μπορεί να μην επιτρέπουν την πρόσβαση.</translation> <translation id="8194797478851900357">&Αναίρεση μετακίνησης</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">Είστε βέβαιοι ότι επιθυμείτε να φορτώσετε ξανά αυτήν τη σελίδα;</translation> <translation id="8332188693563227489">Απορρίφθηκε η πρόσβαση στο κεντρικό υπολογιστή <ph name="HOST_NAME" /></translation> <translation id="8349305172487531364">Γραμμή σελιδοδεικτών</translation> +<translation id="8363502534493474904">Απενεργοποιήστε τη λειτουργία πτήσης</translation> <translation id="8364627913115013041">Δεν έχει οριστεί.</translation> <translation id="8412145213513410671">Σφάλματα (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Πρέπει να εισαγάγετε δύο φορές την ίδια φράση πρόσβασης.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">Οι επισημάνσεις που ισχύουν για ολόκληρο το σύστημα μπορούν να οριστούν μόνο από τον κάτοχο: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Ο διακομιστής απέρριψε τη σύνδεση.</translation> <translation id="9020542370529661692">Αυτή η σελίδα έχει μεταφραστεί στα <ph name="TARGET_LANGUAGE" />.</translation> +<translation id="9038649477754266430">Χρήση μιας υπηρεσίας πρόβλεψης για ταχύτερη φόρτωση σελίδων</translation> <translation id="9039213469156557790">Επίσης, αυτή η σελίδα περιέχει άλλους πόρους, οι οποίοι δεν είναι ασφαλείς. Αυτοί οι πόροι μπορούν να προβληθούν από άλλους χρήστες κατά τη μετάβαση και μπορούν να τροποποιηθούν από έναν εισβολέα ώστε να αλλάξει η συμπεριφορά της σελίδας.</translation> <translation id="9049981332609050619">Επιχειρήσατε να μεταβείτε στον <ph name="DOMAIN" /> , αλλά ο διακομιστής παρουσίασε ένα μη έγκυρο πιστοποιητικό.</translation> <translation id="9050666287014529139">Φράση πρόσβασής σας</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index d019a95..72adc546 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">This server could not prove that it is <ph name="DOMAIN" />; its security certificate is not trusted by your computer's operating system. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation> <translation id="1152921474424827756">Access a <ph name="BEGIN_LINK" />cached copy<ph name="END_LINK" /> of <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> unexpectedly closed the connection.</translation> +<translation id="1161325031994447685">Reconnecting to Wi-Fi</translation> <translation id="1175364870820465910">&Print...</translation> <translation id="1181037720776840403">Remove</translation> <translation id="1195447618553298278">Unknown error.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">User policies</translation> <translation id="1644184664548287040">The network configuration is invalid and couldn't be imported.</translation> <translation id="1644574205037202324">History</translation> +<translation id="1645368109819982629">Unsupported protocol</translation> <translation id="1655462015569774233">{1,plural, =1{This server could not prove that it is <ph name="DOMAIN" />; its security certificate expired yesterday. This may be caused by a misconfiguration or an attacker intercepting your connection. Your computer's clock is currently set to <ph name="CURRENT_DATE" />. Does that look right? If not, you should correct your system's clock and then refresh this page.}other{This server could not prove that it is <ph name="DOMAIN" />; its security certificate expired # days ago. This may be caused by a misconfiguration or an attacker intercepting your connection. Your computer's clock is currently set to <ph name="CURRENT_DATE" />. Does that look right? If not, you should correct your system's clock and then refresh this page.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> normally uses encryption to protect your information. When Google Chrome tried to connect to <ph name="SITE" /> this time, the website sent back unusual and incorrect credentials. This may happen when an attacker is trying to pretend to be <ph name="SITE" />, or a Wi-Fi sign-in screen has interrupted the connection. Your information is still secure because Google Chrome stopped the connection before any data was exchanged.</translation> <translation id="168841957122794586">The server certificate contains a weak cryptographic key.</translation> <translation id="1706954506755087368">{1,plural, =1{This server could not prove that it is <ph name="DOMAIN" />; its security certificate is supposedly from tomorrow. This may be caused by a misconfiguration or an attacker intercepting your connection.}other{This server could not prove that it is <ph name="DOMAIN" />; its security certificate is supposedly from # days in the future. This may be caused by a misconfiguration or an attacker intercepting your connection.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Try contacting the system admin.</translation> <translation id="17513872634828108">Open tabs</translation> <translation id="1753706481035618306">Page number</translation> <translation id="1763864636252898013">This server could not prove that it is <ph name="DOMAIN" />; its security certificate is not trusted by your device's operating system. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxy is set to auto-configured.</translation> <translation id="2025623846716345241">Confirm Reload</translation> <translation id="2030481566774242610">Did you mean <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Checking the proxy and the firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ZIP code</translation> <translation id="2065985942032347596">Authentication Required</translation> <translation id="2079545284768500474">Undo</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Policy not found</translation> <translation id="2213606439339815911">Fetching entries...</translation> <translation id="2214283295778284209"><ph name="SITE" /> is not available</translation> +<translation id="2227695659599072496">Checking the network cable or router</translation> +<translation id="2230458221926704099">Fix your connection using the <ph name="BEGIN_LINK" />diagnostics app<ph name="END_LINK" /></translation> <translation id="225207911366869382">This value is deprecated for this policy.</translation> <translation id="2262243747453050782">HTTP error</translation> <translation id="2279770628980885996">An unexpected condition was encountered while the server was attempting to fulfil the request.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">If ticked, Chromium will store a copy of your card on this device for faster form filling.</translation> <translation id="2498091847651709837">Scan new card</translation> +<translation id="2515629240566999685">Checking the signal in your area</translation> <translation id="2516305470678292029">UI Alternatives</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> sent an invalid response.</translation> <translation id="2552545117464357659">Newer</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Bookmark this page</translation> <translation id="3270847123878663523">&Undo Reorder</translation> <translation id="3286538390144397061">Restart Now</translation> +<translation id="3288003805934695103">Reloading the page</translation> <translation id="3305707030755673451">Your data was encrypted with your sync passphrase on <ph name="TIME" />. Enter it to start sync.</translation> <translation id="333371639341676808">Prevent this page from creating additional dialogues.</translation> <translation id="3340978935015468852">settings</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Loading...</translation> <translation id="3712624925041724820">Licenses exhausted</translation> +<translation id="3714780639079136834">Turning on mobile data or Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Checking the proxy, firewall and DNS configuration<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Link that you copied</translation> <translation id="3744899669254331632">You cannot visit <ph name="SITE" /> right now because the website sent scrambled credentials that Chromium cannot process. Network errors and attacks are usually temporary, so this page will probably work later.</translation> <translation id="3748412725338508953">There were too many redirects.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Reader Mode</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> is blocked</translation> <translation id="4021036232240155012">DNS is the network service that translates a website’s name to its Internet address.</translation> +<translation id="4021376465026729077">Disabling your extensions</translation> <translation id="4030383055268325496">&Undo add</translation> <translation id="4032534284272647190">Access to <ph name="URL" /> denied.</translation> <translation id="404928562651467259">WARNING</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Bad verification signature</translation> <translation id="4176463684765177261">Disabled</translation> <translation id="4196861286325780578">&Redo move</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Checking firewall and antivirus configurations<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Crashes</translation> <translation id="4250680216510889253">No</translation> <translation id="4258748452823770588">Bad signature</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">Use of a proxy is disabled but an explicit proxy configuration is specified.</translation> <translation id="4492190037599258964">Search results for '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Validation error: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Contacting the system admin</translation> <translation id="450710068430902550">Sharing with Administrator</translation> <translation id="4522570452068850558">Details</translation> <translation id="4535734014498033861">Proxy server connection failed.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">About Google Translate</translation> <translation id="5040262127954254034">Privacy</translation> <translation id="5045550434625856497">Incorrect password</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Checking the proxy address<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Server's certificate is not valid at this time.</translation> <translation id="5089810972385038852">County</translation> <translation id="5094747076828555589">This server could not prove that it is <ph name="DOMAIN" />; its security certificate is not trusted by Chromium. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Confirm Navigation</translation> <translation id="5299298092464848405">Error parsing policy</translation> <translation id="5300589172476337783">Show</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Clearing your cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Crash reporting is disabled.</translation> <translation id="5317780077021120954">Save</translation> <translation id="5327248766486351172">Name</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Reload</translation> <translation id="5565735124758917034">Active</translation> <translation id="560412284261940334">Management not supported</translation> +<translation id="5610142619324316209">Checking the connection</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> redirected you too many times.</translation> <translation id="5629630648637658800">Failed to load policy settings</translation> <translation id="5631439013527180824">Invalid device management token</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Your card is verified</translation> <translation id="6146055958333702838">Check any cables and reboot any routers, modems or other network devices you may be using.</translation> +<translation id="614940544461990577">Try:</translation> <translation id="6151417162996330722">The server certificate has a validity period that is too long.</translation> <translation id="6154808779448689242">Returned policy token doesn't match current token</translation> <translation id="6165508094623778733">Learn more</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Search</translation> <translation id="6634865548447745291">You cannot visit <ph name="SITE" /> at the moment because <ph name="BEGIN_LINK" />this certificate has been revoked<ph name="END_LINK" />. Network errors and attacks are usually temporary, so this page will probably work later.</translation> <translation id="6637478299472506933">Download Failed</translation> +<translation id="6642894344118208103">Resetting the modem or router</translation> <translation id="6644283850729428850">This policy has been deprecated.</translation> <translation id="6646897916597483132">Enter the 4-digit CVC from the front of your card</translation> <translation id="6656103420185847513">Edit Folder</translation> <translation id="6660210980321319655">Automatically reported <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Remove form suggestion from Chromium?</translation> +<translation id="6685834062052613830">Sign out and complete setup</translation> <translation id="6710213216561001401">Previous</translation> <translation id="6711464428925977395">There is something wrong with the proxy server or the address is incorrect.</translation> <translation id="674375294223700098">Unknown server certificate error.</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">The gateway or proxy server received an invalid response from an upstream server.</translation> <translation id="7087282848513945231">County</translation> <translation id="7088615885725309056">Older</translation> +<translation id="7090678807593890770">Search Google for <ph name="LINK" /></translation> <translation id="7108649287766967076">The translation to <ph name="TARGET_LANGUAGE" /> failed.</translation> <translation id="7139724024395191329">Emirate</translation> <translation id="7179921470347911571">Relaunch Now</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">No history entries found.</translation> <translation id="8088680233425245692">Failed to view article.</translation> <translation id="8091372947890762290">Activation is pending on the server</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" />’s server <ph name="BEGIN_ABBR" />DNS address<ph name="END_ABBR" /> could not be found.</translation> <translation id="8149426793427495338">Your computer went to sleep.</translation> <translation id="8150722005171944719">The file at <ph name="URL" /> is not readable. It may have been removed, moved or file permissions may be preventing access.</translation> <translation id="8194797478851900357">&Undo Move</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">Are you sure you want to reload this page?</translation> <translation id="8332188693563227489">Access to <ph name="HOST_NAME" /> was denied</translation> <translation id="8349305172487531364">Bookmarks bar</translation> +<translation id="8363502534493474904">Turning off aeroplane mode</translation> <translation id="8364627913115013041">Not set.</translation> <translation id="8412145213513410671">Crashes (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">You must enter the same passphrase twice.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">Flags that apply system-wide can only be set by the owner: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">The server refused the connection.</translation> <translation id="9020542370529661692">This page has been translated to <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Use a prediction service to load pages more quickly</translation> <translation id="9039213469156557790">Furthermore, this page includes other resources which are not secure. These resources can be viewed by others while in transit, and can be modified by an attacker to change the behaviour of the page.</translation> <translation id="9049981332609050619">You attempted to reach <ph name="DOMAIN" />, but the server presented an invalid certificate.</translation> <translation id="9050666287014529139">Passphrase</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index a837c56..8e607d4f 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -25,6 +25,7 @@ <translation id="1150979032973867961">Este servidor no pudo probar que su dominio es <ph name="DOMAIN" />; el sistema operativo de la computadora no confía en el certificado de seguridad. Es posible que esto se deba a una configuración incorrecta o a que un atacante interceptó la conexión.</translation> <translation id="1152921474424827756">Accede a una <ph name="BEGIN_LINK" />copia almacenada en caché<ph name="END_LINK" /> de <ph name="URL" />.</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> cerró la conexión de forma inesperada.</translation> +<translation id="1161325031994447685">Volver a conectarte a Wi-Fi</translation> <translation id="1175364870820465910">Im&primir...</translation> <translation id="1181037720776840403">Eliminar</translation> <translation id="1195447618553298278">Error desconocido.</translation> @@ -66,12 +67,14 @@ <translation id="1640180200866533862">Políticas de usuario</translation> <translation id="1644184664548287040">La configuración de red no es válida y no se pudo importar.</translation> <translation id="1644574205037202324">Historial</translation> +<translation id="1645368109819982629">Protocolo no compatible</translation> <translation id="1655462015569774233">{1,plural, =1{El servidor no logró comprobar si el dominio es <ph name="DOMAIN" />; el certificado de seguridad venció ayer. Es posible que esto se deba a una configuración incorrecta o a que un atacante haya interceptado la conexión. Actualmente, el reloj de la computadora está configurado en la siguiente fecha: <ph name="CURRENT_DATE" />. ¿Es correcto? De no ser así, corrige el reloj del sistema y, a continuación, actualiza la página.}other{El servidor no logró comprobar si el dominio es <ph name="DOMAIN" />; el certificado de seguridad venció hace # días. Es posible que esto se deba a una configuración incorrecta o a que un atacante haya interceptado la conexión. Actualmente, el reloj de la computadora está configurado en la siguiente fecha: <ph name="CURRENT_DATE" />. ¿Es correcto? De no ser así, corrige el reloj del sistema y, a continuación, actualiza la página.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> suele utilizar la encriptación para proteger la información. Cuando Google Chrome intentó conectarse a <ph name="SITE" />, el sitio web devolvió credenciales incorrectas y poco comunes. Es posible que un atacante quiera suplantar a <ph name="SITE" /> o que una pantalla de acceso Wi-Fi haya interrumpido la conexión. Tu información permanece segura porque Google Chrome detuvo la conexión para evitar el intercambio de datos.</translation> <translation id="168841957122794586">El certificado del servidor contiene una clave criptográfica no segura.</translation> <translation id="1706954506755087368">{1,plural, =1{El servidor no logró comprobar si el dominio es <ph name="DOMAIN" />; supuestamente, el certificado de seguridad entra en vigencia mañana. Es posible que esto se deba a una configuración incorrecta o a que un atacante haya interceptado la conexión.}other{El servidor no logró comprobar si el dominio es <ph name="DOMAIN" />; supuestamente, el certificado de seguridad entra en vigencia en # días. Es posible que esto se deba a una configuración incorrecta o a que un atacante haya interceptado la conexión.}}</translation> <translation id="1710259589646384581">SO</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Intenta contactarte con el administrador del sistema.</translation> <translation id="17513872634828108">Pestañas abiertas</translation> <translation id="1753706481035618306">Número de página</translation> <translation id="1763864636252898013">Este servidor no pudo probar que su dominio es <ph name="DOMAIN" />; el sistema operativo del dispositivo no confía en el certificado de seguridad. Es posible que esto se deba a una configuración incorrecta o a que un atacante interceptó la conexión.</translation> @@ -93,6 +96,7 @@ <translation id="2025186561304664664">El proxy se estableció en configuración automática.</translation> <translation id="2025623846716345241">Confirmar la recarga</translation> <translation id="2030481566774242610">¿Quisiste decir: <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Comprobar el proxy y el firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Código Postal</translation> <translation id="2065985942032347596">Se requiere autenticación</translation> <translation id="2079545284768500474">Deshacer</translation> @@ -118,6 +122,8 @@ <translation id="2212735316055980242">No se encontró la política.</translation> <translation id="2213606439339815911">Recuperando entradas…</translation> <translation id="2214283295778284209"><ph name="SITE" /> no está disponible.</translation> +<translation id="2227695659599072496">Revisar el cable de red o el router</translation> +<translation id="2230458221926704099">Corregir la conexión con la <ph name="BEGIN_LINK" />app de diagnóstico<ph name="END_LINK" /></translation> <translation id="225207911366869382">Este valor ya no se utiliza para esta política.</translation> <translation id="2262243747453050782">Error de HTTP</translation> <translation id="2279770628980885996">Se encontró una situación inesperada mientras el servidor intentaba cumplir con la solicitud.</translation> @@ -145,6 +151,7 @@ <translation id="2495083838625180221">Analizador de JSON</translation> <translation id="2495093607237746763">Si marcas esta opción, Chromium almacenará una copia de la tarjeta en el dispositivo para completar más rápidamente los formularios.</translation> <translation id="2498091847651709837">Escanear tarjeta nueva</translation> +<translation id="2515629240566999685">Comprobar la señal en tu área</translation> <translation id="2516305470678292029">Alternativas de interfaz de usuario</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> envió una respuesta no válida.</translation> <translation id="2552545117464357659">Reciente</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Agregar esta página a Marcadores</translation> <translation id="3270847123878663523">&Deshacer Reorganizar</translation> <translation id="3286538390144397061">Reiniciar ahora</translation> +<translation id="3288003805934695103">Volver a cargar la página</translation> +<translation id="3305707030755673451">Tus datos se encriptaron con tu frase de contraseña para sincronización el <ph name="TIME" />. Debes ingresarla para iniciar la sincronización.</translation> <translation id="333371639341676808">Evita que esta página cree cuadros de diálogo adicionales.</translation> <translation id="3340978935015468852">configuración</translation> <translation id="3355823806454867987">Cambiar la configuración del proxy...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Cargando...</translation> <translation id="3712624925041724820">Licencias agotadas</translation> +<translation id="3714780639079136834">Activar los datos móviles o la conexión Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Comprobar la configuración del proxy, firewall o DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Vínculo copiado</translation> <translation id="3744899669254331632">No puedes visitar <ph name="SITE" /> en este momento porque el sitio web envió credenciales encriptadas que Chromium no puede procesar. Los ataques y errores de red generalmente son temporales, por lo que esta página probablemente funcionará de nuevo más tarde.</translation> <translation id="3748412725338508953">Demasiados redireccionamientos.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">Modo de lectura</translation> <translation id="3973234410852337861">Se bloqueó <ph name="HOST_NAME" /></translation> <translation id="4021036232240155012">DNS es el servicio en red que traduce el nombre de un sitio web en su dirección de Internet.</translation> +<translation id="4021376465026729077">Inhabilitar las extensiones</translation> <translation id="4030383055268325496">&Deshacer Agregar</translation> <translation id="4032534284272647190">Acceso a <ph name="URL" /> denegado.</translation> <translation id="404928562651467259">ADVERTENCIA</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">La firma de verificación no es válida.</translation> <translation id="4176463684765177261">Deshabilitado</translation> <translation id="4196861286325780578">&Rehacer Mover</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Comprobar las configuraciones de firewall y antivirus<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Fallos</translation> <translation id="4250680216510889253">No</translation> <translation id="4258748452823770588">Firma no válida</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">Se inhabilitó el uso de un proxy, pero se especificó una configuración explícita de proxy.</translation> <translation id="4492190037599258964">Resultados de búsqueda de '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Error de validación: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Ponerte en contacto con el administrador del sistema</translation> <translation id="450710068430902550">Compartir con el administrador</translation> <translation id="4522570452068850558">Detalles</translation> <translation id="4535734014498033861">Falló la conexión del servidor proxy.</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">Acerca de Google Traductor</translation> <translation id="5040262127954254034">Privacidad</translation> <translation id="5045550434625856497">Contraseña incorrecta</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Comprobar la dirección de proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">El certificado del servidor no es válido en este momento.</translation> <translation id="5089810972385038852">Estado</translation> <translation id="5094747076828555589">Este servidor no pudo probar que su dominio es <ph name="DOMAIN" />; Chromium no confía en el certificado de seguridad. Es posible que esto se deba a una configuración incorrecta o a que un atacante interceptó la conexión.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">Confirmar navegación</translation> <translation id="5299298092464848405">Error al analizar la política</translation> <translation id="5300589172476337783">Mostrar</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Borrar las cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Notificación de fallas desactivada.</translation> <translation id="5317780077021120954">Guardar</translation> <translation id="5327248766486351172">Nombre</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">Cargar de nuevo</translation> <translation id="5565735124758917034">Activo</translation> <translation id="560412284261940334">No se admite la administración.</translation> +<translation id="5610142619324316209">Comprobar la conexión</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> te redireccionó demasiadas veces.</translation> <translation id="5629630648637658800">Error al cargar la configuración de la política</translation> <translation id="5631439013527180824">Token de administración de dispositivos no válido</translation> @@ -434,6 +451,7 @@ <translation id="6093795393556121384">Se verificó tu tarjeta.</translation> <translation id="6146055958333702838">Revisa los cables y reinicia los routers, módems u otros dispositivos de red que estés usando.</translation> +<translation id="614940544461990577">Intenta:</translation> <translation id="6151417162996330722">El certificado de servidor tiene un período de validez demasiado extenso.</translation> <translation id="6154808779448689242">El token de política devuelto no coincide con el token actual.</translation> <translation id="6165508094623778733">Más información</translation> @@ -474,11 +492,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Búsqueda</translation> <translation id="6634865548447745291">No puedes visitar <ph name="SITE" /> ahora porque <ph name="BEGIN_LINK" />este certificado se revocó<ph name="END_LINK" />. Los ataques y errores de red suelen ser temporales, por lo que es posible que esta página funcione más tarde.</translation> <translation id="6637478299472506933">Error en la descarga</translation> +<translation id="6642894344118208103">Reiniciar el módem o router</translation> <translation id="6644283850729428850">Esta política no ha sido aprobada.</translation> <translation id="6646897916597483132">Ingresa el CVC de 4 dígitos que figura en el frente de la tarjeta.</translation> <translation id="6656103420185847513">Editar carpeta</translation> <translation id="6660210980321319655">Se informó automáticamente el <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">¿Confirmas que quieres quitar la sugerencia de formulario de Chromium?</translation> +<translation id="6685834062052613830">Salir y completar la configuración</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6711464428925977395">Hay un error en el servidor proxy o la dirección es incorrecta.</translation> <translation id="674375294223700098">Error de certificado de servidor desconocido.</translation> @@ -512,6 +532,7 @@ <translation id="7052500709156631672">La puerta de enlace o servidor proxy recibió una respuesta no válida de un servidor de canal de subida.</translation> <translation id="7087282848513945231">Condado</translation> <translation id="7088615885725309056">Anterior</translation> +<translation id="7090678807593890770">Buscar <ph name="LINK" /> en Google</translation> <translation id="7108649287766967076">Se produjo un error en la traducción al <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">Emirato</translation> <translation id="7179921470347911571">Reiniciar ahora</translation> @@ -604,6 +625,7 @@ <translation id="8034955203865359138">No se encontraron entradas del historial.</translation> <translation id="8088680233425245692">Error al visualizar artículo</translation> <translation id="8091372947890762290">La activación está pendiente en el servidor.</translation> +<translation id="8134994873729925007">No se encontró la <ph name="BEGIN_ABBR" />dirección DNS<ph name="END_ABBR" /> del servidor de <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">La computadora se suspendió.</translation> <translation id="8150722005171944719">El archivo de <ph name="URL" /> no se puede leer. Es posible que se haya eliminado o movido o que se impida el acceso a los permisos del archivo.</translation> <translation id="8194797478851900357">&Deshacer Mover</translation> @@ -631,6 +653,7 @@ <translation id="8311778656528046050">¿Estás seguro de que quieres volver a cargar esta página?</translation> <translation id="8332188693563227489">Se denegó el acceso a <ph name="HOST_NAME" /></translation> <translation id="8349305172487531364">Barra de marcadores</translation> +<translation id="8363502534493474904">Desactivar el modo de avión</translation> <translation id="8364627913115013041">Sin establecer</translation> <translation id="8412145213513410671">Bloqueos (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Debes ingresar la misma frase de contraseña dos veces.</translation> @@ -688,6 +711,7 @@ <translation id="901974403500617787">El propietario es el único que puede especificar las marcas que se aplican a todo el sistema: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">El servidor ha rechazado la conexión.</translation> <translation id="9020542370529661692">Esta página se tradujo al <ph name="TARGET_LANGUAGE" />.</translation> +<translation id="9038649477754266430">Utilizar un servicio de predicción para cargar las páginas más rápido</translation> <translation id="9039213469156557790">Además, esta página incluye otros recursos que no son seguros. Otras personas pueden ver estos recursos mientras se encuentran en tránsito, y un atacante puede modificarlos para cambiar el funcionamiento de la página.</translation> <translation id="9049981332609050619">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor presentó un certificado no válido.</translation> <translation id="9050666287014529139">Frase de contraseña</translation> @@ -701,6 +725,7 @@ <translation id="9170848237812810038">&Deshacer</translation> <translation id="917450738466192189">El certificado del servidor no es válido.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> utiliza un protocolo no compatible.</translation> +<translation id="9205078245616868884">Tus datos están encriptados con tu frase de contraseña para sincronización. Debes ingresarla para iniciar la sincronización.</translation> <translation id="9207861905230894330">Error al agregar artículo</translation> <translation id="933612690413056017">No hay conexión a Internet</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index e34462cf..d3b2b4a 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Este servidor no ha podido probar que su dominio es <ph name="DOMAIN" />, el sistema operativo de tu ordenador no confía en su certificado de seguridad. Este problema puede deberse a una configuración incorrecta o a que un atacante haya interceptado la conexión.</translation> <translation id="1152921474424827756">Accede a una <ph name="BEGIN_LINK" />copia almacenada en caché<ph name="END_LINK" /> de <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ha cerrado la conexión de forma inesperada.</translation> +<translation id="1161325031994447685">Volver a conectarte a una red Wi-Fi</translation> <translation id="1175364870820465910">Im&primir...</translation> <translation id="1181037720776840403">Eliminar</translation> <translation id="1195447618553298278">Error desconocido.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Políticas de usuario</translation> <translation id="1644184664548287040">La configuración de red no es válida y no se ha podido importar.</translation> <translation id="1644574205037202324">Historial</translation> +<translation id="1645368109819982629">Protocolo no admitido</translation> <translation id="1655462015569774233">{1,plural, =1{Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; su certificado de seguridad caducó ayer. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión. El reloj de tu ordenador está establecido actualmente en las <ph name="CURRENT_DATE" />. ¿Es correcto? Si no lo es, corrige el reloj del sistema y, a continuación, actualiza esta página.}other{Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; su certificado de seguridad caducó hace # días. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión. El reloj de tu ordenador está establecido actualmente en las <ph name="CURRENT_DATE" />. ¿Es correcto? Si no lo es, corrige el reloj del sistema y, a continuación, actualiza esta página.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> utiliza normalmente el cifrado para proteger tu información. Cuando Google Chrome intentó establecer conexión con <ph name="SITE" />, el sitio web devolvió unas credenciales inusuales e incorrectas. Esto puede ocurrir si un atacante intenta suplantar la identidad de <ph name="SITE" /> o si una pantalla de inicio de sesión Wi-Fi interrumpe la conexión. Tu información sigue estando protegida, ya que Google Chrome detuvo la conexión antes de que se intercambiaran datos.</translation> <translation id="168841957122794586">El certificado del servidor contiene una clave criptográfica no segura.</translation> <translation id="1706954506755087368">{1,plural, =1{Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; supuestamente, su certificado de seguridad es válido a partir de mañana. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión.}other{Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; supuestamente, su certificado de seguridad es válido dentro de # días. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión.}}</translation> <translation id="1710259589646384581">Sistema operativo</translation> <translation id="1734864079702812349">American Express</translation> +<translation id="1734878702283171397">Intenta ponerte en contacto con el administrador del sistema.</translation> <translation id="17513872634828108">Pestañas abiertas</translation> <translation id="1753706481035618306">Número de página</translation> <translation id="1763864636252898013">Este servidor no ha podido probar que su dominio es <ph name="DOMAIN" />, el sistema operativo de tu dispositivo no confía en su certificado de seguridad. Este problema puede deberse a una configuración incorrecta o a que un atacante haya interceptado la conexión.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Se ha establecido que el proxy se configure automáticamente.</translation> <translation id="2025623846716345241">Confirmar que quieres volver a cargar la página</translation> <translation id="2030481566774242610">¿Querías decir <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Comprobar el proxy y el cortafuegos<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Código postal</translation> <translation id="2065985942032347596">Se requiere autenticación</translation> <translation id="2079545284768500474">Deshacer</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Política no encontrada</translation> <translation id="2213606439339815911">Recuperando entradas...</translation> <translation id="2214283295778284209"><ph name="SITE" /> no está disponible.</translation> +<translation id="2227695659599072496">Comprobar el router o el cable de red</translation> +<translation id="2230458221926704099">Soluciona los problemas de tu conexión con la <ph name="BEGIN_LINK" />aplicación de diagnósticos<ph name="END_LINK" /></translation> <translation id="225207911366869382">Este valor ya no se utiliza para esta política.</translation> <translation id="2262243747453050782">Error de HTTP</translation> <translation id="2279770628980885996">Se ha detectado una condición inesperada cuando el servidor intentaba atender la solicitud.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Analizador de archivos JSON</translation> <translation id="2495093607237746763">Si se activa esta opción, Chromium guardará una copia de tu tarjeta en este dispositivo para completar formularios más rápidamente.</translation> <translation id="2498091847651709837">Escanear nueva tarjeta</translation> +<translation id="2515629240566999685">Comprobar la señal en tu zona</translation> <translation id="2516305470678292029">Alternativas de IU</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> ha enviado una respuesta no válida.</translation> <translation id="2552545117464357659">Más recientes</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Añadir esta página a marcadores</translation> <translation id="3270847123878663523">&Deshacer reorganización</translation> <translation id="3286538390144397061">Reiniciar ahora</translation> +<translation id="3288003805934695103">Volver a cargar la página</translation> +<translation id="3305707030755673451">Tus datos se cifraron con tu frase de contraseña de sincronización el <ph name="TIME" />. Introdúcela para iniciar la sincronización.</translation> <translation id="333371639341676808">Evita que esta página cree cuadros de diálogo adicionales.</translation> <translation id="3340978935015468852">configuración</translation> <translation id="3355823806454867987">Cambiar la configuración de proxy...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Cargando...</translation> <translation id="3712624925041724820">Licencias agotadas</translation> +<translation id="3714780639079136834">Activar los datos móviles o la conexión Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Comprobar el proxy, el cortafuegos y la configuración de DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Enlace copiado</translation> <translation id="3744899669254331632">No puedes acceder a <ph name="SITE" /> en este momento porque el sitio web ha enviado credenciales codificadas que Chromium no puede procesar. Los ataques y los errores de red suelen ser temporales, por lo que es probable que esta página funcione más tarde.</translation> <translation id="3748412725338508953">Demasiados redireccionamientos.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Modo de lectura</translation> <translation id="3973234410852337861">La página <ph name="HOST_NAME" /> está bloqueada</translation> <translation id="4021036232240155012">DNS es el servicio de red que permite traducir el nombre de un sitio web a su dirección de Internet.</translation> +<translation id="4021376465026729077">Inhabilitar las extensiones</translation> <translation id="4030383055268325496">&Deshacer acción de añadir</translation> <translation id="4032534284272647190">Se ha denegado el acceso a <ph name="URL" /></translation> <translation id="404928562651467259">ADVERTENCIA</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">La firma de verificación no es válida</translation> <translation id="4176463684765177261">Inhabilitado</translation> <translation id="4196861286325780578">&Rehacer movimiento</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Comprobar la configuración del cortafuegos y del antivirus<ph name="END_LINK" /></translation> <translation id="4220128509585149162">La página no responde o se cierra</translation> <translation id="4250680216510889253">No</translation> <translation id="4258748452823770588">Firma errónea</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Se ha inhabilitado el uso de un servidor proxy, pero se han especificado ajustes de proxy explícitos.</translation> <translation id="4492190037599258964">Resultados de búsqueda de "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Error de validación: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Ponerte en contacto con el administrador del sistema</translation> <translation id="450710068430902550">Compartir con el administrador</translation> <translation id="4522570452068850558">Detalles</translation> <translation id="4535734014498033861">Se ha producido un error en la conexión con el servidor proxy.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Informacion del Traductor de Google</translation> <translation id="5040262127954254034">Privacidad</translation> <translation id="5045550434625856497">Contraseña incorrecta</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Comprobar la dirección del proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">El certificado del servidor no es válido en este momento.</translation> <translation id="5089810972385038852">Estado</translation> <translation id="5094747076828555589">Este servidor no ha podido probar que su dominio es <ph name="DOMAIN" />, Chromium no confía en su certificado de seguridad. Este problema puede deberse a una configuración incorrecta o a que un atacante haya interceptado la conexión.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Confirmar navegación</translation> <translation id="5299298092464848405">Error al analizar la política</translation> <translation id="5300589172476337783">Mostrar</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Borrar las cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Notificación de fallos inhabilitada</translation> <translation id="5317780077021120954">Guardar</translation> <translation id="5327248766486351172">Nombre</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Cargar de nuevo</translation> <translation id="5565735124758917034">Activo</translation> <translation id="560412284261940334">Administración no admitida</translation> +<translation id="5610142619324316209">Comprobar la conexión</translation> <translation id="5617949217645503996">La página <ph name="HOST_NAME" /> te ha redirigido demasiadas veces.</translation> <translation id="5629630648637658800">Error al cargar la configuración de la política</translation> <translation id="5631439013527180824">Token de administración de dispositivos no válido</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Tu tarjeta se ha verificado</translation> <translation id="6146055958333702838">Comprueba los cables y reinicia los routers, los módems o cualquier otro dispositivo de red que estés utilizando.</translation> +<translation id="614940544461990577">Prueba a:</translation> <translation id="6151417162996330722">El certificado del servidor tiene un período de validez demasiado largo.</translation> <translation id="6154808779448689242">El token de política devuelto no coincide con el token actual.</translation> <translation id="6165508094623778733">Más información</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685">Búsqueda de <ph name="ENGINE" /></translation> <translation id="6634865548447745291">No puedes acceder a <ph name="SITE" /> en este momento porque <ph name="BEGIN_LINK" />este certificado se ha revocado<ph name="END_LINK" />. Los ataques y los errores de red suelen ser temporales, por lo que es probable que esta página funcione más tarde.</translation> <translation id="6637478299472506933">Error de descarga</translation> +<translation id="6642894344118208103">Reiniciar el módem o el router</translation> <translation id="6644283850729428850">Esta política está obsoleta.</translation> <translation id="6646897916597483132">Introduce el código CVC de cuatro dígitos que aparece en el anverso de tu tarjeta</translation> <translation id="6656103420185847513">Editar carpeta</translation> <translation id="6660210980321319655">Notificado automáticamente el <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">¿Quitar sugerencia de formulario de Chromium?</translation> +<translation id="6685834062052613830">Cierra sesión y completa la configuración</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6711464428925977395">Se ha producido un error con el servidor proxy o la dirección es incorrecta.</translation> <translation id="674375294223700098">Error de certificado de servidor desconocido</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">La puerta de enlace o el servidor proxy ha recibido una respuesta que no es válida procedente de un servidor ascendente.</translation> <translation id="7087282848513945231">Condado</translation> <translation id="7088615885725309056">Más antiguos</translation> +<translation id="7090678807593890770">Busca <ph name="LINK" /> en Google</translation> <translation id="7108649287766967076">No se ha podido realizar la traducción al <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">Emirato</translation> <translation id="7179921470347911571">Reiniciar ahora</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">No se han encontrado entradas de historial.</translation> <translation id="8088680233425245692">Se ha producido un error al ver el artículo.</translation> <translation id="8091372947890762290">La activación está pendiente en el servidor.</translation> +<translation id="8134994873729925007">No se ha podido encontrar la <ph name="BEGIN_ABBR" />dirección DNS<ph name="END_ABBR" /> del servidor de <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">El ordenador se ha suspendido.</translation> <translation id="8150722005171944719">El archivo que se encuentra en <ph name="URL" /> no se puede leer. Puede que se haya eliminado o movido o que los permisos del archivo impidan acceder a él.</translation> <translation id="8194797478851900357">&Deshacer movimiento</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">¿Seguro que quieres volver a cargar esta página?</translation> <translation id="8332188693563227489">Se ha denegado el acceso a <ph name="HOST_NAME" /></translation> <translation id="8349305172487531364">Barra de marcadores</translation> +<translation id="8363502534493474904">Desactivar el modo avión</translation> <translation id="8364627913115013041">No establecida</translation> <translation id="8412145213513410671">Fallos (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Debes introducir la misma frase de contraseña dos veces.</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">Las opciones que se aplican a todo el sistema solo las puede establecer el propietario: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">El servidor ha rechazado la conexión.</translation> <translation id="9020542370529661692">Esta página se ha traducido al <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Utilizar un servicio de predicciones para que las páginas se carguen más rápido</translation> <translation id="9039213469156557790">Además, esta página incluye otros recursos que no son seguros. Otros usuarios pueden acceder a estos recursos mientras están en circulación y un atacante puede modificarlos para cambiar el comportamiento de la página.</translation> <translation id="9049981332609050619">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor ha presentado un certificado no válido.</translation> <translation id="9050666287014529139">Frase de contraseña</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">&Deshacer</translation> <translation id="917450738466192189">El certificado del servidor no es válido.</translation> <translation id="9183425211371246419">La página <ph name="HOST_NAME" /> utiliza un protocolo no admitido.</translation> +<translation id="9205078245616868884">Tus datos se han cifrado con tu frase de contraseña de sincronización. Introdúcela para iniciar la sincronización.</translation> <translation id="9207861905230894330">Se ha producido un error al añadir el artículo.</translation> <translation id="933612690413056017">No hay conexión a Internet</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index a88c6082..8e1f691e 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Server ei suutnud tõestada, et see on domeen <ph name="DOMAIN" />, arvuti operatsioonisüsteem ei usalda selle turvasertifikaati. Selle põhjuseks võib olla vale seadistus või ründaja, kes on sekkunud teie ühendusse.</translation> <translation id="1152921474424827756">Hankige juurdepääs aadressi <ph name="URL" /> <ph name="BEGIN_LINK" />vahemällu salvestatud koopiale<ph name="END_LINK" /></translation> <translation id="1158211211994409885">Host <ph name="HOST_NAME" /> sulges ootamatult ühenduse.</translation> +<translation id="1161325031994447685">Ühendage uuesti WiFi-ga</translation> <translation id="1175364870820465910">&Prindi...</translation> <translation id="1181037720776840403">Eemalda</translation> <translation id="1195447618553298278">Tundmatu viga.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Kasutajareeglid</translation> <translation id="1644184664548287040">Võrgu seadistus on sobimatu ja seda ei saa importida.</translation> <translation id="1644574205037202324">Ajalugu</translation> +<translation id="1645368109819982629">Toetuseta protokoll</translation> <translation id="1655462015569774233">{1,plural, =1{Server ei suutnud tõestada, et tegemist on domeeniga <ph name="DOMAIN" />, selle turvasertifikaat aegus eile. Selle põhjuseks võib olla vale seadistus või teie ühendust segav ründaja. Teie arvuti kell on praegu seatud kuupäevale <ph name="CURRENT_DATE" />. Kas see on õige? Kui ei ole, seadke süsteemi kell õigeks ja värskendage lehte.}other{Server ei suutnud tõestada, et tegemist on domeeniga <ph name="DOMAIN" />, selle turvasertifikaat aegus # päeva tagasi. Selle põhjuseks võib olla vale seadistus või teie ühendust segav ründaja. Teie arvuti kell on praegu seatud kuupäevale <ph name="CURRENT_DATE" />. Kas see on õige? Kui ei ole, seadke süsteemi kell õigeks ja värskendage lehte.}}</translation> <translation id="1676269943528358898">Sait <ph name="SITE" /> kasutab teie teabe kaitsmiseks tavaliselt krüpteerimist. Kui Google Chrome püüdis seekord saidiga <ph name="SITE" /> ühendust luua, tagastas veebisait ebatavalised ja valed mandaadid. See võib juhtuda siis, kui ründaja proovib teeselda, et on sait <ph name="SITE" />, või WiFi sisselogimisekraan on ühenduse katkestanud. Teie teave on endiselt kaitstud, sest Google Chrome peatas ühenduse enne andmevahetust.</translation> <translation id="168841957122794586">Serveri sertifikaat sisaldab nõrka krüptograafilist võtit.</translation> <translation id="1706954506755087368">{1,plural, =1{Server ei suutnud tõestada, et tegemist on domeeniga <ph name="DOMAIN" />, selle turvasertifikaat hakkab väidetavalt kehtima homme. Selle põhjuseks võib olla vale seadistus või teie ühendust segav ründaja.}other{Server ei suutnud tõestada, et tegemist on domeeniga <ph name="DOMAIN" />, selle turvasertifikaat hakkab väidetavalt kehtima # päeva pärast. Selle põhjuseks võib olla vale seadistus või teie ühendust segav ründaja.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Proovige ühendust võtta süsteemiadministraatoriga.</translation> <translation id="17513872634828108">Avatud vahelehed</translation> <translation id="1753706481035618306">Lk</translation> <translation id="1763864636252898013">Server ei suutnud tõestada, et see on domeen <ph name="DOMAIN" />, seadme operatsioonisüsteem ei usalda selle turvasertifikaati. Selle põhjuseks võib olla vale seadistus või ründaja, kes on sekkunud teie ühendusse.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Puhverserver seadistatakse automaatselt.</translation> <translation id="2025623846716345241">Kinnitage uuesti laadimine</translation> <translation id="2030481566774242610">Kas mõtlesite aadressi <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Kontrollige puhverserverit ja tulemüüri<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Postiindeks</translation> <translation id="2065985942032347596">Vajalik autentimine</translation> <translation id="2079545284768500474">Võta tagasi</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Reeglit ei leitud</translation> <translation id="2213606439339815911">Kirjete toomine ...</translation> <translation id="2214283295778284209"><ph name="SITE" /> pole saadaval</translation> +<translation id="2227695659599072496">Kontrollige võrgukaablit või ruuterit</translation> +<translation id="2230458221926704099">Parandage oma ühendus <ph name="BEGIN_LINK" />diagnostikarakenduse<ph name="END_LINK" /> abil</translation> <translation id="225207911366869382">Väärtus on eeskirjade jaoks aegunud.</translation> <translation id="2262243747453050782">HTTP viga</translation> <translation id="2279770628980885996">Ajal, mil server proovis päringut täita, ilmnes ootamatu seisund.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON-i parser</translation> <translation id="2495093607237746763">Kui see on märgitud, salvestab Chromium teie kaardi koopia vormide kiiremaks täitmiseks sellesse seadmesse.</translation> <translation id="2498091847651709837">Uue kaardi skannimine</translation> +<translation id="2515629240566999685">Kontrollige oma piirkonna signaali</translation> <translation id="2516305470678292029">Kasutajaliidese alternatiivid</translation> <translation id="255002559098805027">Host <ph name="HOST_NAME" /> saatis sobimatu vastuse.</translation> <translation id="2552545117464357659">Uuemad</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Lisa see lehekülg järjehoidjatesse</translation> <translation id="3270847123878663523">&Võta korrastamine tagasi</translation> <translation id="3286538390144397061">Taaskäivitada kohe</translation> +<translation id="3288003805934695103">Laadige leht uuesti</translation> +<translation id="3305707030755673451">Teie andmed krüpteeriti <ph name="TIME" /> teie sünkroonimisparooliga. Sisestage see sünkroonimise alustamiseks.</translation> <translation id="333371639341676808">Keela sellel leheküljel lisadialoogide loomine.</translation> <translation id="3340978935015468852">seaded</translation> <translation id="3355823806454867987">Muuda puhverserveri seadeid ...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" />, <ph name="BOOKMARKED" />, <ph name="TITLE" />, <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Laadimine...</translation> <translation id="3712624925041724820">Litsentsid on ammendunud</translation> +<translation id="3714780639079136834">Lülitage sisse mobiilne andmeside või WiFi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Kontrollige puhverserveri, tulemüüri ja DNS-i seadistust<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Teie kopeeritud link</translation> <translation id="3744899669254331632">Te ei saa saiti <ph name="SITE" /> praegu külastada, sest veebisait saatis tagasi arusaamatud mandaadid, mida Chromium ei saa töödelda. Võrguvead ja -rünnakud on tavaliselt ajutised, nii et leht tõenäoliselt hiljem töötab.</translation> <translation id="3748412725338508953">Liiga palju ümbersuunamisi.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Lugejarežiim</translation> <translation id="3973234410852337861">Host <ph name="HOST_NAME" /> on blokeeritud</translation> <translation id="4021036232240155012">DNS on võrguteenus, mis tõlgib veebisaidi nime selle Interneti-aadressiks.</translation> +<translation id="4021376465026729077">Keelake laiendused</translation> <translation id="4030383055268325496">&Võta lisamine tagasi</translation> <translation id="4032534284272647190">Juurdepääs aadressile <ph name="URL" /> on keelatud.</translation> <translation id="404928562651467259">HOIATUS</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Sobimatu kinnitusallkiri</translation> <translation id="4176463684765177261">Keelatud</translation> <translation id="4196861286325780578">&Teisalda uuesti</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kontrollige tulemüüri ja viirusetõrje seadistusi<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Krahhid</translation> <translation id="4250680216510889253">Ei</translation> <translation id="4258748452823770588">Sobimatu allkiri</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Puhverserveri kasutamine on keelatud, kuid määratud on ka konkreetne puhverserveri konfigureerimine.</translation> <translation id="4492190037599258964">Otsingutulemused „<ph name="SEARCH_STRING" />“ kohta</translation> <translation id="4506176782989081258">Valideerimisviga: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Võtke ühendust süsteemiadministraatoriga</translation> <translation id="450710068430902550">Administraatoriga jagamine</translation> <translation id="4522570452068850558">Üksikasjad</translation> <translation id="4535734014498033861">Puhverserveri ühendus nurjus.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Teave Google'i tõlke kohta</translation> <translation id="5040262127954254034">Privaatsus</translation> <translation id="5045550434625856497">Vale parool</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kontrollige puhverserveri aadressi<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Serveri sertifikaat pole praegu kehtiv.</translation> <translation id="5089810972385038852">Osariik</translation> <translation id="5094747076828555589">Server ei suutnud tõestada, et see on domeen <ph name="DOMAIN" />, Chromium ei usalda selle turvasertifikaati. Selle põhjuseks võib olla vale seadistus või ründaja, kes on sekkunud teie ühendusse.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Kinnita navigatsiooni</translation> <translation id="5299298092464848405">Reegli sõelumisel ilmnes viga</translation> <translation id="5300589172476337783">Kuva</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Kustutage küpsised<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Krahhide aruandlus on keelatud.</translation> <translation id="5317780077021120954">Salvesta</translation> <translation id="5327248766486351172">Nimi</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Laadi uuesti</translation> <translation id="5565735124758917034">Aktiivne</translation> <translation id="560412284261940334">Haldust ei toetata</translation> +<translation id="5610142619324316209">Kontrollige ühendust</translation> <translation id="5617949217645503996">Host <ph name="HOST_NAME" /> suunas teid liiga mitu korda ümber.</translation> <translation id="5629630648637658800">Reegli seadete laadimine ebaõnnestus</translation> <translation id="5631439013527180824">Seadme halduse luba on kehtetu</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Kaart on kinnitatud</translation> <translation id="6146055958333702838">Kontrollige kaableid ning taaskäivitage kõik ruuterid, modemid ja muud kasutuses olevad võrguseadmed.</translation> +<translation id="614940544461990577">Proovige järgmist.</translation> <translation id="6151417162996330722">Serveri sertifikaadi kehtivusaeg on liiga pikk.</translation> <translation id="6154808779448689242">Tagastatud reegli luba ei kattu praeguse loaga</translation> <translation id="6165508094623778733">Lisateave</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" />'i otsing</translation> <translation id="6634865548447745291">Te ei saa saiti <ph name="SITE" /> praegu külastada, sest <ph name="BEGIN_LINK" />see sertifikaat on tühistatud<ph name="END_LINK" />. Võrguvead ja -rünnakud on tavaliselt ajutised, nii et leht tõenäoliselt hiljem töötab.</translation> <translation id="6637478299472506933">Allalaadimine nurjus</translation> +<translation id="6642894344118208103">Lähtestage modem või ruuter</translation> <translation id="6644283850729428850">See reegel on aegunud.</translation> <translation id="6646897916597483132">Sisestage 4-kohaline CVC kaardi tagaküljelt</translation> <translation id="6656103420185847513">Kausta muutmine</translation> <translation id="6660210980321319655">Automaatne teavitamine: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Kas eemaldada Chromiumist vormi soovitus?</translation> +<translation id="6685834062052613830">Logige välja ja viige seadistus lõpule</translation> <translation id="6710213216561001401">Eelmine</translation> <translation id="6711464428925977395">Puhverserveriga on midagi valesti või aadress on vale.</translation> <translation id="674375294223700098">Serveri sertifikaadi tundmatu viga.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">Lüüs või puhverserver sai kõrgema taseme serverilt kehtetu vastuse.</translation> <translation id="7087282848513945231">Maakond</translation> <translation id="7088615885725309056">Vanemad</translation> +<translation id="7090678807593890770">Sisestage Google'isse otsing <ph name="LINK" /></translation> <translation id="7108649287766967076">Tõlkimine <ph name="TARGET_LANGUAGE" /> keelde ebaõnnestus.</translation> <translation id="7139724024395191329">Emiraat</translation> <translation id="7179921470347911571">Taaskäivita kohe</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Ajaloo sisestusi ei leitud.</translation> <translation id="8088680233425245692">Artikli kuvamine ebaõnnestus.</translation> <translation id="8091372947890762290">Aktiveerimine on serveris ootel</translation> +<translation id="8134994873729925007">Hosti <ph name="HOST_NAME" /> serveri <ph name="BEGIN_ABBR" />DNS-aadressi<ph name="END_ABBR" /> ei leitud.</translation> <translation id="8149426793427495338">Teie arvuti lülitus unerežiimile.</translation> <translation id="8150722005171944719">Fail <ph name="URL" /> ei ole loetav. Võimalik, et see on eemaldatud, teisaldatud või faili load takistavad juurdepääsu.</translation> <translation id="8194797478851900357">&Võta teisaldamine tagasi</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Kas soovite kindlasti lehe uuesti laadida?</translation> <translation id="8332188693563227489">Juurdepääs hostile <ph name="HOST_NAME" /> blokeeriti</translation> <translation id="8349305172487531364">Järjehoidjariba</translation> +<translation id="8363502534493474904">Lülitage lennukirežiim välja</translation> <translation id="8364627913115013041">Määramata.</translation> <translation id="8412145213513410671">Krahhid (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Peate sisestama sama parooli kaks korda.</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">Kogu süsteemis kehtivaid märgiseid saab määrata ainult omanik: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Server keeldus ühendusest.</translation> <translation id="9020542370529661692">See leht on tõlgitud <ph name="TARGET_LANGUAGE" /> keelde</translation> +<translation id="9038649477754266430">Kasuta lehtede kiiremaks laadimiseks ennustusteenust</translation> <translation id="9039213469156557790">Lisaks sisaldab see leht teisi ressursse, mis pole turvalised. Edastamise ajal võivad ressursse vaadata ka teised ja ründajad saavad lehe käitumise muutmiseks ressursse muuta.</translation> <translation id="9049981332609050619">Proovisite jõuda domeenile <ph name="DOMAIN" />, kuid server esitas kehtetu sertifikaadi.</translation> <translation id="9050666287014529139">Parool</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">&Võta tagasi</translation> <translation id="917450738466192189">Serveri sertifikaat on kehtetu.</translation> <translation id="9183425211371246419">Host <ph name="HOST_NAME" /> kasutab toetamata protokolli.</translation> +<translation id="9205078245616868884">Teie andmed on krüpteeritud teie sünkroonimisparooliga. Sisestage see sünkroonimise alustamiseks.</translation> <translation id="9207861905230894330">Artikli lisamine ebaõnnestus.</translation> <translation id="933612690413056017">Interneti-ühendus puudub</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 7b21b067..1e95b0e 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">این سرور نتوانست اثبات کند که این <ph name="DOMAIN" /> است؛ گواهی امنیتی آن مورد اعتماد سیستم عامل رایانه شما نیست. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجی اتصال شما را قطع کرده است.</translation> <translation id="1152921474424827756">دسترسی به یک <ph name="BEGIN_LINK" />نسخه ذخیره شده در حافظه پنهان<ph name="END_LINK" /> از <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> بهطور غیرمنتظرهای اتصال را قطع کرد.</translation> +<translation id="1161325031994447685">اتصال مجدد به Wi-Fi</translation> <translation id="1175364870820465910">&چاپ...</translation> <translation id="1181037720776840403">حذف</translation> <translation id="1195447618553298278">خطای ناشناخته.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">خطمشیهای کاربر</translation> <translation id="1644184664548287040">پیکربندی شبکه نامعتبر است و نتوانست وارد شود.</translation> <translation id="1644574205037202324">سابقه</translation> +<translation id="1645368109819982629">پروتکل پشتیبانینشده</translation> <translation id="1655462015569774233">{1,plural, =1{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است؛ اعتبار گواهی امنیتی آن دیروز به پایان رسیده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع میکند. ساعت رایانهتان درحالحاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر پاسخ منفی است، باید ساعت سیستمتان را درست کنید و سپس این صفحه را بازخوانی کنید.}one{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است. اعتبار گواهی امنیتی آن # روز قبل به پایان رسیده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع میکند. ساعت رایانهتان درحالحاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر پاسخ منفی است، باید ساعت سیستمتان را درست کنید و سپس این صفحه را بازخوانی کنید.}other{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است. اعتبار گواهی امنیتی آن # روز قبل به پایان رسیده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع میکند. ساعت رایانهتان درحالحاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر پاسخ منفی است، باید ساعت سیستمتان را درست کنید و سپس این صفحه را بازخوانی کنید.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> معمولاً برای محافظت از اطلاعات شما از رمزگذاری استفاده میکند. اما این بار که Chrome تلاش کرد به <ph name="SITE" /> متصل شود، وبسایت اعتبارنامهای نامعمول و نادرست را برگرداند. ممکن است مهاجمی در تلاش باشد خود را بهجای <ph name="SITE" /> معرفی کند یا یک صفحه ورود به سیستم Wi-Fi در ارتباط اختلال ایجاد کرده باشد. اطلاعات شما همچنان ایمن است، زیرا Google Chrome قبل از هرگونه تبادل داده، اتصال را متوقف کرد.</translation> <translation id="168841957122794586">گواهینامه سرور دارای یک کلید رمزنگاری ضعیف است.</translation> <translation id="1706954506755087368">{1,plural, =1{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است؛ اعتبار گواهی امنیتی آن ظاهراً فردا شروع میشود. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع میکند.}one{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است؛ اعتبار گواهی امنیتی آن ظاهراً # روز دیگر شروع میشود. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع میکند.}other{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است؛ اعتبار گواهی امنیتی آن ظاهراً # روز دیگر شروع میشود. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع میکند.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">با سرپرست سیستم تماس بگیرید.</translation> <translation id="17513872634828108">بازکردن برگهها</translation> <translation id="1753706481035618306">شماره صفحه</translation> <translation id="1763864636252898013">این سرور نتوانست اثبات کند که این <ph name="DOMAIN" /> است؛ گواهی امنیتی آن مورد اعتماد سیستم عامل دستگاه شما نیست. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجی اتصال شما را قطع کرده است.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">پروکسی بر روی پیکربندی خودکار تنظیم شده است.</translation> <translation id="2025623846716345241">تأیید تازهسازی</translation> <translation id="2030481566774242610">منظورتان <ph name="LINK" /> بود؟</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />بررسی پروکسی و دیوار آتش<ph name="END_LINK" /></translation> <translation id="2053553514270667976">کد پستی</translation> <translation id="2065985942032347596">تأیید اعتبار لازم است</translation> <translation id="2079545284768500474">لغو</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">خطمشی یافت نشد</translation> <translation id="2213606439339815911">در حال واکشی موارد...</translation> <translation id="2214283295778284209"><ph name="SITE" /> در دسترس نیست</translation> +<translation id="2227695659599072496">بررسی رهیاب یا کابل شبکه</translation> +<translation id="2230458221926704099">با استفاده از <ph name="BEGIN_LINK" />برنامه عیبیابی<ph name="END_LINK" />، مشکل اتصالتان را برطرف کنید</translation> <translation id="225207911366869382">این مقدار برای این خطمشی منسوخ شده است؟</translation> <translation id="2262243747453050782">خطای HTTP</translation> <translation id="2279770628980885996">هنگام تلاش سرور برای انجام این درخواست وضعیت غیرمنتظرهای رخ داد.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">تجزیهکننده JSON</translation> <translation id="2495093607237746763">اگر علامت زده شود، Chromium برای پر کردن سریعتر فرم، یک کپی از کارت شما در این دستگاه ذخیره میکند.</translation> <translation id="2498091847651709837">اسکن کارت جدید</translation> +<translation id="2515629240566999685">بررسی سیگنال در منطقهتان</translation> <translation id="2516305470678292029">گزینههای واسط کاربر</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> پاسخی نامعتبر ارسال کرد.</translation> <translation id="2552545117464357659">جدیدتر</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">نشانک گذاری این صفحه</translation> <translation id="3270847123878663523">&واگرد ترتیببندی مجدد</translation> <translation id="3286538390144397061">راهاندازی مجدد اکنون</translation> +<translation id="3288003805934695103">تازهسازی صفحه</translation> <translation id="3305707030755673451">دادههای شما در تاریخ <ph name="TIME" /> با عبارت عبور همگامسازیتان رمزگذاری شد. برای شروع همگامسازی آن را وارد کنید.</translation> <translation id="333371639341676808">از ایجاد کادرهای گفتگوی دیگر توسط این صفحه جلوگیری شود.</translation> <translation id="3340978935015468852">تنظیمات</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">در حال بارکردن…</translation> <translation id="3712624925041724820">مجوزها دیگر معتبر نیستند</translation> +<translation id="3714780639079136834">روشن کردن داده شبکه تلفن همراه یا Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />بررسی پروکسی، دیوار آتش و پیکربندی DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">پیوندی که کپی کردهاید</translation> <translation id="3744899669254331632">نمیتوانید اکنون از <ph name="SITE" /> دیدن کنید زیرا وبسایت اعتبارنامههای درهمی ارسال کرده که Chromium نمیتواند پردازش کند. خطاها و حملههای شبکه معمولاً موقتی هستند، بنابراین احتمالاً این صفحه بعداً کار میکند.</translation> <translation id="3748412725338508953">تغییر مسیرهای زیادی وجود دارد.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">حالت «خواننده»</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> مسدود است</translation> <translation id="4021036232240155012">DNS خدماتی از شبکه است که نام وبسایت را به آدرس اینترنتی آن ترجمه میکند.</translation> +<translation id="4021376465026729077">غیرفعال کردن افزونهها</translation> <translation id="4030383055268325496">&واگرد افزودن</translation> <translation id="4032534284272647190">دسترسی به <ph name="URL" /> رد شد.</translation> <translation id="404928562651467259">اخطار</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">امضای تأیید نامناسب</translation> <translation id="4176463684765177261">غیرفعال شد</translation> <translation id="4196861286325780578">&انجام مجدد انتقال</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />بررسی پیکربندی آنتیویروس و دیوار آتش<ph name="END_LINK" /></translation> <translation id="4220128509585149162">خرابی ها</translation> <translation id="4250680216510889253">نه</translation> <translation id="4258748452823770588">امضای نادرست</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">استفاده از پروکسی غیرفعال است اما یک پیکربندی خاص برای پروکسی تعیین شده است.</translation> <translation id="4492190037599258964">نتایج جستجو برای "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">خطای ارزیابی: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">تماس با سرپرست سیستم</translation> <translation id="450710068430902550">اشتراکگذاری با سرپرست سیستم</translation> <translation id="4522570452068850558">جزئیات</translation> <translation id="4535734014498033861">اتصال به سرور پراکسی انجام نشد.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">درباره Google Translate</translation> <translation id="5040262127954254034">حریم خصوصی</translation> <translation id="5045550434625856497">گذرواژه نامعتبر</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />بررسی آدرس پروکسی<ph name="END_LINK" /></translation> <translation id="5087286274860437796">در حال حاضر گواهی سرور معتبر نیست.</translation> <translation id="5089810972385038852">ایالت</translation> <translation id="5094747076828555589">این سرور نتوانست اثبات کند که این <ph name="DOMAIN" /> است؛ گواهی امنیت آن مورد اعتماد Chromium نیست. علت این موضوع میتوان پیکربندی اشتباه باشد یا مهاجمی اتصال شما را قطع کرده است.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">تأیید پیمایش</translation> <translation id="5299298092464848405">خطا در تجزیه خطمشی</translation> <translation id="5300589172476337783">نمایش</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />پاک کردن کوکیها<ph name="END_LINK" /></translation> <translation id="5308689395849655368">گزارش خرابی غیر فعال است.</translation> <translation id="5317780077021120954">ذخیره</translation> <translation id="5327248766486351172">نام</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">تازهسازی</translation> <translation id="5565735124758917034">فعال</translation> <translation id="560412284261940334">مدیریت پشتیبانی نمیشود</translation> +<translation id="5610142619324316209">بررسی اتصال</translation> <translation id="5617949217645503996">تعداد دفعاتی که <ph name="HOST_NAME" /> شما را به نشانیهای دیگر هدایت کرده بیش از حد است.</translation> <translation id="5629630648637658800">تنظیمات خطمشی بارگیری نشد</translation> <translation id="5631439013527180824">نشانه مدیریت دستگاه نامعتبر است</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">کارت شما تأیید شده است</translation> <translation id="6146055958333702838">همه کابلها را بررسی کنید و همه رهیابها، مودمها، یا دیگر دستگاههای شبکهای را که ممکن است درحال استفاده از آنها باشید مجدداً راهاندازی کنید.</translation> +<translation id="614940544461990577">این موارد را امتحان کنید:</translation> <translation id="6151417162996330722">دوره اعتبار گواهینامه سرور بسیار طولانی است.</translation> <translation id="6154808779448689242">نشانه خطمشی بازگشتی با نشانه فعلی تطابق ندارد</translation> <translation id="6165508094623778733">بیشتر بدانید</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685">جستجوی <ph name="ENGINE" /></translation> <translation id="6634865548447745291">در حال حاضر نمیتوانید از <ph name="SITE" /> بازدید کنید زیرا <ph name="BEGIN_LINK" />این گواهینامه باطل شده است<ph name="END_LINK" />. معمولاً خطاهای شبکه و حملهها موقتی هستند، بنابراین احتمالاً این صفحه بعداً کار خواهد کرد.</translation> <translation id="6637478299472506933">بارگیری نشد</translation> +<translation id="6642894344118208103">بازنشانی مودم یا رهیاب</translation> <translation id="6644283850729428850">این قانون قدیمی شده است.</translation> <translation id="6646897916597483132">کد تأیید چهار رقمی CVC را از روی کارتتان وارد کنید</translation> <translation id="6656103420185847513">ویرایش پوشه</translation> <translation id="6660210980321319655">بهصورت خودکار در <ph name="CRASH_TIME" /> گزارش داده شد</translation> <translation id="6671697161687535275">پیشنهاد فرم از Chromium پاک شود؟</translation> +<translation id="6685834062052613830">خروج از سیستم و تکمیل راهاندازی</translation> <translation id="6710213216561001401">قبلی</translation> <translation id="6711464428925977395">مشکلی در سرور پروکسی وجود دارد یا این آدرس درست نیست.</translation> <translation id="674375294223700098">خطای ناشناخته گواهی سرور.</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">دروازه یا سرور پراکسی یک پاسخ نامعتبر از سرور بالایی دریافت کرده است.</translation> <translation id="7087282848513945231">شهرستان</translation> <translation id="7088615885725309056">قدیمی تر</translation> +<translation id="7090678807593890770">جستجوی <ph name="LINK" /> در Google</translation> <translation id="7108649287766967076">ترجمه به <ph name="TARGET_LANGUAGE" /> انجام نشد.</translation> <translation id="7139724024395191329">امارت</translation> <translation id="7179921470347911571">اکنون راهاندازی مجدد شود</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">ورودی سابقه یافت نشد.</translation> <translation id="8088680233425245692">مشاهده مقاله ناموفق بود.</translation> <translation id="8091372947890762290">فعالسازی در سرور در حالت تعلیق است</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />نشانی DNS<ph name="END_ABBR" /> سرور <ph name="HOST_NAME" /> پیدا نشد.</translation> <translation id="8149426793427495338">رایانهتان به خواب رفته است.</translation> <translation id="8150722005171944719">این فایل در <ph name="URL" /> قابل خواندن نیست. ممکن است حذف شده، جابجا شده باشد و یا مجوزهای فایل از دسترسی جلوگیری میکنند.</translation> <translation id="8194797478851900357">&واگرد انتقال</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">آیا مطمئن هستید که میخواهید این صفحه را تازهسازی کنید؟</translation> <translation id="8332188693563227489">دسترسی به <ph name="HOST_NAME" /> رد شد</translation> <translation id="8349305172487531364">نوار نشانکها</translation> +<translation id="8363502534493474904">خاموش کردن حالت هواپیما</translation> <translation id="8364627913115013041">تنظیم نشده است.</translation> <translation id="8412145213513410671">خرابی ها (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">شما باید همان عبارت عبور را دوبار وارد کنید.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">پرچمهایی که در تمام سیستم اعمال میشوند فقط توسط مالک قابل تنظیم هستند: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">سرور اتصال را رد کرد.</translation> <translation id="9020542370529661692">این صفحه به <ph name="TARGET_LANGUAGE" /> ترجمه شده است</translation> +<translation id="9038649477754266430">استفاده از یک سرویس پیشبینی برای بار کردن سریعتر صفحهها</translation> <translation id="9039213469156557790">علاوه بر این، این صفحه دارای منابع دیگری است که امن نیستند. دیگران میتوانند در حین انتقال، این منابع را ببینند و این منابع میتوانند برای تغییر رفتار صفحه، توسط یک مهاجم تغییر داده شوند.</translation> <translation id="9049981332609050619">شما سعی کردید به <ph name="DOMAIN" /> دسترسی داشته باشید، اما سرور یک گواهی نامعتبر را نشان داد.</translation> <translation id="9050666287014529139">عبارت عبور</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index b0c71e0..2a32cd1 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; tietokoneesi käyttöjärjestelmä ei luota sen suojausvarmenteeseen. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.</translation> <translation id="1152921474424827756">Käytä osoitteen <ph name="URL" /> <ph name="BEGIN_LINK" />välimuistiversiota<ph name="END_LINK" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> katkaisi yhteyden yllättäen.</translation> +<translation id="1161325031994447685">Muodosta yhteys Wi-Fi-verkkoon uudelleen.</translation> <translation id="1175364870820465910">Tulo&sta...</translation> <translation id="1181037720776840403">Poista</translation> <translation id="1195447618553298278">Tuntematon virhe.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Käyttäjäkäytännöt</translation> <translation id="1644184664548287040">Verkkoasetukset ovat virheelliset eikä niitä voi tuoda.</translation> <translation id="1644574205037202324">Historia</translation> +<translation id="1645368109819982629">Protokollaa ei tueta</translation> <translation id="1655462015569774233">{1,plural, =1{Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne vanhentui eilen. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä. Tietokoneesi kellonaika on tällä hetkellä <ph name="CURRENT_DATE" />. Onko se oikein? Jos ei, korjaa järjestelmän kellonaika ja päivitä sivu.}other{Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne vanhentui # päivää sitten. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä. Tietokoneesi kellonaika on tällä hetkellä <ph name="CURRENT_DATE" />. Onko se oikein? Jos ei, korjaa järjestelmän kellonaika ja päivitä sivu.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> suojaa tietosi normaalisti salauksen avulla. Kun Chrome yritti tällä kertaa yhdistää sivustoon <ph name="SITE" />, sivusto palautti epätavalliset ja virheelliset kirjautumistiedot. Hyökkääjä saattaa yrittää esiintyä sivustona <ph name="SITE" />, tai Wi-Fi-kirjautumisruutu on keskeyttänyt yhteyden. Tietosi ovat edelleen turvassa, sillä Google Chrome katkaisi yhteyden, ennen kuin mitään tietoja vaihdettiin.</translation> <translation id="168841957122794586">Palvelinvarmenne sisältää heikon salausavaimen.</translation> <translation id="1706954506755087368">{1,plural, =1{Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne on päivätty huomiselle. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.}other{Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne on päivätty # päivää tulevaisuuteen. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.}}</translation> <translation id="1710259589646384581">Käyttöjärjestelmä</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Ota yhteyttä järjestelmänvalvojaan.</translation> <translation id="17513872634828108">Avoimet välilehdet</translation> <translation id="1753706481035618306">Sivunumero</translation> <translation id="1763864636252898013">Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; laitteesi käyttöjärjestelmä ei luota sen suojausvarmenteeseen. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Välityspalvelimen asetus: automaattisesti määritetty.</translation> <translation id="2025623846716345241">Vahvista päivitys</translation> <translation id="2030481566774242610">Tarkoititko: <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Tarkista välityspalvelimen ja palomuurin määritykset.<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Postinumero</translation> <translation id="2065985942032347596">Käyttöoikeustarkistus pakollinen</translation> <translation id="2079545284768500474">Kumoa</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Käytäntöä ei löydy</translation> <translation id="2213606439339815911">Noudetaan merkintöjä…</translation> <translation id="2214283295778284209"><ph name="SITE" /> ei ole käytettävissä</translation> +<translation id="2227695659599072496">Tarkista verkkokaapeli tai reititin.</translation> +<translation id="2230458221926704099">Korjaa yhteytesi käyttämällä <ph name="BEGIN_LINK" />diagnostiikkasovellusta<ph name="END_LINK" />.</translation> <translation id="225207911366869382">Tämän käytännön arvo on vanhentunut.</translation> <translation id="2262243747453050782">HTTP-virhe</translation> <translation id="2279770628980885996">Palvelin kohtasi odottamattoman tilan yrittäessään toteuttaa pyyntöä.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON-jäsentäjä</translation> <translation id="2495093607237746763">Jos tämä on valittu, Chromium tallentaa kortin kopion tälle laitteelle nopeuttaakseen lomakkeiden täyttöä.</translation> <translation id="2498091847651709837">Skannaa uusi kortti</translation> +<translation id="2515629240566999685">Tarkista alueesi mobiilisignaali.</translation> <translation id="2516305470678292029">Käyttöliittymävaihtoehdot</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> lähetti virheellisen vastauksen.</translation> <translation id="2552545117464357659">Uudempi</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Luo kirjanmerkki tälle sivulle</translation> <translation id="3270847123878663523">K&umoa uudelleenjärjestely</translation> <translation id="3286538390144397061">Käynnistä uudelleen</translation> +<translation id="3288003805934695103">Lataa sivu uudelleen.</translation> <translation id="3305707030755673451">Tietosi salattiin synkronoinnin tunnuslauseesi avulla <ph name="TIME" />. Aloita synkronointi antamalla tunnuslause.</translation> <translation id="333371639341676808">Estä tätä sivua luomasta muita viestejä.</translation> <translation id="3340978935015468852">asetuksissa</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Ladataan...</translation> <translation id="3712624925041724820">Käyttöluvat ovat lopussa</translation> +<translation id="3714780639079136834">Ota mobiilidata tai Wi-Fi käyttöön.</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Tarkista välityspalvelimen, palomuurin ja nimipalvelun määritykset<ph name="END_LINK" />.</translation> <translation id="3739623965217189342">Kopioimasi linkki</translation> <translation id="3744899669254331632">Et voi siirtyä sivustoon <ph name="SITE" /> tällä hetkellä, koska sivusto lähetti salatut kirjautumistiedot, joita Chromium ei osaa käsitellä. Verkkovirheet ja hyökkäykset ovat yleensä väliaikaisia, joten sivu toimii luultavasti myöhemmin.</translation> <translation id="3748412725338508953">Uudelleenohjauksia oli liian monta.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Lukijatila</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> on estetty</translation> <translation id="4021036232240155012">DNS on verkkopalvelu, joka kääntää verkkosivuston nimen sen internetosoitteeksi.</translation> +<translation id="4021376465026729077">Poista laajennukset käytöstä.</translation> <translation id="4030383055268325496">K&umoa lisäys</translation> <translation id="4032534284272647190">Pääsy sivulle <ph name="URL" /> kielletty.</translation> <translation id="404928562651467259">Varoitus</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Virheellinen vahvistusallekirjoitus.</translation> <translation id="4176463684765177261">Pois käytöstä</translation> <translation id="4196861286325780578">&Toista siirto</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Tarkista palomuurin ja virustorjuntaohjelmiston määritykset.<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Kaatuu</translation> <translation id="4250680216510889253">Ei</translation> <translation id="4258748452823770588">Virheellinen allekirjoitus</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">Välityspalvelinta ei saa käyttää, mutta erilliset välityspalvelimen asetukset on määritetty.</translation> <translation id="4492190037599258964">Hakutulokset kyselylle <ph name="SEARCH_STRING" /></translation> <translation id="4506176782989081258">Todennusvirhe: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Ota yhteyttä järjestelmänvalvojaan.</translation> <translation id="450710068430902550">Jakaminen järjestelmänvalvojan kanssa</translation> <translation id="4522570452068850558">Tiedot</translation> <translation id="4535734014498033861">Välityspalvelinyhteys epäonnistui.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">Tietoja Google-kääntäjästä</translation> <translation id="5040262127954254034">Tietosuoja</translation> <translation id="5045550434625856497">Väärä salasana</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Tarkista välityspalvelimen osoite.<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Palvelimen varmenne ei ole tällä hetkellä kelvollinen.</translation> <translation id="5089810972385038852">Osavaltio/alue</translation> <translation id="5094747076828555589">Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; Chromium ei luota sen suojausvarmenteeseen. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Vahvista liikkuminen</translation> <translation id="5299298092464848405">Virhe jäsennettäessä käytäntöä</translation> <translation id="5300589172476337783">Näytä</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Tyhjennä evästeet.<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Kaatumisraportit on poistettu käytöstä.</translation> <translation id="5317780077021120954">Tallenna</translation> <translation id="5327248766486351172">Nimi</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Lataa uudelleen</translation> <translation id="5565735124758917034">Aktiivinen</translation> <translation id="560412284261940334">Hallintaa ei tueta</translation> +<translation id="5610142619324316209">Tarkista yhteys.</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> uudelleenohjasi sinut liian monta kertaa.</translation> <translation id="5629630648637658800">Käytännön asetuksien lataaminen epäonnistui</translation> <translation id="5631439013527180824">Laitteenhallintatunnus on virheellinen</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Kortti vahvistettiin.</translation> <translation id="6146055958333702838">Tarkista kaikki kaapelit ja käynnistä uudelleen reitittimet, modeemit ja muut käytössä olevat verkkolaitteet.</translation> +<translation id="614940544461990577">Kokeile seuraavia toimenpiteitä:</translation> <translation id="6151417162996330722">Palvelimen varmenteen voimassaoloaika on liian pitkä.</translation> <translation id="6154808779448689242">Palautettu käytännön tunnus ei vastaa nykyistä tunnusta</translation> <translation id="6165508094623778733">Lisätietoja</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" />-haku</translation> <translation id="6634865548447745291">Et voi siirtyä sivustoon <ph name="SITE" /> juuri nyt, koska <ph name="BEGIN_LINK" />tämä varmenne on kumottu<ph name="END_LINK" />. Verkkovirheet ja hyökkäykset ovat yleensä väliaikaisia, joten sivu luultavasti toimii myöhemmin.</translation> <translation id="6637478299472506933">Lataus epäonnistui</translation> +<translation id="6642894344118208103">Käynnistä modeemi tai reititin uudelleen.</translation> <translation id="6644283850729428850">Tämä käytäntö on vanhentunut.</translation> <translation id="6646897916597483132">Anna nelinumeroinen CVC luottokortin etupuolelta.</translation> <translation id="6656103420185847513">Muokkaa kansiota</translation> <translation id="6660210980321319655">Ilmoitus tehtiin automaattisesti <ph name="CRASH_TIME" />.</translation> <translation id="6671697161687535275">Poistetaanko lomake-ehdotus Chromiumista?</translation> +<translation id="6685834062052613830">Kirjaudu ulos ja suorita määritys loppuun.</translation> <translation id="6710213216561001401">Edellinen</translation> <translation id="6711464428925977395">Välityspalvelimessa on jotain vikaa tai osoite on virheellinen.</translation> <translation id="674375294223700098">Tuntematon palvelimen varmennevirhe.</translation> @@ -515,6 +534,7 @@ <translation id="7052500709156631672">Yhdyskäytävä tai välityspalvelin vastaanotti palvelimelta virheellisen vastauksen.</translation> <translation id="7087282848513945231">Kunta</translation> <translation id="7088615885725309056">Vanhempi</translation> +<translation id="7090678807593890770">Tee Google-haku: <ph name="LINK" /></translation> <translation id="7108649287766967076">Käännös kielelle <ph name="TARGET_LANGUAGE" /> epäonnistui.</translation> <translation id="7139724024395191329">Emiirikunta</translation> <translation id="7179921470347911571">Käynnistä uudelleen</translation> @@ -607,6 +627,7 @@ <translation id="8034955203865359138">Historiamerkintöjä ei löytynyt.</translation> <translation id="8088680233425245692">Artikkelin näyttäminen epäonnistui.</translation> <translation id="8091372947890762290">Aktivointi odottaa palvelimella</translation> +<translation id="8134994873729925007">Isäntänimen <ph name="HOST_NAME" /> palvelimen <ph name="BEGIN_ABBR" />DNS-osoitetta<ph name="END_ABBR" /> ei löytynyt.</translation> <translation id="8149426793427495338">Tietokoneesi siirtyi virransäästötilaan.</translation> <translation id="8150722005171944719">Tiedosto osoitteessa <ph name="URL" /> ei ole luettavissa. Se on voitu poistaa tai siirtää, tai tiedoston käyttöluvat voivat estää sen käytön.</translation> <translation id="8194797478851900357">K&umoa siirto</translation> @@ -633,6 +654,7 @@ <translation id="8311778656528046050">Haluatko varmasti päivittää tämän sivun?</translation> <translation id="8332188693563227489">Sivuston <ph name="HOST_NAME" /> käyttöoikeus evättiin</translation> <translation id="8349305172487531364">Kirjanmerkkipalkki</translation> +<translation id="8363502534493474904">Poista lentokonetila käytöstä.</translation> <translation id="8364627913115013041">Ei määritetty.</translation> <translation id="8412145213513410671">Kaatumiset (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Kirjoita sama tunnuslause kahdesti.</translation> @@ -690,6 +712,7 @@ <translation id="901974403500617787">Koko järjestelmään vaikuttavat merkinnät voi tehdä vain omistaja: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Palvelin esti yhteyden.</translation> <translation id="9020542370529661692">Sivu on käännetty kielelle <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Ennakointipalvelun avulla voit ladata sivuja nopeammin</translation> <translation id="9039213469156557790">Tällä sivulla on kuitenkin muita osia, jotka eivät ole suojattuja. Muut voivat tarkastella näitä osia siirron aikana, ja hyökkääjä voi muuttaa sivun käyttäytymistä muokkaamalla näitä osia.</translation> <translation id="9049981332609050619">Yritit muodostaa yhteyden verkkotunnukseen <ph name="DOMAIN" />, mutta palvelin esitti virheellisen varmenteen.</translation> <translation id="9050666287014529139">Tunnuslause</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 7ab90ad..d685046 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Hindi mapatunayan ng server na ito na ito ay <ph name="DOMAIN" />; hindi pinagkakatiwalaan ng operating system ng iyong computer ang certificate ng seguridad nito. Maaaring dulot ito ng maling configuration o isang umaatake na hinahadlangan ang iyong koneksyon.</translation> <translation id="1152921474424827756">Mag-access ng <ph name="BEGIN_LINK" />naka-cache na kopya<ph name="END_LINK" /> ng <ph name="URL" /></translation> <translation id="1158211211994409885">Pinutol ng <ph name="HOST_NAME" /> ang koneksyon nang hindi inaasahan.</translation> +<translation id="1161325031994447685">Muling kumonekta sa Wi-Fi</translation> <translation id="1175364870820465910">&I-print...</translation> <translation id="1181037720776840403">Alisin</translation> <translation id="1195447618553298278">Hindi kilalang error.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Mga patakaran ng user</translation> <translation id="1644184664548287040">Di-wasto ang configuration ng network at hindi maaaring i-import.</translation> <translation id="1644574205037202324">History</translation> +<translation id="1645368109819982629">Hindi sinusuportahang protocol</translation> <translation id="1655462015569774233">{1,plural, =1{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; nag-expire na ang certificate ng seguridad nito kahapon. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon. Sa kasalukuyan, nakatakda ang orasan ng iyong computer sa <ph name="CURRENT_DATE" />. Mukha bang tama iyon? Kung hindi, dapat mong ayusin ang orasan ng iyong system at pagkatapos ay i-refresh ang page na ito.}one{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; nag-expire na ang certificate ng seguridad nito # araw na ang nakalipas. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon. Sa kasalukuyan, nakatakda ang orasan ng iyong computer sa <ph name="CURRENT_DATE" />. Mukha bang tama iyon? Kung hindi, dapat mong ayusin ang orasan ng iyong system at pagkatapos ay i-refresh ang page na ito.}other{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; nag-expire na ang certificate ng seguridad nito # na araw na ang nakalipas. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon. Sa kasalukuyan, nakatakda ang orasan ng iyong computer sa <ph name="CURRENT_DATE" />. Mukha bang tama iyon? Kung hindi, dapat mong ayusin ang orasan ng iyong system at pagkatapos ay i-refresh ang page na ito.}}</translation> <translation id="1676269943528358898">Karaniwang gumagamit ang <ph name="SITE" /> ng pag-encrypt upang protektahan ang iyong impormasyon. Noong sinubukang kumonekta ng Chrome sa <ph name="SITE" /> sa pagkakataong ito, nagbalik ang website ng mga hindi pangkaraniwan at maling kredensyal. Maaari itong mangyari kapag sinusubukan ng isang attacker na magpanggap bilang <ph name="SITE" />, o naputol ang koneksyon dahil sa isang screen ng pag-sign in sa Wi-Fi. Secure pa rin ang iyong impormasyon dahil inihinto ng Google Chrome ang koneksyon bago magkaroon ng palitan ng anumang data.</translation> <translation id="168841957122794586">Naglalaman ang server certificate ng isang mahinang cryptographic key.</translation> <translation id="1706954506755087368">{1,plural, =1{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; tinatayang mula sa susunod na araw ang certificate ng seguridad nito. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon.}one{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; tinatayang mula sa # araw sa hinaharap ang certificate ng seguridad nito. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon.}other{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; tinatayang mula sa # na araw sa hinaharap ang certificate ng seguridad nito. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Subukang makipag-ugnayan sa admin ng system.</translation> <translation id="17513872634828108">Mga bukas na tab</translation> <translation id="1753706481035618306">Numero ng page</translation> <translation id="1763864636252898013">Hindi mapatunayan ng server na ito na ito ay <ph name="DOMAIN" />; hindi pinagkakatiwalaan ng operating system ng iyong device ang certificate ng seguridad nito. Maaaring dulot ito ng maling configuration o isang umaatake na hinahadlangan ang iyong koneksyon.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Nakatakda sa awtomatikong naka-configure ang proxy.</translation> <translation id="2025623846716345241">Kumpirmahin ang Pag-reload</translation> <translation id="2030481566774242610">Ang ibig mo bang sabihin ay <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Suriin ang proxy at ang firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ZIP code</translation> <translation id="2065985942032347596">Kinakailangan na Pagpapatunay</translation> <translation id="2079545284768500474">I-undo</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Hindi nahanap ang patakaran</translation> <translation id="2213606439339815911">Kinukuha ang mga entry...</translation> <translation id="2214283295778284209"><ph name="SITE" /> ay hindi magagamit</translation> +<translation id="2227695659599072496">Suriin ang cable o router ng network</translation> +<translation id="2230458221926704099">Ayusin ang iyong koneksyon gamit ang <ph name="BEGIN_LINK" />diagnostics app<ph name="END_LINK" /></translation> <translation id="225207911366869382">Hindi na gimagamit ang halagang ito para sa patakarang ito.</translation> <translation id="2262243747453050782">Error sa HTTP</translation> <translation id="2279770628980885996">Nakaranas ng hindi inaasahang kundisyon habang tinatangka ng server na maibigay ang kahilingan.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Pang-parse ng JSON</translation> <translation id="2495093607237746763">Kung may check, mag-iimbak ang Chromium ng kopya ng iyong card sa device na ito para sa mas mabilis na pagsagot sa form.</translation> <translation id="2498091847651709837">Mag-scan ng bagong card</translation> +<translation id="2515629240566999685">Suriin ang signal sa iyong lugar</translation> <translation id="2516305470678292029">Mga Alternatibo sa UI</translation> <translation id="255002559098805027">Nagpadala ng di-wastong tugon ang <ph name="HOST_NAME" />.</translation> <translation id="2552545117464357659">Mas Bago</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">I-bookmark ang page na ito</translation> <translation id="3270847123878663523">&I-undo ang Pagbabago sa Ayos</translation> <translation id="3286538390144397061">I-restart Ngayon</translation> +<translation id="3288003805934695103">I-reload ang page</translation> +<translation id="3305707030755673451">Na-encrypt ang iyong data gamit ang iyong passphrase sa pag-sync noong <ph name="TIME" />. Ilagay ito upang simulan ang pag-sync.</translation> <translation id="333371639341676808">Iwasan ang pahinang ito mula sa paglikha ng karagdagang mga dialog.</translation> <translation id="3340978935015468852">mga setting</translation> <translation id="3355823806454867987">Baguhin ang mga setting ng proxy...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Kumakarga...</translation> <translation id="3712624925041724820">Naubos na ang mga lisensya</translation> +<translation id="3714780639079136834">I-on ang mobile data o Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Suriin ang configuration ng proxy, firewall at DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Link na kinopya mo</translation> <translation id="3744899669254331632">Hindi mo maaaring bisitahin ang <ph name="SITE" /> sa ngayon dahil nagpadala ang website ng mga pinaghalong kredensyal na hindi maproseso ng Chromium. Karaniwang pansamantala ang mga error at pag-atake sa network, kaya malamang na gagana ang page na ito sa ibang pagkakataon.</translation> <translation id="3748412725338508953">Masyadong maraming mga na-redirect.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Reader Mode</translation> <translation id="3973234410852337861">Naka-block ang <ph name="HOST_NAME" /></translation> <translation id="4021036232240155012">Ang DNS ay ang serbisyo sa network na nagta-translate ng pangalan ng isang website sa Internet address nito.</translation> +<translation id="4021376465026729077">I-disable ang iyong mga extension</translation> <translation id="4030383055268325496">&I-undo ang pagdagdag</translation> <translation id="4032534284272647190">Tinanggihan ang pag-access sa <ph name="URL" />.</translation> <translation id="404928562651467259">BABALA</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Hindi wasto ang signature sa pag-verify</translation> <translation id="4176463684765177261">Hindi Pinagana</translation> <translation id="4196861286325780578">&Gawing muli ang paglilipat</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Suriin ang mga configuration ng firewall at antivirus<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Mga Pag-crash</translation> <translation id="4250680216510889253">Hindi</translation> <translation id="4258748452823770588">Maling lagda</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Hindi pinagana ang paggamit ng isang proxy ngunit tinutukoy ang isang tahasang configuration ng proxy.</translation> <translation id="4492190037599258964">Mga resulta ng paghahanap para sa '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Error sa pagpapatunay: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Makipag-ugnayan sa admin ng system</translation> <translation id="450710068430902550">Pagbabahagi sa Administrator</translation> <translation id="4522570452068850558">Mga Detalye</translation> <translation id="4535734014498033861">Nabigo ang koneksyon sa server ng proxy.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Tungkol sa Google Translate</translation> <translation id="5040262127954254034">Privacy</translation> <translation id="5045550434625856497">Hindi wastong password</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Suriin ang proxy address<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Hindi angkop ang certificate ng server sa oras na ito.</translation> <translation id="5089810972385038852">Estado</translation> <translation id="5094747076828555589">Hindi mapatunayan ng server na ito na ito ay <ph name="DOMAIN" />; hindi pinagkakatiwalaan ng Chromium ang certificate ng seguridad nito. Maaaring dulot ito ng maling configuration o isang umaatake na hinahadlangan ang iyong koneksyon.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Kumpirmahin ang Pag-nabiga</translation> <translation id="5299298092464848405">Error sa pag-parse ng patakaran</translation> <translation id="5300589172476337783">Ipakita</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />I-clear ang iyong cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Hindi pinagana ang pag-uulat ng pag-crash.</translation> <translation id="5317780077021120954">I-save</translation> <translation id="5327248766486351172">Pangalan</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">I-reload</translation> <translation id="5565735124758917034">Aktibo</translation> <translation id="560412284261940334">Hindi sinusuportahan ang pamamahala</translation> +<translation id="5610142619324316209">Suriin ang koneksyon</translation> <translation id="5617949217645503996">Masyadong maraming beses kang na-redirect ng <ph name="HOST_NAME" />.</translation> <translation id="5629630648637658800">Nabigong i-load ang mga setting ng patakaran</translation> <translation id="5631439013527180824">Di-wastong token sa pamamahala ng device</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Na-verify ang iyong card</translation> <translation id="6146055958333702838">Tingnan ang anumang mga kable at i-reboot ang anumang mga router, modem o iba pang mga network device na maaaring ginagamit mo.</translation> +<translation id="614940544461990577">Subukang:</translation> <translation id="6151417162996330722">Masyadong mahaba ang panahon ng pagkakaroon ng bisa ng certificate ng server.</translation> <translation id="6154808779448689242">Hindi tumutugma ang ibinalik na token sa patakaran sa kasalukuyang token</translation> <translation id="6165508094623778733">Matuto nang higit pa</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685">Paghahanap ng <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Hindi mo maaaring bisitahin ang <ph name="SITE" /> sa ngayon dahil <ph name="BEGIN_LINK" />binawi na ang certificate na ito<ph name="END_LINK" />. Kadalasang pansamantala lang ang mga error at atake sa network, kaya malamang na gagana ang page na ito sa ibang pagkakataon.</translation> <translation id="6637478299472506933">Nabigo ang Download</translation> +<translation id="6642894344118208103">I-reset ang modem o router</translation> <translation id="6644283850729428850">Hindi na ginagamit ang patakarang ito.</translation> <translation id="6646897916597483132">Ilagay ang CVC na may 4 na digit mula sa harap ng iyong card</translation> <translation id="6656103420185847513">I-edit ang Folder</translation> <translation id="6660210980321319655">Awtomatikong naiulat noong <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Gusto mo bang alisin ang form para sa suhestyon sa Chromium?</translation> +<translation id="6685834062052613830">Mag-sign out at kumpletuhin ang setup</translation> <translation id="6710213216561001401">Nakaraan</translation> <translation id="6711464428925977395">May problema sa proxy server, o mali ang address.</translation> <translation id="674375294223700098">Hindi alam na error sa certificate ng server</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">Nakatanggap ang gateway o proxy server ng di-wastong pagtugon mula sa upstream server.</translation> <translation id="7087282848513945231">County</translation> <translation id="7088615885725309056">Mas Nauna</translation> +<translation id="7090678807593890770">Hanapin sa Google ang <ph name="LINK" /></translation> <translation id="7108649287766967076">Nabigo ang pag-translate sa <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">Emirate</translation> <translation id="7179921470347911571">Ilunsad Muli Ngayon</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Walang nakitang mga entry ng kasaysayan.</translation> <translation id="8088680233425245692">Hindi natingnan ang artikulo.</translation> <translation id="8091372947890762290">Nakabinbin sa server ang pag-activate</translation> +<translation id="8134994873729925007">Hindi makita ang <ph name="BEGIN_ABBR" />DNS address<ph name="END_ABBR" /> ng server ng <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Nag-sleep ang iyong computer.</translation> <translation id="8150722005171944719">Hindi nababasa ang file sa <ph name="URL" />. Maaaring ito ay naalis, nalipat, o maaaring pinipigilan ng mga pagpapahintulot ng file ang access.</translation> <translation id="8194797478851900357">&I-undo ang Paglilipat</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Sigurado ka bang nais mong i-reload ang pahinang ito?</translation> <translation id="8332188693563227489">Tinanggihan ang access sa <ph name="HOST_NAME" /></translation> <translation id="8349305172487531364">Bookmarks bar</translation> +<translation id="8363502534493474904">I-off ang airplane mode</translation> <translation id="8364627913115013041">Hindi nakatakda.</translation> <translation id="8412145213513410671">Mga Pag-crash (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Dapat mong ilagay ang parehong passphrase nang dalawang beses.</translation> @@ -692,6 +715,7 @@ <translation id="901974403500617787">Ang may-ari lang ang maaaring magtakda ng mga flag na nalalapat sa buong system: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Tinanggihan ng server ang koneksyon.</translation> <translation id="9020542370529661692">Na-translate sa <ph name="TARGET_LANGUAGE" /> ang pahinang ito</translation> +<translation id="9038649477754266430">Gumamit ng serbisyo sa paghula upang ma-load ang mga page nang mas mabilis</translation> <translation id="9039213469156557790">Bukod pa rito, ang page na ito ay may iba pang mga mapagkukunang hindi secure. Makikita ng iba ang mga mapagkukunang ito habang ipinadadala, at maaaring baguhin ng isang umaatake upang baguhin ang gawi ng page.</translation> <translation id="9049981332609050619">Tinangka mong maabot ang <ph name="DOMAIN" />, ngunit nagpakita ang server ng isang di-wastong certificate.</translation> <translation id="9050666287014529139">Passphrase</translation> @@ -705,6 +729,7 @@ <translation id="9170848237812810038">&I-undo</translation> <translation id="917450738466192189">Di-wastong certificate ng server.</translation> <translation id="9183425211371246419">Gumagamit ng hindi sinusuportahang protocol ang <ph name="HOST_NAME" />.</translation> +<translation id="9205078245616868884">Na-encrypt ang iyong data gamit ang iyong passphrase sa pag-sync. Ilagay ito upang simulan ang pag-sync.</translation> <translation id="9207861905230894330">Hindi naidagdag ang artikulo.</translation> <translation id="933612690413056017">Walang koneksyon sa Internet</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 271a7f9..08c99743 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Impossible de vérifier sur le serveur qu'il s'agit bien du domaine <ph name="DOMAIN" />, car son certificat de sécurité n'est pas considéré comme fiable par le système d'exploitation de votre ordinateur. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.</translation> <translation id="1152921474424827756">Accédez à une <ph name="BEGIN_LINK" />copie mise en cache<ph name="END_LINK" /> de <ph name="URL" />.</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> a mis fin à la connexion de manière inattendue.</translation> +<translation id="1161325031994447685">Se reconnecter au réseau Wi-Fi</translation> <translation id="1175364870820465910">Im&primer...</translation> <translation id="1181037720776840403">Supprimer</translation> <translation id="1195447618553298278">Erreur inconnue</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Règles relatives aux utilisateurs</translation> <translation id="1644184664548287040">Impossible d'importer la configuration du réseau : elle n'est pas valide.</translation> <translation id="1644574205037202324">Historique</translation> +<translation id="1645368109819982629">Protocole incompatible</translation> <translation id="1655462015569774233">{1,plural, =1{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car son certificat de sécurité a expiré hier. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique. L'horloge de votre ordinateur indique actuellement : <ph name="CURRENT_DATE" />. Cela vous semble-t-il correct ? Si ce n'est pas le cas, vous devez corriger l'horloge de votre système, puis actualiser la page.}one{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car son certificat de sécurité a expiré il y a # jour. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique. L'horloge de votre ordinateur indique actuellement : <ph name="CURRENT_DATE" />. Cela vous semble-t-il correct ? Si ce n'est pas le cas, vous devez corriger l'horloge de votre système, puis actualiser la page.}other{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car son certificat de sécurité a expiré il y a # jours. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique. L'horloge de votre ordinateur indique actuellement : <ph name="CURRENT_DATE" />. Cela vous semble-t-il correct ? Si ce n'est pas le cas, vous devez corriger l'horloge de votre système, puis actualiser la page.}}</translation> <translation id="1676269943528358898">Un chiffrement est normalement utilisé sur le site <ph name="SITE" /> pour protéger vos informations. Lors de la dernière tentative de connexion de Google Chrome au site <ph name="SITE" />, des identifiants inhabituels et incorrects ont été retournés. Il est possible qu'un individu malveillant tente de se faire passer pour <ph name="SITE" /> ou qu'un écran de connexion Wi-Fi ait interrompu la connexion. Vos informations restent sécurisées, car nous avons arrêté la connexion avant l'échange des données.</translation> <translation id="168841957122794586">Le certificat du serveur contient une clé de chiffrement faible.</translation> <translation id="1706954506755087368">{1,plural, =1{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car la date d'émission de son certificat de sécurité est fixée à demain. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.}one{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car la date d'émission de son certificat de sécurité est ultérieure de # jour à la date du jour. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.}other{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car la date d'émission de son certificat de sécurité est ultérieure de # jours à la date du jour. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.}}</translation> <translation id="1710259589646384581">Système d'exploitation</translation> <translation id="1734864079702812349">American Express</translation> +<translation id="1734878702283171397">Essayez de contacter l'administrateur système.</translation> <translation id="17513872634828108">Onglets ouverts</translation> <translation id="1753706481035618306">Numéro de page</translation> <translation id="1763864636252898013">Impossible de vérifier sur le serveur qu'il s'agit bien du domaine <ph name="DOMAIN" />, car son certificat de sécurité n'est pas considéré comme fiable par le système d'exploitation de votre appareil. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Le proxy est défini sur la configuration automatique.</translation> <translation id="2025623846716345241">Confirmer l'actualisation</translation> <translation id="2030481566774242610">Essayez avec <ph name="LINK" /></translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Vérifier le proxy et le pare-feu<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Code postal</translation> <translation id="2065985942032347596">Authentification requise</translation> <translation id="2079545284768500474">Annuler</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Règle introuvable.</translation> <translation id="2213606439339815911">Obtention des entrées en cours…</translation> <translation id="2214283295778284209"><ph name="SITE" /> n'est pas accessible</translation> +<translation id="2227695659599072496">Vérifier le câble réseau ou le routeur</translation> +<translation id="2230458221926704099">Vérifiez la connexion à l'aide de l'<ph name="BEGIN_LINK" />application de diagnostic<ph name="END_LINK" />.</translation> <translation id="225207911366869382">Cette valeur n'est plus utilisée dans le cadre de cette règle.</translation> <translation id="2262243747453050782">Erreur HTTP.</translation> <translation id="2279770628980885996">Une situation inattendue s'est produite tandis que le serveur tentait de traiter la demande.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Analyse de fichiers JSON</translation> <translation id="2495093607237746763">Si cette case est cochée, Chromium enregistre une copie de votre carte sur cet appareil pour vous permettre de remplir plus rapidement les formulaires.</translation> <translation id="2498091847651709837">Lire une nouvelle carte</translation> +<translation id="2515629240566999685">Vérifier le signal dans votre zone</translation> <translation id="2516305470678292029">Alternatives pour l'interface utilisateur</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> a envoyé une réponse incorrecte.</translation> <translation id="2552545117464357659">Récent</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Ajouter cette page aux favoris</translation> <translation id="3270847123878663523">&Annuler la réorganisation</translation> <translation id="3286538390144397061">Redémarrer maintenant</translation> +<translation id="3288003805934695103">Recharger la page</translation> +<translation id="3305707030755673451">Vos données ont été chiffrées avec votre phrase secrète de synchronisation le <ph name="TIME" />. Saisissez-la pour lancer la synchronisation.</translation> <translation id="333371639341676808">Empêcher cette page de générer des boîtes de dialogue supplémentaires</translation> <translation id="3340978935015468852">paramètres</translation> <translation id="3355823806454867987">Modifier les paramètres du proxy...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Chargement...</translation> <translation id="3712624925041724820">Licences épuisées.</translation> +<translation id="3714780639079136834">Activer les données mobiles ou le réseau Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Vérifier les configurations du proxy, du pare-feu et du DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Lien copié</translation> <translation id="3744899669254331632"><ph name="SITE" /> est actuellement inaccessible. Le site Web a envoyé des identifiants brouillés inutilisables par Chromium. Les erreurs de réseau et les attaques étant généralement temporaires, cette page devrait à nouveau fonctionner ultérieurement.</translation> <translation id="3748412725338508953">Trop de redirections</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Mode lecture</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> est bloqué</translation> <translation id="4021036232240155012">DNS est le service Web qui convertit les noms de sites Web en adresses Internet.</translation> +<translation id="4021376465026729077">Désactiver les extensions</translation> <translation id="4030383055268325496">&Annuler l'ajout</translation> <translation id="4032534284272647190">Accès à <ph name="URL" /> refusé.</translation> <translation id="404928562651467259">AVERTISSEMENT</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Signature de validation non valide.</translation> <translation id="4176463684765177261">Désactivé</translation> <translation id="4196861286325780578">&Rétablir le déplacement</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Vérifier les configurations du pare-feu et de l'antivirus<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Plantages</translation> <translation id="4250680216510889253">Non</translation> <translation id="4258748452823770588">Signature incorrecte.</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">L'utilisation d'un proxy est désactivée, mais une configuration de proxy explicite est spécifiée.</translation> <translation id="4492190037599258964">Résultats de recherche pour "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Erreur de validation : <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4506599922270137252">Contacter l'administrateur système</translation> <translation id="450710068430902550">Partage avec l'administrateur</translation> <translation id="4522570452068850558">Détails</translation> <translation id="4535734014498033861">Échec de la connexion au serveur proxy.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">À propos de Google Traduction</translation> <translation id="5040262127954254034">Confidentialité</translation> <translation id="5045550434625856497">Mot de passe incorrect.</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Vérifier l'adresse du proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Le certificat actuel du serveur n'est pas valide.</translation> <translation id="5089810972385038852">État</translation> <translation id="5094747076828555589">Impossible de vérifier sur le serveur qu'il s'agit bien du domaine <ph name="DOMAIN" />, car son certificat de sécurité n'est pas considéré comme fiable par Chromium. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Confirmer la navigation</translation> <translation id="5299298092464848405">Erreur d'analyse de la règle.</translation> <translation id="5300589172476337783">Afficher</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Supprimer les cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">L'envoi de rapports d'erreur est désactivé.</translation> <translation id="5317780077021120954">Enregistrer</translation> <translation id="5327248766486351172">Nom</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Actualiser</translation> <translation id="5565735124758917034">Actif</translation> <translation id="560412284261940334">Gestion non acceptée.</translation> +<translation id="5610142619324316209">Vérifier la connexion</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> vous a redirigé à de trop nombreuses reprises.</translation> <translation id="5629630648637658800">Échec du chargement des paramètres de la règle.</translation> <translation id="5631439013527180824">Jeton de gestion de l'appareil non valide.</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Votre carte a bien été validée.</translation> <translation id="6146055958333702838">Vérifiez les câbles et redémarrez votre routeur, votre modem ou tout autre périphérique réseau utilisé.</translation> +<translation id="614940544461990577">Essayez les suggestions ci-dessous :</translation> <translation id="6151417162996330722">La durée de validité du certificat du serveur est trop longue.</translation> <translation id="6154808779448689242">Le jeton de la règle renvoyé ne correspond pas au jeton actuel.</translation> <translation id="6165508094623778733">En savoir plus</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685">Recherche <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Vous ne pouvez pas consulter le site <ph name="SITE" /> pour le moment, car ce <ph name="BEGIN_LINK" />certificat a été révoqué<ph name="END_LINK" />. Les erreurs réseau et les attaques sont généralement temporaires. Vous devriez donc pouvoir accéder à cette page ultérieurement.</translation> <translation id="6637478299472506933">Échec téléchargement</translation> +<translation id="6642894344118208103">Réinitialiser le modem ou le routeur</translation> <translation id="6644283850729428850">Cette règle est obsolète.</translation> <translation id="6646897916597483132">Saisissez le code CVC à quatre chiffres indiqué au recto de votre carte.</translation> <translation id="6656103420185847513">Modifier le dossier</translation> <translation id="6660210980321319655">Signalé automatiquement le <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Supprimer la suggestion de saisie de formulaire de Chromium ?</translation> +<translation id="6685834062052613830">Déconnectez-vous et complétez la configuration.</translation> <translation id="6710213216561001401">Précédent</translation> <translation id="6711464428925977395">Le serveur proxy présente une erreur, ou l'adresse est incorrecte.</translation> <translation id="674375294223700098">Erreur inconnue liée au certificat du serveur.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">La passerelle ou le serveur proxy a reçu une réponse incorrecte d'un serveur en amont.</translation> <translation id="7087282848513945231">Comté</translation> <translation id="7088615885725309056">Ancien</translation> +<translation id="7090678807593890770">Effectuez une recherche Google sur <ph name="LINK" />.</translation> <translation id="7108649287766967076">Échec de la traduction en <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">Émirat</translation> <translation id="7179921470347911571">Relancer maintenant</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Aucune entrée d'historique trouvée.</translation> <translation id="8088680233425245692">Échec de l'affichage de l'article.</translation> <translation id="8091372947890762290">Activation en attente sur le serveur.</translation> +<translation id="8134994873729925007">Impossible de trouver l'<ph name="BEGIN_ABBR" />adresse DNS<ph name="END_ABBR" /> du serveur <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Votre ordinateur s'est mis en veille.</translation> <translation id="8150722005171944719">Le fichier disponible à l'adresse <ph name="URL" /> n'est pas lisible. Il est possible qu'il ait été supprimé ou déplacé, ou que les autorisations associées empêchent d'y accéder.</translation> <translation id="8194797478851900357">&Annuler le déplacement</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Voulez-vous vraiment actualiser cette page ?</translation> <translation id="8332188693563227489">L'accès à <ph name="HOST_NAME" /> a été refusé</translation> <translation id="8349305172487531364">Barre de favoris</translation> +<translation id="8363502534493474904">Désactiver le mode Avion</translation> <translation id="8364627913115013041">Non définie</translation> <translation id="8412145213513410671">Erreurs (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Vous devez saisir deux fois la même phrase secrète.</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">Seul le propriétaire suivant peut définir les options qui s'appliquent à tout le système : <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Le serveur a refusé la connexion.</translation> <translation id="9020542370529661692">Cette page a été traduite en <ph name="TARGET_LANGUAGE" />.</translation> +<translation id="9038649477754266430">Utiliser un service de prédiction pour charger les pages plus rapidement</translation> <translation id="9039213469156557790">De plus, cette page inclut d'autres ressources qui ne sont pas sécurisées. Ces ressources peuvent être consultées par des tiers pendant leur transfert, et modifiées par un pirate informatique dans le but de changer le comportement de cette page.</translation> <translation id="9049981332609050619">Vous avez tenté de contacter <ph name="DOMAIN" />, mais le certificat présenté par le serveur est incorrect.</translation> <translation id="9050666287014529139">Phrase secrète</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">Ann&uler</translation> <translation id="917450738466192189">Le certificat du serveur n'est pas valide.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> utilise un protocole incompatible.</translation> +<translation id="9205078245616868884">Vos données sont chiffrées avec votre phrase secrète de synchronisation. Saisissez-la pour lancer la synchronisation.</translation> <translation id="9207861905230894330">Échec de l'ajout de l'article.</translation> <translation id="933612690413056017">Aucune connexion Internet</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 7603675..84d26c8 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર તમારા કમ્પ્યુટરની ઑપરેટિંગ સિસ્ટમ દ્વારા વિશ્વસનીય નથી. આ કોઈ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઈ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.</translation> <translation id="1152921474424827756"><ph name="URL" /> ની <ph name="BEGIN_LINK" />કેશ કરેલ કૉપિ<ph name="END_LINK" /> ઍક્સેસ કરો</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> એ અનપેક્ષિત રીતે કનેક્શન બંધ કર્યું.</translation> +<translation id="1161325031994447685">Wi-Fi સાથે ફરીથી કનેક્ટ કરીને</translation> <translation id="1175364870820465910">&છાપો...</translation> <translation id="1181037720776840403">દૂર કરો</translation> <translation id="1195447618553298278">અજ્ઞાત ભૂલ.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">વપરાશકર્તા નીતિઓ</translation> <translation id="1644184664548287040">નેટવર્ક ગોઠવણી અમાન્ય છે અને આયાત કરી શકાઇ નથી.</translation> <translation id="1644574205037202324">ઇતિહાસ</translation> +<translation id="1645368109819982629">અસમર્થિત પ્રોટોકોલ</translation> <translation id="1655462015569774233">{1,plural, =1{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેના સુરક્ષા પ્રમાણપત્રની સમય સીમા ગઈકાલે સમાપ્ત થઈ ગઈ. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે. તમારા કમ્પ્યુટરની ઘડિયાળને હાલમાં <ph name="CURRENT_DATE" /> પર સેટ કરવામાં આવી છે. શું તે બરાબર લાગે છે? જો ઠીક ન લાગતી હોય, તો તમારે તમારી સિસ્ટમની ઘડિયાળને ઠીક કરવી જોઈએ અને પછી આ પૃષ્ઠ તાજું કરવું જોઈએ.}one{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેના સુરક્ષા પ્રમાણપત્રની સમય સીમા # દિવસ પહેલાં સમાપ્ત થઈ ગઈ. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે. તમારા કમ્પ્યુટરની ઘડિયાળને હાલમાં <ph name="CURRENT_DATE" /> પર સેટ કરવામાં આવી છે. શું તે બરાબર લાગે છે? જો ઠીક ન લાગતી હોય, તો તમારે તમારી સિસ્ટમની ઘડિયાળને ઠીક કરવી જોઈએ અને પછી આ પૃષ્ઠ તાજું કરવું જોઈએ.}other{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેના સુરક્ષા પ્રમાણપત્રની સમય સીમા # દિવસ પહેલાં સમાપ્ત થઈ ગઈ. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે. તમારા કમ્પ્યુટરની ઘડિયાળને હાલમાં <ph name="CURRENT_DATE" /> પર સેટ કરવામાં આવી છે. શું તે બરાબર લાગે છે? જો ઠીક ન લાગતી હોય, તો તમારે તમારી સિસ્ટમની ઘડિયાળને ઠીક કરવી જોઈએ અને પછી આ પૃષ્ઠ તાજું કરવું જોઈએ.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> સામાન્ય રીતે તમારી માહિતીને સુરક્ષિત રાખવા માટે એન્ક્રિપ્શનનો ઉપયોગ કરે છે. જ્યારે આ સમયે Google Chrome દ્વારા <ph name="SITE" /> થી કનેક્ટ કરવાનો પ્રયાસ થયો, ત્યારે વેબસાઇટે અસામાન્ય અને ખોટા ઓળખાણપત્રોને પાછા મોકલ્યાં. આવું ત્યારે થઇ શકે જ્યારે કોઈ હુમલાખોર <ph name="SITE" /> હોવાનો ડોળ કરવાનો પ્રયાસ કરી રહ્યો હોય અથવા કોઈ Wi-Fi સાઇન-ઇન સ્ક્રીને કનેક્શનમાં વિક્ષેપ પાડ્યો હોય. તમારી માહિતી હજી પણ સુરક્ષિત છે કારણ કે Google Chrome એ કોઈપણ ડેટા વિનિમય થાય તે પહેલાં જ કનેક્શન રોકી દીધું.</translation> <translation id="168841957122794586">સર્વર પ્રમાણપત્ર એક નબળી ક્રિપ્ટોગ્રાફિક કી ધરાવે છે.</translation> <translation id="1706954506755087368">{1,plural, =1{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર આવતીકાલથી માનવામાં આવે છે તે પ્રમાણે છે. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.}one{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર માનવામાં આવે છે તે પ્રમાણે ભવિષ્યમાં # દિવસથી છે. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.}other{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર માનવામાં આવે છે તે પ્રમાણે ભવિષ્યમાં # દિવસથી છે. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરવાનો પ્રયાસ કરો.</translation> <translation id="17513872634828108">ટેબ્સ ખોલો</translation> <translation id="1753706481035618306">પૃષ્ઠ નંબર</translation> <translation id="1763864636252898013">આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર તમારા ઉપકરણની ઑપરેટિંગ સિસ્ટમ દ્વારા વિશ્વસનીય નથી. આ કોઈ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઈ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">પ્રોક્સી સ્વતઃ ગોઠવાયેલી પર સેટ છે.</translation> <translation id="2025623846716345241">ફરીથી લોડ કરવાની પુષ્ટિ કરો</translation> <translation id="2030481566774242610">શું તમારો અર્થ <ph name="LINK" /> છે?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />પ્રોક્સી અને ફાયરવોલ તપાસીને<ph name="END_LINK" /></translation> <translation id="2053553514270667976">પિન કોડ</translation> <translation id="2065985942032347596">પ્રમાણીકરણ આવશ્યક</translation> <translation id="2079545284768500474">પૂર્વવત્ કરો</translation> @@ -118,6 +122,8 @@ <translation id="2212735316055980242">નીતિ મળી નથી</translation> <translation id="2213606439339815911">પ્રવિષ્ટિઓનું આનયન કરી રહ્યાં છે...</translation> <translation id="2214283295778284209"><ph name="SITE" /> ઉપલબ્ધ નથી.</translation> +<translation id="2227695659599072496">નેટવર્ક કેબલ અથવા રાઉટર તપાસીને</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />ડાયગ્નોસ્ટિક્સ ઍપ્લિકેશન<ph name="END_LINK" />નો ઉપયોગ કરીને તમારું કનેક્શન ઠીક કરો</translation> <translation id="225207911366869382">આ નીતિ માટે આ મૂલ્યને નાપસંદ કરેલું છે.</translation> <translation id="2262243747453050782">HTTP ભૂલ</translation> <translation id="2279770628980885996">જ્યારે સર્વર વિનંતીને પૂરી કરવાનો પ્રયત્ન કરી રહ્યું હતું ત્યારે કોઈ અનપેક્ષિત સ્થિતિ આવી હતી.</translation> @@ -145,6 +151,7 @@ <translation id="2495083838625180221">JSON વિશ્લેશક</translation> <translation id="2495093607237746763">જો ચેક કરેલું હોય, તો ઝડપથી ફોર્મ ભરવા માટે Chromium આ ઉપકરણ પર તમારા કાર્ડની એક કૉપિ સંગ્રહિત કરશે.</translation> <translation id="2498091847651709837">નવું કાર્ડ સ્કૅન કરો</translation> +<translation id="2515629240566999685">તમારા વિસ્તારમાં સિગ્નલ તપાસીને</translation> <translation id="2516305470678292029">UI વિકલ્પો</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> એ અમાન્ય પ્રતિસાદ મોકલ્યો.</translation> <translation id="2552545117464357659">વધુ નવું</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">આ પૃષ્ઠને બુકમાર્ક કરો</translation> <translation id="3270847123878663523">&પુનઃક્રમાંકિત કરવું પૂર્વવત્ કરો</translation> <translation id="3286538390144397061">હવે ફરીથી પ્રારંભ કરો</translation> +<translation id="3288003805934695103">પૃષ્ઠ ફરીથી લોડ કરીને</translation> +<translation id="3305707030755673451">તમારો ડેટા <ph name="TIME" /> ના રોજ તમારા સમન્વયન પાસફ્રેઝ સાથે એન્ક્રિપ્ટ કરવામાં આવ્યો હતો. સમન્વયન શરૂ કરવા માટે તે દાખલ કરો.</translation> <translation id="333371639341676808">આ પૃષ્ઠને વધારાનાં સંવાદો બનાવવાથી રોકો.</translation> <translation id="3340978935015468852">સેટિંગ્સ</translation> <translation id="3355823806454867987">પ્રોક્સી સેટિંગ્સ બદલો...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">લોડ કરી રહ્યું છે...</translation> <translation id="3712624925041724820">લાઇસેંસીસ પૂર્ણ</translation> +<translation id="3714780639079136834">મોબાઇલ ડેટા અથવા Wi-Fi ચાલુ કરીને</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />પ્રોક્સી, ફાયરવોલ અને DNS ગોઠવણી તપાસીને<ph name="END_LINK" /></translation> <translation id="3739623965217189342">તમે કૉપિ કરેલ લિંક</translation> <translation id="3744899669254331632">તમે અત્યારે <ph name="SITE" /> ની મુલાકાત લઈ શકતા નથી કારણ કે વેબસાઇટે સ્ક્રૅમ્બલ કરેલ ઓળખાણપત્રો મોકલ્યાં છે જેના પર Chromium પ્રક્રિયા કરી શકતું નથી. નેટવર્ક ભૂલો અને હુમલાઓ સામાન્ય રીતે અસ્થાયી હોય છે, તેથી આ પૃષ્ઠ સંભવતઃ પછીથી કાર્ય કરશે.</translation> <translation id="3748412725338508953">ત્યાં ઘણા બધા રિડાયરેક્ટ્સ હતા.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">રીડર મોડ</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> અવરોધિત છે</translation> <translation id="4021036232240155012">DNS એ નેટવર્ક સેવા છે કે જે વેબસાઇટના નામનો અનુવાદ તેના ઇન્ટરનેટ સરનામાં પર કરે છે.</translation> +<translation id="4021376465026729077">તમારા એક્સ્ટેન્શન્સને અક્ષમ કરીને</translation> <translation id="4030383055268325496">&ઉમેરવું પૂર્વવત્ કરો</translation> <translation id="4032534284272647190"><ph name="URL" /> ની ઍક્સેસ નકારાઈ. </translation> <translation id="404928562651467259">ચેતવણી</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">ખોટી ચકાસણી સહી</translation> <translation id="4176463684765177261">અક્ષમ કરેલું</translation> <translation id="4196861286325780578">&ખસેડવું ફરી કરો</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ફાયરવોલ અને એન્ટીવાઇરસ ગોઠવણી તપાસીને<ph name="END_LINK" /></translation> <translation id="4220128509585149162">ક્રેશેસ</translation> <translation id="4250680216510889253">નહીં</translation> <translation id="4258748452823770588">ખરાબ હસ્તાક્ષર</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">પ્રોક્સીનો ઉપયોગ અક્ષમ કરેલો છે પણ એક સ્પષ્ટ પ્રોક્સી ગોઠવણી ઉલ્લેખિત છે.</translation> <translation id="4492190037599258964">'<ph name="SEARCH_STRING" />' માટે શોધ પરિણામ</translation> <translation id="4506176782989081258">માન્યતા ભૂલ: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરીને</translation> <translation id="450710068430902550">વ્યવસ્થાપક સાથે શેર કરવું</translation> <translation id="4522570452068850558">વિગતો</translation> <translation id="4535734014498033861">પ્રોક્સી સર્વર કનેક્શન નિષ્ફળ.</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">Google અનુવાદ વિશે</translation> <translation id="5040262127954254034">ગોપનીયતા</translation> <translation id="5045550434625856497">ખોટો પાસવર્ડ</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />પ્રોક્સી સરનામું તપાસીને<ph name="END_LINK" /></translation> <translation id="5087286274860437796">સર્વરનું પ્રમાણપત્ર આ સમયે માન્ય નથી.</translation> <translation id="5089810972385038852">રાજ્ય</translation> <translation id="5094747076828555589">આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર Chromium દ્વારા વિશ્વસનીય નથી. આ કોઈ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઈ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">નેવિગેશનની પુષ્ટિ કરો</translation> <translation id="5299298092464848405">ભૂલ વિશ્લેષણ નીતિ</translation> <translation id="5300589172476337783">બતાવો</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />તમારી કૂકીઝને સાફ કરીને<ph name="END_LINK" /></translation> <translation id="5308689395849655368">ક્રેશની જાણ કરવાનું અક્ષમ કર્યું છે.</translation> <translation id="5317780077021120954">સાચવો</translation> <translation id="5327248766486351172">નામ</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">ફરિથી લોડ કરો</translation> <translation id="5565735124758917034">સક્રિય</translation> <translation id="560412284261940334">સંચાલન સમર્થિત નથી</translation> +<translation id="5610142619324316209">કનેક્શન તપાસીને</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> એ તમને ઘણીબધી વખત રીડાયરેક્ટ કર્યું.</translation> <translation id="5629630648637658800">નીતિ સેટિંગ્સ લોડ કરવામાં નિષ્ફળ થયાં</translation> <translation id="5631439013527180824">અમાન્ય ઉપકરણ સંચાલન ટોકન</translation> @@ -434,6 +451,7 @@ <translation id="6093795393556121384">તમારું કાર્ડ ચકાસવામાં આવ્યું છે</translation> <translation id="6146055958333702838">કોઈપણ કેબલ્સ તપાસો અને તમે કદાચ ઉપયોગમાં લઇ રહ્યાં હોય તેવા કોઇપણ રાઉટર્સ, મૉડેમ્સ અથવા અન્ય નેટવર્ક ઉપકરણોને રીબૂટ કરો.</translation> +<translation id="614940544461990577">પ્રયાસ કરો:</translation> <translation id="6151417162996330722">સર્વર પ્રમાણપત્ર પાસે ખૂબ લાંબી હોય એવી માન્યતા અવધિ છે.</translation> <translation id="6154808779448689242">પરત થયેલ નીતિ ટોકન વર્તમાન ટોકનથી મેળ ખાતો નથી</translation> <translation id="6165508094623778733">વધુ જાણો</translation> @@ -475,11 +493,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> શોધ</translation> <translation id="6634865548447745291">તમે અત્યારે <ph name="SITE" /> ની મુલાકાત લઈ શકતાં નથી કારણ કે <ph name="BEGIN_LINK" />આ પ્રમાણપત્ર રદબાતલ કરવામાં આવ્યું છે<ph name="END_LINK" />. નેટવર્ક ભૂલો અને હુમલા સામાન્ય રીતે અસ્થાયી છે, તેથી આ પૃષ્ઠ સંભવિત રૂપે પછીથી કાર્ય કરશે.</translation> <translation id="6637478299472506933">ડાઉનલોડ નિષ્ફળ થયું</translation> +<translation id="6642894344118208103">મોડેમ અથવા રાઉટર ફરીથી સેટ કરીને</translation> <translation id="6644283850729428850">આ નીતિ દૂર કરવામાં આવેલી છે.</translation> <translation id="6646897916597483132">તમારા કાર્ડની આગળની બાજુ પરથી 4-અંકનો CVC દાખલ કરો</translation> <translation id="6656103420185847513">ફોલ્ડર સંપાદિત કરો</translation> <translation id="6660210980321319655">આપમેળે જાણ કરી <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Chromium માંથી ફોર્મ સૂચન દૂર કરીએ?</translation> +<translation id="6685834062052613830">સાઇન આઉટ કરો અને સેટઅપ પૂર્ણ કરો</translation> <translation id="6710213216561001401">પહેલાનું</translation> <translation id="6711464428925977395">પ્રોક્સી સર્વરમાં કંઈક ખોટું થયું છે અથવા તો સરનામું ખોટું છે.</translation> <translation id="674375294223700098">અજ્ઞાત સર્વર પ્રમાણપત્ર ભૂલ.</translation> @@ -514,6 +534,7 @@ <translation id="7052500709156631672">ગેટવે અથવા પ્રોક્સી સર્વરને અપસ્ટ્રીમ સર્વરથી અમાન્ય પ્રતિસાદ મળ્યો.</translation> <translation id="7087282848513945231">પરગણું</translation> <translation id="7088615885725309056">વધુ જૂનું</translation> +<translation id="7090678807593890770"><ph name="LINK" /> માટે Google પર શોધો</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" /> માં અનુવાદ નિષ્ફળ રહ્યો.</translation> <translation id="7139724024395191329">એમિરાત</translation> <translation id="7179921470347911571">હમણાં ફરીથી લોંચ કરો</translation> @@ -606,6 +627,7 @@ <translation id="8034955203865359138">કોઈ ઇતિહાસ પ્રવિષ્ટિઓ મળી નથી.</translation> <translation id="8088680233425245692">લેખ જોવામાં નિષ્ફળ થયાં.</translation> <translation id="8091372947890762290">સક્રિયતા સર્વર પર બાકી છે</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> નું સર્વર <ph name="BEGIN_ABBR" />DNS સરનામું<ph name="END_ABBR" /> શોધી શકાયું નથી.</translation> <translation id="8149426793427495338">તમારું કમ્પ્યુટર નિષ્ક્રિય થઈ ગયું હતું.</translation> <translation id="8150722005171944719"><ph name="URL" /> પરની ફાઇલ વાંચનયોગ્ય નથી. તે દૂર કરવામાં, ખસેડવામાં આવી હોઈ શકે છે અથવા ફાઇલ પરવાનગીઓ ઍક્સેસ કરવાથી અટકાવતી હોઈ શકે છે.</translation> <translation id="8194797478851900357">&ખસેડવું પૂર્વવત્ કરો</translation> @@ -632,6 +654,7 @@ <translation id="8311778656528046050">શું તમે ખરેખર આ પૃષ્ઠને ફરીથી લોડ કરવા માંગો છો?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> ની ઍક્સેસ નકારાઈ હતી</translation> <translation id="8349305172487531364">બુકમાર્ક્સ બાર</translation> +<translation id="8363502534493474904">એરપ્લેન મોડ બંધ કરીને</translation> <translation id="8364627913115013041">સેટ નથી.</translation> <translation id="8412145213513410671">ક્રેશેસ (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">તમારે તે જ પાસફ્રેઝ બે વાર દાખલ કરવો આવશ્યક છે.</translation> @@ -689,6 +712,7 @@ <translation id="901974403500617787">ધ્વજો કે જે સિસ્ટમ-વ્યાપી લાગુ છે તે ફક્ત માલિક દ્વારા જ સેટ કરી શકાય છે: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">સર્વરે કનેક્શનને નકાર્યું.</translation> <translation id="9020542370529661692">આ પૃષ્ઠનો <ph name="TARGET_LANGUAGE" /> માં અનુવાદ કરવામાં આવ્યો છે</translation> +<translation id="9038649477754266430">પૃષ્ઠોને વધુ ઝડપથી લોડ કરવા માટે પૂર્વાનુમાન સેવાનો ઉપયોગ કરો</translation> <translation id="9039213469156557790">વળી, આ પૃષ્ઠમાં અન્ય એવા સાધનો છે જે સુરક્ષિત નથી. ટ્રાંઝિટમાં હોવા પર અન્ય લોકો દ્વારા આ સાધનો જોઈ શકાય છે અને પૃષ્ઠનો વ્યવહાર બદલવા માટે હુમલાખોર દ્વારા સંશોધિત કરવામાં આવી શકે છે.</translation> <translation id="9049981332609050619">તમે <ph name="DOMAIN" /> સુધી પહોંચવાનો પ્રયાસ કર્યો, પરંતુ સર્વરે અમાન્ય પ્રમાણપત્ર પ્રસ્તુત કર્યું. </translation> <translation id="9050666287014529139">પાસફ્રેઝ</translation> @@ -702,6 +726,7 @@ <translation id="9170848237812810038">&પૂર્વવત્ કરો</translation> <translation id="917450738466192189">સર્વરનું પ્રમાણપત્ર અમાન્ય છે.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" />, એક અસમર્થિત પ્રોટોકોલનો ઉપયોગ કરે છે.</translation> +<translation id="9205078245616868884">તમારો ડેટા તમારા સમન્વયન પાસફ્રેઝ સાથે એન્ક્રિપ્ટ કરવામાં આવ્યો છે. સમન્વયન શરૂ કરવા માટે તે દાખલ કરો.</translation> <translation id="9207861905230894330">લેખ ઉમેરવામાં નિષ્ફળ થયાં.</translation> <translation id="933612690413056017">કોઈ ઇન્ટરનેટ કનેક્શન નથી</translation> <translation id="933712198907837967">ડાઇનર્સ ક્લબ</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 59f43336..88c9f69f 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">यह सर्वर यह नहीं प्रमाणित कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र आपके कंप्यूटर के ऑपरेटिंग सिस्टम द्वारा विश्वसनीय नहीं है. ऐसा गलत कॉन्फ़िगरेशन या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन में अवरोध डालने के कारण हो सकता है.</translation> <translation id="1152921474424827756"><ph name="URL" /> की <ph name="BEGIN_LINK" />संचित प्रति<ph name="END_LINK" /> एक्सेस करें</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ने अनपेक्षित रूप से कनेक्शन बंद कर दिया है.</translation> +<translation id="1161325031994447685">वाई-फ़ाई से फिर से कनेक्ट करें</translation> <translation id="1175364870820465910">&प्रिंट करें...</translation> <translation id="1181037720776840403">निकालें</translation> <translation id="1195447618553298278">अज्ञात त्रुटि.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">उपयोगकर्ता नीतियां</translation> <translation id="1644184664548287040">नेटवर्क कॉन्फ़िगरेशन अमान्य है और उसे आयात नहीं किया जा सकेगा.</translation> <translation id="1644574205037202324">इतिहास</translation> +<translation id="1645368109819982629">असमर्थित प्रोटोकॉल</translation> <translation id="1655462015569774233">{1,plural, =1{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा कल समाप्त हो गई थी. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पृष्ठ को रीफ्रेश करना चाहिए.}one{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा # दिन पहले समाप्त हो गई है. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पृष्ठ को रीफ्रेश करना चाहिए.}other{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा # दिन पहले समाप्त हो गई है. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पृष्ठ को रीफ्रेश करना चाहिए.}}</translation> <translation id="1676269943528358898">आपकी जानकारी की सुरक्षा करने के लिए <ph name="SITE" /> आमतौर पर एन्क्रिप्शन का उपयोग करती है. जब Google Chrome ने इस बार <ph name="SITE" /> से कनेक्ट करने का प्रयास किया, तो वेबसाइट ने असामान्य और गलत क्रेडेंशियल वापस भेजे. ऐसा तब हो सकता है जब कोई हमलावर <ph name="SITE" /> होने का दावा करने का प्रयास कर रहा हो या किसी वाई-फ़ाई प्रवेश स्क्रीन ने कनेक्शन को बाधित कर दिया हो. आपकी जानकारी अभी भी सुरक्षित है क्योंकि किसी भी डेटा के आदान-प्रदान से पहले ही Google Chrome ने कनेक्शन को रोक दिया था.</translation> <translation id="168841957122794586">सर्वर प्रमाणपत्र में कमज़ोर क्रिप्टोग्राफ़िक कुंजी है.</translation> <translation id="1706954506755087368">{1,plural, =1{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र कल से माना जाएगा. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है.}one{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र # दिन बाद से माना जाएगा. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है.}other{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र # दिन बाद से माना जाएगा. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">सिस्टम व्यवस्थापक से संपर्क करने का प्रयास करें.</translation> <translation id="17513872634828108">टैब खोलें</translation> <translation id="1753706481035618306">पृष्ठ संख्या</translation> <translation id="1763864636252898013">यह सर्वर यह नहीं प्रमाणित कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र आपके डिवाइस के ऑपरेटिंग सिस्टम द्वारा विश्वसनीय नहीं है. ऐसा गलत कॉन्फ़िगरेशन या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन में अवरोध डालने के कारण हो सकता है.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">प्रॉक्सी स्वत: कॉन्फ़िगर पर सेट है.</translation> <translation id="2025623846716345241">फिर से लोड की दुबारा पूछें</translation> <translation id="2030481566774242610">क्या आप मतलब <ph name="LINK" /> से है?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />प्रॉक्सी और फायरवॉल की जांच करें<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ज़िप कोड</translation> <translation id="2065985942032347596">प्रमाणीकरण आवश्यक</translation> <translation id="2079545284768500474">पूर्ववत् करें</translation> @@ -117,6 +121,8 @@ <translation id="2212735316055980242">नीति नहीं मिली</translation> <translation id="2213606439339815911">प्रविष्टियां फ़ेच की जा रही हैं...</translation> <translation id="2214283295778284209"><ph name="SITE" /> उपलब्ध नहीं है</translation> +<translation id="2227695659599072496">नेटवर्क केबल या राउटर की जांच करें</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />निदान ऐप्लिकेशन<ph name="END_LINK" /> का उपयोग करके अपने कनेक्शन को ठीक करें</translation> <translation id="225207911366869382">यह मान इस नीति के लिए हटा दिया गया है.</translation> <translation id="2262243747453050782">HTTP त्रुटि</translation> <translation id="2279770628980885996">जब सर्वर अनुरोध को पूरा करने का प्रयास कर रहा था, तब एक अप्रत्याशित स्थिति का सामना करना पड़ा था.</translation> @@ -144,6 +150,7 @@ <translation id="2495083838625180221">JSON पार्सर</translation> <translation id="2495093607237746763">यदि चेक किया गया हो, तो अधिक तेज़ी से फ़ॉर्म भरने के लिए क्रोमियम इस डिवाइस पर आपके कार्ड की कॉपी संग्रहीत करेगा.</translation> <translation id="2498091847651709837">नया कार्ड स्कैन करें</translation> +<translation id="2515629240566999685">अपने क्षेत्र में सिग्नल की जांच करें</translation> <translation id="2516305470678292029">UI विकल्प</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> ने एक अमान्य प्रतिसाद भेजा है.</translation> <translation id="2552545117464357659">इससे नए</translation> @@ -219,6 +226,8 @@ <translation id="3254409185687681395">इस पृष्ठ को बुकमार्क करें</translation> <translation id="3270847123878663523">&पुन: क्रमित करना वापस लाएं</translation> <translation id="3286538390144397061">अभी फिर से प्रारंभ करें</translation> +<translation id="3288003805934695103">पृष्ठ को पुनः लोड करें</translation> +<translation id="3305707030755673451">आपका डेटा आपके समन्वयन पासफ़्रेज़ के साथ <ph name="TIME" /> को एन्क्रिप्ट किया गया था. समन्वयन शुरू करने के लिए इसे डालें.</translation> <translation id="333371639341676808">इस पृष्ठ को अतिरिक्त ब्लॉग बनाने से रोकें.</translation> <translation id="3340978935015468852">सेटिंग</translation> <translation id="3355823806454867987">प्रॉक्सी सेटिंग बदलें...</translation> @@ -261,6 +270,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">लोड हो रहा है...</translation> <translation id="3712624925041724820">लाइसेंस समाप्त हो गए</translation> +<translation id="3714780639079136834">मोबाइल डेटा या वाई-फ़ाई चालू करें</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />प्रॉक्सी, फायरवॉल और DNS कॉन्फ़िगरेशन की जांच करें<ph name="END_LINK" /></translation> <translation id="3739623965217189342">काॅपी किया गया लिंक</translation> <translation id="3744899669254331632">आप इस समय <ph name="SITE" /> पर नहीं जा सकते क्योंकि वेबसाइट ने ऐसी अव्यवस्थित प्रमाणिकताएं भेजी थीं जिन्हें क्रोमियम संसाधित नहीं कर सकता. नेटवर्क की त्रुटियां और हमले आमतौर पर अस्थायी होते हैं, इसलिए संभवत: यह पृष्ठ बाद में काम करेगा.</translation> <translation id="3748412725338508953">बहुत अधिक रीडायरेक्ट मौजूद थे.</translation> @@ -283,6 +294,7 @@ <translation id="3963721102035795474">रीडर मोड</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> अवरुद्ध है</translation> <translation id="4021036232240155012">DNS एक नेटवर्क सेवा है जो किसी वेबसाइट के नाम को उसके इंटरनेट पते में बदलती है.</translation> +<translation id="4021376465026729077">अपने एक्सटेंशन अक्षम करें</translation> <translation id="4030383055268325496">&जोड़ना वापस लाएं</translation> <translation id="4032534284272647190"><ph name="URL" /> पर पहुंच अस्वीकृत.</translation> <translation id="404928562651467259">चेतावनी</translation> @@ -299,6 +311,7 @@ <translation id="4171400957073367226">गलत सत्यापन हस्ताक्षर</translation> <translation id="4176463684765177261">अक्षम</translation> <translation id="4196861286325780578">&ले जाना फिर से करें</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />फायरवॉल और एंटीवायरस कॉन्फ़िगरेशन की जांच करें<ph name="END_LINK" /></translation> <translation id="4220128509585149162">क्रैश</translation> <translation id="4250680216510889253">नहीं</translation> <translation id="4258748452823770588">खराब हस्ताक्षर</translation> @@ -319,6 +332,7 @@ <translation id="443673843213245140">प्रॉक्सी का उपयोग अक्षम है लेकिन कोई स्पष्ट प्रॉक्सी कॉन्फ़िगरेशन निर्दिष्ट किया गया है.</translation> <translation id="4492190037599258964">'<ph name="SEARCH_STRING" />' के खोज परिणाम</translation> <translation id="4506176782989081258">सत्यापन त्रुटि: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">सिस्टम व्यवस्थापक से संपर्क करें</translation> <translation id="450710068430902550">व्यवस्थापक के साथ साझा करना</translation> <translation id="4522570452068850558">विवरण</translation> <translation id="4535734014498033861">प्रॉक्सी सर्वर कनेक्शन विफल.</translation> @@ -356,6 +370,7 @@ <translation id="5031870354684148875">Google अनुवाद के बारे में</translation> <translation id="5040262127954254034">गोपनीयता</translation> <translation id="5045550434625856497">गलत पासवर्ड</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />प्रॉक्सी पते की जांच करें<ph name="END_LINK" /></translation> <translation id="5087286274860437796">सर्वर का प्रमाण पत्र इस समय मान्य नहीं है.</translation> <translation id="5089810972385038852">राज्य</translation> <translation id="5094747076828555589">यह सर्वर यह नहीं प्रमाणित कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र Chromium द्वारा विश्वसनीय नहीं है. ऐसा गलत कॉन्फ़िगरेशन या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन में अवरोध डालने के कारण हो सकता है.</translation> @@ -374,6 +389,7 @@ <translation id="5295309862264981122">नेवीगेशन की दुबारा पूछें</translation> <translation id="5299298092464848405">नीति पार्स करने में त्रुटि</translation> <translation id="5300589172476337783">दिखाएं</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />अपनी कुकी साफ़ करें<ph name="END_LINK" /></translation> <translation id="5308689395849655368">क्रैश की रिपोर्ट करना अक्षम कर दिया गया है.</translation> <translation id="5317780077021120954">सहेजें</translation> <translation id="5327248766486351172">नाम</translation> @@ -401,6 +417,7 @@ <translation id="5556459405103347317">पुन: लोड करें</translation> <translation id="5565735124758917034">सक्रिय</translation> <translation id="560412284261940334">प्रबंधन समर्थित नहीं</translation> +<translation id="5610142619324316209">कनेक्शन की जांच करें</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> ने आपको कई बार रीडायरेक्ट किया है.</translation> <translation id="5629630648637658800">नीति सेटिंग लोड करने में विफल</translation> <translation id="5631439013527180824">अमान्य डिवाइस प्रबंधन टोकन</translation> @@ -433,6 +450,7 @@ <translation id="6093795393556121384">आपका कार्ड सत्यापित हो गया है</translation> <translation id="6146055958333702838">सभी केबल जांचें और आपके द्वारा उपयोग किए जा रहे सभी राउटर, मॉडेम या अन्य नेटवर्क डिवाइस को रीबूट करें.</translation> +<translation id="614940544461990577">यह आज़माकर देखें:</translation> <translation id="6151417162996330722">सर्वर प्रमाणपत्र की मान्यता अवधि बहुत लंबी है.</translation> <translation id="6154808779448689242">वापस लौटे नीति टोकन का मिलान वर्तमान टोकन से नहीं होता</translation> <translation id="6165508094623778733">अधिक जानें</translation> @@ -474,11 +492,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> खोज</translation> <translation id="6634865548447745291">आप इस समय <ph name="SITE" /> पर विज़िट नहीं कर सकते क्योंकि <ph name="BEGIN_LINK" />यह प्रमाणपत्र निरस्त कर दिया गया है<ph name="END_LINK" />. नेटवर्क की त्रुटियां और हमले आमतौर पर अस्थायी होते हैं, इसलिए संभवत: पृष्ठ बाद में काम करने लगेगा.</translation> <translation id="6637478299472506933">डाउनलोड विफल</translation> +<translation id="6642894344118208103">मॉडेम या राऊटर रीसेट करें</translation> <translation id="6644283850729428850">यह नीति हटा दी गई है.</translation> <translation id="6646897916597483132">अपने कार्ड के सामने की ओर दिया गया 4 अंकों वाला CVC डालें</translation> <translation id="6656103420185847513">फ़ोल्डर संपादित करें</translation> <translation id="6660210980321319655"><ph name="CRASH_TIME" /> बजे अपने आप रिपोर्ट की गई</translation> <translation id="6671697161687535275">क्रोमियम से फ़ॉर्म सुझाव निकालें?</translation> +<translation id="6685834062052613830">प्रस्थान करें और सेटअप पूरा करें</translation> <translation id="6710213216561001401">पिछला</translation> <translation id="6711464428925977395">प्रॉक्सी सर्वर के साथ कुछ गलत है या पता गलत है.</translation> <translation id="674375294223700098">अज्ञात सर्वर प्रमाणपत्र त्रुटि.</translation> @@ -513,6 +533,7 @@ <translation id="7052500709156631672">गेटवे या प्रॉक्सी सर्वर को अपस्ट्रीम सर्वर से अमान्य प्रतिक्रिया मिली.</translation> <translation id="7087282848513945231">काउंटी</translation> <translation id="7088615885725309056">इससे पुराने</translation> +<translation id="7090678807593890770"><ph name="LINK" /> के लिए Google में खोज करें</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" /> में अनुवाद विफल रहा.</translation> <translation id="7139724024395191329">अमीरात</translation> <translation id="7179921470347911571">अभी पुन: लॉन्च करें</translation> @@ -603,6 +624,7 @@ <translation id="8034955203865359138">कोई इतिहास प्रविष्टि नहीं मिली.</translation> <translation id="8088680233425245692">लेख देखने में विफल रहा.</translation> <translation id="8091372947890762290">सर्वर पर सक्रियण लंबित है</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> का सर्वर <ph name="BEGIN_ABBR" />DNS पता<ph name="END_ABBR" /> नहीं ढूंढ़ा जा सका.</translation> <translation id="8149426793427495338">आपका कंप्यूटर निष्क्रिय हो गया है.</translation> <translation id="8150722005171944719"><ph name="URL" /> पर मौजूद फ़ाइल पढ़ने योग्य नहीं है. हो सकता है कि इसे निकाल दिया गया हो, कहीं ले जाया गया हो, या फ़ाइल की अनुमतियां पहुंच रोक रही हों.</translation> <translation id="8194797478851900357">&ले जाना वापस लाएं</translation> @@ -629,6 +651,7 @@ <translation id="8311778656528046050">क्या आप वाकई इस पृष्ठ को पुन: लोड करना चाहते हैं?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> का एक्सेस अस्वीकृत किया गया</translation> <translation id="8349305172487531364">बुकमार्क बार</translation> +<translation id="8363502534493474904">हवाई जहाज़ मोड बंद करें</translation> <translation id="8364627913115013041">सेट नहीं है.</translation> <translation id="8412145213513410671">क्रैश (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">आपको वही पासफ़्रेज़ दोबारा दर्ज करना होगा.</translation> @@ -686,6 +709,7 @@ <translation id="901974403500617787">सिस्टम-व्यापी रूप से लागू होने वाले फ़्लैग केवल स्वामी द्वारा ही सेट किए जा सकते हैं: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">सर्वर ने कनेक्शन अस्वीकार कर दिया है.</translation> <translation id="9020542370529661692">इस पृष्ठ का <ph name="TARGET_LANGUAGE" /> में अनुवाद कर दिया गया है</translation> +<translation id="9038649477754266430">अधिक तेज़ी से पृष्ठ लोड करने के लिए किसी पूर्वानुमान सेवा का उपयोग करें</translation> <translation id="9039213469156557790">इसके अतिरिक्त, इस पृष्ठ में ऐसे अन्य संसाधन भी शामिल हैं, जो सुरक्षित नहीं हैं. ट्रांज़िट में होने के दौरान ये संसाधन अन्य लोगों द्वारा देखे जा सकते हैं और पृष्ठ का व्यवहार बदलने के लिए किसी हमवलावर द्वारा इनमें बदलाव किए जा सकते हैं.</translation> <translation id="9049981332609050619">आपने <ph name="DOMAIN" /> पर पहुंचने का प्रयास किया, लेकिन सर्वर ने एक अमान्य प्रमाणपत्र प्रस्तुत किया.</translation> <translation id="9050666287014529139">पासफ़्रेज़</translation> @@ -699,6 +723,7 @@ <translation id="9170848237812810038">&पूर्ववत् करें</translation> <translation id="917450738466192189">सर्वर का प्रमाणपत्र अमान्य है.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> एक असमर्थित प्रोटोकॉल का उपयोग करता है.</translation> +<translation id="9205078245616868884">आपका डेटा आपके समन्वयन पासफ़्रेज़ के साथ एन्क्रिप्ट किया गया है. समन्वयन शुरू करने के लिए इसे डालें.</translation> <translation id="9207861905230894330">लेख जोड़ने में विफल रहा.</translation> <translation id="933612690413056017">कोई इंटरनेट कनेक्शन नहीं है</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 1fde9f0..f9226405 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Poslužitelj nije mogao dokazati da je <ph name="DOMAIN" />; operativni sustav vašeg računala smatra da njegov sigurnosni certifikat nije pouzdan. To može biti uzrokovano pogrešnom konfiguracijom ili napadom na vašu vezu.</translation> <translation id="1152921474424827756">Pristupite <ph name="BEGIN_LINK" />predmemoriranoj kopiji<ph name="END_LINK" /> stranice <ph name="URL" /></translation> <translation id="1158211211994409885">Host <ph name="HOST_NAME" /> neočekivano je prekinuo vezu.</translation> +<translation id="1161325031994447685">Ponovo se povežite s Wi-Fi mrežom</translation> <translation id="1175364870820465910">&Ispis...</translation> <translation id="1181037720776840403">Ukloni</translation> <translation id="1195447618553298278">Nepoznata pogreška.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Korisnička pravila</translation> <translation id="1644184664548287040">Mrežna konfiguracija nije važeća i nije ju bilo moguće uvesti.</translation> <translation id="1644574205037202324">Povijest</translation> +<translation id="1645368109819982629">Protokol nije podržan</translation> <translation id="1655462015569774233">{1,plural, =1{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat istekao jučer. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu. Sat vašeg računala trenutačno je postavljen na <ph name="CURRENT_DATE" />. Je li to u redu? Ako nije, ispravite vrijeme na satu sustava, a zatim osvježite ovu stranicu.}one{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat istekao prije # dan. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu. Sat vašeg računala trenutačno je postavljen na <ph name="CURRENT_DATE" />. Je li to u redu? Ako nije, ispravite vrijeme na satu sustava, a zatim osvježite ovu stranicu.}few{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat istekao prije # dana. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu. Sat vašeg računala trenutačno je postavljen na <ph name="CURRENT_DATE" />. Je li to u redu? Ako nije, ispravite vrijeme na satu sustava, a zatim osvježite ovu stranicu.}other{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat istekao prije # dana. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu. Sat vašeg računala trenutačno je postavljen na <ph name="CURRENT_DATE" />. Je li to u redu? Ako nije, ispravite vrijeme na satu sustava, a zatim osvježite ovu stranicu.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> obično upotrebljava enkripciju radi zaštite vaših podataka. Prilikom ovog pokušaja povezivanja Google Chromea s web-lokacijom <ph name="SITE" /> ta je web-lokacija vratila neuobičajene i netočne vjerodajnice. To može značiti da se neki napadač pokušava predstaviti kao <ph name="SITE" /> ili je zaslon za prijavu na Wi-Fi prekinuo vezu. Vaši su podaci još uvijek sigurni jer je Google Chrome zaustavio povezivanje prije razmjene podataka.</translation> <translation id="168841957122794586">Certifikat poslužitelja sadrži slab kriptografski ključ!</translation> <translation id="1706954506755087368">{1,plural, =1{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat navodno izdan sutra. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu.}one{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat navodno izdan # dan u budućnosti. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu.}few{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat navodno izdan # dana u budućnosti. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu.}other{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat navodno izdan # dana u budućnosti. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Pokušajte kontaktirati administratora sustava.</translation> <translation id="17513872634828108">Otvorene kartice</translation> <translation id="1753706481035618306">Broj stranice</translation> <translation id="1763864636252898013">Poslužitelj nije mogao dokazati da je <ph name="DOMAIN" />; operativni sustav vašeg uređaja smatra da njegov sigurnosni certifikat nije pouzdan. To može biti uzrokovano pogrešnom konfiguracijom ili napadom na vašu vezu.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxy je postavljen na automatsko konfiguriranje.</translation> <translation id="2025623846716345241">Potvrda ponovnog učitavanja</translation> <translation id="2030481566774242610">Jeste li mislili <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Provjerite proxy i vatrozid<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ZIP kôd</translation> <translation id="2065985942032347596">Potrebna autentikacija</translation> <translation id="2079545284768500474">Poništi</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Pravilo nije pronađeno</translation> <translation id="2213606439339815911">Dohvaćanje unosa...</translation> <translation id="2214283295778284209">Web lokacija <ph name="SITE" /> nije dostupna</translation> +<translation id="2227695659599072496">Provjerite mrežni kabel ili usmjerivač</translation> +<translation id="2230458221926704099">Riješite problem s povezivanjem pomoću <ph name="BEGIN_LINK" />dijagnostičke aplikacije<ph name="END_LINK" /></translation> <translation id="225207911366869382">Ta je vrijednost obustavljena za to pravilo.</translation> <translation id="2262243747453050782">HTTP pogreška</translation> <translation id="2279770628980885996">Neočekivano stanje pojavilo se dok je poslužitelj pokušavao ispuniti zahtjev.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Raščlanjivanje JSON datoteka</translation> <translation id="2495093607237746763">Ako je potvrđen taj okvir, Chromium će pohraniti kopiju vaše kartice na uređaj radi bržeg ispunjavanja obrazaca.</translation> <translation id="2498091847651709837">Skeniraj novu karticu</translation> +<translation id="2515629240566999685">Provjerite jačinu signala na svom području</translation> <translation id="2516305470678292029">Zamjenska korisnička sučelja</translation> <translation id="255002559098805027">Host <ph name="HOST_NAME" /> poslao je nevažeći odgovor.</translation> <translation id="2552545117464357659">Novije</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Označi ovu stranicu</translation> <translation id="3270847123878663523">&Poništi promjenu rasporeda</translation> <translation id="3286538390144397061">Ponovo pokreni sad</translation> +<translation id="3288003805934695103">Ponovo učitajte stranicu</translation> <translation id="3305707030755673451">Vaši su podaci šifrirani vašom šifrom za sinkronizaciju <ph name="TIME" />. Unesite je da biste pokrenuli sinkronizaciju.</translation> <translation id="333371639341676808">Spriječite ovu stranicu od stvaranja dodatnih dijaloga.</translation> <translation id="3340978935015468852">postavke</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Učitavanje...</translation> <translation id="3712624925041724820">Licence su potrošene</translation> +<translation id="3714780639079136834">Uključite mobilne podatke ili Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Provjerite proxy, vatrozid i konfiguraciju DNS-a<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Veza koju ste kopirali</translation> <translation id="3744899669254331632">Trenutačno ne možete otvoriti <ph name="SITE" /> jer je web-lokacija poslala šifrirane vjerodajnice koje Chromium ne može obraditi. Mrežne pogreške i napadi obično su privremeni, tako da će stranica kasnije vjerojatno funkcionirati.</translation> <translation id="3748412725338508953">Bilo je previše preusmjeravanja.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Način čitača</translation> <translation id="3973234410852337861">Host <ph name="HOST_NAME" /> je blokiran</translation> <translation id="4021036232240155012">DNS je mrežna usluga koja prevodi naziv web-lokacije u njezinu internetsku adresu.</translation> +<translation id="4021376465026729077">Onemogućite proširenja</translation> <translation id="4030383055268325496">&Poništi dodavanje</translation> <translation id="4032534284272647190">Odbijen je pristup na <ph name="URL" />.</translation> <translation id="404928562651467259">UPOZORENJE</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Potpis za potvrdu nije ispravan.</translation> <translation id="4176463684765177261">Onemogućeno</translation> <translation id="4196861286325780578">&Ponovi premještanje</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Provjerite vatrozid i konfiguraciju antivirusnog programa<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Padovi programa</translation> <translation id="4250680216510889253">Ne</translation> <translation id="4258748452823770588">Potpis nije valjan</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">Upotreba proxy poslužitelja onemogućena je, ali određena je izričita konfiguracija proxy poslužitelja.</translation> <translation id="4492190037599258964">Rezultati pretraživanja za upit '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Pogreška pri provjeri valjanosti: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4506599922270137252">Kontaktirajte administratora sustava</translation> <translation id="450710068430902550">Dijeljenje s administratorom</translation> <translation id="4522570452068850558">Detalji</translation> <translation id="4535734014498033861">Povezivanje s proxy poslužiteljem nije uspjelo.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">O Google Prevoditelju</translation> <translation id="5040262127954254034">Privatnost</translation> <translation id="5045550434625856497">Netočna zaporka</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Provjerite proxy adresu<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Certifikat poslužitelja trenutačno nije važeći.</translation> <translation id="5089810972385038852">Država</translation> <translation id="5094747076828555589">Poslužitelj nije mogao dokazati da je <ph name="DOMAIN" />; Chromium smatra da njegov sigurnosni certifikat nije pouzdan. To može biti uzrokovano pogrešnom konfiguracijom ili napadom na vašu vezu.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Potvrdi navigaciju</translation> <translation id="5299298092464848405">Pogreška u pravilu analize</translation> <translation id="5300589172476337783">Prikaži</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Izbrišite kolačiće<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Onemogućeno je izvješćivanje o padu.</translation> <translation id="5317780077021120954">Spremi</translation> <translation id="5327248766486351172">Naziv</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Ponovno učitaj</translation> <translation id="5565735124758917034">Aktivno</translation> <translation id="560412284261940334">Upravljanje nije podržano</translation> +<translation id="5610142619324316209">Provjerite vezu</translation> <translation id="5617949217645503996">Host <ph name="HOST_NAME" /> preusmjerio vas je previše puta.</translation> <translation id="5629630648637658800">Učitavanje postavki pravila nije uspjelo</translation> <translation id="5631439013527180824">Token za upravljanje uređajem nije važeći</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Kartica je potvrđena</translation> <translation id="6146055958333702838">Provjerite kabele i ponovo pokrenite usmjerivače, modeme ili druge mrežne uređaje koje možda upotrebljavate.</translation> +<translation id="614940544461990577">Pokušajte sljedeće:</translation> <translation id="6151417162996330722">Certifikat poslužitelja ima predugo razdoblje valjanosti.</translation> <translation id="6154808779448689242">Vraćeni token pravila ne odgovara trenutačnom tokenu</translation> <translation id="6165508094623778733">Saznajte više</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Pretraživanje</translation> <translation id="6634865548447745291">Trenutačno ne možete posjetiti <ph name="SITE" /> jer je <ph name="BEGIN_LINK" />taj certifikat opozvan<ph name="END_LINK" />. Mrežne pogreške i napadi uglavnom su privremeni i ta bi stranica kasnije trebala funkcionirati.</translation> <translation id="6637478299472506933">Preuzimanje nije uspjelo</translation> +<translation id="6642894344118208103">Ponovo pokrenite modem ili usmjerivač</translation> <translation id="6644283850729428850">Ovo je pravilo zastarjelo.</translation> <translation id="6646897916597483132">Unesite četveroznamenkasti CVC s prednje strane kartice</translation> <translation id="6656103420185847513">Uređivanje mape</translation> <translation id="6660210980321319655">Automatski prijavljeno <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Želite li ukloniti prijedlog iz Chromiuma?</translation> +<translation id="6685834062052613830">Odjavite se i dovršite postavljanje</translation> <translation id="6710213216561001401">Prethodno</translation> <translation id="6711464428925977395">Nešto nije u redu s proxy poslužiteljem ili adresa nije točna.</translation> <translation id="674375294223700098">Nepoznata pogreška certifikata poslužitelja</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">Pristupnik ili proxy poslužitelj primio je nevažeći odgovor od nadređenog poslužitelja.</translation> <translation id="7087282848513945231">Županija</translation> <translation id="7088615885725309056">Starije</translation> +<translation id="7090678807593890770">Potražite upit <ph name="LINK" /> na Googleu</translation> <translation id="7108649287766967076">Prijevod na <ph name="TARGET_LANGUAGE" /> nije uspio.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Ponovo pokreni sada</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">Unosi povijesti nisu pronađeni.</translation> <translation id="8088680233425245692">Prikaz članka nije uspio.</translation> <translation id="8091372947890762290">Aktivacija je na čekanju na poslužitelju</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />DNS adresa<ph name="END_ABBR" /> poslužitelja hosta <ph name="HOST_NAME" /> nije pronađena.</translation> <translation id="8149426793427495338">Računalo je u stanju mirovanja.</translation> <translation id="8150722005171944719">Datoteka na adresi <ph name="URL" /> nije čitljiva. Možda je uklonjena ili premještena ili dozvole datoteka sprječavaju pristup.</translation> <translation id="8194797478851900357">&Poništi premještanje</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">Jeste li sigurni da želite ponovo učitati ovu stranicu?</translation> <translation id="8332188693563227489">Pristup hostu <ph name="HOST_NAME" /> je odbijen</translation> <translation id="8349305172487531364">Traka oznaka</translation> +<translation id="8363502534493474904">Isključite način rada u zrakoplovu</translation> <translation id="8364627913115013041">Nije postavljeno.</translation> <translation id="8412145213513410671">Padovi (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Morate dvaput unijeti istu zaporku.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">Oznake koje se primjenjuju na razini sustava može postaviti samo vlasnik: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Web-poslužitelj uskratio je vezu.</translation> <translation id="9020542370529661692">Ova je stranica prevedena na <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Upotreba usluge predviđanja za brže učitavanje stranica</translation> <translation id="9039213469156557790">Nadalje, ova stranica sadrži druge resurse koji nisu sigurni. Te resurse mogu vidjeti drugi tijekom prijenosa i napadač ih može izmijeniti kako bi promijenio ponašanje stranice.</translation> <translation id="9049981332609050619">Pokušali ste pristupiti domeni <ph name="DOMAIN" />, ali poslužitelj je prikazao nevažeći certifikat.</translation> <translation id="9050666287014529139">Zaporka</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 6297275..388cba4 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa az Ön számítógépének operációs rendszere szerint nem megbízható. Ennek oka lehet konfigurációs hiba, vagy hogy egy támadó eltérítette az Ön kapcsolódását.</translation> <translation id="1152921474424827756">A(z) <ph name="URL" /> egy <ph name="BEGIN_LINK" />tárolt változatának<ph name="END_LINK" /> megtekintése</translation> <translation id="1158211211994409885">A(z) <ph name="HOST_NAME" /> váratlanul megszakította a kapcsolatot.</translation> +<translation id="1161325031994447685">Újracsatlakozás Wi-Fi-hálózathoz</translation> <translation id="1175364870820465910">&Nyomtatás...</translation> <translation id="1181037720776840403">Eltávolítás</translation> <translation id="1195447618553298278">Ismeretlen hiba.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Felhasználói házirendek</translation> <translation id="1644184664548287040">A hálózati konfiguráció érvénytelen és nem importálható.</translation> <translation id="1644574205037202324">Előzmények</translation> +<translation id="1645368109819982629">Nem támogatott protokoll</translation> <translation id="1655462015569774233">{1,plural, =1{A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa tegnap lejárt. Ennek oka lehet konfigurációs hiba, de az is lehet, hogy egy támadó eltérítette az Ön kapcsolódását. Számítógépének órája jelenleg a következőre van állítva: <ph name="CURRENT_DATE" />. Ez megfelelőnek tűnik? Ha nem, állítsa be megfelelően a rendszer óráját, majd frissítse az oldalt.}other{A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa # nappal ezelőtt lejárt. Ennek oka lehet konfigurációs hiba, de az is lehet, hogy egy támadó eltérítette az Ön kapcsolódását. Számítógépének órája jelenleg a következőre van állítva: <ph name="CURRENT_DATE" />. Ez megfelelőnek tűnik? Ha nem, állítsa be megfelelően a rendszer óráját, majd frissítse az oldalt.}}</translation> <translation id="1676269943528358898">A(z) <ph name="SITE" /> webhely rendes esetben titkosítást alkalmaz az Ön adatainak védelme érdekében. Amikor a Google Chrome most csatlakozni próbált, a(z) <ph name="SITE" /> webhely szokatlan és helytelen hitelesítési adatokat küldött vissza. Ez olyankor fordulhat elő, amikor egy támadó megpróbálja magát kiadni a(z) <ph name="SITE" /> webhelynek, vagy valamilyen Wi-Fi-bejelentkezési képernyő megszakította a kapcsolatot. Adatai továbbra is biztonságban vannak, mivel a Google Chrome még azt megelőzően megszakította a kapcsolatot, hogy bármiféle adatcserére sor kerülhetett volna.</translation> <translation id="168841957122794586">A szervertanúsítvány gyenge titkosítási kulcsot tartalmaz.</translation> <translation id="1706954506755087368">{1,plural, =1{A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa elméletileg holnaptól érvényes. Ennek oka lehet konfigurációs hiba, de az is lehet, hogy egy támadó eltérítette az Ön kapcsolódását.}other{A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa elméletileg # nap múlva lép érvénybe. Ennek oka lehet konfigurációs hiba, de az is lehet, hogy egy támadó eltérítette az Ön kapcsolódását.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">American Express</translation> +<translation id="1734878702283171397">Próbálja felvenni a kapcsolatot a rendszergazdával.</translation> <translation id="17513872634828108">Megnyitott lapok</translation> <translation id="1753706481035618306">Oldalszám</translation> <translation id="1763864636252898013">A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa az Ön eszközének operációs rendszere szerint nem megbízható. Ennek oka lehet konfigurációs hiba, vagy hogy egy támadó eltérítette az Ön kapcsolódását.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Automatikusan konfigurálhatóra beállított proxy.</translation> <translation id="2025623846716345241">Újratöltés megerősítése</translation> <translation id="2030481566774242610">Erre gondolt: <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />A proxy és a tűzfal ellenőrzése<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Irányítószám</translation> <translation id="2065985942032347596">Hitelesítés szükséges</translation> <translation id="2079545284768500474">Visszavonás</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Nem találhatók irányelvek</translation> <translation id="2213606439339815911">Bejegyzések lekérése...</translation> <translation id="2214283295778284209"><ph name="SITE" /> nem érhető el</translation> +<translation id="2227695659599072496">A hálózati kábel vagy router ellenőrzése</translation> +<translation id="2230458221926704099">Javítsa meg kapcsolatát a <ph name="BEGIN_LINK" />diagnosztikai alkalmazás<ph name="END_LINK" /> segítségével</translation> <translation id="225207911366869382">Ez az érték elavult ennél a házirendnél.</translation> <translation id="2262243747453050782">HTTP hiba</translation> <translation id="2279770628980885996">Váratlan feltétel merült fel, miközben a szerver megpróbált eleget tenni a kérésnek.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Ha be van jelölve, a Chromium megőrzi a kártya másolatát ezen az eszközön a gyorsabb űrlapkitöltés érdekében.</translation> <translation id="2498091847651709837">Új kártya beolvasása</translation> +<translation id="2515629240566999685">A térerő ellenőrzése tartózkodási helyén</translation> <translation id="2516305470678292029">Alternatív kezelőfelületek</translation> <translation id="255002559098805027">A(z) <ph name="HOST_NAME" /> érvénytelen választ küldött.</translation> <translation id="2552545117464357659">Újabb</translation> @@ -219,6 +226,8 @@ <translation id="3254409185687681395">Könyvjelző hozzáadása ehhez az oldalhoz</translation> <translation id="3270847123878663523">&Átrendezés visszavonása</translation> <translation id="3286538390144397061">Újraindítás most</translation> +<translation id="3288003805934695103">Az oldal frissítése</translation> +<translation id="3305707030755673451">Adatainak titkosítása megtörtént összetett szinkronizálási jelszavával a következő időpontban: <ph name="TIME" />. Adja meg a jelszót a szinkronizálás megkezdéséhez.</translation> <translation id="333371639341676808">Ez az oldal ne nyisson meg további párbeszédablakokat.</translation> <translation id="3340978935015468852">beállítások</translation> <translation id="3355823806454867987">Proxybeállítások módosítása...</translation> @@ -261,6 +270,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Betöltés…</translation> <translation id="3712624925041724820">Az engedélyek elfogytak</translation> +<translation id="3714780639079136834">A mobiladatok vagy a Wi-Fi bekapcsolása</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />A proxy, a tűzfal és a DNS-konfiguráció ellenőrzése<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Átmásolt link</translation> <translation id="3744899669254331632">Most nem keresheti fel a(z) <ph name="SITE" /> webhelyet, mert az zavaros, a Chromium által nem feldolgozható hitelesítő adatokat küldött. A hálózati hibák és támadások általában ideiglenesek, úgyhogy az oldal később valószínűleg megfelelően fog működni.</translation> <translation id="3748412725338508953">Túl sok átirányítás történt.</translation> @@ -283,6 +294,7 @@ <translation id="3963721102035795474">Olvasási mód</translation> <translation id="3973234410852337861">A(z) <ph name="HOST_NAME" /> le van tiltva</translation> <translation id="4021036232240155012">A DNS az a hálózati szolgáltatás, amely a webhelynevet az adott webhely internetes címére fordítja le.</translation> +<translation id="4021376465026729077">A bővítmények letiltása</translation> <translation id="4030383055268325496">&Hozzáadás visszavonása</translation> <translation id="4032534284272647190">Hozzáférés a(z) <ph name="URL" /> URL-hez megtagadva.</translation> <translation id="404928562651467259">FIGYELMEZTETÉS</translation> @@ -299,6 +311,7 @@ <translation id="4171400957073367226">Hibás igazoló aláírás.</translation> <translation id="4176463684765177261">Kikapcsolva</translation> <translation id="4196861286325780578">&Áthelyezés újra</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />A tűzfal és a vírusirtó konfigurációjának ellenőrzése<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Összeomlások</translation> <translation id="4250680216510889253">Nem</translation> <translation id="4258748452823770588">Rossz aláírás</translation> @@ -319,6 +332,7 @@ <translation id="443673843213245140">A proxy használata le van tiltva, de kifejezett proxykonfiguráció van megadva.</translation> <translation id="4492190037599258964">Találatok a(z) „<ph name="SEARCH_STRING" />” kifejezésre</translation> <translation id="4506176782989081258">Érvényesítési hiba: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Kapcsolatfelvétel a rendszergazdával</translation> <translation id="450710068430902550">Megosztás a rendszergazdával</translation> <translation id="4522570452068850558">Részletek</translation> <translation id="4535734014498033861">A proxyszerver-csatlakozás sikertelen.</translation> @@ -356,6 +370,7 @@ <translation id="5031870354684148875">A Google Fordító leírása</translation> <translation id="5040262127954254034">Adatvédelem</translation> <translation id="5045550434625856497">Téves jelszó</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />A proxy címének ellenőrzése<ph name="END_LINK" /></translation> <translation id="5087286274860437796">A szerver tanúsítványa jelenleg nem érvényes.</translation> <translation id="5089810972385038852">Állam</translation> <translation id="5094747076828555589">A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa a Chromium szerint nem megbízható. Ennek oka lehet konfigurációs hiba, vagy hogy egy támadó eltérítette az Ön kapcsolódását.</translation> @@ -374,6 +389,7 @@ <translation id="5295309862264981122">Navigálás megerősítése</translation> <translation id="5299298092464848405">Irányelv-előfeldolgozási hiba</translation> <translation id="5300589172476337783">Megjelenítés</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />A cookie-k törlése<ph name="END_LINK" /></translation> <translation id="5308689395849655368">A hibabejelentés ki van kapcsolva.</translation> <translation id="5317780077021120954">Mentés</translation> <translation id="5327248766486351172">Név</translation> @@ -401,6 +417,7 @@ <translation id="5556459405103347317">Újratöltés</translation> <translation id="5565735124758917034">Aktív</translation> <translation id="560412284261940334">A kezelés nem támogatott</translation> +<translation id="5610142619324316209">A kapcsolat ellenőrzése</translation> <translation id="5617949217645503996">A(z) <ph name="HOST_NAME" /> túl sokszor irányította át.</translation> <translation id="5629630648637658800">Az irányelv-beállítások betöltése sikertelen</translation> <translation id="5631439013527180824">Érvénytelen eszközkezelési token</translation> @@ -433,6 +450,7 @@ <translation id="6093795393556121384">Kártyáját ellenőriztük</translation> <translation id="6146055958333702838">Ellenőrizze a kábeleket, majd indítsa újra a routert, modemet vagy más hálózati eszközt, amelyet használ.</translation> +<translation id="614940544461990577">Próbálja ki a következőket:</translation> <translation id="6151417162996330722">A szervertanúsítvány érvényességi ideje túl hosszú.</translation> <translation id="6154808779448689242">A visszaadott irányelvtoken nem egyezik az aktuális tokennel</translation> <translation id="6165508094623778733">További információ</translation> @@ -473,11 +491,13 @@ <translation id="6628463337424475685">Keresés: <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Pillanatnyilag nem tudja felkeresni a(z) <ph name="SITE" /> webhelyet, mert <ph name="BEGIN_LINK" />ezt a tanúsítványt visszavonták<ph name="END_LINK" />. A hálózati hibák és támadások rendszerint átmenetiek, ezért az említett oldal később valószínűleg már működni fog.</translation> <translation id="6637478299472506933">Letöltés sikertelen</translation> +<translation id="6642894344118208103">A modem vagy router újraindítása</translation> <translation id="6644283850729428850">Ez a házirend már elavult.</translation> <translation id="6646897916597483132">Adja meg a kártya elején szereplő négyjegyű CVC-kódot</translation> <translation id="6656103420185847513">Mappa szerkesztése</translation> <translation id="6660210980321319655">Automatikusan jelentve ekkor: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Eltávolítja az űrlapjavaslatot a Chromiumból?</translation> +<translation id="6685834062052613830">Kijelentkezés és a beállítás befejezése</translation> <translation id="6710213216561001401">Előző</translation> <translation id="6711464428925977395">Valami gond van a proxyszerverrel, vagy a cím nem megfelelő.</translation> <translation id="674375294223700098">Ismeretlen szervertanúsítvány-hiba.</translation> @@ -512,6 +532,7 @@ <translation id="7052500709156631672">A kapuoldal vagy a proxyszerver érvénytelen választ kapott egy ellentétes irányú szervertől.</translation> <translation id="7087282848513945231">Megye</translation> <translation id="7088615885725309056">Régebbi</translation> +<translation id="7090678807593890770">Keresés a Google-on a következőre: <ph name="LINK" /></translation> <translation id="7108649287766967076">A(z) <ph name="TARGET_LANGUAGE" /> nyelvre fordítás sikertelen volt.</translation> <translation id="7139724024395191329">Emírség</translation> <translation id="7179921470347911571">Újraindítás most</translation> @@ -604,6 +625,7 @@ <translation id="8034955203865359138">Nincsenek előzménybejegyzések.</translation> <translation id="8088680233425245692">Nem sikerült megtekinteni a cikket.</translation> <translation id="8091372947890762290">Az aktiválás függőben van a szerveren</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> szerverének <ph name="BEGIN_ABBR" />DNS-címe<ph name="END_ABBR" /> nem található.</translation> <translation id="8149426793427495338">Számítógépe alvó üzemmódba váltott.</translation> <translation id="8150722005171944719">A fájl (<ph name="URL" />) nem olvasható. Lehet, hogy eltávolították, áthelyezték, vagy a fájlengedélyek megakadályozzák a hozzáférést.</translation> <translation id="8194797478851900357">&Áthelyezés visszavonása</translation> @@ -631,6 +653,7 @@ <translation id="8311778656528046050">Biztos, hogy újra szeretné tölteni ezt az oldalt?</translation> <translation id="8332188693563227489">A hozzáférés megtagadva a következőhöz: <ph name="HOST_NAME" /></translation> <translation id="8349305172487531364">Könyvjelzősáv</translation> +<translation id="8363502534493474904">Repülős üzemmód kikapcsolása</translation> <translation id="8364627913115013041">Nincs beállítva.</translation> <translation id="8412145213513410671">Rendszerösszeomlások ( <ph name="CRASH_COUNT" /> )</translation> <translation id="8412392972487953978">Mindkét alkalommal ugyanazt az összetett jelszót kell megadnia.</translation> @@ -688,6 +711,7 @@ <translation id="901974403500617787">Rendszerszinten érvényes jelölőket csak a tulajdonos (<ph name="OWNER_EMAIL" />) állíthat be.</translation> <translation id="9020142588544155172">A szerver visszautasította a kapcsolatot.</translation> <translation id="9020542370529661692">Az oldalt lefordítottuk <ph name="TARGET_LANGUAGE" /> nyelvre.</translation> +<translation id="9038649477754266430">A várható kifejezés szolgáltatás használata az oldalak gyorsabb betöltése érdekében</translation> <translation id="9039213469156557790">Emellett az oldal más forrásokat is tartalmaz, amelyek nem biztonságosak. Ezeket a forrásokat mások is megtekinthetik átvitel közben, és megváltoztatásukkal a támadók módosíthatják az oldal viselkedését.</translation> <translation id="9049981332609050619">Megpróbálta elérni a(z) <ph name="DOMAIN" /> webhelyet, de a szerver érvénytelen tanúsítványt mutatott be.</translation> <translation id="9050666287014529139">Összetett jelszó</translation> @@ -701,6 +725,7 @@ <translation id="9170848237812810038">&Visszavonás</translation> <translation id="917450738466192189">A szerver tanúsítványa érvénytelen.</translation> <translation id="9183425211371246419">A(z) <ph name="HOST_NAME" /> egy nem támogatott protokollt használ.</translation> +<translation id="9205078245616868884">Adatai az összetett szinkronizálási jelszavával vannak titkosítva. Adja meg a jelszót a szinkronizálás megkezdéséhez.</translation> <translation id="9207861905230894330">A cikk hozzáadása sikertelen.</translation> <translation id="933612690413056017">Nincs internetkapcsolat</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 344912a..4b9ea35 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya tidak dipercaya oleh sistem operasi komputer Anda. Hal ini dapat disebabkan oleh kesalahan konfigurasi atau penyerang memotong sambungan Anda.</translation> <translation id="1152921474424827756">Akses <ph name="BEGIN_LINK" />salinan yang disimpan dalam cache<ph name="END_LINK" /> dari <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> tiba-tiba menutup sambungan.</translation> +<translation id="1161325031994447685">Menyambungkan ulang ke Wi-Fi</translation> <translation id="1175364870820465910">&Cetak...</translation> <translation id="1181037720776840403">Hapus</translation> <translation id="1195447618553298278">Kesalahan tak dikenal.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Kebijakan pengguna</translation> <translation id="1644184664548287040">Konfigurasi cadangan tidak valid dan tidak dapat diimpor.</translation> <translation id="1644574205037202324">Riwayat</translation> +<translation id="1645368109819982629">Protokol yang tidak didukung</translation> <translation id="1655462015569774233">{1,plural, =1{Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; masa berlaku sertifikat keamanannya telah berakhir kemarin. Hal ini mungkin disebabkan oleh kesalahan konfigurasi, atau ada penyerang yang memintas sambungan internet Anda. Jam komputer Anda saat ini diatur ke <ph name="CURRENT_DATE" />. Apakah terlihat sesuai? Jika tidak, Anda harus membenarkan jam sistem dan menyegarkan laman ini.}other{Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; masa berlaku sertifikat keamanannya telah berakhir # hari yang lalu. Hal ini mungkin disebabkan oleh kesalahan konfigurasi, atau ada penyerang yang memintas sambungan internet Anda. Jam komputer Anda saat ini diatur ke <ph name="CURRENT_DATE" />. Apakah terlihat sesuai? Jika tidak, Anda harus membenarkan jam sistem dan menyegarkan laman ini.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> biasanya menggunakan enkripsi untuk melindungi informasi Anda. Saat Google Chrome mencoba menyambung ke <ph name="SITE" /> kali ini, situs web mengembalikan kredensial yang salah dan tidak biasa. Hal ini dapat terjadi jika ada penyerang yang berpura-pura menjadi <ph name="SITE" />, atau layar masuk Wi-Fi mengganggu sambungan. Informasi Anda masih aman karena Google Chrome menghentikan sambungan sebelum terjadi pertukaran data apa pun.</translation> <translation id="168841957122794586">Sertifikat server berisi kunci kriptografis yang lemah.</translation> <translation id="1706954506755087368">{1,plural, =1{Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya sepertinya dari esok hari. Hal ini mungkin disebabkan oleh kesalahan konfigurasi, atau ada penyerang yang memintas sambungan internet Anda.}other{Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya sepertinya dari # hari mendatang. Hal ini mungkin disebabkan oleh kesalahan konfigurasi, atau ada penyerang yang memintas sambungan internet Anda.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Coba hubungi admin sistem.</translation> <translation id="17513872634828108">Buka tab</translation> <translation id="1753706481035618306">Nomor laman</translation> <translation id="1763864636252898013">Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya tidak dipercaya oleh sistem operasi perangkat Anda. Hal ini dapat disebabkan oleh kesalahan konfigurasi atau penyerang memotong sambungan Anda.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxy disetel ke konfigurasi otomatis.</translation> <translation id="2025623846716345241">Konfirmasi Pemuatan Ulang</translation> <translation id="2030481566774242610">Mungkin maksud Anda <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Memeriksa proxy dan firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Kode pos</translation> <translation id="2065985942032347596">Diperlukan Otentikasi</translation> <translation id="2079545284768500474">Batalkan</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Kebijakan tidak ditemukan</translation> <translation id="2213606439339815911">Mengambil entri...</translation> <translation id="2214283295778284209"><ph name="SITE" /> tidak tersedia</translation> +<translation id="2227695659599072496">Memeriksa router atau kabel jaringan</translation> +<translation id="2230458221926704099">Perbaiki sambungan menggunakan <ph name="BEGIN_LINK" />aplikasi diagnosis<ph name="END_LINK" /></translation> <translation id="225207911366869382">Nilai ini sudah usang untuk kebijakan ini.</translation> <translation id="2262243747453050782">Kesalahan HTTP</translation> <translation id="2279770628980885996">Kondisi yang tidak terduga terjadi ketika server berusaha memenuhi permintaan.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Pengurai JSON</translation> <translation id="2495093607237746763">Jika dicentang, Chromium akan menyimpan salinan kartu Anda di perangkat ini untuk pengisian formulir yang lebih cepat.</translation> <translation id="2498091847651709837">Pindai kartu baru</translation> +<translation id="2515629240566999685">Periksa sinyal di area Anda</translation> <translation id="2516305470678292029">Alternatif UI</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> mengirimkan tanggapan yang tidak valid.</translation> <translation id="2552545117464357659">Anyar</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Bookmark laman ini</translation> <translation id="3270847123878663523">&Urungkan Pengaturan Ulang</translation> <translation id="3286538390144397061">Mulai Ulang Sekarang</translation> +<translation id="3288003805934695103">Memuat ulang laman</translation> <translation id="3305707030755673451">Data Anda dienkripsi dengan frasa sandi sinkronisasi pada tanggal <ph name="TIME" />. Masukkan frasa sandi untuk memulai sinkronisasi.</translation> <translation id="333371639341676808">Cegah dialog lain dari laman ini.</translation> <translation id="3340978935015468852">setelan</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Membuka...</translation> <translation id="3712624925041724820">Lisensi habis</translation> +<translation id="3714780639079136834">Aktifkan data seluler atau Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Periksa proxy, firewall, dan konfigurasi DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Tautan yang Anda salin</translation> <translation id="3744899669254331632">Anda tidak dapat mengunjungi <ph name="SITE" /> sekarang karena situs web mengirim kredensial tak beraturan yang tidak dapat diproses Chromium. Kesalahan jaringan dan serangan biasanya bersifat sementara, sehingga laman ini mungkin akan bekerja nanti.</translation> <translation id="3748412725338508953">Terlalu banyak arahan ulang.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Mode Pembaca</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> diblokir.</translation> <translation id="4021036232240155012">DNS adalah layanan jaringan yang menerjemahkan nama situs web ke alamat Internet-nya.</translation> +<translation id="4021376465026729077">Nonaktifkan ekstensi</translation> <translation id="4030383055268325496">&Urungkan penambahan</translation> <translation id="4032534284272647190">Akses ke <ph name="URL" /> ditolak.</translation> <translation id="404928562651467259">PERINGATAN</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Tanda tangan verifikasi tidak valid</translation> <translation id="4176463684765177261">Dinonaktifkan</translation> <translation id="4196861286325780578">&Ulangi pemindahan</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Periksa konfigurasi antivirus dan firewall<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Kerusakan</translation> <translation id="4250680216510889253">Tidak</translation> <translation id="4258748452823770588">Tanda tangan salah</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">Penggunaan proxy dinonaktifkan tetapi konfigurasi proxy yang eksplisit ditentukan.</translation> <translation id="4492190037599258964">Telusuri hasil untuk '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Kesalahan validasi: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Hubungi admin sistem</translation> <translation id="450710068430902550">Berbagi dengan Administrator</translation> <translation id="4522570452068850558">Detail</translation> <translation id="4535734014498033861">Sambungan server proxy gagal.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">Tentang Google Terjemahan</translation> <translation id="5040262127954254034">Privasi</translation> <translation id="5045550434625856497">Sandi salah</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Periksa alamat proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Sertifikat server saat ini tidak valid.</translation> <translation id="5089810972385038852">Negara bagian</translation> <translation id="5094747076828555589">Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya tidak dipercaya oleh Chromium. Hal ini dapat disebabkan oleh kesalahan konfigurasi atau penyerang memotong sambungan Anda.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Konfirmasikan Navigasi</translation> <translation id="5299298092464848405">Kebijakan kesalahan penguraian</translation> <translation id="5300589172476337783">Tampilkan</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Hapus cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Pelaporan kondisi ngadat dinonaktifkan.</translation> <translation id="5317780077021120954">Simpan</translation> <translation id="5327248766486351172">Nama</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Muat ulang</translation> <translation id="5565735124758917034">Aktif</translation> <translation id="560412284261940334">Pengelolaan tidak didukung</translation> +<translation id="5610142619324316209">Periksa sambungan</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> terlalu sering mengalihkan Anda.</translation> <translation id="5629630648637658800">Gagal memuat setelan kebijakan</translation> <translation id="5631439013527180824">Token pengelolaan perangkat tidak valid</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Kartu Anda diverifikasi</translation> <translation id="6146055958333702838">Periksa semua kabel dan boot ulang router, modem, atau perangkat jaringan lain yang mungkin Anda gunakan.</translation> +<translation id="614940544461990577">Coba:</translation> <translation id="6151417162996330722">Sertifikat server memiliki masa berlaku yang terlalu panjang.</translation> <translation id="6154808779448689242">Token kebijakan yang dikembalikan tidak cocok dengan token saat ini</translation> <translation id="6165508094623778733">Pelajari lebih lanjut</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Penelusuran</translation> <translation id="6634865548447745291">Saat ini, Anda tidak dapat mengunjungi <ph name="SITE" /> karena <ph name="BEGIN_LINK" />sertifikat ini telah dicabut<ph name="END_LINK" />. Kesalahan jaringan dan serangan biasanya bersifat sementara, jadi laman ini mungkin akan bekerja nanti.</translation> <translation id="6637478299472506933">Unduhan Gagal</translation> +<translation id="6642894344118208103">Setel ulang modem atau router</translation> <translation id="6644283850729428850">Kebijakan ini telah usang.</translation> <translation id="6646897916597483132">Masukkan 4 digit CVC di depan kartu Anda</translation> <translation id="6656103420185847513">Edit Folder</translation> <translation id="6660210980321319655">Otomatis dilaporkan pada <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Hapus saran formulir dari Chromium?</translation> +<translation id="6685834062052613830">Keluar dan selesaikan penyiapan</translation> <translation id="6710213216561001401">Sebelumnya</translation> <translation id="6711464428925977395">Ada yang salah dengan server proxy, atau alamat tidak benar.</translation> <translation id="674375294223700098">Kesalahan sertifikat server tidak dikenal.</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">Gerbang atau server proxy menerima tanggapan yang tidak valid dari server upstream.</translation> <translation id="7087282848513945231">County</translation> <translation id="7088615885725309056">Lawas</translation> +<translation id="7090678807593890770">Telusuri <ph name="LINK" /> di Google</translation> <translation id="7108649287766967076">Penerjemahan ke <ph name="TARGET_LANGUAGE" /> gagal.</translation> <translation id="7139724024395191329">Emirate</translation> <translation id="7179921470347911571">Luncurkan Ulang Sekarang</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">Tidak ditemukan entri riwayat.</translation> <translation id="8088680233425245692">Gagal melihat artikel.</translation> <translation id="8091372947890762290">Aktivasi ditunda di server</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />Alamat DNS<ph name="END_ABBR" /> server <ph name="HOST_NAME" /> tidak dapat ditemukan.</translation> <translation id="8149426793427495338">Komputer Anda sedang dalam mode tidur.</translation> <translation id="8150722005171944719">File pada <ph name="URL" /> tidak dapat dibaca. File mungkin telah dihapus, dipindahkan, atau izin file mungkin mencegah akses.</translation> <translation id="8194797478851900357">&Urungkan Pemindahan</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">Yakin ingin memuat ulang laman ini?</translation> <translation id="8332188693563227489">Akses ke <ph name="HOST_NAME" /> ditolak</translation> <translation id="8349305172487531364">Bilah bookmark</translation> +<translation id="8363502534493474904">Nonaktifkan mode pesawat</translation> <translation id="8364627913115013041">Tidak disetel.</translation> <translation id="8412145213513410671">Ngadat (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Anda harus memasukkan frasa sandi yang sama dua kali.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">Tanda yang berlaku bagi sistem secara luas hanya dapat disetel oleh pemilik: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Server menolak sambungan.</translation> <translation id="9020542370529661692">Laman ini telah diterjemahkan ke <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Gunakan layanan prediksi agar laman dimuat dengan lebih cepat</translation> <translation id="9039213469156557790">Selain itu, laman ini berisi sumber daya lainnya yang tidak aman. Sumber daya ini dapat dilihat oleh orang lain saat transit dan dapat dimodifikasi oleh penyerang untuk mengubah perilaku laman.</translation> <translation id="9049981332609050619">Anda berupaya menjangkau <ph name="DOMAIN" />, tetapi server menyajikan sertifikat yang tidak valid.</translation> <translation id="9050666287014529139">Frasa sandi</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 9f6e97a0..3f05135 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -23,6 +23,7 @@ <translation id="1150979032973867961">Questo server non è riuscito a dimostrare che si tratta di <ph name="DOMAIN" />; il relativo certificato di sicurezza non è considerato attendibile dal sistema operativo del computer. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.</translation> <translation id="1152921474424827756">Accedi a una <ph name="BEGIN_LINK" />copia memorizzata nella cache<ph name="END_LINK" /> di <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ha chiuso in modo imprevisto la connessione.</translation> +<translation id="1161325031994447685">Riconnessione alla rete Wi-Fi</translation> <translation id="1175364870820465910">&Stampa...</translation> <translation id="1181037720776840403">Rimuovi</translation> <translation id="1195447618553298278">Errore sconosciuto.</translation> @@ -64,12 +65,14 @@ <translation id="1640180200866533862">Criteri utente</translation> <translation id="1644184664548287040">La configurazione di rete non è valida e non può essere importata.</translation> <translation id="1644574205037202324">Cronologia</translation> +<translation id="1645368109819982629">Protocollo non supportato</translation> <translation id="1655462015569774233">{1,plural, =1{Questo server non è riuscito a verificare che si tratti di <ph name="DOMAIN" />; il relativo certificato di sicurezza è scaduto ieri. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione. L'orologio del computer è attualmente impostato su <ph name="CURRENT_DATE" />. È corretto? Se è sbagliato, dovresti regolare l'orologio e aggiornare la pagina.}other{Questo server non è riuscito a verificare che si tratti di <ph name="DOMAIN" />; il relativo certificato di sicurezza è scaduto # giorni fa. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione. L'orologio del computer è attualmente impostato su <ph name="CURRENT_DATE" />. È corretto? Se è sbagliato, dovresti regolare l'orologio e aggiornare la pagina.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> in genere utilizza la crittografia per proteggere le tue informazioni. Questa volta, quando Google Chrome ha provato a connettersi a <ph name="SITE" />, il sito web ha restituito credenziali insolite e sbagliate. È possibile che un malintenzionato stia cercando di spacciarsi per il sito <ph name="SITE" /> oppure che una schermata di accesso alla rete Wi-Fi abbia interrotto la connessione. Le tue informazioni sono ancora al sicuro perché Google Chrome ha interrotto la connessione prima che avvenissero scambi di dati.</translation> <translation id="168841957122794586">Il certificato del server contiene una chiave crittografica debole.</translation> <translation id="1706954506755087368">{1,plural, =1{Questo server non è riuscito a verificare che si tratti di <ph name="DOMAIN" />; il relativo certificato di sicurezza potrebbe essere attivo da domani. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.}other{Questo server non è riuscito a verificare che si tratti di <ph name="DOMAIN" />; il relativo certificato di sicurezza potrebbe essere attivo tra # giorni. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.}}</translation> <translation id="1710259589646384581">Sistema operativo</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Prova a contattare l'amministratore di sistema.</translation> <translation id="17513872634828108">Schede aperte</translation> <translation id="1753706481035618306">Numero di pagina</translation> <translation id="1763864636252898013">Questo server non è riuscito a dimostrare che si tratta di <ph name="DOMAIN" />; il relativo certificato di sicurezza non è considerato attendibile dal sistema operativo del dispositivo. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.</translation> @@ -91,6 +94,7 @@ <translation id="2025186561304664664">È stata impostata la configurazione automatica del proxy.</translation> <translation id="2025623846716345241">Conferma ricaricamento</translation> <translation id="2030481566774242610">Forse cercavi <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Controllare il proxy e firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ZIP</translation> <translation id="2065985942032347596">Autenticazione richiesta</translation> <translation id="2079545284768500474">Annulla</translation> @@ -113,6 +117,8 @@ <translation id="2212735316055980242">Criterio non trovato</translation> <translation id="2213606439339815911">Recupero voci...</translation> <translation id="2214283295778284209"><ph name="SITE" /> non disponibile</translation> +<translation id="2227695659599072496">Controllare il router o cavo di rete</translation> +<translation id="2230458221926704099">Correggi la connessione con l'<ph name="BEGIN_LINK" />app diagnostica<ph name="END_LINK" /></translation> <translation id="225207911366869382">Il valore specificato per la norma è obsoleto.</translation> <translation id="2262243747453050782">Errore HTTP</translation> <translation id="2279770628980885996">Si è verificata una condizione imprevista durante il tentativo del server di soddisfare la richiesta.</translation> @@ -140,6 +146,7 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Se questa opzione viene selezionata, Chromium memorizza una copia della carta sul dispositivo per velocizzare la compilazione dei moduli.</translation> <translation id="2498091847651709837">Esegui scansione nuova carta</translation> +<translation id="2515629240566999685">Controllare il segnale nella tua area</translation> <translation id="2516305470678292029">Alternative UI</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> ha inviato una risposta non valida.</translation> <translation id="2552545117464357659">Più recente</translation> @@ -208,6 +215,7 @@ <translation id="3254409185687681395">Aggiungi ai Preferiti</translation> <translation id="3270847123878663523">&Annulla ridisposizione</translation> <translation id="3286538390144397061">Riavvia adesso</translation> +<translation id="3288003805934695103">Ricaricare la pagina</translation> <translation id="3305707030755673451">I tuoi dati sono stati crittografati con la tua passphrase di sincronizzazione in data <ph name="TIME" />. Inseriscila per avviare la sincronizzazione.</translation> <translation id="333371639341676808">Impedisci alla pagina di creare altre finestre di dialogo.</translation> <translation id="3340978935015468852">impostazioni</translation> @@ -251,6 +259,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Caricamento in corso...</translation> <translation id="3712624925041724820">Licenze esaurite</translation> +<translation id="3714780639079136834">Attivare la rete dati mobile o Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Controllare la configurazione del proxy, firewall e DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Link che hai copiato</translation> <translation id="3744899669254331632">Al momento non puoi visitare il sito <ph name="SITE" /> perché tale sito web ha inviato credenziali criptate che Chromium non è riuscito a elaborare. Gli attacchi e gli errori di rete in genere sono temporanei, pertanto è possibile che questa pagina funzioni più tardi.</translation> <translation id="3748412725338508953">Si sono verificati troppi reindirizzamenti.</translation> @@ -272,6 +282,7 @@ <translation id="3963721102035795474">Modalità Reader</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> è bloccato</translation> <translation id="4021036232240155012">DNS è il servizio di rete che traduce il nome di un sito web nel relativo indirizzo Internet.</translation> +<translation id="4021376465026729077">Disattivare le estensioni</translation> <translation id="4030383055268325496">&Annulla aggiunta</translation> <translation id="4032534284272647190">Accesso a <ph name="URL" /> negato.</translation> <translation id="404928562651467259">AVVISO</translation> @@ -288,6 +299,7 @@ <translation id="4171400957073367226">Firma di verifica non valida</translation> <translation id="4176463684765177261">Disabilitato</translation> <translation id="4196861286325780578">&Ripeti spostamento</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Controllare le configurazioni del firewall e antivirus<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Arresti anomali</translation> <translation id="4250680216510889253">No</translation> <translation id="4258748452823770588">Firma errata</translation> @@ -308,6 +320,7 @@ <translation id="443673843213245140">L'utilizzo di un proxy è stato disattivato ma è stata specificata una configurazione proxy esplicita.</translation> <translation id="4492190037599258964">Risultati di ricerca per "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Errore di convalida. <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Contattare l'amministratore di sistema</translation> <translation id="450710068430902550">Condivisione con l'amministratore</translation> <translation id="4522570452068850558">Dettagli</translation> <translation id="4535734014498033861">Connessione al server proxy non riuscita.</translation> @@ -345,6 +358,7 @@ <translation id="5031870354684148875">Informazioni su Google Traduttore</translation> <translation id="5040262127954254034">Privacy</translation> <translation id="5045550434625856497">Password non corretta</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Controllare l'indirizzo proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Il certificato del server non è valido in questa fase.</translation> <translation id="5089810972385038852">Provincia</translation> <translation id="5094747076828555589">Questo server non è riuscito a dimostrare che si tratta di <ph name="DOMAIN" />; il relativo certificato di sicurezza non è considerato attendibile da Chromium. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.</translation> @@ -363,6 +377,7 @@ <translation id="5295309862264981122">Conferma navigazione</translation> <translation id="5299298092464848405">Errore durante l'analisi del criterio</translation> <translation id="5300589172476337783">Mostra</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Cancellare i cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">La segnalazione degli arresti anomali è disattivata.</translation> <translation id="5317780077021120954">Salva</translation> <translation id="5327248766486351172">Nome</translation> @@ -390,6 +405,7 @@ <translation id="5556459405103347317">Ricarica</translation> <translation id="5565735124758917034">Attivo</translation> <translation id="560412284261940334">Gestione non supportata</translation> +<translation id="5610142619324316209">Verificare la connessione</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> ti ha reindirizzato troppe volte.</translation> <translation id="5629630648637658800">Caricamento delle impostazioni criterio non riuscito</translation> <translation id="5631439013527180824">Token di gestione del dispositivo non valido</translation> @@ -421,6 +437,7 @@ <translation id="6060685159320643512">Attenzione, prova questi esperimenti a tuo rischio e pericolo</translation> <translation id="6093795393556121384">La carta è stata verificata</translation> <translation id="6146055958333702838">Controlla eventuali cavi e riavvia eventuali router, modem o altri dispositivi di rete in uso.</translation> +<translation id="614940544461990577">Prova a:</translation> <translation id="6151417162996330722">Il certificato del server ha un periodo di validità troppo lungo.</translation> <translation id="6154808779448689242">Il token del criterio restituito non corrisponde al token corrente</translation> <translation id="6165508094623778733">Ulteriori informazioni</translation> @@ -461,11 +478,13 @@ <translation id="6628463337424475685">Ricerca <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Al momento non puoi visitare il sito <ph name="SITE" /> perché <ph name="BEGIN_LINK" />questo certificato è stato revocato<ph name="END_LINK" />. In genere gli errori di rete e gli attacchi sono temporanei, pertanto questa pagina potrebbe funzionare più tardi.</translation> <translation id="6637478299472506933">Download non riuscito</translation> +<translation id="6642894344118208103">Ripristinare il modem o router</translation> <translation id="6644283850729428850">Questa norma è obsoleta.</translation> <translation id="6646897916597483132">Inserisci il codice CVC di quattro cifre indicato sulla parte anteriore della carta</translation> <translation id="6656103420185847513">Modifica cartella</translation> <translation id="6660210980321319655">Data/ora arresto anomalo: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Rimuovere il suggerimento per i moduli da Chromium?</translation> +<translation id="6685834062052613830">Esci e completa la configurazione</translation> <translation id="6710213216561001401">Indietro</translation> <translation id="6711464428925977395">Si è verificato un problema con il server proxy oppure l'indirizzo non è corretto.</translation> <translation id="674375294223700098">Errore sconosciuto del certificato del server.</translation> @@ -495,6 +514,7 @@ <translation id="7052500709156631672">Il gateway o il server proxy ha ricevuto una risposta non valida da un server upstream.</translation> <translation id="7087282848513945231">Contea</translation> <translation id="7088615885725309056">Meno recente</translation> +<translation id="7090678807593890770">Cerca <ph name="LINK" /> con Google</translation> <translation id="7108649287766967076">Traduzione in <ph name="TARGET_LANGUAGE" /> non riuscita.</translation> <translation id="7139724024395191329">Emirato</translation> <translation id="7179921470347911571">Riavvia ora</translation> @@ -587,6 +607,7 @@ <translation id="8034955203865359138">Nessuna voce della cronologia trovata.</translation> <translation id="8088680233425245692">Impossibile visualizzare l'articolo.</translation> <translation id="8091372947890762290">Attivazione in attesa sul server</translation> +<translation id="8134994873729925007">Impossibile trovare l'<ph name="BEGIN_ABBR" />indirizzo DNS<ph name="END_ABBR" /> del server <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Il computer è entrato in modalità sospensione.</translation> <translation id="8150722005171944719">Il file all'indirizzo <ph name="URL" /> non è leggibile. Potrebbe essere stato rimosso, spostato oppure delle autorizzazioni del file potrebbero impedire l'accesso.</translation> <translation id="8194797478851900357">&Annulla spostamento</translation> @@ -606,6 +627,7 @@ <translation id="8311778656528046050">Vuoi ricaricare questa pagina?</translation> <translation id="8332188693563227489">Accesso a <ph name="HOST_NAME" /> negato</translation> <translation id="8349305172487531364">Barra dei Preferiti</translation> +<translation id="8363502534493474904">Disattivare la modalità aereo</translation> <translation id="8364627913115013041">Non impostata.</translation> <translation id="8412145213513410671">Arresti anomali (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Devi inserire la stessa passphrase due volte.</translation> @@ -663,6 +685,7 @@ <translation id="901974403500617787">I contrassegni che si applicano a livello di sistema possono essere impostati solo dal proprietario: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Il server ha rifiutato la connessione.</translation> <translation id="9020542370529661692">Questa pagina è stata tradotta in <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Utilizza un servizio di previsione per velocizzare il caricamento delle pagine</translation> <translation id="9039213469156557790">Inoltre, questa pagina include altre risorse che non sono sicure. Tali risorse possono essere visualizzate da altri durante il transito dei dati e possono essere modificate da un utente malintenzionato al fine di modificare il comportamento della pagina.</translation> <translation id="9049981332609050619">Hai tentato di connetterti a <ph name="DOMAIN" />, ma il server ha presentato un certificato scaduto.</translation> <translation id="9050666287014529139">Passphrase</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 8f63cd2..5d141f8d 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -25,6 +25,7 @@ <translation id="1150979032973867961">השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />. אישור האבטחה שלו לא נחשב כמהימן על ידי מערכת ההפעלה של המחשב. ייתכן שהסיבה לכך היא תצורה שגויה או תוקף המיירט את החיבור שלך.</translation> <translation id="1152921474424827756">גש אל <ph name="BEGIN_LINK" />עותק בקובץ שמור<ph name="END_LINK" /> של <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> סגר את החיבור באופן בלתי צפוי.</translation> +<translation id="1161325031994447685">להתחבר מחדש אל ה-Wi-Fi</translation> <translation id="1175364870820465910">הדפס...</translation> <translation id="1181037720776840403">הסר</translation> <translation id="1195447618553298278">שגיאה לא ידועה.</translation> @@ -66,12 +67,14 @@ <translation id="1640180200866533862">מדיניות משתמשים</translation> <translation id="1644184664548287040">תצורת הרשת אינה חוקית ולא ניתן לייבא אותה.</translation> <translation id="1644574205037202324">היסטוריה</translation> +<translation id="1645368109819982629">פרוטוקול לא נתמך</translation> <translation id="1655462015569774233">{1,plural, =1{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; התוקף של אישור האבטחה שלו פג אתמול. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך. התאריך המוגדר כעת בשעון המחשב שלך הוא <ph name="CURRENT_DATE" />. האם זה נכון? אם לא, עליך לכוון את שעון המערכת ולאחר מכן לרענן את הדף הזה.}two{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; התוקף של אישור האבטחה שלו פג לפני יומיים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך. התאריך המוגדר כעת בשעון המחשב שלך הוא <ph name="CURRENT_DATE" />. האם זה נכון? אם לא, עליך לכוון את שעון המערכת ולאחר מכן לרענן את הדף הזה.}many{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; התוקף של אישור האבטחה שלו פג לפני # ימים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך. התאריך המוגדר כעת בשעון המחשב שלך הוא <ph name="CURRENT_DATE" />. האם זה נכון? אם לא, עליך לכוון את שעון המערכת ולאחר מכן לרענן את הדף הזה.}other{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; התוקף של אישור האבטחה שלו פג לפני # ימים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך. התאריך המוגדר כעת בשעון המחשב שלך הוא <ph name="CURRENT_DATE" />. האם זה נכון? אם לא, עליך לכוון את שעון המערכת ולאחר מכן לרענן את הדף הזה.}}</translation> <translation id="1676269943528358898">האתר <ph name="SITE" /> משתמש בדרך כלל בהצפנה כדי להגן על המידע שלך. כאשר Google Chrome ניסה הפעם להתחבר ל-<ph name="SITE" />, האתר שלח חזרה אישורים חריגים ושגויים. ייתכן שתוקף מנסה להתחזות לאתר <ph name="SITE" />, או שמסך כניסה ל-Wi-Fi הפריע לחיבור. המידע שלך עדיין מאובטח מכיוון ש-Google Chrome הפסיק את החיבור לפני חילופי הנתונים.</translation> <translation id="168841957122794586">אישור השרת מכיל מפתח הצפנה חלש.</translation> <translation id="1706954506755087368">{1,plural, =1{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו אמור להיכנס לתוקף רק מחר. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך.}two{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו אמור להיכנס לתוקף רק בעוד יומיים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך.}many{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו אמור להיכנס לתוקף רק בעוד # ימים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך.}other{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו אמור להיכנס לתוקף רק בעוד # ימים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך.}}</translation> <translation id="1710259589646384581">מערכת הפעלה</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">נסה לפנות אל מנהל המערכת.</translation> <translation id="17513872634828108">כרטיסיות פתוחות</translation> <translation id="1753706481035618306">מספר דף</translation> <translation id="1763864636252898013">השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />. אישור האבטחה שלו לא נחשב כמהימן על ידי מערכת ההפעלה של המכשיר. ייתכן שהסיבה לכך היא תצורה שגויה או תוקף המיירט את החיבור שלך.</translation> @@ -93,6 +96,7 @@ <translation id="2025186561304664664">שרת Proxy נקבע למוגדר אוטומטית.</translation> <translation id="2025623846716345241">אשר טעינה מחדש</translation> <translation id="2030481566774242610">האם התכוונת ל-<ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />לבדוק את שרת ה-proxy ואת חומת האש<ph name="END_LINK" /></translation> <translation id="2053553514270667976">מספר / מיקוד</translation> <translation id="2065985942032347596">נדרש אימות</translation> <translation id="2079545284768500474">בטל</translation> @@ -118,6 +122,8 @@ <translation id="2212735316055980242">לא נמצאה מדיניות</translation> <translation id="2213606439339815911">מאחזר רשומות...</translation> <translation id="2214283295778284209"><ph name="SITE" /> אינו זמין</translation> +<translation id="2227695659599072496">לבדוק את כבל הרשת או הנתב</translation> +<translation id="2230458221926704099">תקן את החיבור באמצעות <ph name="BEGIN_LINK" />אפליקציית הבדיקה<ph name="END_LINK" /></translation> <translation id="225207911366869382">ערך זה הוצא משימוש עבור מדיניות זו.</translation> <translation id="2262243747453050782">שגיאת HTTP</translation> <translation id="2279770628980885996">המערכת נתקלה במצב לא צפוי בזמן שהשרת ניסה למלא את הבקשה.</translation> @@ -145,6 +151,7 @@ <translation id="2495083838625180221">מנתח JSON</translation> <translation id="2495093607237746763">אם האפשרות תסומן, Chromium ישמור עותק של הכרטיס במכשיר הזה כדי למלא טפסים במהירות רבה יותר.</translation> <translation id="2498091847651709837">סרוק כרטיס חדש</translation> +<translation id="2515629240566999685">לבדוק את האות באזור שלך</translation> <translation id="2516305470678292029">חלופות לממשק משתמש</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> שלח תגובה לא חוקית.</translation> <translation id="2552545117464357659">חדש יותר</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">הוסף את הדף לסימניות</translation> <translation id="3270847123878663523">&ביטול של שינוי סדר</translation> <translation id="3286538390144397061">הפעל מחדש כעת</translation> +<translation id="3288003805934695103">לטעון מחדש את הדף</translation> +<translation id="3305707030755673451">הנתונים שלך הוצפנו ב-<ph name="TIME" /> באמצעות ביטוי הסיסמה לסינכרון. הזן אותו כדי להתחיל בסינכרון.</translation> <translation id="333371639341676808">מנע מדף זה ליצור דיאלוגים נוספים.</translation> <translation id="3340978935015468852">הגדרות</translation> <translation id="3355823806454867987">שנה הגדרות שרת Proxy...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">טוען...</translation> <translation id="3712624925041724820">אין מספיק רישיונות</translation> +<translation id="3714780639079136834">להפעיל נתונים לנייד או את ה-Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />לבדוק את תצורת ה-DNS, חומת האש ושרת ה-proxy<ph name="END_LINK" /></translation> <translation id="3739623965217189342">קישור שהעתקת</translation> <translation id="3744899669254331632">אינך יכול לבקר כרגע ב-<ph name="SITE" /> מפני שהאתר שלח פרטי כניסה מעורבלים ש-Chromium אינו יכול לעבד. שגיאות רשת והתקפות הן בדרך כלל זמניות, לכן סביר להניח שדף זה יפעל כהלכה בהמשך.</translation> <translation id="3748412725338508953">היו יותר מדי הפניות-מחדש. @@ -287,6 +298,7 @@ <translation id="3963721102035795474">מצב קורא</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> חסום</translation> <translation id="4021036232240155012">DNS הוא שירות הרשת שמתרגם שם של אתר לכתובת האינטרנט שלו.</translation> +<translation id="4021376465026729077">להשבית את התוספים</translation> <translation id="4030383055268325496">&ביטול הוספה</translation> <translation id="4032534284272647190">הגישה אל <ph name="URL" /> נדחתה.</translation> <translation id="404928562651467259">אזהרה</translation> @@ -303,6 +315,7 @@ <translation id="4171400957073367226">חתימת אימות לא חוקית</translation> <translation id="4176463684765177261">מושבת</translation> <translation id="4196861286325780578">&ביצוע מחדש של העברה</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />לבדוק את תצורת האנטי-וירוס וחומת האש<ph name="END_LINK" /></translation> <translation id="4220128509585149162">קריסה</translation> <translation id="4250680216510889253">לא</translation> <translation id="4258748452823770588">חתימה שגויה</translation> @@ -323,6 +336,7 @@ <translation id="443673843213245140">השימוש בשרת Proxy הושבת, אך צויינה תצורת שרת Proxy מפורשת.</translation> <translation id="4492190037599258964">תוצאות החיפוש עבור '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">שגיאת אימות: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">לפנות אל מנהל המערכת</translation> <translation id="450710068430902550">שיתוף עם מנהל מערכת</translation> <translation id="4522570452068850558">פרטים</translation> <translation id="4535734014498033861">חיבור של שרת Proxy נכשל.</translation> @@ -364,6 +378,7 @@ <translation id="5031870354684148875">מידע על Google Translate</translation> <translation id="5040262127954254034">פרטיות</translation> <translation id="5045550434625856497">סיסמה שגויה</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />לבדוק את כתובת שרת ה-proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">האישור של השרת אינו תקף כעת.</translation> <translation id="5089810972385038852">מדינה</translation> <translation id="5094747076828555589">השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />. אישור האבטחה שלו לא נחשב כמהימן על ידי Chromium. ייתכן שהסיבה לכך היא תצורה שגויה או תוקף המיירט את החיבור שלך.</translation> @@ -382,6 +397,7 @@ <translation id="5295309862264981122">אשר ניווט</translation> <translation id="5299298092464848405">שגיאה בניתוח המדיניות</translation> <translation id="5300589172476337783">הצג</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />לנקות את קובצי ה-cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">דיווח קריסות מושבת.</translation> <translation id="5317780077021120954">שמור</translation> <translation id="5327248766486351172">שם</translation> @@ -410,6 +426,7 @@ <translation id="5556459405103347317">טען שוב</translation> <translation id="5565735124758917034">פעיל</translation> <translation id="560412284261940334">ניהול אינו נתמך</translation> +<translation id="5610142619324316209">לבדוק את החיבור</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> הפנה אותך מחדש פעמים רבות מדי.</translation> <translation id="5629630648637658800">טעינת הגדרות המדיניות נכשלה</translation> <translation id="5631439013527180824">אסימון ניהול המכשיר אינו חוקי</translation> @@ -442,6 +459,7 @@ <translation id="6093795393556121384">הכרטיס אומת</translation> <translation id="6146055958333702838">בדוק את הכבלים והפעל מחדש את הנתבים, המודמים ושאר התקני הרשת שאתה משתמש בהם.</translation> +<translation id="614940544461990577">נסה:</translation> <translation id="6151417162996330722">תקופת התוקף של אישור השרת ארוכה מדי.</translation> <translation id="6154808779448689242">אסימון המדיניות שהוחזר אינו תואם לאסימון הנוכחי</translation> <translation id="6165508094623778733">למידע נוסף</translation> @@ -483,11 +501,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> חיפוש</translation> <translation id="6634865548447745291">לא ניתן לבקר כעת באתר <ph name="SITE" /> מכיוון ש<ph name="BEGIN_LINK" />פג התוקף של אישור זה<ph name="END_LINK" />. שגיאות רשת ותקיפות מתרחשות בדרך כלל לזמן מוגבל, כך שסביר להניח שדף זה יפעל מאוחר יותר.</translation> <translation id="6637478299472506933">ההורדה נכשלה</translation> +<translation id="6642894344118208103">לאפס את המודם או את הנתב</translation> <translation id="6644283850729428850">מדיניות זו אינה בתוקף.</translation> <translation id="6646897916597483132">הזן את ה-CVC בן ארבע הספרות המופיע בחזית הכרטיס</translation> <translation id="6656103420185847513">ערוך תיקייה</translation> <translation id="6660210980321319655">דיווח אוטומטי <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">האם להסיר מ-Chromium הצעות לטפסים?</translation> +<translation id="6685834062052613830">צא והשלם את ההגדרה</translation> <translation id="6710213216561001401">הקודם</translation> <translation id="6711464428925977395">משהו אינו תקין בשרת ה-proxy, או שהכתובת שגויה.</translation> <translation id="674375294223700098">שגיאת אישור שרת לא ידוע.</translation> @@ -522,6 +542,7 @@ <translation id="7052500709156631672">השער או שרת ה-Proxy קיבלו תגובה לא חוקית משרת גבוהה יותר בהיררכיה. </translation> <translation id="7087282848513945231">מחוז (בבריטניה ובאירלנד)</translation> <translation id="7088615885725309056">ישן יותר</translation> +<translation id="7090678807593890770">חפש ב-Google את <ph name="LINK" /></translation> <translation id="7108649287766967076">התרגום ל<ph name="TARGET_LANGUAGE" /> נכשל.</translation> <translation id="7139724024395191329">אמירות</translation> <translation id="7179921470347911571">הפעל מחדש עכשיו</translation> @@ -614,6 +635,7 @@ <translation id="8034955203865359138">לא נמצאו רשומות היסטוריה.</translation> <translation id="8088680233425245692">הצגת הפריט נכשלה.</translation> <translation id="8091372947890762290">ההפעלה ממתינה בשרת</translation> +<translation id="8134994873729925007">לא ניתן היה למצוא את <ph name="BEGIN_ABBR" />כתובת ה-DNS<ph name="END_ABBR" /> של השרת של <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">המחשב עבר למצב שינה.</translation> <translation id="8150722005171944719">הקובץ הנמצא ב-<ph name="URL" /> לא ניתן לקריאה. ייתכן שהקובץ הוסר או הועבר, או שהרשאות הקובץ מונעות גישה אליו.</translation> <translation id="8194797478851900357">&ביטול העברה</translation> @@ -641,6 +663,7 @@ <translation id="8311778656528046050">האם אתה בטוח שברצונך לטעון מחדש דף זה?</translation> <translation id="8332188693563227489">הגישה ל-<ph name="HOST_NAME" /> נדחתה</translation> <translation id="8349305172487531364">סרגל סימניות</translation> +<translation id="8363502534493474904">לכבות את מצב הטיסה</translation> <translation id="8364627913115013041">לא מוגדר.</translation> <translation id="8412145213513410671">קריסות (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">עליך להזין את אותו משפט-סיסמה פעמיים.</translation> @@ -698,6 +721,7 @@ <translation id="901974403500617787">רק הבעלים יכול להגדיר סימונים החלים על כל המערכת: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">השרת דחה את החיבור.</translation> <translation id="9020542370529661692">הדף הזה תורגם ל<ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">השתמש בשירות חיזוי כדי לטעון דפים מהר יותר</translation> <translation id="9039213469156557790">כמו כן, דף זה כולל משאבים נוספים שאינם מאובטחים. גורמים אחרים עלולים לראות את המשאבים האלה במהלך העברתם, ותוקף עלול לשנות אותם באופן שישנה את התנהגות הדף.</translation> <translation id="9049981332609050619">ניסית להגיע ל-<ph name="DOMAIN" />, אך השרת הציג אישור לא חוקי.</translation> <translation id="9050666287014529139">משפט-סיסמה</translation> @@ -711,6 +735,7 @@ <translation id="9170848237812810038">&ביטול</translation> <translation id="917450738466192189">אישור השרת לא חוקי.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> משתמש בפרוטוקול שאינו נתמך.</translation> +<translation id="9205078245616868884">הנתונים שלך מוצפנים באמצעות ביטוי הסיסמה לסינכרון. הזן אותו כדי להתחיל בסינכרון.</translation> <translation id="9207861905230894330">הוספת הפריט נכשלה.</translation> <translation id="933612690413056017">אין חיבור לאינטרנט</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 3856f9da..a51ce18d 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。このサーバーのセキュリティ証明書は、ご使用のパソコンのオペレーティング システムによって信頼されているものではありません。原因としては、不適切な設定や、悪意のあるユーザーによる接続妨害が考えられます。</translation> <translation id="1152921474424827756"><ph name="URL" /> の<ph name="BEGIN_LINK" />キャッシュ コピー<ph name="END_LINK" />にアクセスします</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> により途中で接続が切断されました。</translation> +<translation id="1161325031994447685">Wi-Fi に再度接続する</translation> <translation id="1175364870820465910">印刷(&P)...</translation> <translation id="1181037720776840403">削除</translation> <translation id="1195447618553298278">不明なエラーです。</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">ユーザー ポリシー</translation> <translation id="1644184664548287040">ネットワーク設定が無効なためインポートできませんでした。</translation> <translation id="1644574205037202324">履歴</translation> +<translation id="1645368109819982629">サポートされていないプロトコルです</translation> <translation id="1655462015569774233">{1,plural, =1{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書の有効期限が昨日付けで切れています。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。パソコンの時計は現在 <ph name="CURRENT_DATE" />に設定されています。この時刻が正しくない場合は、システムの時計を修正した後このページを更新してください。}other{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書の有効期限が # 日前に切れています。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。パソコンの時計は現在 <ph name="CURRENT_DATE" />に設定されています。この時刻が正しくない場合は、システムの時計を修正した後このページを更新してください。}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> では通常、暗号化して情報を保護しています。今回、Google Chrome から <ph name="SITE" /> への接続試行時に、このウェブサイトからいつもとは異なる誤った認証情報が返されました。悪意のあるユーザーが <ph name="SITE" /> になりすまそうとしているか、Wi-Fi ログイン画面で接続が中断された可能性があります。データのやり取りが行われる前に Google Chrome によって接続が停止されたため、情報は引き続き保護されています。</translation> <translation id="168841957122794586">サーバー証明書に脆弱な暗号鍵が含まれています。</translation> <translation id="1706954506755087368">{1,plural, =1{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書はおそらく明日以降に利用できるようになります。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。}other{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書はおそらく # 日後から利用できるようになります。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">AMEX</translation> +<translation id="1734878702283171397">システム管理者にお問い合わせください。</translation> <translation id="17513872634828108">開いているタブ</translation> <translation id="1753706481035618306">ページ番号</translation> <translation id="1763864636252898013">このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。このサーバーのセキュリティ証明書は、ご使用のデバイスのオペレーティング システムによって信頼されているものではありません。原因としては、不適切な設定や、悪意のあるユーザーによる接続妨害が考えられます。</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">プロキシは自動設定になっています。</translation> <translation id="2025623846716345241">再読み込みに関する確認</translation> <translation id="2030481566774242610">もしかして: <ph name="LINK" /></translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />プロキシとファイアウォールを確認する<ph name="END_LINK" /></translation> <translation id="2053553514270667976">郵便番号</translation> <translation id="2065985942032347596">認証が必要</translation> <translation id="2079545284768500474">取り消す</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">ポリシーが見つかりません</translation> <translation id="2213606439339815911">エントリを取得しています...</translation> <translation id="2214283295778284209"><ph name="SITE" /> に接続できません</translation> +<translation id="2227695659599072496">ネットワーク ケーブルまたはルーターを確認する</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />診断アプリ<ph name="END_LINK" />を使用して接続を修正してください</translation> <translation id="225207911366869382">この値は、このポリシーではサポートが終了しています。</translation> <translation id="2262243747453050782">HTTP エラーです</translation> <translation id="2279770628980885996">サーバーによるリクエストの実行中に、予期しない状況が発生しました。</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON パーサー</translation> <translation id="2495093607237746763">チェックボックスをオンにすると、Chromium がカード情報をこの端末に保存するためフォームにすばやく入力できるようになります。</translation> <translation id="2498091847651709837">新しいカードをスキャン</translation> +<translation id="2515629240566999685">電波状況を確認する</translation> <translation id="2516305470678292029">代替ユーザーインターフェース</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> から無効な応答が送信されました。</translation> <translation id="2552545117464357659">新しい</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">このページをブックマークに追加します</translation> <translation id="3270847123878663523">順序変更の取り消し(&U)</translation> <translation id="3286538390144397061">今すぐ再起動</translation> +<translation id="3288003805934695103">ページを再読み込みする</translation> +<translation id="3305707030755673451">データは <ph name="TIME" /> に同期パスフレーズで暗号化されました。同期を開始するには、同期パスフレーズを入力してください。</translation> <translation id="333371639341676808">このページでこれ以上ダイアログボックスを生成しない</translation> <translation id="3340978935015468852">設定</translation> <translation id="3355823806454867987">プロキシ設定の変更...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" />、<ph name="TITLE" />(<ph name="DOMAIN" />)を<ph name="BOOKMARKED" /></translation> <translation id="370665806235115550">読み込み中...</translation> <translation id="3712624925041724820">ライセンスを使い切りました</translation> +<translation id="3714780639079136834">モバイルデータまたは Wi-Fi を有効にする</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />プロキシ、ファイアウォール、DNS の設定を確認する<ph name="END_LINK" /></translation> <translation id="3739623965217189342">コピーしたリンク</translation> <translation id="3744899669254331632"><ph name="SITE" /> から送信された暗号化済みの認証情報を Chromium で処理できないため、現在このウェブサイトにアクセスできません。通常、ネットワーク エラーやネットワークへの攻撃は一時的なものです。しばらくするとページにアクセスできるようになります。</translation> <translation id="3748412725338508953">リダイレクトが多すぎます。</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">リーダーモード</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> はブロックされています</translation> <translation id="4021036232240155012">DNS はウェブサイトの名前をインターネット アドレスに変換するネットワーク サービスです。</translation> +<translation id="4021376465026729077">拡張機能を無効にする</translation> <translation id="4030383055268325496">追加の取り消し(&U)</translation> <translation id="4032534284272647190"><ph name="URL" /> へのアクセスが拒否されました。</translation> <translation id="404928562651467259">警告</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">確認用の署名に問題があります</translation> <translation id="4176463684765177261">無効</translation> <translation id="4196861286325780578">移動のやり直し(&R)</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ファイアウォールとウイルス対策の設定を確認する<ph name="END_LINK" /></translation> <translation id="4220128509585149162">クラッシュ</translation> <translation id="4250680216510889253">いいえ</translation> <translation id="4258748452823770588">署名が不適切です</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">プロキシの使用は無効ですが、プロキシの設定が明示的に指定されています。</translation> <translation id="4492190037599258964">「<ph name="SEARCH_STRING" />」の検索結果</translation> <translation id="4506176782989081258">検証エラー: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">システム管理者に問い合わせる</translation> <translation id="450710068430902550">管理者との共有</translation> <translation id="4522570452068850558">詳細</translation> <translation id="4535734014498033861">プロキシ サーバーとの接続に失敗しました。</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">Google 翻訳について</translation> <translation id="5040262127954254034">プライバシー</translation> <translation id="5045550434625856497">パスワードが正しくありません</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />プロキシ アドレスを確認する<ph name="END_LINK" /></translation> <translation id="5087286274860437796">サーバーの証明書が現在有効ではありません。</translation> <translation id="5089810972385038852">都道府県 / 州</translation> <translation id="5094747076828555589">このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。このサーバーのセキュリティ証明書は Chromium によって信頼されているものではありません。原因としては、不適切な設定や、悪意のあるユーザーによる接続妨害が考えられます。</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">ナビゲーションの確認</translation> <translation id="5299298092464848405">ポリシーの解析中にエラーが発生しました</translation> <translation id="5300589172476337783">表示</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Cookie を消去する<ph name="END_LINK" /></translation> <translation id="5308689395849655368">障害レポートが無効になっています。</translation> <translation id="5317780077021120954">保存</translation> <translation id="5327248766486351172">名前</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">再読み込み</translation> <translation id="5565735124758917034">有効</translation> <translation id="560412284261940334">管理はサポートされていません</translation> +<translation id="5610142619324316209">接続を確認する</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> でリダイレクトが繰り返し行われました。</translation> <translation id="5629630648637658800">ポリシー設定を読み込めませんでした</translation> <translation id="5631439013527180824">無効なデバイス管理トークンです</translation> @@ -434,6 +451,7 @@ <translation id="6093795393556121384">カードが確認されました</translation> <translation id="6146055958333702838">ケーブルを確認し、使用しているネットワーク デバイス(ルーター、モデムなど)を 再起動してください。</translation> +<translation id="614940544461990577">次をお試しください:</translation> <translation id="6151417162996330722">サーバー証明書の有効期限が長すぎます。</translation> <translation id="6154808779448689242">返されたポリシー トークンは現在のトークンと一致しません</translation> <translation id="6165508094623778733">詳しく見る</translation> @@ -475,11 +493,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> 検索</translation> <translation id="6634865548447745291"><ph name="BEGIN_LINK" />証明書が取り消されている<ph name="END_LINK" />ため、現在 <ph name="SITE" /> にアクセスできません。通常、ネットワーク エラーや不正な操作は一時的なものです。少し時間をおくと、またページにアクセスできるようになる可能性があります。</translation> <translation id="6637478299472506933">ダウンロードの失敗</translation> +<translation id="6642894344118208103">モデムまたはルーターをリセットする</translation> <translation id="6644283850729428850">このポリシーは廃止されました。</translation> <translation id="6646897916597483132">カードの表側に記載されている 4 桁の CVC を入力します</translation> <translation id="6656103420185847513">フォルダの編集</translation> <translation id="6660210980321319655"><ph name="CRASH_TIME" /> にレポートを自動送信しました</translation> <translation id="6671697161687535275">Chromium から候補を削除してもよろしいですか?</translation> +<translation id="6685834062052613830">ログアウトして設定を完了してください</translation> <translation id="6710213216561001401">前へ</translation> <translation id="6711464428925977395">プロキシ サーバーに問題がある、またはアドレスが正しくありません。</translation> <translation id="674375294223700098">不明なサーバー証明書エラー</translation> @@ -513,6 +533,7 @@ <translation id="7052500709156631672">ゲートウェイまたはプロキシ サーバーが、上流のサーバーから無効な応答を受信しました。</translation> <translation id="7087282848513945231">郡</translation> <translation id="7088615885725309056">古い</translation> +<translation id="7090678807593890770"><ph name="LINK" /> を Google で検索してください</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" />に翻訳できませんでした。</translation> <translation id="7139724024395191329">管轄区域</translation> <translation id="7179921470347911571">今すぐ再起動</translation> @@ -605,6 +626,7 @@ <translation id="8034955203865359138">履歴エントリが見つかりません。</translation> <translation id="8088680233425245692">記事を表示できませんでした。</translation> <translation id="8091372947890762290">サーバーで有効化が保留になっています</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> のサーバーの <ph name="BEGIN_ABBR" />DNS アドレス<ph name="END_ABBR" />が見つかりませんでした。</translation> <translation id="8149426793427495338">パソコンがスリープ状態です。</translation> <translation id="8150722005171944719"><ph name="URL" /> のファイルを読むことができません。削除されたか移動された可能性があります。ファイルに対するアクセス権がない場合もあります。</translation> <translation id="8194797478851900357">移動の取り消し(&U)</translation> @@ -627,6 +649,7 @@ <translation id="8311778656528046050">このページを再読み込みしてもよろしいですか?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> へのアクセスが拒否されました</translation> <translation id="8349305172487531364">ブックマーク バー</translation> +<translation id="8363502534493474904">機内モードをオフにする</translation> <translation id="8364627913115013041">未設定</translation> <translation id="8412145213513410671">障害数(<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">同じパスフレーズを 2 回入力する必要があります。</translation> @@ -685,6 +708,7 @@ <translation id="901974403500617787">システム全体に適用されるフラグは所有者(<ph name="OWNER_EMAIL" />)のみが設定できます。</translation> <translation id="9020142588544155172">サーバーが接続を拒否しました。</translation> <translation id="9020542370529661692">このページは<ph name="TARGET_LANGUAGE" />に翻訳されています</translation> +<translation id="9038649477754266430">予測サービスを使用してページをより迅速に読み込む</translation> <translation id="9039213469156557790">加えて、このページには安全でない他のリソースが含まれています。このリソースは送信中に他のユーザーから見られる可能性があります。また、悪意のあるユーザーによって改変されページの動作が変わる可能性もあります。</translation> <translation id="9049981332609050619"><ph name="DOMAIN" /> にアクセスしようとしましたが、サーバーから無効な証明書が提示されました。</translation> <translation id="9050666287014529139">パスフレーズ</translation> @@ -698,6 +722,7 @@ <translation id="9170848237812810038">取消(&U)</translation> <translation id="917450738466192189">サーバーの証明書が無効です。</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> ではサポートされていないプロトコルが使用されています。</translation> +<translation id="9205078245616868884">データは同期パスフレーズで暗号化されます。同期を開始するには、同期パスフレーズを入力してください。</translation> <translation id="9207861905230894330">記事を追加できませんでした。</translation> <translation id="933612690413056017">インターネット接続がありません</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 4548d566b..879f538 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -25,6 +25,7 @@ <translation id="1150979032973867961">ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರವು ನಿಮ್ಮ ಸಾಧನದ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಪ್ರಕಾರ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಲ್ಲ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.</translation> <translation id="1152921474424827756"><ph name="URL" /> ನ <ph name="BEGIN_LINK" />ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ನಕಲನ್ನು<ph name="END_LINK" /> ಪ್ರವೇಶಿಸಿ</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ಅನಿರೀಕ್ಷಿತವಾಗಿ ಸಂಪರ್ಕವನ್ನು ಮುಚ್ಚಿದೆ.</translation> +<translation id="1161325031994447685">ವೈ-ಫೈಗೆ ಮರುಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="1175364870820465910">&ಮುದ್ರಿಸಿ...</translation> <translation id="1181037720776840403">ತೆಗೆದುಹಾಕು</translation> <translation id="1195447618553298278">ಅಜ್ಞಾತ ದೋಷ.</translation> @@ -66,12 +67,14 @@ <translation id="1640180200866533862">ಬಳಕೆದಾರನ ನೀತಿಗಳು</translation> <translation id="1644184664548287040">ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅಮಾನ್ಯವಾಗಿದೆ ಹಾಗೂ ಆಮದು ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="1644574205037202324">ಇತಿಹಾಸ</translation> +<translation id="1645368109819982629">ಬೆಂಬಲವಿಲ್ಲದ ಪ್ರೊಟೋಕಾಲ್</translation> <translation id="1655462015569774233">{1,plural, =1{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರದ ಅವಧಿಯು ನಿನ್ನೆ ಮುಗಿದಿದೆ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನ ಗಡಿಯಾರವನ್ನು ಪ್ರಸ್ತುತ <ph name="CURRENT_DATE" /> ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ. ಅದು ಸರಿಯಾಗಿದೆಯೇ? ಇಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಗಡಿಯಾರವನ್ನು ನೀವು ಸರಿಪಡಿಸಿ ಹಾಗೂ ನಂತರ ಈ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ.}one{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರದ ಅವಧಿಯು # ದಿನಗಳ ಹಿಂದೆ ಮುಗಿದಿದೆ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನ ಗಡಿಯಾರವನ್ನು ಪ್ರಸ್ತುತ <ph name="CURRENT_DATE" /> ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ. ಅದು ಸರಿಯಾಗಿದೆಯೇ? ಇಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಗಡಿಯಾರವನ್ನು ನೀವು ಸರಿಪಡಿಸಿ ಹಾಗೂ ನಂತರ ಈ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ.}other{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರದ ಅವಧಿಯು # ದಿನಗಳ ಹಿಂದೆ ಮುಗಿದಿದೆ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನ ಗಡಿಯಾರವನ್ನು ಪ್ರಸ್ತುತ <ph name="CURRENT_DATE" /> ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ. ಅದು ಸರಿಯಾಗಿದೆಯೇ? ಇಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಗಡಿಯಾರವನ್ನು ನೀವು ಸರಿಪಡಿಸಿ ಹಾಗೂ ನಂತರ ಈ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> ಸಾಮಾನ್ಯವಾಗಿ ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಸಂರಕ್ಷಿಸಲು ಎನ್ಕ್ರಿಪ್ಶನ್ ಪ್ರಯೋಜನವನ್ನು ಬಳಸಿಕೊಳ್ಳುತ್ತದೆ. ಈ ಸಂದರ್ಭದಲ್ಲಿ Google Chrome <ph name="SITE" /> ವೆಬ್ಸೈಟ್ಗೆ ಸಂಪರ್ಕಿಸಲು ಪ್ರಯತ್ನಿಸಿದಾಗ, ಆ ವೆಬ್ಸೈಟ್ ಅಸಹಜ ಮತ್ತು ತಪ್ಪು ರುಜುವಾತುಗಳನ್ನು ಹಿಂತಿರುಗಿಸಿದೆ. ದಾಳಿಕೋರರು <ph name="SITE" /> ರೂಪದಲ್ಲಿ ಸೋಗು ಹಾಕಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವಾಗ ಅಥವಾ ವೈ-ಫೈ ಸೈನ್-ಇನ್ ಪರದೆಯು ಸಂಪರ್ಕಕ್ಕೆ ಅಡ್ಡಿಯುಂಟು ಮಾಡಿದಾಗ ಇದು ಕಂಡುಬರಬಹುದು. ಯಾವುದೇ ಡೇಟಾವನ್ನು ವಿನಿಮಯ ಮಾಡಿಕೊಳ್ಳುವ ಮೊದಲೇ Google Chrome ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿರುವ ಕಾರಣ, ನಿಮ್ಮ ಮಾಹಿತಿ ಈಗಲೂ ಸುರಕ್ಷಿತವಾಗಿದೆ.</translation> <translation id="168841957122794586">ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರವು ದುರ್ಬಲ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಕೀಯನ್ನು ಹೊಂದಿದೆ.</translation> <translation id="1706954506755087368">{1,plural, =1{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ; ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರ ಬಹುಶಃ ನಾಳೆಯಿಂದ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.}one{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರ ಬಹುಶಃ ಭವಿಷ್ಯದಲ್ಲಿ # ದಿನಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.}other{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರ ಬಹುಶಃ ಭವಿಷ್ಯದಲ್ಲಿ # ದಿನಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಲು ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="17513872634828108">ತೆರೆದ ಟ್ಯಾಬ್ಗಳು</translation> <translation id="1753706481035618306">ಪುಟ ಸಂಖ್ಯೆ</translation> <translation id="1763864636252898013">ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರವು ನಿಮ್ಮ ಸಾಧನದ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಪ್ರಕಾರ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಲ್ಲ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.</translation> @@ -93,6 +96,7 @@ <translation id="2025186561304664664">ಪ್ರಾಕ್ಸಿಯನ್ನು ಸ್ವಯಂ ಕಾನ್ಫಿಗರ್ ಆಗಿ ಹೊಂದಿಸಲಾಗಿದೆ.</translation> <translation id="2025623846716345241">ಮರುಲೋಡ್ ದೃಢೀಕರಿಸಿ</translation> <translation id="2030481566774242610">ನಿಮ್ಮ ಮಾತಿನ ಅರ್ಥ <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />ಪ್ರಾಕ್ಸಿ ಮತ್ತು ಫೈರ್ವಾಲ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ಪಿನ್ ಕೋಡ್</translation> <translation id="2065985942032347596">ದೃಢೀಕರಣದ ಅವಶ್ಯಕತೆಯಿದೆ</translation> <translation id="2079545284768500474">ರದ್ದುಮಾಡು</translation> @@ -117,6 +121,8 @@ <translation id="2212735316055980242">ನೀತಿ ಕಂಡು ಬಂದಿಲ್ಲ</translation> <translation id="2213606439339815911">ನಮೂದುಗಳನ್ನು ಪಡೆಯಲಾಗುತ್ತಿದೆ...</translation> <translation id="2214283295778284209"><ph name="SITE" /> ಲಭ್ಯವಿಲ್ಲ</translation> +<translation id="2227695659599072496">ನೆಟ್ವರ್ಕ್ ಕೇಬಲ್ ಅಥವಾ ರೂಟರ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />ಡಯಾಗ್ನಸ್ಟಿಕ್ಸ್ ಅಪ್ಲಿಕೇಶನ್<ph name="END_LINK" /> ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಸಂಪರ್ಕವನ್ನು ಸರಿಪಡಿಸಿ</translation> <translation id="225207911366869382">ಈ ನೀತಿಗಾಗಿ ಈ ಮೌಲ್ಯವನ್ನು ಅಸಮ್ಮತಿಸಲಾಗಿದೆ.</translation> <translation id="2262243747453050782">HTTP ದೋಷ</translation> <translation id="2279770628980885996">ವಿನಂತಿಯನ್ನು ಪೂರೈಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವಾಗ ಅನಿರೀಕ್ಷಿತವಾದ ಸಂದರ್ಭವೊಂದನ್ನು ಸರ್ವರ್ ಎದುರಿಸಿದೆ. </translation> @@ -144,6 +150,7 @@ <translation id="2495083838625180221">JSON ವಿಶ್ಲೇಷಕ</translation> <translation id="2495093607237746763">ಪರಿಶೀಲಿಸಿದರೆ, ವೇಗವಾಗಿ ಫಾರ್ಮ್ ಭರ್ತಿ ಮಾಡಲು Chromium ಈ ಸಾಧನದಲ್ಲಿ ನಿಮ್ಮ ಕಾರ್ಡ್ನ ಪ್ರತಿಯನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ.</translation> <translation id="2498091847651709837">ಹೊಸ ಕಾರ್ಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ</translation> +<translation id="2515629240566999685">ನಿಮ್ಮ ಪ್ರದೇಶದಲ್ಲಿನ ಸಿಗ್ನಲ್ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="2516305470678292029">UI ಪರ್ಯಾಯಗಳು</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> ಅಮಾನ್ಯ ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿದೆ.</translation> <translation id="2552545117464357659">ನವೀನ</translation> @@ -215,6 +222,8 @@ <translation id="3254409185687681395">ಈ ಪುಟ ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ</translation> <translation id="3270847123878663523">&ಮರುಕ್ರಮಗೊಳಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸು</translation> <translation id="3286538390144397061">ಈಗ ಮರುಪ್ರಾರಂಭಿಸಿ</translation> +<translation id="3288003805934695103">ಪುಟ ಮರುಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> +<translation id="3305707030755673451">ನಿಮ್ಮ ಡೇಟಾವನ್ನು <ph name="TIME" /> ರಂದು ನಿಮ್ಮ ಸಿಂಕ್ ಪಾಸ್ಫ್ರೇಸ್ನೊಂದಿಗೆ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು ಅದನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="333371639341676808">ಈ ಪುಟ ಹೆಚ್ಚುವರಿ ಸಂವಾದಗಳನ್ನು ರಚಿಸುವುದನ್ನು ತಡೆಯಿರಿ.</translation> <translation id="3340978935015468852">ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="3355823806454867987">ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಿಸಿ...</translation> @@ -257,6 +266,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="3712624925041724820">ಪರವಾನಗಿಗಳು ಬರಿದಾಗಿವೆ</translation> +<translation id="3714780639079136834">ಮೊಬೈಲ್ ಡೇಟಾ ಅಥವಾ ವೈ-ಫೈ ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />ಪ್ರಾಕ್ಸಿ, ಫೈರ್ವಾಲ್ ಮತ್ತು DNS ಕಾನ್ಫಿಗರೇಶನ್ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ<ph name="END_LINK" /></translation> <translation id="3739623965217189342">ನೀವು ನಕಲಿಸಿದ ಲಿಂಕ್</translation> <translation id="3744899669254331632">ನೀವು ಇದೀಗ <ph name="SITE" /> ಗೆ ಭೇಟಿ ನೀಡಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ವೆಬ್ಸೈಟ್ Chromium ಗೆ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗದ ಅವ್ಯವಸ್ಥಿತ ರುಜುವಾತುಗಳನ್ನು ಕಳುಹಿಸಿದೆ. ನೆಟ್ವರ್ಕ್ ದೋಷಗಳು ಮತ್ತು ಆಕ್ರಮಣಗಳು ಸಾಮಾನ್ಯವಾಗಿ ತಾತ್ಕಾಲಿಕವಾಗಿರುತ್ತವೆ, ಆದ್ದರಿಂದ ಈ ಪುಟವು ಬಹುಶಃ ನಂತರ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು.</translation> <translation id="3748412725338508953">ಅಲ್ಲಿ ಅತೀ ಹೆಚ್ಚು ಮರುನಿರ್ದೇಶನಗಳಿದ್ದವು</translation> @@ -278,6 +289,7 @@ <translation id="3963721102035795474">ರೀಡರ್ ಮೋಡ್</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="4021036232240155012">DNS ಎನ್ನುವುದು ನೆಟ್ವರ್ಕ್ ಸೇವೆಯಾಗಿದ್ದು ಇದು ವೆಬ್ಸೈಟ್ ಹೆಸರನ್ನು ಅದರ ಇಂಟರ್ನೆಟ್ ವಿಳಾಸವಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.</translation> +<translation id="4021376465026729077">ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="4030383055268325496">&ಸೇರಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸಿ</translation> <translation id="4032534284272647190"><ph name="URL" /> ಗೆ ಪ್ರವೇಶವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ.</translation> <translation id="404928562651467259">ಎಚ್ಚರಿಕೆ</translation> @@ -294,6 +306,7 @@ <translation id="4171400957073367226">ತಪ್ಪು ಪರಿಶೀಲನೆ ಸಹಿ</translation> <translation id="4176463684765177261">ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="4196861286325780578">&ಸರಿಸುವುದನ್ನು ಮತ್ತೆಮಾಡು</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ಫೈರ್ವಾಲ್ ಮತ್ತು ಆಂಟಿವೈರಸ್ ಕಾನ್ಫಿಗರೇಶನ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ<ph name="END_LINK" /></translation> <translation id="4220128509585149162">ವಿಫಲತೆಗಳು</translation> <translation id="4250680216510889253">ಇಲ್ಲ</translation> <translation id="4258748452823770588">ತಪ್ಪಾದ ಸಹಿ</translation> @@ -314,6 +327,7 @@ <translation id="443673843213245140">ಪ್ರಾಕ್ಸಿಯ ಬಳಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಆದರೆ ಬಹಿರಂಗ ಪ್ರಾಕ್ಸಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿದೆ.</translation> <translation id="4492190037599258964"><ph name="SEARCH_STRING" />' ಕುರಿತ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು</translation> <translation id="4506176782989081258">ಮೌಲ್ಯೀಕರಿಸುವಿಕೆಯ ದೋಷ: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="450710068430902550">ನಿರ್ವಾಹಕರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳುವುದು</translation> <translation id="4522570452068850558">ವಿವರಗಳು</translation> <translation id="4535734014498033861">ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಸಂಪರ್ಕ ವಿಫಲವಾಗಿದೆ.</translation> @@ -351,6 +365,7 @@ <translation id="5031870354684148875">Google ಅನುವಾದದ ಕುರಿತು</translation> <translation id="5040262127954254034">ಗೌಪ್ಯತೆ</translation> <translation id="5045550434625856497">ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />ಪ್ರಾಕ್ಸಿ ವಿಳಾಸವನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ<ph name="END_LINK" /></translation> <translation id="5087286274860437796">ಈ ಸಮಯದಲ್ಲಿ ಸರ್ವರ್ನ ಪ್ರಮಾಣಪತ್ರ ಮಾನ್ಯವಾಗಿಲ್ಲ.</translation> <translation id="5089810972385038852">ರಾಜ್ಯ</translation> <translation id="5094747076828555589">ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರವು Chromium ಮೂಲಕ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಲ್ಲ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.</translation> @@ -369,6 +384,7 @@ <translation id="5295309862264981122">ನ್ಯಾವಿಗೇಶನ್ ಅನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ</translation> <translation id="5299298092464848405">ನೀತಿಯ ಪಾರ್ಸಿಂಗ್ನಲ್ಲಿ ದೋಷ</translation> <translation id="5300589172476337783">ಪ್ರದರ್ಶಿಸಿ</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />ನಿಮ್ಮ ಕುಕೀಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ<ph name="END_LINK" /></translation> <translation id="5308689395849655368">ಕ್ರ್ಯಾಶ್ ವರದಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="5317780077021120954">ಉಳಿಸು</translation> <translation id="5327248766486351172">ಹೆಸರು</translation> @@ -396,6 +412,7 @@ <translation id="5556459405103347317">ಮರುಲೋಡ್</translation> <translation id="5565735124758917034">ಸಕ್ರಿಯ</translation> <translation id="560412284261940334">ನಿರ್ವಾಹಕ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation> +<translation id="5610142619324316209">ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> ನಿಮ್ಮನ್ನು ತೀರಾ ಹೆಚ್ಚು ಬಾರಿ ಮರುನಿರ್ದೇಶಿಸಿದೆ.</translation> <translation id="5629630648637658800">ನೀತಿಯ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ</translation> <translation id="5631439013527180824">ಅಮಾನ್ಯವಾದ ಸಾಧನ ನಿರ್ವಹಣೆ ಟೋಕನ್</translation> @@ -427,6 +444,7 @@ <translation id="6060685159320643512">ಜಾಗ್ರತೆ, ಈ ಪ್ರಯೋಗಗಳು ವಿಫಲವಾಗಬಹುದು</translation> <translation id="6093795393556121384">ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗಿದೆ</translation> <translation id="6146055958333702838">ಯಾವುದೇ ಕೇಬಲ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ. ನೀವು ಬಳಸುತ್ತಿರಬಹುದಾದ ಯಾವುದೇ ರೂಟರ್ಗಳು, ಮೋಡೆಮ್ಗಳು ಅಥವಾ ಇತರ ನೆಟ್ವರ್ಕ್ ಸಾಧನಗಳನ್ನು ರೀಬೂಟ್ ಮಾಡಿ.</translation> +<translation id="614940544461990577">ಪ್ರಯತ್ನಿಸಿ:</translation> <translation id="6151417162996330722">ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರವು ತುಂಬಾ ಉದ್ದವಾದ ವಾಯಿದೆ ಅವಧಿಯನ್ನು ಹೊಂದಿದೆ.</translation> <translation id="6154808779448689242">ಹಿಂತಿರುಗಿಸಲಾದ ನೀತಿಯ ಟೋಕನ್ಗೆ ಪ್ರಸ್ತುತ ಟೋಕನ್ ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ</translation> <translation id="6165508094623778733">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation> @@ -467,11 +485,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> ಹುಡುಕಾಟ</translation> <translation id="6634865548447745291">ನೀವು <ph name="SITE" /> ಗೆ ಭೇಟಿ ನೀಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಏಕೆಂದರೆ <ph name="BEGIN_LINK" />ಈ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಹಿಂಪಡೆದುಕೊಳ್ಳಲಾಗಿದೆ<ph name="END_LINK" />. ನೆಟ್ವರ್ಕ್ ದೋಷಗಳು ಮತ್ತು ಆಕ್ರಮಣಗಳು ತಾತ್ಕಾಲಿಕ, ಹೀಗಾಗಿ ಈ ಪುಟವು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಕಾರ್ಯ ನಿರ್ವಹಿಸಬಹುದು.</translation> <translation id="6637478299472506933">ಡೌನ್ಲೋಡ್ ವಿಫಲವಾಗಿದೆ</translation> +<translation id="6642894344118208103">ಮೋಡೆಮ್ ಅಥವಾ ರೂಟರ್ ಮರುಹೊಂದಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="6644283850729428850">ಈ ನೀತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ.</translation> <translation id="6646897916597483132">ನಿಮ್ಮ ಕಾರ್ಡ್ ಮುಂಭಾಗದಲ್ಲಿರುವ 4-ಅಂಕಿ CVC ಅನ್ನು ನಮೂದಿಸಿ</translation> <translation id="6656103420185847513">ಫೋಲ್ಡರ್ ಸಂಪಾದಿಸಿ</translation> <translation id="6660210980321319655"><ph name="CRASH_TIME" /> ಸಮಯಕ್ಕೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವರದಿ ಮಾಡಲಾಗಿದೆ</translation> <translation id="6671697161687535275">Chromium ನಿಂದ ಫಾರ್ಮ್ ಸಲಹೆಯನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?</translation> +<translation id="6685834062052613830">ಸೈನ್ ಔಟ್ ಮಾಡಿ ಹಾಗೂ ಸೆಟಪ್ ಪೂರ್ಣಗೊಳಿಸಿ</translation> <translation id="6710213216561001401">ಹಿಂದೆ</translation> <translation id="6711464428925977395">ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ನಲ್ಲಿ ಏನೋ ದೋಷವಿದೆ ಅಥವಾ ವಿಳಾಸವು ತಪ್ಪಾಗಿದೆ.</translation> <translation id="674375294223700098">ಅಜ್ಞಾತ ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರ ದೋಷ.</translation> @@ -505,6 +525,7 @@ <translation id="7052500709156631672">ಅಪ್ಸ್ಟ್ರೀಮ್ ಸರ್ವರ್ನಿಂದ ಗೇಟ್ವೇ ಅಥವಾ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಅಮಾನ್ಯ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸ್ವೀಕರಿಸಿದೆ.</translation> <translation id="7087282848513945231">ರಾಷ್ಟ್ರ</translation> <translation id="7088615885725309056">ಹಳೆಯದು</translation> +<translation id="7090678807593890770"><ph name="LINK" /> ಗೆ Google ಹುಡುಕಾಟ</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" /> ಗೆ ಅನುವಾದ ವಿಫಲವಾಗಿದೆ.</translation> <translation id="7139724024395191329">ಎಮಿರೇಟ್</translation> <translation id="7179921470347911571">ಇದೀಗ ಮರುಪ್ರಾರಂಭಿಸು</translation> @@ -597,6 +618,7 @@ <translation id="8034955203865359138">ಯಾವುದೇ ಇತಿಹಾಸ ದಾಖಲೆಗಳು ಕಂಡುಬಂದಿಲ್ಲ.</translation> <translation id="8088680233425245692">ಲೇಖನವನ್ನು ವೀಕ್ಷಿಸಲು ವಿಫಲವಾಗಿದೆ.</translation> <translation id="8091372947890762290">ಸರ್ವರ್ನಲ್ಲಿ ಸಕ್ರಿಯತೆ ಬಾಕಿ ಉಳಿದಿದೆ</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> ಅವರ ಸರ್ವರ್ <ph name="BEGIN_ABBR" />DNS ವಿಳಾಸ<ph name="END_ABBR" /> ಕಂಡುಬಂದಿಲ್ಲ.</translation> <translation id="8149426793427495338">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗಿದೆ.</translation> <translation id="8150722005171944719"><ph name="URL" /> ನಲ್ಲಿನ ಫೈಲ್ ಓದುವಂತಿರುವುದಿಲ್ಲ. ಇದನ್ನು ತೆಗೆದುಹಾಕಬಹುದು, ಚಲಿಸಬಹುದು, ಅಥವಾ ಫೈಲ್ ಅನುಮತಿಗಳು ಪ್ರವೇಶವನ್ನು ತಡೆಗಟ್ಟುತ್ತಿರಬಹುದು.</translation> <translation id="8194797478851900357">&ಸರಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸು</translation> @@ -622,6 +644,7 @@ <translation id="8311778656528046050">ಈ ಪುಟವನ್ನು ಮರುಲೋಡ್ ಮಾಡುವುದು ಖಚಿತವೇ?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> ಗೆ ಪ್ರವೇಶವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ</translation> <translation id="8349305172487531364">ಬುಕ್ಮಾರ್ಕ್ಗಳ ಬಾರ್</translation> +<translation id="8363502534493474904">ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ ಆಫ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="8364627913115013041">ಹೊಂದಿಸಿಲ್ಲ.</translation> <translation id="8412145213513410671">(<ph name="CRASH_COUNT" />) ಕ್ರ್ಯಾಶ್ಗಳು </translation> <translation id="8412392972487953978">ನೀವು ಒಂದೇ ರೀತಿಯ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ಎರಡು ಬಾರಿ ನಮೂದಿಸಬೇಕು.</translation> @@ -679,6 +702,7 @@ <translation id="901974403500617787">ಸಿಸ್ಟಂನಾದ್ಯಂತ ಅನ್ವಯವಾಗುವ ಫ್ಲ್ಯಾಗ್ಗಳನ್ನು ಮಾಲೀಕರಿಂದ ಮಾತ್ರ ಹೊಂದಿಸಲು ಸಾಧ್ಯ: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">ಸರ್ವರ್ ಸಂಪರ್ಕವನ್ನು ನಿರಾಕರಿಸಿದೆ.</translation> <translation id="9020542370529661692">ಈ ಪುಟವನ್ನು <ph name="TARGET_LANGUAGE" /> ಗೆ ಅನುವಾದಿಸಲಾಗಿದೆ</translation> +<translation id="9038649477754266430">ಪುಟಗಳನ್ನು ಹೆಚ್ಚು ವೇಗವಾಗಿ ಲೋಡ್ ಮಾಡಲು ಮುನ್ನೋಟಗಳನ್ನು ಬಳಸಿ</translation> <translation id="9039213469156557790">ಅಲ್ಲದೇ, ಸುರಕ್ಷಿತವಲ್ಲದ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಈ ಪುಟ ಹೊಂದಿದೆ. ಸ್ಥಿತ್ಯಂತರಗೊಳ್ಳುವ ಸಂದರ್ಭದಲ್ಲಿ ಈ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಇತರರೂ ವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ ಮತ್ತು ಪುಟದ ಹೊರನೋಟವೇ ಬದಲಾಗುವಂತೆ ಆಕ್ರಮಣಕಾರರು ಅದನ್ನು ತಿದ್ದಬಹುದಾಗಿದೆ.</translation> <translation id="9049981332609050619">ನೀವು <ph name="DOMAIN" /> ಅನ್ನು ತಲುಪಲು ಪ್ರಯತ್ನಿಸಿರುವಿರಿ, ಆದರೆ ಸರ್ವರ್ ಅಮಾನ್ಯ ಪ್ರಮಾಣಪತ್ರವನ್ನು ನೀಡಿದೆ.</translation> <translation id="9050666287014529139">ಪಾಸ್ಫ್ರೇಸ್</translation> @@ -692,6 +716,7 @@ <translation id="9170848237812810038">&ರದ್ದುಮಾಡು</translation> <translation id="917450738466192189">ಸರ್ವರ್ನ ಪ್ರಮಾಣಪತ್ರವು ಅಮಾನ್ಯವಾಗಿದೆ.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> ಬೆಂಬಲಿತವಲ್ಲದ ಪ್ರೋಟೋಕಾಲ್ ಬಳಸುತ್ತಿದೆ.</translation> +<translation id="9205078245616868884">ನಿಮ್ಮ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಸಿಂಕ್ ಪಾಸ್ಫ್ರೇಸ್ನೊಂದಿಗೆ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು ಅದನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="9207861905230894330">ಲೇಖನವನ್ನು ಸೇರಿಸಲು ವಿಫಲವಾಗಿದೆ.</translation> <translation id="933612690413056017">ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿಲ್ಲ</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index e18b9aa..7c7c64b 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">이 서버가 <ph name="DOMAIN" />임을 입증할 수 없으며 컴퓨터의 운영체제에서 신뢰하는 보안 인증서가 아닙니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.</translation> <translation id="1152921474424827756"><ph name="URL" />의 <ph name="BEGIN_LINK" />캐시된 사본<ph name="END_LINK" />에 액세스</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" />와(과)의 연결이 예기치 않게 종료되었습니다.</translation> +<translation id="1161325031994447685">Wi-Fi에 다시 연결</translation> <translation id="1175364870820465910">인쇄(&P)</translation> <translation id="1181037720776840403">삭제</translation> <translation id="1195447618553298278">알 수 없는 오류</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">사용자 정책</translation> <translation id="1644184664548287040">네트워크 구성이 잘못되어 가져올 수 없습니다.</translation> <translation id="1644574205037202324">방문 기록</translation> +<translation id="1645368109819982629">지원되지 않는 프로토콜</translation> <translation id="1655462015569774233">{1,plural, =1{서버의 보안 인증서가 어제 만료되어 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다. 현재 컴퓨터의 시계가 <ph name="CURRENT_DATE" />로 설정되어 있습니다. 시간이 정확하지 않으면 시스템 시계를 수정한 뒤 이 페이지를 새로고침하세요.}other{서버의 보안 인증서가 #일 전에 만료되어 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다. 현재 컴퓨터의 시계가 <ph name="CURRENT_DATE" />로 설정되어 있습니다. 시간이 정확하지 않으면 시스템 시계를 수정한 뒤 이 페이지를 새로고침하세요.}}</translation> <translation id="1676269943528358898"><ph name="SITE" />에서는 사용자 정보를 보호하기 위해 일반적으로 암호화를 사용합니다. 이번에 Chrome에서 <ph name="SITE" />에 연결을 시도했을 때 웹사이트에서 비정상적이고 잘못된 사용자 인증 정보를 반환했습니다. 이는 공격자가 <ph name="SITE" />인 것처럼 가장하려고 하거나 Wi-Fi 로그인 화면이 연결을 방해했기 때문일 수 있습니다. 데이터 교환이 발생하기 전에 Chrome에서 연결을 중단했기 때문에 사용자 정보는 안전합니다.</translation> <translation id="168841957122794586">서버 인증서에 안전성이 낮은 암호화 키가 포함되어 있습니다.</translation> <translation id="1706954506755087368">{1,plural, =1{서버의 보안 인증서가 내일 발효될 예정이며 이에 따라 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.}other{서버의 보안 인증서가 #일 후 발효될 예정이며 이에 따라 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">시스템 관리자에게 문의하세요.</translation> <translation id="17513872634828108">열린 탭</translation> <translation id="1753706481035618306">페이지 번호</translation> <translation id="1763864636252898013">이 서버가 <ph name="DOMAIN" />임을 입증할 수 없으며 기기의 운영체제에서 신뢰하는 보안 인증서가 아닙니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">프록시가 자동 설정되도록 지정됩니다.</translation> <translation id="2025623846716345241">새로고침 확인</translation> <translation id="2030481566774242610"><ph name="LINK" />을(를) 찾으셨나요?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />프록시 및 방화벽 확인<ph name="END_LINK" /></translation> <translation id="2053553514270667976">우편번호</translation> <translation id="2065985942032347596">인증 필요</translation> <translation id="2079545284768500474">실행 취소</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">정책을 찾을 수 없음</translation> <translation id="2213606439339815911">항목을 가져오는 중...</translation> <translation id="2214283295778284209"><ph name="SITE" />을(를) 사용할 수 없음</translation> +<translation id="2227695659599072496">네트워크 케이블 또는 라우터 확인</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />진단 앱<ph name="END_LINK" />을 사용하여 연결 문제를 해결하세요.</translation> <translation id="225207911366869382">이 값은 이 정책에 사용되지 않습니다.</translation> <translation id="2262243747453050782">HTTP 오류</translation> <translation id="2279770628980885996">서버가 요청을 수행하는 동안 예상치 못한 상황이 발생했습니다.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON 파서</translation> <translation id="2495093607237746763">선택하면 이 기기에 카드 사본이 저장되어 Chromium에서 양식을 더 빠르게 입력할 수 있습니다.</translation> <translation id="2498091847651709837">새 카드 스캔</translation> +<translation id="2515629240566999685">현재 지역의 신호 확인</translation> <translation id="2516305470678292029">대체 UI</translation> <translation id="255002559098805027"><ph name="HOST_NAME" />에서 잘못된 응답을 전송했습니다.</translation> <translation id="2552545117464357659">이전</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">페이지 북마크</translation> <translation id="3270847123878663523">재정렬 실행 취소(&U)</translation> <translation id="3286538390144397061">지금 다시 시작</translation> +<translation id="3288003805934695103">페이지 새로고침</translation> +<translation id="3305707030755673451"><ph name="TIME" />에 동기화 암호로 데이터가 암호화되었습니다. 동기화를 시작하려면 입력하세요.</translation> <translation id="333371639341676808">이 페이지가 추가적인 대화를 생성하지 않도록 차단합니다.</translation> <translation id="3340978935015468852">설정</translation> <translation id="3355823806454867987">프록시 설정 변경...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">로드 중...</translation> <translation id="3712624925041724820">라이선스 만료됨</translation> +<translation id="3714780639079136834">모바일 데이터 또는 Wi-Fi 사용 설정</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />프록시, 방화벽, DNS 설정 확인<ph name="END_LINK" /></translation> <translation id="3739623965217189342">복사한 링크</translation> <translation id="3744899669254331632">웹사이트가 Chromium이 처리할 수 없는 암호화된 사용자 인증 정보를 전송하였으므로 지금은 <ph name="SITE" />에 방문할 수 없습니다. 네트워크 오류와 공격은 대체로 일시적인 문제이기 때문에 이후에는 이 페이지가 제대로 작동할 가능성이 높습니다.</translation> <translation id="3748412725338508953">리디렉션이 너무 많습니다.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">리더 모드</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" />이(가) 차단됨</translation> <translation id="4021036232240155012">DNS는 웹사이트 이름을 인터넷 주소로 변환하는 네트워크 서비스입니다.</translation> +<translation id="4021376465026729077">확장 프로그램 사용 중지</translation> <translation id="4030383055268325496">추가 실행 취소(&U)</translation> <translation id="4032534284272647190"><ph name="URL" />에 대한 엑세스가 거부되었습니다.</translation> <translation id="404928562651467259">경고</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">잘못된 인증 서명입니다.</translation> <translation id="4176463684765177261">사용 중지</translation> <translation id="4196861286325780578">이동 다시 실행(&R)</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />방화벽 및 바이러스 백신 소프트웨어 설정 확인<ph name="END_LINK" /></translation> <translation id="4220128509585149162">다운</translation> <translation id="4250680216510889253">아니요</translation> <translation id="4258748452823770588">잘못된 서명</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">프록시 사용은 중지되었지만 명시적 프록시 설정이 지정되어 있습니다.</translation> <translation id="4492190037599258964">'<ph name="SEARCH_STRING" />'에 대한 검색결과</translation> <translation id="4506176782989081258">유효성 검사 오류 <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">시스템 관리자에게 문의</translation> <translation id="450710068430902550">관리자와 공유</translation> <translation id="4522570452068850558">세부정보</translation> <translation id="4535734014498033861">프록시 서버가 연결에 실패했습니다.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Google 번역 정보</translation> <translation id="5040262127954254034">개인정보</translation> <translation id="5045550434625856497">비밀번호가 잘못되었습니다.</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />프록시 주소 확인<ph name="END_LINK" /></translation> <translation id="5087286274860437796">서버의 인증서가 현재 유효하지 않습니다.</translation> <translation id="5089810972385038852">주</translation> <translation id="5094747076828555589">이 서버가 <ph name="DOMAIN" />임을 입증할 수 없으며 Chromium에서 신뢰하는 보안 인증서가 아닙니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.</translation> @@ -376,12 +391,13 @@ <translation id="5295309862264981122">탐색 확인</translation> <translation id="5299298092464848405">정책을 파싱하는 중 오류 발생</translation> <translation id="5300589172476337783">표시</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />쿠키 삭제<ph name="END_LINK" /></translation> <translation id="5308689395849655368">충돌 보고가 사용 중지되었습니다.</translation> <translation id="5317780077021120954">저장</translation> <translation id="5327248766486351172">이름</translation> <translation id="536296301121032821">정책 설정 저장 실패</translation> <translation id="540969355065856584">이 서버가 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버의 보안 인증서가 현재 유효하지 않습니다. 서버를 잘못 설정했거나 해커가 연결을 가로채고 있기 때문일 수 있습니다.</translation> -<translation id="5421136146218899937">인터넷 사용정보 삭제...</translation> +<translation id="5421136146218899937">인터넷 사용 기록 삭제...</translation> <translation id="5430298929874300616">북마크 삭제</translation> <translation id="5431657950005405462">파일을 찾을 수 없음</translation> <translation id="5439770059721715174">'<ph name="ERROR_PATH" />'에서 스키마 유효성 검사 오류: <ph name="ERROR" /></translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">새로고침</translation> <translation id="5565735124758917034">활성</translation> <translation id="560412284261940334">관리가 지원되지 않음</translation> +<translation id="5610142619324316209">연결 확인</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" />에서 리디렉션한 횟수가 너무 많습니다.</translation> <translation id="5629630648637658800">정책 설정 로드 실패</translation> <translation id="5631439013527180824">잘못된 기기 관리 토큰</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">카드가 인증되었습니다.</translation> <translation id="6146055958333702838">케이블을 확인하고 사용 중인 라우터, 모뎀 또는 기타 네트워크 기기를 재부팅하시기 바랍니다.</translation> +<translation id="614940544461990577">다음 작업 수행:</translation> <translation id="6151417162996330722">서버 인증서의 유효 기간이 너무 깁니다.</translation> <translation id="6154808779448689242">반환된 정책 토큰이 현재 토큰과 일치하지 않음</translation> <translation id="6165508094623778733">자세히 알아보기</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> 검색</translation> <translation id="6634865548447745291"><ph name="BEGIN_LINK" />이 인증서가 취소되었기 때문에<ph name="END_LINK" /> 현재 <ph name="SITE" />에 방문할 수 없습니다. 네트워크 오류와 공격은 대부분 일시적이므로 잠시 후 페이지가 작동될 것입니다.</translation> <translation id="6637478299472506933">다운로드 실패</translation> +<translation id="6642894344118208103">모뎀 또는 라우터 재설정</translation> <translation id="6644283850729428850">이 정책은 사용되지 않습니다.</translation> <translation id="6646897916597483132">카드 앞면의 4자리 CVC를 입력하세요.</translation> <translation id="6656103420185847513">폴더 수정</translation> <translation id="6660210980321319655"><ph name="CRASH_TIME" />에 자동으로 신고됨</translation> <translation id="6671697161687535275">Chromium에서 자동완성 항목 추천을 삭제하시겠습니까?</translation> +<translation id="6685834062052613830">로그아웃 후 설정 완료</translation> <translation id="6710213216561001401">이전</translation> <translation id="6711464428925977395">프록시 서버에 문제가 발생했거나 주소가 잘못되었습니다.</translation> <translation id="674375294223700098">알 수 없는 서버 인증서 오류입니다.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">게이트웨이 또는 프록시 서버가 업스트림 서버에서 잘못된 응답을 받았습니다.</translation> <translation id="7087282848513945231">카운티</translation> <translation id="7088615885725309056">다음</translation> +<translation id="7090678807593890770">Google에서 <ph name="LINK" /> 검색</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" />로 번역하지 못했습니다.</translation> <translation id="7139724024395191329">에미리트</translation> <translation id="7179921470347911571">지금 다시 시작</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">기록 항목이 없습니다.</translation> <translation id="8088680233425245692">글을 조회하지 못했습니다.</translation> <translation id="8091372947890762290">활성화 요청이 서버에서 대기 중</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" />의 서버 <ph name="BEGIN_ABBR" />DNS 주소<ph name="END_ABBR" />를 찾을 수 없습니다.</translation> <translation id="8149426793427495338">컴퓨터가 절전 모드 상태입니다.</translation> <translation id="8150722005171944719"><ph name="URL" />의 파일을 읽을 수 없습니다. 삭제 또는 이동되었거나 파일 사용 권한이 액세스를 차단할 수도 있습니다.</translation> <translation id="8194797478851900357">이동 실행 취소(&U)</translation> @@ -633,6 +655,7 @@ <translation id="8311778656528046050">이 페이지를 새로고침 하시겠습니까?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" />에 대한 액세스가 거부됨</translation> <translation id="8349305172487531364">북마크바</translation> +<translation id="8363502534493474904">비행기 모드 사용 중지</translation> <translation id="8364627913115013041">설정 안됨</translation> <translation id="8412145213513410671">충돌(<ph name="CRASH_COUNT" />개)</translation> <translation id="8412392972487953978">동일한 암호를 두 번 입력해야 합니다.</translation> @@ -690,6 +713,7 @@ <translation id="901974403500617787">시스템 전체에 적용되는 플래그는 소유자(<ph name="OWNER_EMAIL" />)만 설정할 수 있습니다.</translation> <translation id="9020142588544155172">서버에서 연결을 거부했습니다.</translation> <translation id="9020542370529661692">이 페이지는 <ph name="TARGET_LANGUAGE" />로 번역되었습니다.</translation> +<translation id="9038649477754266430">빠른 페이지 로드를 위해 예상 검색어 서비스 사용</translation> <translation id="9039213469156557790">또한 이 페이지에는 안전하지 않은 다른 리소스가 포함되어 있습니다. 이러한 리소스는 전송 중에 다른 사람이 볼 수 있으며 페이지의 작동을 변경하기 위해 공격자가 수정할 수 있습니다.</translation> <translation id="9049981332609050619"><ph name="DOMAIN" />에 접속하려 했지만 서버가 잘못된 인증서를 전달했습니다.</translation> <translation id="9050666287014529139">암호</translation> @@ -703,6 +727,7 @@ <translation id="9170848237812810038">실행 취소(&U)</translation> <translation id="917450738466192189">서버의 인증서가 유효하지 않습니다.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" />에서 지원되지 않는 프로토콜을 사용합니다.</translation> +<translation id="9205078245616868884">동기화 암호로 데이터가 암호화되어 있습니다. 동기화를 시작하려면 입력하세요.</translation> <translation id="9207861905230894330">글을 추가하지 못했습니다.</translation> <translation id="933612690413056017">인터넷에 연결되지 않음</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index ed2078d..bbb27ca 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas nėra patikimas kompiuterio operacinei sistemai. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užgrobėjo.</translation> <translation id="1152921474424827756">Pasiekite <ph name="BEGIN_LINK" />talpykloje saugomą <ph name="URL" /> kopiją<ph name="END_LINK" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> netikėtai nutraukė ryšį.</translation> +<translation id="1161325031994447685">Iš naujo prisijungti prie „Wi-Fi“</translation> <translation id="1175364870820465910">&Spausdinti...</translation> <translation id="1181037720776840403">Pašalinti</translation> <translation id="1195447618553298278">Nežinoma klaida.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Naudotojo politika</translation> <translation id="1644184664548287040">Tinklo konfigūracija netinkama ir jos neįmanoma importuoti.</translation> <translation id="1644574205037202324">Istorija</translation> +<translation id="1645368109819982629">Nepalaikomas protokolas</translation> <translation id="1655462015569774233">{1,plural, =1{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi vakar. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}one{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi prieš # dieną. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}few{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi prieš # dienas. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}many{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi prieš # dienos. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}other{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi prieš # dienų. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}}</translation> <translation id="1676269943528358898">Svetainėje <ph name="SITE" /> įprastai naudojama šifruotė informacijai apsaugoti. Šį kartą „Google Chrome“ bandant prisijungti prie <ph name="SITE" />, ji pateikė neįprastus ir netinkamus prisijungimo duomenis. Gali būti, kad užpuolėjas bando apsimesti svetaine <ph name="SITE" /> arba „Wi-Fi“ prisijungimo ekrane nutrūko ryšys. Jūsų informacija vis tiek liko apsaugota, nes „Google Chrome“ sustabdė prisijungimą prieš apsikeitimą bet kokiais duomenimis.</translation> <translation id="168841957122794586">Serverio sertifikate yra nesudėtingas kriptografinis raktas.</translation> <translation id="1706954506755087368">{1,plural, =1{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios nuo rytojaus. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}one{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios po # dienos. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}few{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios po # dienų. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}many{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios po # dienos. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}other{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios po # dienų. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Pabandykite susisiekti su sistemos administratoriumi.</translation> <translation id="17513872634828108">Atidaryti skirtukai</translation> <translation id="1753706481035618306">Puslapio numeris</translation> <translation id="1763864636252898013">Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas nėra patikimas įrenginio operacinei sistemai. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užgrobėjo.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Nustatytas automatinis įgaliotojo serverio konfigūravimas.</translation> <translation id="2025623846716345241">Patvirtinti įkėlimą iš naujo</translation> <translation id="2030481566774242610">Ar turėjote omenyje <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Patikrinti tarpinį serverį ir užkardą<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Pašto kodas</translation> <translation id="2065985942032347596">Reikalingas tapatybės nustatymas</translation> <translation id="2079545284768500474">Anuliuoti</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Politika nerasta</translation> <translation id="2213606439339815911">Gaunami įrašai...</translation> <translation id="2214283295778284209"><ph name="SITE" /> neprieinamas</translation> +<translation id="2227695659599072496">Patikrinti tinklo laidą ir maršruto parinktuvą</translation> +<translation id="2230458221926704099">Išspręskite ryšio problemas naudodami <ph name="BEGIN_LINK" />diagnostikos programą<ph name="END_LINK" /></translation> <translation id="225207911366869382">Pagal šią politiką ši vertė nepatvirtinta.</translation> <translation id="2262243747453050782">HTTP klaida</translation> <translation id="2279770628980885996">Serveriui bandant įvykdyti užklausą susidurta su nenumatyta būsena.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON analizavimo įrankis</translation> <translation id="2495093607237746763">Jei pažymėta, „Chromium“ išsaugos kortelės kopiją įrenginyje, kad galėtumėte greičiau užpildyti formas.</translation> <translation id="2498091847651709837">Nuskaityti naują kortelę</translation> +<translation id="2515629240566999685">Patikrinti signalo stiprumą savo srityje</translation> <translation id="2516305470678292029">NS alternatyvos</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> išsiuntė netinkamą atsaką.</translation> <translation id="2552545117464357659">Naujesnis</translation> @@ -222,6 +229,8 @@ <translation id="3254409185687681395">Įtraukti šį puslapį į žymes</translation> <translation id="3270847123878663523">&Anuliuoti pertvarkymą</translation> <translation id="3286538390144397061">Paleisti iš naujo dabar</translation> +<translation id="3288003805934695103">Iš naujo įkelti puslapį</translation> +<translation id="3305707030755673451"><ph name="TIME" /> duomenys buvo užšifruoti naudojant sinchronizavimo slaptafrazę. Įveskite ją, kad pradėtumėte sinchronizuoti.</translation> <translation id="333371639341676808">Neleiskite šiam puslapiui kurti papildomų dialogo langų.</translation> <translation id="3340978935015468852">nustatymų</translation> <translation id="3355823806454867987">Pakeisti įgaliotojo serverio nustatymus...</translation> @@ -264,6 +273,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Įkeliama...</translation> <translation id="3712624925041724820">Licencijos baigėsi</translation> +<translation id="3714780639079136834">Įjungti mobiliojo ryšio duomenis arba „Wi-Fi“</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Patikrinti tarpinio serverio, užkardos ir DNS konfigūraciją<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Nukopijuota nuoroda</translation> <translation id="3744899669254331632">Negalite dabar apsilankyti svetainėje <ph name="SITE" />, nes ji atsiuntė užšifruotus prisijungimo duomenis, kurių „Chromium“ negali apdoroti. Tinklo klaidos ir užpuolimai dažniausiai yra laikini, todėl šis puslapis vėliau tikriausiai veiks.</translation> <translation id="3748412725338508953">Pernelyg daug nukreipimų.</translation> @@ -286,6 +297,7 @@ <translation id="3963721102035795474">Skaitytojo režimas</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> užblokuota.</translation> <translation id="4021036232240155012">DNS – tai tinklo paslauga, verčianti svetainės pavadinimą į interneto adresą.</translation> +<translation id="4021376465026729077">Išjungti plėtinius</translation> <translation id="4030383055268325496">&Anuliuoti pridėjimą</translation> <translation id="4032534284272647190">Prieiga prie <ph name="URL" /> atmesta.</translation> <translation id="404928562651467259">ĮSPĖJIMAS</translation> @@ -302,6 +314,7 @@ <translation id="4171400957073367226">Netinkamas patvirtinimo parašas</translation> <translation id="4176463684765177261">Neleista</translation> <translation id="4196861286325780578">&Perkelti dar kartą</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Patikrinti užkardos ir antivirusinės sistemos konfigūracijas<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Gedimai</translation> <translation id="4250680216510889253">Ne</translation> <translation id="4258748452823770588">Netinkamas parašas</translation> @@ -322,6 +335,7 @@ <translation id="443673843213245140">Įgaliotojo serverio naudojimas neleidžiamas, bet nurodyta aiški įgaliotojo serverio konfigūracija.</translation> <translation id="4492190037599258964">„<ph name="SEARCH_STRING" />“ paieškos rezultatai</translation> <translation id="4506176782989081258">Tikrinimo klaida: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Susisiekti su sistemos administratoriumi</translation> <translation id="450710068430902550">Bendrinimas su administratoriumi</translation> <translation id="4522570452068850558">Išsami informacija</translation> <translation id="4535734014498033861">Nepavyko užmegzti įgaliotojo serverio ryšio.</translation> @@ -359,6 +373,7 @@ <translation id="5031870354684148875">Apie „Google“ vertėją</translation> <translation id="5040262127954254034">Privatumas</translation> <translation id="5045550434625856497">Netinkamas slaptažodis</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Patikrinti tarpinio serverio adresą<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Šiuo metu serverio sertifikatas negalioja.</translation> <translation id="5089810972385038852">Valstija</translation> <translation id="5094747076828555589">Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas nėra patikimas „Chromium“. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užgrobėjo.</translation> @@ -377,6 +392,7 @@ <translation id="5295309862264981122">Patvirtinti naršymą</translation> <translation id="5299298092464848405">Analizuojant politiką įvyko klaida</translation> <translation id="5300589172476337783">Rodyti</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Išvalyti slapukus<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Strigčių ataskaitų teikimas neleidžiamas.</translation> <translation id="5317780077021120954">Išsaugoti</translation> <translation id="5327248766486351172">Pavadinimas</translation> @@ -404,6 +420,7 @@ <translation id="5556459405103347317">Įkelti iš naujo</translation> <translation id="5565735124758917034">Aktyvus</translation> <translation id="560412284261940334">Tvarkymas nepalaikomas</translation> +<translation id="5610142619324316209">Patikrinti ryšį</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> buvote per daug kartų peradresuoti.</translation> <translation id="5629630648637658800">Įkeliant politikos nustatymus įvyko klaida</translation> <translation id="5631439013527180824">Netinkamas įrenginio tvarkymo prieigos raktas</translation> @@ -436,6 +453,7 @@ <translation id="6093795393556121384">Kortelė patvirtinta</translation> <translation id="6146055958333702838">Patikrinkite laidus ir iš naujo paleiskite maršruto parinktuvus, modemus ar kitus naudojamus tinklo įrenginius.</translation> +<translation id="614940544461990577">Pabandykite atlikti toliau nurodytus veiksmus.</translation> <translation id="6151417162996330722">Serverio sertifikato galiojimo laikotarpis per ilgas.</translation> <translation id="6154808779448689242">Sugrąžintas politikos prieigos raktas neatitinka dabartinio prieigos rakto</translation> <translation id="6165508094623778733">Sužinokite daugiau</translation> @@ -477,11 +495,13 @@ <translation id="6628463337424475685">„<ph name="ENGINE" />“ paieška</translation> <translation id="6634865548447745291">Negalite dabar apsilankyti svetainėje <ph name="SITE" />, nes <ph name="BEGIN_LINK" />šis sertifikatas buvo anuliuotas<ph name="END_LINK" />. Paprastai tinklo klaidos ir užpuolimai yra laikini, todėl šis puslapis vėliau tikriausiai veiks.</translation> <translation id="6637478299472506933">Atsisiun. įv. klaida</translation> +<translation id="6642894344118208103">Iš naujo nustatyti modemą arba maršruto parinktuvą</translation> <translation id="6644283850729428850">Ši politika nepatvirtinta.</translation> <translation id="6646897916597483132">Įveskite 4 skaitmenų kortelės saugos kodą (CVC), nurodytą kortelės priekyje</translation> <translation id="6656103420185847513">Redaguoti aplanką</translation> <translation id="6660210980321319655">Automatiškai pranešta <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Pašalinti formos pasiūlymą iš „Chromium“?</translation> +<translation id="6685834062052613830">Atsijunkite ir užbaikite sąranką</translation> <translation id="6710213216561001401">Ankstesnis</translation> <translation id="6711464428925977395">Kažkas negerai su tarpiniu serveriu arba adresas netinkamas.</translation> <translation id="674375294223700098">Nežinoma serverio sertifikato klaida.</translation> @@ -516,6 +536,7 @@ <translation id="7052500709156631672">Tinklų sietuvas arba įgaliotasis serveris sulaukė neteisingo atsako iš išsiuntimo srauto serverio.</translation> <translation id="7087282848513945231">Apygarda</translation> <translation id="7088615885725309056">Ankstesnė</translation> +<translation id="7090678807593890770">Sistemoje „Google“ atlikite paiešką pagal užklausą <ph name="LINK" /></translation> <translation id="7108649287766967076">Verčiant į <ph name="TARGET_LANGUAGE" /> įvyko klaida.</translation> <translation id="7139724024395191329">Emyratas</translation> <translation id="7179921470347911571">Paleisti iš naujo dabar</translation> @@ -608,6 +629,7 @@ <translation id="8034955203865359138">Nerasta jokių istorijos įrašų.</translation> <translation id="8088680233425245692">Nepavyko peržiūrėti straipsnio.</translation> <translation id="8091372947890762290">Laukiama aktyvinimo serveryje</translation> +<translation id="8134994873729925007">Nepavyko rasti „<ph name="HOST_NAME" />“ serverio <ph name="BEGIN_ABBR" />DNS adreso<ph name="END_ABBR" />.</translation> <translation id="8149426793427495338">Įjungta kompiuterio miego būsena.</translation> <translation id="8150722005171944719"><ph name="URL" /> nurodyto failo negalima skaityti. Gali būti, kad jis pašalintas, perkeltas arba neleidžiama prieiga prie jo dėl failo leidimų.</translation> <translation id="8194797478851900357">&Anuliuoti perkėlimą</translation> @@ -636,6 +658,7 @@ <translation id="8311778656528046050">Ar tikrai norite iš naujo įkelti šį puslapį?</translation> <translation id="8332188693563227489">Prieiga prie <ph name="HOST_NAME" /> atmesta</translation> <translation id="8349305172487531364">Žymių juosta</translation> +<translation id="8363502534493474904">Išjungti lėktuvo režimą</translation> <translation id="8364627913115013041">Nenustatyta.</translation> <translation id="8412145213513410671">Strigtys (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Reikia du kartus įvesti tą pačią slaptafrazę.</translation> @@ -693,6 +716,7 @@ <translation id="901974403500617787">Visoje sistemoje taikomas žymas gali nustatyti tik savininkas: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Serveris atmetė ryšį.</translation> <translation id="9020542370529661692">Šis puslapis išverstas į <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Naudokite numatymo paslaugą, kad puslapiai būtų įkeliami greičiau</translation> <translation id="9039213469156557790">Be to, šiame puslapyje yra kitų nesaugių išteklių. Perduodant duomenis šiuos išteklius gali peržiūrėti kiti asmenys ir keisti atakuojanti programa, siekianti pakeisti puslapio veikimą.</translation> <translation id="9049981332609050619">Bandėte pasiekti <ph name="DOMAIN" />, bet serveris pateikė neteisingą sertifikatą.</translation> <translation id="9050666287014529139">Slaptafrazė</translation> @@ -706,6 +730,7 @@ <translation id="9170848237812810038">&Atšaukti</translation> <translation id="917450738466192189">Serverio sertifikatas negalioja.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> naudojamas nepalaikomas protokolas.</translation> +<translation id="9205078245616868884">Duomenys užšifruoti naudojant sinchronizavimo slaptafrazę. Įveskite ją, kad pradėtumėte sinchronizuoti.</translation> <translation id="9207861905230894330">Nepavyko pridėti straipsnio.</translation> <translation id="933612690413056017">Nėra interneto ryšio</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 02f9ef24..9228b461 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />; tās drošības sertifikāts netiek uzskatīts par uzticamu jūsu datora operētājsistēmā. Iespējams, tas ir nepareizas konfigurācijas dēļ vai arī kāds ir ļaunprātīgi izmantojis jūsu savienojumu.</translation> <translation id="1152921474424827756">Piekļūstiet vietnes <ph name="URL" /> <ph name="BEGIN_LINK" />kešatmiņā saglabātajai kopijai<ph name="END_LINK" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> negaidīti pārtrauca savienojumu.</translation> +<translation id="1161325031994447685">Atkārtoti izveidojiet savienojumu ar Wi-Fi tīklu.</translation> <translation id="1175364870820465910">Drukāt...</translation> <translation id="1181037720776840403">Noņemt</translation> <translation id="1195447618553298278">Nezināma kļūda.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Lietotāja politikas</translation> <translation id="1644184664548287040">Tīkla konfigurācija nav derīga, un to nevarēja importēt.</translation> <translation id="1644574205037202324">Vēsture</translation> +<translation id="1645368109819982629">Neatbalstīts protokols</translation> <translation id="1655462015569774233">{1,plural, =1{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; tā drošības sertifikāta derīguma termiņš beidzās vakar. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}zero{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; tā drošības sertifikāta derīguma termiņš beidzās pirms # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}one{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; tā drošības sertifikāta derīguma termiņš beidzās pirms # dienas. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}other{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; tā drošības sertifikāta derīguma termiņš beidzās pirms # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}}</translation> <translation id="1676269943528358898">Vietnē <ph name="SITE" /> informācijas aizsargāšanai parasti tiek izmantota šifrēšana. Kad pārlūkā Google Chrome tika mēģināts izveidot savienojumu ar vietni <ph name="SITE" />, šoreiz tā nosūtīja neparastus un nepareizus akreditācijas datus. Iespējams, tas notika, jo uzbrucējs mēģināja uzdoties par vietni <ph name="SITE" />, vai arī Wi-Fi pierakstīšanās ekrāns pārtrauc savienojumu. Jūsu informācija joprojām ir drošībā, jo pārlūks Google Chrome pārtrauca savienojumu, pirms tika veikta jebkādu datu apmaiņa.</translation> <translation id="168841957122794586">Servera sertifikāts ietver vāju kriptogrāfisko atslēgu.</translation> <translation id="1706954506755087368">{1,plural, =1{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; šķiet, ka tā drošības sertifikāts sāks darboties rīt. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu.}zero{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; šķiet, ka tā drošības sertifikāts sāks darboties pēc # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu.}one{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; šķiet, ka tā drošības sertifikāts sāks darboties pēc # dienas. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu.}other{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; šķiet, ka tā drošības sertifikāts sāks darboties pēc # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu.}}</translation> <translation id="1710259589646384581">Operētājsistēma</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Sazinieties ar sistēmas administratoru.</translation> <translation id="17513872634828108">Atvērt cilnes</translation> <translation id="1753706481035618306">Lapas numurs</translation> <translation id="1763864636252898013">Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />; tās drošības sertifikāts netiek uzskatīts par uzticamu jūsu ierīces operētājsistēmā. Iespējams, tas ir nepareizas konfigurācijas dēļ vai arī kāds ir ļaunprātīgi izmantojis jūsu savienojumu.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Starpniekserverim ir iestatīta autokonfigurācija.</translation> <translation id="2025623846716345241">Atkārtotas ielādes apstiprināšana</translation> <translation id="2030481566774242610">Vai domājāt <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Pārbaudiet starpniekserveri un ugunsmūri<ph name="END_LINK" />.</translation> <translation id="2053553514270667976">Pasta indekss</translation> <translation id="2065985942032347596">Nepieciešama autentiskuma noteikšana</translation> <translation id="2079545284768500474">Atsaukt</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Politika netika atrasta.</translation> <translation id="2213606439339815911">Notiek ierakstu ienešana...</translation> <translation id="2214283295778284209"><ph name="SITE" /> nav pieejama</translation> +<translation id="2227695659599072496">Pārbaudiet tīkla kabeli vai maršrutētāju.</translation> +<translation id="2230458221926704099">Labojiet savienojumu, izmantojot <ph name="BEGIN_LINK" />diagnostikas lietotni<ph name="END_LINK" /></translation> <translation id="225207911366869382">Šī vērtība vairs netiek atbalstīta šai politikai.</translation> <translation id="2262243747453050782">HTTP kļūda</translation> <translation id="2279770628980885996">Kamēr serveris mēģināja izpildīt pieprasījumu, tika konstatēts negaidīts apstāklis.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON parsētājs</translation> <translation id="2495093607237746763">Ja šī izvēles rūtiņa ir atzīmēta, pārlūks Chromium saglabās jūsu kartes informāciju šajā ierīcē, lai nodrošinātu ātrāku veidlapu aizpildi.</translation> <translation id="2498091847651709837">Skenēt jaunu karti</translation> +<translation id="2515629240566999685">Pārbaudiet signālu savā apkaimē.</translation> <translation id="2516305470678292029">Alternatīvas lietotāja saskarnes</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> nosūtīja nederīgu atbildi.</translation> <translation id="2552545117464357659">Jaunāka</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Grāmatot šo lapu</translation> <translation id="3270847123878663523">&Pārkārtošanas atsaukšana</translation> <translation id="3286538390144397061">Restartēt tūlīt</translation> +<translation id="3288003805934695103">Atkārtoti ielādējiet lapu.</translation> +<translation id="3305707030755673451">Jūsu dati tika šifrēti, izmantojot jūsu sinhronizācijas ieejas frāzi šādā datumā: <ph name="TIME" />. Lai sāktu sinhronizāciju, ievadiet ieejas frāzi.</translation> <translation id="333371639341676808">Neļaujiet šai lapai veidot papildu dialogus.</translation> <translation id="3340978935015468852">Iestatījumi</translation> <translation id="3355823806454867987">Mainīt starpniekservera iestatījumus...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" />, <ph name="BOOKMARKED" />, <ph name="TITLE" />, <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Notiek ielāde...</translation> <translation id="3712624925041724820">Nav pietiekami daudz licenču.</translation> +<translation id="3714780639079136834">Ieslēdziet mobilo datu savienojumu vai Wi-Fi.</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Pārbaudiet starpniekserveri, ugunsmūri un DNS konfigurāciju<ph name="END_LINK" />.</translation> <translation id="3739623965217189342">Jūsu kopētā saite</translation> <translation id="3744899669254331632">Pašlaik jūs nevarat apmeklēt vietni <ph name="SITE" />, jo šī vietne nosūtīja kodētus akreditācijas datus, kurus Chromium nevar apstrādāt. Tā kā tīkla kļūdas un uzbrukumi parasti ir īslaicīga problēma, iespējams, vēlāk šī lapa atkal darbosies.</translation> <translation id="3748412725338508953">Bija pārāk daudz dažādu pārviržu.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Lasītāja režīms</translation> <translation id="3973234410852337861">Vietne <ph name="HOST_NAME" /> ir bloķēta</translation> <translation id="4021036232240155012">DNS ir tīkla pakalpojums, kurā vietnes nosaukums tiek tulkots uz tās interneta adresi.</translation> +<translation id="4021376465026729077">Atspējojiet paplašinājumus.</translation> <translation id="4030383055268325496">&Atsaukt pievienošanu</translation> <translation id="4032534284272647190">Piekļuve vietnei <ph name="URL" /> noraidīta.</translation> <translation id="404928562651467259">BRĪDINĀJUMS</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Verifikācijas paraksts nav derīgs.</translation> <translation id="4176463684765177261">Atspējots</translation> <translation id="4196861286325780578">&Atcelt pārvietošanas atsaukšanu</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Pārbaudiet ugunsmūri un pretvīrusu programmu konfigurācijas<ph name="END_LINK" />.</translation> <translation id="4220128509585149162">Avārijas</translation> <translation id="4250680216510889253">Nē</translation> <translation id="4258748452823770588">Paraksts nav derīgs.</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Starpniekservera lietošana ir atspējota, bet ir norādīta atklāta starpniekservera konfigurācija.</translation> <translation id="4492190037599258964">Vaicājuma “<ph name="SEARCH_STRING" />” meklēšanas rezultāti</translation> <translation id="4506176782989081258">Validācijas kļūda: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Sazinieties ar sistēmas administratoru.</translation> <translation id="450710068430902550">Kopīgošana ar administratoru</translation> <translation id="4522570452068850558">Informācija</translation> <translation id="4535734014498033861">Savienojums ar starpniekserveri neizdevās.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Par Google tulkotāju</translation> <translation id="5040262127954254034">Privātums</translation> <translation id="5045550434625856497">Nepareiza parole</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Pārbaudiet starpniekservera adresi<ph name="END_LINK" />.</translation> <translation id="5087286274860437796">Servera sertifikāts šobrīd nav derīgs.</translation> <translation id="5089810972385038852">Štats</translation> <translation id="5094747076828555589">Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />; tās drošības sertifikāts netiek uzskatīts par uzticamu Chromium sistēmā. Iespējams, tas ir nepareizas konfigurācijas dēļ vai arī kāds ir ļaunprātīgi izmantojis jūsu savienojumu.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Apstiprināt navigāciju</translation> <translation id="5299298092464848405">Parsējot politiku, radās kļūda.</translation> <translation id="5300589172476337783">Rādīt</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Dzēsiet sīkfailus<ph name="END_LINK" />.</translation> <translation id="5308689395849655368">Avāriju pārskatu izveide ir atspējota.</translation> <translation id="5317780077021120954">Saglabāt</translation> <translation id="5327248766486351172">Nosaukums</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Pārlādēt</translation> <translation id="5565735124758917034">Aktīvs</translation> <translation id="560412284261940334">Pārvaldīšana netiek atbalstīta.</translation> +<translation id="5610142619324316209">Pārbaudiet savienojumu.</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> novirzīja pārāk daudz reižu.</translation> <translation id="5629630648637658800">Neizdevās ielādēt politikas iestatījumus.</translation> <translation id="5631439013527180824">Ierīces pārvaldības marķieris nav derīgs.</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Jūsu karte ir verificēta.</translation> <translation id="6146055958333702838">Pārbaudiet vadus un atkārtoti palaidiet maršrutētājus, modemus vai citas izmantotās tīkla ierīces.</translation> +<translation id="614940544461990577">Veiciet tālāk norādītās darbības.</translation> <translation id="6151417162996330722">Šī servera sertifikāta derīguma periods ir pārāk ilgs.</translation> <translation id="6154808779448689242">Atgrieztais politikas marķieris neatbilst pašreizējam marķierim.</translation> <translation id="6165508094623778733">Uzziniet vairāk</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> meklēšana</translation> <translation id="6634865548447745291">Pašlaik nevarat apmeklēt vietni <ph name="SITE" />, jo <ph name="BEGIN_LINK" />šis sertifikāts ir atsaukts<ph name="END_LINK" />. Tīkla kļūdas un uzbrukumi parasti ir īslaicīgi, tādējādi šī lapa vēlāk, visticamāk, darbosies.</translation> <translation id="6637478299472506933">Lejupiel. neizdevās</translation> +<translation id="6642894344118208103">Atiestatiet modemu vai maršrutētāju.</translation> <translation id="6644283850729428850">Šī politika ir izbeigta.</translation> <translation id="6646897916597483132">Ievadiet 4 ciparu CVC kodu, kas norādīts jūsu kredītkartes priekšpusē.</translation> <translation id="6656103420185847513">Mapes rediģēšana</translation> <translation id="6660210980321319655">Automātiski ziņots: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Vai noņemt veidlapas ieteikumu no pārlūka Chromium?</translation> +<translation id="6685834062052613830">Izrakstieties un pabeidziet iestatīšanu</translation> <translation id="6710213216561001401">Iepriekšējais</translation> <translation id="6711464428925977395">Starpniekserverī radās kļūda, vai arī adrese nav pareiza.</translation> <translation id="674375294223700098">Nezināma servera sertifikāta kļūda.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">Vārteja vai starpniekserveris saņēma nederīgu atbildi no augšējā servera.</translation> <translation id="7087282848513945231">Grāfiste</translation> <translation id="7088615885725309056">Vecāka</translation> +<translation id="7090678807593890770">Veiciet Google meklēšanu, izmantojot vaicājumu “<ph name="LINK" />”</translation> <translation id="7108649287766967076">Neizdevās tulkot šādā valodā: <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">Emirāts</translation> <translation id="7179921470347911571">Restartēt tūlīt</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Netika atrasts neviens vēstures ieraksts.</translation> <translation id="8088680233425245692">Rakstu neizdevās skatīt.</translation> <translation id="8091372947890762290">Aktivizācija vēl nav apstiprināta serverī.</translation> +<translation id="8134994873729925007">Nevarēja atrast <ph name="HOST_NAME" /> servera <ph name="BEGIN_ABBR" />DNS adresi<ph name="END_ABBR" />.</translation> <translation id="8149426793427495338">Dators tika pārslēgts miega režīmā.</translation> <translation id="8150722005171944719">Vietnē <ph name="URL" /> esošo failu nevar nolasīt. Iespējams, tas ir noņemts vai pārvietots vai piekļuvei nepieciešamas atļaujas.</translation> <translation id="8194797478851900357">&Pārvietošanas atsaukšana</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Vai jūs tiešām vēlaties atkārtoti ielādēt šo lapu?</translation> <translation id="8332188693563227489">Piekļuve vietnei <ph name="HOST_NAME" /> tika noraidīta</translation> <translation id="8349305172487531364">Grāmatzīmju josla</translation> +<translation id="8363502534493474904">Izslēdziet lidojuma režīmu.</translation> <translation id="8364627913115013041">Nav iestatīta.</translation> <translation id="8412145213513410671">Avārijas (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Viena un tā pati ieejas frāze jāievada divreiz.</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">Atzīmes, kas attiecas uz visu sistēmu, var iestatīt tikai īpašnieks: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Serveris noraidīja savienojumu.</translation> <translation id="9020542370529661692">Šī lapa ir tulkota <ph name="TARGET_LANGUAGE" /> valodā.</translation> +<translation id="9038649477754266430">Ieteikumu pakalpojuma izmantošana ātrākai lapu ielādei</translation> <translation id="9039213469156557790">Turklāt šajā lapā ir citi resursi, kas nav droši. Kamēr šie resursi tiek pārsūtīti, tos var aplūkot citi, kā arī uzbrucējs var tos pārveidot, lai mainītu lapas uzvedību.</translation> <translation id="9049981332609050619">Jūs centāties piekļūt <ph name="DOMAIN" />, bet serveris piedāvāja nederīgu sertifikātu.</translation> <translation id="9050666287014529139">Ieejas frāze</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">&Atsaukt</translation> <translation id="917450738466192189">Servera sertifikāts ir nederīgs.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> izmanto neatbalstītu protokolu.</translation> +<translation id="9205078245616868884">Jūsu dati ir šifrēti, izmantojot jūsu sinhronizācijas ieejas frāzi. Lai sāktu sinhronizāciju, ievadiet ieejas frāzi.</translation> <translation id="9207861905230894330">Rakstu neizdevās pievienot.</translation> <translation id="933612690413056017">Nav interneta savienojuma</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 32070ef0..4a7f4cb 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">ഈ സെർവറിന് അത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷ സർട്ടിഫിക്കറ്റിനെ നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന് പരിചയമില്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു അക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation> <translation id="1152921474424827756"><ph name="URL" />-ന്റെ <ph name="BEGIN_LINK" />കാഷെ ചെയ്ത പകർപ്പ്<ph name="END_LINK" /> ആക്സസ്സുചെയ്യുക</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> അപ്രതീക്ഷിതമായി കണക്ഷൻ അടച്ചു.</translation> +<translation id="1161325031994447685">Wi-Fi-ലേക്ക് വീണ്ടും കണക്റ്റുചെയ്യുന്നു</translation> <translation id="1175364870820465910">&അച്ചടിക്കൂ...</translation> <translation id="1181037720776840403">നീക്കംചെയ്യൂ</translation> <translation id="1195447618553298278">അജ്ഞാത പിശക്.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">ഉപയോക്തൃ നയങ്ങൾ</translation> <translation id="1644184664548287040">നെറ്റ്വർക്ക് കോൺഫിഗറേഷൻ അസാധുവായതിനാൽ ഇമ്പോർട്ടുചെയ്യാൻ കഴിഞ്ഞില്ല.</translation> <translation id="1644574205037202324">ചരിത്രം</translation> +<translation id="1645368109819982629">പ്രോട്ടോക്കോൾ പിന്തുണയ്ക്കുന്നില്ല</translation> <translation id="1655462015569774233">{1,plural, =1{ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് ഇന്നലെ കാലഹരണപ്പെട്ടു. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ ക്ലോക്ക് നിലവിൽ <ph name="CURRENT_DATE" /> എന്ന് സജ്ജമാക്കി. അത് ശരിയാണോ? അല്ലെങ്കിൽ, നിങ്ങൾ സിസ്റ്റത്തിന്റെ ക്ലോക്ക് ശരിയാക്കി ഈ പേജ് പുതുക്കുക.}other{ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; ഇതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് # ദിവസം മുമ്പ് കാലഹരണപ്പെട്ടു. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ ക്ലോക്ക് നിലവിൽ <ph name="CURRENT_DATE" /> എന്ന് സജ്ജമാക്കി. അത് ശരിയാണോ? അല്ലെങ്കിൽ, നിങ്ങൾ സിസ്റ്റത്തിന്റെ ക്ലോക്ക് ശരിയാക്കി ഈ പേജ് പുതുക്കുക.}}</translation> <translation id="1676269943528358898">നിങ്ങളുടെ വിവരങ്ങൾ പരിരക്ഷിക്കാൻ സാധാരണയായി <ph name="SITE" />, എൻക്രിപ്ഷൻ ഉപയോഗിക്കുന്നു. ഇപ്പോൾ <ph name="SITE" /> സൈറ്റിലേക്ക് കണക്റ്റുചെയ്യാൻ Google Chrome ശ്രമിച്ചപ്പോൾ, അസാധാരണമായതും തെറ്റായതുമായ ക്രെഡൻഷ്യലുകൾ വെബ്സൈറ്റ് തിരികെ അയച്ചു. ഒരു ആക്രമണകാരി, <ph name="SITE" /> എന്നതായി ഭാവിക്കാൻ ശ്രമിക്കുമ്പോഴോ Wi-Fi സൈൻ ഇൻ സ്ക്രീൻ, കണക്ഷനെ തടസ്സപ്പെടുത്തുമ്പോഴോ ആണ് ഇങ്ങനെ സംഭവിക്കാനിടയുള്ളത്. ഏതെങ്കിലും ഡാറ്റ കൈമാറുന്നതിനുമുമ്പ് Google Chrome കണക്ഷൻ അവസാനിപ്പിച്ചതിനാൽ, നിങ്ങളുടെ വിവരങ്ങൾ തുടർന്നും സുരക്ഷിതമായിരിക്കും.</translation> <translation id="168841957122794586">സെർവർ സർട്ടിഫിക്കറ്റിൽ ഒരു ദുർബലമായ ഗൂഢഭാഷ കീ ഉൾപ്പെടുന്നു.</translation> <translation id="1706954506755087368">{1,plural, =1{ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് ഇന്നലെ മുതൽ സാധുവല്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.}other{ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് # ദിവസം മുതൽ സാധുവായിരിക്കില്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">സിസ്റ്റം അഡ്മിനെ ബന്ധപ്പെടാൻ ശ്രമിക്കുക.</translation> <translation id="17513872634828108">ഓപ്പൺ ടാബുകൾ</translation> <translation id="1753706481035618306">പേജ് നമ്പർ</translation> <translation id="1763864636252898013">ഈ സെർവറിന് അത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷ സർട്ടിഫിക്കറ്റിനെ നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന് പരിചയമില്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു അക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">പ്രോക്സി യാന്ത്രികമായി കോൺഫിഗർ ചെയ്യാൻ സജ്ജമാക്കി.</translation> <translation id="2025623846716345241">വീണ്ടും ലോഡുചെയ്യുന്നത് സ്ഥിരീകരിക്കുക</translation> <translation id="2030481566774242610">നിങ്ങൾ ഉദ്ദേശിച്ചത് <ph name="LINK" /> ആണോ?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />പ്രോക്സിയും ഫയർവാളും പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation> <translation id="2053553514270667976">തപാൽ കോഡ്</translation> <translation id="2065985942032347596">ആധികാരികത ആവശ്യമാണ്</translation> <translation id="2079545284768500474">പൂര്വ്വാവസ്ഥയിലാക്കുക</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">നയം കണ്ടെത്തിയില്ല</translation> <translation id="2213606439339815911">എൻട്രികൾ ലഭ്യമാക്കുന്നു...</translation> <translation id="2214283295778284209"><ph name="SITE" /> ലഭ്യമല്ല</translation> +<translation id="2227695659599072496">നെറ്റ്വർക്ക് കേബിളും റൂട്ടറും പരിശോധിക്കുന്നു</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />ഡയഗണോസ്റ്റിക്സ് ആപ്പ്<ph name="END_LINK" /> ഉപയോഗിച്ച് കണകഷൻ പ്രശ്നം പരിഹരിക്കുക</translation> <translation id="225207911366869382">ഈ നയത്തിനായി ഈ മൂല്യത്തെ ഒഴിവാക്കി.</translation> <translation id="2262243747453050782">HTTP പിശക്</translation> <translation id="2279770628980885996">അഭ്യര്ത്ഥന പൂര്ത്തീകരിയ്ക്കാന് സെര്വര് ശ്രമിക്കുന്നതിനിടയില് അപ്രതീക്ഷിതമായ ഒരു അവസ്ഥ നേരിടേണ്ടി വന്നു.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON പാഴ്സർ</translation> <translation id="2495093607237746763">പരിശോധിച്ചെങ്കിൽ, വേഗത്തിൽ ഫോം പൂരിപ്പിക്കാൻ Chromium ഈ ഉപകരണത്തിൽ നിങ്ങളുടെ കാർഡിന്റെ ഒരു പകർപ്പ് സൂക്ഷിക്കും.</translation> <translation id="2498091847651709837">പുതിയ കാർഡ് സ്കാൻ ചെയ്യുക</translation> +<translation id="2515629240566999685">നിങ്ങളുടെ ഏരിയയിലെ സിഗ്നൽ പരിശോധിക്കുന്നു</translation> <translation id="2516305470678292029">UI ഇതരമാർഗങ്ങൾ</translation> <translation id="255002559098805027"><ph name="HOST_NAME" />, അസാധുവായ ഒരു പ്രതികരണം അയച്ചു.</translation> <translation id="2552545117464357659">ഏറ്റവും പുതിയ</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">ഈ പേജ് ബുക്മാര്ക്ക് ചെയ്യുക</translation> <translation id="3270847123878663523">&പുനഃക്രമീകരിക്കുന്നത് പഴയപടിയാക്കുക</translation> <translation id="3286538390144397061">ഇപ്പോള് പുനരാരംഭിക്കുക</translation> +<translation id="3288003805934695103">പേജ് റീലോഡുചെയ്യുന്നു</translation> +<translation id="3305707030755673451"><ph name="TIME" />-ന് നിങ്ങളുടെ സമന്വയ പാസ്ഫ്രെയ്സ് ഉപയോഗിച്ച് ഡാറ്റ എൻക്രിപ്റ്റുചെയ്തു. സമന്വയം ആരംഭിക്കുന്നതിന് ഇത് നൽകുക.</translation> <translation id="333371639341676808">അധികമുള്ള ഡയലോഗുകള് സൃഷ്ടിക്കുന്നതില് നിന്ന് ഈ പേജിനെ തടയൂ.</translation> <translation id="3340978935015468852">ക്രമീകരണങ്ങൾ</translation> <translation id="3355823806454867987">പ്രോക്സി ക്രമീകരണങ്ങള് മാറ്റുക...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">ലോഡ്ചെയ്യുന്നു...</translation> <translation id="3712624925041724820">ലൈസൻസുകൾ കാലഹരണപ്പെട്ടു</translation> +<translation id="3714780639079136834">മൊബൈൽ ഡാറ്റ അല്ലെങ്കിൽ Wi-Fi ഓണാക്കുന്നു</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />പ്രോക്സിയും ഫയർവാളും DNS കോൺഫിഗറേഷനും പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation> <translation id="3739623965217189342">നിങ്ങൾ പകർത്തിയ ലിങ്ക്</translation> <translation id="3744899669254331632">Chromium-ന് പ്രോസസ്സുചെയ്യാനാകാത്ത രൂപമാറ്റം വരുത്തിയ ക്രെഡൻഷ്യലുകൾ വെബ്സൈറ്റ് അയയ്ക്കുന്നതിനാൽ നിങ്ങൾക്കിപ്പോൾ <ph name="SITE" /> സന്ദർശിക്കാനാകില്ല. നെറ്റ്വർക്ക് പിശകുകളും ആക്രമണങ്ങളും സാധാരണയായി താൽക്കാലികമായതിനാൽ ഈ പേജ് മിക്കവാറും പിന്നീട് പ്രവർത്തിക്കും.</translation> <translation id="3748412725338508953">അവിടെ നിരവധി റീഡയറക്റ്റുകള് ഉണ്ട്.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">റീഡർ മോഡ്</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ബ്ലോക്കുചെയ്തിരിക്കുന്നു</translation> <translation id="4021036232240155012">ഒരു വെബ്സൈറ്റിന്റെ പേര് അതിന്റെ ഇന്റർനെറ്റ് വിലാസത്തിലേക്ക് വിവർത്തനം ചെയ്യുന്ന നെറ്റ്വർക്ക് സേവനമാണ് DNS.</translation> +<translation id="4021376465026729077">നിങ്ങളുടെ വിപുലീകരണങ്ങൾ പ്രവർത്തനരഹിതമാക്കുന്നു</translation> <translation id="4030383055268325496">&ചേർക്കുന്നത് പഴയപടിയാക്കുക</translation> <translation id="4032534284272647190"><ph name="URL" /> എന്നതിലേക്ക് ആക്സസ്സ് നിരസിച്ചു.</translation> <translation id="404928562651467259">മുന്നറിയിപ്പ്</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">മോശം പരിശോധിച്ചുറപ്പിക്കൽ സിഗ്നേച്ചർ</translation> <translation id="4176463684765177261">അപ്രാപ്തമാക്കി</translation> <translation id="4196861286325780578">&നീക്കുന്നത് വീണ്ടും ചെയ്യുക</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ഫയർവാളും ആന്റിവൈറസ് കോൺഫിഗറേഷനുകളും പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation> <translation id="4220128509585149162">ക്രാഷുകള്</translation> <translation id="4250680216510889253">ഇല്ല</translation> <translation id="4258748452823770588">മോശം സിഗ്നേച്ചർ</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">പ്രോക്സി ഉപയോഗം അപ്രാപ്തമാക്കി പക്ഷെ ഒരു വ്യക്തമായ പ്രോക്സി കോൺഫിഗറേഷൻ നിർദ്ദേശിച്ചു.</translation> <translation id="4492190037599258964">'<ph name="SEARCH_STRING" />' നുള്ള തിരയല് ഫലങ്ങള്</translation> <translation id="4506176782989081258">മൂല്യനിർണ്ണയ പിശക്: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">സിസ്റ്റം അഡ്മിനെ ബന്ധപ്പെടുന്നു</translation> <translation id="450710068430902550">അഡ്മിനിസ്ട്രേറ്ററുമായി പങ്കിടുന്നു</translation> <translation id="4522570452068850558">വിശദാംശങ്ങള്</translation> <translation id="4535734014498033861">പ്രോക്സി സെര്വര് കണക്ഷന് പരാജപ്പെട്ടു.</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">Google വിവര്ത്തനം എന്നതിനെക്കുറിച്ച് </translation> <translation id="5040262127954254034">സ്വകാര്യത</translation> <translation id="5045550434625856497">പാസ്വേഡ് തെറ്റാണ്</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />പ്രോക്സി വിലാസം പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation> <translation id="5087286274860437796">സെർവറിന്റെ സർട്ടിഫിക്കറ്റിന് ഇപ്പോൾ സാധുതയില്ല.</translation> <translation id="5089810972385038852">സ്റ്റേറ്റ്</translation> <translation id="5094747076828555589">ഈ സെർവറിന് അത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷ സർട്ടിഫിക്കറ്റിനെ Chromium-ത്തിന്ന് പരിചയമില്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു അക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">നാവിഗേഷന് ഉറപ്പാക്കുക</translation> <translation id="5299298092464848405">നയം പാഴ്സുചെയ്യുന്നതിൽ പിശക്</translation> <translation id="5300589172476337783">കാണിക്കുക</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />നിങ്ങളുടെ കുക്കികൾ മായ്ക്കുന്നു<ph name="END_LINK" /></translation> <translation id="5308689395849655368">ക്രാഷ് റിപ്പോര്ട്ടുചെയ്യല് അപ്രാപ്തമാക്കി.</translation> <translation id="5317780077021120954">സംരക്ഷിക്കുക</translation> <translation id="5327248766486351172">പേര്</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">വീണ്ടും ലോഡുചെയ്യുക</translation> <translation id="5565735124758917034">സജീവമാണ്</translation> <translation id="560412284261940334">മാനേജുമെന്റ് പിന്തുണയ്ക്കുന്നില്ല</translation> +<translation id="5610142619324316209">കണക്ഷൻ പരിശോധിക്കുന്നു</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" />, നിരവധി തവണ നിങ്ങളെ റീഡയറക്ടുചെയ്തു.</translation> <translation id="5629630648637658800">നയ ക്രമീകരണങ്ങൾ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</translation> <translation id="5631439013527180824">ഉപകരണ മാനേജുമെന്റ് ടോക്കൺ അസാധുവാണ്</translation> @@ -434,6 +451,7 @@ <translation id="6093795393556121384">നിങ്ങളുടെ കാർഡ് പരിശോധിച്ചുറപ്പിച്ചു</translation> <translation id="6146055958333702838">എല്ലാ കേബിളുകളും പരിശോധിക്കുക ഒപ്പം ഏതെങ്കിലും റൂട്ടറുകൾ, മോഡങ്ങൾ നിങ്ങൾ ഉപയോഗിക്കാനിടയുള്ള മറ്റ് നെറ്റ്വർക്ക് ഉപകരണങ്ങൾ എന്നിവ റീബൂട്ടുചെയ്യുക.</translation> +<translation id="614940544461990577">പരീക്ഷിച്ചുനോക്കൂ:</translation> <translation id="6151417162996330722">സെർവർ സർട്ടിഫിക്കറ്റിന് ദൈർഘ്യമേറിയ ഒരു കാലയളവ് ഉണ്ട്.</translation> <translation id="6154808779448689242">മടങ്ങിയ നയ ടോക്കൺ നിലവിലുള്ള ടോക്കണുമായി പൊരുത്തപ്പെടില്ല</translation> <translation id="6165508094623778733">കൂടുതൽ മനസിലാക്കുക</translation> @@ -475,11 +493,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> തിരയല്</translation> <translation id="6634865548447745291"><ph name="BEGIN_LINK" />ഈ സർട്ടിഫിക്കറ്റ് റദ്ദാക്കിയതിനാൽ<ph name="END_LINK" /> നിങ്ങൾക്കിപ്പോൾ <ph name="SITE" /> സന്ദർശിക്കാനാകില്ല. നെറ്റ്വർക്ക് പിശകുകളും ആക്രമണങ്ങളും സാധാരണയായി താൽക്കാലികമായതിനാൽ ഈ പേജ് മിക്കവാറും പിന്നീട് പ്രവർത്തിക്കാം.</translation> <translation id="6637478299472506933">ഡൗൺലോഡ് പരാജയപ്പെട്ടു</translation> +<translation id="6642894344118208103">മോഡമോ റൂട്ടറോ റീസെറ്റുചെയ്യുന്നു</translation> <translation id="6644283850729428850">ഈ നയം ഒഴിവാക്കി.</translation> <translation id="6646897916597483132">നിങ്ങളുടെ കാർഡിന്റെ മുന്നിലുള്ള 4 അക്ക CVC നൽകുക</translation> <translation id="6656103420185847513">ഫോൾഡർ എഡിറ്റുചെയ്യുക</translation> <translation id="6660210980321319655">സ്വയമേവ റിപ്പോർട്ടുചെയ്തത് <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Chromium-ത്തിൽ നിന്ന് ഫോം നിർദ്ദേശം നീക്കംചെയ്യണോ?</translation> +<translation id="6685834062052613830">സൈൻ ഔട്ട് ചെയ്ത്, സജ്ജമാക്കൽ പൂർത്തിയാക്കുക</translation> <translation id="6710213216561001401">കഴിഞ്ഞ</translation> <translation id="6711464428925977395">പ്രോക്സി സെർവറിൽ എന്തോ പ്രശ്നമുണ്ട്, അല്ലെങ്കിൽ വിലാസം തെറ്റാണ്.</translation> <translation id="674375294223700098">അറിയപ്പെടാത്ത സെര്വര് സര്ട്ടിഫിക്കറ്റ് പിശക്.</translation> @@ -513,6 +533,7 @@ <translation id="7052500709156631672">ഒരു അപ്സ്ട്രീം സെര്വറില് നിന്നും ഗേറ്റ്വേയ്ക്ക് അല്ലെങ്കില് പ്രോക്സി സെര്വറിന് ഒരു അസാധുവായ പ്രതികരണം ലഭിച്ചു.</translation> <translation id="7087282848513945231">രാജ്യം</translation> <translation id="7088615885725309056">വളരെ പഴയ</translation> +<translation id="7090678807593890770">Google-ൽ <ph name="LINK" /> തിരയുക</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" /> ഭാഷയിലേക്കുള്ള വിവർത്തനം പരാജയപ്പെട്ടു.</translation> <translation id="7139724024395191329">എമിറേറ്റ്</translation> <translation id="7179921470347911571">ഇപ്പോള് വീണ്ടും സമാരംഭിക്കുക</translation> @@ -605,6 +626,7 @@ <translation id="8034955203865359138">ചരിത്ര എൻട്രികളൊന്നും കണ്ടെത്തിയില്ല.</translation> <translation id="8088680233425245692">ലേഖനം കാണുന്നത് പരാജയപ്പെട്ടു.</translation> <translation id="8091372947890762290">സെർവറിൽ സജീവമാക്കൽ തീർപ്പാക്കിയിട്ടില്ല</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> എന്നതിന്റെ സെർവർ <ph name="BEGIN_ABBR" />DNS വിലാസം<ph name="END_ABBR" /> കണ്ടെത്താനായില്ല.</translation> <translation id="8149426793427495338">നിങ്ങളുടെ കമ്പ്യൂട്ടർ സുഷുപ്തിയിലായി.</translation> <translation id="8150722005171944719"><ph name="URL" /> എന്നതിലെ ഫയൽ റീഡുചെയ്യാനാവുന്നില്ല. അത് നീക്കംചെയ്തിരിക്കുകയോ, നീക്കിയിരിക്കുകയോ ഫയൽ അനുമതികൾ ആക്സസ്സ് തടയുകയോ ചെയ്യുന്നുണ്ടാകാം.</translation> <translation id="8194797478851900357">&നീക്കുന്നത് പഴയപടിയാക്കുക</translation> @@ -632,6 +654,7 @@ <translation id="8311778656528046050">ഈ പേജ് വീണ്ടും ലോഡുചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുവെന്ന് തീർച്ചയാണോ?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> ഹോസ്റ്റിലേക്കുള്ള ആക്സസ്സ് നിരസിച്ചു</translation> <translation id="8349305172487531364">ബുക്മാര്ക്ക് ബാര്</translation> +<translation id="8363502534493474904">ഫ്ലൈറ്റ് മോഡ് ഓഫാക്കുന്നു</translation> <translation id="8364627913115013041">സജ്ജമാക്കിയിട്ടില്ല.</translation> <translation id="8412145213513410671">ക്രാഷുകള് <ph name="CRASH_COUNT" /></translation> <translation id="8412392972487953978">നിങ്ങള് സമാന പാസ്ഫ്രെയ്സ് രണ്ടുതവണ നല്കണം.</translation> @@ -689,6 +712,7 @@ <translation id="901974403500617787">ഉടമയ്ക്ക് മാത്രമേ സിസ്റ്റത്തിലാകമാനം ബാധകമാക്കാവുന്ന ഫ്ലാഗ് സജ്ജമാക്കാനാകൂ: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">സെര്വര്, കണക്ഷന് നിരസിച്ചു.</translation> <translation id="9020542370529661692">ഈ പേജ് <ph name="TARGET_LANGUAGE" />-ലേക്ക് വിവർത്തനം ചെയ്തു</translation> +<translation id="9038649477754266430">പേജുകൾ കൂടുതൽ വേഗത്തിൽ ലോഡുചെയ്യാൻ ഒരു പ്രവചന സേവനം ഉപയോഗിക്കുക</translation> <translation id="9039213469156557790">ഈ പേജിൽ സുരക്ഷിതമല്ലാത്ത മറ്റ് ഉറവിടങ്ങൾ ഉൾപ്പെടുന്നു. ഈ ഉറവിടങ്ങൾ കൈമാറുന്നതിനിടെ മറ്റുള്ളവർക്ക് കാണാനും പേജിന്റെ പ്രവർത്തനരീതി മാറ്റുന്ന തരത്തിൽ ഒരു ആക്രമണകാരിയ്ക്ക് പരിഷ്ക്കരിക്കാനുമായേക്കും.</translation> <translation id="9049981332609050619">നിങ്ങള് <ph name="DOMAIN" /> എന്നതില് എത്താന് ശ്രമിച്ചു, പക്ഷേ സെര്വര് ഒരു അസാധുവായ സര്ട്ടിഫിക്കറ്റ് അവതരിപ്പിച്ചു.</translation> <translation id="9050666287014529139">പാസ്ഫ്രെയ്സ്</translation> @@ -702,6 +726,7 @@ <translation id="9170848237812810038">&പൂര്വാവസ്ഥയിലാക്കുക</translation> <translation id="917450738466192189">സെര്വറിന്റെ സര്ട്ടിഫിക്കറ്റ് അസാധുവാണ്.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> പിന്തുണയ്ക്കാത്ത ഒരു പ്രോട്ടോക്കോളാണ് ഉപയോഗിക്കുന്നത്.</translation> +<translation id="9205078245616868884">നിങ്ങളുടെ സമന്വയ പാസ്ഫ്രെയ്സ് ഉപയോഗിച്ച് ഡാറ്റ എൻക്രിപ്റ്റുചെയ്തു. സമന്വയം ആരംഭിക്കുന്നതിന് ഇത് നൽകുക.</translation> <translation id="9207861905230894330">ലേഖനം ചേർക്കുന്നത് പരാജയപ്പെട്ടു.</translation> <translation id="933612690413056017">ഇന്റർനെറ്റ് കണക്ഷനില്ല</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index b8a3e5f6..5713c3a 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षितता प्रमाणपत्र आपल्या संगणकाच्या ऑपरेटिंग प्रणालीद्वारे विश्वसनीय नाही. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.</translation> <translation id="1152921474424827756"><ph name="URL" /> च्या <ph name="BEGIN_LINK" />कॅशे केलेल्या कॉपीवर<ph name="END_LINK" /> प्रवेश करा</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> नी कनेक्शन अनपेक्षितरित्या बंद केले.</translation> +<translation id="1161325031994447685">Wi-Fi शी पुन्हा कनेक्ट करीत आहे</translation> <translation id="1175364870820465910">&मुद्रण...</translation> <translation id="1181037720776840403">काढा</translation> <translation id="1195447618553298278">अज्ञात त्रुटी.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">वापरकर्ता धोरणे</translation> <translation id="1644184664548287040">नेटवर्क कॉन्फिगरेशन अवैध आहे आणि आयात केले जाऊ शकले नाही.</translation> <translation id="1644574205037202324">इतिहास</translation> +<translation id="1645368109819982629">असमर्थित प्रोटोकॉल</translation> <translation id="1655462015569774233">{1,plural, =1{हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र काल कालबाह्य झाले. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते. आपले संगणक सध्या <ph name="CURRENT_DATE" /> वर सेट आहे. ते योग्य दिसते आहे? नसल्यास, आपण आपल्या सिस्टीमचे घड्याळ दुरूस्त करावे आणि त्यानंतर हे पृष्ठ रीफ्रेश करा.}one{हा सर्व्हर हे <ph name="DOMAIN" />असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र # दिवसांपूर्वी कालबाह्य झाले. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते. आपले संगणक सध्या <ph name="CURRENT_DATE" /> वर सेट आहे. ते योग्य दिसते आहे? नसल्यास, आपण आपल्या सिस्टीमचे घड्याळ दुरूस्त करावे आणि त्यानंतर हे पृष्ठ रीफ्रेश करा.}other{हा सर्व्हर हे <ph name="DOMAIN" />असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र # दिवसांपूर्वी कालबाह्य झाले. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते. आपले संगणक सध्या <ph name="CURRENT_DATE" /> वर सेट आहे. ते योग्य दिसते आहे? नसल्यास, आपण आपल्या सिस्टीमचे घड्याळ दुरूस्त करावे आणि त्यानंतर हे पृष्ठ रीफ्रेश करा.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> आपली माहिती संरक्षित करण्यासाठी सामान्यतः कूटबद्धीकरण वापरते. Google Chrome ने यावेळी <ph name="SITE" /> शी कनेक्ट करण्याचा प्रयत्न केला तेव्हा, वेबसाइटने असामान्य आणि अयोग्य क्रेडेन्शियल परत पाठविले. एकतर आक्रमणकर्ता <ph name="SITE" /> असल्याची बतावणी करण्याचा प्रयत्न करतो तेव्हा किंवा Wi-Fi साइन इन स्क्रीनने कनेक्शनमध्ये व्यत्यय आणले तेव्हा हे घडू शकते. कोणत्याही डेटाची अदलाबदल करण्यापूर्वी Google Chrome ने कनेक्शन थांबविल्यामुळे आपली माहिती अद्याप सुरक्षित आहे.</translation> <translation id="168841957122794586">सर्व्हर प्रमाणपत्रात एक कमकुवत क्रिप्टोग्राफिक की आहे.</translation> <translation id="1706954506755087368">{1,plural, =1{हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र उद्यापासून मानले जाईल. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.}one{हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र पुढील # दिवसांपासून मानले जाईल. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.}other{हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र पुढील # दिवसांपासून मानले जाईल. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">सिस्टीम प्रशासकाशी संपर्क साधण्याचा प्रयत्न करा.</translation> <translation id="17513872634828108">खुले टॅब</translation> <translation id="1753706481035618306">पृष्ठ क्रमांक</translation> <translation id="1763864636252898013">हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षितता प्रमाणपत्र आपल्या डिव्हाइसच्या ऑपरेटिंग प्रणालीद्वारे विश्वसनीय नाही. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">प्रॉक्सी स्वयंचलित कॉन्फिगरेशनवर सेट करण्यात आली.</translation> <translation id="2025623846716345241">रीलोड करण्याची पुष्टी करा</translation> <translation id="2030481566774242610">आपल्याला असे म्हणायचे होते <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />प्रॉक्सी आणि फायरवॉल तपासणे<ph name="END_LINK" /></translation> <translation id="2053553514270667976">पिनकोड</translation> <translation id="2065985942032347596">प्रमाणीकरण आवश्यक</translation> <translation id="2079545284768500474">पूर्ववत करा</translation> @@ -118,6 +122,8 @@ <translation id="2212735316055980242">धोरण आढळले नाही</translation> <translation id="2213606439339815911">प्रविष्ट्या आणत आहे...</translation> <translation id="2214283295778284209"><ph name="SITE" /> उपलब्ध नाही</translation> +<translation id="2227695659599072496">नेटवर्क केबल किंवा राउटर तपासणे</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />निदान अॅप<ph name="END_LINK" /> वापरून आपल्या कनेक्शनचे निराकरण करा</translation> <translation id="225207911366869382">हे मूल्य या धोरणासाठी नापसंत करण्यात आले आहे.</translation> <translation id="2262243747453050782">HTTP त्रुटी</translation> <translation id="2279770628980885996">सर्व्हर विनंती पूर्ण करण्याचा प्रयत्न करताना एक अनपेक्षित स्थिती आली.</translation> @@ -145,6 +151,7 @@ <translation id="2495083838625180221">JSON विश्लेषक</translation> <translation id="2495093607237746763">चेक केल्यास, अधिक जलद फॉर्म भरण्यासाठी या डिव्हाइसवर Chromium आपल्या कार्डची एक प्रत संचयित करेल.</translation> <translation id="2498091847651709837">नवीन कार्ड स्कॅन करा</translation> +<translation id="2515629240566999685">आपल्या क्षेत्रातील सिग्नल तपासणे</translation> <translation id="2516305470678292029">UI विकल्प</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> नी एक अवैध प्रतिसाद पाठविला.</translation> <translation id="2552545117464357659">थोडे नवीन</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">या पृष्ठास बुकमार्क करा</translation> <translation id="3270847123878663523">&पुनर्क्रमित करा पूर्ववत करा</translation> <translation id="3286538390144397061">त्वरित रीस्टार्ट करा</translation> +<translation id="3288003805934695103">पृष्ठ रीलोड करणे</translation> +<translation id="3305707030755673451">आपला डेटा आपल्या संकालन सांकेतिक वाक्यांशासह <ph name="TIME" /> वाजता कूटबद्ध केला होता. संकालन सुरु करण्यासाठी तो प्रविष्ट करा.</translation> <translation id="333371639341676808">अतिरिक्त संवाद तयार करण्यापासून या पृष्ठाला प्रतिबंधित करा.</translation> <translation id="3340978935015468852">सेटिंग्ज</translation> <translation id="3355823806454867987">प्रॉक्सी सेटिंग्ज बदला...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">लोड करीत आहे...</translation> <translation id="3712624925041724820">परवाने संपुष्टात</translation> +<translation id="3714780639079136834">मोबाइल डेटा किंवा Wi-Fi चालू करणे</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />प्रॉक्सी, फायरवॉल आणि DNS कॉन्फिगरेशन तपासणे<ph name="END_LINK" /></translation> <translation id="3739623965217189342">आपण कॉपी केलेल्याचा दुवा जोडा</translation> <translation id="3744899669254331632">Chromium प्रक्रिया करू शकत नसलेले सरमिसळ केलेले क्रेडेन्शियल वेबसाइटने पाठविल्याने आपण आत्ता <ph name="SITE" /> ला भेट देऊ शकत नाही. नेटवर्क त्रुटी आणि आक्रमण सहसा तात्पुरते आहेत त्यामुळे संभवत: हे पृष्ठ नंतर कार्य करेल.</translation> <translation id="3748412725338508953">तेथे बरेच पुनर्निर्देशित होते.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">वाचक मोड</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> अवरोधित केले आहे</translation> <translation id="4021036232240155012">DNS ही नेटवर्क सेवा आहे जी वेबसाइटचे नाव तिच्या इंटरनेट पत्त्यामध्ये भाषांतरित करते.</translation> +<translation id="4021376465026729077">विस्तार अक्षम करणे</translation> <translation id="4030383055268325496">&जोडा पूर्ववत करा</translation> <translation id="4032534284272647190"><ph name="URL" /> वर प्रवेश नाकारला.</translation> <translation id="404928562651467259">चेतावणी:</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">खराब सत्यापन स्वाक्षरी</translation> <translation id="4176463684765177261">अक्षम</translation> <translation id="4196861286325780578">&हलवा पुन्हा करा</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />फायरवॉल आणि अँटीव्हायरस कॉन्फिगरेशन तपासणे<ph name="END_LINK" /></translation> <translation id="4220128509585149162">क्रॅश होते</translation> <translation id="4250680216510889253">नाही</translation> <translation id="4258748452823770588">खराब स्वाक्षरी</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">प्रॉक्सीचा वापर अक्षम करण्यात आला आहे पण एक सुस्पष्ट प्रॉक्सी कॉन्फिगरेशन निर्दिष्ट करण्यात आले आहे.</translation> <translation id="4492190037599258964">'<ph name="SEARCH_STRING" />' साठी शोध परिणाम</translation> <translation id="4506176782989081258">प्रमाणीकरण त्रुटी: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">सिस्टीम प्रशासकाशी संपर्क साधणे</translation> <translation id="450710068430902550">प्रशासकासह सामायिक करीत आहे</translation> <translation id="4522570452068850558">तपशील</translation> <translation id="4535734014498033861">प्रॉक्सी सर्व्हर कनेक्शनमध्ये बिघाड.</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">Google अनुवाद बद्दल</translation> <translation id="5040262127954254034">गोपनीयता</translation> <translation id="5045550434625856497">अयोग्य संकेतशब्द</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />प्रॉक्सी पत्ता तपासणे<ph name="END_LINK" /></translation> <translation id="5087286274860437796">यावेळी सर्व्हरचे प्रमाणपत्र वैध नाही.</translation> <translation id="5089810972385038852">राज्य</translation> <translation id="5094747076828555589">हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षितता प्रमाणपत्र Chromium द्वारे विश्वसनीय नाही. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">नॅव्हिगेशनची पुष्टी करा</translation> <translation id="5299298092464848405">धोरण विश्लेषित करताना त्रुटी</translation> <translation id="5300589172476337783">दर्शवा</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />आपल्या कुकीज साफ करणे<ph name="END_LINK" /></translation> <translation id="5308689395849655368">क्रॅश अहवाल अक्षम केला गेला आहे.</translation> <translation id="5317780077021120954">जतन करा</translation> <translation id="5327248766486351172">नाव</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">रीलोड करा</translation> <translation id="5565735124758917034">सक्रिय</translation> <translation id="560412284261940334">व्यवस्थापन समर्थित नाही</translation> +<translation id="5610142619324316209">कनेक्शन तपासणे</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> नी आपल्याला अनेक वेळा पुनर्निर्देशित केले.</translation> <translation id="5629630648637658800">धोरण सेटिंग्ज लोड करण्यात अयशस्वी</translation> <translation id="5631439013527180824">अवैध डिव्हाइस व्यवस्थापन टोकन</translation> @@ -435,6 +452,7 @@ <translation id="6146055958333702838">कोणत्याही केबल तपासा आणि कोणतेही राउटर, मोडेम किंवा आपण वापरत असलेले अन्य नेटवर्क डिव्हाइसेस रीबूट करा.</translation> +<translation id="614940544461990577">हे करून पहा:</translation> <translation id="6151417162996330722">सर्व्हर प्रमाणपत्रास वैधता कालावधी आहे जो खूप मोठा आहे.</translation> <translation id="6154808779448689242">परत केलेले धोरण टोकन वर्तमान टोकनशी जुळत नाही</translation> <translation id="6165508094623778733">अधिक जाणून घ्या</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> शोध</translation> <translation id="6634865548447745291"><ph name="BEGIN_LINK" />हे प्रमाणपत्र रद्द केले गेल्यामुळे<ph name="END_LINK" /> आपण आत्ता <ph name="SITE" /> ला भेट देऊ शकत नाही. नेटवर्क त्रुटी आणि आक्रमणे सामान्यतः तात्पुरती असतात, यामुळे हे पृष्ठ कदाचित नंतर कार्य करेल.</translation> <translation id="6637478299472506933">डाउनलोड अयशस्वी</translation> +<translation id="6642894344118208103">मोडेम किंवा राउटर रीसेट करणे</translation> <translation id="6644283850729428850">हे धोरण नापसंत आहे.</translation> <translation id="6646897916597483132">आपल्या कार्डच्या पुढील भागावर असलेले 4-अंकी CVC प्रविष्ट करा</translation> <translation id="6656103420185847513">फोल्डर संपादित करा</translation> <translation id="6660210980321319655">स्वयंचलितपणे <ph name="CRASH_TIME" /> वाजता अहवाल दिला</translation> <translation id="6671697161687535275">Chromium वरून फॉर्म सूचना काढायच्या?</translation> +<translation id="6685834062052613830">साइन आउट करा आणि सेटअप पूर्ण करा</translation> <translation id="6710213216561001401">मागील</translation> <translation id="6711464428925977395">प्रॉक्सी सर्व्हरमध्ये काहीतरी चुकीचे आहे किंवा पत्ता चुकीचा आहे.</translation> <translation id="674375294223700098">अज्ञात सर्व्हर प्रमाणपत्र त्रुटी.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">गेटवे किंवा प्रॉक्सी सर्व्हरने अपस्ट्रीम सर्व्हरकडून एक अवैध प्रतिसाद प्राप्त केला आहे.</translation> <translation id="7087282848513945231">परगणा</translation> <translation id="7088615885725309056">थोडा जुना</translation> +<translation id="7090678807593890770">Google वर <ph name="LINK" /> शोधा</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" /> मध्ये भाषांतर अयशस्वी झाले.</translation> <translation id="7139724024395191329">अमिरात</translation> <translation id="7179921470347911571">आत्ता पुन्हा लाँच करा </translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">कोणत्याही इतिहास प्रविष्ट्या आढळल्या नाहीत.</translation> <translation id="8088680233425245692">लेख पाहण्यात अयशस्वी.</translation> <translation id="8091372947890762290">सक्रियकरण सर्व्हरवर प्रलंबित आहे</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" />चे सर्व्हर <ph name="BEGIN_ABBR" />DNS पत्ता<ph name="END_ABBR" /> शोधणे शक्य झाले नाही.</translation> <translation id="8149426793427495338">आपला संगणक निष्क्रीय झाला.</translation> <translation id="8150722005171944719"><ph name="URL" /> येथील फाइल वाचनीय नाही. ती काढून टाकलेली, हलविलेली असू शकते किंवा फाइल परवानग्या प्रवेश प्रतिबंधित करत असू शकतात.</translation> <translation id="8194797478851900357">&हलवा पूर्ववत करा</translation> @@ -631,6 +653,7 @@ <translation id="8311778656528046050">आपल्याला खात्री आहे की हे पृष्ठ आपण रीलोड करू इच्छिता?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> मधील प्रवेश नाकारला</translation> <translation id="8349305172487531364">बुकमार्क बार</translation> +<translation id="8363502534493474904">विमान मोड बंद करा</translation> <translation id="8364627913115013041">सेट केलेले नाही.</translation> <translation id="8412145213513410671">क्रॅश (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">आपण समान सांकेतिक वाक्यांश दोनदा प्रविष्ट करणे आवश्यक आहे.</translation> @@ -688,6 +711,7 @@ <translation id="901974403500617787">सिस्टीम-व्याप्त लागू होणारी ध्वजांकने केवळ मालकाद्वारे सेट केली जाऊ शकतात: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">सर्व्हरने कनेक्शनला नकार दिला.</translation> <translation id="9020542370529661692">हे पृष्ठ <ph name="TARGET_LANGUAGE" /> मध्ये भाषांतरित केले गेले आहे.</translation> +<translation id="9038649477754266430">पृष्ठे अधिक द्रुतपणे लोड करण्यासाठी पूर्वानुमान सेवेचा वापर करा</translation> <translation id="9039213469156557790">पुढे, या पृष्ठात सुरक्षित नसलेली इतर संसाधने समाविष्ट आहेत. ही संसाधने संक्रमणात असताना इतरांद्वारे पाहिली जाऊ शकतात आणि पृष्ठाचे वर्तन बदलण्यासाठी आक्रमणकर्त्याद्वारे सुधारित केली जाऊ शकतात.</translation> <translation id="9049981332609050619">आपण <ph name="DOMAIN" /> वर पोहोचण्याचा प्रयत्न केला, परंतु सर्व्हरने अवैध प्रमाणपत्र सादर केले आहे.</translation> <translation id="9050666287014529139">सांकेतिक वाक्यांश</translation> @@ -701,6 +725,7 @@ <translation id="9170848237812810038">&पूर्ववत करा</translation> <translation id="917450738466192189">सर्व्हरचे प्रमाणपत्र अवैध आहे.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> असमर्थित प्रोटोकॉल वापरतो.</translation> +<translation id="9205078245616868884">आपला डेटा आपल्या संकालन सांकेतिक वाक्यांशासह कूटबद्ध केला जातो. संकालन सुरु करण्यासाठी तो प्रविष्ट करा.</translation> <translation id="9207861905230894330">लेख जोडण्यात अयशस्वी.</translation> <translation id="933612690413056017">इंटरनेट कनेक्शन नाही</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 5839b02..db0911e 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Pelayan ini tidak dapat membuktikan bahawa domainnya ialah <ph name="DOMAIN" />; sijil keselamatannya tidak dipercayai oleh sistem pengendalian komputer anda. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintasi sambungan anda.</translation> <translation id="1152921474424827756">Akses <ph name="BEGIN_LINK" />salinan cache<ph name="END_LINK" /> <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> menutup sambungan tanpa di jangka.</translation> +<translation id="1161325031994447685">Menyambung semula ke Wi-Fi</translation> <translation id="1175364870820465910">&Cetak...</translation> <translation id="1181037720776840403">Buang</translation> <translation id="1195447618553298278">Ralat tidak diketahui.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Dasar pengguna</translation> <translation id="1644184664548287040">Konfigurasi rangkaian tidak sah dan tidak boleh diimport.</translation> <translation id="1644574205037202324">Sejarah</translation> +<translation id="1645368109819982629">Protokol tidak disokong</translation> <translation id="1655462015569774233">{1,plural, =1{Pelayan ini tidak dapat membuktikan bahawa <ph name="DOMAIN" />; sijil keselamatannya tamat tempoh semalam. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda. Jam komputer anda ditetapkan kepada <ph name="CURRENT_DATE" /> pada masa ini. Adakah itu betul? Jika tidak, anda perlu membetulkan jam sistem anda dan kemudian muat semula halaman ini.}other{Pelayan ini tidak dapat membuktikan bahawa <ph name="DOMAIN" />; sijil keselamatannya tamat tempoh # hari yang lalu. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda. Jam komputer anda ditetapkan kepada <ph name="CURRENT_DATE" /> pada masa ini. Adakah itu betul? Jika tidak, anda perlu membetulkan jam sistem anda dan kemudian muat semula halaman ini.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> biasanya menggunakan penyulitan untuk melindungi maklumat anda. Apabila Google Chrome cuba menyambung ke <ph name="SITE" /> pada kali ini, tapak web tersebut mengembalikan bukti kelayakan yang luar biasa dan salah. Hal ini boleh berlaku apabila penyerang sedang cuba menyamar sebagai <ph name="SITE" /> atau skrin log masuk Wi-Fi telah memutuskan sambungan. Maklumat anda masih selamat kerana Google Chrome menghentikan sambungan sebelum sebarang pertukaran data berlaku.</translation> <translation id="168841957122794586">Sijil pelayan mengandungi kunci kriptografi yang lemah.</translation> <translation id="1706954506755087368">{1,plural, =1{Pelayan ini tidak dapat membuktikan bahawa itu <ph name="DOMAIN" />;sijil keselamatannya sepatutnya bermula esok. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda.}other{Pelayan ini tidak dapat membuktikan bahawa itu <ph name="DOMAIN" />; sijil keselamatannya sepatutnya bermula # hari lagi. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Cuba hubungi pentadbir sistem.</translation> <translation id="17513872634828108">Buka tab</translation> <translation id="1753706481035618306">Nombor halaman</translation> <translation id="1763864636252898013">Pelayan ini tidak dapat membuktikan bahawa domainnya ialah <ph name="DOMAIN" />; sijil keselamatannya tidak dipercayai oleh sistem pengendalian peranti anda. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintasi sambungan anda.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proksi ditetapkan kepada auto konfigurasi.</translation> <translation id="2025623846716345241">Sahkan Muat Semula</translation> <translation id="2030481566774242610">Adakah anda maksudkan <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Menyemak proksi dan tembok api<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Poskod</translation> <translation id="2065985942032347596">Pengesahan Diperlukan</translation> <translation id="2079545284768500474">Buat asal</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Dasar tidak dijumpai</translation> <translation id="2213606439339815911">Mengambil entri…</translation> <translation id="2214283295778284209"><ph name="SITE" /> tidak tersedia</translation> +<translation id="2227695659599072496">Memeriksa kabel rangkaian atau penghala</translation> +<translation id="2230458221926704099">Betulkan sambungan anda menggunakan <ph name="BEGIN_LINK" />apl diagnostik<ph name="END_LINK" /></translation> <translation id="225207911366869382">Nilai ini tidak lagi digunakan untuk dasar ini.</translation> <translation id="2262243747453050782">Ralat HTTP</translation> <translation id="2279770628980885996">Keadaan tidak dijangka dihadapi apabila pelayan sedang cuba untuk memenuhi permintaan.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Penghurai JSON</translation> <translation id="2495093607237746763">Jika ditandai, Chromium akan menyimpan salinan kad anda pada peranti ini untuk pengisian borang yang lebih cepat.</translation> <translation id="2498091847651709837">Imbas kad baharu</translation> +<translation id="2515629240566999685">Semak isyarat di kawasan anda</translation> <translation id="2516305470678292029">Alternatif UI</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> menghantar balasan yang tidak sah.</translation> <translation id="2552545117464357659">Lebih baharu</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Tanda halaman ini</translation> <translation id="3270847123878663523">&Buat asal Susun semula</translation> <translation id="3286538390144397061">Mulakan Semula Sekarang</translation> +<translation id="3288003805934695103">Memuatkan semula halaman</translation> <translation id="3305707030755673451">Data anda disulitkan dengan ungkapan laluan segerak anda pada <ph name="TIME" />. Masukkannya untuk memulakan penyegerakan.</translation> <translation id="333371639341676808">Halang halaman ini daripada mencipta dialog tambahan.</translation> <translation id="3340978935015468852">tetapan</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Memuatkan...</translation> <translation id="3712624925041724820">Kehabisan lesen</translation> +<translation id="3714780639079136834">Menghidupkan data mudah alih atau Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Menyemak proksi, tembok api dan konfigurasi DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Pautan yang anda salin</translation> <translation id="3744899669254331632">Anda tidak boleh melawat <ph name="SITE" /> sekarang kerana tapak web telah menghantar bukti kelayakan hancur yang tidak boleh diproses oleh Chromium. Ralat dan serangan rangkaian biasanya sementara. Oleh itu halaman ini mungkin akan berfungsi kemudian.</translation> <translation id="3748412725338508953">Terlalu banyak penghalaan semula.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Mod Pembaca</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> disekat</translation> <translation id="4021036232240155012">DNS ialah perkhidmatan rangkaian yang menterjemahkan nama tapak web kepada alamat Internetnya.</translation> +<translation id="4021376465026729077">Melumpuhkan sambungan anda</translation> <translation id="4030383055268325496">&Buat asal tambahkan</translation> <translation id="4032534284272647190">Akses ke <ph name="URL" /> dinafikan.</translation> <translation id="404928562651467259">AMARAN</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Tandatangan pengesahan tidak sah</translation> <translation id="4176463684765177261">Dilumpuhkan</translation> <translation id="4196861286325780578">&Buat semula pindahkan</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Menyemak konfigurasi tembok api dan antivirus<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Nahas</translation> <translation id="4250680216510889253">Tidak</translation> <translation id="4258748452823770588">Tandatangan tidak elok</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">Penggunaan proksi dilumpuhkan tetapi konfigurasi proksi yang jelas dinyatakan.</translation> <translation id="4492190037599258964">Hasil carian untuk '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Ralat pengesahan: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Menghubungi pentadbir sistem</translation> <translation id="450710068430902550">Berkongsi dengan Pentadbir</translation> <translation id="4522570452068850558">Butiran</translation> <translation id="4535734014498033861">Sambungan pelayan proksi gagal.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">Perihal Google Terjemah</translation> <translation id="5040262127954254034">Privasi</translation> <translation id="5045550434625856497">Kata laluan tidak sah</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Menyemak alamat proksi<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Sijil pelayan tidak sah pada masa ini.</translation> <translation id="5089810972385038852">Negeri</translation> <translation id="5094747076828555589">Pelayan ini tidak dapat membuktikan bahawa domainnya ialah <ph name="DOMAIN" />; sijil keselamatannya tidak dipercayai oleh Chromium. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintasi sambungan anda.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Sahkan Navigasi</translation> <translation id="5299298092464848405">Ralat semasa menghuraikan dasar</translation> <translation id="5300589172476337783">Paparkan</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Menghapuskan kuki<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Pelaporan nahas dilumpuhkan.</translation> <translation id="5317780077021120954">Simpan</translation> <translation id="5327248766486351172">Nama</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Muat Semula</translation> <translation id="5565735124758917034">Aktif</translation> <translation id="560412284261940334">Pengurusan tidak disokong</translation> +<translation id="5610142619324316209">Menyemak sambungan</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> telah terlalu kerap mengubah hala anda.</translation> <translation id="5629630648637658800">Gagal memuatkan tetapan dasar</translation> <translation id="5631439013527180824">Token pengurusan peranti tidak sah</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Kad anda disahkan</translation> <translation id="6146055958333702838">Periksa mana-mana kabel dan but semula mana-mana penghala, modem atau peranti rangkaian lain yang mungkin anda gunakan.</translation> +<translation id="614940544461990577">Cuba:</translation> <translation id="6151417162996330722">Sijil pelayan mempunyai tempoh sah yang terlalu panjang.</translation> <translation id="6154808779448689242">Token dasar yang dikembalikan tidak sepadan dengan token semasa</translation> <translation id="6165508094623778733">Ketahui lebih lanjut</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Carian</translation> <translation id="6634865548447745291">Anda tidak boleh melawati <ph name="SITE" /> sekarang kerana <ph name="BEGIN_LINK" />sijil ini telah dibatalkan<ph name="END_LINK" />. Ralat rangkaian dan serangan biasanya bersifat sementara oleh itu, halaman ini mungkin akan berfungsi sebentar lagi.</translation> <translation id="6637478299472506933">Muat Turun Gagal</translation> +<translation id="6642894344118208103">Tetapkan semula modem atau penghala</translation> <translation id="6644283850729428850">Dasar ini telah dikecam.</translation> <translation id="6646897916597483132">Masukkan CVC 4 digit dari bahagian depan kad anda</translation> <translation id="6656103420185847513">Edit Folder</translation> <translation id="6660210980321319655">Dilaporkan secara automatik pada <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Alih keluar cadangan borang daripada Chromium?</translation> +<translation id="6685834062052613830">Log keluar dan selesaikan persediaan</translation> <translation id="6710213216561001401">Sebelumnya</translation> <translation id="6711464428925977395">Ada sesuatu yang tidak kena dengan pelayan proksi atau alamat tidak betul.</translation> <translation id="674375294223700098">Ralat sijil pelayan tidak diketahui.</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">Get laluan atau pelayan proksi menerima respons yang tidak sah daripada pelayan huluan.</translation> <translation id="7087282848513945231">Daerah</translation> <translation id="7088615885725309056">Lebih lama</translation> +<translation id="7090678807593890770">Cari <ph name="LINK" /> di Google</translation> <translation id="7108649287766967076">Terjemahan kepada <ph name="TARGET_LANGUAGE" /> gagal.</translation> <translation id="7139724024395191329">Emiriah</translation> <translation id="7179921470347911571">Lancarkan Semula Sekarang</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">Tiada masukan sejarah dijumpai.</translation> <translation id="8088680233425245692">Gagal melihat artikel.</translation> <translation id="8091372947890762290">Pengaktifan belum selesai pada pelayan</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />Alamat DNS<ph name="END_ABBR" /> pelayan <ph name="HOST_NAME" /> tidak ditemui.</translation> <translation id="8149426793427495338">Komputer anda dalam mod tidur.</translation> <translation id="8150722005171944719">Fail di <ph name="URL" /> tidak boleh dibaca. Fail mungkin telah dialih keluar, dipindahkan atau kebenaran fail mungkin menghalang akses.</translation> <translation id="8194797478851900357">&Buat Asal Pindahkan</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">Adakah anda pasti mahu memuat semula halaman ini?</translation> <translation id="8332188693563227489">Akses ke <ph name="HOST_NAME" /> dinafikan</translation> <translation id="8349305172487531364">Bar penanda halaman</translation> +<translation id="8363502534493474904">Matikan mod pesawat</translation> <translation id="8364627913115013041">Tidak ditetapkan.</translation> <translation id="8412145213513410671">Nahas (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Anda mesti memasukkan frasa laluan yang sama dua kali.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">Bendera yang diguna pakai di seluruh sistem hanya boleh ditetapkan oleh pemilik: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Pelayan menolak sambungan.</translation> <translation id="9020542370529661692">Halaman ini telah diterjemahkan kepada <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Gunakan perkhidmatan ramalan untuk memuatkan halaman lebih cepat</translation> <translation id="9039213469156557790">Selain itu, halaman ini mengandungi sumber lain yang tidak selamat. Sumber ini boleh dilihat oleh orang lain semasa dalam transit dan boleh diubah oleh penyerang untuk menukar kelakuan halaman.</translation> <translation id="9049981332609050619">Anda cuba untuk mencapai <ph name="DOMAIN" />, tetapi pelayan memberikan sijil tidak sah.</translation> <translation id="9050666287014529139">Frasa laluan</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index fef1bc0a..70014b6a 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -23,6 +23,7 @@ <translation id="1150979032973867961">De server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het beveiligingscertificaat van de server wordt niet vertrouwd door het besturingssysteem van je computer. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.</translation> <translation id="1152921474424827756">Een <ph name="BEGIN_LINK" />gecacht exemplaar<ph name="END_LINK" /> van <ph name="URL" /> openen</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> heeft de verbinding onverwacht verbroken.</translation> +<translation id="1161325031994447685">Opnieuw verbinding maken met wifi</translation> <translation id="1175364870820465910">&Afdrukken...</translation> <translation id="1181037720776840403">Verwijderen</translation> <translation id="1195447618553298278">Onbekende fout</translation> @@ -64,12 +65,14 @@ <translation id="1640180200866533862">Gebruikersbeleid</translation> <translation id="1644184664548287040">De netwerkconfiguratie is ongeldig en kan niet worden geïmporteerd.</translation> <translation id="1644574205037202324">Geschiedenis</translation> +<translation id="1645368109819982629">Niet-ondersteund protocol</translation> <translation id="1655462015569774233">{1,plural, =1{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is gisteren verlopen. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept. De klok van je computer is momenteel ingesteld op <ph name="CURRENT_DATE" />. Is dat correct? Zo niet, dan moet je de klok van je systeem aanpassen en vervolgens deze pagina vernieuwen.}other{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is # dagen geleden verlopen. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept. De klok van je computer is momenteel ingesteld op <ph name="CURRENT_DATE" />. Is dat correct? Zo niet, dan moet je de klok van je systeem aanpassen en vervolgens deze pagina vernieuwen.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> gebruikt gewoonlijk versleuteling om je gegevens te beschermen. Toen Google Chrome deze keer probeerde verbinding te maken met <ph name="SITE" />, retourneerde de website ongewone en onjuiste inloggegevens. Dit kan gebeuren als een aanvaller probeert zich als <ph name="SITE" /> voor te doen of als een wifi-inlogscherm de verbinding heeft verbroken. Je gegevens zijn nog steeds veilig omdat Google Chrome de verbinding heeft beëindigd voordat er gegevens konden worden uitgewisseld.</translation> <translation id="168841957122794586">Het servercertificaat bevat een zwakke cryptografische sleutel.</translation> <translation id="1706954506755087368">{1,plural, =1{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is zogenaamd van morgen. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.}other{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is zogenaamd van # dagen in de toekomst. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.}}</translation> <translation id="1710259589646384581">Besturingssysteem</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Probeer contact op te nemen met de systeembeheerder.</translation> <translation id="17513872634828108">Geopende tabbladen</translation> <translation id="1753706481035618306">Paginanummer</translation> <translation id="1763864636252898013">De server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het beveiligingscertificaat van de server wordt niet vertrouwd door het besturingssysteem van je apparaat. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.</translation> @@ -91,6 +94,7 @@ <translation id="2025186561304664664">Proxy is ingesteld op automatische configuratie.</translation> <translation id="2025623846716345241">Opnieuw laden bevestigen</translation> <translation id="2030481566774242610">Bedoelde je <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />De proxy en firewall controleren<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Postcode</translation> <translation id="2065985942032347596">Verificatie vereist</translation> <translation id="2079545284768500474">Ongedaan maken</translation> @@ -113,6 +117,8 @@ <translation id="2212735316055980242">Beleid niet gevonden</translation> <translation id="2213606439339815911">Items ophalen…</translation> <translation id="2214283295778284209"><ph name="SITE" /> is niet beschikbaar</translation> +<translation id="2227695659599072496">De netwerkkabel of router controleren</translation> +<translation id="2230458221926704099">Los problemen met je verbinding op met de <ph name="BEGIN_LINK" />diagnose-app<ph name="END_LINK" /></translation> <translation id="225207911366869382">Deze waarde is verouderd voor dit beleid.</translation> <translation id="2262243747453050782">HTTP-fout</translation> <translation id="2279770628980885996">Er is een onverwachte voorwaarde gevonden toen de server het verzoek wilde uitvoeren.</translation> @@ -140,6 +146,7 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Als deze optie is aangevinkt, bewaart Chromium een exemplaar van je kaart op dit apparaat om formulieren sneller te kunnen invullen.</translation> <translation id="2498091847651709837">Nieuwe kaart scannen</translation> +<translation id="2515629240566999685">Het signaal in je omgeving controleren</translation> <translation id="2516305470678292029">UI-alternatieven</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> heeft een ongeldige reactie verzonden.</translation> <translation id="2552545117464357659">Nieuwer</translation> @@ -208,6 +215,7 @@ <translation id="3254409185687681395">Bladwijzer instellen voor deze pagina</translation> <translation id="3270847123878663523">&Volgorde wijzigen ongedaan maken</translation> <translation id="3286538390144397061">Nu herstarten</translation> +<translation id="3288003805934695103">De pagina opnieuw laden</translation> <translation id="3305707030755673451">Je gegevens zijn op <ph name="TIME" /> versleuteld met je wachtwoordzin voor synchronisatie. Geef deze op om de synchronisatie te starten.</translation> <translation id="333371639341676808">Voorkom dat deze pagina extra dialoogvensters weergeeft.</translation> <translation id="3340978935015468852">instellingen</translation> @@ -251,6 +259,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Laden...</translation> <translation id="3712624925041724820">Licenties zijn verbruikt</translation> +<translation id="3714780639079136834">Mobiele data of wifi inschakelen</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />De proxy, firewall en DNS-configuratie controleren<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Link die je hebt gekopieerd</translation> <translation id="3744899669254331632">Je kunt <ph name="SITE" /> op dit moment niet bezoeken, omdat de website gecodeerde inloggegevens heeft verstuurd die niet door Chromium kunnen worden verwerkt. Aangezien netwerkfouten en aanvallen doorgaans van tijdelijke aard zijn, zal deze pagina later waarschijnlijk wel werken.</translation> <translation id="3748412725338508953">Er zijn te veel omleidingen.</translation> @@ -272,6 +282,7 @@ <translation id="3963721102035795474">Lezermodus</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> wordt geblokkeerd</translation> <translation id="4021036232240155012">DNS is de netwerkservice die de naam van een website omzet naar het bijbehorende internetadres.</translation> +<translation id="4021376465026729077">Je extensies uitschakelen</translation> <translation id="4030383055268325496">&Toevoegen ongedaan maken</translation> <translation id="4032534284272647190">Toegang tot <ph name="URL" /> geweigerd.</translation> <translation id="404928562651467259">WAARSCHUWING</translation> @@ -288,6 +299,7 @@ <translation id="4171400957073367226">Onjuiste verificatiehandtekening</translation> <translation id="4176463684765177261">Uitgeschakeld</translation> <translation id="4196861286325780578">&Opnieuw verplaatsen</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Firewall- en antivirusconfiguraties controleren<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Crashes</translation> <translation id="4250680216510889253">Nee</translation> <translation id="4258748452823770588">Onjuiste handtekening</translation> @@ -308,6 +320,7 @@ <translation id="443673843213245140">Het gebruik van een proxy is uitgeschakeld, maar er is wel een expliciete proxyconfiguratie opgegeven.</translation> <translation id="4492190037599258964">Zoekresultaten voor '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Validatiefout: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Contact opnemen met de systeembeheerder</translation> <translation id="450710068430902550">Delen met beheerder</translation> <translation id="4522570452068850558">Details</translation> <translation id="4535734014498033861">Proxyserververbinding mislukt.</translation> @@ -345,6 +358,7 @@ <translation id="5031870354684148875">Over Google Translate</translation> <translation id="5040262127954254034">Privacy</translation> <translation id="5045550434625856497">Onjuist wachtwoord</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Het proxy-adres controleren<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Het servercertificaat is momenteel niet geldig.</translation> <translation id="5089810972385038852">Staat</translation> <translation id="5094747076828555589">De server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het beveiligingscertificaat van de server wordt niet vertrouwd door Chromium. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.</translation> @@ -363,6 +377,7 @@ <translation id="5295309862264981122">Navigatie bevestigen</translation> <translation id="5299298092464848405">Fout bij het parseren van het beleid</translation> <translation id="5300589172476337783">Weergeven</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Je cookies wissen<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Crashrapportage is uitgeschakeld.</translation> <translation id="5317780077021120954">Opslaan</translation> <translation id="5327248766486351172">Naam</translation> @@ -390,6 +405,7 @@ <translation id="5556459405103347317">Opnieuw laden</translation> <translation id="5565735124758917034">Actief</translation> <translation id="560412284261940334">Beheer wordt niet ondersteund</translation> +<translation id="5610142619324316209">De verbinding controleren</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> heeft je te vaak omgeleid.</translation> <translation id="5629630648637658800">Laden van beleidsinstellingen is mislukt</translation> <translation id="5631439013527180824">Ongeldige token voor apparaatbeheer</translation> @@ -421,6 +437,7 @@ <translation id="6060685159320643512">Pas op, dit zijn geen experimenten om zonder handschoenen aan te pakken</translation> <translation id="6093795393556121384">Je kaart is geverifieerd</translation> <translation id="6146055958333702838">Controleer alle kabels en start alle routers, modems of andere netwerkapparaten die je gebruikt, opnieuw op.</translation> +<translation id="614940544461990577">Probeer het volgende:</translation> <translation id="6151417162996330722">Het servercertificaat heeft een te lange geldigheidsperiode.</translation> <translation id="6154808779448689242">Geretourneerde beleidstoken komt niet overeen met huidige token</translation> <translation id="6165508094623778733">Meer informatie</translation> @@ -461,11 +478,13 @@ <translation id="6628463337424475685">Zoeken via <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Je kunt <ph name="SITE" /> op dit moment niet bezoeken, omdat <ph name="BEGIN_LINK" />dit certificaat is ingetrokken<ph name="END_LINK" />. Netwerkfouten en aanvallen zijn doorgaans tijdelijk, dus deze pagina werkt later waarschijnlijk correct.</translation> <translation id="6637478299472506933">Download is mislukt</translation> +<translation id="6642894344118208103">De modem of router opnieuw instellen</translation> <translation id="6644283850729428850">Dit beleid is verouderd.</translation> <translation id="6646897916597483132">Geef de viercijferige CVC-code op die op de voorkant van je kaart staat</translation> <translation id="6656103420185847513">Map bewerken</translation> <translation id="6660210980321319655">Automatisch gemeld: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Formuliersuggestie verwijderen uit Chromium?</translation> +<translation id="6685834062052613830">Uitloggen en configuratie voltooien</translation> <translation id="6710213216561001401">Vorige</translation> <translation id="6711464428925977395">Er is iets mis met de proxyserver of het adres is onjuist.</translation> <translation id="674375294223700098">Onbekende fout met servercertificaat.</translation> @@ -495,6 +514,7 @@ <translation id="7052500709156631672">De gateway- of proxyserver heeft een ongeldige reactie ontvangen van een upstreamserver.</translation> <translation id="7087282848513945231">County</translation> <translation id="7088615885725309056">Ouder</translation> +<translation id="7090678807593890770">Zoek op Google naar <ph name="LINK" /></translation> <translation id="7108649287766967076">De vertaling naar het <ph name="TARGET_LANGUAGE" /> is mislukt.</translation> <translation id="7139724024395191329">Emiraat</translation> <translation id="7179921470347911571">Nu opnieuw starten</translation> @@ -585,6 +605,7 @@ <translation id="8034955203865359138">Geen items gevonden.</translation> <translation id="8088680233425245692">Kan artikel niet bekijken.</translation> <translation id="8091372947890762290">Activering is in behandeling op de server</translation> +<translation id="8134994873729925007">Het <ph name="BEGIN_ABBR" />DNS-adres<ph name="END_ABBR" /> van de server van <ph name="HOST_NAME" /> kan niet worden gevonden.</translation> <translation id="8149426793427495338">De slaapstand van je computer is geactiveerd.</translation> <translation id="8150722005171944719">Het bestand op <ph name="URL" /> is onleesbaar. Het bestand is mogelijk verwijderd of verplaatst of de bestandsrechten zorgen ervoor dat het bestand niet kan worden geopend.</translation> <translation id="8194797478851900357">&Verplaatsen ongedaan maken</translation> @@ -603,6 +624,7 @@ <translation id="8311778656528046050">Weet je zeker dat je deze pagina opnieuw wilt laden?</translation> <translation id="8332188693563227489">Toegang tot <ph name="HOST_NAME" /> is geweigerd</translation> <translation id="8349305172487531364">Bladwijzerbalk</translation> +<translation id="8363502534493474904">Vliegtuigmodus uitschakelen</translation> <translation id="8364627913115013041">Niet ingesteld.</translation> <translation id="8412145213513410671">Crashes (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Je moet twee keer dezelfde wachtwoordzin opgeven.</translation> @@ -659,6 +681,7 @@ <translation id="901974403500617787">Markeringen die op het hele systeem van toepassing zijn, kunnen alleen worden ingesteld door de eigenaar: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">De server heeft de verbinding geweigerd.</translation> <translation id="9020542370529661692">Deze pagina is vertaald naar het <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Een voorspellingsservice gebruiken om pagina's sneller te laden</translation> <translation id="9039213469156557790">Bovendien bevat deze pagina bronnen die niet beveiligd zijn. Deze bronnen kunnen tijdens verzending door anderen worden bekeken en kunnen door een aanvaller worden gewijzigd om het gedrag van de pagina aan te passen.</translation> <translation id="9049981332609050619">Je probeert <ph name="DOMAIN" /> te bereiken, maar de server heeft een ongeldig certificaat geretourneerd.</translation> <translation id="9050666287014529139">Wachtwoordzin</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index d852effd..101c88d 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />. Sikkerhetssertifikatet til tjeneren er ikke klarert av datamaskinens operativsystem. Dette kan være forårsaket av en feilkonfigurering eller en angriper som avskjærer tilkoblingen din.</translation> <translation id="1152921474424827756">Åpne en <ph name="BEGIN_LINK" />bufret kopi<ph name="END_LINK" /> av <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> avsluttet tilkoblingen uventet.</translation> +<translation id="1161325031994447685">Koble til Wi-Fi på nytt</translation> <translation id="1175364870820465910">&Skriv ut...</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1195447618553298278">Ukjent feil.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Brukerretningslinjer</translation> <translation id="1644184664548287040">Nettverkskonfigurasjonen er ugyldig og kan ikke importeres.</translation> <translation id="1644574205037202324">Logg</translation> +<translation id="1645368109819982629">Protokollen støttes ikke</translation> <translation id="1655462015569774233">{1,plural, =1{Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />, ettersom sikkerhetssertifikatet utløp i går. Dette kan skyldes en feilkonfigurasjon eller at en angriper avskjærer tilkoblingen mellom deg og nettstedet. Klokken på datamaskinen din er stilt til <ph name="CURRENT_DATE" />. Er det riktig? Hvis ikke bør du stille klokken på systemet og laste inn denne siden på nytt.}other{Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />, ettersom sikkerhetssertifikatet utløp for # dager siden. Dette kan skyldes en feilkonfigurasjon eller at en angriper avskjærer tilkoblingen mellom deg og nettstedet. Klokken på datamaskinen din er stilt til <ph name="CURRENT_DATE" />. Er det riktig? Hvis ikke bør du stille klokken på systemet og laste inn denne siden på nytt.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> bruker vanligvis kryptering for å beskytte informasjonen din. Da Chrome prøvde å koble til <ph name="SITE" /> denne gangen, sendte nettstedet tilbake uvanlig og feil legitimasjon. Dette kan skje hvis en angriper prøver å utgi seg for å være <ph name="SITE" />, eller hvis en Wi-Fi-påloggingsskjerm har avbrutt tilkoblingen. Informasjonen din er likevel sikker fordi Chrome stoppet tilkoblingen før det ble utvekslet noen data.</translation> <translation id="168841957122794586">Tjenersertifikatet inneholder en svak kryptografisk nøkkel.</translation> <translation id="1706954506755087368">{1,plural, =1{Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />, ettersom sikkerhetssertifikatet ser ut til å være fra i morgen. Dette kan skyldes en feilkonfigurasjon eller at en angriper avskjærer tilkoblingen mellom deg og nettstedet.}other{Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />, ettersom sikkerhetssertifikatet ser ut til å være fra # dager frem i tid. Dette kan skyldes en feilkonfigurasjon eller at en angriper avskjærer tilkoblingen mellom deg og nettstedet.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Prøv å kontakte systemadministratoren.</translation> <translation id="17513872634828108">Åpne faner</translation> <translation id="1753706481035618306">Sidenummer</translation> <translation id="1763864636252898013">Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />. Sikkerhetssertifikatet til tjeneren er ikke klarert av enhetens operativsystem. Dette kan være forårsaket av en feilkonfigurering eller en angriper som avskjærer tilkoblingen din.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Mellomtjeneren er innstilt på automatisk konfigurasjon.</translation> <translation id="2025623846716345241">Bekreft ny innlasting</translation> <translation id="2030481566774242610">Mener du <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Sjekk proxy-tjeneren og brannmuren<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Postnummer</translation> <translation id="2065985942032347596">Godkjenning kreves</translation> <translation id="2079545284768500474">Angre</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Innstillingene ble ikke funnet</translation> <translation id="2213606439339815911">Henter oppføringer …</translation> <translation id="2214283295778284209"><ph name="SITE" /> er ikke tilgjengelig</translation> +<translation id="2227695659599072496">Sjekk nettverkskabelen eller ruteren</translation> +<translation id="2230458221926704099">Løs tilkoblingsproblemene med <ph name="BEGIN_LINK" />diagnostikkappen<ph name="END_LINK" /></translation> <translation id="225207911366869382">Denne verdien er foreldet for denne innstillingen.</translation> <translation id="2262243747453050782">HTTP-feil</translation> <translation id="2279770628980885996">En uventet tilstand oppstod mens tjeneren forsøkte å utføre forespørselen.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Hvis det er merket av for dette alternativet, lagrer Chromium en kopi av kortet ditt på denne enheten, slik at det går raskere å fylle ut skjemaer.</translation> <translation id="2498091847651709837">Skann nytt kort</translation> +<translation id="2515629240566999685">Sjekk signalet i området ditt</translation> <translation id="2516305470678292029">Alternativer for brukergrensesnitt</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> sendte et ugyldig svar.</translation> <translation id="2552545117464357659">Nyere</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Legg til bokmerke for denne siden</translation> <translation id="3270847123878663523">&Angre omorganiseringen</translation> <translation id="3286538390144397061">Start på nytt nå</translation> +<translation id="3288003805934695103">Last inn siden på nytt</translation> +<translation id="3305707030755673451">Dataene dine er kryptert med passordfrasen din for synkronisering <ph name="TIME" />. Skriv den inn for å starte synkroniseringen.</translation> <translation id="333371639341676808">Hindre denne siden i å opprette flere dialogbokser.</translation> <translation id="3340978935015468852">innstillinger</translation> <translation id="3355823806454867987">Endre innstillinger for mellomtjener</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Laster inn...</translation> <translation id="3712624925041724820">Lisensene er oppbrukt</translation> +<translation id="3714780639079136834">Slå på mobildata eller Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Sjekk proxy-tjener-, brannmur- og DNS-konfigurasjonen<ph name="END_LINK" /></translation> <translation id="3739623965217189342">En link du kopierte</translation> <translation id="3744899669254331632">Du kan ikke gå til <ph name="SITE" /> akkurat nå, fordi nettstedet sendte kryptert legitimasjon som Chromium ikke kan behandle. Nettverksfeil og -angrep er vanligvis forbigående, så siden kommer sikkert til å virke senere.</translation> <translation id="3748412725338508953">Det var for mange omdirigeringer.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Lesermodus</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> er blokkert</translation> <translation id="4021036232240155012">DNS er nettverkstjenesten som oversetter navnene på nettsteder til Internett-adressene deres.</translation> +<translation id="4021376465026729077">Slå av utvidelsene dine</translation> <translation id="4030383055268325496">&Angre tilleggingen</translation> <translation id="4032534284272647190">Tilgang til <ph name="URL" /> ble avvist.</translation> <translation id="404928562651467259">ADVARSEL</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Ugyldig bekreftelsessignatur</translation> <translation id="4176463684765177261">Deaktivert</translation> <translation id="4196861286325780578">&Flytt likevel</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Sjekk brannmur- og antiviruskonfigurasjonen<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Programstopp</translation> <translation id="4250680216510889253">Nei</translation> <translation id="4258748452823770588">Dårlig signatur</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Bruk av mellomtjener er deaktivert, men det er angitt en uttrykkelig mellomtjenerkonfigurasjon.</translation> <translation id="4492190037599258964">Søkeresultater for «<ph name="SEARCH_STRING" />»</translation> <translation id="4506176782989081258">Valideringsfeil: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Kontakt systemadministratoren</translation> <translation id="450710068430902550">Deling med administratoren</translation> <translation id="4522570452068850558">Detaljer</translation> <translation id="4535734014498033861">Tilkobling til mellomtjener mislyktes.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Om Google Oversett</translation> <translation id="5040262127954254034">Personvern</translation> <translation id="5045550434625856497">Feil passord</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Sjekk proxy-tjeneradressen<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Sertifikatet til tjeneren er ikke gyldig for øyeblikket.</translation> <translation id="5089810972385038852">Fylke / delstat</translation> <translation id="5094747076828555589">Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />. Sikkerhetssertifikatet til tjeneren er ikke klarert av Chromium. Dette kan være forårsaket av en feilkonfigurering eller en angriper som avskjærer tilkoblingen din.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Bekreft navigering</translation> <translation id="5299298092464848405">Feil under analysen av enhetsinnstillingene</translation> <translation id="5300589172476337783">Vis</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Slett informasjonskapslene dine<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Rapportering av programstopp er deaktivert.</translation> <translation id="5317780077021120954">Lagre</translation> <translation id="5327248766486351172">Navn</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Last inn på nytt</translation> <translation id="5565735124758917034">Aktiv</translation> <translation id="560412284261940334">Administrering støttes ikke</translation> +<translation id="5610142619324316209">Sjekk tilkoblingen</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> viderekoblet deg for mange ganger.</translation> <translation id="5629630648637658800">Kunne ikke laste in angivelsen for enhetsinnstillinger</translation> <translation id="5631439013527180824">Ugyldig token for enhetsadministrering</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Kortet er bekreftet</translation> <translation id="6146055958333702838">Sjekk alle kabler, og start rutere, modemer eller andre nettverksenheter du bruker, på nytt.</translation> +<translation id="614940544461990577">Prøv dette:</translation> <translation id="6151417162996330722">Tjenersertifikatet har en gyldighetsperiode som er for lang.</translation> <translation id="6154808779448689242">Det returnerte tokenet for enhetsinnstillinger samsvarer ikke med det gjeldende tokenet</translation> <translation id="6165508094623778733">Les mer</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Søk</translation> <translation id="6634865548447745291">Du kan ikke gå til <ph name="SITE" /> akkurat nå fordi <ph name="BEGIN_LINK" />dette sertifikatet er tilbakekalt<ph name="END_LINK" />. Nettverksfeil og -angrep er som regel kortvarige, så denne siden fungerer nok igjen senere.</translation> <translation id="6637478299472506933">Nedlastingen mislyktes</translation> +<translation id="6642894344118208103">Tilbakestill modemet eller ruteren</translation> <translation id="6644283850729428850">Denne retningslinjen er foreldet.</translation> <translation id="6646897916597483132">Skriv inn den firesifrede CVC-koden du finner på forsiden av kortet ditt.</translation> <translation id="6656103420185847513">Mapperedigering</translation> <translation id="6660210980321319655">Automatisk rapportert <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Vil du fjerne forslaget fra Chromium?</translation> +<translation id="6685834062052613830">Logg av og fullfør konfigurasjonen</translation> <translation id="6710213216561001401">Forrige</translation> <translation id="6711464428925977395">Det er noe galt med proxy-tjeneren, eller adressen er feil.</translation> <translation id="674375294223700098">Ukjent feil med tjenersertifikat.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">Portner- eller mellomtjeneren mottok et ugyldig svar fra en annen tjener.</translation> <translation id="7087282848513945231">Fylke</translation> <translation id="7088615885725309056">Eldre</translation> +<translation id="7090678807593890770">Søk på Google etter <ph name="LINK" /></translation> <translation id="7108649287766967076">Oversettelsen til <ph name="TARGET_LANGUAGE" /> mislyktes.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Start på nytt nå</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Fant ingen loggoppføringer.</translation> <translation id="8088680233425245692">Kunne ikke åpne artikkelen.</translation> <translation id="8091372947890762290">Aktivering venter på tjeneren</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" />-tjenerens <ph name="BEGIN_ABBR" />DNS-adresse<ph name="END_ABBR" /> ble ikke funnet.</translation> <translation id="8149426793427495338">Datamaskinen din gikk inn i hvilemodus.</translation> <translation id="8150722005171944719">Kunne ikke lese filen på <ph name="URL" /> Den kan ha blitt fjernet eller flyttet. Det kan også være filtillatelser som forhindrer tilgang.</translation> <translation id="8194797478851900357">&Angre flyttingen</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Er du sikker på at du vil laste inn denne siden på nytt?</translation> <translation id="8332188693563227489">Forsøket på å koble til <ph name="HOST_NAME" /> ble avvist</translation> <translation id="8349305172487531364">Bokmerkerad</translation> +<translation id="8363502534493474904">Slå av flymodus</translation> <translation id="8364627913115013041">Ikke angitt.</translation> <translation id="8412145213513410671">Programstopp (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Du må angi den samme passordfrasen to ganger.</translation> @@ -693,6 +716,7 @@ <translation id="901974403500617787">Rapporteringer som gjelder for hele systemet kan bare angis av eieren: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Tjeneren tillot ikke tilkoblingen.</translation> <translation id="9020542370529661692">Denne siden har blitt oversatt til <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Bruk en forslagstjeneste for å laste inn sider raskere</translation> <translation id="9039213469156557790">Denne siden inneholder i tillegg andre ressurser som ikke er sikre. Disse ressursene er synlige for andre mens de sendes frem og tilbake, og eventuelle angripere kan modifisere dem for å endre på atferden til siden.</translation> <translation id="9049981332609050619">Du forsøkte å nå <ph name="DOMAIN" />, men tjeneren oppga et ugyldig sertifikat.</translation> <translation id="9050666287014529139">Passordfrase</translation> @@ -706,6 +730,7 @@ <translation id="9170848237812810038">&Angre</translation> <translation id="917450738466192189">Tjenerens sertifikat er ugyldig.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> bruker en protokoll som ikke støttes.</translation> +<translation id="9205078245616868884">Dataene dine er kryptert med passordfrasen din for synkronisering. Skriv den inn for å starte synkroniseringen.</translation> <translation id="9207861905230894330">Kunne ikke legge til artikkelen.</translation> <translation id="933612690413056017">Du er ikke koblet til Internett</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index e5ca3a5..4112788 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa nie jest zaufany w systemie operacyjnym tego komputera. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation> <translation id="1152921474424827756">Przejdź do <ph name="BEGIN_LINK" />kopii<ph name="END_LINK" /> <ph name="URL" /> w pamięci podręcznej</translation> <translation id="1158211211994409885">Serwer <ph name="HOST_NAME" /> nieoczekiwanie zakończył połączenie.</translation> +<translation id="1161325031994447685">Ponownie połącz się z Wi-Fi</translation> <translation id="1175364870820465910">&Drukuj...</translation> <translation id="1181037720776840403">Usuń</translation> <translation id="1195447618553298278">Nieznany błąd.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Zasady dotyczące użytkowników</translation> <translation id="1644184664548287040">Konfiguracja sieci jest nieprawidłowa i nie można jej zaimportować.</translation> <translation id="1644574205037202324">Historia</translation> +<translation id="1645368109819982629">Nieobsługiwany protokół</translation> <translation id="1655462015569774233">{1,plural, =1{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa wygasł wczoraj. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia. Zegar komputera jest obecnie ustawiony na <ph name="CURRENT_DATE" />. Czy to prawidłowa data? Jeśli nie, musisz skorygować zegar systemu, a następnie odświeżyć tę stronę.}few{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa wygasł # dni temu. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia. Zegar komputera jest obecnie ustawiony na <ph name="CURRENT_DATE" />. Czy to prawidłowa data? Jeśli nie, musisz skorygować zegar systemu, a następnie odświeżyć tę stronę.}many{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa wygasł # dni temu. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia. Zegar komputera jest obecnie ustawiony na <ph name="CURRENT_DATE" />. Czy to prawidłowa data? Jeśli nie, musisz skorygować zegar systemu, a następnie odświeżyć tę stronę.}other{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa wygasł # dnia temu. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia. Zegar komputera jest obecnie ustawiony na <ph name="CURRENT_DATE" />. Czy to prawidłowa data? Jeśli nie, musisz skorygować zegar systemu, a następnie odświeżyć tę stronę.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> zazwyczaj używa szyfrowania do ochrony Twoich informacji. Gdy tym razem Google Chrome próbował połączyć się ze stroną <ph name="SITE" />, odesłała ona nietypowe i nieprawidłowe dane logowania. Może się tak zdarzyć, gdy pod stronę <ph name="SITE" /> podszywa się atakująca osoba albo gdy ekran logowania do sieci Wi-Fi przerwie połączenie. Twoje informacje są nadal bezpieczne, bo połączenie w Google Chrome zakończyło się przed wymianą jakichkolwiek danych.</translation> <translation id="168841957122794586">Certyfikat serwera ma słaby klucz kryptograficzny.</translation> <translation id="1706954506755087368">{1,plural, =1{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa przypuszczalnie zacznie obowiązywać od jutra. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia.}few{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa przypuszczalnie zacznie obowiązywać za # dni. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia.}many{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa przypuszczalnie zacznie obowiązywać za # dni. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia.}other{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa przypuszczalnie zacznie obowiązywać za # dnia. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia.}}</translation> <translation id="1710259589646384581">System operacyjny</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Skontaktuj się z administratorem systemu.</translation> <translation id="17513872634828108">Otwarte karty</translation> <translation id="1753706481035618306">Numer strony</translation> <translation id="1763864636252898013">Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa nie jest zaufany w systemie operacyjnym tego urządzenia. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Ustawiono automatyczne konfigurowanie proxy.</translation> <translation id="2025623846716345241">Potwierdź ponowne ładowanie</translation> <translation id="2030481566774242610">Czy chodziło Ci o <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Sprawdź serwer proxy i zaporę sieciową<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Kod pocztowy</translation> <translation id="2065985942032347596">Wymagane uwierzytelnienie</translation> <translation id="2079545284768500474">Cofnij</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Nie znaleziono zasady</translation> <translation id="2213606439339815911">Pobieram wpisy...</translation> <translation id="2214283295778284209">Witryna <ph name="SITE" /> jest niedostępna</translation> +<translation id="2227695659599072496">Sprawdź kabel sieciowy lub router</translation> +<translation id="2230458221926704099">Napraw połączenie, używając <ph name="BEGIN_LINK" />aplikacji diagnostycznej<ph name="END_LINK" /></translation> <translation id="225207911366869382">Ta wartość tej zasady została wycofana.</translation> <translation id="2262243747453050782">Błąd HTTP</translation> <translation id="2279770628980885996">Napotkano nieoczekiwaną sytuację przy próbie zrealizowania żądania przez serwer.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Parser JSON</translation> <translation id="2495093607237746763">Jeśli zaznaczysz tę opcję, Chromium zapisze kopię Twojej karty na tym urządzeniu, by umożliwić Ci szybsze wypełnianie formularzy.</translation> <translation id="2498091847651709837">Zeskanuj nową kartę</translation> +<translation id="2515629240566999685">Sprawdź sygnał w swojej okolicy</translation> <translation id="2516305470678292029">Alternatywne interfejsy</translation> <translation id="255002559098805027">Serwer <ph name="HOST_NAME" /> wysłał nieprawidłową odpowiedź.</translation> <translation id="2552545117464357659">Nowsze</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">Dodaj stronę do zakładek</translation> <translation id="3270847123878663523">&Cofnij zmianę kolejności</translation> <translation id="3286538390144397061">Uruchom ponownie teraz</translation> +<translation id="3288003805934695103">Odśwież stronę</translation> +<translation id="3305707030755673451">Twoje dane zostały zaszyfrowane z użyciem hasła synchronizacji w dniu <ph name="TIME" />. Wpisz je, by rozpocząć synchronizację.</translation> <translation id="333371639341676808">Zapobiegaj wyświetlaniu dodatkowych okien dialogowych na tej stronie.</translation> <translation id="3340978935015468852">ustawienia</translation> <translation id="3355823806454867987">Zmień ustawienia serwera proxy...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Ładowanie...</translation> <translation id="3712624925041724820">Brak wolnych licencji</translation> +<translation id="3714780639079136834">Włącz komórkową transmisję danych lub Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Sprawdź serwer proxy, zaporę sieciową i konfigurację DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Skopiowany link</translation> <translation id="3744899669254331632">Nie możesz teraz odwiedzić strony <ph name="SITE" />, ponieważ wysłała ona zaszyfrowane dane logowania, których Chromium nie może przetworzyć. Błędy sieciowe i ataki są zazwyczaj tymczasowe, więc prawdopodobnie strona będzie dostępna później.</translation> <translation id="3748412725338508953">Zbyt wiele przekierowań.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">Tryb czytnika</translation> <translation id="3973234410852337861">Strona <ph name="HOST_NAME" /> jest zablokowana</translation> <translation id="4021036232240155012">DNS to usługa sieciowa tłumacząca nazwę serwera na jego adres internetowy.</translation> +<translation id="4021376465026729077">Wyłącz rozszerzenia</translation> <translation id="4030383055268325496">&Cofnij dodanie</translation> <translation id="4032534284272647190">Odmówiono dostępu do <ph name="URL" />.</translation> <translation id="404928562651467259">OSTRZEŻENIE</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">Nieprawidłowy podpis weryfikujący</translation> <translation id="4176463684765177261">Wyłączone</translation> <translation id="4196861286325780578">&Ponów przeniesienie</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Sprawdź konfigurację zapory sieciowej i oprogramowania antywirusowego<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Awarie</translation> <translation id="4250680216510889253">Nie</translation> <translation id="4258748452823770588">Nieprawidłowy podpis</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">Korzystanie z serwera proxy jest wyłączone, ale podano konfigurację proxy.</translation> <translation id="4492190037599258964">Wyniki wyszukiwania dla „<ph name="SEARCH_STRING" />”</translation> <translation id="4506176782989081258">Błąd sprawdzania poprawności: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Skontaktuj się z administratorem systemu</translation> <translation id="450710068430902550">Udostępnianie administratorowi</translation> <translation id="4522570452068850558">Szczegóły</translation> <translation id="4535734014498033861">Połączenie z serwerem proxy nie powiodło się.</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">Tłumacz Google – informacje</translation> <translation id="5040262127954254034">Prywatność</translation> <translation id="5045550434625856497">Nieprawidłowe hasło</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Sprawdź adres serwera proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Certyfikat serwera nie jest obecnie ważny.</translation> <translation id="5089810972385038852">Stan</translation> <translation id="5094747076828555589">Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa nie jest zaufany w Chromium. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">Potwierdź nawigację</translation> <translation id="5299298092464848405">Podczas przetwarzania zasady wystąpił błąd</translation> <translation id="5300589172476337783">Pokaż</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Usuń pliki cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Funkcja zgłaszania awarii jest wyłączona.</translation> <translation id="5317780077021120954">Zapisz</translation> <translation id="5327248766486351172">Nazwa</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">Odśwież</translation> <translation id="5565735124758917034">Aktywny</translation> <translation id="560412284261940334">Zarządzanie jest nieobsługiwane</translation> +<translation id="5610142619324316209">Sprawdź połączenie</translation> <translation id="5617949217645503996">Strona <ph name="HOST_NAME" /> spowodowała zbyt wiele przekierowań.</translation> <translation id="5629630648637658800">Ładowanie ustawień zasady nie powiodło się</translation> <translation id="5631439013527180824">Nieprawidłowy token zarządzania urządzeniem</translation> @@ -434,6 +451,7 @@ <translation id="6093795393556121384">Karta została zweryfikowana</translation> <translation id="6146055958333702838">Sprawdź wszystkie kable i uruchom ponownie wszelkie używane routery, modemy i inne urządzenia sieciowe.</translation> +<translation id="614940544461990577">Wypróbuj te rozwiązania:</translation> <translation id="6151417162996330722">Certyfikat serwera ma za długi okres ważności.</translation> <translation id="6154808779448689242">Zwrócony token zasady jest niezgodny z bieżącym</translation> <translation id="6165508094623778733">Więcej informacji</translation> @@ -475,11 +493,13 @@ <translation id="6628463337424475685">Wyszukiwarka <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Nie możesz teraz odwiedzić strony <ph name="SITE" />, bo <ph name="BEGIN_LINK" />ten certyfikat został unieważniony<ph name="END_LINK" />. Błędy sieci i ataki są zazwyczaj przejściowe, więc prawdopodobnie strona będzie wkrótce działać.</translation> <translation id="6637478299472506933">Błąd pobierania</translation> +<translation id="6642894344118208103">Zresetuj modem lub router</translation> <translation id="6644283850729428850">Zasada jest przestarzała.</translation> <translation id="6646897916597483132">Wpisz czterocyfrowy kod CVC widoczny na przodzie karty</translation> <translation id="6656103420185847513">Folder edytora</translation> <translation id="6660210980321319655">Automatyczne zgłoszenie: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Usunąć tę podpowiedź do formularza z Chromium?</translation> +<translation id="6685834062052613830">Wyloguj się i dokończ konfigurację</translation> <translation id="6710213216561001401">Wstecz</translation> <translation id="6711464428925977395">Serwer proxy działa nieprawidłowo albo adres jest błędny.</translation> <translation id="674375294223700098">Nieznany błąd certyfikatu serwera.</translation> @@ -513,6 +533,7 @@ <translation id="7052500709156631672">Na poziomie bramy lub serwera proxy odebrano nieprawidłową odpowiedź z serwera wyższego rzędu.</translation> <translation id="7087282848513945231">Hrabstwo</translation> <translation id="7088615885725309056">Starsze</translation> +<translation id="7090678807593890770">Wyszukaj w Google: <ph name="LINK" /></translation> <translation id="7108649287766967076">Tłumaczenie na <ph name="TARGET_LANGUAGE" /> nie powiodło się.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Uruchom ponownie teraz</translation> @@ -605,6 +626,7 @@ <translation id="8034955203865359138">Brak wpisów historii.</translation> <translation id="8088680233425245692">Nie udało się wyświetlić artykułu.</translation> <translation id="8091372947890762290">Aktywacja oczekuje na serwerze</translation> +<translation id="8134994873729925007">Nie udało się znaleźć <ph name="BEGIN_ABBR" />adresu DNS<ph name="END_ABBR" /> serwera <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Twój komputer przeszedł w tryb uśpienia.</translation> <translation id="8150722005171944719">Nie można odczytać pliku <ph name="URL" />. Być może został usunięty lub uprawnienia dostępu uniemożliwiają jego odczyt.</translation> <translation id="8194797478851900357">&Cofnij przeniesienie</translation> @@ -632,6 +654,7 @@ <translation id="8311778656528046050">Czy na pewno chcesz załadować ponownie tę stronę?</translation> <translation id="8332188693563227489">Odmowa dostępu do <ph name="HOST_NAME" /></translation> <translation id="8349305172487531364">Pasek zakładek</translation> +<translation id="8363502534493474904">Wyłącz tryb samolotowy</translation> <translation id="8364627913115013041">Nie ustawiono.</translation> <translation id="8412145213513410671">Awarie (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Musisz dwukrotnie wpisać to samo hasło.</translation> @@ -689,6 +712,7 @@ <translation id="901974403500617787">Flagi stosowane w całym systemie może ustawić tylko właściciel: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Serwer odrzucił połączenie.</translation> <translation id="9020542370529661692">Ta strona została przetłumaczona na <ph name="TARGET_LANGUAGE" />.</translation> +<translation id="9038649477754266430">Użyj usługi podpowiedzi, by strony ładowały się szybciej</translation> <translation id="9039213469156557790">Ta strona zawiera także niezabezpieczone zasoby. Podczas przesyłania mogą je wyświetlić inni użytkownicy, a osoby atakujące mogą je zmodyfikować, by zmienić sposób działania strony.</translation> <translation id="9049981332609050619">Podjęto próbę nawiązania połączenia z witryną <ph name="DOMAIN" />, jednak serwer przedstawił nieprawidłowy certyfikat.</translation> <translation id="9050666287014529139">Hasło</translation> @@ -702,6 +726,7 @@ <translation id="9170848237812810038">&Cofnij</translation> <translation id="917450738466192189">Certyfikat serwera jest nieprawidłowy.</translation> <translation id="9183425211371246419">Serwer <ph name="HOST_NAME" /> używa nieobsługiwanego protokołu.</translation> +<translation id="9205078245616868884">Twoje dane są szyfrowane z użyciem hasła synchronizacji. Wpisz je, by rozpocząć synchronizację.</translation> <translation id="9207861905230894330">Nie udało się dodać artykułu.</translation> <translation id="933612690413056017">Brak połączenia z internetem</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index ad642e8..803d39c 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança não é confiável para o sistema operacional do seu computador. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.</translation> <translation id="1152921474424827756">Acessar uma <ph name="BEGIN_LINK" />cópia em cache<ph name="END_LINK" /> de <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> encerrou a conexão inesperadamente.</translation> +<translation id="1161325031994447685">Conectar-se à rede Wi-Fi novamente</translation> <translation id="1175364870820465910">&Imprimir...</translation> <translation id="1181037720776840403">Remover</translation> <translation id="1195447618553298278">Erro desconhecido.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Políticas de usuário</translation> <translation id="1644184664548287040">A configuração de rede é inválida e não pôde ser importada.</translation> <translation id="1644574205037202324">Histórico</translation> +<translation id="1645368109819982629">Protocolo não compatível</translation> <translation id="1655462015569774233">{1,plural, =1{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; o certificado de segurança dele expirou ontem. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor. O relógio do seu computador está definido para <ph name="CURRENT_DATE" />. Essa data está correta? Se não estiver, corrija o relógio do sistema e depois atualize esta página.}one{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele expirou há # dias. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor. O relógio do seu computador está definido para <ph name="CURRENT_DATE" />. Essa data está correta? Se não estiver, corrija o relógio do sistema e depois atualize esta página.}other{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele expirou há # dias. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor. O relógio do seu computador está definido para <ph name="CURRENT_DATE" />. Essa data está correta? Se não estiver, corrija o relógio do sistema e depois atualize esta página.}}</translation> <translation id="1676269943528358898">O site <ph name="SITE" /> geralmente usa criptografia para proteger suas informações. Quando o Google Chrome tentou se conectar a <ph name="SITE" /> dessa vez, o website retornou credenciais incomuns e incorretas. Isso pode acontecer quando um invasor está fingindo ser <ph name="SITE" /> ou quando uma tela de login por Wi-Fi interrompeu a conexão. Suas informações ainda estão protegidas, porque o Google Chrome interrompeu a conexão antes que os dados fossem trocados.</translation> <translation id="168841957122794586">O certificado do servidor contém uma chave de criptografia fraca.</translation> <translation id="1706954506755087368">{1,plural, =1{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele está com a data de amanhã. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.}one{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele está com uma data de # dias depois de hoje. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.}other{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele está com uma data de # dias depois de hoje. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.}}</translation> <translation id="1710259589646384581">SO</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Tente entrar em contato com o administrador do sistema.</translation> <translation id="17513872634828108">Guias abertas</translation> <translation id="1753706481035618306">Numero da página</translation> <translation id="1763864636252898013">Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança não é confiável para o sistema operacional do seu dispositivo. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">O proxy está configurado em configuração automática.</translation> <translation id="2025623846716345241">Confirmar atualização</translation> <translation id="2030481566774242610">Você quis dizer <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Verificar o proxy e o firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">CEP</translation> <translation id="2065985942032347596">Autenticação obrigatória</translation> <translation id="2079545284768500474">Desfazer</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Política não encontrada</translation> <translation id="2213606439339815911">Buscando entradas...</translation> <translation id="2214283295778284209"><ph name="SITE" /> não está disponível</translation> +<translation id="2227695659599072496">Verificar o cabo de rede ou roteador</translation> +<translation id="2230458221926704099">Corrija sua conexão usando o <ph name="BEGIN_LINK" />app de diagnóstico<ph name="END_LINK" /></translation> <translation id="225207911366869382">Este valor está obsoleto para esta política.</translation> <translation id="2262243747453050782">Erro HTTP</translation> <translation id="2279770628980885996">Ocorreu uma condição inesperada enquanto o servidor tentava completar a solicitação.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Analisador JSON</translation> <translation id="2495093607237746763">Se esta opção for selecionada, o Chromium armazenará uma cópia do seu cartão neste dispositivo para preencher de formulários mais rapidamente.</translation> <translation id="2498091847651709837">Digitalizar novo cartão</translation> +<translation id="2515629240566999685">Verificar o sinal na sua área</translation> <translation id="2516305470678292029">IUs alternativas</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> enviou uma resposta inválida.</translation> <translation id="2552545117464357659">Recente</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Adicionar esta página aos favoritos</translation> <translation id="3270847123878663523">&Desfazer reordenar</translation> <translation id="3286538390144397061">Reiniciar agora</translation> +<translation id="3288003805934695103">Atualizar a página</translation> <translation id="3305707030755673451">Seus dados foram criptografados com sua senha longa de sincronização no dia <ph name="TIME" />. Informe-a para começar a sincronização.</translation> <translation id="333371639341676808">Impedir que esta página crie caixas de diálogo adicionais.</translation> <translation id="3340978935015468852">configurações</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Carregando...</translation> <translation id="3712624925041724820">Licenças esgotadas</translation> +<translation id="3714780639079136834">Ativar os dados da rede celular ou o Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Verificar a configuração de DNS, proxy e firewall<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Link que você copiou</translation> <translation id="3744899669254331632">Você não pode visitar <ph name="SITE" /> agora porque o website enviou credenciais embaralhadas que o Chromium não consegue processar. Erros de rede e ataques são geralmente temporários, de modo que esta página provavelmente funcionará mais tarde.</translation> <translation id="3748412725338508953">Houve muitos redirecionamentos.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Modo leitor</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> está bloqueado</translation> <translation id="4021036232240155012">O DNS é o serviço de rede que converte o nome de um website para o próprio endereço de Internet.</translation> +<translation id="4021376465026729077">Desativar as extensões</translation> <translation id="4030383055268325496">&Desfazer adicionar</translation> <translation id="4032534284272647190">O acesso a <ph name="URL" /> foi negado.</translation> <translation id="404928562651467259">AVISO</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Assinatura de verificação inválida</translation> <translation id="4176463684765177261">Desativado</translation> <translation id="4196861286325780578">&Refazer mover</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Verificar as configurações do antivírus e firewall<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Falhas</translation> <translation id="4250680216510889253">Não</translation> <translation id="4258748452823770588">Assinatura inválida</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">O uso de um proxy está desativado, mas uma configuração explícita de proxy é especificada.</translation> <translation id="4492190037599258964">Resultados de pesquisa para "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Erro de validação: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Entrar em contato com o administrador do sistema</translation> <translation id="450710068430902550">Compartilhar com o administrador</translation> <translation id="4522570452068850558">Detalhes</translation> <translation id="4535734014498033861">Falha na conexão do servidor proxy.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">Sobre o Google Tradutor</translation> <translation id="5040262127954254034">Privacidade</translation> <translation id="5045550434625856497">Senha incorreta</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Verificar o endereço do proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">O certificado do servidor não é válido no momento.</translation> <translation id="5089810972385038852">Estado</translation> <translation id="5094747076828555589">Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança não é confiável para o Chromium. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Confirmar navegação</translation> <translation id="5299298092464848405">Política de análise de erros</translation> <translation id="5300589172476337783">Mostrar</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Limpar os cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">O relatório de erros está desativado.</translation> <translation id="5317780077021120954">Salvar</translation> <translation id="5327248766486351172">Nome</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Recarregar</translation> <translation id="5565735124758917034">Ativo</translation> <translation id="560412284261940334">Gerenciamento não suportado</translation> +<translation id="5610142619324316209">Verificar a conexão</translation> <translation id="5617949217645503996">Redirecionamento em excesso por <ph name="HOST_NAME" /></translation> <translation id="5629630648637658800">Falha ao carregar as configurações da política</translation> <translation id="5631439013527180824">Token de gerenciamento de dispositivo inválido</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Seu cartão foi verificado</translation> <translation id="6146055958333702838">Verifique todos os cabos e reinicie todos os roteadores, modens ou outros dispositivos de rede que você estiver usando.</translation> +<translation id="614940544461990577">Tente:</translation> <translation id="6151417162996330722">O certificado do servidor tem um período de validade excessivamente longo.</translation> <translation id="6154808779448689242">O token da política retornado não corresponde ao token atual</translation> <translation id="6165508094623778733">Saiba mais</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685">Pesquisa do <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Não é possível acessar <ph name="SITE" /> no momento, porque <ph name="BEGIN_LINK" />este certificado foi revogado<ph name="END_LINK" />. Ataques e erros de rede geralmente são temporários. Portanto, essa página provavelmente funcionará mais tarde.</translation> <translation id="6637478299472506933">Falha no download</translation> +<translation id="6642894344118208103">Redefinir o modem ou roteador</translation> <translation id="6644283850729428850">Esta política foi encerrada.</translation> <translation id="6646897916597483132">Digite o CVC de quatro dígitos que aparece na parte frontal do seu cartão</translation> <translation id="6656103420185847513">Editar pasta</translation> <translation id="6660210980321319655">Denunciada automaticamente às <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Remover sugestão de formulário do Chromium?</translation> +<translation id="6685834062052613830">Saia e conclua a configuração</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6711464428925977395">Há algo errado com o servidor proxy, ou o endereço está incorreto.</translation> <translation id="674375294223700098">Erro, certificado de servidor desconhecido.</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">O gateway ou o servidor proxy recebeu uma resposta inválida de um servidor upstream.</translation> <translation id="7087282848513945231">Condado</translation> <translation id="7088615885725309056">Mais antigo</translation> +<translation id="7090678807593890770">Pesquise <ph name="LINK" /> no Google</translation> <translation id="7108649287766967076">Falha na tradução para <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">Emirado</translation> <translation id="7179921470347911571">Reiniciar agora</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">Nenhum entrada de histórico encontrada.</translation> <translation id="8088680233425245692">Falha ao exibir artigo.</translation> <translation id="8091372947890762290">A ativação está pendente no servidor</translation> +<translation id="8134994873729925007">Não foi possível encontrar o <ph name="BEGIN_ABBR" />endereço DNS<ph name="END_ABBR" /> do servidor de <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Seu computador entrou em modo de suspensão.</translation> <translation id="8150722005171944719">O arquivo em <ph name="URL" /> não está legível. Ele pode ter sido removido ou movido, ou as permissões do arquivo podem estar impedindo o acesso.</translation> <translation id="8194797478851900357">&Desfazer mover</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">Tem certeza de que deseja atualizar esta página?</translation> <translation id="8332188693563227489">O acesso a <ph name="HOST_NAME" /> foi negado</translation> <translation id="8349305172487531364">Barra de favoritos</translation> +<translation id="8363502534493474904">Desativar modo avião</translation> <translation id="8364627913115013041">Não definida.</translation> <translation id="8412145213513410671">Falhas (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Você deve inserir a mesma senha duas vezes.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">Sinalizações aplicáveis a todo o sistema podem ser definidas apenas pelo proprietário: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">O servidor recusou a conexão.</translation> <translation id="9020542370529661692">Esta página foi traduzida para <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Usar um serviço de previsão para carregar páginas mais rapidamente</translation> <translation id="9039213469156557790">Além disso, esta página inclui outros recursos que não são seguros. Esses recursos podem ser visualizados por outros usuários enquanto eles navegam e podem ser modificados por um invasor para alterar o comportamento da página.</translation> <translation id="9049981332609050619">Você tentou acessar <ph name="DOMAIN" />, mas o servidor apresentou um certificado inválido.</translation> <translation id="9050666287014529139">Senha</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index aea0e28..18f656b 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Este servidor não conseguiu provar que é o domínio <ph name="DOMAIN" />; o sistema operativo do seu computador não confia no respetivo certificado de segurança. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.</translation> <translation id="1152921474424827756">Aceda a uma <ph name="BEGIN_LINK" />cópia em cache<ph name="END_LINK" /> de <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> fechou a ligação inesperadamente.</translation> +<translation id="1161325031994447685">Ligar novamente à rede Wi-Fi</translation> <translation id="1175364870820465910">Im&primir...</translation> <translation id="1181037720776840403">Remover</translation> <translation id="1195447618553298278">Erro desconhecido.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Políticas do utilizador</translation> <translation id="1644184664548287040">A configuração de rede é inválida e não pode ser importada.</translation> <translation id="1644574205037202324">Histórico</translation> +<translation id="1645368109819982629">Protocolo não suportado</translation> <translation id="1655462015569774233">{1,plural, =1{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; o seu certificado de segurança expirou ontem. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação. O relógio do seu computador está atualmente configurado para <ph name="CURRENT_DATE" />. Será que isso está correto? Em caso negativo, deve corrigir o relógio do seu sistema e depois atualizar esta página.}other{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; o seu certificado de segurança expirou há # dias. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação. O relógio do seu computador está atualmente configurado para <ph name="CURRENT_DATE" />. Será que isso está correto? Em caso negativo, deve corrigir o relógio do seu sistema e depois atualizar esta página.}}</translation> <translation id="1676269943528358898">Normalmente, o site <ph name="SITE" /> utiliza a encriptação para proteger as suas informações. Quando o Google Chrome tentou estabelecer ligação a <ph name="SITE" /> desta vez, o Website devolveu credenciais invulgares e incorretas. Isto pode acontecer quando um utilizador mal intencionado tenta simular ser <ph name="SITE" /> ou quando um ecrã de início de sessão Wi-Fi interrompe a ligação. As suas informações continuam seguras porque o Google Chrome interrompeu a ligação antes de qualquer troca de dados.</translation> <translation id="168841957122794586">O certificado do servidor contém uma chave criptográfica fraca.</translation> <translation id="1706954506755087368">{1,plural, =1{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; o seu certificado de segurança é supostamente de amanhã. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.}other{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; a data do seu certificado de segurança é supostamente daqui a # dias. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.}}</translation> <translation id="1710259589646384581">SO</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Experimente contactar o administrador do sistema.</translation> <translation id="17513872634828108">Separadores abertos</translation> <translation id="1753706481035618306">Número de página</translation> <translation id="1763864636252898013">Este servidor não conseguiu provar que é o domínio <ph name="DOMAIN" />; o sistema operativo do seu dispositivo não confia no respetivo certificado de segurança. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">O proxy está definido para configuração automática.</translation> <translation id="2025623846716345241">Confirmar Atualização</translation> <translation id="2030481566774242610">Será que quis dizer <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Verificar o proxy e a firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Código postal</translation> <translation id="2065985942032347596">Autenticação necessária</translation> <translation id="2079545284768500474">Anular</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Política não encontrada</translation> <translation id="2213606439339815911">A obter entradas...</translation> <translation id="2214283295778284209"><ph name="SITE" /> não está disponível</translation> +<translation id="2227695659599072496">Verificar o cabo de rede ou o router</translation> +<translation id="2230458221926704099">Utilize a <ph name="BEGIN_LINK" />aplicação de diagnóstico<ph name="END_LINK" /> para corrigir a ligação</translation> <translation id="225207911366869382">Este valor está desatualizado para esta política.</translation> <translation id="2262243747453050782">Erro HTTP</translation> <translation id="2279770628980885996">Foi encontrada uma condição inesperada quando o servidor tentava satisfazer o pedido.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Analisador JSON</translation> <translation id="2495093607237746763">Se marcada, o Chromium armazena uma cópia do seu cartão neste dispositivo para preencher formulários mais rapidamente.</translation> <translation id="2498091847651709837">Digitalizar novo cartão</translation> +<translation id="2515629240566999685">Verificar o sinal na área</translation> <translation id="2516305470678292029">Alternativas da interface</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> enviou uma resposta inválida.</translation> <translation id="2552545117464357659">Mais recente</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Marcar esta página</translation> <translation id="3270847123878663523">&Anular reordenação</translation> <translation id="3286538390144397061">Reiniciar agora</translation> +<translation id="3288003805934695103">Atualizar a página</translation> <translation id="3305707030755673451">Os dados foram encriptados com a sua frase de acesso de sincronização em <ph name="TIME" />. Introduza-a para iniciar a sincronização.</translation> <translation id="333371639341676808">Evitar que esta página crie caixas de diálogo adicionais.</translation> <translation id="3340978935015468852">definições</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">A carregar...</translation> <translation id="3712624925041724820">Licenças esgotadas</translation> +<translation id="3714780639079136834">Ativar os dados móveis ou o Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Verificar a configuração do proxy, da firewall e de DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Link copiado por si</translation> <translation id="3744899669254331632">Não pode visitar <ph name="SITE" /> neste momento, porque o Website enviou credenciais baralhadas que o Chromium não consegue processar. Os erros de rede e os ataques são geralmente temporários, pelo que esta página deverá funcionar mais tarde.</translation> <translation id="3748412725338508953">Houve demasiados redireccionamentos.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Modo de leitor</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> está bloqueado</translation> <translation id="4021036232240155012">O DNS é o serviço de rede que converte o nome de um Website no respetivo endereço de Internet.</translation> +<translation id="4021376465026729077">Desativar as extensões</translation> <translation id="4030383055268325496">&Anular adição</translation> <translation id="4032534284272647190">O acesso a <ph name="URL" /> foi negado.</translation> <translation id="404928562651467259">AVISO</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Assinatura de verificação incorreta</translation> <translation id="4176463684765177261">Desativado</translation> <translation id="4196861286325780578">&Refazer movimentação</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Verificar as configurações da firewall e de antivírus<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Erros</translation> <translation id="4250680216510889253">Não</translation> <translation id="4258748452823770588">Assinatura incorreta</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">A utilização de um proxy está desativada, mas existe uma configuração de proxy explícita especificada.</translation> <translation id="4492190037599258964">Resultados da pesquisa para "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Erro de validação: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Contactar o administrador do sistema</translation> <translation id="450710068430902550">Partilha com o administrador</translation> <translation id="4522570452068850558">Detalhes</translation> <translation id="4535734014498033861">A ligação ao servidor proxy falhou.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">Acerca do Google Tradutor</translation> <translation id="5040262127954254034">Privacidade</translation> <translation id="5045550434625856497">Palavra-passe incorreta</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Verificar o endereço proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">De momento, o certificado do servidor não é válido.</translation> <translation id="5089810972385038852">Estado</translation> <translation id="5094747076828555589">Este servidor não conseguiu provar que é o domínio <ph name="DOMAIN" />; o Chromium não confia no respetivo certificado de segurança. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Confirmar navegação</translation> <translation id="5299298092464848405">Erro ao analisar a política</translation> <translation id="5300589172476337783">Mostrar</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Limpar os cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">O relatório de falha está desativado.</translation> <translation id="5317780077021120954">Guardar</translation> <translation id="5327248766486351172">Nome</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Recarregar</translation> <translation id="5565735124758917034">Ativo</translation> <translation id="560412284261940334">Gestão não suportada</translation> +<translation id="5610142619324316209">Verificar a ligação</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> redirecionou-o demasiadas vezes.</translation> <translation id="5629630648637658800">Falha ao carregar as definições da política</translation> <translation id="5631439013527180824">Token de gestão do dispositivo inválido</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Cartão validado</translation> <translation id="6146055958333702838">Verifique os cabos e reinicie todos os routers, modems ou outros dispositivos de rede que possa estar a utilizar.</translation> +<translation id="614940544461990577">Experimente:</translation> <translation id="6151417162996330722">O certificado do servidor tem um período de validade demasiado longo.</translation> <translation id="6154808779448689242">O token da política devolvido não corresponde ao token atual</translation> <translation id="6165508094623778733">Saiba mais</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Pesquisar</translation> <translation id="6634865548447745291">De momento, não é possível visitar <ph name="SITE" /> porque <ph name="BEGIN_LINK" />este certificado foi revogado<ph name="END_LINK" />. Os erros de rede e os ataques normalmente são temporários, por isso, esta página voltará provavelmente a funcionar.</translation> <translation id="6637478299472506933">A Transferência Falhou</translation> +<translation id="6642894344118208103">Repor o modem ou o router</translation> <translation id="6644283850729428850">Esta política está obsoleta.</translation> <translation id="6646897916597483132">Introduza o Código de Segurança/CVC de quatro dígitos que se encontra na parte da frente do cartão</translation> <translation id="6656103420185847513">Editar Pasta</translation> <translation id="6660210980321319655">Relatório enviado automaticamente em: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Pretende remover a sugestão do formulário do Chromium?</translation> +<translation id="6685834062052613830">Termine sessão e conclua a configuração</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6711464428925977395">Existe um problema com o servidor proxy ou o endereço está incorreto.</translation> <translation id="674375294223700098">Erro de certificado de servidor desconhecido.</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">O gateway ou o servidor proxy recebeu uma resposta inválida de um servidor a jusante.</translation> <translation id="7087282848513945231">Condado</translation> <translation id="7088615885725309056">Mais antigo</translation> +<translation id="7090678807593890770">Pesquisar <ph name="LINK" /> no Google</translation> <translation id="7108649287766967076">A tradução para <ph name="TARGET_LANGUAGE" /> falhou.</translation> <translation id="7139724024395191329">Emirado</translation> <translation id="7179921470347911571">Reiniciar agora</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">Não foram encontradas entradas no histórico.</translation> <translation id="8088680233425245692">Falha ao ver o artigo.</translation> <translation id="8091372947890762290">Ativação pendente no servidor</translation> +<translation id="8134994873729925007">Não foi possível encontrar o <ph name="BEGIN_ABBR" />endereço DNS<ph name="END_ABBR" /> do servidor de <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">O computador entrou em suspensão.</translation> <translation id="8150722005171944719">O ficheiro em <ph name="URL" /> não é legível. Pode ter sido removido, movido ou as permissões do ficheiro podem estar a impedir o acesso.</translation> <translation id="8194797478851900357">&Anular movimentação</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">Tem a certeza de que pretende atualizar esta página?</translation> <translation id="8332188693563227489">O acesso a <ph name="HOST_NAME" /> foi recusado</translation> <translation id="8349305172487531364">Barra de marcadores</translation> +<translation id="8363502534493474904">Desativar o modo de avião</translation> <translation id="8364627913115013041">Não definida.</translation> <translation id="8412145213513410671">Falhas (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Tem de introduzir a mesma frase de acesso duas vezes.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">Os sinalizadores que se aplicam a todo o sistema apenas podem ser definidos pelo proprietário: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">O servidor recusou a ligação.</translation> <translation id="9020542370529661692">Esta página foi traduzida para <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Utilizar um serviço de previsão para carregar páginas mais rapidamente</translation> <translation id="9039213469156557790">Além disso, esta página inclui outros recursos que não são seguros. Estes recursos podem ser vistos por outros utilizadores em trânsito e modificados por um utilizador mal intencionado com o intuito de alterar o comportamento da página.</translation> <translation id="9049981332609050619">Tentou aceder a <ph name="DOMAIN" />, mas o servidor apresentou um certificado inválido.</translation> <translation id="9050666287014529139">Frase de acesso</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 7785476..687aa6ea 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Acest server nu a putut dovedi că este <ph name="DOMAIN" />; sistemul de operare al computerului nu consideră că certificatul său de securitate este de încredere. Cauza poate fi o configurare greșită sau interceptarea conexiunii de către un atacator.</translation> <translation id="1152921474424827756">Accesați o <ph name="BEGIN_LINK" />copie păstrată în memoria cache<ph name="END_LINK" /> a site-ului <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> a închis conexiunea în mod neașteptat.</translation> +<translation id="1161325031994447685">să te reconectezi la Wi-Fi</translation> <translation id="1175364870820465910">&Printează...</translation> <translation id="1181037720776840403">Elimină</translation> <translation id="1195447618553298278">Eroare necunoscută.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Politici privind utilizatorii</translation> <translation id="1644184664548287040">Configurația rețelei este nevalidă și nu a putut fi importată.</translation> <translation id="1644574205037202324">Istoric</translation> +<translation id="1645368109819982629">Protocol neacceptat</translation> <translation id="1655462015569774233">{1,plural, =1{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Certificatul său de securitate a expirat ieri. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}few{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Certificatul său de securitate a expirat acum # zile. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}other{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Certificatul său de securitate a expirat acum # de zile. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}}</translation> <translation id="1676269943528358898">Site-ul <ph name="SITE" /> folosește în mod obișnuit criptarea pentru a-ți proteja informațiile. Când Google Chrome a încercat să se conecteze la <ph name="SITE" /> de această dată, site-ul a returnat date de conectare neobișnuite și incorecte. Acest lucru s-a întâmplat fie pentru că un atacator încearcă să falsifice site-ul <ph name="SITE" />, fie pentru că un ecran de conectare Wi-Fi a întrerupt conexiunea. Securitatea informațiilor tale nu a fost afectată, deoarece Google Chrome a oprit conexiunea înainte ca datele să fie transferate.</translation> <translation id="168841957122794586">Certificatul de server conține o cheie criptografică slabă.</translation> <translation id="1706954506755087368">{1,plural, =1{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Data de emitere a certificatului său de securitate este mâine. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator.}few{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Data de emitere a certificatului său de securitate este în viitor, peste # zile. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator.}other{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Data de emitere a certificatului său de securitate este în viitor, peste # de zile. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator.}}</translation> <translation id="1710259589646384581">Sistem de operare</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Încearcă să contactezi administratorul sistemului.</translation> <translation id="17513872634828108">File deschise</translation> <translation id="1753706481035618306">Numărul paginii</translation> <translation id="1763864636252898013">Acest server nu a putut dovedi că este <ph name="DOMAIN" />; sistemul de operare al dispozitivului nu consideră că certificatul său de securitate este de încredere. Cauza poate fi o configurare greșită sau interceptarea conexiunii de către un atacator.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxy-ul este setat la Configurat automat.</translation> <translation id="2025623846716345241">Confirmați reîncărcarea</translation> <translation id="2030481566774242610">Ați dorit să scrieți <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />să verifici proxy-ul și firewallul;<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Cod zip</translation> <translation id="2065985942032347596">Autentificare obligatorie</translation> <translation id="2079545284768500474">Anulează</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Politica nu a fost găsită</translation> <translation id="2213606439339815911">Se preiau intrările...</translation> <translation id="2214283295778284209"><ph name="SITE" /> nu este disponibil</translation> +<translation id="2227695659599072496">să verifici cablul de rețea și routerul;</translation> +<translation id="2230458221926704099">Remediază conexiunea folosind <ph name="BEGIN_LINK" />aplicația de diagnosticare<ph name="END_LINK" /></translation> <translation id="225207911366869382">Valoarea este învechită pentru această politică.</translation> <translation id="2262243747453050782">Eroare HTTP</translation> <translation id="2279770628980885996">Când serverul a încercat să îndeplinească solicitarea, a apărut o situație neașteptată.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Analizor JSON</translation> <translation id="2495093607237746763">Dacă opțiunea este bifată, Chromium va stoca o copie a cardului pe dispozitiv pentru a completa formularul mai rapid.</translation> <translation id="2498091847651709837">Scanează un card nou</translation> +<translation id="2515629240566999685">să verifici semnalul din zona ta;</translation> <translation id="2516305470678292029">Interfețe de utilizare alternative</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> a trimis un răspuns nevalid.</translation> <translation id="2552545117464357659">Mai noi</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">Marcați această pagină</translation> <translation id="3270847123878663523">&Anulați reordonarea</translation> <translation id="3286538390144397061">Repornește acum</translation> +<translation id="3288003805934695103">să reîncarci pagina;</translation> +<translation id="3305707030755673451">Datele au fost criptate cu expresia de acces pentru sincronizare la <ph name="TIME" />. Introdu-o pentru a începe sincronizarea.</translation> <translation id="333371639341676808">Împiedică această pagină să creeze alte casete de dialog.</translation> <translation id="3340978935015468852">setări</translation> <translation id="3355823806454867987">Modifica setările proxy...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Se încarcă…</translation> <translation id="3712624925041724820">Licențe epuizate</translation> +<translation id="3714780639079136834">să activezi datele mobile sau conexiunea Wi-Fi;</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />să verifici configurarea pentru proxy, firewall și DNS;<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Linkul copiat de tine</translation> <translation id="3744899669254331632">Nu poți accesa acum <ph name="SITE" />, deoarece site-ul a trimis date de conectare într-un format necunoscut pe care Chromium nu le poate procesa. Erorile de rețea și atacurile sunt de obicei temporare și probabil că această pagină va funcționa mai târziu.</translation> <translation id="3748412725338508953">Au fost prea multe redirecționări.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">Modul Cititor</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> este blocat</translation> <translation id="4021036232240155012">DNS este serviciul de rețea care translatează numele unui site în adresa sa de internet.</translation> +<translation id="4021376465026729077">să dezactivezi extensiile;</translation> <translation id="4030383055268325496">&Anulați adăugarea</translation> <translation id="4032534284272647190">Accesul la <ph name="URL" /> nu este permis.</translation> <translation id="404928562651467259">AVERTISMENT</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">Semnătură de verificare nevalidă</translation> <translation id="4176463684765177261">Dezactivat</translation> <translation id="4196861286325780578">&Repetați mutarea</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />să verifici configurarea pentru firewall și antivirus;<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Blocări</translation> <translation id="4250680216510889253">Nu</translation> <translation id="4258748452823770588">Semnătură greșită</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">Utilizarea unui proxy este dezactivată, dar o configurare proxy este specificată în mod explicit.</translation> <translation id="4492190037599258964">Rezultatele căutării pentru „<ph name="SEARCH_STRING" />”</translation> <translation id="4506176782989081258">Eroare de validare: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">să contactezi administratorul sistemului;</translation> <translation id="450710068430902550">Permiterea accesului pentru administrator</translation> <translation id="4522570452068850558">Detalii</translation> <translation id="4535734014498033861">Conexiunea la serverul proxy nu a reușit.</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">Despre Google Traducere</translation> <translation id="5040262127954254034">Confidențialitate</translation> <translation id="5045550434625856497">Parolă incorectă</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />să verifici adresa proxy-ului;<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Momentan, certificatul serverului este nevalid.</translation> <translation id="5089810972385038852">Stat</translation> <translation id="5094747076828555589">Acest server nu a putut dovedi că este <ph name="DOMAIN" />; Chromium nu consideră că certificatul său de securitate este de încredere. Cauza poate fi o configurare greșită sau interceptarea conexiunii de către un atacator.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">Confirmă navigarea</translation> <translation id="5299298092464848405">Eroare la analizarea politicii</translation> <translation id="5300589172476337783">Afișează</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />să ștergi cookie-urile;<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Raportarea blocărilor este dezactivată.</translation> <translation id="5317780077021120954">Salvează</translation> <translation id="5327248766486351172">Nume</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">Reîncarcă</translation> <translation id="5565735124758917034">Activ</translation> <translation id="560412284261940334">Gestionarea nu este acceptată</translation> +<translation id="5610142619324316209">să verifici conexiunea;</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> te-a redirecționat de prea multe ori.</translation> <translation id="5629630648637658800">Setările pentru politică nu au putut fi încărcate</translation> <translation id="5631439013527180824">Indicativ nevalid pentru gestionarea gadgetului</translation> @@ -434,6 +451,7 @@ <translation id="6093795393556121384">Cardul este confirmat</translation> <translation id="6146055958333702838">Verifică toate cablurile și repornește routerele, modemurile sau alte dispozitive de rețea pe care le folosești.</translation> +<translation id="614940544461990577">Încearcă:</translation> <translation id="6151417162996330722">Certificatul de server are o perioadă de validitate prea lungă.</translation> <translation id="6154808779448689242">Indicativul returnat pentru politică nu corespunde cu indicativul actual</translation> <translation id="6165508094623778733">Află mai multe</translation> @@ -475,11 +493,13 @@ <translation id="6628463337424475685">Căutare <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Nu puteți accesa acum site-ul <ph name="SITE" />, deoarece <ph name="BEGIN_LINK" />acest certificat a fost revocat<ph name="END_LINK" />. Erorile de rețea și atacurile sunt de obicei temporare și probabil că această pagină va funcționa mai târziu.</translation> <translation id="6637478299472506933">Descărc. nu a reușit</translation> +<translation id="6642894344118208103">să resetezi modemul sau routerul;</translation> <translation id="6644283850729428850">Această politică este învechită.</translation> <translation id="6646897916597483132">Introdu codul CVC alcătuit din 4 cifre înscris pe fața a cardului</translation> <translation id="6656103420185847513">Modificați dosarul</translation> <translation id="6660210980321319655">Raportată automat <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Elimini sugestia pentru formular din Chromium?</translation> +<translation id="6685834062052613830">Deconectează-te și finalizează configurarea</translation> <translation id="6710213216561001401">Înapoi</translation> <translation id="6711464428925977395">A apărut o problemă la serverul proxy sau adresa nu este corectă.</translation> <translation id="674375294223700098">Eroare de certificat de server necunoscută.</translation> @@ -513,6 +533,7 @@ <translation id="7052500709156631672">Serverul gateway sau proxy a primit un răspuns nevalid de la un server ierarhic superior.</translation> <translation id="7087282848513945231">Comitat</translation> <translation id="7088615885725309056">Mai vechi</translation> +<translation id="7090678807593890770">Caută <ph name="LINK" /> pe Google</translation> <translation id="7108649287766967076">Traducerea în <ph name="TARGET_LANGUAGE" /> nu a reușit.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Relansează acum</translation> @@ -605,6 +626,7 @@ <translation id="8034955203865359138">Nu au fost găsite intrări în istoric.</translation> <translation id="8088680233425245692">Articolul nu a fost vizualizat.</translation> <translation id="8091372947890762290">Se așteaptă activarea pe server</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />Adresa DNS<ph name="END_ABBR" /> pentru serverul <ph name="HOST_NAME" /> nu a putut fi găsită.</translation> <translation id="8149426793427495338">Computerul este inactiv.</translation> <translation id="8150722005171944719">Fișierul de la <ph name="URL" /> nu poate fi citit. Este posibil să fi fost eliminat ori mutat sau ca permisiunile pentru fișiere să împiedice accesarea acestuia.</translation> <translation id="8194797478851900357">&Anulați mutarea</translation> @@ -632,6 +654,7 @@ <translation id="8311778656528046050">Sigur doriți să reîncărcați această pagină?</translation> <translation id="8332188693563227489">Accesul la <ph name="HOST_NAME" /> nu este permis</translation> <translation id="8349305172487531364">Bara de marcaje</translation> +<translation id="8363502534493474904">să dezactivezi modul Avion.</translation> <translation id="8364627913115013041">Nesetată.</translation> <translation id="8412145213513410671">Blocări (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Trebuie să introduci aceeași expresie de acces de două ori.</translation> @@ -689,6 +712,7 @@ <translation id="901974403500617787">Marcajele care se aplică la nivel de sistem pot fi create numai de proprietar: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Serverul a refuzat conexiunea.</translation> <translation id="9020542370529661692">Această pagină a fost tradusă în <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Folosește un serviciu de predicții pentru a încărca paginile mai rapid</translation> <translation id="9039213469156557790">În plus, această pagină include alte resurse care nu sunt securizate. Aceste resurse sunt vizibile pentru alți utilizatori în cursul transferului și pot fi modificate de un atacator pentru a schimba comportamentul paginii.</translation> <translation id="9049981332609050619">Ai încercat să accesezi <ph name="DOMAIN" />, dar serverul a prezentat un certificat nevalid.</translation> <translation id="9050666287014529139">Expresie de acces</translation> @@ -702,6 +726,7 @@ <translation id="9170848237812810038">&Anulează</translation> <translation id="917450738466192189">Certificatul serverului nu este valid.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> folosește un protocol neacceptat.</translation> +<translation id="9205078245616868884">Datele sunt criptate cu expresia de acces pentru sincronizare. Introdu-o pentru a începe sincronizarea.</translation> <translation id="9207861905230894330">Articolul nu a fost adăugat.</translation> <translation id="933612690413056017">Nu există conexiune la internet</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index dec21f57..36f43f1 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Операционная система компьютера не доверяет его сертификату безопасности. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.</translation> <translation id="1152921474424827756">Открыть <ph name="BEGIN_LINK" />кешированную версию<ph name="END_LINK" /> страницы <ph name="URL" /></translation> <translation id="1158211211994409885">Сайт <ph name="HOST_NAME" /> неожиданно разорвал соединение.</translation> +<translation id="1161325031994447685">Подключитесь к сети Wi-Fi ещё раз.</translation> <translation id="1175364870820465910">&Печать...</translation> <translation id="1181037720776840403">Удалить</translation> <translation id="1195447618553298278">Неизвестная ошибка.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Пользовательские правила</translation> <translation id="1644184664548287040">Импорт невозможен: недопустимая конфигурация сети.</translation> <translation id="1644574205037202324">История</translation> +<translation id="1645368109819982629">Неподдерживаемый протокол</translation> <translation id="1655462015569774233">{1,plural, =1{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек вчера. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}one{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # день назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}few{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дня назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}many{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дней назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}other{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дня назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}}</translation> <translation id="1676269943528358898">На сайте <ph name="SITE" /> для защиты ваших данных обычно используется шифрование. Однако учетные данные, которые мы получили от сайта <ph name="SITE" /> сейчас, отличаются от тех, которые он отправляет обычно. Вероятно, вредоносный сайт пытается выдать себя за <ph name="SITE" />, либо страница подключения к сети Wi-Fi прервала соединение. Ваша информация по-прежнему в безопасности, так как браузер Google Chrome разорвал соединение до того, как произошел обмен данными.</translation> <translation id="168841957122794586">Сертификат сервера содержит ненадежный криптографический ключ.</translation> <translation id="1706954506755087368">{1,plural, =1{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу завтра. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}one{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу через # день. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}few{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу через # дня. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}many{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу через # дней. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}other{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу через # дня. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}}</translation> <translation id="1710259589646384581">ОС</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Обратитесь за помощью к системному администратору.</translation> <translation id="17513872634828108">Открытые вкладки</translation> <translation id="1753706481035618306">Номер страницы</translation> <translation id="1763864636252898013">Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Операционная система устройства не доверяет его сертификату безопасности. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Прокси-сервер настраивается автоматически.</translation> <translation id="2025623846716345241">Подтвердить обновление страницы</translation> <translation id="2030481566774242610">Возможно, вы имели в виду <ph name="LINK" />.</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Проверьте настройки прокси-сервера и брандмауэра<ph name="END_LINK" />.</translation> <translation id="2053553514270667976">Почтовый индекс</translation> <translation id="2065985942032347596">Необходима авторизация</translation> <translation id="2079545284768500474">Отмена</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Политика для устройства не найдена</translation> <translation id="2213606439339815911">Извлечение записей…</translation> <translation id="2214283295778284209"><ph name="SITE" /> недоступен</translation> +<translation id="2227695659599072496">Проверьте сетевой кабель или маршрутизатор.</translation> +<translation id="2230458221926704099">Чтобы устранить неполадки, проведите <ph name="BEGIN_LINK" />диагностику<ph name="END_LINK" /> подключения.</translation> <translation id="225207911366869382">Это значение для данного правила больше не используется.</translation> <translation id="2262243747453050782">Ошибка HTTP</translation> <translation id="2279770628980885996">При попытке сервера выполнить запрос возникла неожиданная ситуация.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Синтаксический анализатор JSON</translation> <translation id="2495093607237746763">Если флажок установлен, Chromium будет хранить на этом устройстве данные карты для быстрого заполнения форм.</translation> <translation id="2498091847651709837">Сканировать новую карту</translation> +<translation id="2515629240566999685">Проверьте уровень сигнала сети.</translation> <translation id="2516305470678292029">Варианты интерфейса</translation> <translation id="255002559098805027">Сайт <ph name="HOST_NAME" /> отправил недействительный ответ.</translation> <translation id="2552545117464357659">Позже</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">Добавить страницу в закладки</translation> <translation id="3270847123878663523">&Отменить изменение порядка</translation> <translation id="3286538390144397061">Перезапустить сейчас</translation> +<translation id="3288003805934695103">Обновите страницу.</translation> +<translation id="3305707030755673451">Данные были зашифрованы с помощью кодовой фразы <ph name="TIME" />. Введите ее, чтобы начать синхронизацию.</translation> <translation id="333371639341676808">Предотвратить создание дополнительных диалоговых окон на этой странице.</translation> <translation id="3340978935015468852">настройках</translation> <translation id="3355823806454867987">Изменить настройки прокси-сервера...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Загрузка...</translation> <translation id="3712624925041724820">Недостаточно лицензий</translation> +<translation id="3714780639079136834">Включите Wi-Fi или передачу данных по мобильной сети.</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Проверьте настройки прокси-сервера, брандмауэра и DNS<ph name="END_LINK" />.</translation> <translation id="3739623965217189342">Скопированная ссылка</translation> <translation id="3744899669254331632">Перейти на сайт <ph name="SITE" /> невозможно, так как его идентификационные данные зашифрованы, и Chrome не может их обработать. Это могло произойти из-за ошибки сети или атаки на сайт. Скорее всего, он заработает через некоторое время.</translation> <translation id="3748412725338508953">Обнаружено слишком много переадресаций.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">Режим чтения</translation> <translation id="3973234410852337861">Сайт <ph name="HOST_NAME" /> заблокирован</translation> <translation id="4021036232240155012">DNS – это сетевая служба, преобразующая название сайта в IP-адрес.</translation> +<translation id="4021376465026729077">Отключите расширения.</translation> <translation id="4030383055268325496">&Отменить добавление</translation> <translation id="4032534284272647190">Доступ к <ph name="URL" /> запрещен.</translation> <translation id="404928562651467259">Внимание!</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">Подтверждающая подпись недействительна</translation> <translation id="4176463684765177261">Отключено</translation> <translation id="4196861286325780578">&Повторить перемещение</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Проверьте настройки брандмауэра и антивирусного ПО<ph name="END_LINK" />.</translation> <translation id="4220128509585149162">Завершение работы программы</translation> <translation id="4250680216510889253">Нет</translation> <translation id="4258748452823770588">Подпись недействительна</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">Прокси-сервер отключен, но при этом его конфигурация задана явным образом.</translation> <translation id="4492190037599258964">Результаты поиска по запросу "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Ошибка проверки: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Обратитесь за помощью к системному администратору.</translation> <translation id="450710068430902550">Доступ администратора</translation> <translation id="4522570452068850558">Подробнее</translation> <translation id="4535734014498033861">Сбой при подключении к прокси-серверу</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">О Переводчике Google</translation> <translation id="5040262127954254034">Личные данные</translation> <translation id="5045550434625856497">Неправильный пароль</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Проверьте адрес прокси-сервера<ph name="END_LINK" />.</translation> <translation id="5087286274860437796">Сертификат сервера не действителен в настоящее время.</translation> <translation id="5089810972385038852">Штат</translation> <translation id="5094747076828555589">Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Chromium не доверяет его сертификату безопасности. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">Подтвердите переход</translation> <translation id="5299298092464848405">Не удалось выполнить анализ политики</translation> <translation id="5300589172476337783">Показать</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Удалите файлы cookie<ph name="END_LINK" />.</translation> <translation id="5308689395849655368">Отчеты о сбоях отключены.</translation> <translation id="5317780077021120954">Сохранить</translation> <translation id="5327248766486351172">Название</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">Перезагрузить</translation> <translation id="5565735124758917034">Активен</translation> <translation id="560412284261940334">Управление устройствами не поддерживается</translation> +<translation id="5610142619324316209">Проверьте подключение к Интернету.</translation> <translation id="5617949217645503996">Сайт <ph name="HOST_NAME" /> выполнил переадресацию слишком много раз.</translation> <translation id="5629630648637658800">Не удалось применить настройки политики</translation> <translation id="5631439013527180824">Токен устройства недействителен</translation> @@ -434,6 +451,7 @@ <translation id="6093795393556121384">Карта проверена</translation> <translation id="6146055958333702838">Проверьте соединение кабелей, перезагрузите маршрутизаторы, модемы и другие сетевые устройства.</translation> +<translation id="614940544461990577">Попробуйте сделать следующее:</translation> <translation id="6151417162996330722">Слишком долгий срок действия сертификата, предоставленного сервером.</translation> <translation id="6154808779448689242">Возвращенный токен не соответствует имеющемуся</translation> <translation id="6165508094623778733">Подробнее...</translation> @@ -475,11 +493,13 @@ <translation id="6628463337424475685">Поиск <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Перейти на сайт <ph name="SITE" /> невозможно, так как <ph name="BEGIN_LINK" />его сертификат отозван<ph name="END_LINK" />. Это могло произойти из-за ошибки сети или атаки на сайт. Скорее всего, он заработает через некоторое время.</translation> <translation id="6637478299472506933">Ошибка при скачивании</translation> +<translation id="6642894344118208103">Сбросьте настройки модема или маршрутизатора.</translation> <translation id="6644283850729428850">Правило устарело.</translation> <translation id="6646897916597483132">Введите четырехзначный CVC-код, указанный на лицевой стороне карты.</translation> <translation id="6656103420185847513">Редактировать папку</translation> <translation id="6660210980321319655">Отчет о сбое отправлен автоматически. Время возникновения сбоя: <ph name="CRASH_TIME" />.</translation> <translation id="6671697161687535275">Удалить подсказку из Chromium?</translation> +<translation id="6685834062052613830">Выйдите из аккаунта и завершите настройку</translation> <translation id="6710213216561001401">Назад</translation> <translation id="6711464428925977395">На прокси-сервере возникла проблема или адрес указан неверно.</translation> <translation id="674375294223700098">Неизвестная ошибка сертификата сервера.</translation> @@ -514,6 +534,7 @@ <translation id="7052500709156631672">Шлюз или прокси-сервер получил недопустимый ответ от вышестоящего сервера.</translation> <translation id="7087282848513945231">Графство</translation> <translation id="7088615885725309056">Раньше</translation> +<translation id="7090678807593890770">Выполните поиск по запросу <ph name="LINK" /> в Google</translation> <translation id="7108649287766967076">Не удалось выполнить перевод на <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">Эмират</translation> <translation id="7179921470347911571">Перезапустить</translation> @@ -606,6 +627,7 @@ <translation id="8034955203865359138">Элементы истории не найдены.</translation> <translation id="8088680233425245692">Не удалось показать статью</translation> <translation id="8091372947890762290">Активация управления устройствами не завершена</translation> +<translation id="8134994873729925007">Не удается найти <ph name="BEGIN_ABBR" />DNS-адрес<ph name="END_ABBR" /> сервера <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Ваш компьютер перешел в спящий режим.</translation> <translation id="8150722005171944719">Файл по адресу <ph name="URL" /> недоступен. Возможно, он был удален или перемещен либо права доступа к нему ограничены.</translation> <translation id="8194797478851900357">&Отменить перемещение</translation> @@ -632,6 +654,7 @@ <translation id="8311778656528046050">Действительно обновить эту страницу?</translation> <translation id="8332188693563227489">Доступ к <ph name="HOST_NAME" /> запрещен</translation> <translation id="8349305172487531364">Панель закладок</translation> +<translation id="8363502534493474904">Отключите режим полета.</translation> <translation id="8364627913115013041">Не задано</translation> <translation id="8412145213513410671">Сбои (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Необходимо дважды ввести одну и ту же кодовую фразу.</translation> @@ -689,6 +712,7 @@ <translation id="901974403500617787">Системные флаги может устанавливать только владелец (<ph name="OWNER_EMAIL" />).</translation> <translation id="9020142588544155172">Сервер отказал в подключении.</translation> <translation id="9020542370529661692">Эта страница переведена на <ph name="TARGET_LANGUAGE" />.</translation> +<translation id="9038649477754266430">Использовать подсказки для ускорения загрузки страниц</translation> <translation id="9039213469156557790">Обратите внимание, что на странице обнаружен небезопасный контент. Возможно, при передаче ресурсы просматриваются третьими лицами, а злоумышленники могут получить доступ к странице и изменить ее поведение.</translation> <translation id="9049981332609050619">Вы попытались открыть <ph name="DOMAIN" />, однако представленный сервером сертификат недействителен.</translation> <translation id="9050666287014529139">Кодовая фраза</translation> @@ -702,6 +726,7 @@ <translation id="9170848237812810038">&Отменить</translation> <translation id="917450738466192189">Сертификат сервера недействителен</translation> <translation id="9183425211371246419">На сайте <ph name="HOST_NAME" /> используется неподдерживаемый протокол.</translation> +<translation id="9205078245616868884">Данные зашифрованы с помощью кодовой фразы. Введите ее, чтобы начать синхронизацию.</translation> <translation id="9207861905230894330">Не удалось добавить статью</translation> <translation id="933612690413056017">Нет подключения к Интернету</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index f190021..724547b 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -23,6 +23,7 @@ <translation id="1150979032973867961">Server nedokáže overiť, či ide o doménu <ph name="DOMAIN" />, operačný systém vášho počítača nedôveruje jej bezpečnostnému certifikátu. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie zachytil útočník.</translation> <translation id="1152921474424827756">Prístup ku <ph name="BEGIN_LINK" />kópii vo vyrovnávacej pamäti<ph name="END_LINK" /> stránky <ph name="URL" /></translation> <translation id="1158211211994409885">Hostiteľský web <ph name="HOST_NAME" /> neočakávane ukončil pripojenie.</translation> +<translation id="1161325031994447685">Znovu sa pripojiť k sieti Wi-Fi</translation> <translation id="1175364870820465910">&Tlačiť...</translation> <translation id="1181037720776840403">Odstrániť</translation> <translation id="1195447618553298278">Neznáma chyba.</translation> @@ -64,12 +65,14 @@ <translation id="1640180200866533862">Pravidlá pre používateľa</translation> <translation id="1644184664548287040">Konfigurácia siete je neplatná a nepodarilo sa ju importovať.</translation> <translation id="1644574205037202324">História</translation> +<translation id="1645368109819982629">Nepodporovaný protokol</translation> <translation id="1655462015569774233">{1,plural, =1{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; platnosť jej bezpečnostného certifikátu vypršala včera. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom. Hodiny vášho počítača sú momentálne nastavené na <ph name="CURRENT_DATE" />. Je tento čas správny? Ak nie, opravte čas na hodinách systému a potom obnovte túto stránku.}few{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; platnosť jej bezpečnostného certifikátu vypršala pred # dňami. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom. Hodiny vášho počítača sú momentálne nastavené na <ph name="CURRENT_DATE" />. Je tento čas správny? Ak nie, opravte čas na hodinách systému a potom obnovte túto stránku.}many{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; platnosť jej bezpečnostného certifikátu vypršala pred # dňom. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom. Hodiny vášho počítača sú momentálne nastavené na <ph name="CURRENT_DATE" />. Je tento čas správny? Ak nie, opravte čas na hodinách systému a potom obnovte túto stránku.}other{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; platnosť jej bezpečnostného certifikátu vypršala pred # dňami. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom. Hodiny vášho počítača sú momentálne nastavené na <ph name="CURRENT_DATE" />. Je tento čas správny? Ak nie, opravte čas na hodinách systému a potom obnovte túto stránku.}}</translation> <translation id="1676269943528358898">Web <ph name="SITE" /> zvyčajne chráni vaše informácie pomocou šifrovania. Keď sa Chrome tentokrát pokúsil pripojiť k webu <ph name="SITE" />, odoslal späť nezvyčajné a nesprávne poverenia. Môže sa to stať vtedy, keď sa za web <ph name="SITE" /> snaží vydávať útočník alebo keď pripojenie preruší prihlasovacia obrazovka siete Wi-Fi. Vaše informácie sú stále zabezpečené, pretože Chrome zastavil pripojenie ešte pred výmenou dát.</translation> <translation id="168841957122794586">Certifikát servera obsahuje slabý kryptografický kľúč.</translation> <translation id="1706954506755087368">{1,plural, =1{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; jej certifikát by mal začať platiť od zajtra. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom.}few{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; jej certifikát by mal začať platiť o # dni. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom.}many{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; jej certifikát by mal začať platiť o # dňa. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom.}other{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; jej certifikát by mal začať platiť o # dní. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Skúste kontaktovať správcu systému.</translation> <translation id="17513872634828108">Otvorené karty</translation> <translation id="1753706481035618306">Číslo stránky</translation> <translation id="1763864636252898013">Server nedokáže overiť, či ide o doménu <ph name="DOMAIN" />, operačný systém vášho zariadenia nedôveruje jej bezpečnostnému certifikátu. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie zachytil útočník.</translation> @@ -91,6 +94,7 @@ <translation id="2025186561304664664">Proxy je nastavené na automatickú konfiguráciu.</translation> <translation id="2025623846716345241">Potvrdiť opätovné načítanie</translation> <translation id="2030481566774242610">Mysleli ste stránku <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Skontrolovať proxy server a bránu firewall<ph name="END_LINK" /></translation> <translation id="2053553514270667976">PSČ</translation> <translation id="2065985942032347596">Vyžaduje sa autentifikácia</translation> <translation id="2079545284768500474">Späť</translation> @@ -113,6 +117,8 @@ <translation id="2212735316055980242">Pravidlo sa nenašlo</translation> <translation id="2213606439339815911">Načítavanie záznamov...</translation> <translation id="2214283295778284209">Stránka <ph name="SITE" /> je nedostupná.</translation> +<translation id="2227695659599072496">Skontrolovať sieťový kábel alebo smerovač</translation> +<translation id="2230458221926704099">Opravte svoje pripojenie pomocou <ph name="BEGIN_LINK" />diagnostickej aplikácie<ph name="END_LINK" /></translation> <translation id="225207911366869382">Táto hodnota už pre toto pravidlo nie je podporovaná.</translation> <translation id="2262243747453050782">Chyba protokolu HTTP</translation> <translation id="2279770628980885996">Pri spracovaní žiadosti serverom nastala neočakávaná situácia.</translation> @@ -140,6 +146,7 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Ak je toto nastavenie začiarknuté, Chromium uloží na tomto zariadení kópiu karty, aby ste mohli rýchlejšie vypĺňať formuláre.</translation> <translation id="2498091847651709837">Naskenovať novú kartu</translation> +<translation id="2515629240566999685">Skontrolovať signál vo vašej oblasti</translation> <translation id="2516305470678292029">Alternatívy používateľského rozhrania</translation> <translation id="255002559098805027">Web <ph name="HOST_NAME" /> odoslal neplatnú odpoveď.</translation> <translation id="2552545117464357659">Novšie</translation> @@ -208,7 +215,8 @@ <translation id="3254409185687681395">Vytvoriť záložku pre túto stránku</translation> <translation id="3270847123878663523">&Vrátiť späť zmenu poradia</translation> <translation id="3286538390144397061">Reštartovať</translation> -<translation id="3305707030755673451">Vaše údaje boli <ph name="TIME" /> zašifrované pomocou vlastnej prístupovej frázy pre synchronizáciu. Keď ju zadáte, synchronizácia sa spustí.</translation> +<translation id="3288003805934695103">Opätovne načítať stránku</translation> +<translation id="3305707030755673451">Vaše údaje boli <ph name="TIME" /> zašifrované pomocou vlastnej prístupovej frázy synchronizácie. Keď ju zadáte, synchronizácia sa spustí.</translation> <translation id="333371639341676808">Zakázať tejto stránke otvárať ďalšie dialógové okná.</translation> <translation id="3340978935015468852">nastavenia</translation> <translation id="3355823806454867987">Zmeniť nastavenia proxy...</translation> @@ -251,6 +259,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Načítava sa...</translation> <translation id="3712624925041724820">Vyčerpané licencie</translation> +<translation id="3714780639079136834">Zapnúť mobilné dáta alebo Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Skontrolovať proxy server, bránu firewall a konfiguráciu DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Skopírovaný odkaz</translation> <translation id="3744899669254331632">Webové stránky <ph name="SITE" /> momentálne nemôžete navštíviť, pretože odoslali zakódované poverenia, ktoré Chromium neodkáže spracovať. Chyby siete a útoky sú zvyčajne dočasné, takže táto stránka by mala pravdepodobne neskôr fungovať.</translation> <translation id="3748412725338508953">Vzniklo priveľa presmerovaní.</translation> @@ -272,6 +282,7 @@ <translation id="3963721102035795474">Režim čítačky</translation> <translation id="3973234410852337861">Web <ph name="HOST_NAME" /> je zablokovaný</translation> <translation id="4021036232240155012">DNS je sieťová služba, ktorá preloží názov webu do jeho internetovej adresy.</translation> +<translation id="4021376465026729077">Zakázať rozšírenia</translation> <translation id="4030383055268325496">&Vrátiť späť pridanie</translation> <translation id="4032534284272647190">Prístup na stránku <ph name="URL" /> bol odmietnutý.</translation> <translation id="404928562651467259">UPOZORNENIE</translation> @@ -288,6 +299,7 @@ <translation id="4171400957073367226">Nesprávny overovací podpis</translation> <translation id="4176463684765177261">Zakázané</translation> <translation id="4196861286325780578">&Znova presunúť</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Skontrolovať konfiguráciu brány firewall a antivírusového softvéru<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Zlyhania</translation> <translation id="4250680216510889253">Nie</translation> <translation id="4258748452823770588">Chybný podpis</translation> @@ -308,6 +320,7 @@ <translation id="443673843213245140">Použitie servera proxy je zakázané, ale je určená explicitná konfigurácia servera proxy.</translation> <translation id="4492190037599258964">Výsledky vyhľadávania pre dopyt „<ph name="SEARCH_STRING" />“</translation> <translation id="4506176782989081258">Chyba overenia: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Kontaktovať správcu systému</translation> <translation id="450710068430902550">Zdieľanie so správcom</translation> <translation id="4522570452068850558">Podrobnosti</translation> <translation id="4535734014498033861">Pripojenie servera proxy zlyhalo.</translation> @@ -345,6 +358,7 @@ <translation id="5031870354684148875">O službe Prekladač Google</translation> <translation id="5040262127954254034">Ochrana súkromia</translation> <translation id="5045550434625856497">Nesprávne heslo</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Skontrolovať adresu proxy servera<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Certifikát servera je momentálne neplatný</translation> <translation id="5089810972385038852">Štát</translation> <translation id="5094747076828555589">Server nedokáže overiť, či ide o doménu <ph name="DOMAIN" />, Chromium nedôveruje jej bezpečnostnému certifikátu. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie zachytil útočník.</translation> @@ -363,6 +377,7 @@ <translation id="5295309862264981122">Potvrdiť navigáciu</translation> <translation id="5299298092464848405">Pri analýze pravidla sa vyskytla chyba</translation> <translation id="5300589172476337783">Zobraziť</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Vymazať súbory cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Hlásenie zlyhaní je zakázané.</translation> <translation id="5317780077021120954">Uložiť</translation> <translation id="5327248766486351172">Názov</translation> @@ -390,6 +405,7 @@ <translation id="5556459405103347317">Obnoviť</translation> <translation id="5565735124758917034">Aktívne</translation> <translation id="560412284261940334">Správa nie je podporovaná</translation> +<translation id="5610142619324316209">Skontrolovať pripojenie</translation> <translation id="5617949217645503996">Web <ph name="HOST_NAME" /> vás presmeroval príliš veľakrát.</translation> <translation id="5629630648637658800">Nastavenia pravidla sa nepodarilo načítať</translation> <translation id="5631439013527180824">Neplatný token správy zariadenia</translation> @@ -421,6 +437,7 @@ <translation id="6060685159320643512">Opatrne, tieto experimenty môžu spôsobiť problémy</translation> <translation id="6093795393556121384">Vaša karta je overená</translation> <translation id="6146055958333702838">Skontrolujte všetky káble a reštartujte všetky používané smerovače, modemy alebo iné sieťové zariadenia.</translation> +<translation id="614940544461990577">Vyskúšajte:</translation> <translation id="6151417162996330722">Obdobie platnosti certifikátu servera je príliš dlhé</translation> <translation id="6154808779448689242">Vrátený token pravidla sa nezhoduje s aktuálnym tokenom</translation> <translation id="6165508094623778733">Viac informácií</translation> @@ -461,11 +478,13 @@ <translation id="6628463337424475685">Vyhľadávanie <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Stránky <ph name="SITE" /> momentálne nemôžete navštíviť, pretože <ph name="BEGIN_LINK" />tento certifikát bol odvolaný<ph name="END_LINK" />. Chyby siete a útoky sú zvyčajne dočasné, takže by táto stránka mala neskôr pravdepodobne fungovať.</translation> <translation id="6637478299472506933">Stiahnutie zlyhalo</translation> +<translation id="6642894344118208103">Resetovať modem alebo smerovač</translation> <translation id="6644283850729428850">Toto pravidlo bolo označené ako zastarané.</translation> <translation id="6646897916597483132">Zadajte štvormiestny kód CVC z prednej strany svojej karty</translation> <translation id="6656103420185847513">Upraviť priečinok</translation> <translation id="6660210980321319655">Automaticky nahlásené <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Chcete návrh položky formulára odstrániť z prehliadača Chromium?</translation> +<translation id="6685834062052613830">Odhláste sa a dokončite nastavenie</translation> <translation id="6710213216561001401">Dozadu</translation> <translation id="6711464428925977395">Vyskytol sa problém s proxy serverom alebo je adresa nesprávna.</translation> <translation id="674375294223700098">Neznáma chyba spôsobená certifikátom servera.</translation> @@ -495,6 +514,7 @@ <translation id="7052500709156631672">Brána alebo server proxy dostal neplatnú odpoveď od nadradeného servera.</translation> <translation id="7087282848513945231">Grófstvo</translation> <translation id="7088615885725309056">Staršie</translation> +<translation id="7090678807593890770">Vyhľadajte na Googli výraz <ph name="LINK" /></translation> <translation id="7108649287766967076">Preklad do jazyka <ph name="TARGET_LANGUAGE" /> zlyhal.</translation> <translation id="7139724024395191329">Emirát</translation> <translation id="7179921470347911571">Reštartovať teraz</translation> @@ -585,6 +605,7 @@ <translation id="8034955203865359138">V histórii sa nenašli žiadne záznamy.</translation> <translation id="8088680233425245692">Článok sa nepodarilo zobraziť.</translation> <translation id="8091372947890762290">Aktivácia čaká na server</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />Adresu DNS<ph name="END_ABBR" /> servera <ph name="HOST_NAME" /> sa nepodarilo nájsť.</translation> <translation id="8149426793427495338">Váš počítač prešiel do režimu spánku.</translation> <translation id="8150722005171944719">Súbor na adrese <ph name="URL" /> nie je možné prečítať. Je možné, že bol odstránený, presunutý alebo môžu v prístupe brániť povolenia súboru.</translation> <translation id="8194797478851900357">&Vrátiť späť presunutie</translation> @@ -603,6 +624,7 @@ <translation id="8311778656528046050">Naozaj chcete znova načítať túto stránku?</translation> <translation id="8332188693563227489">Prístup k webu <ph name="HOST_NAME" /> bol zamietnutý</translation> <translation id="8349305172487531364">Panel so záložkami</translation> +<translation id="8363502534493474904">Vypnúť režim v lietadle</translation> <translation id="8364627913115013041">Nenastavené.</translation> <translation id="8412145213513410671">Zlyhania (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Rovnakú prístupovú frázu musíte zadať dvakrát.</translation> @@ -659,6 +681,7 @@ <translation id="901974403500617787">Príznaky, ktoré platia v celom systéme, môže nastaviť iba vlastník: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Server odmietol spojenie.</translation> <translation id="9020542370529661692">Táto stránka bola preložená do jazyka <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Používať službu predpovedí na rýchlejšie načítanie stránok</translation> <translation id="9039213469156557790">Táto stránka obsahuje aj iné zdroje, ktoré nie sú zabezpečené. Tieto zdroje môžu pri prenose vidieť ostatní používatelia a útočník ich môže upraviť tak, aby zmenil správanie stránky.</translation> <translation id="9049981332609050619">Pokúšate sa otvoriť doménu <ph name="DOMAIN" />, ale server predložil neplatný certifikát.</translation> <translation id="9050666287014529139">Prístupová fráza</translation> @@ -672,7 +695,7 @@ <translation id="9170848237812810038">&Naspäť</translation> <translation id="917450738466192189">Certifikát servera je neplatný.</translation> <translation id="9183425211371246419">Web <ph name="HOST_NAME" /> využíva nepodporovaný protokol.</translation> -<translation id="9205078245616868884">Údaje sú šifrované pomocou vlastnej prístupovej frázy pre synchronizáciu. Keď ju zadáte, synchronizácia sa spustí.</translation> +<translation id="9205078245616868884">Údaje sú šifrované pomocou vlastnej prístupovej frázy synchronizácie. Keď ju zadáte, synchronizácia sa spustí.</translation> <translation id="9207861905230894330">Článok sa nepodarilo pridať.</translation> <translation id="933612690413056017">Žiadne internetové pripojenie</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index e388ade0..d44c53b 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Strežniku ni uspelo dokazati, da je <ph name="DOMAIN" />; operacijski sistem vašega računalnika ne zaupa njegovemu varnostnemu potrdilu. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.</translation> <translation id="1152921474424827756">Odprite <ph name="BEGIN_LINK" />predpomnjeno kopijo<ph name="END_LINK" /> strani na naslovu <ph name="URL" /></translation> <translation id="1158211211994409885">Spletno mesto <ph name="HOST_NAME" /> je nepričakovano prekinilo povezavo.</translation> +<translation id="1161325031994447685">znova vzpostaviti povezavo z omrežjem Wi-Fi</translation> <translation id="1175364870820465910">&Natisni ...</translation> <translation id="1181037720776840403">Odstrani</translation> <translation id="1195447618553298278">Neznana napaka.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Uporabniški pravilniki</translation> <translation id="1644184664548287040">Omrežna konfiguracija ni veljavna in je ni mogoče uvoziti.</translation> <translation id="1644574205037202324">Zgodovina</translation> +<translation id="1645368109819982629">Nepodprt protokol</translation> <translation id="1655462015569774233">{1,plural, =1{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo včeraj. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}one{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo pred # dnevom. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}two{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo pred # dnevoma. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}few{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo pred # dnevi. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}other{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo pred # dnevi. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}}</translation> <translation id="1676269943528358898">Spletno mesto <ph name="SITE" /> za zaščito vaših podatkov običajno uporablja šifriranje. Ko se je Google Chrome tokrat poskusil povezati s spletnim mestom <ph name="SITE" />, je to vrnilo nenavadne in nepravilne poverilnice. Do tega lahko pride, če se napadalec lažno predstavlja za spletno mesto <ph name="SITE" /> ali če je povezavo prekinil zaslon za prijavo v omrežje Wi-Fi. Vaši podatki so še vedno varni, saj je Google Chrome pred izmenjavo podatkov prekinil povezavo.</translation> <translation id="168841957122794586">Potrdilo strežnika vsebuje šibek šifrirni ključ.</translation> <translation id="1706954506755087368">{1,plural, =1{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo jutrišnji datum. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}one{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo datum v prihodnosti – # dan od danes. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}two{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo datum v prihodnosti – # dneva od danes. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}few{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo datum v prihodnosti – # dni od danes. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}other{Strežniku ni uspelo dokazati, dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo datum v prihodnosti – # dni od danes. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}}</translation> <translation id="1710259589646384581">Operacijski sistem</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Poskusite se obrniti na skrbnika sistema.</translation> <translation id="17513872634828108">Odpri zavihke</translation> <translation id="1753706481035618306">Številka strani</translation> <translation id="1763864636252898013">Strežniku ni uspelo dokazati, da je <ph name="DOMAIN" />; operacijski sistem vaše naprave ne zaupa njegovemu varnostnemu potrdilu. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Strežnik proxy je nastavljen na samodejno konfiguriranje.</translation> <translation id="2025623846716345241">Potrditev vnovičnega nalaganja</translation> <translation id="2030481566774242610">Ali ste mislili <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />preveriti strežnik proxy in požarni zid<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Poštna številka</translation> <translation id="2065985942032347596">Zahtevano je preverjanje pristnosti</translation> <translation id="2079545284768500474">Razveljavi</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Pravilnika ni mogoče najti</translation> <translation id="2213606439339815911">Prenos vnosov ...</translation> <translation id="2214283295778284209"><ph name="SITE" /> ni na voljo</translation> +<translation id="2227695659599072496">preveriti omrežni kabel in usmerjevalnik</translation> +<translation id="2230458221926704099">Odpravite težave s povezavo z <ph name="BEGIN_LINK" />aplikacijo za diagnostiko<ph name="END_LINK" /></translation> <translation id="225207911366869382">Vrednost za ta pravilnik je zastarela.</translation> <translation id="2262243747453050782">Napaka HTTP</translation> <translation id="2279770628980885996">Ko je strežnik poskušal izpolniti zahtevo, je prišlo do nepričakovanega stanja.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Razčlenjevalnik za JSON</translation> <translation id="2495093607237746763">Če je izbrana ta možnost, bo Chromium shranil kopijo kartice v tej napravi za hitrejše izpolnjevanje obrazcev.</translation> <translation id="2498091847651709837">Optično branje nove kartice</translation> +<translation id="2515629240566999685">preveriti signal na svojem območju</translation> <translation id="2516305470678292029">Nadomestni uporabniški vmesniki</translation> <translation id="255002559098805027">Spletno mesto <ph name="HOST_NAME" /> je poslalo neveljaven odgovor.</translation> <translation id="2552545117464357659">Novejša</translation> @@ -222,6 +229,8 @@ <translation id="3254409185687681395">Zaznamujte to stran</translation> <translation id="3270847123878663523">&Razveljavi razvrstitev</translation> <translation id="3286538390144397061">Znova zaženi</translation> +<translation id="3288003805934695103">znova naložiti stran</translation> +<translation id="3305707030755673451">Podatki so bili šifrirani z vašim geslom za sinhronizacijo <ph name="TIME" />. Vnesite ga, če želite začeti sinhronizacijo.</translation> <translation id="333371639341676808">Tej strani preprečite, da bi ustvarila dodatna pogovorna okna.</translation> <translation id="3340978935015468852">nastavitve</translation> <translation id="3355823806454867987">Spremeni nastavitve proxyja ...</translation> @@ -264,6 +273,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Nalagam ...</translation> <translation id="3712624925041724820">Ni dovolj licenc</translation> +<translation id="3714780639079136834">vklopiti prenos podatkov v mobilnih omrežjih ali Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />preveriti strežnik proxy, požarni zid in konfiguracijo DNS-ja<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Povezava, ki ste jo kopirali</translation> <translation id="3744899669254331632">Spletnega mesta <ph name="SITE" /> trenutno ne morete obiskati, ker je poslalo šifrirane poverilnice, ki jih Chromium ne more obdelati. Napake v omrežju in napadi so običajno začasni, zato bo ta stran verjetno delovala pozneje.</translation> <translation id="3748412725338508953">Bilo je preveč preusmeritev.</translation> @@ -286,6 +297,7 @@ <translation id="3963721102035795474">Način bralnika</translation> <translation id="3973234410852337861">Spletno mesto <ph name="HOST_NAME" /> je blokirano</translation> <translation id="4021036232240155012">DNS je omrežna storitev, ki ime spletnega mesta prevede v njegov internetni naslov.</translation> +<translation id="4021376465026729077">onemogočiti razširitve</translation> <translation id="4030383055268325496">&Razveljavi dodajanje</translation> <translation id="4032534284272647190">Dostop do spletnega mesta <ph name="URL" /> zavrnjen.</translation> <translation id="404928562651467259">OPOZORILO</translation> @@ -302,6 +314,7 @@ <translation id="4171400957073367226">Neveljavni podpis za preverjanje</translation> <translation id="4176463684765177261">Onemogočeno</translation> <translation id="4196861286325780578">&Uveljavi premik</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />preveriti požarni zid in konfiguracije protivirusnega programa<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Zrušitve</translation> <translation id="4250680216510889253">Ne</translation> <translation id="4258748452823770588">Napačen podpis</translation> @@ -322,6 +335,7 @@ <translation id="443673843213245140">Uporaba strežnika proxy je onemogočena, vendar je njegova konfiguracija izrecno določena.</translation> <translation id="4492190037599258964">Rezultati iskanja za »<ph name="SEARCH_STRING" />«</translation> <translation id="4506176782989081258">Napaka pri preverjanju veljavnosti: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">se obrniti na skrbnika sistema</translation> <translation id="450710068430902550">Deljenje s skrbnikom</translation> <translation id="4522570452068850558">Podrobnosti</translation> <translation id="4535734014498033861">Povezave s strežnikom proxy ni bilo mogoče vzpostaviti.</translation> @@ -359,6 +373,7 @@ <translation id="5031870354684148875">Google Prevajalnik – vizitka</translation> <translation id="5040262127954254034">Zasebnost</translation> <translation id="5045550434625856497">Napačno geslo</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />preveriti naslov strežnika proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Potrdilo strežnika trenutno ni veljavno.</translation> <translation id="5089810972385038852">Zvezna država</translation> <translation id="5094747076828555589">Strežniku ni uspelo dokazati, da je <ph name="DOMAIN" />; Chromium ne zaupa njegovemu varnostnemu potrdilu. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.</translation> @@ -377,6 +392,7 @@ <translation id="5295309862264981122">Potrditev krmarjenja</translation> <translation id="5299298092464848405">Napaka pri razčlenjevanju pravilnika</translation> <translation id="5300589172476337783">Pokaži</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />izbrisati piškotke<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Poročanje o zrušitvah je onemogočeno.</translation> <translation id="5317780077021120954">Shrani</translation> <translation id="5327248766486351172">Ime</translation> @@ -404,6 +420,7 @@ <translation id="5556459405103347317">Ponovno naloži</translation> <translation id="5565735124758917034">Aktivno</translation> <translation id="560412284261940334">Upravljanje ni podprto</translation> +<translation id="5610142619324316209">preveriti povezavo</translation> <translation id="5617949217645503996">Spletno mesto <ph name="HOST_NAME" /> vas je prevečkrat preusmerilo.</translation> <translation id="5629630648637658800">Nastavitev pravilnika ni bilo mogoče naložiti</translation> <translation id="5631439013527180824">Neveljaven žeton za upravljanje naprave</translation> @@ -436,6 +453,7 @@ <translation id="6093795393556121384">Vaša kartica je preverjena</translation> <translation id="6146055958333702838">Preverite kable in znova zaženite usmerjevalnike, modeme ali druge omrežne naprave, ki jih uporabljate.</translation> +<translation id="614940544461990577">Poskusite:</translation> <translation id="6151417162996330722">Potrdilo strežnika ima predolgo obdobje veljavnosti.</translation> <translation id="6154808779448689242">Vrnjen žeton pravilnika se ne ujema s trenutnim žetonom</translation> <translation id="6165508094623778733">Več o tem</translation> @@ -477,11 +495,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Iskanje</translation> <translation id="6634865548447745291">Spletnega mesta <ph name="SITE" /> trenutno ni mogoče obiskati, saj <ph name="BEGIN_LINK" />je to potrdilo preklicano<ph name="END_LINK" />. Napake omrežja in napadi na omrežje so običajno začasni, zato bo ta stran verjetno delovala pozneje.</translation> <translation id="6637478299472506933">Prenos ni uspel</translation> +<translation id="6642894344118208103">ponastaviti modem ali usmerjevalnik</translation> <translation id="6644283850729428850">Ta pravilnik je zastarel.</translation> <translation id="6646897916597483132">Vnesite štirimestno kodo CVC na sprednji strani kartice</translation> <translation id="6656103420185847513">Urejanje mape</translation> <translation id="6660210980321319655">Samodejno sporočeno: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Želite predlog obrazca odstraniti iz Chromiuma?</translation> +<translation id="6685834062052613830">Odjavite se in dokončajte nastavitev</translation> <translation id="6710213216561001401">Nazaj</translation> <translation id="6711464428925977395">Nekaj je narobe s strežnikom proxy ali pa naslov ni pravilen.</translation> <translation id="674375294223700098">Neznana napaka potrdila strežnika.</translation> @@ -516,6 +536,7 @@ <translation id="7052500709156631672">Prehod ali strežnik proxy je prejel neveljaven odziv višjega strežnika.</translation> <translation id="7087282848513945231">Okraj</translation> <translation id="7088615885725309056">Starejše</translation> +<translation id="7090678807593890770">Iščite v Googlu s poizvedbo <ph name="LINK" /></translation> <translation id="7108649287766967076">Prevod v jezik <ph name="TARGET_LANGUAGE" /> ni uspel.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Znova zaženi</translation> @@ -608,6 +629,7 @@ <translation id="8034955203865359138">Ni vnosov v zgodovino.</translation> <translation id="8088680233425245692">Članka si ni bilo mogoče ogledati.</translation> <translation id="8091372947890762290">Čakanje na aktivacijo v strežniku</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />Naslova DNS<ph name="END_ABBR" /> strežnika spletnega mesta <ph name="HOST_NAME" /> ni bilo mogoče najti.</translation> <translation id="8149426793427495338">Računalnik je preklopil v stanje pripravljenosti.</translation> <translation id="8150722005171944719">Datoteke na <ph name="URL" /> ni mogoče prebrati. Morda je odstranjena, premaknjena ali pa dostop preprečujejo dovoljenja za datoteke.</translation> <translation id="8194797478851900357">&Razveljavi premik</translation> @@ -635,6 +657,7 @@ <translation id="8311778656528046050">Ali res želite znova naložiti to stran?</translation> <translation id="8332188693563227489">Dostop do spletnega mesta <ph name="HOST_NAME" /> je bil zavrnjen</translation> <translation id="8349305172487531364">Vrstica z zaznamki</translation> +<translation id="8363502534493474904">izklopiti način za letalo</translation> <translation id="8364627913115013041">Ni nastavljen.</translation> <translation id="8412145213513410671">Zrušitve (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Dvakrat morate vnesti isto geslo.</translation> @@ -692,6 +715,7 @@ <translation id="901974403500617787">Zastavice, ki se uporabijo v celotnem sistemu, lahko nastavi samo lastnik: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Strežnik je zavrnil povezavo.</translation> <translation id="9020542370529661692">Ta stran je prevedena v jezik <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Uporaba storitve predvidevanja za hitrejše nalaganje strani</translation> <translation id="9039213469156557790">Poleg tega so na tej strani druga sredstva, ki niso varna. Ta sredstva lahko med prenosom pregledujejo drugi, morebitni napadalec pa jih lahko spremeni, tako da se spremeni način delovanja strani.</translation> <translation id="9049981332609050619">Skušali ste dostopati do domene <ph name="DOMAIN" />, vendar je strežnik predložil neveljavno potrdilo.</translation> <translation id="9050666287014529139">Geslo</translation> @@ -705,6 +729,7 @@ <translation id="9170848237812810038">&Razveljavi</translation> <translation id="917450738466192189">Potrdilo strežnika ni veljavno.</translation> <translation id="9183425211371246419">Spletno mesto <ph name="HOST_NAME" /> uporablja nepodprt protokol.</translation> +<translation id="9205078245616868884">Podatki so šifrirani z vašim geslom za sinhronizacijo. Vnesite ga, če želite začeti sinhronizacijo.</translation> <translation id="9207861905230894330">Članka ni bilo mogoče dodati.</translation> <translation id="933612690413056017">Ni internetne povezave</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 85adafd5..4614442 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -25,6 +25,7 @@ <translation id="1150979032973867961">Овај сервер не може да докаже да је <ph name="DOMAIN" />; оперативни систем рачунара нема поверења у његов безбедносни сертификат. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.</translation> <translation id="1152921474424827756">Приступите <ph name="BEGIN_LINK" />кешираној копији<ph name="END_LINK" /> странице <ph name="URL" /></translation> <translation id="1158211211994409885">Хост <ph name="HOST_NAME" /> је неочекивано прекинуо везу.</translation> +<translation id="1161325031994447685">поново да се повежете са Wi-Fi мрежом</translation> <translation id="1175364870820465910">&Одштампај...</translation> <translation id="1181037720776840403">Уклони</translation> <translation id="1195447618553298278">Непозната грешка.</translation> @@ -66,12 +67,14 @@ <translation id="1640180200866533862">Смернице за кориснике</translation> <translation id="1644184664548287040">Конфигурација мреже је неважећа и не може да се увезе.</translation> <translation id="1644574205037202324">Историја</translation> +<translation id="1645368109819982629">Неподржани протокол</translation> <translation id="1655462015569774233">{1,plural, =1{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је истекао јуче. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу. Сат рачунара је тренутно подешен на <ph name="CURRENT_DATE" />. Да ли је то тачно? Ако није, требало би да исправите сат система и да затим освежите ову страницу.}one{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је истекао пре # дана. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу. Сат рачунара је тренутно подешен на <ph name="CURRENT_DATE" />. Да ли је то тачно? Ако није, требало би да исправите сат система и да затим освежите ову страницу.}few{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је истекао пре # дана. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу. Сат рачунара је тренутно подешен на <ph name="CURRENT_DATE" />. Да ли је то тачно? Ако није, требало би да исправите сат система и да затим освежите ову страницу.}other{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је истекао пре # дана. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу. Сат рачунара је тренутно подешен на <ph name="CURRENT_DATE" />. Да ли је то тачно? Ако није, требало би да исправите сат система и да затим освежите ову страницу.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> обично користи шифровање да би заштитио информације. Када је Google Chrome овог пута покушао да се повеже са <ph name="SITE" />, веб-сајт је вратио необичне и нетачне акредитиве. Или нападач покушава да се представи као <ph name="SITE" /> или је екран за Wi-Fi пријављивање прекинуо везу. Информације су и даље безбедне зато што је Google Chrome прекинуо везу пре него што су размењени било какви подаци.</translation> <translation id="168841957122794586">Сертификат сервера садржи слаб криптографски кључ.</translation> <translation id="1706954506755087368">{1,plural, =1{Овај сервер не може да докаже да је <ph name="DOMAIN" />; датум његовог безбедносног сертификата је наводно сутрашњи. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.}one{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је наводно датиран у будућности (за # дан). Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.}few{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је наводно датиран у будућности (за # дана). Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.}other{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је наводно датиран у будућности (за # дана). Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.}}</translation> <translation id="1710259589646384581">ОС</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Покушајте да контактирате администратора система.</translation> <translation id="17513872634828108">Отворене картице</translation> <translation id="1753706481035618306">Број странице</translation> <translation id="1763864636252898013">Овај сервер не може да докаже да је <ph name="DOMAIN" />; оперативни систем уређаја нема поверења у његов безбедносни сертификат. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.</translation> @@ -93,6 +96,7 @@ <translation id="2025186561304664664">Прокси је подешен да буде аутоматски конфигурисан.</translation> <translation id="2025623846716345241">Потврда поновног учитавања</translation> <translation id="2030481566774242610">Да ли сте мислили <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />да проверите прокси и заштитни зид<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Поштански број</translation> <translation id="2065985942032347596">Потребна је потврда идентитета</translation> <translation id="2079545284768500474">Опозови</translation> @@ -118,6 +122,8 @@ <translation id="2212735316055980242">Смернице нису пронађене</translation> <translation id="2213606439339815911">Преузимање уноса...</translation> <translation id="2214283295778284209">Сајт <ph name="SITE" /> није доступан</translation> +<translation id="2227695659599072496">да проверите мрежни кабл или рутер</translation> +<translation id="2230458221926704099">Поправите везу помоћу <ph name="BEGIN_LINK" />апликације за дијагностику<ph name="END_LINK" /></translation> <translation id="225207911366869382">Ова вредност је застарела за ове смернице.</translation> <translation id="2262243747453050782">HTTP грешка</translation> <translation id="2279770628980885996">Дошло је до неочекиване грешке при покушају сервера да испуни овај захтев.</translation> @@ -145,6 +151,7 @@ <translation id="2495083838625180221">Рашчлањивач JSON датотека</translation> <translation id="2495093607237746763">Ако означите ову опцију, Chromium ће складиштити копију картице на овом уређају ради бржег попуњавања образаца.</translation> <translation id="2498091847651709837">Скенирајте нову картицу</translation> +<translation id="2515629240566999685">да проверите сигнал у својој области</translation> <translation id="2516305470678292029">Алтернативе корисничког интерфејса</translation> <translation id="255002559098805027">Хост <ph name="HOST_NAME" /> је послао неважећи одговор.</translation> <translation id="2552545117464357659">Новије</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">Обележите ову страницу</translation> <translation id="3270847123878663523">&Опозови промену редоследа</translation> <translation id="3286538390144397061">Поново покрени одмах</translation> +<translation id="3288003805934695103">поново да учитате страницу</translation> +<translation id="3305707030755673451">Подаци су шифровани помоћу приступне фразе за синхронизацију <ph name="TIME" />. Унесите је да бисте започели синхронизацију.</translation> <translation id="333371639341676808">Спречите ову страницу да прави додатне дијалоге.</translation> <translation id="3340978935015468852">подешавања</translation> <translation id="3355823806454867987">Промени подешавања проксија...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Учитава се...</translation> <translation id="3712624925041724820">Нема више лиценци</translation> +<translation id="3714780639079136834">да укључите податке за мобилне уређаје или Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />да проверите конфигурацију проксија, заштитног зида и DNS-а<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Линк који сте копирали</translation> <translation id="3744899669254331632">Тренутно не можете да посетите <ph name="SITE" /> јер је веб-сајт послао кодиране акредитиве које Chromium не може да обради. Грешке на мрежи и напади су углавном привремени, па ће страница вероватно прорадити касније.</translation> <translation id="3748412725338508953">Било је превише преусмеравања.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">Режим читаоца</translation> <translation id="3973234410852337861">Хост <ph name="HOST_NAME" /> је блокиран</translation> <translation id="4021036232240155012">DNS је мрежна услуга која преводи назив веб-сајта у његову интернет адресу.</translation> +<translation id="4021376465026729077">да онемогућите додатке</translation> <translation id="4030383055268325496">&Опозови додавање</translation> <translation id="4032534284272647190">Приступ адреси <ph name="URL" /> је одбијен.</translation> <translation id="404928562651467259">УПОЗОРЕЊЕ</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">Неисправан потпис за верификацију</translation> <translation id="4176463684765177261">Онемогућено</translation> <translation id="4196861286325780578">&Понови премештање</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />да проверите конфигурацију заштитног зида и антивируса<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Отказивања</translation> <translation id="4250680216510889253">Не</translation> <translation id="4258748452823770588">Неисправан потпис</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">Коришћење проксија је онемогућено, али је наведена експлицитна конфигурација проксија.</translation> <translation id="4492190037599258964">Резултати претраге за „<ph name="SEARCH_STRING" />“</translation> <translation id="4506176782989081258">Грешка при потврди ваљаности: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">да контактирате администратора система</translation> <translation id="450710068430902550">Дељење са администратором</translation> <translation id="4522570452068850558">Детаљи</translation> <translation id="4535734014498033861">Повезивање са прокси сервером није успело.</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">О Google преводиоцу</translation> <translation id="5040262127954254034">Приватност</translation> <translation id="5045550434625856497">Нетачна лозинка</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />да проверите адресу проксија<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Сертификат сервера тренутно није важећи.</translation> <translation id="5089810972385038852">Држава</translation> <translation id="5094747076828555589">Овај сервер не може да докаже да је <ph name="DOMAIN" />; Chromium нема поверења у његов безбедносни сертификат. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">Потврда навигације</translation> <translation id="5299298092464848405">Грешка при рашчлањивању смерница</translation> <translation id="5300589172476337783">Прикажи</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />да обришете колачиће<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Извештавање о отказивању је онемогућено.</translation> <translation id="5317780077021120954">Сачувај</translation> <translation id="5327248766486351172">Назив</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">Учитај поново</translation> <translation id="5565735124758917034">Активно</translation> <translation id="560412284261940334">Управљање није подржано</translation> +<translation id="5610142619324316209">да проверите везу</translation> <translation id="5617949217645503996">Хост <ph name="HOST_NAME" /> вас је преусмерио превелики број пута.</translation> <translation id="5629630648637658800">Учитавање подешавања смерница није успело</translation> <translation id="5631439013527180824">Неважећи токен за управљање уређајима</translation> @@ -433,6 +450,7 @@ <translation id="6060685159320643512">Пазите, ови експерименти могу бити опасни</translation> <translation id="6093795393556121384">Картица је верификована</translation> <translation id="6146055958333702838">Проверите све каблове и рестартујте све рутере, модеме или друге мрежне уређаје које можда користите.</translation> +<translation id="614940544461990577">Покушајте:</translation> <translation id="6151417162996330722">Сертификат сервера има предугачак период важења.</translation> <translation id="6154808779448689242">Враћени токен смерница се не подудара са тренутним токеном</translation> <translation id="6165508094623778733">Сазнајте више</translation> @@ -473,11 +491,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> претрага</translation> <translation id="6634865548447745291">Тренутно не можете да посетите <ph name="SITE" /> зато што је <ph name="BEGIN_LINK" />овај сертификат опозван<ph name="END_LINK" />. Грешке и напади на мрежи су обично привремени, па ће ова страница вероватно функционисати касније.</translation> <translation id="6637478299472506933">Преузимање није успело</translation> +<translation id="6642894344118208103">да ресетујете модем или рутер</translation> <translation id="6644283850729428850">Ове смернице су застареле.</translation> <translation id="6646897916597483132">Унесите четвороцифрени CVC који се налази на предњој страни картице</translation> <translation id="6656103420185847513">Измена директоријума</translation> <translation id="6660210980321319655">Аутоматски пријављено <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Желите ли да уклоните предлог из Chromium-а?</translation> +<translation id="6685834062052613830">Одјавите се и довршите подешавање</translation> <translation id="6710213216561001401">Претходно</translation> <translation id="6711464428925977395">Нешто није у реду са прокси сервером или је адреса нетачна.</translation> <translation id="674375294223700098">Непозната грешка сертификата сервера.</translation> @@ -511,6 +531,7 @@ <translation id="7052500709156631672">Мрежни пролаз или прокси сервер је примио неважећи одговор од сервера за отпремање.</translation> <translation id="7087282848513945231">Округ</translation> <translation id="7088615885725309056">Старије</translation> +<translation id="7090678807593890770">Потражите <ph name="LINK" /> на Google-у</translation> <translation id="7108649287766967076">Превод на <ph name="TARGET_LANGUAGE" /> није успео.</translation> <translation id="7139724024395191329">Емират</translation> <translation id="7179921470347911571">Поново покрени</translation> @@ -603,6 +624,7 @@ <translation id="8034955203865359138">Није пронађен ниједан унос у историји.</translation> <translation id="8088680233425245692">Прегледање чланка није успело.</translation> <translation id="8091372947890762290">Активација је на чекању на серверу</translation> +<translation id="8134994873729925007">Нисмо успели да пронађемо <ph name="BEGIN_ABBR" />DNS адресу<ph name="END_ABBR" /> сервера хоста <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Рачунар је прешао у режим спавања.</translation> <translation id="8150722005171944719">Датотека на адреси <ph name="URL" /> не може да се чита. Можда је уклоњена или премештена или дозволе за датотеке спречавају приступ.</translation> <translation id="8194797478851900357">&Опозови премештање</translation> @@ -623,6 +645,7 @@ <translation id="8311778656528046050">Да ли стварно желите да поново учитате ову страницу?</translation> <translation id="8332188693563227489">Приступ хосту <ph name="HOST_NAME" /> је одбијен</translation> <translation id="8349305172487531364">Трака са обележивачима</translation> +<translation id="8363502534493474904">да искључите режим рада у авиону</translation> <translation id="8364627913115013041">Није подешено.</translation> <translation id="8412145213513410671">Отказивања (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Потребно је да двапут унесете исту приступну фразу.</translation> @@ -680,6 +703,7 @@ <translation id="901974403500617787">Ознаке које се примењују у целом систему може да подеси само власник: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Сервер је одбио повезивање.</translation> <translation id="9020542370529661692">Ова страница је преведена на <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Користите услугу предвиђања да бисте брже учитавали странице</translation> <translation id="9039213469156557790">Поред тога, ова страница садржи и друге ресурсе који нису безбедни. Ове ресурсе могу да виде и други док су у пролазу и нападач може да их измени како би променио понашање странице.</translation> <translation id="9049981332609050619">Покушали сте да дођете до домена <ph name="DOMAIN" />, али сервер је послао неважећи сертификат.</translation> <translation id="9050666287014529139">Приступна фраза</translation> @@ -693,6 +717,7 @@ <translation id="9170848237812810038">&Опозови</translation> <translation id="917450738466192189">Сертификат сервера је неважећи.</translation> <translation id="9183425211371246419">Хост <ph name="HOST_NAME" /> користи неподржани протокол.</translation> +<translation id="9205078245616868884">Подаци се шифрују помоћу приступне фразе за синхронизацију. Унесите је да бисте започели синхронизацију.</translation> <translation id="9207861905230894330">Додавање чланка није успело.</translation> <translation id="933612690413056017">Није успостављена веза са интернетом</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 2b133e5..edd77463 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Servern kunde inte bevisa att den är <ph name="DOMAIN" /> eftersom datorns operativsystem inte litar på dess säkerhetscertifikat. Detta kan orsakas av en felaktig konfigurering eller att någon spärrar anslutningen.</translation> <translation id="1152921474424827756">Öppna en <ph name="BEGIN_LINK" />cachad kopia<ph name="END_LINK" /> av <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> stängde oväntat ner anslutningen.</translation> +<translation id="1161325031994447685">återansluta till Wi-Fi</translation> <translation id="1175364870820465910">Skriv &ut...</translation> <translation id="1181037720776840403">Ta bort</translation> <translation id="1195447618553298278">Okänt fel.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Användarpolicyer</translation> <translation id="1644184664548287040">Nätverkskonfigurationen är ogiltig och kan inte importeras.</translation> <translation id="1644574205037202324">Historik</translation> +<translation id="1645368109819982629">Det finns inget stöd för protokollet</translation> <translation id="1655462015569774233">{1,plural, =1{Det gick inte att bevisa att serverns identitet är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat gick ut i går. Det kan bero på att servern är felkonfigurerad eller att anslutningen har blivit kapad. Dagens datum är <ph name="CURRENT_DATE" /> enligt datorklockan. Går den rätt? I annat fall bör du ställa om datorklockan och sedan uppdatera sidan.}other{Det gick inte att bevisa att serverns identitet är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat gick ut för # dagar sedan. Det kan bero på att servern är felkonfigurerad eller att anslutningen har blivit kapad. Dagens datum är <ph name="CURRENT_DATE" /> enligt datorklockan. Går den rätt? I annat fall bör du ställa om datorklockan och sedan uppdatera sidan.}}</translation> <translation id="1676269943528358898">På <ph name="SITE" /> används vanligtvis kryptering (SSL) för att skydda din information. När Chrome försökte ansluta till <ph name="SITE" /> den här gången skickade webbplatsen tillbaka ovanliga och felaktiga uppgifter. Sådant kan hända när en angripare utger sig för att vara <ph name="SITE" /> eller när anslutningen har avbrutits av en Wi-Fi-inloggningsskärm. Din information är fortfarande säker eftersom Chrome avbröt anslutningen innan någon data utbyttes.</translation> <translation id="168841957122794586">Servercertifikatet innehåller en svag kryptografisk nyckel.</translation> <translation id="1706954506755087368">{1,plural, =1{Det gick inte att bevisa att serverns identitet är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat uppges börja gälla i morgon. Det kan bero på att servern är felkonfigurerad eller att anslutningen har blivit kapad.}other{Det gick inte att bevisa att serverns identitet är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat uppges börja gälla om # dagar. Det kan bero på att servern är felkonfigurerad eller att anslutningen har blivit kapad.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Kontakta systemadministratören.</translation> <translation id="17513872634828108">Öppna flikar</translation> <translation id="1753706481035618306">Sidnummer</translation> <translation id="1763864636252898013">Servern kunde inte bevisa att den är <ph name="DOMAIN" /> eftersom enhetens operativsystem inte litar på dess säkerhetscertifikat. Detta kan orsakas av en felaktig konfigurering eller att någon spärrar anslutningen.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxyn är inställd på automatisk konfiguration.</translation> <translation id="2025623846716345241">Bekräfta ny sidhämtning</translation> <translation id="2030481566774242610">Menade du <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />kontrollera proxyn och brandväggen<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ZIP</translation> <translation id="2065985942032347596">Verifiering krävs</translation> <translation id="2079545284768500474">Ångra</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Policyn hittades inte</translation> <translation id="2213606439339815911">Hämtar poster …</translation> <translation id="2214283295778284209"><ph name="SITE" /> är inte tillgängligt</translation> +<translation id="2227695659599072496">kontrollera nätverkskabeln eller routern</translation> +<translation id="2230458221926704099">Åtgärda anslutningsproblemet med hjälp av <ph name="BEGIN_LINK" />diagnostiseringsappen<ph name="END_LINK" /></translation> <translation id="225207911366869382">Värdet är inte längre giltigt för policyn.</translation> <translation id="2262243747453050782">HTTP-fel</translation> <translation id="2279770628980885996">Ett oväntat tillstånd gjorde att servern inte kunde uppfylla begäran.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON-analysator</translation> <translation id="2495093607237746763">Om alternativet är markerat sparar Chromium en kopia av kortet på enheten så att det går snabbare att fylla i formulär.</translation> <translation id="2498091847651709837">Läs in ett nytt kort</translation> +<translation id="2515629240566999685">kontrollera mottagningen i området</translation> <translation id="2516305470678292029">Användargränssnittsalternativ</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> skickade ett ogiltigt svar.</translation> <translation id="2552545117464357659">Nyare</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Bokmärk sidan</translation> <translation id="3270847123878663523">&Ångra Ändra ordning</translation> <translation id="3286538390144397061">Starta om nu</translation> +<translation id="3288003805934695103">läsa in sidan igen</translation> +<translation id="3305707030755673451">Din data krypterades med din lösenfras för synkronisering den <ph name="TIME" />. Ange den om du vill starta synkroniseringen.</translation> <translation id="333371639341676808">Förhindra att den här sidan öppnar ytterligare dialogrutor.</translation> <translation id="3340978935015468852">inställningar</translation> <translation id="3355823806454867987">Ändra proxyinställningar...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Laddar...</translation> <translation id="3712624925041724820">Licenserna har tagit slut</translation> +<translation id="3714780639079136834">aktivera mobildata eller Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />kontrollera proxyn, brandväggen och DNS-konfigureringen<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Länk som du har kopierat</translation> <translation id="3744899669254331632">Du kan inte besöka <ph name="SITE" /> just nu eftersom webbplatsen skickade krypterade användaruppgifter som Chromium inte kan bearbeta. Nätverksfel och attacker är ofta tillfälliga, så sidan kommer förmodligen fungera senare.</translation> <translation id="3748412725338508953">Det fanns för många omdirigeringar.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Läsarläge</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> har blockerats</translation> <translation id="4021036232240155012">DNS är en webbtjänst som översätter namnet på en webbplats till motsvarande internetadress.</translation> +<translation id="4021376465026729077">inaktivera tilläggen</translation> <translation id="4030383055268325496">&Ångra Lägg till</translation> <translation id="4032534284272647190">Åtkomst nekad till <ph name="URL" />.</translation> <translation id="404928562651467259">VARNING</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Felaktig verifieringssignatur</translation> <translation id="4176463684765177261">Inaktiverad</translation> <translation id="4196861286325780578">&Gör om Flytta</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />kontrollera konfigureringarna för brandväggen och antivirusprogram<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Kraschar</translation> <translation id="4250680216510889253">Nej</translation> <translation id="4258748452823770588">Felaktig signatur</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Användning av proxy är inaktiverad men en explicit proxykonfiguration har angetts.</translation> <translation id="4492190037599258964">Sökresultat för "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Valideringsfel: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">kontakta systemadministratören</translation> <translation id="450710068430902550">Delad med en administratör</translation> <translation id="4522570452068850558">Info</translation> <translation id="4535734014498033861">Anslutningen till proxyservern misslyckades.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Om Google Översätt</translation> <translation id="5040262127954254034">Sekretess</translation> <translation id="5045550434625856497">Felaktigt lösenord</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />kontrollera proxyadressen<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Servercertifikatet är inte giltigt för närvarande.</translation> <translation id="5089810972385038852">Delstat</translation> <translation id="5094747076828555589">Servern kunde inte bevisa att den är <ph name="DOMAIN" /> eftersom Chromium inte litar på dess säkerhetscertifikat. Detta kan orsakas av en felaktig konfigurering eller att någon spärrar anslutningen.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Bekräfta navigering</translation> <translation id="5299298092464848405">Det uppstod ett fel när policyn analyserades</translation> <translation id="5300589172476337783">Visa</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />rensa cookies<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Krashrapportering har inaktiverats.</translation> <translation id="5317780077021120954">Spara</translation> <translation id="5327248766486351172">Namn</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Hämta igen</translation> <translation id="5565735124758917034">Aktiv</translation> <translation id="560412284261940334">Hantering stöds inte</translation> +<translation id="5610142619324316209">kontrollera anslutningen</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> omdirigerade dig för många gånger.</translation> <translation id="5629630648637658800">Det gick inte att läsa in policyinställningarna</translation> <translation id="5631439013527180824">Ogiltig enhetshanteringstoken</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Ditt kort har verifierats</translation> <translation id="6146055958333702838">Kontrollera kablar och starta om routrar, modem och andra nätverksenheter som används.</translation> +<translation id="614940544461990577">Testa att</translation> <translation id="6151417162996330722">Servercertifikatet har för lång giltighetstid.</translation> <translation id="6154808779448689242">Returnerad policytoken matchade inte den aktuella token</translation> <translation id="6165508094623778733">Läs mer</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Sök</translation> <translation id="6634865548447745291">Det går inte att besöka <ph name="SITE" /> just nu på grund av att <ph name="BEGIN_LINK" />det här certifikatet har återkallats<ph name="END_LINK" />. Nätverksfel och attacker är vanligtvis tillfälliga så sidan fungerar troligen senare.</translation> <translation id="6637478299472506933">Nedladdningen misslyckades</translation> +<translation id="6642894344118208103">återställa modemet eller routern</translation> <translation id="6644283850729428850">Policyn är föråldrad.</translation> <translation id="6646897916597483132">Ange den fyrsiffriga CVC-koden från kortets framsida</translation> <translation id="6656103420185847513">Redigera mapp</translation> <translation id="6660210980321319655">Rapporterades automatiskt <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Vill du ta bort formulärförslaget från Chromium?</translation> +<translation id="6685834062052613830">Logga ut och slutför konfigureringen</translation> <translation id="6710213216561001401">Föregående</translation> <translation id="6711464428925977395">Något är fel med proxyservern eller så är adressen felaktig.</translation> <translation id="674375294223700098">Fel - okänt servercertifikat.</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">Gatewayen eller proxyservern fick ett ogiltigt svar från en server uppströms.</translation> <translation id="7087282848513945231">Grevskap</translation> <translation id="7088615885725309056">Äldre</translation> +<translation id="7090678807593890770">Sök efter <ph name="LINK" /> på Google</translation> <translation id="7108649287766967076">Översättningen till <ph name="TARGET_LANGUAGE" /> misslyckades.</translation> <translation id="7139724024395191329">Emirat</translation> <translation id="7179921470347911571">Starta om nu</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Inga historikposter hittades.</translation> <translation id="8088680233425245692">Det gick inte att visa artikeln.</translation> <translation id="8091372947890762290">Aktiveringen väntar på servern</translation> +<translation id="8134994873729925007">Det gick inte att hitta <ph name="BEGIN_ABBR" />DNS-adressen<ph name="END_ABBR" /> till servern för <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Datorn gick i viloläge.</translation> <translation id="8150722005171944719">Det går inte att läsa filen på <ph name="URL" />. Den kan ha tagits bort eller flyttats, eller så krävs behörighet för att få åtkomst till den.</translation> <translation id="8194797478851900357">&Ångra Flytta</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">Vill du hämta sidan igen?</translation> <translation id="8332188693563227489">Åtkomst nekades till <ph name="HOST_NAME" />.</translation> <translation id="8349305172487531364">Bokmärkesfältet</translation> +<translation id="8363502534493474904">inaktivera flygplansläget</translation> <translation id="8364627913115013041">Inte angiven.</translation> <translation id="8412145213513410671">Krascher (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Du måste ange samma lösenfras två gånger.</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">Flaggor som gäller hela systemet kan endast ställas in av ägaren: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Servern vägrade ansluta.</translation> <translation id="9020542370529661692">Den här sidan har översatts till <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Använd en förslagstjänst om du vill läsa in sidor snabbare</translation> <translation id="9039213469156557790">Den här sidan innehåller emellertid andra resurser som inte är säkra. Andra kan se resurserna när de överförs och hackare kan ändra resurserna så att sidan får ett annat beteende.</translation> <translation id="9049981332609050619">Du försökte nå <ph name="DOMAIN" /> men servern angav ett ogiltigt certifikat.</translation> <translation id="9050666287014529139">Lösenfras</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">&Ångra</translation> <translation id="917450738466192189">Servercertifikatet är ogiltigt.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> använder ett protokoll som inte stöds.</translation> +<translation id="9205078245616868884">Din data har krypterats med din lösenfras för synkronisering. Ange den om du vill starta synkroniseringen.</translation> <translation id="9207861905230894330">Det gick inte att lägga till artikeln.</translation> <translation id="933612690413056017">Det finns ingen internetanslutning</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 8f029ea4..0468b505 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama hakiaminiwi na mfumo wa uendeshaji wa kompyuta yako. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako.</translation> <translation id="1152921474424827756">Fikia <ph name="BEGIN_LINK" />nakala iliyowekwa kwenye akiba<ph name="END_LINK" /> ya <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ilifunga muunganisho bila kutarajia.</translation> +<translation id="1161325031994447685">Kuunganisha tena kwenye Wi-Fi</translation> <translation id="1175364870820465910">&Chapisha...</translation> <translation id="1181037720776840403">Ondoa</translation> <translation id="1195447618553298278">Hitilafu isiyojulikana.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Sera za mtumiaji</translation> <translation id="1644184664548287040">Usanidi wa mtandao ni batili na usingeweza kuingizwa.</translation> <translation id="1644574205037202324">Historia</translation> +<translation id="1645368109819982629">Itifaki haitumiki</translation> <translation id="1655462015569774233">{1,plural, =1{Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama kilikwisha muda jana. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako. Saa ya kompyuta kwa sasa imewekwa kuwa <ph name="CURRENT_DATE" />. Je, hiyo ni sahihi? Ikiwa si sahihi, rekebisha saa ya mfumo wako kisha uonyeshe upya ukurasa huu.}other{Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama kilikwisha muda siku # zilizopita. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako. Saa ya kompyuta kwa sasa imewekwa kuwa <ph name="CURRENT_DATE" />. Je, hiyo ni sahihi? Ikiwa si sahihi, rekebisha saa ya mfumo wako kisha uonyeshe upya ukurasa huu.}}</translation> <translation id="1676269943528358898">Kwa kawaida <ph name="SITE" /> hutumia usimbaji fiche ili kulinda maelezo yako. Google Chrome ilipojaribu kuunganisha kwenye <ph name="SITE" /> wakati huu, tovuti ilituma kitambulisho kisicho cha kawaida na kisicho sahihi. Hili linaweza kutokea mvamizi anapojaribu kujifanya kuwa <ph name="SITE" />, au uchanganuzi wa kuingia katika Wi-Fi umeingilia muunganisho. Maelezo yako yangali salama kwa sababu Google Chrome ilisimamisha muunganisho kabla data yoyote itumwe.</translation> <translation id="168841957122794586">Cheti cha seva kina kitufe dhaifu cha kifichua msimbo.</translation> <translation id="1706954506755087368">{1,plural, =1{Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama kitakwisha muda kuanzia kesho. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako.}other{Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama kitakwisha muda kuanzia siku # zijazo. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Kuwasiliana na msimamizi wa mfumo.</translation> <translation id="17513872634828108">Vichupo vilivyo wazi</translation> <translation id="1753706481035618306">Nambari ya ukurasa</translation> <translation id="1763864636252898013">Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama hakiaminiwi na mfumo wa uendeshaji wa kifaa chako. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proksi imewekwa katika usanidi otomatiki.</translation> <translation id="2025623846716345241">Thibitisha Upakiaji Upya</translation> <translation id="2030481566774242610">Je, ulimaanisha <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Kuangalia seva mbadala na kinga-mtandao<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Msimbo wa eneo</translation> <translation id="2065985942032347596">Uthibitishaji Unahitajika</translation> <translation id="2079545284768500474">Tendua</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Sera haikupatikana</translation> <translation id="2213606439339815911">Inachukua viingizo...</translation> <translation id="2214283295778284209"><ph name="SITE" /> haipatikani</translation> +<translation id="2227695659599072496">Kuangalia kebo au kisambaza data cha mtandao</translation> +<translation id="2230458221926704099">Weka muunganisho wako kwa kutumia <ph name="BEGIN_LINK" />programu ya kuchunguza<ph name="END_LINK" /></translation> <translation id="225207911366869382">Thamani hii inapingwa kwa sera hii.</translation> <translation id="2262243747453050782">Hitilfau ya HTTP</translation> <translation id="2279770628980885996">Hali isiyotarajiwa ilishuhudiwa wakati seva ilipokuwa ikijaribu kutimiza ombi.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Kichanganuzi cha JSON</translation> <translation id="2495093607237746763">Ikitiwa tiki, Chromium itahifadhi nakala ya kadi yako kwenye kifaa hiki kwa ajili ya kujaza fomu haraka zaidi.</translation> <translation id="2498091847651709837">Changanua kadi mpya</translation> +<translation id="2515629240566999685">Kuangalia mawimbi katika eneo lako</translation> <translation id="2516305470678292029">UI Mbadala</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> imetuma jibu ambalo si sahihi.</translation> <translation id="2552545117464357659">Mpya zaidi</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Alamisha ukurasa huu</translation> <translation id="3270847123878663523">Tendua Kupanga upya</translation> <translation id="3286538390144397061">Zima na uwashe sasa</translation> +<translation id="3288003805934695103">Kupakia upya ukurasa</translation> <translation id="3305707030755673451">Data yako ilisimbwa kwa njia fiche kwa kauli yako ya siri ya kusawazisha mnamo <ph name="TIME" />. Iweke ili uanze kusawazisha.</translation> <translation id="333371639341676808">Zuia ukurasa huu usiulize maswali zaidi.</translation> <translation id="3340978935015468852">mipangilio</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Inapakia...</translation> <translation id="3712624925041724820">Leseni zimekwisha</translation> +<translation id="3714780639079136834">Kuwasha data ya kifaa cha mkononi au Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Jaribu kuangalia seva mbadala, kinga-mtandao, na uwekaji mipangilio ya DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Kiungo ulichonakili</translation> <translation id="3744899669254331632">Huwezi kutembelea <ph name="SITE" /> sasa hivi kwa sababu tovuti ilituma kitambulisho kilichoharibika ambacho Chromium haiwezi kuchakata. Hitilafu na uvamizi wa mtandao kwa kawaida huwa vya muda, kwa hivyo ukurasa huu huenda utafanya kazi baadaye.</translation> <translation id="3748412725338508953">Kuelekezwa upya kumekuwa kwingi zaidi.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Hali ya Usomaji</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> imezuiwa.</translation> <translation id="4021036232240155012">DNS ni huduma za mtandao ambazo hubadilisha jina la tovuti kuwa anwani yake ya Intaneti.</translation> +<translation id="4021376465026729077">Kuzima viendelezi vyako</translation> <translation id="4030383055268325496">Tendua kuongeza</translation> <translation id="4032534284272647190">Ufikiaji katika <ph name="URL" /> umekataliwa.</translation> <translation id="404928562651467259">ONYO</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Sahihi mbaya ya uthibitishaji</translation> <translation id="4176463684765177261">Kimelemazwa</translation> <translation id="4196861286325780578">Rudia hatua</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kuangalia uwekaji mipangilio ya kinga-mtandao na kinga-virusi<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Mivurugo</translation> <translation id="4250680216510889253">La</translation> <translation id="4258748452823770588">Sahihi mbaya</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">Matumizi ya proksi yamelemazwa lakini usanidi wa proksi wazi umebainishwa.</translation> <translation id="4492190037599258964">Matokeo ya utafutaji wa '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Hitilafu ya uthibitishaji: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Kuwasiliana na msimamizi wa mfumo</translation> <translation id="450710068430902550">Kushiriki na Msimamizi</translation> <translation id="4522570452068850558">Maelezo</translation> <translation id="4535734014498033861">Muunganisho wa seva ya proksi ulishindikana.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">Kuhusu Google Tafsiri</translation> <translation id="5040262127954254034">Faragha</translation> <translation id="5045550434625856497">Nenosiri lisilo sahihi</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kuangalia anwani mbadala<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Cheti cha seva si sahihi kwa sasa.</translation> <translation id="5089810972385038852">Jimbo</translation> <translation id="5094747076828555589">Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama hakiaminiwi na Chromium. Hii inaweza kusababishwa na kusanidi kusikofaa au mvamizi kuingilia muunganisho wako.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Thibitisha unataka kuondoka</translation> <translation id="5299298092464848405">Hitilafu wakati wa kuchanganua sera</translation> <translation id="5300589172476337783">Onyesha</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Kufuta vidakuzi vyako<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Kuripoti uharibifu kumelemazwa.</translation> <translation id="5317780077021120954">Hifadhi</translation> <translation id="5327248766486351172">Jina</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Pakia upya</translation> <translation id="5565735124758917034">Inatumika</translation> <translation id="560412284261940334">Usimamizi hautumiki</translation> +<translation id="5610142619324316209">Kuangalia muunganisho</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> imekuelekeza upya mara nyingi mno.</translation> <translation id="5629630648637658800">Imeshindwa kupakia mipangilio ya sera</translation> <translation id="5631439013527180824">Ishara ya usimamizi wa kifaa batili</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Kadi yako imethibitishwa</translation> <translation id="6146055958333702838">Angalia kebo zozote na uwashe tena kisambaza data, modemu, au vifaa vingine vyovyote vya mtandao ambavyo huenda unavitumia.</translation> +<translation id="614940544461990577">Jaribu:</translation> <translation id="6151417162996330722">Cheti cha seva kina muda sahihi ambao ni mrefu sana.</translation> <translation id="6154808779448689242">Ishara ya sera iliyorejeshwa hailingani na ishara ya sasa</translation> <translation id="6165508094623778733">Pata maelezo zaidi</translation> @@ -476,11 +493,13 @@ <translation id="6628463337424475685">Utafutaji wa <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Huwezi kutembelea <ph name="SITE" /> sasa hivi kwa sababu <ph name="BEGIN_LINK" />cheti hiki kimebatilishwa<ph name="END_LINK" />. Hitilafu na uvamizi wa mtandao kwa kawaida huwa wa muda, kwa hivyo ukurasa huu huenda utafanya kazi baadaye.</translation> <translation id="6637478299472506933">Upakuaji Umeshindwa</translation> +<translation id="6642894344118208103">Kuweka upya modemu au kisambaza data</translation> <translation id="6644283850729428850">Sera hii imepingwa.</translation> <translation id="6646897916597483132">Weka CVC yenye tarakimu 4 kutoka mbele ya kadi yako</translation> <translation id="6656103420185847513">Badilisha Folda</translation> <translation id="6660210980321319655">Imeripoti kiotomatiki <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Je, ungependa kuondoa pendekezo la fomu kwenye Chromium?</translation> +<translation id="6685834062052613830">Ondoka na ukamilishe kuweka mipangilio</translation> <translation id="6710213216561001401">Iliyotangulia</translation> <translation id="6711464428925977395">Kuna hitilafu katika seva mbadala, au anwani siyo sahihi.</translation> <translation id="674375294223700098">Hitilafu isiyojulikana ya cheti cha seva.</translation> @@ -515,6 +534,7 @@ <translation id="7052500709156631672">Lango au seva mbadala ilipokea jibu batili kutoka kwenye seva ya mkondo wa juu.</translation> <translation id="7087282848513945231">Nchi</translation> <translation id="7088615885725309056">Za awali</translation> +<translation id="7090678807593890770">Tafuta kwenye Google upate <ph name="LINK" /></translation> <translation id="7108649287766967076">Tafsiri kwenda <ph name="TARGET_LANGUAGE" /> imeshindwa.</translation> <translation id="7139724024395191329">Emirate</translation> <translation id="7179921470347911571">Zindua upya Sasa</translation> @@ -607,6 +627,7 @@ <translation id="8034955203865359138">Hakuna maingizo ya historia yaliyopatikana.</translation> <translation id="8088680233425245692">Haikufaulu kuangalia makala.</translation> <translation id="8091372947890762290">Uwashaji unasubiri kwenye seva</translation> +<translation id="8134994873729925007"><ph name="BEGIN_ABBR" />Anwani ya DNS <ph name="END_ABBR" /> ya seva ya <ph name="HOST_NAME" /> haikupatikana.</translation> <translation id="8149426793427495338">Kompyuta yako iko katika hali tuli.</translation> <translation id="8150722005171944719">Faili katika <ph name="URL" /> haisomeki. Huenda imeondolewa, kusogezwa, au idhini za faili huenda zinazuia ufikiaji.</translation> <translation id="8194797478851900357">Tendua hatua</translation> @@ -634,6 +655,7 @@ <translation id="8311778656528046050">Je, una uhakika kuwa unataka kuupakia upya ukurasa huu?</translation> <translation id="8332188693563227489">Ufikiaji wa <ph name="HOST_NAME" /> umekataliwa</translation> <translation id="8349305172487531364">Sehemu ya Alamisho</translation> +<translation id="8363502534493474904">Kuzima hali ya ndegeni</translation> <translation id="8364627913115013041">Haijawekwa.</translation> <translation id="8412145213513410671">Mivurugo ( <ph name="CRASH_COUNT" /> )</translation> <translation id="8412392972487953978">Lazima uingize kaulisiri ile ile mara mbili.</translation> @@ -691,6 +713,7 @@ <translation id="901974403500617787">Alama zinazotumika katika mfumo mzima zinaweza kuwekwa na mmiliki pekee: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Seva ilikataa muunganisho.</translation> <translation id="9020542370529661692">Ukurasa huu umetafsiriwa kwenda <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Tumia huduma ya kutabiri ili upakie kurasa kwa haraka zaidi</translation> <translation id="9039213469156557790">Mbali na hayo, ukurasa huu una rasilimali nyingine zisizo salama. Rasilimali hizi zinaweza kuangaliwa na watu wengine wanaosafiri, na zinaweza kurekebishwa na mvamizi kubadilisha tabia ya ukurasa.</translation> <translation id="9049981332609050619">Ulijaribu kufikia <ph name="DOMAIN" />, lakini seva iliwasilisha cheti batili.</translation> <translation id="9050666287014529139">Kaulisiri</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 2bae7bf..8a66ada 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -25,6 +25,7 @@ <translation id="1150979032973867961">இது <ph name="DOMAIN" /> தான் என்பதை இந்தச் சேவையகம் உறுதிப்படுத்தவில்லை; இதன் பாதுகாப்புச் சான்றிதழை உங்கள் கணினியின் இயக்க முறைமை நம்பவில்லை. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation> <translation id="1152921474424827756"><ph name="URL" /> இன் <ph name="BEGIN_LINK" />உருவாக்கத்திற்கான தற்காலிகச் சேமிப்பு நகலை<ph name="END_LINK" /> அணுகவும்</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> எதிர்பாராத விதமாக இணைப்பை நிறுத்தியது.</translation> +<translation id="1161325031994447685">வைஃபையுடன் மீண்டும் இணைத்தல்</translation> <translation id="1175364870820465910">&அச்சிடு...</translation> <translation id="1181037720776840403">அகற்று</translation> <translation id="1195447618553298278">தெரியாத பிழை.</translation> @@ -66,12 +67,14 @@ <translation id="1640180200866533862">பயனர் கொள்கைகள்</translation> <translation id="1644184664548287040">பிணைய உள்ளமைவு தவறானது மேலும் அதை இறக்குமதி செய்ய முடியவில்லை.</translation> <translation id="1644574205037202324">வரலாறு</translation> +<translation id="1645368109819982629">ஆதரிக்கப்படாத நெறிமுறை</translation> <translation id="1655462015569774233">{1,plural, =1{இந்தச் சேவையகம் தான் <ph name="DOMAIN" /> என்பதை நிரூபிக்க முடியவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் நேற்று காலாவதியானது. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம். உங்கள் கணினியின் கடிகாரம் தற்போது <ph name="CURRENT_DATE" /> என அமைக்கப்பட்டுள்ளது. அது சரியாக இருக்கிறதா? இல்லை என்றால், உங்கள் முறைமையின் கடிகாரத்தைச் சரிசெய்து, பின்னர் இந்தப் பக்கத்தைப் புதுப்பிக்க வேண்டும்.}other{இந்தச் சேவையகம் தான் <ph name="DOMAIN" /> என்பதை நிரூபிக்க முடியவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் # நாட்களுக்கு முன்பு காலாவதியானது. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம். உங்கள் கணினியின் கடிகாரம் தற்போது <ph name="CURRENT_DATE" /> என அமைக்கப்பட்டுள்ளது. அது சரியாக இருக்கிறதா? இல்லை என்றால், உங்கள் முறைமையின் கடிகாரத்தைச் சரிசெய்து, பின்னர் இந்தப் பக்கத்தைப் புதுப்பிக்க வேண்டும்.}}</translation> <translation id="1676269943528358898">வழக்கமாக, <ph name="SITE" /> உங்கள் தகவலைப் பாதுகாப்பதற்காக முறைமையாக்கத்தைப் பயன்படுத்துகிறது. இந்த முறை <ph name="SITE" /> உடன் இணைவதற்கு Google Chrome முயற்சித்தபோது வழக்கத்திற்கு மாறான மற்றும் தவறான நற்சான்றிதழ்களை இணையதளம் வழங்கியது. தாக்குபவர் தன்னை <ph name="SITE" /> ஆகக் காட்ட முயற்சிக்கும் போது அல்லது இணைப்பை வைஃபை உள்நுழைவுத் திரை குறுக்கிடும் போது இது ஏற்படலாம். இருப்பினும், தரவு எதுவும் பரிமாற்றப்படுவதற்கு முன் Google Chrome இணைப்பை நிறுத்தியதால் உங்கள் தகவல் பாதுகாப்பாகவே இருக்கிறது.</translation> <translation id="168841957122794586">சேவையக சான்றிதழில் வலுவற்ற குறியீட்டாக்க விசை இருக்கிறது.</translation> <translation id="1706954506755087368">{1,plural, =1{இந்தச் சேவையகம் தான் <ph name="DOMAIN" /> என்பதை நிரூபிக்க முடியவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் நாளை முதலே செல்லுபடியாகும். இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.}other{இந்தச் சேவையகம் தான் <ph name="DOMAIN" /> என்பதை நிரூபிக்க முடியவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் எதிர்காலத்தில் # நாட்களில் ஏற்றுக்கொள்ளப்படும். இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">கணினி நிர்வாகியைத் தொடர்புகொள்ள முயலவும்</translation> <translation id="17513872634828108">தாவல்களைத் திற</translation> <translation id="1753706481035618306">பக்க எண்</translation> <translation id="1763864636252898013">இது <ph name="DOMAIN" /> தான் என்பதை இந்தச் சேவையகம் உறுதிப்படுத்தவில்லை; இதன் பாதுகாப்புச் சான்றிதழை உங்கள் சாதனத்தின் இயக்க முறைமை நம்பவில்லை. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation> @@ -93,6 +96,7 @@ <translation id="2025186561304664664">ப்ராக்ஸி, தானியங்கி உள்ளமைவுக்கு அமைக்கப்பட்டுள்ளது</translation> <translation id="2025623846716345241">மீண்டும் ஏற்றுவதை உறுதிபடுத்தவும்</translation> <translation id="2030481566774242610"><ph name="LINK" /> ஐக் குறிப்பிடுகிறீர்களா?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />ப்ராக்ஸி மற்றும் ஃபயர்வாலைச் சரிபார்த்தல்<ph name="END_LINK" /></translation> <translation id="2053553514270667976">ஜிப் குறியீடு</translation> <translation id="2065985942032347596">அங்கீகாரம் தேவைப்படுகிறது</translation> <translation id="2079545284768500474">செயல்தவிர்</translation> @@ -117,6 +121,8 @@ <translation id="2212735316055980242">கொள்கை காணப்படவில்லை</translation> <translation id="2213606439339815911">உள்ளீடுகளைப் பெறுகிறது...</translation> <translation id="2214283295778284209"><ph name="SITE" /> கிடைக்கவில்லை</translation> +<translation id="2227695659599072496">நெட்வொர்க் கேபிள் அல்லது ரூட்டரைச் சரிபார்த்தல்</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />கண்டறியும் பயன்பாட்டைப்<ph name="END_LINK" /> பயன்படுத்தி இணைப்பைச் சரிசெய்யவும்</translation> <translation id="225207911366869382">இந்த கொள்கைக்கான மதிப்பு தடுக்கப்பட்டது.</translation> <translation id="2262243747453050782">HTTP பிழை</translation> <translation id="2279770628980885996">சேவையகம் கோரிக்கையை நிறைவு செய்ய முயற்சித்தபோது, ஒரு எதிர்பாராத நிலைமை ஏற்பட்டது.</translation> @@ -144,6 +150,7 @@ <translation id="2495083838625180221">JSON பார்சர்</translation> <translation id="2495093607237746763">இது தேர்ந்தெடுக்கப்பட்டால், விரைவாகப் படிவத்தை நிரப்ப, உங்கள் கார்டின் நகலை Chromium இந்தச் சாதனத்தில் சேமிக்கும்.</translation> <translation id="2498091847651709837">புதிய கார்டை ஸ்கேன்செய்</translation> +<translation id="2515629240566999685">உங்கள் பகுதியில் உள்ள சிக்னலைச் சரிபார்த்தல்</translation> <translation id="2516305470678292029">UI மாற்றுகள்</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> தவறான பதிலை அனுப்பியது.</translation> <translation id="2552545117464357659">புதியது</translation> @@ -215,6 +222,8 @@ <translation id="3254409185687681395">இந்தப் பக்கத்தை புக்மார்க் செய்க</translation> <translation id="3270847123878663523">&மறுவரிசைப்படுத்தலைச் செயல்தவிர்</translation> <translation id="3286538390144397061">இப்போது மறுதொடக்கம் செய்க</translation> +<translation id="3288003805934695103">பக்கத்தை மீண்டும் ஏற்றுதல்</translation> +<translation id="3305707030755673451"><ph name="TIME" /> அன்று உங்கள் தரவு உங்கள் ஒத்திசைவு கடவுச்சொற்றொடரைக் கொண்டு முறைமையாக்கப்பட்டது. ஒத்திசைவைத் தொடங்க, அதை உள்ளிடவும்.</translation> <translation id="333371639341676808">இந்த பக்கம் கூடுதல் உரையாடல்களை உருவாக்குவதைத் தடு.</translation> <translation id="3340978935015468852">அமைப்புகள்</translation> <translation id="3355823806454867987">ப்ராக்ஸி அமைப்புகளை மாற்றுக...</translation> @@ -257,6 +266,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">நினைவேறுகிறது...</translation> <translation id="3712624925041724820">உரிமம் முடிந்தது</translation> +<translation id="3714780639079136834">மொபைல் தரவு அல்லது வைஃபையை இயக்குதல்</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />ப்ராக்ஸி, ஃபயர்வால் மற்றும் DNS உள்ளமைவைச் சரிபார்த்தல்<ph name="END_LINK" /></translation> <translation id="3739623965217189342">நீங்கள் நகலெடுத்த இணைப்பு</translation> <translation id="3744899669254331632">இணையதளம் Chromium ஆல் செயல்படுத்த முடியாத தவறான நற்சான்றுகளை அனுப்பியுள்ளதால், இப்போது <ph name="SITE" />ஐப் பார்வையிட முடியாது. பொதுவாக நெட்வொர்க் பிழைகளும் தாக்குதல்களும் தற்காலிகமாகவே இருக்கும், சிறிதுநேரம் கழித்து இந்தப் பக்கம் சரியாகச் செயல்படலாம்.</translation> <translation id="3748412725338508953">அதிக எண்ணிக்கையிலான மாற்று வழிகள் இருந்தன.</translation> @@ -278,6 +289,7 @@ <translation id="3963721102035795474">படித்தல் பயன்முறை</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> தடுக்கப்பட்டுள்ளது</translation> <translation id="4021036232240155012">DNS என்பது இணையதளத்தின் பெயரை அதன் இணைய முகவரியாக மாற்றும் நெட்வொர்க் சேவையாகும்.</translation> +<translation id="4021376465026729077">உங்கள் நீட்டிப்புகளை முடக்குதல்</translation> <translation id="4030383055268325496">&சேர்த்தலைச் செயல்தவிர்</translation> <translation id="4032534284272647190"><ph name="URL" /> க்கான அணுகல் மறுக்கப்பட்டது.</translation> <translation id="404928562651467259">எச்சரிக்கை</translation> @@ -294,6 +306,7 @@ <translation id="4171400957073367226">தவறான சரிபார்ப்பு கையொப்பம்</translation> <translation id="4176463684765177261">முடக்கப்பட்டது</translation> <translation id="4196861286325780578">&நகர்த்தலை மீண்டும் செய்</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ஃபயர்வால் மற்றும் வைரஸ் தடுப்பு உள்ளமைவைச் சரிபார்த்தல்<ph name="END_LINK" /></translation> <translation id="4220128509585149162">செயலிழப்புகள்</translation> <translation id="4250680216510889253">இல்லை</translation> <translation id="4258748452823770588">தவறான கையொப்பம்</translation> @@ -314,6 +327,7 @@ <translation id="443673843213245140">ப்ராக்ஸி பயன்பாடு முடக்கப்பட்டுள்ளது. ஆனால் வெளிப்படையான ப்ராக்ஸி உள்ளமைவு குறிப்பிடப்பட்டுள்ளது.</translation> <translation id="4492190037599258964"><ph name="SEARCH_STRING" />' க்கானத் தேடல் முடிவுகள்</translation> <translation id="4506176782989081258">சரிபார்ப்புப் பிழை: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">கணினி நிர்வாகியைத் தொடர்புகொள்ளுதல்</translation> <translation id="450710068430902550">நிர்வாகியுடன் பகிர்பவை</translation> <translation id="4522570452068850558">விவரங்கள்</translation> <translation id="4535734014498033861">ப்ராக்சி சேவையக இணைப்பு தோல்வியுற்றது.</translation> @@ -351,6 +365,7 @@ <translation id="5031870354684148875">Google மொழியாக்கம் ஓர் அறிமுகம்</translation> <translation id="5040262127954254034">தனியுரிமை</translation> <translation id="5045550434625856497">தவறான கடவுச்சொல்</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />ப்ராக்ஸி முகவரியைச் சரிபார்த்தல்<ph name="END_LINK" /></translation> <translation id="5087286274860437796">தற்போது சேவையகத்தின் சான்றிதழ் செல்லுபடியாகாது.</translation> <translation id="5089810972385038852">மாநிலம்</translation> <translation id="5094747076828555589">இது <ph name="DOMAIN" /> தான் என்பதை இந்தச் சேவையகம் உறுதிப்படுத்தவில்லை; இதன் பாதுகாப்புச் சான்றிதழை Chromium நம்பவில்லை. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation> @@ -369,6 +384,7 @@ <translation id="5295309862264981122">வழிசெலுத்துதலை உறுதிசெய்க</translation> <translation id="5299298092464848405">கொள்கையை அலசுவதில் பிழை</translation> <translation id="5300589172476337783">காண்பி</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />உங்கள் குக்கீகளை அழித்தல்<ph name="END_LINK" /></translation> <translation id="5308689395849655368">செயலிழப்பு புகாரளித்தல் முடக்கப்பட்டுள்ளது.</translation> <translation id="5317780077021120954">சேமி</translation> <translation id="5327248766486351172">பெயர்</translation> @@ -396,6 +412,7 @@ <translation id="5556459405103347317">மீண்டும் ஏற்று</translation> <translation id="5565735124758917034">செயலில் உள்ளது</translation> <translation id="560412284261940334">நிர்வாகம் ஆதரிக்கவில்லை</translation> +<translation id="5610142619324316209">இணைப்பைச் சரிபார்த்தல்</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> உங்களைப் பலமுறை திசைதிருப்பம் செய்தது.</translation> <translation id="5629630648637658800">கொள்கை அமைப்புகளை ஏற்றுவதில் தோல்வி</translation> <translation id="5631439013527180824">தவறான சாதன நிர்வாக டோக்கன்</translation> @@ -427,6 +444,7 @@ <translation id="6060685159320643512">கவனம், இந்த சோதனைகள் பாதிப்பை ஏற்படுத்தலாம்</translation> <translation id="6093795393556121384">கார்டு சரிபார்க்கப்பட்டது</translation> <translation id="6146055958333702838">கேபிள்களைச் சரிபார்த்து, நீங்கள் பயன்படுத்தக்கூடிய ரூட்டர்கள், மோடம்கள் அல்லது பிற நெட்வொர்க் சாதனங்களை மறுதொடக்கம் செய்யவும்.</translation> +<translation id="614940544461990577">இவற்றைச் செய்து பார்க்கவும்:</translation> <translation id="6151417162996330722">சேவை சான்றிதழ் நீண்ட செல்லுபடிக் காலத்தைக் கொண்டுள்ளது.</translation> <translation id="6154808779448689242">கிடைத்த கொள்கை டோக்கன், தற்போதுள்ள டோக்கனுடன் பொருந்தவில்லை</translation> <translation id="6165508094623778733">மேலும் அறிக</translation> @@ -467,11 +485,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> தேடல்</translation> <translation id="6634865548447745291">இப்போது <ph name="SITE" /> ஐப் பார்வையிட முடியாது, ஏனெனில் <ph name="BEGIN_LINK" />இந்தச் சான்றிதழ் திரும்பப் பெறப்பட்டுள்ளது<ph name="END_LINK" />. நெட்வொர்க் பிழைகள் மற்றும் தாக்குதல்கள் தற்காலிகமானவையாகும், எனவே இந்தப் பக்கம் சிறிது நேரம் கழித்து செயல்படும்.</translation> <translation id="6637478299472506933">பதிவிறக்கம் தோல்வியானது</translation> +<translation id="6642894344118208103">மோடம் அல்லது ரூட்டரை மீட்டமைத்தல்</translation> <translation id="6644283850729428850">இந்தக் கொள்கை தவிர்க்கப்பட்டது.</translation> <translation id="6646897916597483132">கார்டின் முன்புறமுள்ள, 4 இலக்க CVCஐ உள்ளிடவும்</translation> <translation id="6656103420185847513">கோப்புறையைத் திருத்து</translation> <translation id="6660210980321319655">தானாக அறிவிக்கப்பட்டது: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Chromium இலிருந்து படிவப் பரிந்துரையை அகற்றவா?</translation> +<translation id="6685834062052613830">வெளியேறி, அமைப்பை முடிக்கவும்</translation> <translation id="6710213216561001401">முந்தையது</translation> <translation id="6711464428925977395">ப்ராக்ஸி சர்வரில் ஏதோ தவறு உள்ளது அல்லது முகவரி தவறாக உள்ளது.</translation> <translation id="674375294223700098">தெரியாத சேவையகச் சான்றிதழ் பிழை.</translation> @@ -505,6 +525,7 @@ <translation id="7052500709156631672">ஒரு அப்ஸ்ட்ரீம் சேவையகத்திலிருந்து கேட்வே அல்லது ப்ராக்ஸி சேவையகம் செல்லாத மறுமொழியைப் பெற்றது.</translation> <translation id="7087282848513945231">மாகாணம்</translation> <translation id="7088615885725309056">பழையவை</translation> +<translation id="7090678807593890770">Google இல் <ph name="LINK" />ஐத் தேடவும்</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" /> க்கான மொழிபெயர்ப்பு தோல்வியடைந்தது.</translation> <translation id="7139724024395191329">எமிரேட்</translation> <translation id="7179921470347911571">இப்போது மீண்டும் தொடங்கு</translation> @@ -597,6 +618,7 @@ <translation id="8034955203865359138">வரலாறு உள்ளீடுகள் இல்லை.</translation> <translation id="8088680233425245692">கட்டுரையைக் காட்டுவதில் தோல்வி.</translation> <translation id="8091372947890762290">சேவையகத்தில் செயலாக்கம் நிலுவையிலுள்ளது</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> இன் சேவையக <ph name="BEGIN_ABBR" />DNS முகவரியைக்<ph name="END_ABBR" /> கண்டுபிடிக்க முடியவில்லை.</translation> <translation id="8149426793427495338">உங்கள் கணினி உறக்கநிலைக்குச் சென்றது.</translation> <translation id="8150722005171944719"><ph name="URL" /> இல் உள்ள கோப்பு படிக்கக் கூடியதாக இல்லை. அது அகற்றப்பட்டிருக்கலாம், நகர்த்தப்பட்டிருக்கலாம் அல்லது கோப்பு அனுமதிகள் அணுகலைத் தடுத்திருக்கலாம்.</translation> <translation id="8194797478851900357">&நகர்த்தலைச் செயல்தவிர்</translation> @@ -620,6 +642,7 @@ <translation id="8311778656528046050">இந்தப் பக்கத்தை நிச்சயமாக மீண்டும் ஏற்றவா?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> க்கான அணுகல் மறுக்கப்பட்டது</translation> <translation id="8349305172487531364">புக்மார்க் பட்டி</translation> +<translation id="8363502534493474904">விமானப் பயன்முறையை முடக்குதல்</translation> <translation id="8364627913115013041">அமைக்கப்படவில்லை.</translation> <translation id="8412145213513410671">செயலிழப்புகள் (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">நீங்கள் கண்டிப்பாக ஒரே கடவுச்சொற்றொடரை இரு முறை உள்ளிட வேண்டும்.</translation> @@ -677,6 +700,7 @@ <translation id="901974403500617787">கணினி அளவில் பயன்படுத்தப்படும் கொடிகள் பின்வரும் உரிமையாளரால் மட்டுமே அமைக்கப்படும்: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">சேவையகம் இணைப்பை மறுத்துவிட்டது.</translation> <translation id="9020542370529661692">இந்தப் பக்கம் <ph name="TARGET_LANGUAGE" /> க்கு மொழிபெயர்க்கப்பட்டது</translation> +<translation id="9038649477754266430">பக்கங்களை இன்னும் விரைவாக ஏற்ற, யூக சேவையொன்றைப் பயன்படுத்தவும்</translation> <translation id="9039213469156557790">மேலும், பாதுகாப்பற்ற பிற ஆதாரங்கள் இந்தப் பக்கத்தில் உள்ளன. இந்த ஆதாரங்களை ட்ரான்ஸிட்டில் இருக்கும்போதும் பிறர் பார்வையிடலாம், மேலும் பக்கத்தின் செயல்பாட்டை மாற்ற, தீங்கிழைப்பவர் அதை மாற்றியமைக்கலாம்.</translation> <translation id="9049981332609050619">நீங்கள் <ph name="DOMAIN" /> ஐ அடைய முயற்சி செய்தீர்கள், ஆனால் சேவையகம் ஒரு செல்லாத சான்றிதழை வழங்கியது.</translation> <translation id="9050666287014529139">கடவுச்சொற்றொடர்</translation> @@ -691,6 +715,7 @@ <translation id="9170848237812810038">&செயல்தவிர்</translation> <translation id="917450738466192189">சேவையகச் சான்றிதழ் செல்லுபடியானதல்ல.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> ஆதரிக்கப்படாத நெறிமுறையைப் பயன்படுத்துகிறது.</translation> +<translation id="9205078245616868884">உங்கள் தரவு உங்கள் ஒத்திசைவு கடவுச்சொற்றொடரைக் கொண்டு முறைமையாக்கப்பட்டுள்ளது. ஒத்திசைவைத் தொடங்க, அதை உள்ளிடவும்.</translation> <translation id="9207861905230894330">கட்டுரையைச் சேர்ப்பதில் தோல்வி.</translation> <translation id="933612690413056017">இணைய இணைப்பு இல்லை</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 35cbaf66..41fda489 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">ఈ సర్వర్ <ph name="DOMAIN" /> అని నిరూపించుకోలేకపోయింది; దీని భద్రతా ప్రమాణపత్రాన్ని మీ కంప్యూటర్ ఆపరేటింగ్ సిస్టమ్ విశ్వసించలేదు. ఇది తప్పుగా కాన్ఫిగర్ చేయడం వలన లేదా దాడిచేసే వ్యక్తి మీ కనెక్షన్కి అంతరాయం కలిగించడం వలన జరిగి ఉండవచ్చు.</translation> <translation id="1152921474424827756"><ph name="URL" /> యొక్క <ph name="BEGIN_LINK" />కాష్ చేయబడిన కాపీ<ph name="END_LINK" />ని ప్రాప్యత చేయండి</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ఊహించని విధంగా కనెక్షన్ను మూసివేసింది.</translation> +<translation id="1161325031994447685">Wi-Fiకి మళ్లీ కనెక్ట్ చేస్తోంది</translation> <translation id="1175364870820465910">&ముద్రించు...</translation> <translation id="1181037720776840403">తొలగించు</translation> <translation id="1195447618553298278">తెలియని లోపం.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">వినియోగదారు విధానాలు</translation> <translation id="1644184664548287040">నెట్వర్క్ కాన్ఫిగరేషన్ చెల్లదు మరియు దిగుమతి చేయడం సాధ్యం కాదు.</translation> <translation id="1644574205037202324">చరిత్ర</translation> +<translation id="1645368109819982629">ప్రోటోకాల్కు మద్దతు లేదు</translation> <translation id="1655462015569774233">{1,plural, =1{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం గడువు నిన్న ముగిసింది. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు. మీ కంప్యూటర్ గడియారం ప్రస్తుతం <ph name="CURRENT_DATE" />కి సెట్ చేయబడింది. అది సరిగ్గా ఉందా? సరిగ్గా లేకుంటే, మీరు సిస్టమ్ గడియారాన్ని సరిచేసి, ఆపై ఈ పేజీని రీఫ్రెష్ చేయాలి.}other{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం గడువు # రోజుల క్రితం ముగిసింది. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు. మీ కంప్యూటర్ గడియారం ప్రస్తుతం <ph name="CURRENT_DATE" />కి సెట్ చేయబడింది. అది సరిగ్గా ఉందా? సరిగ్గా లేకుంటే, మీరు సిస్టమ్ గడియారాన్ని సరిచేసి, ఆపై ఈ పేజీని రీఫ్రెష్ చేయాలి.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> సాధారణంగా మీ సమాచారాన్ని రక్షించడానికి గుప్తీకరణను ఉపయోగిస్తుంది. Google Chrome ఈసారి <ph name="SITE" />కి కనెక్ట్ చేయడానికి ప్రయత్నించినప్పుడు, వెబ్సైట్ అసాధారణ మరియు తప్పు ఆధారాలు అని ప్రతిస్పందించింది. దాడి చేసే వ్యక్తి <ph name="SITE" />గా వ్యవహరించి మోసగించడానికి ప్రయత్నిస్తున్నప్పుడు లేదా Wi-Fi సైన్-ఇన్ స్క్రీన్ కనెక్షన్కు అంతరాయం కలిగించినప్పుడు ఇలా జరగవచ్చు. Google Chrome డేటా వినిమయం సంభవించక ముందే కనెక్షన్ను ఆపివేసినందున మీ సమాచారం ఇప్పటికీ సురక్షితంగానే ఉంది.</translation> <translation id="168841957122794586">సర్వర్ ప్రమాణపత్రం బలహీన క్రిప్టోగ్రాఫిక్ కీని కలిగి ఉంది.</translation> <translation id="1706954506755087368">{1,plural, =1{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం రేపటిది కావచ్చు. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు.}other{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం భవిష్యత్తులో # రోజుల తదుపరిది కావచ్చు. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">సిస్టమ్ నిర్వాహకుడిని సంప్రదించి ప్రయత్నించండి.</translation> <translation id="17513872634828108">తెరిచిన ట్యాబ్లు</translation> <translation id="1753706481035618306">పేజీ సంఖ్య</translation> <translation id="1763864636252898013">ఈ సర్వర్ <ph name="DOMAIN" /> అని నిరూపించుకోలేకపోయింది; దీని భద్రతా ప్రమాణపత్రాన్ని మీ పరికర ఆపరేటింగ్ సిస్టమ్ విశ్వసించలేదు. ఇది తప్పుగా కాన్ఫిగర్ చేయడం వలన లేదా దాడిచేసే వ్యక్తి మీ కనెక్షన్కి అంతరాయం కలిగించడం వలన జరిగి ఉండవచ్చు.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">ప్రాక్సీ స్వయంచాలకంగా కాన్ఫిగర్ చేయబడేలా సెట్ చేయబడింది.</translation> <translation id="2025623846716345241">మళ్లీ లోడ్ చేయడాన్ని నిర్ధారించు</translation> <translation id="2030481566774242610">మీ ఉద్దేశ్యం <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />ప్రాక్సీ మరియు ఫైర్వాల్ను తనిఖీ చేయడం<ph name="END_LINK" /></translation> <translation id="2053553514270667976">జిప్ కోడ్</translation> <translation id="2065985942032347596">ప్రామాణీకరణ అవసరం</translation> <translation id="2079545284768500474">అన్డు</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">విధానం కనుగొనబడలేదు</translation> <translation id="2213606439339815911">నమోదులను పొందుతోంది...</translation> <translation id="2214283295778284209"><ph name="SITE" /> అందుబాటులో లేదు</translation> +<translation id="2227695659599072496">నెట్వర్క్ కేబుల్ లేదా రూటర్ను తనిఖీ చేయడం</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />విశ్లేషణల అనువర్తనాన్ని<ph name="END_LINK" /> ఉపయోగించి మీ కనెక్షన్ను సరి చేయండి</translation> <translation id="225207911366869382">ఈ విధానం కోసం ఈ విలువ తగ్గించబడింది.</translation> <translation id="2262243747453050782">HTTP లోపం</translation> <translation id="2279770628980885996">అభ్యర్థనను పూర్తి చెయ్యడానికి ప్రయత్నించడంలో సర్వర్ అనుకోని స్థితిని ఎదుర్కొంది.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON పార్సర్</translation> <translation id="2495093607237746763">ఎంచుకుంటే, Chromium వేగవంతమైన ఫారమ్ పూరింపు కోసం ఈ పరికరంలో మీ కార్డ్ కాపీని నిల్వ చేస్తుంది.</translation> <translation id="2498091847651709837">కొత్త కార్డ్ను స్కాన్ చేయండి</translation> +<translation id="2515629240566999685">మీ ప్రాంతంలో సిగ్నల్ను తనిఖీ చేయడం</translation> <translation id="2516305470678292029">UI ప్రత్యామ్నాయాలు</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> చెల్లని ప్రతిస్పందనను పంపింది.</translation> <translation id="2552545117464357659">క్రొత్తవి</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">ఈ పేజీని బుక్మార్క్ చెయ్యి</translation> <translation id="3270847123878663523">&మళ్లీ క్రమం చేయడాన్ని రద్దు చేయి</translation> <translation id="3286538390144397061">ఇప్పుడు పునఃప్రారంభించండి</translation> +<translation id="3288003805934695103">పేజీని మళ్లీ లోడ్ చేయడం</translation> +<translation id="3305707030755673451"><ph name="TIME" />న మీ సమకాలీకరణ రహస్య పదబంధంతో మీ డేటా గుప్తీకరించబడింది. సమకాలీకరణను ప్రారంభించడానికి దీన్ని నమోదు చేయండి.</translation> <translation id="333371639341676808">అదనపు డైలాగ్లను సృష్టించకుండా ఈ పేజీని అడ్డుకో</translation> <translation id="3340978935015468852">సెట్టింగ్లు</translation> <translation id="3355823806454867987">ప్రాక్సీ సెట్టింగ్లను మార్చు...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">లోడ్ అవుతోంది...</translation> <translation id="3712624925041724820">లైసెన్స్లు అయిపోయాయి</translation> +<translation id="3714780639079136834">మొబైల్ డేటా లేదా Wi-Fiని ఆన్ చేయడం</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />ప్రాక్సీ, ఫైర్వాల్ మరియు DNS కాన్ఫిగరేషన్ను తనిఖీ చేయడం<ph name="END_LINK" /></translation> <translation id="3739623965217189342">మీరు కాపీ చేసిన లింక్</translation> <translation id="3744899669254331632">మీరు సందర్శించాలనుకుంటున్న <ph name="SITE" /> వెబ్సైట్ Chromium ప్రాసెస్ చేయలేని చిందరవందరైన ఆధారాలను పంపినందున ప్రస్తుతం దాన్ని సందర్శించలేరు. నెట్వర్క్ లోపాలు మరియు దాడులు సాధారణంగా తాత్కాలికంగా మాత్రమే ఉంటాయి, కాబట్టి ఈ పేజీ బహుశా తర్వాత పని చేయవచ్చు.</translation> <translation id="3748412725338508953">అక్కడ చాలా ఎక్కువ మళ్ళింపులు ఉన్నాయి.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">పాఠకుని మోడ్</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> బ్లాక్ చేయబడింది</translation> <translation id="4021036232240155012">DNS అనేది వెబ్సైట్ పేరును దాని ఇంటర్నెట్ చిరునామాకి అనువదించే నెట్వర్క్ సేవ.</translation> +<translation id="4021376465026729077">మీ పొడిగింపులను నిలిపివేయడం</translation> <translation id="4030383055268325496">&జోడించడాన్ని రద్దు చేయి</translation> <translation id="4032534284272647190"><ph name="URL" />కు ప్రాప్యత తిరస్కరించబడింది.</translation> <translation id="404928562651467259">హెచ్చరిక</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">ధృవీకరణ సంతకం చెల్లదు</translation> <translation id="4176463684765177261">ఆపివేయబడింది</translation> <translation id="4196861286325780578">&తరలించడాన్ని పునరావృతం చేయి</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ఫైర్వాల్ మరియు యాంటీవైరస్ కాన్ఫిగరేషన్లను తనిఖీ చేయడం<ph name="END_LINK" /></translation> <translation id="4220128509585149162">క్రాష్లు</translation> <translation id="4250680216510889253">కాదు</translation> <translation id="4258748452823770588">చెల్లని సంతకం</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">ప్రాక్సీని ఉపయోగించడం ఆపివేయబడింది కానీ స్పష్టమైన ప్రాక్సీ కాన్ఫిగరేషన్ పేర్కొనబడింది.</translation> <translation id="4492190037599258964"><ph name="SEARCH_STRING" />' కోసం శోధన ఫలితాలు</translation> <translation id="4506176782989081258">ధృవీకరణ లోపం: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">సిస్టమ్ నిర్వాహకుడిని సంప్రదించడం</translation> <translation id="450710068430902550">నిర్వాహకుడితో భాగస్వామ్యం</translation> <translation id="4522570452068850558">వివరాలు</translation> <translation id="4535734014498033861">ప్రాక్సీ సర్వర్ కనెక్షన్ విఫలమైంది.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Google అనువాదం గురించి</translation> <translation id="5040262127954254034">గోప్యత</translation> <translation id="5045550434625856497">తప్పు పాస్వర్డ్</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />ప్రాక్సీ చిరునామాను తనిఖీ చేయడం<ph name="END_LINK" /></translation> <translation id="5087286274860437796">ప్రస్తుతం సర్వర్ ప్రమాణపత్రం చెల్లదు.</translation> <translation id="5089810972385038852">రాష్ట్రం</translation> <translation id="5094747076828555589">ఈ సర్వర్ <ph name="DOMAIN" /> అని నిరూపించుకోలేకపోయింది; దీని భద్రతా ప్రమాణపత్రాన్ని Chromium విశ్వసించలేదు. ఇది తప్పుగా కాన్ఫిగర్ చేయడం వలన లేదా దాడిచేసే వ్యక్తి మీ కనెక్షన్కి అంతరాయం కలిగించడం వలన జరిగి ఉండవచ్చు.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">నావిగేషన్ను నిర్థారించండి</translation> <translation id="5299298092464848405">విధానాన్ని అన్వయించడంలో లోపం</translation> <translation id="5300589172476337783">చూపించు</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />మీ కుక్కీలను తీసివేయడం<ph name="END_LINK" /></translation> <translation id="5308689395849655368">క్రాష్ నివేదిక నిలిపివెయ్యబడింది.</translation> <translation id="5317780077021120954">సేవ్ చేయి</translation> <translation id="5327248766486351172">పేరు</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">రీలోడ్</translation> <translation id="5565735124758917034">సక్రియం</translation> <translation id="560412284261940334">నిర్వహణకు మద్దతు లేదు</translation> +<translation id="5610142619324316209">కనెక్షన్ను తనిఖీ చేయడం</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> మిమ్మల్ని అనేక సార్లు దారి మళ్లించింది.</translation> <translation id="5629630648637658800">విధాన సెట్టింగ్లను లోడ్ చేయడంలో విఫలమైంది</translation> <translation id="5631439013527180824">చెల్లని పరికర నిర్వహణ టోకెన్</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">మీ కార్డ్ ధృవీకరించబడింది</translation> <translation id="6146055958333702838">ఏవైనా కేబుల్లను తనిఖీ చేయండి మరియు మీరు ఉపయోగించే ఏవైనా రూటర్లు, మోడెమ్లు లేదా ఇతర నెట్వర్క్ పరికరాలను రీబూట్ చేయండి.</translation> +<translation id="614940544461990577">ఇలా చేసి ప్రయత్నించండి:</translation> <translation id="6151417162996330722">సర్వర్ ప్రమాణపత్రం చెల్లుబాటు వ్యవధి చాలా ఎక్కువ కాలం ఉంది.</translation> <translation id="6154808779448689242">అందించబడిన విధాన టోకెన్ ప్రస్తుత టోకెన్కు సరిపోలలేదు</translation> <translation id="6165508094623778733">మరింత తెలుసుకోండి</translation> @@ -475,11 +493,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> శోధన</translation> <translation id="6634865548447745291"><ph name="BEGIN_LINK" />ఈ ప్రమాణపత్రం ఉపసంహరించబడింది<ph name="END_LINK" /> కావున మీరు ఇప్పుడు <ph name="SITE" />ని సందర్శించలేరు. నెట్వర్క్ లోపాలు మరియు దాడులు సాధారణంగా తాత్కాలికంగానే ఉంటాయి, కావున ఈ పేజీ కాసేపటి తర్వాత పని చేసే అవకాశం ఉంది.</translation> <translation id="6637478299472506933">డౌన్లోడ్ చేయడం విఫలమైంది</translation> +<translation id="6642894344118208103">మోడెమ్ లేదా రూటర్ను రీసెట్ చేయడం</translation> <translation id="6644283850729428850">ఈ విధానం విలువ తగ్గించబడింది.</translation> <translation id="6646897916597483132">మీ కార్డ్ ముందువైపు ఉండే 4 అంకెల CVCని నమోదు చేయండి</translation> <translation id="6656103420185847513">ఫోల్డర్ను సవరించండి</translation> <translation id="6660210980321319655">స్వయంచాలకంగా నివేదించబడిన సమయం <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Chromium నుండి ఫారమ్ సూచనను తీసివేయాలా?</translation> +<translation id="6685834062052613830">సైన్ అవుట్ చేసి, సెటప్ను పూర్తి చేయండి</translation> <translation id="6710213216561001401">మునుపటి</translation> <translation id="6711464428925977395">ప్రాక్సీ సర్వర్లో ఏదో తప్పు ఉంది లేదా చిరునామా సరైనది కాదు.</translation> <translation id="674375294223700098">తెలియని సర్వర్ ప్రమాణపత్రం లోపం.</translation> @@ -513,6 +533,7 @@ <translation id="7052500709156631672">గేట్వే లేదా ప్రాక్సీ సర్వర్ అప్స్ట్రీమ్ సర్వర్ నుండి చెల్లని ప్రతిస్పందనను స్వీకరించాయి.</translation> <translation id="7087282848513945231">కౌంటి</translation> <translation id="7088615885725309056">పాతవి</translation> +<translation id="7090678807593890770"><ph name="LINK" /> కోసం Googleలో శోధించండి</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" />కు అనువాదం విఫలమైంది.</translation> <translation id="7139724024395191329">ఎమిరేట్</translation> <translation id="7179921470347911571">ఇప్పుడే పునఃప్రారంభించు</translation> @@ -605,6 +626,7 @@ <translation id="8034955203865359138">చరిత్ర నమోదులు కనుగొనబడలేదు.</translation> <translation id="8088680233425245692">కథనాన్ని వీక్షించడంలో విఫలమైంది.</translation> <translation id="8091372947890762290">సక్రియం సర్వర్లో పెండింగ్లో ఉంది</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> సర్వర్ <ph name="BEGIN_ABBR" />DNS చిరునామా<ph name="END_ABBR" />ను కనుగొనడం సాధ్యపడలేదు.</translation> <translation id="8149426793427495338">మీ కంప్యూటర్ నిద్రావస్థకి వెళ్లింది.</translation> <translation id="8150722005171944719"><ph name="URL" />లో ఫైల్ చదవగలిగేది కాదు. దీన్ని తీసివేసి ఉండవచ్చు, తరలించి ఉండవచ్చు లేదా ఫైల్ అనుమతులు ప్రాప్యతను నిరోధిస్తుండవచ్చు.</translation> <translation id="8194797478851900357">&తరలించడాన్ని రద్దు చేయి</translation> @@ -632,6 +654,7 @@ <translation id="8311778656528046050">మీరు ఈ పేజీని మళ్లీ లోడ్ చేయాలనుకుంటున్నారా?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" />కి ప్రాప్యత నిరాకరించబడింది</translation> <translation id="8349305172487531364">బుక్మార్క్ల పట్టీ</translation> +<translation id="8363502534493474904">ఎయిర్ప్లైన్ మోడ్ను ఆఫ్ చేయడం</translation> <translation id="8364627913115013041">సెట్ చేయలేదు.</translation> <translation id="8412145213513410671">క్రాష్లు (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">మీరు అదే పాస్ఫ్రేజ్ని రెండుసార్లు ఖచ్చితంగా ఎంటర్ చెయ్యాలి.</translation> @@ -689,6 +712,7 @@ <translation id="901974403500617787">సిస్టమ్ వ్యాప్తంగా వర్తింపజేయబడే ఫ్లాగ్లు యజమాని ద్వారా మాత్రమే సెట్ చేయబడతాయి: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">సర్వర్ కనెక్షన్ని తిరస్కరించింది.</translation> <translation id="9020542370529661692">ఈ పేజీ <ph name="TARGET_LANGUAGE" />కి అనువదించబడింది</translation> +<translation id="9038649477754266430">పేజీలను మరింత శీఘ్రంగా లోడ్ చేయడానికి సూచన సేవను ఉపయోగించండి</translation> <translation id="9039213469156557790">అలాగే, ఈ పేజీలో సురక్షితం కాని ఇతర వనరులు ఉన్నాయి. ఈ వనరులను బదిలీ చేస్తున్నప్పుడు ఇతరులు చూడగలరు మరియు దాడికి పాల్పడేవారు పేజీ ప్రవర్తనను మార్చేలా వీటిని సవరించగలరు.</translation> <translation id="9049981332609050619">మీరు <ph name="DOMAIN" />ని చేరుకోవడానికి ప్రయత్నించారు, కానీ సర్వర్ ఒక చెల్లుబాటులో లేని ప్రమాణపత్రంని అందించింది.</translation> <translation id="9050666287014529139">పాస్ఫ్రేజ్</translation> @@ -702,6 +726,7 @@ <translation id="9170848237812810038">&అన్డు</translation> <translation id="917450738466192189">సర్వర్ యొక్క ప్రమాణపత్రం చెల్లుబాటు కాదు.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> మద్దతు లేని ప్రోటోకాల్ను ఉపయోగిస్తోంది.</translation> +<translation id="9205078245616868884">మీ సమకాలీకరణ రహస్య పదబంధంతో మీ డేటా గుప్తీకరించబడింది. సమకాలీకరణను ప్రారంభించడానికి దీన్ని నమోదు చేయండి.</translation> <translation id="9207861905230894330">కథనాన్ని జోడించడంలో విఫలమైంది.</translation> <translation id="933612690413056017">ఇంటర్నెట్ కనెక్షన్ లేదు</translation> <translation id="933712198907837967">డైనర్స్ క్లబ్</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 87ddd1a..7a74a4f 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">เซิร์ฟเวอร์นี้ไม่สามารถพิสูจน์ได้ว่าเป็น <ph name="DOMAIN" /> เพราะระบบปฏิบัติการของคอมพิวเตอร์ของคุณไม่เชื่อถือใบรับรองความปลอดภัย โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ</translation> <translation id="1152921474424827756">เข้าถึง<ph name="BEGIN_LINK" />สำเนาแคช<ph name="END_LINK" />ของ <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> ปิดการเชื่อมต่อโดยไม่คาดคิด</translation> +<translation id="1161325031994447685">เชื่อมต่อ Wi-Fi ใหม่</translation> <translation id="1175364870820465910">&พิมพ์...</translation> <translation id="1181037720776840403">ลบ</translation> <translation id="1195447618553298278">ข้อผิดพลาดที่ไม่รู้จัก</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">นโยบายผู้ใช้</translation> <translation id="1644184664548287040">การกำหนดค่าเครือข่ายไม่ถูกต้องและไม่สามารถนำเข้า</translation> <translation id="1644574205037202324">ประวัติการเข้าชม</translation> +<translation id="1645368109819982629">ไม่รองรับโปรโตคอล</translation> <translation id="1655462015569774233">{1,plural, =1{เซิร์ฟเวอร์นี้พิสูจน์ไม่ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยหมดอายุไปเมื่อวานนี้ โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ ขณะนี้นาฬิกาของคุณตั้งค่าไว้ที่วันที่ <ph name="CURRENT_DATE" /> การตั้งค่านี้ถูกต้องไหม หากไม่ถูกต้อง คุณควรแก้ไขนาฬิกาของระบบและรีเฟรชหน้านี้}other{เซิร์ฟเวอร์นี้พิสูจน์ไม่ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยหมดอายุไปเมื่อ # วันที่ผ่านมา โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ ขณะนี้นาฬิกาของคุณตั้งค่าไว้ที่วันที่ <ph name="CURRENT_DATE" /> การตั้งค่านี้ถูกต้องไหม หากไม่ถูกต้อง คุณควรแก้ไขนาฬิกาของระบบและรีเฟรชหน้านี้}}</translation> <translation id="1676269943528358898">โดยทั่วไป <ph name="SITE" /> จะใช้การเข้ารหัสเพื่อปกป้องข้อมูลของคุณ เมื่อ Google Chrome พยายามเชื่อมต่อกับ <ph name="SITE" /> ในครั้งนี้ เว็บไซต์ดังกล่าวส่งข้อมูลรับรองที่ผิดปกติและไม่ถูกต้องกลับมา เหตุการณ์นี้อาจเกิดขึ้นเมื่อผู้บุกรุกพยายามปลอมเป็น <ph name="SITE" /> หรือหน้าจอการลงชื่อเข้าใช้ Wi-Fi รบกวนการเชื่อมต่อ ข้อมูลของคุณยังปลอดภัยอยู่เนื่องจาก Google Chrome หยุดการเชื่อมต่อก่อนมีการแลกเปลี่ยนข้อมูล</translation> <translation id="168841957122794586">ใบรับรองของเซิร์ฟเวอร์มีคีย์การเข้ารหัสที่ไม่รัดกุม</translation> <translation id="1706954506755087368">{1,plural, =1{เซิร์ฟเวอร์นี้พิสูจน์ไม่ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยควรจะเริ่มใช้งานได้ตั้งแต่วันพรุ่งนี้ โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ}other{เซิร์ฟเวอร์นี้พิสูจน์ไม่ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยควรจะเริ่มใช้งานได้ในอีก # วันข้างหน้า โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ}}</translation> <translation id="1710259589646384581">ระบบปฏิบัติการ</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">ลองติดต่อผู้ดูแลระบบ</translation> <translation id="17513872634828108">แท็บที่เปิดอยู่</translation> <translation id="1753706481035618306">เลขหน้า</translation> <translation id="1763864636252898013">เซิร์ฟเวอร์นี้ไม่สามารถพิสูจน์ได้ว่าเป็น <ph name="DOMAIN" /> เพราะระบบปฏิบัติการของอุปกรณ์ของคุณไม่เชื่อถือใบรับรองความปลอดภัย โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">พร็อกซีถูกตั้งค่าให้ทำการกำหนดค่าโดยอัตโนมัติ</translation> <translation id="2025623846716345241">ยืนยันการโหลดซ้ำ</translation> <translation id="2030481566774242610">หรือคุณหมายถึง <ph name="LINK" /></translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />ตรวจสอบพร็อกซีและไฟร์วอลล์<ph name="END_LINK" /></translation> <translation id="2053553514270667976">รหัสไปรษณีย์</translation> <translation id="2065985942032347596">ต้องมีการตรวจสอบความถูกต้อง</translation> <translation id="2079545284768500474">เลิกทำ</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">ไม่พบนโยบาย</translation> <translation id="2213606439339815911">กำลังดึงรายการ...</translation> <translation id="2214283295778284209"><ph name="SITE" /> ไม่พร้อมใช้งาน</translation> +<translation id="2227695659599072496">ตรวจสอบสายของเครือข่ายหรือเราเตอร์</translation> +<translation id="2230458221926704099">แก้ไขการเชื่อมต่อของคุณด้วย<ph name="BEGIN_LINK" />แอปการวินิจฉัย<ph name="END_LINK" /></translation> <translation id="225207911366869382">เลิกใช้งานค่านี้กับนโยบายนี้</translation> <translation id="2262243747453050782">ข้อผิดพลาดของ HTTP</translation> <translation id="2279770628980885996">เกิดปัญหาที่ไม่คาดคิดในขณะที่เซิร์ฟเวอร์พยายามดำเนินการตามคำขอ</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">โปรแกรมแยกวิเคราะห์ JSON</translation> <translation id="2495093607237746763">หากเลือกไว้ Chromium จะจัดเก็บสำเนาบัตรของคุณบนอุปกรณ์นี้เพื่อการกรอกแบบฟอร์มที่รวดเร็วขึ้น</translation> <translation id="2498091847651709837">สแกนบัตรใหม่</translation> +<translation id="2515629240566999685">ตรวจสอบสัญญาณในพื้นที่ของคุณ</translation> <translation id="2516305470678292029">ทางเลือก UI</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> ส่งการตอบกลับที่ไม่ถูกต้อง</translation> <translation id="2552545117464357659">ใหม่กว่า</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">บุ๊กมาร์กหน้านี้</translation> <translation id="3270847123878663523">&เลิกทำการจัดลำดับใหม่</translation> <translation id="3286538390144397061">รีสตาร์ทเดี๋ยวนี้</translation> +<translation id="3288003805934695103">โหลดหน้าใหม่</translation> +<translation id="3305707030755673451">ข้อมูลของคุณได้รับการเข้ารหัสด้วยรหัสผ่านการซิงค์เมื่อวันที่ <ph name="TIME" /> โปรดป้อนรหัสผ่านเพื่อเริ่มซิงค์</translation> <translation id="333371639341676808">ป้องกันหน้านี้จากการสร้างการโต้ตอบเพิ่มเติม</translation> <translation id="3340978935015468852">การตั้งค่า</translation> <translation id="3355823806454867987">เปลี่ยนการตั้งค่าพร็อกซี...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">กำลังโหลด...</translation> <translation id="3712624925041724820">ใบอนุญาตหมด</translation> +<translation id="3714780639079136834">เปิดข้อมูลเครือข่ายมือถือหรือ Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />ตรวจสอบพร็อกซี ไฟร์วอลล์ และการกำหนดค่า DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">ลิงก์ที่คุณคัดลอกมา</translation> <translation id="3744899669254331632">คุณไม่สามารถไปที่ <ph name="SITE" /> ได้ในขณะนี้เนื่องจากเว็บไซต์ได้ส่งข้อมูลรับรองที่มีการแปลงข้อมูลซึ่ง Chromium ไม่สามารถดำเนินการได้ ข้อผิดพลาดของเครือข่ายและการโจมตีมักจะเกิดขึ้นชั่วคราว ดังนั้นหน้านี้อาจจะใช้งานได้ในภายหลัง</translation> <translation id="3748412725338508953">มีการเปลี่ยนเส้นทางมากเกินไป</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">โหมดนักอ่าน</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ถูกบล็อก</translation> <translation id="4021036232240155012">DNS คือบริการเครือข่ายที่แปลชื่อของเว็บไซต์เป็นที่อยู่อินเทอร์เน็ต</translation> +<translation id="4021376465026729077">ปิดส่วนขยาย</translation> <translation id="4030383055268325496">&เลิกทำการเพิ่ม</translation> <translation id="4032534284272647190">การเข้าถึง <ph name="URL" /> ถูกปฏิเสธ</translation> <translation id="404928562651467259">คำเตือน</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">ลายเซ็นยืนยันไม่ถูกต้อง</translation> <translation id="4176463684765177261">ปิดการใช้งานแล้ว</translation> <translation id="4196861286325780578">&ทำซ้ำการย้าย</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ตรวจสอบไฟร์วอลล์และการกำหนดค่าการป้องกันไวรัส<ph name="END_LINK" /></translation> <translation id="4220128509585149162">การขัดข้อง</translation> <translation id="4250680216510889253">ไม่มี</translation> <translation id="4258748452823770588">ลายเซ็นไม่เหมาะสม</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">การใช้พร็อกซีถูกปิดใช้งาน แต่มีการระบุการกำหนดค่าพร็อกซีอย่างชัดเจน</translation> <translation id="4492190037599258964">ผลการค้นหาคำว่า "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">ข้อผิดพลาดในการตรวจสอบ: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">ติดต่อผู้ดูแลระบบ</translation> <translation id="450710068430902550">การแชร์กับผู้ดูแลระบบ</translation> <translation id="4522570452068850558">รายละเอียด</translation> <translation id="4535734014498033861">การเชื่อมต่อของพร็อกซีเซิร์ฟเวอร์ล้มเหลว</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">เกี่ยวกับ Google แปลภาษา</translation> <translation id="5040262127954254034">ความเป็นส่วนตัว</translation> <translation id="5045550434625856497">รหัสผ่านไม่ถูกต้อง</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />ตรวจสอบที่อยู่พร็อกซี<ph name="END_LINK" /></translation> <translation id="5087286274860437796">ใบรับรองของเซิร์ฟเวอร์ไม่สามารถใช้ได้ในขณะนี้</translation> <translation id="5089810972385038852">รัฐ</translation> <translation id="5094747076828555589">เซิร์ฟเวอร์นี้ไม่สามารถพิสูจน์ได้ว่าเป็น <ph name="DOMAIN" /> เพราะ Chromium ไม่เชื่อถือใบรับรองความปลอดภัย โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">ยืนยันการนำทาง</translation> <translation id="5299298092464848405">ข้อผิดพลาดในการแยกวิเคราะห์นโยบาย</translation> <translation id="5300589172476337783">แสดง</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />ล้างคุกกี้<ph name="END_LINK" /></translation> <translation id="5308689395849655368">การรายงานข้อขัดข้องถูกปิดใช้งาน</translation> <translation id="5317780077021120954">บันทึก</translation> <translation id="5327248766486351172">ชื่อ</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">โหลดใหม่</translation> <translation id="5565735124758917034">ใช้งานอยู่</translation> <translation id="560412284261940334">ไม่สนับสนุนการจัดการ</translation> +<translation id="5610142619324316209">ตรวจสอบการเชื่อมต่อ</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> เปลี่ยนเส้นทางของคุณบ่อยเกินไป</translation> <translation id="5629630648637658800">ไม่สามารถโหลดการตั้งค่านโยบาย</translation> <translation id="5631439013527180824">โทเค็นการจัดการอุปกรณ์ไม่ถูกต้อง</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">ยืนยันบัตรของคุณแล้ว</translation> <translation id="6146055958333702838">ตรวจสายเคเบิลและรีบูตเราเตอร์ โมเด็ม หรืออุปกรณ์เครือข่ายอื่น ที่คุณอาจใช้งานอยู่</translation> +<translation id="614940544461990577">ลอง:</translation> <translation id="6151417162996330722">ใบรับรองเซิร์ฟเวอร์มีระยะเวลาที่สามารถใช้ได้นานเกินไป</translation> <translation id="6154808779448689242">โทเค็นนโยบายที่ส่งกลับไม่ตรงกับโทเค็นปัจจุบัน</translation> <translation id="6165508094623778733">เรียนรู้เพิ่มเติม</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> ค้นหา</translation> <translation id="6634865548447745291">คุณไม่สามารถไปที่ <ph name="SITE" /> ได้ในขณะนี้ เนื่องจาก<ph name="BEGIN_LINK" />ใบรับรองนี้ถูกเพิกถอนแล้ว<ph name="END_LINK" /> โดยปกติข้อผิดพลาดของเครือข่ายและการบุกรุกจะเกิดขึ้นเพียงชั่วคราว หน้านี้จึงน่าจะใช้งานได้ในภายหลัง</translation> <translation id="6637478299472506933">การดาวน์โหลดล้มเหลว</translation> +<translation id="6642894344118208103">รีเซ็ตโมเด็มหรือเราเตอร์</translation> <translation id="6644283850729428850">นโยบายนี้ถูกยกเลิกแล้ว</translation> <translation id="6646897916597483132">ป้อน CVC 4 หลักจากด้านหน้าบัตร</translation> <translation id="6656103420185847513">แก้ไขโฟลเดอร์</translation> <translation id="6660210980321319655">รายงานอัตโนมัติเมื่อ<ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">ต้องการนำคำแนะนำสำหรับแบบฟอร์มออกจาก Chromium ใช่ไหม</translation> +<translation id="6685834062052613830">ออกจากระบบและตั้งค่าให้เสร็จสมบูรณ์</translation> <translation id="6710213216561001401">ก่อนหน้า</translation> <translation id="6711464428925977395">พร็อกซีเซิร์ฟเวอร์ผิดปกติหรือที่อยู่ไม่ถูกต้อง</translation> <translation id="674375294223700098">ข้อผิดพลาดใบรับรองของเซิร์ฟเวอร์ที่ไม่รู้จัก</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">เกตเวย์หรือพร็อกซีเซิร์ฟเวอร์ได้รับการตอบกลับที่ไม่ถูกต้องจากเซิร์ฟเวอร์ต้นทาง</translation> <translation id="7087282848513945231">อำเภอ</translation> <translation id="7088615885725309056">เก่ากว่า</translation> +<translation id="7090678807593890770">ค้นหา <ph name="LINK" /> ใน Google</translation> <translation id="7108649287766967076">การแปลเป็น <ph name="TARGET_LANGUAGE" /> ล้มเหลว</translation> <translation id="7139724024395191329">เอมิเรต</translation> <translation id="7179921470347911571">เปิดใช้งานใหม่เดี๋ยวนี้</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">ไม่พบข้อมูลประวัติการเข้าชม</translation> <translation id="8088680233425245692">การดูบทความล้มเหลว</translation> <translation id="8091372947890762290">กำลังรอการเปิดใช้งานบนเซิร์ฟเวอร์</translation> +<translation id="8134994873729925007">ไม่พบ<ph name="BEGIN_ABBR" />ที่อยู่ DNS<ph name="END_ABBR" /> ของเซิร์ฟเวอร์ของ <ph name="HOST_NAME" /></translation> <translation id="8149426793427495338">คอมพิวเตอร์ของคุณเข้าสู่โหมดสลีปแล้ว</translation> <translation id="8150722005171944719">ไฟล์ที่ <ph name="URL" /> ไม่สามารถอ่านได้ เนื่องจากอาจถูกลบ ย้ายไปแล้ว หรือการอนุญาตของไฟล์อาจป้องกันการเข้าถึง</translation> <translation id="8194797478851900357">&เลิกทำการย้าย</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">คุณแน่ใจหรือไม่ว่าต้องการโหลดหน้าเว็บนี้ซ้ำ</translation> <translation id="8332188693563227489">การเข้าถึง <ph name="HOST_NAME" /> ถูกปฏิเสธ</translation> <translation id="8349305172487531364">แถบบุ๊กมาร์ก</translation> +<translation id="8363502534493474904">ปิดโหมดบนเครื่องบิน</translation> <translation id="8364627913115013041">ไม่ได้ตั้งค่า</translation> <translation id="8412145213513410671">ข้อขัดข้อง (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">คุณต้องป้อนข้อความรหัสผ่านที่เหมือนกันสองครั้ง</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">การตั้งค่าสถานะที่ใช้ทั้งระบบสามารถตั้งค่าได้โดยเจ้าของเท่านั้น: <ph name="OWNER_EMAIL" /></translation> <translation id="9020142588544155172">เซิร์ฟเวอร์ปฏิเสธการเชื่อมต่อ</translation> <translation id="9020542370529661692">หน้านี้ได้รับการแปลเป็น <ph name="TARGET_LANGUAGE" /> แล้ว</translation> +<translation id="9038649477754266430">ใช้บริการการคาดคะเนเพื่อโหลดหน้าได้เร็วขึ้น</translation> <translation id="9039213469156557790">นอกจากนี้ หน้านี้ประกอบด้วยทรัพยากรอื่นๆ ซึ่งไม่ปลอดภัย ผู้อื่นสามารถดูทรัพยากรเหล่านี้ขณะถ่ายโอน และผู้บุกรุกสามารถแก้ไขเพื่อเปลี่ยนการทำงานของหน้าได้</translation> <translation id="9049981332609050619">คุณพยายามเข้าถึง <ph name="DOMAIN" /> แต่เซิร์ฟเวอร์แสดงใบรับรองที่ไม่ถูกต้อง</translation> <translation id="9050666287014529139">ข้อความรหัสผ่าน</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">เ&ลิกทำ</translation> <translation id="917450738466192189">ใบรับรองของเซิร์ฟเวอร์ไม่ถูกต้อง</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> ใช้โปรโตคอลที่ไม่รองรับ</translation> +<translation id="9205078245616868884">ข้อมูลของคุณมีการเข้ารหัสด้วยรหัสผ่านการซิงค์ โปรดป้อนรหัสผ่านเพื่อเริ่มซิงค์</translation> <translation id="9207861905230894330">การเพิ่มบทความล้มเหลว</translation> <translation id="933612690413056017">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index a3f9b3b..5c776d4 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Bu sunucu <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Bilgisayarınızın işletim sistemi, sunucunun güvenlik sertifikasına güvenmiyor. Bu durum, bir yanlış yapılandırmadan veya bağlantıya müdahale eden bir saldırgandan kaynaklanıyor olabilir.</translation> <translation id="1152921474424827756"><ph name="URL" /> sitesinin <ph name="BEGIN_LINK" />önbelleğe alınmış bir kopyasına<ph name="END_LINK" /> erişin</translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> bağlantıyı beklenmedik şekilde kapattı.</translation> +<translation id="1161325031994447685">Kablosuz ağa yeniden bağlanma</translation> <translation id="1175364870820465910">Ya&zdır...</translation> <translation id="1181037720776840403">Kaldır</translation> <translation id="1195447618553298278">Bilinmeyen hata.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Kullanıcı politikaları</translation> <translation id="1644184664548287040">Ağ yapılandırması geçersiz, dolayısıyla içe aktarılamadı.</translation> <translation id="1644574205037202324">Geçmiş</translation> +<translation id="1645368109819982629">Desteklenmeyen protokol</translation> <translation id="1655462015569774233">{1,plural, =1{Bu sunucu, <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikasının süresi dün sona erdi. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir. Bilgisayarınızın saati geçerli olarak <ph name="CURRENT_DATE" /> tarihine ayarlı. Bu ayar doğru görünüyor mu? Değilse, sisteminizin saatini düzeltmeli ve sonra bu sayfayı yenilemelisiniz.}other{Bu sunucu, <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikası # gün önce sona erdi. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir. Bilgisayarınızın saati geçerli olarak <ph name="CURRENT_DATE" /> tarihine ayarlı. Bu ayar doğru görünüyor mu? Değilse, sisteminizin saatini düzeltmeli ve sonra bu sayfayı yenilemelisiniz.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> normalde bilgilerinizi korumak için şifreleme kullanmaktadır. Google Chrome bu sefer <ph name="SITE" /> sitesine bağlanmayı denediğinde, web sitesi sıra dışı ve yanlış kimlik bilgileri döndürdü. Bir saldırgan <ph name="SITE" /> gibi davranmaya çalışıyor olabilir ya da bir Kablosuz oturum açma ekranı bağlantıyı kesmiştir. Google Chrome herhangi bir veri alışverişinden önce bağlantıyı durdurduğu için bilgileriniz hâlâ güvendedir.</translation> <translation id="168841957122794586">Sunucu sertifikasında zayıf bir şifreleme anahtarı var.</translation> <translation id="1706954506755087368">{1,plural, =1{Bu sunucu, <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikasının alınma tarihinin yarın olduğu iddia ediliyor. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir.}other{Bu sunucu, <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikasının alınma tarihinin # gün sonra olduğu iddia ediliyor. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Sistem yöneticisiyle iletişime geçmeyi deneyin.</translation> <translation id="17513872634828108">Açık sekmeler</translation> <translation id="1753706481035618306">Sayfa numarası</translation> <translation id="1763864636252898013">Bu sunucu <ph name="DOMAIN" /> olduğunu kanıtlayamadı. cihazınızın işletim sistemi, sunucunun güvenlik sertifikasına güvenmiyor. Bu durum, bir yanlış yapılandırmadan veya bağlantıya müdahale eden bir saldırgandan kaynaklanıyor olabilir.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxy, otomatik yapılandırıldı değerine ayarlandı.</translation> <translation id="2025623846716345241">Yeniden Yüklemeyi Onayla</translation> <translation id="2030481566774242610">Şunu mu demek istediniz?: <ph name="LINK" /></translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Proxy'yi ve güvenlik duvarını kontrol etme<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Posta kodu</translation> <translation id="2065985942032347596">Kimlik Doğrulaması Gerekiyor</translation> <translation id="2079545284768500474">Geri Al</translation> @@ -118,6 +122,8 @@ <translation id="2212735316055980242">Politika bulunamadı</translation> <translation id="2213606439339815911">Girişler getiriliyor...</translation> <translation id="2214283295778284209"><ph name="SITE" /> kullanılamıyor</translation> +<translation id="2227695659599072496">Ağ kablosunu veya yönlendiriciyi kontrol etme</translation> +<translation id="2230458221926704099"><ph name="BEGIN_LINK" />Tanılama uygulamasını<ph name="END_LINK" /> kullanarak bağlantınızı düzeltin</translation> <translation id="225207911366869382">Bu değer bu politika için kullanımdan kaldırıldı.</translation> <translation id="2262243747453050782">HTTP hatası</translation> <translation id="2279770628980885996">Sunucu isteği gerçekleştirmeyi denerken beklenmedik bir koşulla karşılaşıldı.</translation> @@ -145,6 +151,7 @@ <translation id="2495083838625180221">JSON Ayrıştırıcı</translation> <translation id="2495093607237746763">İşaretlenirse Chromium, formları daha hızlı doldurma amacıyla kartınızın bir kopyasını bu cihazda depolar.</translation> <translation id="2498091847651709837">Yeni kart tara</translation> +<translation id="2515629240566999685">Bulunduğunuz bölgedeki sinyali kontrol etme</translation> <translation id="2516305470678292029">Kullanıcı Arayüzü Alternatifleri</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> geçersiz bir yanıt gönderdi.</translation> <translation id="2552545117464357659">Daha yeni</translation> @@ -220,6 +227,8 @@ <translation id="3254409185687681395">Bu sayfaya yer işareti koy</translation> <translation id="3270847123878663523">Sıralama Değişikliğini &Geri Al</translation> <translation id="3286538390144397061">Şimdi yeniden başlat</translation> +<translation id="3288003805934695103">Sayfayı yeniden yükleme</translation> +<translation id="3305707030755673451">Verileriniz <ph name="TIME" /> tarihinde senkronizasyon parolanızla şifrelendi. Senkronizasyonu başlatmak için senkronizasyon parolanızı girin.</translation> <translation id="333371639341676808">Bu sayfanın ek iletişim kutusu oluşturmasına izin verme.</translation> <translation id="3340978935015468852">ayarlar</translation> <translation id="3355823806454867987">Proxy ayarlarını değiştir...</translation> @@ -262,6 +271,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Yükleniyor...</translation> <translation id="3712624925041724820">Lisanslar bitti</translation> +<translation id="3714780639079136834">Mobil veriyi veya kablosuz bağlantıyı açma</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Proxy, güvenlik duvarı ve DNS yapılandırmasını kontrol etme<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Kopyaladığınız bağlantı</translation> <translation id="3744899669254331632">Web sitesi Chromium'un işleyemediği karışık kimlik bilgileri gönderdiğinden <ph name="SITE" /> sitesini şu anda ziyaret edemezsiniz. Ağ hataları ve saldırılar genellikle geçici türdendir, dolayısıyla bu sayfa muhtemelen daha sonra çalışacaktır.</translation> <translation id="3748412725338508953">Çok fazla yeniden yönlendirme vardı.</translation> @@ -284,6 +295,7 @@ <translation id="3963721102035795474">Okuyucu Modu</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> engellendi</translation> <translation id="4021036232240155012">DNS, bir web sitesinin adını o siteye özgü İnternet adresine dönüştüren ağ hizmetidir.</translation> +<translation id="4021376465026729077">Uzantılarınızı devre dışı bırakma</translation> <translation id="4030383055268325496">Eklemeyi &geri al</translation> <translation id="4032534284272647190"><ph name="URL" /> adresine erişim reddedildi.</translation> <translation id="404928562651467259">UYARI</translation> @@ -300,6 +312,7 @@ <translation id="4171400957073367226">Geçersiz doğrulama imzası</translation> <translation id="4176463684765177261">Devre dışı</translation> <translation id="4196861286325780578">Taşımayı &yeniden yap</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Güvenlik duvarı ve virüsten korunma yapılandırmalarını kontrol etme<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Kilitlenmeler</translation> <translation id="4250680216510889253">Hayır</translation> <translation id="4258748452823770588">İmza yanlış</translation> @@ -320,6 +333,7 @@ <translation id="443673843213245140">Proxy kullanımı devre dışı, ancak açık bir proxy yapılandırması belirtildi.</translation> <translation id="4492190037599258964">'<ph name="SEARCH_STRING" />' için arama sonuçları</translation> <translation id="4506176782989081258">Doğrulama hatası: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">Sistem yöneticisiyle iletişime geçme</translation> <translation id="450710068430902550">Yöneticiyle Paylaşma</translation> <translation id="4522570452068850558">Ayrıntılar</translation> <translation id="4535734014498033861">Proxy sunucu bağlantısı başarısız oldu.</translation> @@ -357,6 +371,7 @@ <translation id="5031870354684148875">Google Çeviri Hakkında</translation> <translation id="5040262127954254034">Gizlilik</translation> <translation id="5045550434625856497">Yanlış şifre</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Proxy adresini kontrol etme<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Sunucu sertifikası şu anda geçerli değil.</translation> <translation id="5089810972385038852">Eyalet</translation> <translation id="5094747076828555589">Bu sunucu <ph name="DOMAIN" /> olduğunu kanıtlayamadı; Chromium, sunucunun güvenlik sertifikasına güvenmiyor. Bu durum, bir yanlış yapılandırmadan veya bağlantıya müdahale eden bir saldırgandan kaynaklanıyor olabilir.</translation> @@ -375,6 +390,7 @@ <translation id="5295309862264981122">Gezintiyi Onayla</translation> <translation id="5299298092464848405">Politika ayrıştırma hatası</translation> <translation id="5300589172476337783">Göster</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Çerezlerinizi temizleme<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Kilitlenme bildirme devre dışı.</translation> <translation id="5317780077021120954">Kaydet</translation> <translation id="5327248766486351172">Ad</translation> @@ -402,6 +418,7 @@ <translation id="5556459405103347317">Yeniden Yükle</translation> <translation id="5565735124758917034">Etkin</translation> <translation id="560412284261940334">Yönetim desteklenmiyor</translation> +<translation id="5610142619324316209">Bağlantınızı kontrol etme</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> sizi çok fazla kez yönlendirdi.</translation> <translation id="5629630648637658800">Politika ayarları yüklenemedi</translation> <translation id="5631439013527180824">Geçersiz cihaz yönetimi jetonu</translation> @@ -434,6 +451,7 @@ <translation id="6093795393556121384">Kartınız doğrulandı</translation> <translation id="6146055958333702838">Kabloları kontrol edin ve kullandığınız yönlendiricileri, modemleri veya diğer ağ cihazlarını yeniden başlatın.</translation> +<translation id="614940544461990577">Aşağıdakileri deneyin:</translation> <translation id="6151417162996330722">Sunucu sertifikasının geçerlilik dönemi çok uzun.</translation> <translation id="6154808779448689242">Döndürülen politika jetonu mevcut jetondan farklı</translation> <translation id="6165508094623778733">Daha fazla bilgi edinin</translation> @@ -475,11 +493,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> Arama</translation> <translation id="6634865548447745291"><ph name="BEGIN_LINK" />Bu sertifika iptal edildiği<ph name="END_LINK" /> için <ph name="SITE" /> sitesini şu anda ziyaret edemezsiniz. Ağ hataları ve saldırılar genellikle geçici olduğundan, bu sayfa muhtemelen daha sonra çalışacaktır.</translation> <translation id="6637478299472506933">İndirme İşlemi Başarısız Oldu</translation> +<translation id="6642894344118208103">Modem veya yönlendiriciyi sıfırlama</translation> <translation id="6644283850729428850">Bu politika uygun bulunmadı.</translation> <translation id="6646897916597483132">Kartınızın önündeki 4 basamaklı CVC'yi girin</translation> <translation id="6656103420185847513">Klasörü Düzenleyin</translation> <translation id="6660210980321319655"><ph name="CRASH_TIME" /> tarihinde otomatik olarak rapor edildi</translation> <translation id="6671697161687535275">Form önerisi Chromium'dan kaldırılsın mı?</translation> +<translation id="6685834062052613830">Çıkış yapın ve kurulumu tamamlayın</translation> <translation id="6710213216561001401">Önceki</translation> <translation id="6711464428925977395">Proxy sunucusunda bir sorun var veya adres yanlış.</translation> <translation id="674375294223700098">Bilinmeyen sunucu sertifikası hatası.</translation> @@ -514,6 +534,7 @@ <translation id="7052500709156631672">Ağ geçidi veya proxy sunucusu, bir yukarı akış sunucusundan geçersiz bir yanıt aldı.</translation> <translation id="7087282848513945231">İlçe</translation> <translation id="7088615885725309056">Daha eski</translation> +<translation id="7090678807593890770">Google'da <ph name="LINK" /> araması yapın</translation> <translation id="7108649287766967076"><ph name="TARGET_LANGUAGE" /> diline çeviri başarısız oldu.</translation> <translation id="7139724024395191329">Emirlik</translation> <translation id="7179921470347911571">Şimdi Yeniden Başlat</translation> @@ -606,6 +627,7 @@ <translation id="8034955203865359138">Geçmiş girişi bulunamadı.</translation> <translation id="8088680233425245692">Makale görüntülenemedi.</translation> <translation id="8091372947890762290">Etkinleştirme sunucuda bekliyor</translation> +<translation id="8134994873729925007"><ph name="HOST_NAME" /> ana makinesinin sunucu <ph name="BEGIN_ABBR" />DNS adresi<ph name="END_ABBR" /> bulunamadı.</translation> <translation id="8149426793427495338">Bilgisayarınız uyku moduna geçti.</translation> <translation id="8150722005171944719"><ph name="URL" /> konumundaki dosya okunamıyor. Kaldırılmış ya da taşınmış olabilir veya dosya izinleri erişimi önlüyordur.</translation> <translation id="8194797478851900357">Taşımayı &Geri Al</translation> @@ -633,6 +655,7 @@ <translation id="8311778656528046050">Bu sayfayı yeniden yüklemek istediğinizden emin misiniz?</translation> <translation id="8332188693563227489"><ph name="HOST_NAME" /> ana makinesine erişim reddedildi</translation> <translation id="8349305172487531364">Yer işaretleri çubuğu</translation> +<translation id="8363502534493474904">Uçak modunu kapatma</translation> <translation id="8364627913115013041">Henüz ayarlanmadı.</translation> <translation id="8412145213513410671">Kilitlenme Sayısı (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Aynı parolayı iki kez girmelisiniz.</translation> @@ -690,6 +713,7 @@ <translation id="901974403500617787">Tüm sistem için geçerli olan işaretler sadece sahibi <ph name="OWNER_EMAIL" /> tarafından ayarlanabilir.</translation> <translation id="9020142588544155172">Sunucu bağlantıyı reddetti.</translation> <translation id="9020542370529661692">Bu sayfa <ph name="TARGET_LANGUAGE" /> diline çevrildi</translation> +<translation id="9038649477754266430">Sayfaları daha hızlı yüklemek için bir tahmin hizmeti kullanın</translation> <translation id="9039213469156557790">Ayrıca, bu sayfa güvenli olmayan başka kaynaklar içeriyor. Bu kaynaklar, aktarım sırasında başkaları tarafından görülebilir ve bir saldırgan tarafından sayfanın davranışını değiştirmek üzere kullanılabilir.</translation> <translation id="9049981332609050619"><ph name="DOMAIN" /> alan adına erişmeye çalıştınız, ancak sunucu geçersiz bir sertifika sağladı.</translation> <translation id="9050666287014529139">Parola</translation> @@ -703,6 +727,7 @@ <translation id="9170848237812810038">&Geri al</translation> <translation id="917450738466192189">Sunucunun sertifikası geçersiz.</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> desteklenmeyen bir protokol kullanıyor.</translation> +<translation id="9205078245616868884">Verileriniz senkronizasyon parolanızla şifrelendi. Senkronizasyonu başlatmak için senkronizasyon parolanızı girin.</translation> <translation id="9207861905230894330">Makale eklenemedi.</translation> <translation id="933612690413056017">İnternet bağlantısı yok</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 25c1d3c..1ddbb14 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Цей сервер не зміг довести, що він – домен <ph name="DOMAIN" />. Операційна система вашого комп’ютера не вважає його сертифікат безпеки надійним. Імовірні причини: неправильна конфігурація або хтось намагається перехопити ваше з’єднання.</translation> <translation id="1152921474424827756">Відкрийте <ph name="BEGIN_LINK" />кешовану копію<ph name="END_LINK" /> <ph name="URL" /></translation> <translation id="1158211211994409885">Хост <ph name="HOST_NAME" /> неочікувано розірвав з’єднання.</translation> +<translation id="1161325031994447685">знову під’єднати пристрій до мережі Wi-Fi</translation> <translation id="1175364870820465910">&Друк...</translation> <translation id="1181037720776840403">Видалити</translation> <translation id="1195447618553298278">Невідома помилка.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Правила користувача</translation> <translation id="1644184664548287040">Конфігурація мережі недійсна та не може імпортуватися.</translation> <translation id="1644574205037202324">Історія</translation> +<translation id="1645368109819982629">Протокол не підтримується</translation> <translation id="1655462015569774233">{1,plural, =1{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти учора. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}one{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти # день тому. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}few{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти # дні тому. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}many{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти # днів тому. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}other{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти # дня тому. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}}</translation> <translation id="1676269943528358898">Веб-сайт <ph name="SITE" /> зазвичай використовує шифрування для захисту вашої інформації. Під час цієї спроби Chrome під’єднатися до сторінки <ph name="SITE" /> з неї отримано незвичні й неправильні облікові дані. Це може статися, коли зловмисник намагається видавати себе за веб-сайт <ph name="SITE" /> або з’єднання перервано екраном входу Wi-Fi. Ваша інформація залишається захищеною, оскільки Chrome припинив з’єднання до того, як почався обмін будь-якими даними.</translation> <translation id="168841957122794586">Сертифікат сервера містить слабкий криптографічний ключ.</translation> <translation id="1706954506755087368">{1,plural, =1{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти завтра. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}one{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти через # день. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}few{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти через # дні. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}many{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти через # днів. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}other{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти через # дня. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}}</translation> <translation id="1710259589646384581">ОС</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Зв’яжіться із системним адміністратором.</translation> <translation id="17513872634828108">Відкриті вкладки</translation> <translation id="1753706481035618306">Номер сторінки</translation> <translation id="1763864636252898013">Цей сервер не зміг довести, що він – домен <ph name="DOMAIN" />. Операційна система вашого пристрою не вважає його сертифікат безпеки надійним. Імовірні причини: неправильна конфігурація або хтось намагається перехопити ваше з’єднання.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Проксі-сервер установлено на автоматичне налаштування.</translation> <translation id="2025623846716345241">Підтвердьте перезавантаження</translation> <translation id="2030481566774242610">Можливо, ви мали на увазі <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />перевірити проксі-сервер і брандмауер<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Поштовий індекс</translation> <translation id="2065985942032347596">Потрібна автентифікація</translation> <translation id="2079545284768500474">Скасувати</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Правило не знайдено</translation> <translation id="2213606439339815911">Отримання записів…</translation> <translation id="2214283295778284209"><ph name="SITE" /> недоступний</translation> +<translation id="2227695659599072496">перевірити мережевий кабель або маршрутизатор</translation> +<translation id="2230458221926704099">Відновіть з’єднання за допомогою <ph name="BEGIN_LINK" />додатка для діагностики<ph name="END_LINK" /></translation> <translation id="225207911366869382">Дію цього значення припинено для цього правила</translation> <translation id="2262243747453050782">Помилка HTTP</translation> <translation id="2279770628980885996">Під час спроби сервера виконати ваш запит виявлено неочікуваний стан.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Синтаксичний аналізатор файлів JSON</translation> <translation id="2495093607237746763">Якщо вибрати цю опцію, Chromium зберігатиме копію даних вашої картки на цьому пристрої, щоб ви могли швидше заповнювати форми.</translation> <translation id="2498091847651709837">Сканувати нову картку</translation> +<translation id="2515629240566999685">перевірити сигнал у своїй місцевості</translation> <translation id="2516305470678292029">Варіанти інтерфейсу користувача</translation> <translation id="255002559098805027">Хост <ph name="HOST_NAME" /> надіслав недійсну відповідь.</translation> <translation id="2552545117464357659">Новіша</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">Додати цю сторінку до закладок</translation> <translation id="3270847123878663523">&Відмінити перевпорядкування</translation> <translation id="3286538390144397061">Перезапустити зараз</translation> +<translation id="3288003805934695103">перезавантажити сторінку</translation> +<translation id="3305707030755673451">Ваші дані було зашифровано <ph name="TIME" /> за допомогою парольної фрази для синхронізації. Введіть її, щоб почати синхронізацію.</translation> <translation id="333371639341676808">Заборонити створення додаткових діалогових вікон цією сторінкою.</translation> <translation id="3340978935015468852">налаштування</translation> <translation id="3355823806454867987">Змінити налаштування проксі...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Завантаження...</translation> <translation id="3712624925041724820">Ліцензії вичерпано</translation> +<translation id="3714780639079136834">увімкнути мобільний Інтернет або Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />перевірити конфігурацію проксі-сервера, брандмауера та DNS-сервера<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Скопійоване посилання</translation> <translation id="3744899669254331632">Зараз не можна перейти на сторінку <ph name="SITE" />, оскільки веб-сайт надіслав зашифровані облікові дані, які Chromium не може обробити. Помилки мережі й атаки зазвичай є тимчасовими, тому ця сторінка може працювати пізніше.</translation> <translation id="3748412725338508953">Було забагато перенаправлень.</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">Режим перегляду</translation> <translation id="3973234410852337861">Хост <ph name="HOST_NAME" /> заблокований</translation> <translation id="4021036232240155012">DNS – це мережева служба, яка перетворює назву веб-сайту на його інтернет-адресу.</translation> +<translation id="4021376465026729077">вимкнути розширення</translation> <translation id="4030383055268325496">&Відмінити додавання</translation> <translation id="4032534284272647190">У доступі до <ph name="URL" /> відмовлено.</translation> <translation id="404928562651467259">ЗАСТЕРЕЖЕННЯ</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">Недійсний підпис для підтвердження</translation> <translation id="4176463684765177261">Вимкнено</translation> <translation id="4196861286325780578">&Повторити переміщення</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />перевірити конфігурацію брандмауера й антивірусної програми<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Збої в роботі</translation> <translation id="4250680216510889253">ні</translation> <translation id="4258748452823770588">Недійсний підпис</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">Використання проксі-сервера вимкнено, але чітко вказано налаштування проксі-сервера.</translation> <translation id="4492190037599258964">Результати пошуку для запиту "<ph name="SEARCH_STRING" />"</translation> <translation id="4506176782989081258">Помилка перевірки: <ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">зв’язатися із системним адміністратором</translation> <translation id="450710068430902550">Надання інформації адміністратору</translation> <translation id="4522570452068850558">Деталі</translation> <translation id="4535734014498033861">Помилка з'єднання з проксі-сервером.</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">Про Перекладач Google</translation> <translation id="5040262127954254034">Конфіденційність</translation> <translation id="5045550434625856497">Неправильний пароль</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />перевірити адресу проксі-сервера<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Сертифікат сервера зараз недійсний.</translation> <translation id="5089810972385038852">Штат</translation> <translation id="5094747076828555589">Цей сервер не зміг довести, що він – домен <ph name="DOMAIN" />. Chromium не вважає його сертифікат безпеки надійним. Імовірні причини: неправильна конфігурація або хтось намагається перехопити ваше з’єднання.</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">Підтвердити перехід</translation> <translation id="5299298092464848405">Помилка аналізу правила</translation> <translation id="5300589172476337783">Показати</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />очистити файли cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Повідомлення про аварійне завершення роботи вимкнено.</translation> <translation id="5317780077021120954">Зберегти</translation> <translation id="5327248766486351172">Назва</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">Перезавантажити</translation> <translation id="5565735124758917034">Активний клієнт</translation> <translation id="560412284261940334">Керування не підтримується</translation> +<translation id="5610142619324316209">перевірити наявність з’єднання</translation> <translation id="5617949217645503996">Хост <ph name="HOST_NAME" /> переспрямував вас забагато разів.</translation> <translation id="5629630648637658800">Помилка завантаження налаштувань правила</translation> <translation id="5631439013527180824">Недійсний маркер керування пристрою</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">Картку підтверджено</translation> <translation id="6146055958333702838">Перевірте всі кабелі та перезавантажте всі маршрутизатори, модеми чи інші мережеві пристрої, які ви використовуєте.</translation> +<translation id="614940544461990577">Спробуйте:</translation> <translation id="6151417162996330722">Сертифікат сервера має задовгий термін дії.</translation> <translation id="6154808779448689242">Отриманий маркер правила не збігається з поточним маркером</translation> <translation id="6165508094623778733">Докладніше</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685">Пошук <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Зараз не можна перейти на сторінку <ph name="SITE" />, оскільки <ph name="BEGIN_LINK" />цей сертифікат відкликано<ph name="END_LINK" />. Помилки мережі й атаки зазвичай є тимчасовими, тому ця сторінка може працювати пізніше.</translation> <translation id="6637478299472506933">Помилка завантаження</translation> +<translation id="6642894344118208103">скинути налаштування модема чи маршрутизатора</translation> <translation id="6644283850729428850">Це правило більше не використовується.</translation> <translation id="6646897916597483132">Введіть код CVC з 4 цифр, розташований на звороті вашої картки</translation> <translation id="6656103420185847513">Редагувати папку</translation> <translation id="6660210980321319655">Автоматичне повідомлення: <ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">Видалити пропозицію автозаповнення форм із Chromium?</translation> +<translation id="6685834062052613830">Вийдіть з облікового запису та завершіть процедуру налаштування</translation> <translation id="6710213216561001401">Попереднє</translation> <translation id="6711464428925977395">Помилка проксі-сервера або неправильна адреса.</translation> <translation id="674375294223700098">Помилка "Невідомий сертифікат сервера".</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">Шлюз або проксі-сервер отримав недійсну відповідь від висхідного сервера.</translation> <translation id="7087282848513945231">Округ або графство</translation> <translation id="7088615885725309056">Давніше</translation> +<translation id="7090678807593890770">Пошукайте за запитом "<ph name="LINK" />" у Google</translation> <translation id="7108649287766967076">Помилка перекладу такою мовою: <ph name="TARGET_LANGUAGE" />.</translation> <translation id="7139724024395191329">Емірат</translation> <translation id="7179921470347911571">Перезапустити зараз</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">Записи в історії не знайдено.</translation> <translation id="8088680233425245692">Не вдалося переглянути статтю.</translation> <translation id="8091372947890762290">Активація очікує на сервері</translation> +<translation id="8134994873729925007">Не вдалося знайти <ph name="BEGIN_ABBR" />адресу DNS-сервера<ph name="END_ABBR" /> хосту <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Ваш комп’ютер перейшов у режим сну.</translation> <translation id="8150722005171944719">Файл за адресою <ph name="URL" /> не читається. Можливо, його видалено, переміщено або доступ заборонено дозволами файлу.</translation> <translation id="8194797478851900357">&Відмінити переміщення</translation> @@ -633,6 +655,7 @@ <translation id="8311778656528046050">Дійсно перезавантажити цю сторінку?</translation> <translation id="8332188693563227489">Відмовлено в доступі до хосту <ph name="HOST_NAME" /></translation> <translation id="8349305172487531364">Панель закладок</translation> +<translation id="8363502534493474904">вимкнути режим польоту</translation> <translation id="8364627913115013041">Не встановлено.</translation> <translation id="8412145213513410671">Аварійне завершення роботи (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Потрібно двічі ввести однакову парольну фразу.</translation> @@ -690,6 +713,7 @@ <translation id="901974403500617787">Позначки, які застосовуються до всієї системи, може встановлювати лише власник: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Сервер відмовив у з’єднанні.</translation> <translation id="9020542370529661692">Цю сторінку перекладено такою мовою: <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Користуйтеся службою передбачення, щоб сторінки завантажувалися швидше</translation> <translation id="9039213469156557790">Окрім цього, сторінка містить незахищені ресурси. Інші особи можуть переглядати їх під час передавання даних, а зловмисники можуть змінювати роботу сторінки.</translation> <translation id="9049981332609050619">Ви пробували зв’язатися з доменом <ph name="DOMAIN" />, але сервер надав недійсний сертифікат.</translation> <translation id="9050666287014529139">Парольна фраза</translation> @@ -703,6 +727,7 @@ <translation id="9170848237812810038">&Скасувати</translation> <translation id="917450738466192189">Сертифікат сервера недійсний.</translation> <translation id="9183425211371246419">Протокол, який використовує хост <ph name="HOST_NAME" />, не підтримується.</translation> +<translation id="9205078245616868884">Ваші дані зашифровано за допомогою парольної фрази. Введіть її, щоб почати синхронізацію.</translation> <translation id="9207861905230894330">Не вдалося додати статтю.</translation> <translation id="933612690413056017">Немає з’єднання з Інтернетом</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 9e3b7a1..7107f69 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này không được hệ điều hành máy tính của bạn tin cậy. Điều này có thể do định cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.</translation> <translation id="1152921474424827756">Truy cập <ph name="BEGIN_LINK" />bản sao được lưu trong bộ nhớ cache<ph name="END_LINK" /> của <ph name="URL" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> đã bất ngờ đóng kết nối.</translation> +<translation id="1161325031994447685">Kết nối lại với Wi-Fi</translation> <translation id="1175364870820465910">&In...</translation> <translation id="1181037720776840403">Xóa</translation> <translation id="1195447618553298278">Lỗi chưa biết.</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">Chính sách người dùng</translation> <translation id="1644184664548287040">Cấu hình mạng không hợp lệ và không thể nhập được.</translation> <translation id="1644574205037202324">Lịch sử</translation> +<translation id="1645368109819982629">Giao thức không được hỗ trợ</translation> <translation id="1655462015569774233">{1,plural, =1{Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này đã hết hạn hôm qua. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn. Đồng hồ máy tính của bạn hiện được đặt là <ph name="CURRENT_DATE" />. Ngày này có đúng không? Nếu không đúng, bạn phải sửa lại đồng hồ của hệ thống rồi làm mới trang này.}other{Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này đã hết hạn cách đây # ngày. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn. Đồng hồ máy tính của bạn hiện được đặt là <ph name="CURRENT_DATE" />. Ngày này có đúng không? Nếu không đúng, bạn phải sửa lại đồng hồ của hệ thống rồi làm mới trang này.}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> thường sử dụng mã hóa để bảo vệ thông tin của bạn. Khi Google Chrome tìm cách kết nối với <ph name="SITE" /> tại thời điểm này, trang web đã gửi lại thông tin đăng nhập không chính xác và bất thường. Điều này có thể xảy ra khi kẻ tấn công đang cố gắng giả mạo là <ph name="SITE" /> hoặc màn hình đăng nhập Wi-Fi đã làm gián đoạn kết nối. Thông tin của bạn vẫn an toàn do Google Chrome đã ngừng kết nối trước khi bất kỳ dữ liệu nào được trao đổi.</translation> <translation id="168841957122794586">Chứng chỉ máy chủ chứa khóa mật mã yếu.</translation> <translation id="1706954506755087368">{1,plural, =1{Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này được đề từ ngày mai. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.}other{Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này được đề # ngày trong tương lai. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.}}</translation> <translation id="1710259589646384581">OS</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">Thử liên hệ với quản trị viên hệ thống.</translation> <translation id="17513872634828108">Tab đang mở</translation> <translation id="1753706481035618306">Số trang</translation> <translation id="1763864636252898013">Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này không được hệ điều hành thiết bị của bạn tin cậy. Điều này có thể do định cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxy được đặt thành định cấu hình tự động.</translation> <translation id="2025623846716345241">Xác nhận tải lại</translation> <translation id="2030481566774242610">Ý của bạn là <ph name="LINK" />?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />Kiểm tra proxy và tường lửa<ph name="END_LINK" /></translation> <translation id="2053553514270667976">Mã zip</translation> <translation id="2065985942032347596">Yêu cầu Xác thực</translation> <translation id="2079545284768500474">Hoàn tác</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">Không tìm thấy chính sách</translation> <translation id="2213606439339815911">Đang tìm nạp các mục nhập...</translation> <translation id="2214283295778284209"><ph name="SITE" /> không có sẵn</translation> +<translation id="2227695659599072496">Kiểm tra cáp mạng hoặc bộ định tuyến</translation> +<translation id="2230458221926704099">Sửa kết nối bằng <ph name="BEGIN_LINK" />ứng dụng chẩn đoán<ph name="END_LINK" /></translation> <translation id="225207911366869382">Giá trị này không được dùng cho chính sách này nữa.</translation> <translation id="2262243747453050782">Lỗi HTTP</translation> <translation id="2279770628980885996">Đã xảy ra điều kiện không mong đợi trong khi máy chủ đang cố gắng hoàn thành yêu cầu.</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">Trình phân tích cú pháp JSON</translation> <translation id="2495093607237746763">Nếu được chọn, Chromium sẽ lưu trữ bản sao thẻ của bạn trên thiết bị này để điền biểu mẫu nhanh hơn.</translation> <translation id="2498091847651709837">Quét thẻ mới</translation> +<translation id="2515629240566999685">Kiểm tra tín hiệu trong khu vực của bạn</translation> <translation id="2516305470678292029">Giao diện người dùng thay thế</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> đã gửi phản hồi không hợp lệ.</translation> <translation id="2552545117464357659">Mới hơn</translation> @@ -221,6 +228,7 @@ <translation id="3254409185687681395">Đánh dấu trang này</translation> <translation id="3270847123878663523">&Hoàn tác sắp xếp lại</translation> <translation id="3286538390144397061">Khởi động lại Ngay bây giờ</translation> +<translation id="3288003805934695103">Đang tải lại trang</translation> <translation id="3305707030755673451">Dữ liệu của bạn đã được mã hóa bằng cụm mật khẩu đồng bộ hóa của bạn vào <ph name="TIME" />. Nhập cụm mật khẩu đó để bắt đầu đồng bộ hóa.</translation> <translation id="333371639341676808">Ngăn không cho trang này tạo hộp thoại bổ sung.</translation> <translation id="3340978935015468852">cài đặt</translation> @@ -264,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation> <translation id="370665806235115550">Đang tải...</translation> <translation id="3712624925041724820">Giấy phép không đủ</translation> +<translation id="3714780639079136834">Bật dữ liệu di dộng hoặc Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />Kiểm tra proxy, tường lửa và cấu hình DNS<ph name="END_LINK" /></translation> <translation id="3739623965217189342">Liên kết đã sao chép</translation> <translation id="3744899669254331632">Bạn không thể truy cập <ph name="SITE" /> ngay bây giờ vì trang web này đã gửi thông tin đăng nhập hỗn độn mà Chromium không thể xử lý. Lỗi mạng và các cuộc tấn công thường chỉ diễn ra tạm thời nên trang này có thể sẽ hoạt động sau.</translation> <translation id="3748412725338508953">Có quá nhiều lần chuyển hướng.</translation> @@ -286,6 +296,7 @@ <translation id="3963721102035795474">Chế độ đọc</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> bị chặn</translation> <translation id="4021036232240155012">DNS là dịch vụ mạng dịch tên trang web sang địa chỉ Internet.</translation> +<translation id="4021376465026729077">Tắt tiện ích</translation> <translation id="4030383055268325496">&Hoàn tác thêm</translation> <translation id="4032534284272647190">Truy cập tới <ph name="URL" /> bị từ chối.</translation> <translation id="404928562651467259">CẢNH BÁO</translation> @@ -302,6 +313,7 @@ <translation id="4171400957073367226">Chữ ký xác minh không hợp lệ</translation> <translation id="4176463684765177261">Đã bị vô hiệu</translation> <translation id="4196861286325780578">&Làm lại di chuyển</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kiểm tra tường lửa và cấu hình diệt vi-rút<ph name="END_LINK" /></translation> <translation id="4220128509585149162">Sự cố</translation> <translation id="4250680216510889253">Không</translation> <translation id="4258748452823770588">Chữ ký không hợp lệ</translation> @@ -322,6 +334,7 @@ <translation id="443673843213245140">Đã tắt sử dụng proxy nhưng cấu hình proxy rõ ràng được chỉ định.</translation> <translation id="4492190037599258964">Kết quả tìm kiếm cho '<ph name="SEARCH_STRING" />'</translation> <translation id="4506176782989081258">Lỗi xác thực: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4506599922270137252">Liên hệ với quản trị viên hệ thống</translation> <translation id="450710068430902550">Chia sẻ với quản trị viên</translation> <translation id="4522570452068850558">Chi tiết</translation> <translation id="4535734014498033861">Không thể kết nối với máy chủ proxy.</translation> @@ -359,6 +372,7 @@ <translation id="5031870354684148875">Giới thiệu về Google Dịch</translation> <translation id="5040262127954254034">Bảo mật</translation> <translation id="5045550434625856497">Mật khẩu sai</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kiểm tra địa chỉ proxy<ph name="END_LINK" /></translation> <translation id="5087286274860437796">Chứng chỉ của máy chủ không hợp lệ tại thời điểm này.</translation> <translation id="5089810972385038852">Tiểu bang</translation> <translation id="5094747076828555589">Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này không được Chromium tin cậy. Điều này có thể do định cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.</translation> @@ -377,6 +391,7 @@ <translation id="5295309862264981122">Xác nhận Điều hướng</translation> <translation id="5299298092464848405">Lỗi phân tích cú pháp chính sách</translation> <translation id="5300589172476337783">Hiển thị</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Xóa các cookie của bạn<ph name="END_LINK" /></translation> <translation id="5308689395849655368">Báo cáo sự cố bị tắt.</translation> <translation id="5317780077021120954">Lưu</translation> <translation id="5327248766486351172">Tên</translation> @@ -404,6 +419,7 @@ <translation id="5556459405103347317">Tải lại</translation> <translation id="5565735124758917034">Đang hoạt động</translation> <translation id="560412284261940334">Không hỗ trợ quản lý</translation> +<translation id="5610142619324316209">Kiểm tra kết nối</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> đã chuyển hướng bạn quá nhiều lần.</translation> <translation id="5629630648637658800">Không thể tải cài đặt chính sách</translation> <translation id="5631439013527180824">Mã thông báo quản lý thiết bị không hợp lệ</translation> @@ -436,6 +452,7 @@ <translation id="6093795393556121384">Thẻ của bạn đã được xác minh</translation> <translation id="6146055958333702838">Kiểm tra mọi dây cáp rồi khởi động lại bộ định tuyến, modem hoặc các thiết bị mạng khác mà bạn có thể đang sử dụng.</translation> +<translation id="614940544461990577">Hãy thử:</translation> <translation id="6151417162996330722">Chứng chỉ máy chủ có thời gian hiệu lực quá dài.</translation> <translation id="6154808779448689242">Mã thông báo chính sách trả lại không phù hợp với mã thông báo hiện tại</translation> <translation id="6165508094623778733">Tìm hiểu thêm</translation> @@ -477,11 +494,13 @@ <translation id="6628463337424475685">Tìm kiếm trên <ph name="ENGINE" /></translation> <translation id="6634865548447745291">Bạn không thể truy cập <ph name="SITE" /> ngay bây giờ do <ph name="BEGIN_LINK" />chứng chỉ này đã bị thu hồi<ph name="END_LINK" />. Lỗi mạng và các cuộc tấn công mạng thường chỉ là tạm thời, do đó trang này có thể sẽ hoạt động lại sau.</translation> <translation id="6637478299472506933">Tải xuống không thành công</translation> +<translation id="6642894344118208103">Đặt lại modem hoặc bộ định tuyến</translation> <translation id="6644283850729428850">Chính sách này không được chấp thuận.</translation> <translation id="6646897916597483132">Nhập CVC gồm 4 chữ số ở mặt trước thẻ của bạn</translation> <translation id="6656103420185847513">Chỉnh sửa thư mục</translation> <translation id="6660210980321319655"><ph name="CRASH_TIME" /> được báo cáo tự động</translation> <translation id="6671697161687535275">Bạn muốn xóa đề xuất biểu mẫu khỏi Chromium?</translation> +<translation id="6685834062052613830">Đăng xuất và hoàn thành quá trình thiết lập</translation> <translation id="6710213216561001401">Trước đó</translation> <translation id="6711464428925977395">Đã xảy ra sự cố với máy chủ proxy hoặc địa chỉ không chính xác.</translation> <translation id="674375294223700098">Lỗi chứng chỉ máy chủ không xác định.</translation> @@ -516,6 +535,7 @@ <translation id="7052500709156631672">Cổng vào hoặc máy chủ proxy đã nhận được phản hồi không hợp lệ từ máy chủ luồng trên.</translation> <translation id="7087282848513945231">Hạt</translation> <translation id="7088615885725309056">Cũ hơn</translation> +<translation id="7090678807593890770">Tìm kiếm <ph name="LINK" /> trên Google</translation> <translation id="7108649287766967076">Bản dịch sang <ph name="TARGET_LANGUAGE" /> không thành công.</translation> <translation id="7139724024395191329">Tiểu vương quốc</translation> <translation id="7179921470347911571">Chạy lại ngay bây giờ</translation> @@ -608,6 +628,7 @@ <translation id="8034955203865359138">Không tìm thấy mục nhập lịch sử nào.</translation> <translation id="8088680233425245692">Không xem được bài viết.</translation> <translation id="8091372947890762290">Kích hoạt đang chờ xử lý trên máy chủ</translation> +<translation id="8134994873729925007">Không thể tìm thấy <ph name="BEGIN_ABBR" />địa chỉ DNS<ph name="END_ABBR" /> của máy chủ của <ph name="HOST_NAME" />.</translation> <translation id="8149426793427495338">Máy tính của bạn đã chuyển sang chế độ ngủ.</translation> <translation id="8150722005171944719">Không thể đọc được tệp tại <ph name="URL" />. Tệp này có thể đã bị xóa, di chuyển hoặc quyền tệp có thể đang chặn truy cập.</translation> <translation id="8194797478851900357">&Hoàn tác di chuyển</translation> @@ -635,6 +656,7 @@ <translation id="8311778656528046050">Bạn có chắc chắn muốn tải lại trang này không?</translation> <translation id="8332188693563227489">Quyền truy cập <ph name="HOST_NAME" /> bị từ chối</translation> <translation id="8349305172487531364">Thanh dấu trang</translation> +<translation id="8363502534493474904">Tắt chế độ trên máy bay</translation> <translation id="8364627913115013041">Chưa được đặt.</translation> <translation id="8412145213513410671">Sự cố (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Bạn phải nhập cùng một cụm mật khẩu hai lần.</translation> @@ -692,6 +714,7 @@ <translation id="901974403500617787">Chỉ chủ sở hữu mới có thể đặt cờ áp dụng cho toàn hệ thống: <ph name="OWNER_EMAIL" />.</translation> <translation id="9020142588544155172">Máy chủ đã từ chối kết nối.</translation> <translation id="9020542370529661692">Trang này đã được dịch sang <ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">Sử dụng dịch vụ truy vấn dự đoán để tải trang nhanh hơn</translation> <translation id="9039213469156557790">Ngoài ra, trang này bao gồm các tài nguyên khác không an toàn. Những tài nguyên này có thể bị người khác xem khi đang gửi và có thể bị kẻ tấn công sửa đổi nhằm thay đổi hành vi của trang.</translation> <translation id="9049981332609050619">Bạn đã cố truy cập vào <ph name="DOMAIN" />, nhưng máy chủ cho biết chứng chỉ không hợp lệ.</translation> <translation id="9050666287014529139">Cụm mật khẩu</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 666cec95..3700f39 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -24,6 +24,7 @@ <translation id="1150979032973867961">此服务器无法证明它是<ph name="DOMAIN" />;您计算机的操作系统不信任其安全证书。出现此问题的原因可能是配置有误或您的连接被拦截了。</translation> <translation id="1152921474424827756">访问<ph name="URL" />的<ph name="BEGIN_LINK" />缓存副本<ph name="END_LINK" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> 意外终止了连接。</translation> +<translation id="1161325031994447685">重新连接到 Wi-Fi 网络</translation> <translation id="1175364870820465910">打印(&P)...</translation> <translation id="1181037720776840403">删除</translation> <translation id="1195447618553298278">未知错误。</translation> @@ -65,12 +66,14 @@ <translation id="1640180200866533862">用户政策</translation> <translation id="1644184664548287040">网络配置无效,无法导入。</translation> <translation id="1644574205037202324">历史记录</translation> +<translation id="1645368109819982629">协议不受支持</translation> <translation id="1655462015569774233">{1,plural, =1{此服务器无法证明它是 <ph name="DOMAIN" />;其安全证书已在昨天过期。出现此问题的原因可能是配置有误,或有攻击者拦截了您的连接。计算机的时钟目前已设为 <ph name="CURRENT_DATE" />,该设置是否正确?如果不正确,请更正系统的时钟,然后刷新此页面。}other{此服务器无法证明它是 <ph name="DOMAIN" />;其安全证书已在 # 天前过期。出现此问题的原因可能是配置有误,或有攻击者拦截了您的连接。计算机的时钟目前已设为 <ph name="CURRENT_DATE" />,该设置是否正确?如果不正确,请更正系统的时钟,然后刷新此页面。}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> 通常会使用加密技术来保护您的信息。Google Chrome 此次尝试连接到 <ph name="SITE" /> 时,此网站发回了异常的错误凭据。这可能是因为有攻击程序在试图冒充 <ph name="SITE" />,或 Wi-Fi 登录屏幕中断了此次连接。请放心,您的信息仍然是安全的,因为 Google Chrome 尚未进行任何数据交换便停止了连接。</translation> <translation id="168841957122794586">服务器证书包含弱加密密钥。</translation> <translation id="1706954506755087368">{1,plural, =1{此服务器无法证明它是 <ph name="DOMAIN" />;其安全证书明天才会生效。出现此问题的原因可能是配置有误,或有攻击者拦截了您的连接。}other{此服务器无法证明它是 <ph name="DOMAIN" />;其安全证书 # 天后才会生效。出现此问题的原因可能是配置有误,或有攻击者拦截了您的连接。}}</translation> <translation id="1710259589646384581">操作系统</translation> <translation id="1734864079702812349">美国运通卡</translation> +<translation id="1734878702283171397">请尝试联系系统管理员。</translation> <translation id="17513872634828108">目前打开的标签页</translation> <translation id="1753706481035618306">页码</translation> <translation id="1763864636252898013">此服务器无法证明它是<ph name="DOMAIN" />;您设备的操作系统不信任其安全证书。出现此问题的原因可能是配置有误或您的连接被拦截了。</translation> @@ -92,6 +95,7 @@ <translation id="2025186561304664664">代理已设为自动配置。</translation> <translation id="2025623846716345241">确认重新加载</translation> <translation id="2030481566774242610">您是想访问<ph name="LINK" />吗?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />检查代理服务器和防火墙<ph name="END_LINK" /></translation> <translation id="2053553514270667976">邮编</translation> <translation id="2065985942032347596">需要进行身份验证</translation> <translation id="2079545284768500474">撤消</translation> @@ -115,6 +119,8 @@ <translation id="2212735316055980242">找不到策略</translation> <translation id="2213606439339815911">正在获取条目…</translation> <translation id="2214283295778284209">无法访问 <ph name="SITE" /></translation> +<translation id="2227695659599072496">检查网线或路由器</translation> +<translation id="2230458221926704099">请使用<ph name="BEGIN_LINK" />诊断应用<ph name="END_LINK" />修复网络连接</translation> <translation id="225207911366869382">适用于该政策的此值已弃用。</translation> <translation id="2262243747453050782">HTTP 错误</translation> <translation id="2279770628980885996">服务器尝试执行请求时遇到了意外情况。</translation> @@ -142,6 +148,7 @@ <translation id="2495083838625180221">JSON 解析器</translation> <translation id="2495093607237746763">选中后,Chromium 会将您的信用卡副本存储在此设备上,以加快表单填写速度。</translation> <translation id="2498091847651709837">扫描新的信用卡</translation> +<translation id="2515629240566999685">检查您所在区域的网络信号</translation> <translation id="2516305470678292029">界面备选项</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> 发送的响应无效。</translation> <translation id="2552545117464357659">往后</translation> @@ -211,6 +218,8 @@ <translation id="3254409185687681395">为此页添加书签</translation> <translation id="3270847123878663523">撤消顺序调整(&U)</translation> <translation id="3286538390144397061">立即重新启动</translation> +<translation id="3288003805934695103">重新加载网页</translation> +<translation id="3305707030755673451">您的数据已于 <ph name="TIME" />使用您的同步密码加密。输入该密码即可开始同步。</translation> <translation id="333371639341676808">禁止此页再显示对话框。</translation> <translation id="3340978935015468852">设置</translation> <translation id="3355823806454867987">更改代理服务器设置...</translation> @@ -253,6 +262,8 @@ <translation id="3704609568417268905"><ph name="TIME" /> - <ph name="BOOKMARKED" /> - <ph name="TITLE" /> - <ph name="DOMAIN" /></translation> <translation id="370665806235115550">正在加载...</translation> <translation id="3712624925041724820">许可已用尽</translation> +<translation id="3714780639079136834">开启移动数据网络或 Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />检查代理服务器、防火墙和 DNS 配置<ph name="END_LINK" /></translation> <translation id="3739623965217189342">您复制的链接</translation> <translation id="3744899669254331632">您目前无法访问 <ph name="SITE" />,因为此网站发送了 Chromium 无法处理的杂乱凭据。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。</translation> <translation id="3748412725338508953">重定向过多。</translation> @@ -274,6 +285,7 @@ <translation id="3963721102035795474">阅读器模式</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> 已被屏蔽</translation> <translation id="4021036232240155012">DNS 是一项网络服务,可将网站的名称转译为其对应的互联网地址。</translation> +<translation id="4021376465026729077">停用扩展程序</translation> <translation id="4030383055268325496">撤消添加(&U)</translation> <translation id="4032534284272647190"><ph name="URL" /> 拒绝访问。</translation> <translation id="404928562651467259">警告</translation> @@ -290,6 +302,7 @@ <translation id="4171400957073367226">验证签名无效</translation> <translation id="4176463684765177261">已停用</translation> <translation id="4196861286325780578">恢复移动(&R)</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />检查防火墙和防病毒配置<ph name="END_LINK" /></translation> <translation id="4220128509585149162">崩溃</translation> <translation id="4250680216510889253">否</translation> <translation id="4258748452823770588">签名无效</translation> @@ -310,6 +323,7 @@ <translation id="443673843213245140">已停用代理,但是指定了明确的代理配置。</translation> <translation id="4492190037599258964">“<ph name="SEARCH_STRING" />”的搜索结果</translation> <translation id="4506176782989081258">验证错误:<ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">联系系统管理员</translation> <translation id="450710068430902550">与管理员分享</translation> <translation id="4522570452068850558">详细信息</translation> <translation id="4535734014498033861">代理服务器连接失败。</translation> @@ -347,6 +361,7 @@ <translation id="5031870354684148875">关于 Google 翻译</translation> <translation id="5040262127954254034">隐私设置</translation> <translation id="5045550434625856497">密码不正确</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />检查代理服务器地址<ph name="END_LINK" /></translation> <translation id="5087286274860437796">服务器的证书目前无效。</translation> <translation id="5089810972385038852">州</translation> <translation id="5094747076828555589">此服务器无法证明它是<ph name="DOMAIN" />;Chromium不信任其安全证书。出现此问题的原因可能是配置有误或您的连接被拦截了。</translation> @@ -365,6 +380,7 @@ <translation id="5295309862264981122">确认导航</translation> <translation id="5299298092464848405">解析策略时出错</translation> <translation id="5300589172476337783">显示</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />清除 Cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">已停用崩溃报告。</translation> <translation id="5317780077021120954">保存</translation> <translation id="5327248766486351172">名称</translation> @@ -392,6 +408,7 @@ <translation id="5556459405103347317">重新加载</translation> <translation id="5565735124758917034">主动</translation> <translation id="560412284261940334">不支持管理</translation> +<translation id="5610142619324316209">检查网络连接</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> 将您重定向的次数过多。</translation> <translation id="5629630648637658800">无法加载策略设置</translation> <translation id="5631439013527180824">设备管理令牌无效</translation> @@ -423,6 +440,7 @@ <translation id="6060685159320643512">请小心,这些实验性功能可能有风险</translation> <translation id="6093795393556121384">您的信用卡已成功验证</translation> <translation id="6146055958333702838">请检查所有网线是否都已连好,然后重新启动您可能正在使用的任何路由器、调制解调器或其他网络设备。</translation> +<translation id="614940544461990577">请试试以下办法:</translation> <translation id="6151417162996330722">该服务器证书的有效期过长。</translation> <translation id="6154808779448689242">返回的策略令牌与当前令牌不匹配</translation> <translation id="6165508094623778733">了解详情</translation> @@ -463,11 +481,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> 搜索</translation> <translation id="6634865548447745291">您目前无法访问<ph name="SITE" />,因为<ph name="BEGIN_LINK" />此证书已被撤消<ph name="END_LINK" />。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。</translation> <translation id="6637478299472506933">下载失败</translation> +<translation id="6642894344118208103">重置调制解调器或路由器</translation> <translation id="6644283850729428850">此政策已弃用。</translation> <translation id="6646897916597483132">输入信用卡正面显示的 4 位数银行卡验证码 (CVC)</translation> <translation id="6656103420185847513">修改文件夹</translation> <translation id="6660210980321319655">自动报告时间:<ph name="CRASH_TIME" /></translation> <translation id="6671697161687535275">要从 Chromium 中移除表单填写建议吗?</translation> +<translation id="6685834062052613830">请退出并完成设置</translation> <translation id="6710213216561001401">上一个</translation> <translation id="6711464428925977395">代理服务器出现问题,或者地址有误。</translation> <translation id="674375294223700098">未知的服务器证书错误。</translation> @@ -497,6 +517,7 @@ <translation id="7052500709156631672">网关或代理服务器从上游服务器收到的响应无效。</translation> <translation id="7087282848513945231">县/郡</translation> <translation id="7088615885725309056">往前</translation> +<translation id="7090678807593890770">请在 Google 中搜索“<ph name="LINK" />”</translation> <translation id="7108649287766967076">无法翻译成<ph name="TARGET_LANGUAGE" />。</translation> <translation id="7139724024395191329">酋长国</translation> <translation id="7179921470347911571">立即重新启动</translation> @@ -589,6 +610,7 @@ <translation id="8034955203865359138">未找到任何历史记录条目。</translation> <translation id="8088680233425245692">无法查看文章。</translation> <translation id="8091372947890762290">正等待在服务器上激活</translation> +<translation id="8134994873729925007">找不到 <ph name="HOST_NAME" /> 的服务器 <ph name="BEGIN_ABBR" />DNS 地址<ph name="END_ABBR" />。</translation> <translation id="8149426793427495338">您的计算机已进入休眠模式。</translation> <translation id="8150722005171944719">无法读取 <ph name="URL" /> 上的文件。该文件可能已遭到删除、移动,或者文件权限不允许进行访问。</translation> <translation id="8194797478851900357">撤消移动(&U)</translation> @@ -608,6 +630,7 @@ <translation id="8311778656528046050">确定要重新加载此网页吗?</translation> <translation id="8332188693563227489">访问 <ph name="HOST_NAME" /> 的请求遭到拒绝</translation> <translation id="8349305172487531364">书签栏</translation> +<translation id="8363502534493474904">关闭飞行模式</translation> <translation id="8364627913115013041">未设置。</translation> <translation id="8412145213513410671">崩溃次数(<ph name="CRASH_COUNT" /> 次)</translation> <translation id="8412392972487953978">您两次输入的密码必须相同。</translation> @@ -665,6 +688,7 @@ <translation id="901974403500617787">应用于整个系统的设置只能由以下所有者设定:<ph name="OWNER_EMAIL" />。</translation> <translation id="9020142588544155172">服务器拒绝了连接。</translation> <translation id="9020542370529661692">已将此网页内容翻译成<ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">使用联想查询服务更快速地加载网页</translation> <translation id="9039213469156557790">而且,此页中包含其他不安全的资源。他人能在这些资源传输过程中进行查看,而攻击者可以修改这些资源,从而改变此页的行为。</translation> <translation id="9049981332609050619">您试图访问 <ph name="DOMAIN" />,但服务器提供的证书无效。</translation> <translation id="9050666287014529139">密码</translation> @@ -678,6 +702,7 @@ <translation id="9170848237812810038">撤消(&U)</translation> <translation id="917450738466192189">服务器证书无效。</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> 使用了不受支持的协议。</translation> +<translation id="9205078245616868884">您的数据已使用您的同步密码加密。输入该密码即可开始同步。</translation> <translation id="9207861905230894330">无法添加文章。</translation> <translation id="933612690413056017">未连接到互联网</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index f908a9e..0db72cc 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -26,6 +26,7 @@ <translation id="1150979032973867961">伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證未取得您電腦作業系統的信任。這可能是因為設定錯誤,或有攻擊者攔截您的連線所致。</translation> <translation id="1152921474424827756">存取 <ph name="URL" /> 的<ph name="BEGIN_LINK" />頁庫存檔副本<ph name="END_LINK" /></translation> <translation id="1158211211994409885"><ph name="HOST_NAME" /> 意外中斷連線。</translation> +<translation id="1161325031994447685">重新連線至 Wi-Fi 網路</translation> <translation id="1175364870820465910">列印(&P)...</translation> <translation id="1181037720776840403">移除</translation> <translation id="1195447618553298278">未知的錯誤。</translation> @@ -67,12 +68,14 @@ <translation id="1640180200866533862">使用者政策</translation> <translation id="1644184664548287040">網路設定無效,無法匯入。</translation> <translation id="1644574205037202324">歷史紀錄</translation> +<translation id="1645368109819982629">不支援的通訊協定</translation> <translation id="1655462015569774233">{1,plural, =1{這個伺服器無法證明所在網域是 <ph name="DOMAIN" />;伺服器的安全性憑證已在昨天過期。這可能是因為設定錯誤,或是有攻擊者攔截您的連線。您電腦的時鐘目前設為 <ph name="CURRENT_DATE" />,這是正確的時間嗎?如果不是的話,請更新系統時鐘,然後重新整理這個網頁。}other{這個伺服器無法證明所在網域是 <ph name="DOMAIN" />;伺服器的安全性憑證已在 # 天前過期。這可能是因為設定錯誤,或是有攻擊者攔截您的連線。您電腦的時鐘目前設為 <ph name="CURRENT_DATE" />,這是正確的時間嗎?如果不是的話,請更新系統時鐘,然後重新整理這個網頁。}}</translation> <translation id="1676269943528358898"><ph name="SITE" /> 通常使用加密方式保護您的資訊。但 Google Chrome 這次嘗試連線到 <ph name="SITE" /> 時,該網站傳回了異常且錯誤的憑證。這可能是因為有攻擊者企圖偽裝成 <ph name="SITE" />,或是受到 Wi-Fi 登入畫面影響而造成連線中斷。不過請放心,Google Chrome 已及時停止連線,並未傳輸任何資料,因此您的資訊仍然安全無虞。</translation> <translation id="168841957122794586">伺服器憑證含有防護力薄弱的加密編譯金鑰。</translation> <translation id="1706954506755087368">{1,plural, =1{這個伺服器無法證明所在網域是 <ph name="DOMAIN" />;伺服器的安全性憑證預定明天才生效。這可能是因為設定錯誤,或是有攻擊者攔截您的連線。}other{這個伺服器無法證明所在網域是 <ph name="DOMAIN" />;伺服器的安全性憑證預定 # 天後才生效。這可能是因為設定錯誤,或是有攻擊者攔截您的連線。}}</translation> <translation id="1710259589646384581">作業系統</translation> <translation id="1734864079702812349">Amex</translation> +<translation id="1734878702283171397">建議您與系統管理員聯絡。</translation> <translation id="17513872634828108">開啟分頁</translation> <translation id="1753706481035618306">頁碼</translation> <translation id="1763864636252898013">伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證未取得您裝置作業系統的信任。這可能是因為設定錯誤,或有攻擊者攔截您的連線所致。</translation> @@ -94,6 +97,7 @@ <translation id="2025186561304664664">Proxy 已設為自動設定。</translation> <translation id="2025623846716345241">確認重新載入</translation> <translation id="2030481566774242610">您要找的是 <ph name="LINK" /> 嗎?</translation> +<translation id="2032962459168915086"><ph name="BEGIN_LINK" />檢查 Proxy 和防火牆<ph name="END_LINK" /></translation> <translation id="2053553514270667976">郵遞區號</translation> <translation id="2065985942032347596">需要驗證</translation> <translation id="2079545284768500474">復原</translation> @@ -119,6 +123,8 @@ <translation id="2212735316055980242">找不到政策</translation> <translation id="2213606439339815911">正在擷取項目...</translation> <translation id="2214283295778284209"><ph name="SITE" /> 無法使用</translation> +<translation id="2227695659599072496">檢查網路線或路由器</translation> +<translation id="2230458221926704099">請使用<ph name="BEGIN_LINK" />診斷應用程式<ph name="END_LINK" />修正連線問題</translation> <translation id="225207911366869382">這個政策值已遭汰換。</translation> <translation id="2262243747453050782">HTTP 錯誤</translation> <translation id="2279770628980885996">伺服器嘗試處理要求時遇到意外狀況。</translation> @@ -146,6 +152,7 @@ <translation id="2495083838625180221">JSON 剖析器</translation> <translation id="2495093607237746763">勾選後,Chromium 會將您的信用卡資料儲存在這個裝置上,以加快表單填寫速度。</translation> <translation id="2498091847651709837">掃描新信用卡</translation> +<translation id="2515629240566999685">檢查所在位置的網路訊號</translation> <translation id="2516305470678292029">替代使用者介面</translation> <translation id="255002559098805027"><ph name="HOST_NAME" /> 傳送的回應無效。</translation> <translation id="2552545117464357659">較新紀錄</translation> @@ -221,6 +228,8 @@ <translation id="3254409185687681395">把此頁加入書籤</translation> <translation id="3270847123878663523">復原重新排序(&U)</translation> <translation id="3286538390144397061">立即重新啟動</translation> +<translation id="3288003805934695103">重新載入網頁</translation> +<translation id="3305707030755673451">您已在 <ph name="TIME" />使用同步通關密語對資料進行加密,請輸入通關密語開始進行同步。</translation> <translation id="333371639341676808">防止此網頁產生其他對話方塊。</translation> <translation id="3340978935015468852">設定</translation> <translation id="3355823806454867987">變更 Proxy 設定...</translation> @@ -263,6 +272,8 @@ <translation id="3704609568417268905"><ph name="TIME" />,<ph name="BOOKMARKED" />,<ph name="TITLE" />,<ph name="DOMAIN" /></translation> <translation id="370665806235115550">載入中…</translation> <translation id="3712624925041724820">授權已用盡</translation> +<translation id="3714780639079136834">開啟行動數據或 Wi-Fi</translation> +<translation id="3717027428350673159"><ph name="BEGIN_LINK" />檢查 Proxy、防火牆和 DNS 設定<ph name="END_LINK" /></translation> <translation id="3739623965217189342">您複製的連結</translation> <translation id="3744899669254331632"><ph name="SITE" /> 傳送的憑證受到干擾,造成 Chromium 無法處理,因此您目前無法造訪該網站。網路錯誤和攻擊通常是暫時性狀態,因此這個網頁可能稍後就會恢復正常運作。</translation> <translation id="3748412725338508953">重新導向次數過多。</translation> @@ -285,6 +296,7 @@ <translation id="3963721102035795474">閱讀器模式</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> 遭到封鎖</translation> <translation id="4021036232240155012">DNS 這項網路服務會將網站的名稱轉譯成網際網路位址。</translation> +<translation id="4021376465026729077">停用擴充功能</translation> <translation id="4030383055268325496">復原新增(&U)</translation> <translation id="4032534284272647190">瀏覽 <ph name="URL" /> 遭到拒絕。</translation> <translation id="404928562651467259">警告</translation> @@ -301,6 +313,7 @@ <translation id="4171400957073367226">驗證簽名無效</translation> <translation id="4176463684765177261">已停用</translation> <translation id="4196861286325780578">重做移動(&R)</translation> +<translation id="4203896806696719780"><ph name="BEGIN_LINK" />檢查防火牆和防毒軟體設定<ph name="END_LINK" /></translation> <translation id="4220128509585149162">當機</translation> <translation id="4250680216510889253">否</translation> <translation id="4258748452823770588">簽名有誤</translation> @@ -321,6 +334,7 @@ <translation id="443673843213245140">雖然已停用 Proxy,不過已指定明確 Proxy 設定。</translation> <translation id="4492190037599258964">「<ph name="SEARCH_STRING" />」的搜尋結果</translation> <translation id="4506176782989081258">驗證錯誤:<ph name="VALIDATION_ERROR" /></translation> +<translation id="4506599922270137252">與系統管理員聯絡</translation> <translation id="450710068430902550">與管理員分享</translation> <translation id="4522570452068850558">詳細資訊</translation> <translation id="4535734014498033861">Proxy 伺服器連線失敗</translation> @@ -358,6 +372,7 @@ <translation id="5031870354684148875">關於「Google 翻譯」</translation> <translation id="5040262127954254034">隱私權</translation> <translation id="5045550434625856497">密碼不正確</translation> +<translation id="5070335125961472645"><ph name="BEGIN_LINK" />檢查 Proxy 位址<ph name="END_LINK" /></translation> <translation id="5087286274860437796">伺服器憑證目前無效。</translation> <translation id="5089810972385038852">州</translation> <translation id="5094747076828555589">伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證未取得 Chromium 的信任。這可能是因為設定錯誤,或有攻擊者攔截您的連線所致。</translation> @@ -376,6 +391,7 @@ <translation id="5295309862264981122">確認瀏覽</translation> <translation id="5299298092464848405">解析政策時發生錯誤</translation> <translation id="5300589172476337783">顯示</translation> +<translation id="5307361445257083764"><ph name="BEGIN_LINK" />清除 Cookie<ph name="END_LINK" /></translation> <translation id="5308689395849655368">當機報告功能已停用。</translation> <translation id="5317780077021120954">儲存</translation> <translation id="5327248766486351172">名稱</translation> @@ -403,6 +419,7 @@ <translation id="5556459405103347317">重新載入</translation> <translation id="5565735124758917034">管理中</translation> <translation id="560412284261940334">系統不支援管理</translation> +<translation id="5610142619324316209">檢查連線狀態</translation> <translation id="5617949217645503996"><ph name="HOST_NAME" /> 將您重新導向的次數過多。</translation> <translation id="5629630648637658800">無法載入政策設定</translation> <translation id="5631439013527180824">裝置管理符記無效</translation> @@ -435,6 +452,7 @@ <translation id="6093795393556121384">已成功驗證您的信用卡</translation> <translation id="6146055958333702838">檢查您的網路線是否穩固連接。重新啟動您可能正在使用的任何路由器、 數據機或其他網路裝置。</translation> +<translation id="614940544461990577">建議做法:</translation> <translation id="6151417162996330722">伺服器憑證的有效期限太長。</translation> <translation id="6154808779448689242">傳回的政策符記與目前符記不相符</translation> <translation id="6165508094623778733">瞭解詳情</translation> @@ -476,11 +494,13 @@ <translation id="6628463337424475685"><ph name="ENGINE" /> 搜尋</translation> <translation id="6634865548447745291">您目前無法造訪 <ph name="SITE" />,因為<ph name="BEGIN_LINK" />這個網站的憑證已遭撤銷<ph name="END_LINK" />。網路錯誤和攻擊行為通常是暫時性的,所以這個網頁可能稍後就能正常使用。</translation> <translation id="6637478299472506933">下載失敗</translation> +<translation id="6642894344118208103">重設數據機或路由器</translation> <translation id="6644283850729428850">這項政策已遭取代。</translation> <translation id="6646897916597483132">請輸入信用卡正面的四位數信用卡安全碼</translation> <translation id="6656103420185847513">編輯資料夾</translation> <translation id="6660210980321319655">已自動回報 (<ph name="CRASH_TIME" />)</translation> <translation id="6671697161687535275">要從 Chromium 中移除表單填寫建議嗎?</translation> +<translation id="6685834062052613830">請登出並完成設定程序</translation> <translation id="6710213216561001401">返回</translation> <translation id="6711464428925977395">Proxy 伺服器發生錯誤,或是位址不正確。</translation> <translation id="674375294223700098">不明的伺服器憑證錯誤。</translation> @@ -515,6 +535,7 @@ <translation id="7052500709156631672">閘道或 Proxy 伺服器接收到來自上游伺服器的無效回應。</translation> <translation id="7087282848513945231">郡</translation> <translation id="7088615885725309056">較舊記錄</translation> +<translation id="7090678807593890770">請透過 Google 搜尋「<ph name="LINK" />」</translation> <translation id="7108649287766967076">無法將網頁內容翻譯成<ph name="TARGET_LANGUAGE" />。</translation> <translation id="7139724024395191329">大公國</translation> <translation id="7179921470347911571">立即重新啟動</translation> @@ -607,6 +628,7 @@ <translation id="8034955203865359138">找不到任何紀錄項目。</translation> <translation id="8088680233425245692">無法查看文章。</translation> <translation id="8091372947890762290">尚未在伺服器上啟動</translation> +<translation id="8134994873729925007">找不到 <ph name="HOST_NAME" /> 的伺服器 <ph name="BEGIN_ABBR" />DNS 位址<ph name="END_ABBR" />。</translation> <translation id="8149426793427495338">您的電腦已進入睡眠模式。</translation> <translation id="8150722005171944719">無法讀取位於 <ph name="URL" /> 的檔案。這個檔案可能已遭移除或移動位置,或者檔案權限為禁止存取。</translation> <translation id="8194797478851900357">復原移動(&U)</translation> @@ -634,6 +656,7 @@ <translation id="8311778656528046050">您確定要重新載入這個網頁?</translation> <translation id="8332188693563227489">存取 <ph name="HOST_NAME" /> 的要求遭到拒絕</translation> <translation id="8349305172487531364">書籤列</translation> +<translation id="8363502534493474904">關閉飛航模式</translation> <translation id="8364627913115013041">未設定。</translation> <translation id="8412145213513410671">當機次數 (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">您必須輸入兩次相同的通關密語。</translation> @@ -691,6 +714,7 @@ <translation id="901974403500617787">這些設定會套用至整個系統,只有以下使用者可設定:<ph name="OWNER_EMAIL" />。</translation> <translation id="9020142588544155172">伺服器拒絕連線。</translation> <translation id="9020542370529661692">此網頁內容已翻譯成<ph name="TARGET_LANGUAGE" /></translation> +<translation id="9038649477754266430">使用預測查詢字串服務,以便更快載入網頁</translation> <translation id="9039213469156557790">此外,這個網頁含有其他不安全的資源。其他人可能會在資源傳輸期間檢視這些資源,攻擊者也可能會修改這些資源,進而變更網頁行為。</translation> <translation id="9049981332609050619">您嘗試連線至 <ph name="DOMAIN" />,但伺服器提供的憑證無效。</translation> <translation id="9050666287014529139">通關密語</translation> @@ -704,6 +728,7 @@ <translation id="9170848237812810038">取消(&U)</translation> <translation id="917450738466192189">伺服器憑證無效。</translation> <translation id="9183425211371246419"><ph name="HOST_NAME" /> 使用了不支援的通訊協定。</translation> +<translation id="9205078245616868884">您已使用同步通關密語對資料進行加密,請輸入通關密語開始進行同步。</translation> <translation id="9207861905230894330">無法新增文章。</translation> <translation id="933612690413056017">無法連上網際網路</translation> <translation id="933712198907837967">Diners Club</translation>
diff --git a/components/test_runner/event_sender.cc b/components/test_runner/event_sender.cc index 31867c9..359aa002 100644 --- a/components/test_runner/event_sender.cc +++ b/components/test_runner/event_sender.cc
@@ -20,6 +20,7 @@ #include "gin/handle.h" #include "gin/object_template_builder.h" #include "gin/wrappable.h" +#include "third_party/WebKit/public/platform/WebPointerProperties.h" #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebVector.h" #include "third_party/WebKit/public/web/WebContextMenuData.h" @@ -45,6 +46,7 @@ using blink::WebMouseWheelEvent; using blink::WebPagePopup; using blink::WebPoint; +using blink::WebPointerProperties; using blink::WebString; using blink::WebTouchEvent; using blink::WebTouchPoint; @@ -1897,6 +1899,7 @@ void EventSender::AddTouchPoint(float x, float y, gin::Arguments* args) { WebTouchPoint touch_point; + touch_point.pointerType = WebPointerProperties::PointerType::Touch; touch_point.state = WebTouchPoint::StatePressed; touch_point.position = WebFloatPoint(x, y); touch_point.screenPosition = touch_point.position;
diff --git a/components/tracing/child_trace_message_filter_browsertest.cc b/components/tracing/child_trace_message_filter_browsertest.cc index 011b556..1dc08d5 100644 --- a/components/tracing/child_trace_message_filter_browsertest.cc +++ b/components/tracing/child_trace_message_filter_browsertest.cc
@@ -4,6 +4,8 @@ #include <stdint.h> +#include <tuple> + #include "base/callback.h" #include "base/run_loop.h" #include "base/thread_task_runner_handle.h" @@ -138,8 +140,8 @@ // Check that the |dump_guid| and the |success| fields are properly set. TracingHostMsg_ProcessMemoryDumpResponse::Param params; TracingHostMsg_ProcessMemoryDumpResponse::Read(msg, ¶ms); - const uint64_t resp_guid = base::get<0>(params); - const bool resp_success = base::get<1>(params); + const uint64_t resp_guid = std::get<0>(params); + const bool resp_success = std::get<1>(params); EXPECT_EQ(dump_guid, resp_guid); EXPECT_TRUE(resp_success); } @@ -153,7 +155,7 @@ EXPECT_NE(nullptr, msg); TracingHostMsg_GlobalMemoryDumpRequest::Param params; TracingHostMsg_GlobalMemoryDumpRequest::Read(msg, ¶ms); - MemoryDumpRequestArgs args = base::get<0>(params); + MemoryDumpRequestArgs args = std::get<0>(params); EXPECT_NE(0U, args.dump_guid); return args; }
diff --git a/components/variations/entropy_provider.h b/components/variations/entropy_provider.h index fa7a1e2..27e73eb 100644 --- a/components/variations/entropy_provider.h +++ b/components/variations/entropy_provider.h
@@ -24,7 +24,7 @@ // A functor that generates random numbers based on a seed, using the Mersenne // Twister algorithm. Suitable for use with std::random_shuffle(). -struct SeededRandGenerator : std::unary_function<uint32_t, uint32_t> { +struct SeededRandGenerator { explicit SeededRandGenerator(uint32_t seed); ~SeededRandGenerator();
diff --git a/content/app/android/child_process_service.cc b/content/app/android/child_process_service.cc index 3627eba..0e2bfc2b 100644 --- a/content/app/android/child_process_service.cc +++ b/content/app/android/child_process_service.cc
@@ -14,10 +14,10 @@ #include "base/macros.h" #include "base/posix/global_descriptors.h" #include "content/child/child_thread_impl.h" -#include "content/common/android/surface_texture_manager.h" -#include "content/common/android/surface_texture_peer.h" #include "content/common/gpu/gpu_surface_lookup.h" #include "content/public/common/content_descriptors.h" +#include "gpu/ipc/common/android/surface_texture_manager.h" +#include "gpu/ipc/common/android/surface_texture_peer.h" #include "ipc/ipc_descriptors.h" #include "jni/ChildProcessService_jni.h" #include "ui/gl/android/scoped_java_surface.h" @@ -32,8 +32,8 @@ // TODO(sievers): Use two different implementations of this depending on if // we're in a renderer or gpu process. -class SurfaceTextureManagerImpl : public SurfaceTextureManager, - public SurfaceTexturePeer, +class SurfaceTextureManagerImpl : public gpu::SurfaceTextureManager, + public gpu::SurfaceTexturePeer, public GpuSurfaceLookup { public: // |service| is the instance of @@ -146,7 +146,8 @@ jlong cpu_features) { // Set the CPU properties. android_setCpu(cpu_count, cpu_features); - SurfaceTextureManager::SetInstance(new SurfaceTextureManagerImpl(service)); + gpu::SurfaceTextureManager::SetInstance( + new SurfaceTextureManagerImpl(service)); base::android::MemoryPressureListenerAndroid::RegisterSystemCallback(env); }
diff --git a/content/app/strings/translations/content_strings_el.xtb b/content/app/strings/translations/content_strings_el.xtb index c4b9694..1b619efc 100644 --- a/content/app/strings/translations/content_strings_el.xtb +++ b/content/app/strings/translations/content_strings_el.xtb
@@ -117,7 +117,7 @@ <translation id="6101327004457443354">κατάργηση σίγασης ήχου</translation> <translation id="6119846243427417423">ενεργοποίηση</translation> <translation id="6164829606128959761">μετρητής</translation> -<translation id="6270583010843788609">δείκτης κύλισης χρονικού πλαισίου ταινίας</translation> +<translation id="6270583010843788609">δείκτης κύλισης χρονολογίου ταινίας</translation> <translation id="6359256949422175976">δείκτης κύλισης χρόνου ταινίας</translation> <translation id="6398862346408813489">Εμφάνιση παραθύρου επιλογής μήνα</translation> <translation id="6404546809543547843">δείκτης χρόνου ήχου</translation>
diff --git a/content/browser/DEPS b/content/browser/DEPS index 11466fa..c180ec2 100644 --- a/content/browser/DEPS +++ b/content/browser/DEPS
@@ -51,6 +51,7 @@ # No inclusion of WebKit from the browser, other than strictly enum/POD, # header-only types, and some selected common code. "-third_party/WebKit", + "+third_party/WebKit/public/platform/WebAddressSpace.h", "+third_party/WebKit/public/platform/WebCircularGeofencingRegion.h", "+third_party/WebKit/public/platform/WebCursorInfo.h", "+third_party/WebKit/public/platform/WebDisplayMode.h",
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index e527963..e4c537c 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -27,80 +27,82 @@ namespace { +using SearchKeyToPredicateMap = + base::hash_map<base::string16, AccessibilityMatchPredicate>; +base::LazyInstance<SearchKeyToPredicateMap> g_search_key_to_predicate_map = + LAZY_INSTANCE_INITIALIZER; +base::LazyInstance<base::string16> g_all_search_keys = + LAZY_INSTANCE_INITIALIZER; + +bool SectionPredicate( + BrowserAccessibility* start, BrowserAccessibility* node) { + switch (node->GetRole()) { + case ui::AX_ROLE_ARTICLE: + case ui::AX_ROLE_APPLICATION: + case ui::AX_ROLE_BANNER: + case ui::AX_ROLE_COMPLEMENTARY: + case ui::AX_ROLE_CONTENT_INFO: + case ui::AX_ROLE_HEADING: + case ui::AX_ROLE_MAIN: + case ui::AX_ROLE_NAVIGATION: + case ui::AX_ROLE_SEARCH: + case ui::AX_ROLE_REGION: + return true; + default: + return false; + } +} + +void AddToPredicateMap(const char* search_key_ascii, + AccessibilityMatchPredicate predicate) { + base::string16 search_key_utf16 = base::ASCIIToUTF16(search_key_ascii); + g_search_key_to_predicate_map.Get()[search_key_utf16] = predicate; + if (!g_all_search_keys.Get().empty()) + g_all_search_keys.Get() += base::ASCIIToUTF16(","); + g_all_search_keys.Get() += search_key_utf16; +} + // These are special unofficial strings sent from TalkBack/BrailleBack // to jump to certain categories of web elements. -AccessibilityMatchPredicate PredicateForSearchKey(base::string16 element_type) { - if (element_type == base::ASCIIToUTF16("SECTION")) { - return [](BrowserAccessibility* start, BrowserAccessibility* node) { - switch (node->GetRole()) { - case ui::AX_ROLE_ARTICLE: - case ui::AX_ROLE_APPLICATION: - case ui::AX_ROLE_BANNER: - case ui::AX_ROLE_COMPLEMENTARY: - case ui::AX_ROLE_CONTENT_INFO: - case ui::AX_ROLE_HEADING: - case ui::AX_ROLE_MAIN: - case ui::AX_ROLE_NAVIGATION: - case ui::AX_ROLE_SEARCH: - case ui::AX_ROLE_REGION: - return true; - default: - return false; - } - }; - } else if (element_type == base::ASCIIToUTF16("LIST")) { - return AccessibilityListPredicate; - } else if (element_type == base::ASCIIToUTF16("CONTROL")) { - return AccessibilityControlPredicate; - } else if (element_type == base::ASCIIToUTF16("ARTICLE")) { - return AccessibilityArticlePredicate; - } else if (element_type == base::ASCIIToUTF16("BUTTON")) { - return AccessibilityButtonPredicate; - } else if (element_type == base::ASCIIToUTF16("CHECKBOX")) { - return AccessibilityCheckboxPredicate; - } else if (element_type == base::ASCIIToUTF16("COMBOBOX")) { - return AccessibilityComboboxPredicate; - } else if (element_type == base::ASCIIToUTF16("TEXT_FIELD")) { - return AccessibilityTextfieldPredicate; - } else if (element_type == base::ASCIIToUTF16("FOCUSABLE")) { - return AccessibilityFocusablePredicate; - } else if (element_type == base::ASCIIToUTF16("GRAPHIC")) { - return AccessibilityGraphicPredicate; - } else if (element_type == base::ASCIIToUTF16("HEADING")) { - return AccessibilityHeadingPredicate; - } else if (element_type == base::ASCIIToUTF16("H1")) { - return AccessibilityH1Predicate; - } else if (element_type == base::ASCIIToUTF16("H2")) { - return AccessibilityH2Predicate; - } else if (element_type == base::ASCIIToUTF16("H3")) { - return AccessibilityH3Predicate; - } else if (element_type == base::ASCIIToUTF16("H4")) { - return AccessibilityH4Predicate; - } else if (element_type == base::ASCIIToUTF16("H5")) { - return AccessibilityH5Predicate; - } else if (element_type == base::ASCIIToUTF16("H6")) { - return AccessibilityH6Predicate; - } else if (element_type == base::ASCIIToUTF16("FRAME")) { - return AccessibilityFramePredicate; - } else if (element_type == base::ASCIIToUTF16("LANDMARK")) { - return AccessibilityLandmarkPredicate; - } else if (element_type == base::ASCIIToUTF16("LINK")) { - return AccessibilityLinkPredicate; - } else if (element_type == base::ASCIIToUTF16("LIST_ITEM")) { - return AccessibilityListItemPredicate; - } else if (element_type == base::ASCIIToUTF16("MAIN")) { - return AccessibilityMainPredicate; - } else if (element_type == base::ASCIIToUTF16("MEDIA")) { - return AccessibilityMediaPredicate; - } else if (element_type == base::ASCIIToUTF16("RADIO")) { - return AccessibilityRadioButtonPredicate; - } else if (element_type == base::ASCIIToUTF16("TABLE")) { - return AccessibilityTablePredicate; - } else if (element_type == base::ASCIIToUTF16("UNVISITED_LINK")) { - return AccessibilityUnvisitedLinkPredicate; - } else if (element_type == base::ASCIIToUTF16("VISITED_LINK")) { - return AccessibilityVisitedLinkPredicate; - } +void InitSearchKeyToPredicateMapIfNeeded() { + if (!g_search_key_to_predicate_map.Get().empty()) + return; + + AddToPredicateMap("ARTICLE", AccessibilityArticlePredicate); + AddToPredicateMap("BUTTON", AccessibilityButtonPredicate); + AddToPredicateMap("CHECKBOX", AccessibilityCheckboxPredicate); + AddToPredicateMap("COMBOBOX", AccessibilityComboboxPredicate); + AddToPredicateMap("CONTROL", AccessibilityControlPredicate); + AddToPredicateMap("FOCUSABLE", AccessibilityFocusablePredicate); + AddToPredicateMap("FRAME", AccessibilityFramePredicate); + AddToPredicateMap("GRAPHIC", AccessibilityGraphicPredicate); + AddToPredicateMap("H1", AccessibilityH1Predicate); + AddToPredicateMap("H2", AccessibilityH2Predicate); + AddToPredicateMap("H3", AccessibilityH3Predicate); + AddToPredicateMap("H4", AccessibilityH4Predicate); + AddToPredicateMap("H5", AccessibilityH5Predicate); + AddToPredicateMap("H6", AccessibilityH6Predicate); + AddToPredicateMap("HEADING", AccessibilityHeadingPredicate); + AddToPredicateMap("LANDMARK", AccessibilityLandmarkPredicate); + AddToPredicateMap("LINK", AccessibilityLinkPredicate); + AddToPredicateMap("LIST", AccessibilityListPredicate); + AddToPredicateMap("LIST_ITEM", AccessibilityListItemPredicate); + AddToPredicateMap("MAIN", AccessibilityMainPredicate); + AddToPredicateMap("MEDIA", AccessibilityMediaPredicate); + AddToPredicateMap("RADIO", AccessibilityRadioButtonPredicate); + AddToPredicateMap("SECTION", SectionPredicate); + AddToPredicateMap("TABLE", AccessibilityTablePredicate); + AddToPredicateMap("TEXT_FIELD", AccessibilityTextfieldPredicate); + AddToPredicateMap("UNVISITED_LINK", AccessibilityUnvisitedLinkPredicate); + AddToPredicateMap("VISITED_LINK", AccessibilityVisitedLinkPredicate); +} + +AccessibilityMatchPredicate PredicateForSearchKey( + const base::string16& element_type) { + InitSearchKeyToPredicateMapIfNeeded(); + const auto& iter = g_search_key_to_predicate_map.Get().find(element_type); + if (iter != g_search_key_to_predicate_map.Get().end()) + return iter->second; // If we don't recognize the selector, return any element that's clickable. // We mark all focusable nodes and leaf nodes as clickable because it's @@ -287,6 +289,14 @@ BrowserAccessibilityManager::OnLocationChanges(params); } +base::android::ScopedJavaLocalRef<jstring> +BrowserAccessibilityManagerAndroid::GetSupportedHtmlElementTypes( + JNIEnv* env, + const JavaParamRef<jobject>& obj) { + InitSearchKeyToPredicateMapIfNeeded(); + return base::android::ConvertUTF16ToJavaString(env, g_all_search_keys.Get()); +} + jint BrowserAccessibilityManagerAndroid::GetRootId( JNIEnv* env, const JavaParamRef<jobject>& obj) { @@ -423,6 +433,7 @@ Java_BrowserAccessibilityManager_setAccessibilityNodeInfoKitKatAttributes( env, obj, info, + is_root, base::android::ConvertUTF16ToJavaString( env, node->GetRoleDescription()).obj());
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h index 816bf0c7..54af8ca1c 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.h +++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -85,6 +85,10 @@ // Methods called from Java via JNI // -------------------------------------------------------------------------- + // Global methods. + base::android::ScopedJavaLocalRef<jstring> GetSupportedHtmlElementTypes( + JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); + // Tree methods. jint GetRootId(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); jboolean IsNodeValid(JNIEnv* env,
diff --git a/content/browser/android/browser_surface_texture_manager.h b/content/browser/android/browser_surface_texture_manager.h index f9fb74cc..639ce28b 100644 --- a/content/browser/android/browser_surface_texture_manager.h +++ b/content/browser/android/browser_surface_texture_manager.h
@@ -5,18 +5,18 @@ #ifndef CONTENT_BROWSER_ANDROID_BROWSER_SURFACE_TEXTURE_MANAGER_H_ #define CONTENT_BROWSER_ANDROID_BROWSER_SURFACE_TEXTURE_MANAGER_H_ -#include "content/common/android/surface_texture_manager.h" +#include "gpu/ipc/common/android/surface_texture_manager.h" #include "base/macros.h" #include "base/memory/singleton.h" -#include "content/common/android/surface_texture_peer.h" #include "content/common/content_export.h" +#include "gpu/ipc/common/android/surface_texture_peer.h" namespace content { class CONTENT_EXPORT BrowserSurfaceTextureManager - : public SurfaceTextureManager, - public SurfaceTexturePeer { + : public gpu::SurfaceTextureManager, + public gpu::SurfaceTexturePeer { public: static BrowserSurfaceTextureManager* GetInstance();
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc index 71bde17..1022d4f 100644 --- a/content/browser/android/content_view_core_impl.cc +++ b/content/browser/android/content_view_core_impl.cc
@@ -55,6 +55,7 @@ #include "ui/android/view_android.h" #include "ui/android/window_android.h" #include "ui/events/android/motion_event_android.h" +#include "ui/events/blink/blink_event_util.h" #include "ui/gfx/android/java_bitmap.h" #include "ui/gfx/geometry/point_conversions.h" #include "ui/gfx/geometry/size_conversions.h" @@ -981,7 +982,8 @@ const JavaParamRef<jobject>& obj, jlong time_ms, jfloat x, - jfloat y) { + jfloat y, + jint tool_type) { RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid(); if (!rwhv) return false; @@ -989,7 +991,8 @@ blink::WebMouseEvent event = WebMouseEventBuilder::Build( WebInputEvent::MouseMove, blink::WebMouseEvent::ButtonNone, - time_ms / 1000.0, x / dpi_scale(), y / dpi_scale(), 0, 1); + time_ms / 1000.0, x / dpi_scale(), y / dpi_scale(), 0, 1, + ui::ToWebPointerType(static_cast<ui::MotionEvent::ToolType>(tool_type))); rwhv->SendMouseEvent(event); return true;
diff --git a/content/browser/android/content_view_core_impl.h b/content/browser/android/content_view_core_impl.h index d6308a1..c756a59 100644 --- a/content/browser/android/content_view_core_impl.h +++ b/content/browser/android/content_view_core_impl.h
@@ -141,7 +141,8 @@ const base::android::JavaParamRef<jobject>& obj, jlong time_ms, jfloat x, - jfloat y); + jfloat y, + jint tool_type); jboolean SendMouseWheelEvent(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, jlong time_ms,
diff --git a/content/browser/android/in_process_surface_texture_manager.h b/content/browser/android/in_process_surface_texture_manager.h index 24e951c..8cf4d2ee 100644 --- a/content/browser/android/in_process_surface_texture_manager.h +++ b/content/browser/android/in_process_surface_texture_manager.h
@@ -5,22 +5,22 @@ #ifndef CONTENT_BROWSER_ANDROID_IN_PROCESS_SURFACE_TEXTURE_MANAGER_H_ #define CONTENT_BROWSER_ANDROID_IN_PROCESS_SURFACE_TEXTURE_MANAGER_H_ -#include "content/common/android/surface_texture_manager.h" +#include "gpu/ipc/common/android/surface_texture_manager.h" #include "base/containers/scoped_ptr_hash_map.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "base/synchronization/lock.h" -#include "content/common/android/surface_texture_peer.h" #include "content/common/content_export.h" +#include "gpu/ipc/common/android/surface_texture_peer.h" #include "ui/gl/android/scoped_java_surface.h" namespace content { class CONTENT_EXPORT InProcessSurfaceTextureManager - : public SurfaceTextureManager, - public SurfaceTexturePeer { + : public gpu::SurfaceTextureManager, + public gpu::SurfaceTexturePeer { public: static InProcessSurfaceTextureManager* GetInstance();
diff --git a/content/browser/appcache/appcache_storage_impl.cc b/content/browser/appcache/appcache_storage_impl.cc index b144eb6..2a255ed 100644 --- a/content/browser/appcache/appcache_storage_impl.cc +++ b/content/browser/appcache/appcache_storage_impl.cc
@@ -837,11 +837,7 @@ // Helpers for FindMainResponseTask::Run() namespace { -class SortByCachePreference - : public std::binary_function< - AppCacheDatabase::EntryRecord, - AppCacheDatabase::EntryRecord, - bool> { +class SortByCachePreference { public: SortByCachePreference(int64_t preferred_id, const std::set<int64_t>& in_use_ids)
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index 2b1664fa..162f026 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc
@@ -638,10 +638,10 @@ { TRACE_EVENT0("startup", "BrowserMainLoop::Subsystem:SurfaceTextureManager"); if (parsed_command_line_.HasSwitch(switches::kSingleProcess)) { - SurfaceTextureManager::SetInstance( + gpu::SurfaceTextureManager::SetInstance( InProcessSurfaceTextureManager::GetInstance()); } else { - SurfaceTextureManager::SetInstance( + gpu::SurfaceTextureManager::SetInstance( BrowserSurfaceTextureManager::GetInstance()); } }
diff --git a/content/browser/child_process_security_policy_unittest.cc b/content/browser/child_process_security_policy_unittest.cc index a0ea17a..2360468 100644 --- a/content/browser/child_process_security_policy_unittest.cc +++ b/content/browser/child_process_security_policy_unittest.cc
@@ -132,8 +132,6 @@ EXPECT_TRUE(p->IsWebSafeScheme("registered-web-safe-scheme")); EXPECT_FALSE(p->IsWebSafeScheme(kChromeUIScheme)); - EXPECT_FALSE(p->IsWebSafeScheme(kExeScheme)); - EXPECT_FALSE(p->IsWebSafeScheme(kMojoScheme)); } TEST_F(ChildProcessSecurityPolicyTest, IsPseudoSchemeTest) {
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc index d9c17f3..08c3cf2 100644 --- a/content/browser/devtools/protocol/input_handler.cc +++ b/content/browser/devtools/protocol/input_handler.cc
@@ -69,8 +69,13 @@ } void SetEventTimestamp(blink::WebInputEvent* event, const double* timestamp) { - event->timeStampSeconds = - timestamp ? *timestamp : base::Time::Now().ToDoubleT(); + // Convert timestamp, in seconds since unix epoch, to an event timestamp + // which is time ticks since platform start time. + base::TimeTicks ticks = timestamp + ? base::TimeDelta::FromSecondsD(*timestamp) + + base::TimeTicks::UnixEpoch() + : base::TimeTicks::Now(); + event->timeStampSeconds = (ticks - base::TimeTicks()).InSecondsF(); } bool SetKeyboardEventText(blink::WebUChar* to, const std::string* from) { @@ -248,6 +253,7 @@ event.globalX = x * page_scale_factor_; event.globalY = y * page_scale_factor_; event.clickCount = click_count ? *click_count : 0; + event.pointerType = blink::WebPointerProperties::PointerType::Mouse; if (!host_) return Response::ServerError("Could not connect to view"); @@ -296,6 +302,7 @@ event->globalX = x; event->globalY = y; event->clickCount = click_count ? *click_count : 0; + event->pointerType = blink::WebPointerProperties::PointerType::Touch; if (!host_) return Response::ServerError("Could not connect to view");
diff --git a/content/browser/devtools/shared_worker_devtools_manager_unittest.cc b/content/browser/devtools/shared_worker_devtools_manager_unittest.cc index 98a7152..c6f86d5 100644 --- a/content/browser/devtools/shared_worker_devtools_manager_unittest.cc +++ b/content/browser/devtools/shared_worker_devtools_manager_unittest.cc
@@ -102,7 +102,7 @@ SharedWorkerInstance instance1( GURL("http://example.com/w.js"), base::string16(), base::string16(), - blink::WebContentSecurityPolicyTypeReport, + blink::WebContentSecurityPolicyTypeReport, blink::WebAddressSpacePublic, browser_context_->GetResourceContext(), partition_id_, blink::WebSharedWorkerCreationContextTypeNonsecure); @@ -184,12 +184,12 @@ SharedWorkerInstance instance1( GURL("http://example.com/w1.js"), base::string16(), base::string16(), - blink::WebContentSecurityPolicyTypeReport, + blink::WebContentSecurityPolicyTypeReport, blink::WebAddressSpacePublic, browser_context_->GetResourceContext(), partition_id_, blink::WebSharedWorkerCreationContextTypeNonsecure); SharedWorkerInstance instance2( GURL("http://example.com/w2.js"), base::string16(), base::string16(), - blink::WebContentSecurityPolicyTypeReport, + blink::WebContentSecurityPolicyTypeReport, blink::WebAddressSpacePublic, browser_context_->GetResourceContext(), partition_id_, blink::WebSharedWorkerCreationContextTypeNonsecure); @@ -267,7 +267,7 @@ TEST_F(SharedWorkerDevToolsManagerTest, ReattachTest) { SharedWorkerInstance instance( GURL("http://example.com/w3.js"), base::string16(), base::string16(), - blink::WebContentSecurityPolicyTypeReport, + blink::WebContentSecurityPolicyTypeReport, blink::WebAddressSpacePublic, browser_context_->GetResourceContext(), partition_id_, blink::WebSharedWorkerCreationContextTypeNonsecure); scoped_ptr<TestDevToolsClientHost> client_host(new TestDevToolsClientHost());
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc index 7c26bf8..c27af7e6 100644 --- a/content/browser/frame_host/render_widget_host_view_child_frame.cc +++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -284,6 +284,9 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( uint32_t output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { + TRACE_EVENT0("content", + "RenderWidgetHostViewChildFrame::OnSwapCompositorFrame"); + last_scroll_offset_ = frame->metadata.root_scroll_offset; if (!frame_connector_)
diff --git a/content/browser/frame_host/render_widget_host_view_guest.cc b/content/browser/frame_host/render_widget_host_view_guest.cc index 66ef613..1312e527 100644 --- a/content/browser/frame_host/render_widget_host_view_guest.cc +++ b/content/browser/frame_host/render_widget_host_view_guest.cc
@@ -207,11 +207,7 @@ void RenderWidgetHostViewGuest::OnSwapCompositorFrame( uint32_t output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { - if (!guest_ || !guest_->attached()) { - // We shouldn't hang on to a surface while we are detached. - ClearCompositorSurfaceIfNecessary(); - return; - } + TRACE_EVENT0("content", "RenderWidgetHostViewGuest::OnSwapCompositorFrame"); last_scroll_offset_ = frame->metadata.root_scroll_offset; @@ -266,6 +262,12 @@ ack_callback); ProcessFrameSwappedCallbacks(); + + // If after detaching we are sent a frame, we should finish processing it, and + // then we should clear the surface so that we are not holding resources we + // no longer need. + if (!guest_ || !guest_->attached()) + ClearCompositorSurfaceIfNecessary(); } bool RenderWidgetHostViewGuest::OnMessageReceived(const IPC::Message& msg) {
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc index 84a226e..6e74459 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.cc +++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -513,8 +513,10 @@ } base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(switches::kSkipGpuDataLoading)) + if (command_line->HasSwitch(switches::kSkipGpuDataLoading)) { + RunPostInitTasks(); return; + } gpu::GPUInfo gpu_info; if (command_line->GetSwitchValueASCII( @@ -1068,6 +1070,10 @@ UpdateGpuSwitchingManager(gpu_info); UpdatePreliminaryBlacklistedFeatures(); + RunPostInitTasks(); +} + +void GpuDataManagerImplPrivate::RunPostInitTasks() { // Set initialized before running callbacks. is_initialized_ = true;
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.h b/content/browser/gpu/gpu_data_manager_impl_private.h index ca98ab2..09de1a48 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.h +++ b/content/browser/gpu/gpu_data_manager_impl_private.h
@@ -198,6 +198,8 @@ const std::string& gpu_driver_bug_list_json, const gpu::GPUInfo& gpu_info); + void RunPostInitTasks(); + void UpdateGpuInfoHelper(); void UpdateBlacklistedFeatures(const std::set<int>& features);
diff --git a/content/browser/media/capture/aura_window_capture_machine.cc b/content/browser/media/capture/aura_window_capture_machine.cc index c340599..b7225381 100644 --- a/content/browser/media/capture/aura_window_capture_machine.cc +++ b/content/browser/media/capture/aura_window_capture_machine.cc
@@ -141,7 +141,7 @@ DCHECK(!desktop_window_); desktop_window_ = window; - cursor_renderer_.reset(new CursorRendererAura(window)); + cursor_renderer_.reset(new CursorRendererAura(window, kCursorAlwaysEnabled)); // Start observing window events. desktop_window_->AddObserver(this);
diff --git a/content/browser/media/capture/cursor_renderer_aura.cc b/content/browser/media/capture/cursor_renderer_aura.cc index 238ed9a1..2b446e0 100644 --- a/content/browser/media/capture/cursor_renderer_aura.cc +++ b/content/browser/media/capture/cursor_renderer_aura.cc
@@ -35,11 +35,17 @@ } // namespace -CursorRendererAura::CursorRendererAura(aura::Window* window) - : window_(window), tick_clock_(&default_tick_clock_), weak_factory_(this) { +CursorRendererAura::CursorRendererAura( + aura::Window* window, + CursorDisplaySetting cursor_display_setting) + : window_(window), + cursor_display_setting_(cursor_display_setting), + tick_clock_(&default_tick_clock_), + weak_factory_(this) { if (window_) { window_->AddObserver(this); - window_->AddPreTargetHandler(this); + if (cursor_display_setting == kCursorEnabledOnMouseMovement) + window_->AddPreTargetHandler(this); } Clear(); } @@ -47,7 +53,8 @@ CursorRendererAura::~CursorRendererAura() { if (window_) { window_->RemoveObserver(this); - window_->RemovePreTargetHandler(this); + if (cursor_display_setting_ == kCursorEnabledOnMouseMovement) + window_->RemovePreTargetHandler(this); } } @@ -61,7 +68,11 @@ scaled_cursor_bitmap_.reset(); last_mouse_position_x_ = 0; last_mouse_position_y_ = 0; - cursor_displayed_ = false; + if (cursor_display_setting_ == kCursorEnabledOnMouseMovement) { + cursor_displayed_ = false; + } else { + cursor_displayed_ = true; + } } bool CursorRendererAura::SnapshotCursorState(const gfx::Rect& region_in_frame) { @@ -94,6 +105,20 @@ } } + if (cursor_display_setting_ == kCursorEnabledOnMouseMovement) { + if (cursor_displayed_) { + // Stop displaying cursor if there has been no mouse movement + base::TimeDelta now = tick_clock_->NowTicks() - base::TimeTicks(); + if ((now - last_mouse_movement_timestamp_) > + base::TimeDelta::FromSeconds(MAX_IDLE_TIME_SECONDS)) { + cursor_displayed_ = false; + DVLOG(2) << "Turning off cursor display after idle time"; + } + } + if (!cursor_displayed_) + return false; + } + gfx::NativeCursor cursor = window_->GetHost()->last_cursor(); gfx::Point cursor_hot_point; if (last_cursor_ != cursor || @@ -131,16 +156,7 @@ cursor_position.y() * region_in_frame.height() / window_bounds.height()); - if (cursor_displayed_) { - // Stop displaying cursor if there has been no mouse movement - base::TimeDelta now = tick_clock_->NowTicks() - base::TimeTicks(); - if ((now - last_mouse_movement_timestamp_) > - base::TimeDelta::FromSeconds(MAX_IDLE_TIME_SECONDS)) { - cursor_displayed_ = false; - DVLOG(2) << "Turning off cursor display after idle time"; - } - } - return cursor_displayed_; + return true; } // Helper function to composite a cursor bitmap on a YUV420 video frame. @@ -218,7 +234,8 @@ void CursorRendererAura::OnWindowDestroying(aura::Window* window) { DCHECK_EQ(window_, window); - window_->RemovePreTargetHandler(this); + if (cursor_display_setting_ == kCursorEnabledOnMouseMovement) + window_->RemovePreTargetHandler(this); window_->RemoveObserver(this); window_ = nullptr; }
diff --git a/content/browser/media/capture/cursor_renderer_aura.h b/content/browser/media/capture/cursor_renderer_aura.h index 42dffa6..eaa1790 100644 --- a/content/browser/media/capture/cursor_renderer_aura.h +++ b/content/browser/media/capture/cursor_renderer_aura.h
@@ -23,13 +23,21 @@ namespace content { +// Setting to control cursor display based on either mouse movement or always +// forced to be enabled. +enum CursorDisplaySetting { + kCursorAlwaysEnabled, + kCursorEnabledOnMouseMovement +}; + // Tracks state for making decisions on cursor display on a captured video // frame. class CONTENT_EXPORT CursorRendererAura : public CursorRenderer, public ui::EventHandler, public aura::WindowObserver { public: - explicit CursorRendererAura(aura::Window* window); + explicit CursorRendererAura(aura::Window* window, + CursorDisplaySetting cursor_display); ~CursorRendererAura() final; // CursorRender implementation. @@ -64,6 +72,9 @@ float last_mouse_position_y_; bool cursor_displayed_; + // Controls whether cursor is displayed based on active mouse movement. + const CursorDisplaySetting cursor_display_setting_; + // Allows tests to replace the clock. base::DefaultTickClock default_tick_clock_; base::TickClock* tick_clock_;
diff --git a/content/browser/media/capture/cursor_renderer_aura_unittest.cc b/content/browser/media/capture/cursor_renderer_aura_unittest.cc index e521236..8b08f83 100644 --- a/content/browser/media/capture/cursor_renderer_aura_unittest.cc +++ b/content/browser/media/capture/cursor_renderer_aura_unittest.cc
@@ -48,7 +48,8 @@ window_.reset(aura::test::CreateTestWindowWithBounds( gfx::Rect(0, 0, 800, 600), root_window())); - cursor_renderer_.reset(new CursorRendererAura(window_.get())); + cursor_renderer_.reset( + new CursorRendererAura(window_.get(), kCursorEnabledOnMouseMovement)); new wm::DefaultActivationClient(root_window()); } @@ -129,6 +130,32 @@ scoped_ptr<CursorRendererAura> cursor_renderer_; }; +TEST_F(CursorRendererAuraTest, CursorAlwaysDisplayed) { + // Set up cursor renderer to always display cursor. + cursor_renderer_.reset( + new CursorRendererAura(window_.get(), kCursorAlwaysEnabled)); + + // Cursor displayed at start. + EXPECT_TRUE(CursorDisplayed()); + + base::SimpleTestTickClock clock; + SetTickClock(&clock); + + // Cursor displayed after mouse movement. + MoveMouseCursorWithinWindow(); + EXPECT_TRUE(CursorDisplayed()); + + // Cursor displayed after idle period. + clock.Advance(base::TimeDelta::FromSeconds(5)); + SnapshotCursorState(gfx::Rect(10, 10, 200, 200)); + EXPECT_TRUE(CursorDisplayed()); + + // Cursor displayed with mouse outside the window. + MoveMouseCursorOutsideWindow(); + SnapshotCursorState(gfx::Rect(10, 10, 200, 200)); + EXPECT_TRUE(CursorDisplayed()); +} + TEST_F(CursorRendererAuraTest, CursorDuringMouseMovement) { // Keep window activated. wm::ActivateWindow(window_.get()); @@ -201,7 +228,8 @@ } TEST_F(CursorRendererAuraTest, CursorRenderedOnRootWindow) { - cursor_renderer_.reset(new CursorRendererAura(root_window())); + cursor_renderer_.reset(new CursorRendererAura(root_window(), + kCursorEnabledOnMouseMovement)); EXPECT_FALSE(CursorDisplayed()); // Cursor displayed after mouse movement.
diff --git a/content/browser/media/capture/web_contents_video_capture_device.cc b/content/browser/media/capture/web_contents_video_capture_device.cc index 1d4cefb..bdadcd2 100644 --- a/content/browser/media/capture/web_contents_video_capture_device.cc +++ b/content/browser/media/capture/web_contents_video_capture_device.cc
@@ -441,8 +441,8 @@ // https://crbug.com/567735 #if defined(USE_AURA) if (view) { - cursor_renderer_.reset( - new content::CursorRendererAura(view->GetNativeView())); + cursor_renderer_.reset(new content::CursorRendererAura( + view->GetNativeView(), kCursorEnabledOnMouseMovement)); window_activity_tracker_.reset( new content::WindowActivityTrackerAura(view->GetNativeView())); }
diff --git a/content/browser/mojo/chrome_renderer_manifest.json b/content/browser/mojo/chrome_renderer_manifest.json index 463be6d2..7022695 100644 --- a/content/browser/mojo/chrome_renderer_manifest.json +++ b/content/browser/mojo/chrome_renderer_manifest.json
@@ -1,5 +1,5 @@ { "name": "exe:chrome_renderer", "display_name": "Chrome Renderer", - "capabilities": { "mojo:mus": [ "mus::mojom::Gpu" ] } + "capabilities": { "mojo:mus": [ "mus.mojom.Gpu" ] } }
diff --git a/content/browser/renderer_host/ime_adapter_android.cc b/content/browser/renderer_host/ime_adapter_android.cc index e5f10e4..c1429755 100644 --- a/content/browser/renderer_host/ime_adapter_android.cc +++ b/content/browser/renderer_host/ime_adapter_android.cc
@@ -11,6 +11,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" +#include "base/feature_list.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "content/browser/frame_host/frame_tree.h" @@ -26,6 +27,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_features.h" #include "jni/ImeAdapter_jni.h" #include "third_party/WebKit/public/web/WebCompositionUnderline.h" #include "third_party/WebKit/public/web/WebInputEvent.h" @@ -300,6 +302,12 @@ return true; } +bool ImeAdapterAndroid::IsImeThreadEnabled( + JNIEnv* env, + const base::android::JavaParamRef<jobject>&) { + return base::FeatureList::IsEnabled(features::kImeThread); +} + void ImeAdapterAndroid::ResetImeAdapter(JNIEnv* env, const JavaParamRef<jobject>&) { java_ime_adapter_.reset();
diff --git a/content/browser/renderer_host/ime_adapter_android.h b/content/browser/renderer_host/ime_adapter_android.h index 8135931..9e60700 100644 --- a/content/browser/renderer_host/ime_adapter_android.h +++ b/content/browser/renderer_host/ime_adapter_android.h
@@ -77,6 +77,7 @@ void ResetImeAdapter(JNIEnv*, const base::android::JavaParamRef<jobject>&); bool RequestTextInputStateUpdate(JNIEnv*, const base::android::JavaParamRef<jobject>&); + bool IsImeThreadEnabled(JNIEnv*, const base::android::JavaParamRef<jobject>&); // Called from native -> java void CancelComposition();
diff --git a/content/browser/renderer_host/input/web_input_event_builders_android.cc b/content/browser/renderer_host/input/web_input_event_builders_android.cc index 3fb06bb9..4aa2449a 100644 --- a/content/browser/renderer_host/input/web_input_event_builders_android.cc +++ b/content/browser/renderer_host/input/web_input_event_builders_android.cc
@@ -18,6 +18,7 @@ using blink::WebGestureEvent; using blink::WebMouseEvent; using blink::WebMouseWheelEvent; +using blink::WebPointerProperties; using blink::WebTouchEvent; using blink::WebTouchPoint; @@ -70,17 +71,21 @@ return result; } -WebMouseEvent WebMouseEventBuilder::Build(blink::WebInputEvent::Type type, - WebMouseEvent::Button button, - double time_sec, - int window_x, - int window_y, - int modifiers, - int click_count) { +WebMouseEvent WebMouseEventBuilder::Build( + WebInputEvent::Type type, + WebMouseEvent::Button button, + double time_sec, + int window_x, + int window_y, + int modifiers, + int click_count, + WebPointerProperties::PointerType pointer_type) { + DCHECK(WebInputEvent::isMouseEventType(type)); WebMouseEvent result; result.type = type; + result.pointerType = pointer_type; result.x = window_x; result.y = window_y; result.windowX = window_x;
diff --git a/content/browser/renderer_host/input/web_input_event_builders_android.h b/content/browser/renderer_host/input/web_input_event_builders_android.h index 5ade65a3..50063cf 100644 --- a/content/browser/renderer_host/input/web_input_event_builders_android.h +++ b/content/browser/renderer_host/input/web_input_event_builders_android.h
@@ -17,13 +17,15 @@ class WebMouseEventBuilder { public: - static blink::WebMouseEvent Build(blink::WebInputEvent::Type type, - blink::WebMouseEvent::Button button, - double time_sec, - int window_x, - int window_y, - int modifiers, - int click_count); + static blink::WebMouseEvent Build( + blink::WebInputEvent::Type type, + blink::WebMouseEvent::Button button, + double time_sec, + int window_x, + int window_y, + int modifiers, + int click_count, + blink::WebPointerProperties::PointerType pointer_type); }; class WebMouseWheelEventBuilder {
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 797a2d78..3bab60f 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -757,7 +757,8 @@ g_renderer_main_thread_factory(InProcessChildThreadParams( channel_id, BrowserThread::UnsafeGetMessageLoopForThread(BrowserThread::IO) - ->task_runner()))); + ->task_runner(), + in_process_renderer_handle_.release()))); base::Thread::Options options; #if defined(OS_WIN) && !defined(OS_MACOSX) @@ -816,8 +817,16 @@ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); if (ShouldUseMojoChannel()) { VLOG(1) << "Mojo Channel is enabled on host"; + mojo::ScopedMessagePipeHandle handle; - mojo_channel_token_ = mojo::edk::GenerateRandomToken(); + if (run_renderer_in_process()) { + mojo::MessagePipe pipe; + handle = std::move(pipe.handle0); + in_process_renderer_handle_ = std::move(pipe.handle1); + } else { + mojo_channel_token_ = mojo::edk::GenerateRandomToken(); + handle = mojo::edk::CreateParentMessagePipe(mojo_channel_token_); + } // Do NOT expand ifdef or run time condition checks here! Synchronous // IPCs from browser process are banned. It is only narrowly allowed @@ -827,13 +836,13 @@ if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kIPCSyncCompositing)) { return IPC::SyncChannel::Create( - IPC::ChannelMojo::CreateServerFactory(mojo_channel_token_), this, + IPC::ChannelMojo::CreateServerFactory(std::move(handle)), this, runner.get(), true, &never_signaled_); } #endif // OS_ANDROID return IPC::ChannelProxy::Create( - IPC::ChannelMojo::CreateServerFactory(mojo_channel_token_), this, + IPC::ChannelMojo::CreateServerFactory(std::move(handle)), this, runner.get()); } @@ -1568,8 +1577,6 @@ switches::kEnableUnifiedMediaPipeline, switches::kIPCSyncCompositing, switches::kRendererWaitForJavaDebugger, - switches::kEnableImeThread, - switches::kDisableImeThread, #endif #if defined(OS_MACOSX) // Allow this to be set when invoking the browser and relayed along.
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index 949dcaeb..d08b401 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -527,6 +527,7 @@ #endif std::string mojo_channel_token_; + mojo::ScopedMessagePipeHandle in_process_renderer_handle_; base::WeakPtrFactory<RenderProcessHostImpl> weak_factory_;
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc index 0343bd9..9add278 100644 --- a/content/browser/renderer_host/render_widget_host_input_event_router.cc +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -4,6 +4,7 @@ #include "content/browser/renderer_host/render_widget_host_input_event_router.h" +#include "base/debug/dump_without_crashing.h" #include "cc/quads/surface_draw_quad.h" #include "cc/surfaces/surface_id_allocator.h" #include "cc/surfaces/surface_manager.h" @@ -25,6 +26,18 @@ namespace content { +// Code to assist debugging https://crbug.com/592319. +RenderWidgetHostInputEventRouter::GestureQueueDebugData::GestureQueueDebugData() + : number_of_gesture_targets_enqueued(0), + number_of_gesture_targets_dequeued(0), + next_gesture_event_index(0), + next_touch_event_index(0) { + for (unsigned i = 0; i < kNumLastEventTypes; ++i) { + last_gesture_event_types[i] = blink::WebInputEvent::Undefined; + last_touch_event_types[i] = blink::WebInputEvent::Undefined; + } +} + void RenderWidgetHostInputEventRouter::OnRenderWidgetHostViewBaseDestroyed( RenderWidgetHostViewBase* view) { view->RemoveObserver(this); @@ -170,13 +183,29 @@ // GestureTapDown is sent to the previous target, in case it is still in a // fling. if (event->type == blink::WebInputEvent::GestureTapDown) { - DCHECK(!gesture_target_queue_.empty()); + if (gesture_target_queue_.empty()) { + // Collect data to assist debugging https://crbug.com/592319. + // We'll assume for now if there's no target that we should just ignore + // the event. + LOG(ERROR) << "Gesture sequence start detected with no target available."; + base::debug::DumpWithoutCrashing(); + return; + } + const GestureTargetData& data = gesture_target_queue_.front(); gesture_target_ = data.target; gesture_delta_ = data.delta; gesture_target_queue_.pop_front(); + // Code to assist debugging https://crbug.com/592319. + debug_data_.number_of_gesture_targets_dequeued++; } + // Code to assist debugging https://crbug.com/592319. + debug_data_.last_gesture_event_types[debug_data_.next_gesture_event_index] = + event->type; + debug_data_.next_gesture_event_index = + (debug_data_.next_gesture_event_index + 1) % kNumLastEventTypes; + if (!gesture_target_) return; @@ -189,6 +218,12 @@ RenderWidgetHostViewBase* root_view, blink::WebTouchEvent* event, const ui::LatencyInfo& latency) { + // Code to assist debugging https://crbug.com/592319. + debug_data_.last_touch_event_types[debug_data_.next_touch_event_index] = + event->type; + debug_data_.next_touch_event_index = + (debug_data_.next_touch_event_index + 1) % kNumLastEventTypes; + switch (event->type) { case blink::WebInputEvent::TouchStart: { if (!active_touches_) { @@ -208,6 +243,8 @@ // for the duration of the sequence. touch_delta_ = transformed_point - original_point; gesture_target_queue_.emplace_back(touch_target_, touch_delta_); + // Code to assist debugging https://crbug.com/592319. + debug_data_.number_of_gesture_targets_enqueued++; if (!touch_target_) return;
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.h b/content/browser/renderer_host/render_widget_host_input_event_router.h index b4123539..e846ea8 100644 --- a/content/browser/renderer_host/render_widget_host_input_event_router.h +++ b/content/browser/renderer_host/render_widget_host_input_event_router.h
@@ -121,6 +121,22 @@ std::unordered_map<cc::SurfaceId, HittestData, cc::SurfaceIdHash> hittest_data_; + // Debugging data for https://crbug.com/592319. + // Data types declared here to simplify later removal, and understanding of + // the code while it's in this intermediate state. + static const unsigned kNumLastEventTypes = 5; + struct GestureQueueDebugData { + unsigned long number_of_gesture_targets_enqueued; + unsigned long number_of_gesture_targets_dequeued; + int last_gesture_event_types[kNumLastEventTypes]; + int last_touch_event_types[kNumLastEventTypes]; + unsigned next_gesture_event_index; + unsigned next_touch_event_index; + + GestureQueueDebugData(); + }; + GestureQueueDebugData debug_data_; + DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostInputEventRouter); FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, InputEventRouterGestureTargetQueueTest);
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc index 147de7e..1271bc4b 100644 --- a/content/browser/service_worker/embedded_worker_instance.cc +++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -17,6 +17,7 @@ #include "content/common/content_switches_internal.h" #include "content/common/mojo/service_registry_impl.h" #include "content/common/service_worker/embedded_worker_messages.h" +#include "content/common/service_worker/embedded_worker_settings.h" #include "content/common/service_worker/embedded_worker_setup.mojom.h" #include "content/common/service_worker/service_worker_types.h" #include "content/public/browser/browser_thread.h" @@ -248,7 +249,8 @@ scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, ServiceWorkerStatusCode status, int process_id, - bool is_new_process) { + bool is_new_process, + const EmbeddedWorkerSettings& settings) { DCHECK_CURRENTLY_ON(BrowserThread::IO); TRACE_EVENT_ASYNC_END1("ServiceWorker", "EmbeddedWorkerInstance::ProcessAllocate", @@ -268,6 +270,10 @@ instance_->OnProcessAllocated(make_scoped_ptr(new WorkerProcessHandle( instance_->context_, instance_->embedded_worker_id(), process_id))); + // TODO(bengr): Support changes to this setting while the worker + // is running. + params->settings.data_saver_enabled = settings.data_saver_enabled; + // Register the instance to DevToolsManager on UI thread. const int64_t service_worker_version_id = params->service_worker_version_id; const GURL& scope = params->scope; @@ -371,7 +377,7 @@ params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; params->wait_for_debugger = false; params->pause_after_download = pause_after_download; - params->v8_cache_options = GetV8CacheOptions(); + params->settings.v8_cache_options = GetV8CacheOptions(); inflight_start_task_.reset(new StartTask(this)); inflight_start_task_->Start(std::move(params), callback);
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc index 6129a10d..dda9572 100644 --- a/content/browser/service_worker/service_worker_browsertest.cc +++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -4,6 +4,7 @@ #include <stddef.h> #include <stdint.h> +#include <map> #include <utility> #include "base/bind.h" @@ -31,19 +32,24 @@ #include "content/common/service_worker/service_worker_types.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/content_browser_client.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_process_host.h" +#include "content/public/browser/render_view_host.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_client.h" #include "content/public/common/content_switches.h" #include "content/public/common/referrer.h" #include "content/public/common/security_style.h" #include "content/public/common/ssl_status.h" +#include "content/public/common/web_preferences.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" #include "content/public/test/content_browser_test_utils.h" #include "content/shell/browser/shell.h" #include "content/shell/browser/shell_content_browser_client.h" +#include "content/test/test_content_browser_client.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" @@ -194,6 +200,25 @@ return std::move(http_response); } +scoped_ptr<net::test_server::HttpResponse> VerifySaveDataHeaderInRequest( + const net::test_server::HttpRequest& request) { + auto it = request.headers.find("Save-Data"); + EXPECT_NE(request.headers.end(), it); + EXPECT_EQ("on", it->second); + + scoped_ptr<net::test_server::BasicHttpResponse> http_response( + new net::test_server::BasicHttpResponse()); + http_response->set_content_type("text/javascript"); + return std::move(http_response); +} + +scoped_ptr<net::test_server::HttpResponse> VerifySaveDataHeaderNotInRequest( + const net::test_server::HttpRequest& request) { + auto it = request.headers.find("Save-Data"); + EXPECT_EQ(request.headers.end(), it); + return make_scoped_ptr(new net::test_server::BasicHttpResponse()); +} + // The ImportsBustMemcache test requires that the imported script // would naturally be cached in blink's memcache, but the embedded // test server doesn't produce headers that allow the blink's memcache @@ -1002,6 +1027,128 @@ ASSERT_FALSE(blob_data_handle); } +class MockContentBrowserClient : public TestContentBrowserClient { + public: + MockContentBrowserClient() + : TestContentBrowserClient(), data_saver_enabled_(false) {} + + ~MockContentBrowserClient() override {} + + void set_data_saver_enabled(bool enabled) { data_saver_enabled_ = enabled; } + + // ContentBrowserClient overrides: + bool IsDataSaverEnabled(BrowserContext* context) override { + return data_saver_enabled_; + } + + void OverrideWebkitPrefs(RenderViewHost* render_view_host, + WebPreferences* prefs) override { + prefs->data_saver_enabled = data_saver_enabled_; + } + + private: + bool data_saver_enabled_; +}; + +IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchWithSaveData) { + embedded_test_server()->RegisterRequestHandler( + base::Bind(&VerifySaveDataHeaderInRequest)); + MockContentBrowserClient content_browser_client; + content_browser_client.set_data_saver_enabled(true); + ContentBrowserClient* old_client = + SetBrowserClientForTesting(&content_browser_client); + InstallTestHelper("/service_worker/fetch_in_install.js", SERVICE_WORKER_OK); + SetBrowserClientForTesting(old_client); +} + +IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, + RequestWorkerScriptWithSaveData) { + embedded_test_server()->RegisterRequestHandler( + base::Bind(&VerifySaveDataHeaderInRequest)); + MockContentBrowserClient content_browser_client; + content_browser_client.set_data_saver_enabled(true); + ContentBrowserClient* old_client = + SetBrowserClientForTesting(&content_browser_client); + InstallTestHelper("/service_worker/generated_sw.js", SERVICE_WORKER_OK); + SetBrowserClientForTesting(old_client); +} + +IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchWithoutSaveData) { + embedded_test_server()->RegisterRequestHandler( + base::Bind(&VerifySaveDataHeaderNotInRequest)); + MockContentBrowserClient content_browser_client; + ContentBrowserClient* old_client = + SetBrowserClientForTesting(&content_browser_client); + InstallTestHelper("/service_worker/fetch_in_install.js", SERVICE_WORKER_OK); + SetBrowserClientForTesting(old_client); +} + +IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, FetchPageWithSaveData) { + const char kPageUrl[] = "/service_worker/handle_fetch.html"; + const char kWorkerUrl[] = "/service_worker/add_save_data_to_title.js"; + MockContentBrowserClient content_browser_client; + content_browser_client.set_data_saver_enabled(true); + ContentBrowserClient* old_client = + SetBrowserClientForTesting(&content_browser_client); + shell()->web_contents()->GetRenderViewHost()->OnWebkitPreferencesChanged(); + scoped_refptr<WorkerActivatedObserver> observer = + new WorkerActivatedObserver(wrapper()); + observer->Init(); + public_context()->RegisterServiceWorker( + embedded_test_server()->GetURL(kPageUrl), + embedded_test_server()->GetURL(kWorkerUrl), + base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); + observer->Wait(); + + const base::string16 title1 = base::ASCIIToUTF16("save-data=on"); + TitleWatcher title_watcher1(shell()->web_contents(), title1); + NavigateToURL(shell(), embedded_test_server()->GetURL(kPageUrl)); + EXPECT_EQ(title1, title_watcher1.WaitAndGetTitle()); + + SetBrowserClientForTesting(old_client); + shell()->Close(); + + base::RunLoop run_loop; + public_context()->UnregisterServiceWorker( + embedded_test_server()->GetURL(kPageUrl), + base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure())); + run_loop.Run(); +} + +IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, + FetchPageWithSaveDataPassThroughOnFetch) { + const char kPageUrl[] = "/service_worker/pass_through_fetch.html"; + const char kWorkerUrl[] = "/service_worker/fetch_event_pass_through.js"; + MockContentBrowserClient content_browser_client; + content_browser_client.set_data_saver_enabled(true); + ContentBrowserClient* old_client = + SetBrowserClientForTesting(&content_browser_client); + shell()->web_contents()->GetRenderViewHost()->OnWebkitPreferencesChanged(); + scoped_refptr<WorkerActivatedObserver> observer = + new WorkerActivatedObserver(wrapper()); + observer->Init(); + public_context()->RegisterServiceWorker( + embedded_test_server()->GetURL(kPageUrl), + embedded_test_server()->GetURL(kWorkerUrl), + base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); + observer->Wait(); + + embedded_test_server()->RegisterRequestHandler( + base::Bind(&VerifySaveDataHeaderInRequest)); + + NavigateToURLBlockUntilNavigationsComplete( + shell(), embedded_test_server()->GetURL(kPageUrl), 1); + + SetBrowserClientForTesting(old_client); + shell()->Close(); + + base::RunLoop run_loop; + public_context()->UnregisterServiceWorker( + embedded_test_server()->GetURL(kPageUrl), + base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure())); + run_loop.Run(); +} + IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, Reload) { const char kPageUrl[] = "/service_worker/reload.html"; const char kWorkerUrl[] = "/service_worker/fetch_event_reload.js";
diff --git a/content/browser/service_worker/service_worker_process_manager.cc b/content/browser/service_worker/service_worker_process_manager.cc index 6777fc8..74253b5 100644 --- a/content/browser/service_worker/service_worker_process_manager.cc +++ b/content/browser/service_worker/service_worker_process_manager.cc
@@ -11,9 +11,12 @@ #include "content/browser/renderer_host/render_process_host_impl.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" +#include "content/common/service_worker/embedded_worker_settings.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/content_browser_client.h" #include "content/public/browser/site_instance.h" #include "content/public/common/child_process_host.h" +#include "content/public/common/content_client.h" #include "url/gurl.h" namespace content { @@ -139,7 +142,8 @@ bool can_use_existing_process, const base::Callback<void(ServiceWorkerStatusCode, int process_id, - bool is_new_process)>& callback) { + bool is_new_process, + const EmbeddedWorkerSettings&)>& callback) { if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, @@ -149,6 +153,14 @@ return; } + // This |EmbeddedWorkerSettings| only populates |data_saver_enabled|, + // but in general, this function will populate settings from prefs, while + // the caller will be responsible for populating settings from other sources, + // such as command line switches. + EmbeddedWorkerSettings settings; + settings.data_saver_enabled = + GetContentClient()->browser()->IsDataSaverEnabled(browser_context_); + if (process_id_for_test_ != ChildProcessHost::kInvalidUniqueID) { // Let tests specify the returned process ID. Note: We may need to be able // to specify the error code too. @@ -156,7 +168,7 @@ : new_process_id_for_test_; BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(callback, SERVICE_WORKER_OK, result, - false /* is_new_process */)); + false /* is_new_process */, settings)); return; } @@ -164,7 +176,7 @@ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_ABORT, ChildProcessHost::kInvalidUniqueID, - false /* is_new_process */)); + false /* is_new_process */, settings)); return; } @@ -182,7 +194,7 @@ BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(callback, SERVICE_WORKER_OK, process_id, - false /* is_new_process */)); + false /* is_new_process */, settings)); return; } } @@ -201,7 +213,7 @@ BrowserThread::IO, FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND, ChildProcessHost::kInvalidUniqueID, - false /* is_new_process */)); + false /* is_new_process */, settings)); return; } @@ -211,7 +223,7 @@ rph->IncrementWorkerRefCount(); BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(callback, SERVICE_WORKER_OK, rph->GetID(), - true /* is_new_process */)); + true /* is_new_process */, settings)); } void ServiceWorkerProcessManager::ReleaseWorkerProcess(int embedded_worker_id) {
diff --git a/content/browser/service_worker/service_worker_process_manager.h b/content/browser/service_worker/service_worker_process_manager.h index ad9a7306..465ed5a 100644 --- a/content/browser/service_worker/service_worker_process_manager.h +++ b/content/browser/service_worker/service_worker_process_manager.h
@@ -20,6 +20,7 @@ namespace content { class BrowserContext; +struct EmbeddedWorkerSettings; class SiteInstance; // Interacts with the UI thread to keep RenderProcessHosts alive while the @@ -52,7 +53,8 @@ bool can_use_existing_process, const base::Callback<void(ServiceWorkerStatusCode, int process_id, - bool is_new_process)>& callback); + bool is_new_process, + const EmbeddedWorkerSettings&)>& callback); // Drops a reference to a process that was running a Service Worker, and its // SiteInstance. This must match a call to AllocateWorkerProcess.
diff --git a/content/browser/service_worker/service_worker_process_manager_unittest.cc b/content/browser/service_worker/service_worker_process_manager_unittest.cc index 51c6ba21..98ded59 100644 --- a/content/browser/service_worker/service_worker_process_manager_unittest.cc +++ b/content/browser/service_worker/service_worker_process_manager_unittest.cc
@@ -6,6 +6,7 @@ #include "base/macros.h" #include "base/run_loop.h" #include "content/browser/service_worker/service_worker_process_manager.h" +#include "content/common/service_worker/embedded_worker_settings.h" #include "content/public/common/child_process_host.h" #include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_browser_context.h" @@ -24,7 +25,8 @@ bool* is_new_process_out, ServiceWorkerStatusCode status, int process_id, - bool is_new_process) { + bool is_new_process, + const EmbeddedWorkerSettings& settings) { *status_out = status; *process_id_out = process_id; *is_new_process_out = is_new_process;
diff --git a/content/browser/shared_worker/shared_worker_host.cc b/content/browser/shared_worker/shared_worker_host.cc index 07d988fa..ec513514 100644 --- a/content/browser/shared_worker/shared_worker_host.cc +++ b/content/browser/shared_worker/shared_worker_host.cc
@@ -89,6 +89,7 @@ params.name = instance_->name(); params.content_security_policy = instance_->content_security_policy(); params.security_policy_type = instance_->security_policy_type(); + params.creation_address_space = instance_->creation_address_space(); params.pause_on_start = pause_on_start; params.route_id = worker_route_id_; Send(new WorkerProcessMsg_CreateWorker(params));
diff --git a/content/browser/shared_worker/shared_worker_instance.cc b/content/browser/shared_worker/shared_worker_instance.cc index caa3876..282cf19 100644 --- a/content/browser/shared_worker/shared_worker_instance.cc +++ b/content/browser/shared_worker/shared_worker_instance.cc
@@ -13,6 +13,7 @@ const base::string16& name, const base::string16& content_security_policy, blink::WebContentSecurityPolicyType security_policy_type, + blink::WebAddressSpace creation_address_space, ResourceContext* resource_context, const WorkerStoragePartitionId& partition_id, blink::WebSharedWorkerCreationContextType creation_context_type) @@ -20,6 +21,7 @@ name_(name), content_security_policy_(content_security_policy), security_policy_type_(security_policy_type), + creation_address_space_(creation_address_space), resource_context_(resource_context), partition_id_(partition_id), creation_context_type_(creation_context_type) { @@ -31,6 +33,7 @@ name_(other.name_), content_security_policy_(other.content_security_policy_), security_policy_type_(other.security_policy_type_), + creation_address_space_(other.creation_address_space_), resource_context_(other.resource_context_), partition_id_(other.partition_id_), creation_context_type_(other.creation_context_type_) {}
diff --git a/content/browser/shared_worker/shared_worker_instance.h b/content/browser/shared_worker/shared_worker_instance.h index 025da9b..947621e1 100644 --- a/content/browser/shared_worker/shared_worker_instance.h +++ b/content/browser/shared_worker/shared_worker_instance.h
@@ -9,6 +9,7 @@ #include "content/browser/shared_worker/worker_storage_partition.h" #include "content/common/content_export.h" +#include "third_party/WebKit/public/platform/WebAddressSpace.h" #include "third_party/WebKit/public/web/WebContentSecurityPolicy.h" #include "third_party/WebKit/public/web/WebSharedWorkerCreationContextType.h" #include "url/gurl.h" @@ -25,6 +26,7 @@ const base::string16& name, const base::string16& content_security_policy, blink::WebContentSecurityPolicyType security_policy_type, + blink::WebAddressSpace creation_address_space, ResourceContext* resource_context, const WorkerStoragePartitionId& partition_id, blink::WebSharedWorkerCreationContextType creation_context_type); @@ -52,6 +54,9 @@ blink::WebContentSecurityPolicyType security_policy_type() const { return security_policy_type_; } + blink::WebAddressSpace creation_address_space() const { + return creation_address_space_; + } ResourceContext* resource_context() const { return resource_context_; } @@ -65,6 +70,7 @@ const base::string16 name_; const base::string16 content_security_policy_; const blink::WebContentSecurityPolicyType security_policy_type_; + const blink::WebAddressSpace creation_address_space_; ResourceContext* const resource_context_; const WorkerStoragePartitionId partition_id_; const blink::WebSharedWorkerCreationContextType creation_context_type_;
diff --git a/content/browser/shared_worker/shared_worker_instance_unittest.cc b/content/browser/shared_worker/shared_worker_instance_unittest.cc index c78cb1f..9e773f7 100644 --- a/content/browser/shared_worker/shared_worker_instance_unittest.cc +++ b/content/browser/shared_worker/shared_worker_instance_unittest.cc
@@ -49,7 +49,7 @@ TEST_F(SharedWorkerInstanceTest, MatchesTest) { SharedWorkerInstance instance1( GURL("http://example.com/w.js"), base::string16(), base::string16(), - blink::WebContentSecurityPolicyTypeReport, + blink::WebContentSecurityPolicyTypeReport, blink::WebAddressSpacePublic, browser_context_->GetResourceContext(), partition_id_, blink::WebSharedWorkerCreationContextTypeNonsecure); EXPECT_TRUE(Matches(instance1, "http://example.com/w.js", "")); @@ -64,8 +64,8 @@ SharedWorkerInstance instance2( GURL("http://example.com/w.js"), base::ASCIIToUTF16("name"), base::string16(), blink::WebContentSecurityPolicyTypeReport, - browser_context_->GetResourceContext(), partition_id_, - blink::WebSharedWorkerCreationContextTypeNonsecure); + blink::WebAddressSpacePublic, browser_context_->GetResourceContext(), + partition_id_, blink::WebSharedWorkerCreationContextTypeNonsecure); EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", "")); EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", "")); EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", "")); @@ -80,4 +80,17 @@ EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", "name2")); } +TEST_F(SharedWorkerInstanceTest, AddressSpace) { + for (int i = 0; i < static_cast<int>(blink::WebAddressSpaceLast); i++) { + SharedWorkerInstance instance( + GURL("http://example.com/w.js"), base::ASCIIToUTF16("name"), + base::string16(), blink::WebContentSecurityPolicyTypeReport, + static_cast<blink::WebAddressSpace>(i), + browser_context_->GetResourceContext(), partition_id_, + blink::WebSharedWorkerCreationContextTypeNonsecure); + EXPECT_EQ(static_cast<blink::WebAddressSpace>(i), + instance.creation_address_space()); + } +} + } // namespace content
diff --git a/content/browser/shared_worker/shared_worker_service_impl.cc b/content/browser/shared_worker/shared_worker_service_impl.cc index b36187f6..76c6487e 100644 --- a/content/browser/shared_worker/shared_worker_service_impl.cc +++ b/content/browser/shared_worker/shared_worker_service_impl.cc
@@ -292,8 +292,8 @@ *creation_error = blink::WebWorkerCreationErrorNone; scoped_ptr<SharedWorkerInstance> instance(new SharedWorkerInstance( params.url, params.name, params.content_security_policy, - params.security_policy_type, resource_context, partition_id, - params.creation_context_type)); + params.security_policy_type, params.creation_address_space, + resource_context, partition_id, params.creation_context_type)); scoped_ptr<SharedWorkerPendingInstance::SharedWorkerPendingRequest> request( new SharedWorkerPendingInstance::SharedWorkerPendingRequest( filter,
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc index 59739a98..5ea6c59 100644 --- a/content/child/child_thread_impl.cc +++ b/content/child/child_thread_impl.cc
@@ -291,6 +291,7 @@ const InProcessChildThreadParams& params) { options_.browser_process_io_runner = params.io_runner(); options_.channel_name = params.channel_name(); + options_.in_process_message_pipe_handle = params.handle(); return *this; } @@ -358,15 +359,20 @@ return ChildProcess::current()->io_task_runner(); } -void ChildThreadImpl::ConnectChannel(bool use_mojo_channel) { +void ChildThreadImpl::ConnectChannel(bool use_mojo_channel, + mojo::ScopedMessagePipeHandle handle) { bool create_pipe_now = true; if (use_mojo_channel) { VLOG(1) << "Mojo is enabled on child"; - channel_->Init( - IPC::ChannelMojo::CreateClientFactory( - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kMojoChannelToken)), - create_pipe_now); + if (!IsInBrowserProcess()) { + DCHECK(!handle.is_valid()); + handle = mojo::edk::CreateChildMessagePipe( + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + switches::kMojoChannelToken)); + } + DCHECK(handle.is_valid()); + channel_->Init(IPC::ChannelMojo::CreateClientFactory(std::move(handle)), + create_pipe_now); return; } @@ -485,7 +491,9 @@ channel_->AddFilter(startup_filter); } - ConnectChannel(options.use_mojo_channel); + ConnectChannel( + options.use_mojo_channel, + mojo::MakeScopedHandle(options.in_process_message_pipe_handle)); IPC::AttachmentBroker* broker = IPC::AttachmentBroker::GetGlobal(); if (broker && !broker->IsPrivilegedBroker()) broker->RegisterBrokerCommunicationChannel(channel_.get());
diff --git a/content/child/child_thread_impl.h b/content/child/child_thread_impl.h index a5102c2..139713c 100644 --- a/content/child/child_thread_impl.h +++ b/content/child/child_thread_impl.h
@@ -221,7 +221,8 @@ // We create the channel first without connecting it so we can add filters // prior to any messages being received, then connect it afterwards. - void ConnectChannel(bool use_mojo_channel); + void ConnectChannel(bool use_mojo_channel, + mojo::ScopedMessagePipeHandle handle); // IPC message handlers. void OnShutdown(); @@ -304,6 +305,7 @@ bool use_mojo_channel; scoped_refptr<base::SequencedTaskRunner> browser_process_io_runner; std::vector<IPC::MessageFilter*> startup_filters; + mojo::MessagePipeHandle in_process_message_pipe_handle; private: Options();
diff --git a/content/common/DEPS b/content/common/DEPS index 89bdfb6..e3623a7 100644 --- a/content/common/DEPS +++ b/content/common/DEPS
@@ -6,6 +6,7 @@ # No inclusion of WebKit from the browser, other than strictly enum/POD, # header-only types, and some selected common code. "-third_party/WebKit", + "+third_party/WebKit/public/platform/WebAddressSpace.h", "+third_party/WebKit/public/platform/WebCircularGeofencingRegion.h", "+third_party/WebKit/public/platform/WebCString.h", "+third_party/WebKit/public/platform/modules/device_orientation/WebDeviceMotionData.h",
diff --git a/content/common/content_param_traits_macros.h b/content/common/content_param_traits_macros.h index 762436d..36df5fb 100644 --- a/content/common/content_param_traits_macros.h +++ b/content/common/content_param_traits_macros.h
@@ -14,6 +14,7 @@ #include "content/public/common/request_context_type.h" #include "content/public/common/resource_type.h" #include "ipc/ipc_message_macros.h" +#include "third_party/WebKit/public/platform/WebAddressSpace.h" #include "third_party/WebKit/public/platform/WebPageVisibilityState.h" #include "third_party/WebKit/public/web/WebCompositionUnderline.h" #include "third_party/WebKit/public/web/WebContentSecurityPolicy.h" @@ -33,6 +34,7 @@ content::REQUEST_CONTEXT_FRAME_TYPE_LAST) IPC_ENUM_TRAITS_MAX_VALUE(blink::WebContentSecurityPolicyType, blink::WebContentSecurityPolicyTypeLast) +IPC_ENUM_TRAITS_MAX_VALUE(blink::WebAddressSpace, blink::WebAddressSpaceLast); IPC_ENUM_TRAITS_MAX_VALUE(blink::WebSharedWorkerCreationContextType, blink::WebSharedWorkerCreationContextTypeLast) IPC_ENUM_TRAITS_MIN_MAX_VALUE(blink::WebInputEvent::Type,
diff --git a/content/common/gpu/client/gpu_channel_host.cc b/content/common/gpu/client/gpu_channel_host.cc index 6eae8ad..37dd35e 100644 --- a/content/common/gpu/client/gpu_channel_host.cc +++ b/content/common/gpu/client/gpu_channel_host.cc
@@ -23,10 +23,6 @@ #include "ipc/ipc_sync_message_filter.h" #include "url/gurl.h" -#if defined(OS_WIN) || defined(OS_MACOSX) -#include "content/public/common/sandbox_init.h" -#endif - using base::AutoLock; namespace content {
diff --git a/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc b/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc index 64de624..5e48a9ea1 100644 --- a/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc +++ b/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc
@@ -6,8 +6,8 @@ #include "base/logging.h" #include "base/trace_event/trace_event.h" -#include "content/common/android/surface_texture_manager.h" #include "content/common/gpu/gpu_memory_buffer_factory_surface_texture.h" +#include "gpu/ipc/common/android/surface_texture_manager.h" #include "ui/gfx/buffer_format_util.h" #include "ui/gl/android/surface_texture.h" #include "ui/gl/gl_bindings.h" @@ -43,7 +43,7 @@ void FreeSurfaceTextureForTesting( scoped_refptr<gfx::SurfaceTexture> surface_texture, gfx::GpuMemoryBufferId id) { - SurfaceTextureManager::GetInstance()->UnregisterSurfaceTexture(id.id, 0); + gpu::SurfaceTextureManager::GetInstance()->UnregisterSurfaceTexture(id.id, 0); } } // namespace @@ -70,7 +70,7 @@ gfx::BufferUsage usage, const DestructionCallback& callback) { ANativeWindow* native_window = - SurfaceTextureManager::GetInstance() + gpu::SurfaceTextureManager::GetInstance() ->AcquireNativeWidgetForSurfaceTexture(handle.id.id); if (!native_window) return nullptr; @@ -100,7 +100,7 @@ gfx::SurfaceTexture::Create(0); DCHECK(surface_texture); const gfx::GpuMemoryBufferId kBufferId(1); - SurfaceTextureManager::GetInstance()->RegisterSurfaceTexture( + gpu::SurfaceTextureManager::GetInstance()->RegisterSurfaceTexture( kBufferId.id, 0, surface_texture.get()); handle->type = gfx::SURFACE_TEXTURE_BUFFER; handle->id = kBufferId;
diff --git a/content/common/gpu/client/gpu_video_decode_accelerator_host.cc b/content/common/gpu/client/gpu_video_decode_accelerator_host.cc index 1f5cedd..1f0e398 100644 --- a/content/common/gpu/client/gpu_video_decode_accelerator_host.cc +++ b/content/common/gpu/client/gpu_video_decode_accelerator_host.cc
@@ -244,12 +244,14 @@ int32_t picture_buffer_id, int32_t bitstream_buffer_id, const gfx::Rect& visible_rect, - bool allow_overlay) { + bool allow_overlay, + bool size_changed) { DCHECK(CalledOnValidThread()); if (!client_) return; media::Picture picture(picture_buffer_id, bitstream_buffer_id, visible_rect, allow_overlay); + picture.set_size_changed(size_changed); client_->PictureReady(picture); }
diff --git a/content/common/gpu/client/gpu_video_decode_accelerator_host.h b/content/common/gpu/client/gpu_video_decode_accelerator_host.h index 5e4ba9df..e29a643 100644 --- a/content/common/gpu/client/gpu_video_decode_accelerator_host.h +++ b/content/common/gpu/client/gpu_video_decode_accelerator_host.h
@@ -71,7 +71,8 @@ void OnPictureReady(int32_t picture_buffer_id, int32_t bitstream_buffer_id, const gfx::Rect& visible_rect, - bool allow_overlay); + bool allow_overlay, + bool size_changed); void OnFlushDone(); void OnResetDone(); void OnNotifyError(uint32_t error);
diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc index 25380102..4f75aa9 100644 --- a/content/common/gpu/gpu_command_buffer_stub.cc +++ b/content/common/gpu/gpu_command_buffer_stub.cc
@@ -44,7 +44,6 @@ #if defined(OS_WIN) #include "base/win/win_util.h" -#include "content/public/common/sandbox_init.h" #endif #if defined(OS_ANDROID)
diff --git a/content/common/gpu/gpu_memory_buffer_factory_surface_texture.cc b/content/common/gpu/gpu_memory_buffer_factory_surface_texture.cc index a4cf15e..d9fd7d5c 100644 --- a/content/common/gpu/gpu_memory_buffer_factory_surface_texture.cc +++ b/content/common/gpu/gpu_memory_buffer_factory_surface_texture.cc
@@ -4,7 +4,7 @@ #include "content/common/gpu/gpu_memory_buffer_factory_surface_texture.h" -#include "content/common/android/surface_texture_manager.h" +#include "gpu/ipc/common/android/surface_texture_manager.h" #include "ui/gl/android/surface_texture.h" #include "ui/gl/gl_image_surface_texture.h" @@ -50,7 +50,7 @@ if (!surface_texture.get()) return gfx::GpuMemoryBufferHandle(); - SurfaceTextureManager::GetInstance()->RegisterSurfaceTexture( + gpu::SurfaceTextureManager::GetInstance()->RegisterSurfaceTexture( id.id, client_id, surface_texture.get()); { @@ -89,8 +89,8 @@ surface_textures_.erase(key); } - SurfaceTextureManager::GetInstance()->UnregisterSurfaceTexture(id.id, - client_id); + gpu::SurfaceTextureManager::GetInstance()->UnregisterSurfaceTexture( + id.id, client_id); } gpu::ImageFactory* GpuMemoryBufferFactorySurfaceTexture::AsImageFactory() {
diff --git a/content/common/gpu/gpu_messages.h b/content/common/gpu/gpu_messages.h index fcf885d8..47cf56b6 100644 --- a/content/common/gpu/gpu_messages.h +++ b/content/common/gpu/gpu_messages.h
@@ -38,7 +38,7 @@ #include "url/ipc/url_param_traits.h" #if defined(OS_ANDROID) -#include "content/common/android/surface_texture_peer.h" +#include "gpu/ipc/common/android/surface_texture_peer.h" #elif defined(OS_MACOSX) #include "ui/base/cocoa/remote_layer_api.h" #include "ui/gfx/mac/io_surface.h"
diff --git a/content/common/gpu/media/OWNERS b/content/common/gpu/media/OWNERS index 633a187..9999d737 100644 --- a/content/common/gpu/media/OWNERS +++ b/content/common/gpu/media/OWNERS
@@ -2,3 +2,16 @@ posciak@chromium.org sandersd@chromium.org wuchengli@chromium.org + +# For security review of IPC message files. +per-file *_messages*.h=set noparent +per-file *_messages*.h=dcheng@chromium.org +per-file *_messages*.h=inferno@chromium.org +per-file *_messages*.h=jln@chromium.org +per-file *_messages*.h=jschuh@chromium.org +per-file *_messages*.h=kenrb@chromium.org +per-file *_messages*.h=mkwst@chromium.org +per-file *_messages*.h=nasko@chromium.org +per-file *_messages*.h=palmer@chromium.org +per-file *_messages*.h=tsepez@chromium.org +per-file *_messages*.h=wfh@chromium.org
diff --git a/content/common/gpu/media/android_copying_backing_strategy.cc b/content/common/gpu/media/android_copying_backing_strategy.cc index e81c9eb0..0c01f74 100644 --- a/content/common/gpu/media/android_copying_backing_strategy.cc +++ b/content/common/gpu/media/android_copying_backing_strategy.cc
@@ -158,4 +158,32 @@ return false; } +void AndroidCopyingBackingStrategy::UpdatePictureBufferSize( + media::PictureBuffer* picture_buffer, + const gfx::Size& new_size) { + // This strategy uses 2D textures who's allocated memory is dependent on the + // size. To update size in all places, we must: + // 1) Update the PictureBuffer meta-data + picture_buffer->set_size(new_size); + + // 2) Update the GL texture via glTexImage2D. This step assumes the caller + // has made our GL context current. + glBindTexture(GL_TEXTURE_2D, picture_buffer->texture_id()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, new_size.width(), new_size.height(), + 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + state_provider_->GetGlDecoder()->RestoreActiveTextureUnitBinding( + GL_TEXTURE_2D); + + // 3) Update the CHROMIUM Texture's size. + gpu::gles2::TextureRef* texture_ref = + state_provider_->GetTextureForPicture(*picture_buffer); + RETURN_IF_NULL(texture_ref); + gpu::gles2::TextureManager* texture_manager = + state_provider_->GetGlDecoder()->GetContextGroup()->texture_manager(); + RETURN_IF_NULL(texture_manager); + texture_manager->SetLevelInfo(texture_ref, GetTextureTarget(), 0, GL_RGBA, + new_size.width(), new_size.height(), 1, 0, + GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(new_size)); +} + } // namespace content
diff --git a/content/common/gpu/media/android_copying_backing_strategy.h b/content/common/gpu/media/android_copying_backing_strategy.h index ba1ac61..2a6f3d5 100644 --- a/content/common/gpu/media/android_copying_backing_strategy.h +++ b/content/common/gpu/media/android_copying_backing_strategy.h
@@ -44,6 +44,8 @@ const AndroidVideoDecodeAccelerator::OutputBufferMap&) override; void OnFrameAvailable() override; bool ArePicturesOverlayable() override; + void UpdatePictureBufferSize(media::PictureBuffer* picture_buffer, + const gfx::Size& new_size) override; private: // Used for copy the texture from surface texture to picture buffers.
diff --git a/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc b/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc index c1e0d2e4..67aa497 100644 --- a/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc +++ b/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc
@@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "content/common/gpu/media/android_deferred_rendering_backing_strategy.h" + #include <EGL/egl.h> #include <EGL/eglext.h> -#include "content/common/gpu/media/android_deferred_rendering_backing_strategy.h" - +#include "base/android/build_info.h" #include "base/bind.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" @@ -16,6 +17,7 @@ #include "content/common/gpu/media/avda_codec_image.h" #include "content/common/gpu/media/avda_return_on_failure.h" #include "content/common/gpu/media/avda_shared_state.h" +#include "gpu/command_buffer/service/context_group.h" #include "gpu/command_buffer/service/gl_stream_texture_image.h" #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" #include "gpu/command_buffer/service/texture_manager.h" @@ -48,18 +50,6 @@ int surface_view_id) { shared_state_ = new AVDASharedState(); - gfx::ScopedJavaSurface surface; - if (surface_view_id != media::VideoDecodeAccelerator::Config::kNoSurfaceID) { - surface = - GpuSurfaceLookup::GetInstance()->AcquireJavaSurface(surface_view_id); - } else { - // Create a detached SurfaceTexture. Detaching it will silently fail to - // delete texture 0. - surface_texture_ = gfx::SurfaceTexture::Create(0); - surface_texture_->DetachFromGLContext(); - surface = gfx::ScopedJavaSurface(surface_texture_.get()); - } - // Create a texture for the SurfaceTexture to use. We don't attach it here // so that it gets attached in the compositor gl context in the common case. GLuint service_id = 0; @@ -67,6 +57,25 @@ DCHECK(service_id); shared_state_->set_surface_texture_service_id(service_id); + gfx::ScopedJavaSurface surface; + if (surface_view_id != media::VideoDecodeAccelerator::Config::kNoSurfaceID) { + surface = + GpuSurfaceLookup::GetInstance()->AcquireJavaSurface(surface_view_id); + } else { + if (DoesSurfaceTextureDetachWork()) { + // Create a detached SurfaceTexture. Detaching it will silently fail to + // delete texture 0. + surface_texture_ = gfx::SurfaceTexture::Create(0); + surface_texture_->DetachFromGLContext(); + } else { + // Detach doesn't work so well on all platforms. Just attach the + // SurfaceTexture here, and probably context switch later. + surface_texture_ = gfx::SurfaceTexture::Create(service_id); + shared_state_->DidAttachSurfaceTexture(); + } + surface = gfx::ScopedJavaSurface(surface_texture_.get()); + } + return surface; } @@ -103,23 +112,10 @@ return GL_TEXTURE_EXTERNAL_OES; } -gpu::gles2::TextureRef* -AndroidDeferredRenderingBackingStrategy::GetTextureForPicture( - const media::PictureBuffer& picture_buffer) { - RETURN_NULL_IF_NULL(state_provider_->GetGlDecoder()); - gpu::gles2::TextureManager* texture_manager = - state_provider_->GetGlDecoder()->GetContextGroup()->texture_manager(); - RETURN_NULL_IF_NULL(texture_manager); - gpu::gles2::TextureRef* texture_ref = - texture_manager->GetTexture(picture_buffer.internal_texture_id()); - RETURN_NULL_IF_NULL(texture_ref); - - return texture_ref; -} - AVDACodecImage* AndroidDeferredRenderingBackingStrategy::GetImageForPicture( const media::PictureBuffer& picture_buffer) { - gpu::gles2::TextureRef* texture_ref = GetTextureForPicture(picture_buffer); + gpu::gles2::TextureRef* texture_ref = + state_provider_->GetTextureForPicture(picture_buffer); RETURN_NULL_IF_NULL(texture_ref); gl::GLImage* image = texture_ref->texture()->GetLevelImage(GetTextureTarget(), 0); @@ -129,7 +125,8 @@ void AndroidDeferredRenderingBackingStrategy::SetImageForPicture( const media::PictureBuffer& picture_buffer, const scoped_refptr<gpu::gles2::GLStreamTextureImage>& image) { - gpu::gles2::TextureRef* texture_ref = GetTextureForPicture(picture_buffer); + gpu::gles2::TextureRef* texture_ref = + state_provider_->GetTextureForPicture(picture_buffer); RETURN_IF_NULL(texture_ref); gpu::gles2::TextureManager* texture_manager = @@ -257,6 +254,14 @@ return !surface_texture_; } +void AndroidDeferredRenderingBackingStrategy::UpdatePictureBufferSize( + media::PictureBuffer* picture_buffer, + const gfx::Size& new_size) { + // This strategy uses EGL images which manage the texture size for us. We + // simply update the PictureBuffer meta-data and leave the texture as-is. + picture_buffer->set_size(new_size); +} + void AndroidDeferredRenderingBackingStrategy::CopySurfaceTextureToPictures( const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) { DVLOG(3) << __FUNCTION__; @@ -270,6 +275,11 @@ if (!gl_decoder) return; + // Mali + <= KitKat crashes when we try to do this. We don't know if it's + // due to detaching a surface texture, but it's the same set of devices. + if (!DoesSurfaceTextureDetachWork()) + return; + const gfx::Size size = state_provider_->GetSize(); // Create a 2D texture to hold a copy of the SurfaceTexture's front buffer. @@ -314,7 +324,10 @@ } for (const std::pair<int, media::PictureBuffer>& entry : buffers) { - gpu::gles2::TextureRef* texture_ref = GetTextureForPicture(entry.second); + gpu::gles2::TextureRef* texture_ref = + state_provider_->GetTextureForPicture(entry.second); + if (!texture_ref) + continue; gfx::ScopedTextureBinder texture_binder( GL_TEXTURE_EXTERNAL_OES, texture_ref->texture()->service_id()); glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, egl_image); @@ -329,4 +342,20 @@ } } +bool AndroidDeferredRenderingBackingStrategy::DoesSurfaceTextureDetachWork() + const { + bool surface_texture_detach_works = true; + if (gpu::gles2::GLES2Decoder* gl_decoder = + state_provider_->GetGlDecoder().get()) { + if (gpu::gles2::ContextGroup* group = gl_decoder->GetContextGroup()) { + if (gpu::gles2::FeatureInfo* feature_info = group->feature_info()) { + surface_texture_detach_works = + !feature_info->workarounds().surface_texture_cant_detach; + } + } + } + + return surface_texture_detach_works; +} + } // namespace content
diff --git a/content/common/gpu/media/android_deferred_rendering_backing_strategy.h b/content/common/gpu/media/android_deferred_rendering_backing_strategy.h index 1cb8bd0..830eca3 100644 --- a/content/common/gpu/media/android_deferred_rendering_backing_strategy.h +++ b/content/common/gpu/media/android_deferred_rendering_backing_strategy.h
@@ -54,15 +54,14 @@ const AndroidVideoDecodeAccelerator::OutputBufferMap&) override; void OnFrameAvailable() override; bool ArePicturesOverlayable() override; + void UpdatePictureBufferSize(media::PictureBuffer* picture_buffer, + const gfx::Size& new_size) override; private: // Release any codec buffer that is associated with the given picture buffer // back to the codec. It is okay if there is no such buffer. void ReleaseCodecBufferForPicture(const media::PictureBuffer& picture_buffer); - // Return the TextureRef for a given PictureBuffer's texture. - gpu::gles2::TextureRef* GetTextureForPicture(const media::PictureBuffer&); - // Return the AVDACodecImage for a given PictureBuffer's texture. AVDACodecImage* GetImageForPicture(const media::PictureBuffer&); void SetImageForPicture( @@ -76,6 +75,10 @@ void CopySurfaceTextureToPictures( const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers); + // Return true if and only if the surface_texture_cant_detach workaround is + // not set. + bool DoesSurfaceTextureDetachWork() const; + scoped_refptr<AVDASharedState> shared_state_; AVDAStateProvider* state_provider_;
diff --git a/content/common/gpu/media/android_video_decode_accelerator.cc b/content/common/gpu/media/android_video_decode_accelerator.cc index dd3e75e..05952cb 100644 --- a/content/common/gpu/media/android_video_decode_accelerator.cc +++ b/content/common/gpu/media/android_video_decode_accelerator.cc
@@ -19,6 +19,7 @@ #include "content/common/gpu/gpu_channel.h" #include "content/common/gpu/media/android_copying_backing_strategy.h" #include "content/common/gpu/media/android_deferred_rendering_backing_strategy.h" +#include "content/common/gpu/media/avda_return_on_failure.h" #include "content/common/gpu/media/shared_memory_region.h" #include "content/public/common/content_switches.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" @@ -599,25 +600,30 @@ return false; case media::MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: { - if (!output_picture_buffers_.empty()) { - // TODO(chcunningham): This will likely dismiss a handful of decoded - // frames that have not yet been drawn and returned to us for re-use. - // Consider a more complicated design that would wait for them to be - // drawn before dismissing. - DismissPictureBuffers(); - } - if (media_codec_->GetOutputSize(&size_) != media::MEDIA_CODEC_OK) { POST_ERROR(PLATFORM_FAILURE, "GetOutputSize failed."); return false; } + DVLOG(3) << __FUNCTION__ + << " OUTPUT_FORMAT_CHANGED, new size: " << size_.ToString(); - picturebuffers_requested_ = true; - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&AndroidVideoDecodeAccelerator::RequestPictureBuffers, - weak_this_factory_.GetWeakPtr())); - return false; + // Don't request picture buffers if we already have some. This avoids + // having to dismiss the existing buffers which may actively reference + // decoded images. Breaking their connection to the decoded image will + // cause rendering of black frames. Instead, we let the existing + // PictureBuffers live on and we simply update their size the next time + // they're attachted to an image of the new resolution. See the + // size update in |SendDecodedFrameToClient| and https://crbug/587994. + if (output_picture_buffers_.empty() && !picturebuffers_requested_) { + picturebuffers_requested_ = true; + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&AndroidVideoDecodeAccelerator::RequestPictureBuffers, + weak_this_factory_.GetWeakPtr())); + return false; + } + + return true; } case media::MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED: @@ -723,24 +729,34 @@ free_picture_ids_.pop(); TRACE_COUNTER1("media", "AVDA::FreePictureIds", free_picture_ids_.size()); - OutputBufferMap::const_iterator i = - output_picture_buffers_.find(picture_buffer_id); + const auto& i = output_picture_buffers_.find(picture_buffer_id); if (i == output_picture_buffers_.end()) { POST_ERROR(PLATFORM_FAILURE, "Can't find PictureBuffer id: " << picture_buffer_id); return; } + bool size_changed = false; + if (i->second.size() != size_) { + // Size may have changed due to resolution change since the last time this + // PictureBuffer was used. + strategy_->UpdatePictureBufferSize(&i->second, size_); + size_changed = true; + } + // Connect the PictureBuffer to the decoded frame, via whatever // mechanism the strategy likes. strategy_->UseCodecBufferForPictureBuffer(codec_buffer_index, i->second); const bool allow_overlay = strategy_->ArePicturesOverlayable(); + + media::Picture picture(picture_buffer_id, bitstream_id, gfx::Rect(size_), + allow_overlay); + picture.set_size_changed(size_changed); + base::MessageLoop::current()->PostTask( FROM_HERE, base::Bind(&AndroidVideoDecodeAccelerator::NotifyPictureReady, - weak_this_factory_.GetWeakPtr(), - media::Picture(picture_buffer_id, bitstream_id, - gfx::Rect(size_), allow_overlay))); + weak_this_factory_.GetWeakPtr(), picture)); } void AndroidVideoDecodeAccelerator::Decode( @@ -1020,6 +1036,25 @@ return gl_decoder_; } +gpu::gles2::TextureRef* AndroidVideoDecodeAccelerator::GetTextureForPicture( + const media::PictureBuffer& picture_buffer) { + RETURN_ON_FAILURE(this, gl_decoder_, "Null gl_decoder_", ILLEGAL_STATE, + nullptr); + RETURN_ON_FAILURE(this, gl_decoder_->GetContextGroup(), + "Null gl_decoder_->GetContextGroup()", ILLEGAL_STATE, + nullptr); + gpu::gles2::TextureManager* texture_manager = + gl_decoder_->GetContextGroup()->texture_manager(); + RETURN_ON_FAILURE(this, texture_manager, "Null texture_manager", + ILLEGAL_STATE, nullptr); + gpu::gles2::TextureRef* texture_ref = + texture_manager->GetTexture(picture_buffer.internal_texture_id()); + RETURN_ON_FAILURE(this, texture_manager, "Null texture_ref", ILLEGAL_STATE, + nullptr); + + return texture_ref; +} + void AndroidVideoDecodeAccelerator::OnFrameAvailable() { // Remember: this may be on any thread. DCHECK(strategy_);
diff --git a/content/common/gpu/media/android_video_decode_accelerator.h b/content/common/gpu/media/android_video_decode_accelerator.h index ab2c4da..7c3a28a 100644 --- a/content/common/gpu/media/android_video_decode_accelerator.h +++ b/content/common/gpu/media/android_video_decode_accelerator.h
@@ -98,6 +98,14 @@ // Whether the pictures produced by this backing strategy are overlayable. virtual bool ArePicturesOverlayable() = 0; + + // Size may have changed due to resolution change since the last time this + // PictureBuffer was used. Update the size of the picture buffer to + // |new_size| and also update any size-dependent state (e.g. size of + // associated texture). Callers should set the correct GL context prior to + // calling. + virtual void UpdatePictureBufferSize(media::PictureBuffer* picture_buffer, + const gfx::Size& new_size); }; AndroidVideoDecodeAccelerator( @@ -122,6 +130,8 @@ const gfx::Size& GetSize() const override; const base::ThreadChecker& ThreadChecker() const override; base::WeakPtr<gpu::gles2::GLES2Decoder> GetGlDecoder() const override; + gpu::gles2::TextureRef* GetTextureForPicture( + const media::PictureBuffer& picture_buffer) override; void PostError(const ::tracked_objects::Location& from_here, media::VideoDecodeAccelerator::Error error) override;
diff --git a/content/common/gpu/media/avda_state_provider.h b/content/common/gpu/media/avda_state_provider.h index 2c84f2e..e7dfac6 100644 --- a/content/common/gpu/media/avda_state_provider.h +++ b/content/common/gpu/media/avda_state_provider.h
@@ -8,6 +8,7 @@ #include "base/compiler_specific.h" #include "base/threading/thread_checker.h" #include "content/common/content_export.h" +#include "gpu/command_buffer/service/texture_manager.h" #include "media/video/video_decode_accelerator.h" namespace gfx { @@ -36,6 +37,8 @@ virtual const gfx::Size& GetSize() const = 0; virtual const base::ThreadChecker& ThreadChecker() const = 0; virtual base::WeakPtr<gpu::gles2::GLES2Decoder> GetGlDecoder() const = 0; + virtual gpu::gles2::TextureRef* GetTextureForPicture( + const media::PictureBuffer& picture_buffer) = 0; // Helper function to report an error condition and stop decoding. // This will post NotifyError(), and transition to the error state.
diff --git a/content/common/gpu/media/gpu_video_decode_accelerator.cc b/content/common/gpu/media/gpu_video_decode_accelerator.cc index 7ce14e9..0d57d4a 100644 --- a/content/common/gpu/media/gpu_video_decode_accelerator.cc +++ b/content/common/gpu/media/gpu_video_decode_accelerator.cc
@@ -265,7 +265,7 @@ if (!Send(new AcceleratedVideoDecoderHostMsg_PictureReady( host_route_id_, picture.picture_buffer_id(), picture.bitstream_buffer_id(), picture.visible_rect(), - picture.allow_overlay()))) { + picture.allow_overlay(), picture.size_changed()))) { DLOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_PictureReady) failed"; } }
diff --git a/content/common/gpu/media/media_messages.h b/content/common/gpu/media/media_messages.h index e351d941..554fb15 100644 --- a/content/common/gpu/media/media_messages.h +++ b/content/common/gpu/media/media_messages.h
@@ -22,8 +22,8 @@ #define IPC_MESSAGE_START MediaMsgStart -#ifndef CONTENT_COMMON_GPU_MEDIA_MESSAGES_H_ -#define CONTENT_COMMON_GPU_MEDIA_MESSAGES_H_ +#ifndef CONTENT_COMMON_GPU_MEDIA_MEDIA_MESSAGES_H_ +#define CONTENT_COMMON_GPU_MEDIA_MEDIA_MESSAGES_H_ namespace IPC { template <> @@ -38,7 +38,7 @@ } // namespace IPC -#endif // CONTENT_COMMON_GPU_MEDIA_MESSAGES_H_ +#endif // CONTENT_COMMON_GPU_MEDIA_MEDIA_MESSAGES_H_ IPC_ENUM_TRAITS_MAX_VALUE(media::JpegDecodeAccelerator::Error, media::JpegDecodeAccelerator::LARGEST_ERROR_ENUM) @@ -173,11 +173,12 @@ int32_t) /* Picture buffer ID */ // Decoder reports that a picture is ready. -IPC_MESSAGE_ROUTED4(AcceleratedVideoDecoderHostMsg_PictureReady, +IPC_MESSAGE_ROUTED5(AcceleratedVideoDecoderHostMsg_PictureReady, int32_t, /* Picture buffer ID */ int32_t, /* Bitstream buffer ID */ gfx::Rect, /* Visible rectangle */ - bool) /* Buffer is HW overlay capable */ + bool, /* Buffer is HW overlay capable */ + bool) /* VDA updated picture size */ // Confirm decoder has been flushed. IPC_MESSAGE_ROUTED0(AcceleratedVideoDecoderHostMsg_FlushDone)
diff --git a/content/common/gpu/media/vt_video_decode_accelerator_mac.cc b/content/common/gpu/media/vt_video_decode_accelerator_mac.cc index 144605ec..8804a698 100644 --- a/content/common/gpu/media/vt_video_decode_accelerator_mac.cc +++ b/content/common/gpu/media/vt_video_decode_accelerator_mac.cc
@@ -626,23 +626,21 @@ config_changed_ = true; } if (config_changed_) { - if (last_sps_.empty()) { - config_changed_ = false; - DLOG(ERROR) << "Invalid configuration; no SPS"; - NotifyError(INVALID_ARGUMENT, SFT_INVALID_STREAM); - return; - } - if (last_pps_.empty()) { - config_changed_ = false; - DLOG(ERROR) << "Invalid configuration; no PPS"; - NotifyError(INVALID_ARGUMENT, SFT_INVALID_STREAM); - return; - } - // Only reconfigure at IDRs to avoid corruption. if (frame->is_idr) { config_changed_ = false; + if (last_sps_.empty()) { + DLOG(ERROR) << "Invalid configuration; no SPS"; + NotifyError(INVALID_ARGUMENT, SFT_INVALID_STREAM); + return; + } + if (last_pps_.empty()) { + DLOG(ERROR) << "Invalid configuration; no PPS"; + NotifyError(INVALID_ARGUMENT, SFT_INVALID_STREAM); + return; + } + // ConfigureDecoder() calls NotifyError() on failure. if (!ConfigureDecoder()) return;
diff --git a/content/common/gpu/stream_texture_android.cc b/content/common/gpu/stream_texture_android.cc index 857bd1673..2ee40a7 100644 --- a/content/common/gpu/stream_texture_android.cc +++ b/content/common/gpu/stream_texture_android.cc
@@ -8,13 +8,13 @@ #include "base/bind.h" #include "base/strings/stringize_macros.h" -#include "content/common/android/surface_texture_peer.h" #include "content/common/gpu/gpu_channel.h" #include "content/common/gpu/gpu_messages.h" #include "gpu/command_buffer/service/context_group.h" #include "gpu/command_buffer/service/context_state.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/command_buffer/service/texture_manager.h" +#include "gpu/ipc/common/android/surface_texture_peer.h" #include "ui/gfx/geometry/size.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_helper.h" @@ -254,7 +254,7 @@ base::ProcessHandle process = owner_stub_->channel()->GetClientPID(); - SurfaceTexturePeer::GetInstance()->EstablishSurfaceTexturePeer( + gpu::SurfaceTexturePeer::GetInstance()->EstablishSurfaceTexturePeer( process, surface_texture_, primary_id, secondary_id); }
diff --git a/content/common/in_process_child_thread_params.cc b/content/common/in_process_child_thread_params.cc index ce245ec..84157997 100644 --- a/content/common/in_process_child_thread_params.cc +++ b/content/common/in_process_child_thread_params.cc
@@ -8,9 +8,9 @@ InProcessChildThreadParams::InProcessChildThreadParams( const std::string& channel_name, - scoped_refptr<base::SequencedTaskRunner> io_runner) - : channel_name_(channel_name), io_runner_(io_runner) { -} + scoped_refptr<base::SequencedTaskRunner> io_runner, + mojo::MessagePipeHandle handle) + : channel_name_(channel_name), io_runner_(io_runner), handle_(handle) {} InProcessChildThreadParams::InProcessChildThreadParams( const InProcessChildThreadParams& other) = default;
diff --git a/content/common/in_process_child_thread_params.h b/content/common/in_process_child_thread_params.h index 4e14a2a..73838db0 100644 --- a/content/common/in_process_child_thread_params.h +++ b/content/common/in_process_child_thread_params.h
@@ -10,6 +10,7 @@ #include "base/memory/ref_counted.h" #include "base/sequenced_task_runner.h" #include "content/common/content_export.h" +#include "mojo/public/cpp/system/message_pipe.h" namespace content { @@ -20,7 +21,8 @@ public: InProcessChildThreadParams( const std::string& channel_name, - scoped_refptr<base::SequencedTaskRunner> io_runner); + scoped_refptr<base::SequencedTaskRunner> io_runner, + mojo::MessagePipeHandle handle = mojo::MessagePipeHandle()); InProcessChildThreadParams(const InProcessChildThreadParams& other); ~InProcessChildThreadParams(); @@ -28,10 +30,12 @@ scoped_refptr<base::SequencedTaskRunner> io_runner() const { return io_runner_; } + mojo::MessagePipeHandle handle() const { return handle_; } private: std::string channel_name_; scoped_refptr<base::SequencedTaskRunner> io_runner_; + mojo::MessagePipeHandle handle_; }; } // namespace content
diff --git a/content/common/service_worker/embedded_worker_messages.h b/content/common/service_worker/embedded_worker_messages.h index 1cad104..f065bab 100644 --- a/content/common/service_worker/embedded_worker_messages.h +++ b/content/common/service_worker/embedded_worker_messages.h
@@ -8,6 +8,7 @@ #include <string> +#include "content/common/service_worker/embedded_worker_settings.h" #include "content/public/common/web_preferences.h" #include "ipc/ipc_message.h" #include "ipc/ipc_message_macros.h" @@ -19,6 +20,11 @@ #define IPC_MESSAGE_START EmbeddedWorkerMsgStart +IPC_STRUCT_TRAITS_BEGIN(content::EmbeddedWorkerSettings) + IPC_STRUCT_TRAITS_MEMBER(v8_cache_options) + IPC_STRUCT_TRAITS_MEMBER(data_saver_enabled) +IPC_STRUCT_TRAITS_END() + // Parameters structure for EmbeddedWorkerMsg_StartWorker. IPC_STRUCT_BEGIN(EmbeddedWorkerMsg_StartWorker_Params) IPC_STRUCT_MEMBER(int, embedded_worker_id) @@ -28,7 +34,7 @@ IPC_STRUCT_MEMBER(int, worker_devtools_agent_route_id) IPC_STRUCT_MEMBER(bool, pause_after_download) IPC_STRUCT_MEMBER(bool, wait_for_debugger) - IPC_STRUCT_MEMBER(content::V8CacheOptions, v8_cache_options) + IPC_STRUCT_MEMBER(content::EmbeddedWorkerSettings, settings) IPC_STRUCT_END() // Parameters structure for EmbeddedWorkerHostMsg_ReportConsoleMessage.
diff --git a/content/common/service_worker/embedded_worker_settings.h b/content/common/service_worker/embedded_worker_settings.h new file mode 100644 index 0000000..2014dae --- /dev/null +++ b/content/common/service_worker/embedded_worker_settings.h
@@ -0,0 +1,19 @@ +// 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 CONTENT_COMMON_SERVICE_WORKER_EMBEDDED_WORKER_SETTINGS_H_ +#define CONTENT_COMMON_SERVICE_WORKER_EMBEDDED_WORKER_SETTINGS_H_ + +#include "content/public/common/web_preferences.h" + +namespace content { + +struct EmbeddedWorkerSettings { + content::V8CacheOptions v8_cache_options; + bool data_saver_enabled; +}; + +} // namespace content + +#endif // CONTENT_COMMON_SERVICE_WORKER_EMBEDDED_WORKER_SETTINGS_H_
diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 5bb3409..d509db6 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h
@@ -388,6 +388,9 @@ // RenderFrame routing id used to send messages back to the parent. IPC_STRUCT_MEMBER(int, render_frame_route_id) + // Address space of the context that created the worker. + IPC_STRUCT_MEMBER(blink::WebAddressSpace, creation_address_space) + // The type (secure or nonsecure) of the context that created the worker. IPC_STRUCT_MEMBER(blink::WebSharedWorkerCreationContextType, creation_context_type)
diff --git a/content/common/worker_messages.h b/content/common/worker_messages.h index df86e79..ec6fa48 100644 --- a/content/common/worker_messages.h +++ b/content/common/worker_messages.h
@@ -41,6 +41,7 @@ IPC_STRUCT_MEMBER(base::string16, name) IPC_STRUCT_MEMBER(base::string16, content_security_policy) IPC_STRUCT_MEMBER(blink::WebContentSecurityPolicyType, security_policy_type) + IPC_STRUCT_MEMBER(blink::WebAddressSpace, creation_address_space) IPC_STRUCT_MEMBER(bool, pause_on_start) IPC_STRUCT_MEMBER(int, route_id) IPC_STRUCT_END()
diff --git a/content/content_app.gypi b/content/content_app.gypi index cca9124..e25a00cb 100644 --- a/content/content_app.gypi +++ b/content/content_app.gypi
@@ -50,6 +50,7 @@ 'dependencies': [ 'content.gyp:content_jni_headers', '../build/android/ndk.gyp:cpu_features', + '../gpu/gpu.gyp:gpu_ipc_common', '../skia/skia.gyp:skia', '../ui/android/ui_android.gyp:ui_android', ],
diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 5d5e591..4096ef2 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi
@@ -21,6 +21,7 @@ '../gin/gin.gyp:gin', '../google_apis/google_apis.gyp:google_apis', '../gpu/gpu.gyp:gpu', + '../gpu/gpu.gyp:gpu_ipc_common', '../mojo/mojo_base.gyp:mojo_application_base', '../mojo/mojo_base.gyp:mojo_geometry_lib', '../mojo/mojo_base.gyp:mojo_url_type_converters',
diff --git a/content/content_common.gypi b/content/content_common.gypi index 215ca90..4669acc 100644 --- a/content/content_common.gypi +++ b/content/content_common.gypi
@@ -234,10 +234,6 @@ 'common/android/gin_java_bridge_value.h', 'common/android/hash_set.cc', 'common/android/hash_set.h', - 'common/android/surface_texture_manager.cc', - 'common/android/surface_texture_manager.h', - 'common/android/surface_texture_peer.cc', - 'common/android/surface_texture_peer.h', 'common/android/sync_compositor_messages.cc', 'common/android/sync_compositor_messages.h', 'common/appcache_interfaces.cc', @@ -613,6 +609,7 @@ 'common/service_port_type_converters.cc', 'common/service_port_type_converters.h', 'common/service_worker/embedded_worker_messages.h', + 'common/service_worker/embedded_worker_settings.h', 'common/service_worker/service_worker_client_info.cc', 'common/service_worker/service_worker_client_info.h', 'common/service_worker/service_worker_messages.h',
diff --git a/content/content_tests.gypi b/content/content_tests.gypi index 53b52ca..a6c21b5c 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi
@@ -842,6 +842,7 @@ 'target_name': 'test_support_content', 'type': 'static_library', 'dependencies': [ + '../gpu/gpu.gyp:gpu_ipc_common', '../mojo/mojo_base.gyp:mojo_application_base', '../mojo/mojo_edk.gyp:mojo_system_impl', '../mojo/mojo_public.gyp:mojo_cpp_bindings',
diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn index 8033dc1..7274e73 100644 --- a/content/gpu/BUILD.gn +++ b/content/gpu/BUILD.gn
@@ -77,4 +77,8 @@ if (use_x11) { deps += [ "//ui/events/platform/x11" ] } + + if (enable_vulkan) { + deps += [ "//gpu/vulkan" ] + } }
diff --git a/content/gpu/gpu_child_thread.cc b/content/gpu/gpu_child_thread.cc index 1bb3df0..369cd4d 100644 --- a/content/gpu/gpu_child_thread.cc +++ b/content/gpu/gpu_child_thread.cc
@@ -40,6 +40,10 @@ #include "ui/ozone/public/ozone_platform.h" #endif +#if defined(ENABLE_VULKAN) +#include "gpu/vulkan/vulkan_surface.h" +#endif + namespace content { namespace { @@ -200,6 +204,11 @@ gpu_info_.video_decode_accelerator_capabilities = content::GpuVideoDecodeAccelerator::GetCapabilities(); +#if defined(ENABLE_VULKAN) + // Temporary Vulkan initialization injection. + gpu::VulkanSurface::InitializeOneOff(); +#endif + if (!gfx::GLSurface::InitializeOneOff()) VLOG(1) << "gfx::GLSurface::InitializeOneOff failed";
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc index 958e40d..4491ac8 100644 --- a/content/gpu/gpu_main.cc +++ b/content/gpu/gpu_main.cc
@@ -80,6 +80,10 @@ #include "content/common/gpu/media/vaapi_wrapper.h" #endif +#if defined(ENABLE_VULKAN) +#include "gpu/vulkan/vulkan_surface.h" +#endif + #if defined(SANITIZER_COVERAGE) #include <sanitizer/common_interface_defs.h> #include <sanitizer/coverage_interface.h> @@ -288,6 +292,11 @@ gl_already_initialized = true; } +#if defined(ENABLE_VULKAN) + // Temporary Vulkan initialization injection. + gpu::VulkanSurface::InitializeOneOff(); +#endif + // Load and initialize the GL implementation and locate the GL entry points. bool gl_initialized = gl_already_initialized
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java index 360df911..e74e49d 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java +++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -1677,7 +1677,7 @@ mContainerView.removeCallbacks(mFakeMouseMoveRunnable); if (mNativeContentViewCore != 0) { nativeSendMouseMoveEvent(mNativeContentViewCore, offset.getEventTime(), - offset.getX(), offset.getY()); + offset.getX(), offset.getY(), event.getToolType(0)); } return true; } finally { @@ -3248,7 +3248,7 @@ boolean isTouchHandleEvent); private native int nativeSendMouseMoveEvent( - long nativeContentViewCoreImpl, long timeMs, float x, float y); + long nativeContentViewCoreImpl, long timeMs, float x, float y, int toolType); private native int nativeSendMouseWheelEvent(long nativeContentViewCoreImpl, long timeMs, float x, float y, float ticksX, float ticksY, float pixelsPerTick);
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java index 473d18db..031e452b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
@@ -51,7 +51,7 @@ private Rect mAccessibilityFocusRect; private boolean mIsHovering; private int mLastHoverId = View.NO_ID; - private int mCurrentRootId; + protected int mCurrentRootId; private final int[] mTempLocation = new int[2]; private final ViewGroup mView; private boolean mUserHasTouchExplored; @@ -905,7 +905,7 @@ @CalledByNative protected void setAccessibilityNodeInfoKitKatAttributes(AccessibilityNodeInfo node, - String roleDescription) { + boolean isRoot, String roleDescription) { // Requires KitKat or higher. } @@ -1096,4 +1096,6 @@ long nativeBrowserAccessibilityManagerAndroid, int id); private native boolean nativeScroll( long nativeBrowserAccessibilityManagerAndroid, int id, int direction); + protected native String nativeGetSupportedHtmlElementTypes( + long nativeBrowserAccessibilityManagerAndroid); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/KitKatBrowserAccessibilityManager.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/KitKatBrowserAccessibilityManager.java index a9008cd..45595bc 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/KitKatBrowserAccessibilityManager.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/KitKatBrowserAccessibilityManager.java
@@ -18,15 +18,23 @@ @JNINamespace("content") @TargetApi(Build.VERSION_CODES.KITKAT) public class KitKatBrowserAccessibilityManager extends BrowserAccessibilityManager { + private String mSupportedHtmlElementTypes; + KitKatBrowserAccessibilityManager(long nativeBrowserAccessibilityManagerAndroid, ContentViewCore contentViewCore) { super(nativeBrowserAccessibilityManagerAndroid, contentViewCore); + mSupportedHtmlElementTypes = nativeGetSupportedHtmlElementTypes( + nativeBrowserAccessibilityManagerAndroid); } @Override protected void setAccessibilityNodeInfoKitKatAttributes(AccessibilityNodeInfo node, - String roleDescription) { + boolean isRoot, String roleDescription) { Bundle bundle = node.getExtras(); bundle.putCharSequence("AccessibilityNodeInfo.roleDescription", roleDescription); + if (isRoot) { + bundle.putCharSequence("ACTION_ARGUMENT_HTML_ELEMENT_STRING_VALUES", + mSupportedHtmlElementTypes); + } } }
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java index 3c8710a..a1bf5125 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
@@ -18,14 +18,12 @@ import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; -import org.chromium.base.CommandLine; import org.chromium.base.Log; import org.chromium.base.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.blink_public.web.WebInputEventModifier; import org.chromium.blink_public.web.WebInputEventType; -import org.chromium.content.common.ContentSwitches; import org.chromium.ui.base.ime.TextInputType; import org.chromium.ui.picker.InputDialogContainer; @@ -120,8 +118,13 @@ mViewEmbedder.getAttachedView().getResources().getConfiguration()); } - void resetInputConnectionFactory() { - if (shouldUseImeThread()) { + private boolean isImeThreadEnabled() { + if (mNativeImeAdapterAndroid == 0) return false; + return nativeIsImeThreadEnabled(mNativeImeAdapterAndroid); + } + + private void resetInputConnectionFactory() { + if (isImeThreadEnabled()) { mInputConnectionFactory = new ThreadedInputConnectionFactory(mInputMethodManagerWrapper); } else { @@ -129,16 +132,6 @@ } } - private boolean shouldUseImeThread() { - if (CommandLine.getInstance().hasSwitch(ContentSwitches.DISABLE_IME_THREAD)) { - return false; - } - if (CommandLine.getInstance().hasSwitch(ContentSwitches.ENABLE_IME_THREAD)) { - return true; - } - return false; - } - /** * @see View#onCreateInputConnection(EditorInfo) */ @@ -625,4 +618,5 @@ int before, int after); private native void nativeResetImeAdapter(long nativeImeAdapterAndroid); private native boolean nativeRequestTextInputStateUpdate(long nativeImeAdapterAndroid); + private native boolean nativeIsImeThreadEnabled(long nativeImeAdapterAndroid); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupItem.java b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupItem.java index 991ce5b4..93ff24fc 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupItem.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupItem.java
@@ -44,6 +44,11 @@ return mType == PopupItemType.GROUP; } + @Override + public boolean isMultilineLabel() { + return false; + } + public int getType() { return mType; }
diff --git a/content/public/android/java/src/org/chromium/content/common/ContentSwitches.java b/content/public/android/java/src/org/chromium/content/common/ContentSwitches.java index 290ebb0..899d48f0 100644 --- a/content/public/android/java/src/org/chromium/content/common/ContentSwitches.java +++ b/content/public/android/java/src/org/chromium/content/common/ContentSwitches.java
@@ -87,10 +87,6 @@ // Native switch kDownloadProcess public static final String SWITCH_DOWNLOAD_PROCESS = "download"; - // Native switches to enable / disable IME's own thread instead of using main UI thread. - public static final String ENABLE_IME_THREAD = "enable-ime-thread"; - public static final String DISABLE_IME_THREAD = "disable-ime-thread"; - // Prevent instantiation. private ContentSwitches() {}
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index be79b6b7..8ec8c8c 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc
@@ -161,6 +161,10 @@ return true; } +bool ContentBrowserClient::IsDataSaverEnabled(BrowserContext* context) { + return false; +} + bool ContentBrowserClient::AllowGetCookie(const GURL& url, const GURL& first_party, const net::CookieList& cookie_list,
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 8c7eeca..34ff478 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h
@@ -351,6 +351,8 @@ int render_process_id, int render_frame_id); + virtual bool IsDataSaverEnabled(BrowserContext* context); + // Allow the embedder to control if the given cookie can be read. // This is called on the IO thread. virtual bool AllowGetCookie(const GURL& url,
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 4ee7eff8..38e1a913 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -70,6 +70,11 @@ base::FEATURE_DISABLED_BY_DEFAULT}; #if defined(OS_ANDROID) +// Use IME's own thread instead of using main UI thread. It also means that +// we will not use replica editor and do a round trip to renderer to synchronize +// with Blink data. +const base::Feature kImeThread{"ImeThread", base::FEATURE_DISABLED_BY_DEFAULT}; + // FeatureList definition for the Seccomp field trial. const base::Feature kSeccompSandboxAndroid{"SeccompSandboxAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 32ae2f3..8fbbf42 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -30,6 +30,7 @@ CONTENT_EXPORT extern const base::Feature kWebFontsIntervention; #if defined(OS_ANDROID) +CONTENT_EXPORT extern const base::Feature kImeThread; CONTENT_EXPORT extern const base::Feature kSeccompSandboxAndroid; #endif // defined(OS_ANDROID)
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 01a3a57..4a84e56 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -950,12 +950,6 @@ // Block ChildProcessMain thread of the renderer's ChildProcessService until a // Java debugger is attached. const char kRendererWaitForJavaDebugger[] = "renderer-wait-for-java-debugger"; - -// Use IME's own thread instead of using main UI thread. It also means that -// we will not use replica editor and do a round trip to renderer to synchronize -// with Blink data. -const char kEnableImeThread[] = "enable-ime-thread"; -const char kDisableImeThread[] = "disable-ime-thread"; #endif // Enable the aggressive flushing of DOM Storage to minimize data loss.
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index c5843ffa..bf8979c 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -274,8 +274,6 @@ extern const char kNetworkCountryIso[]; CONTENT_EXPORT extern const char kRemoteDebuggingSocketName[]; CONTENT_EXPORT extern const char kRendererWaitForJavaDebugger[]; -CONTENT_EXPORT extern const char kEnableImeThread[]; -CONTENT_EXPORT extern const char kDisableImeThread[]; #endif #if defined(OS_CHROMEOS)
diff --git a/content/public/common/url_constants.cc b/content/public/common/url_constants.cc index 028900f..93225b6 100644 --- a/content/public/common/url_constants.cc +++ b/content/public/common/url_constants.cc
@@ -11,10 +11,8 @@ // There are security implications associated with introducing new schemes. const char kChromeDevToolsScheme[] = "chrome-devtools"; const char kChromeUIScheme[] = "chrome"; -const char kExeScheme[] = "exe"; const char kGuestScheme[] = "chrome-guest"; const char kMetadataScheme[] = "metadata"; -const char kMojoScheme[] = "mojo"; const char kSwappedOutScheme[] = "swappedout"; const char kViewSourceScheme[] = "view-source"; #if defined(OS_CHROMEOS)
diff --git a/content/public/common/url_constants.h b/content/public/common/url_constants.h index c1413f5..65c1e6d 100644 --- a/content/public/common/url_constants.h +++ b/content/public/common/url_constants.h
@@ -18,10 +18,8 @@ // from there. CONTENT_EXPORT extern const char kChromeDevToolsScheme[]; CONTENT_EXPORT extern const char kChromeUIScheme[]; // Used for WebUIs. -CONTENT_EXPORT extern const char kExeScheme[]; CONTENT_EXPORT extern const char kGuestScheme[]; CONTENT_EXPORT extern const char kMetadataScheme[]; -CONTENT_EXPORT extern const char kMojoScheme[]; CONTENT_EXPORT extern const char kSwappedOutScheme[]; CONTENT_EXPORT extern const char kViewSourceScheme[]; #if defined(OS_CHROMEOS)
diff --git a/content/public/renderer/media_stream_api.cc b/content/public/renderer/media_stream_api.cc index 9ec76b7..5baaa54 100644 --- a/content/public/renderer/media_stream_api.cc +++ b/content/public/renderer/media_stream_api.cc
@@ -6,8 +6,9 @@ #include <utility> -#include "base/base64.h" #include "base/callback.h" +#include "base/guid.h" +#include "base/memory/scoped_ptr.h" #include "base/rand_util.h" #include "base/strings/utf_string_conversions.h" #include "content/renderer/media/media_stream_audio_source.h" @@ -22,112 +23,92 @@ namespace content { -namespace { - -blink::WebString MakeTrackId() { - std::string track_id; - base::Base64Encode(base::RandBytesAsString(64), &track_id); - return base::UTF8ToUTF16(track_id); -} - -} // namespace - -bool AddVideoTrackToMediaStream(scoped_ptr<media::VideoCapturerSource> source, - bool is_remote, - bool is_readonly, - const std::string& media_stream_url) { - blink::WebMediaStream web_stream = - blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor( - GURL(media_stream_url)); - return AddVideoTrackToMediaStream(std::move(source), is_remote, is_readonly, - &web_stream); -} - -bool AddVideoTrackToMediaStream(scoped_ptr<media::VideoCapturerSource> source, - bool is_remote, - bool is_readonly, - blink::WebMediaStream* web_stream) { - if (web_stream->isNull()) { - DLOG(ERROR) << "Stream not found"; +bool AddVideoTrackToMediaStream( + scoped_ptr<media::VideoCapturerSource> video_source, + bool is_remote, + bool is_readonly, + blink::WebMediaStream* web_media_stream) { + DCHECK(video_source.get()); + if (!web_media_stream || web_media_stream->isNull()) { + DLOG(ERROR) << "WebMediaStream is null"; return false; } - const blink::WebString track_id = MakeTrackId(); - blink::WebMediaStreamSource webkit_source; - scoped_ptr<MediaStreamVideoSource> media_stream_source( + + blink::WebMediaStreamSource web_media_stream_source; + MediaStreamVideoSource* const media_stream_source = new MediaStreamVideoCapturerSource( - MediaStreamSource::SourceStoppedCallback(), std::move(source))); - webkit_source.initialize(track_id, blink::WebMediaStreamSource::TypeVideo, - track_id, is_remote, is_readonly); - webkit_source.setExtraData(media_stream_source.get()); + MediaStreamSource::SourceStoppedCallback(), std::move(video_source)); + const blink::WebString track_id = + blink::WebString::fromUTF8(base::GenerateGUID()); + web_media_stream_source.initialize(track_id, + blink::WebMediaStreamSource::TypeVideo, + track_id, is_remote, is_readonly); + // Takes ownership of |media_stream_source|. + web_media_stream_source.setExtraData(media_stream_source); blink::WebMediaConstraints constraints; constraints.initialize(); - web_stream->addTrack(MediaStreamVideoTrack::CreateVideoTrack( - media_stream_source.release(), constraints, + web_media_stream->addTrack(MediaStreamVideoTrack::CreateVideoTrack( + media_stream_source, constraints, MediaStreamVideoSource::ConstraintsCallback(), true)); return true; } bool AddAudioTrackToMediaStream( - const scoped_refptr<media::AudioCapturerSource>& source, - const media::AudioParameters& params, + scoped_refptr<media::AudioCapturerSource> audio_source, + int sample_rate, + media::ChannelLayout channel_layout, + int frames_per_buffer, bool is_remote, bool is_readonly, - const std::string& media_stream_url) { - DCHECK(params.IsValid()) << params.AsHumanReadableString(); - blink::WebMediaStream web_stream = - blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor( - GURL(media_stream_url)); - return AddAudioTrackToMediaStream(source, - is_remote, is_readonly, &web_stream); -} - -bool AddAudioTrackToMediaStream( - const scoped_refptr<media::AudioCapturerSource>& source, - bool is_remote, - bool is_readonly, - blink::WebMediaStream* web_stream) { - if (web_stream->isNull()) { - DLOG(ERROR) << "Stream not found"; + blink::WebMediaStream* web_media_stream) { + DCHECK(audio_source.get()); + if (!web_media_stream || web_media_stream->isNull()) { + DLOG(ERROR) << "WebMediaStream is null"; return false; } - media::AudioParameters params( - media::AudioParameters::AUDIO_PCM_LINEAR, media::CHANNEL_LAYOUT_STEREO, - 48000, /* sample rate */ - 16, /* bits per sample */ - 480); /* frames per buffer */ + const media::AudioParameters params( + media::AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, + sample_rate, sizeof(int16_t) * 8, frames_per_buffer); + if (!params.IsValid()) { + DLOG(ERROR) << "Invalid audio parameters."; + return false; + } - blink::WebMediaStreamSource webkit_source; - const blink::WebString track_id = MakeTrackId(); - webkit_source.initialize(track_id, - blink::WebMediaStreamSource::TypeAudio, - track_id, - is_remote, - is_readonly); + blink::WebMediaStreamSource web_media_stream_source; + const blink::WebString track_id = + blink::WebString::fromUTF8(base::GenerateGUID()); + web_media_stream_source.initialize(track_id, + blink::WebMediaStreamSource::TypeAudio, + track_id, is_remote, is_readonly); - MediaStreamAudioSource* audio_source( - new MediaStreamAudioSource( - -1, - StreamDeviceInfo(), - MediaStreamSource::SourceStoppedCallback(), - RenderThreadImpl::current()->GetPeerConnectionDependencyFactory())); + MediaStreamAudioSource* media_stream_source(new MediaStreamAudioSource( + -1, StreamDeviceInfo(), MediaStreamSource::SourceStoppedCallback(), + RenderThreadImpl::current()->GetPeerConnectionDependencyFactory())); blink::WebMediaConstraints constraints; constraints.initialize(); - scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer(-1, StreamDeviceInfo(), constraints, - nullptr, audio_source)); - capturer->SetCapturerSource(source, params); - audio_source->SetAudioCapturer(capturer); - webkit_source.setExtraData(audio_source); + { + // TODO(miu): In an upcoming change, a source purposed for passing audio + // directly (i.e., without modification) will replace this "hacky" use of + // WebRtcAudioCapturer. http://crbug.com/577881 + scoped_ptr<WebRtcAudioCapturer> capturer( + WebRtcAudioCapturer::CreateCapturer(-1, StreamDeviceInfo(), constraints, + nullptr, media_stream_source)); + capturer->SetCapturerSource(std::move(audio_source), params); + media_stream_source->SetAudioCapturer(std::move(capturer)); + } + web_media_stream_source.setExtraData( + media_stream_source); // Takes ownership. - blink::WebMediaStreamTrack web_media_audio_track; - web_media_audio_track.initialize(webkit_source); - RenderThreadImpl::current()->GetPeerConnectionDependencyFactory()-> - CreateLocalAudioTrack(web_media_audio_track); + blink::WebMediaStreamTrack web_media_stream_track; + web_media_stream_track.initialize(web_media_stream_source); + RenderThreadImpl::current() + ->GetPeerConnectionDependencyFactory() + ->CreateLocalAudioTrack(web_media_stream_track); - web_stream->addTrack(web_media_audio_track); + web_media_stream->addTrack(web_media_stream_track); return true; }
diff --git a/content/public/renderer/media_stream_api.h b/content/public/renderer/media_stream_api.h index dfb2aaf6..b87c93d 100644 --- a/content/public/renderer/media_stream_api.h +++ b/content/public/renderer/media_stream_api.h
@@ -7,47 +7,39 @@ #include "content/common/content_export.h" #include "media/base/audio_capturer_source.h" +#include "media/base/channel_layout.h" #include "media/base/video_capturer_source.h" namespace blink { class WebMediaStream; } -namespace media { -class AudioParameters; -} - namespace content { // These methods create a WebMediaStreamSource + MediaStreamSource pair with the // provided audio or video capturer source. A new WebMediaStreamTrack + -// MediaStreamTrack pair is created, holding the previous MediaStreamSource, and -// is plugged into the stream identified by |media_stream_url| (or passed as -// |web_stream|). +// MediaStreamTrack pair is created, connected to the source and is plugged into +// the WebMediaStream (|web_media_stream|). // |is_remote| should be true if the source of the data is not a local device. // |is_readonly| should be true if the format of the data cannot be changed by // MediaTrackConstraints. CONTENT_EXPORT bool AddVideoTrackToMediaStream( - scoped_ptr<media::VideoCapturerSource> source, + scoped_ptr<media::VideoCapturerSource> video_source, bool is_remote, bool is_readonly, - const std::string& media_stream_url); -CONTENT_EXPORT bool AddVideoTrackToMediaStream( - scoped_ptr<media::VideoCapturerSource> source, - bool is_remote, - bool is_readonly, - blink::WebMediaStream* web_stream); + blink::WebMediaStream* web_media_stream); +// |sample_rate|, |channel_layout|, and |frames_per_buffer| specify the audio +// parameters of the track. Generally, these should match the |audio_source| so +// that it does not have to perform unnecessary sample rate conversion or +// channel mixing. CONTENT_EXPORT bool AddAudioTrackToMediaStream( - const scoped_refptr<media::AudioCapturerSource>& source, - const media::AudioParameters& params, + scoped_refptr<media::AudioCapturerSource> audio_source, + int sample_rate, + media::ChannelLayout channel_layout, + int frames_per_buffer, bool is_remote, bool is_readonly, - const std::string& media_stream_url); -CONTENT_EXPORT bool AddAudioTrackToMediaStream( - const scoped_refptr<media::AudioCapturerSource>& source, - bool is_remote, - bool is_readonly, - blink::WebMediaStream* web_stream); + blink::WebMediaStream* web_media_stream); } // namespace content
diff --git a/content/public/renderer/media_stream_audio_sink.cc b/content/public/renderer/media_stream_audio_sink.cc index ad075d1..875a635 100644 --- a/content/public/renderer/media_stream_audio_sink.cc +++ b/content/public/renderer/media_stream_audio_sink.cc
@@ -15,20 +15,23 @@ MediaStreamAudioSink* sink, const blink::WebMediaStreamTrack& track) { DCHECK(track.source().getType() == blink::WebMediaStreamSource::TypeAudio); - MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::GetTrack(track); + MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); + DCHECK(native_track); native_track->AddSink(sink); } void MediaStreamAudioSink::RemoveFromAudioTrack( MediaStreamAudioSink* sink, const blink::WebMediaStreamTrack& track) { - MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::GetTrack(track); + MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); + DCHECK(native_track); native_track->RemoveSink(sink); } media::AudioParameters MediaStreamAudioSink::GetFormatFromAudioTrack( const blink::WebMediaStreamTrack& track) { - MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::GetTrack(track); + MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); + DCHECK(native_track); return native_track->GetOutputFormat(); }
diff --git a/content/renderer/child_frame_compositing_helper.cc b/content/renderer/child_frame_compositing_helper.cc index 2392e7b..e5ee906b 100644 --- a/content/renderer/child_frame_compositing_helper.cc +++ b/content/renderer/child_frame_compositing_helper.cc
@@ -8,6 +8,7 @@ #include "cc/blink/web_layer_impl.h" #include "cc/layers/layer_settings.h" +#include "cc/layers/picture_image_layer.h" #include "cc/layers/solid_color_layer.h" #include "cc/layers/surface_layer.h" #include "cc/output/context_provider.h" @@ -19,6 +20,8 @@ #include "content/common/content_switches_internal.h" #include "content/common/frame_messages.h" #include "content/common/gpu/client/context_provider_command_buffer.h" +#include "content/public/common/content_client.h" +#include "content/public/renderer/content_renderer_client.h" #include "content/renderer/browser_plugin/browser_plugin.h" #include "content/renderer/browser_plugin/browser_plugin_manager.h" #include "content/renderer/render_frame_impl.h" @@ -28,6 +31,9 @@ #include "third_party/WebKit/public/web/WebFrame.h" #include "third_party/WebKit/public/web/WebPluginContainer.h" #include "third_party/khronos/GLES2/gl2.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkImage.h" +#include "ui/gfx/geometry/point_f.h" #include "ui/gfx/geometry/size_conversions.h" #include "ui/gfx/skia_util.h" @@ -115,7 +121,29 @@ scoped_refptr<cc::SolidColorLayer> crashed_layer = cc::SolidColorLayer::Create(cc::LayerSettings()); crashed_layer->SetMasksToBounds(true); - crashed_layer->SetBackgroundColor(SkColorSetARGBInline(255, 0, 128, 0)); + crashed_layer->SetBackgroundColor(SK_ColorBLACK); + + if (web_layer_) { + SkBitmap* sad_bitmap = + GetContentClient()->renderer()->GetSadWebViewBitmap(); + if (sad_bitmap && web_layer_->bounds().width > sad_bitmap->width() && + web_layer_->bounds().height > sad_bitmap->height()) { + scoped_refptr<cc::PictureImageLayer> sad_layer = + cc::PictureImageLayer::Create(cc::LayerSettings()); + skia::RefPtr<SkImage> image = + skia::AdoptRef(SkImage::NewFromBitmap(*sad_bitmap)); + sad_layer->SetImage(image); + sad_layer->SetBounds( + gfx::Size(sad_bitmap->width(), sad_bitmap->height())); + sad_layer->SetPosition(gfx::PointF( + (web_layer_->bounds().width - sad_bitmap->width()) / 2, + (web_layer_->bounds().height - sad_bitmap->height()) / 2)); + sad_layer->SetIsDrawable(true); + + crashed_layer->AddChild(sad_layer); + } + } + blink::WebLayer* layer = new cc_blink::WebLayerImpl(crashed_layer); UpdateWebLayer(layer); }
diff --git a/content/renderer/geolocation_dispatcher.cc b/content/renderer/geolocation_dispatcher.cc index 1c61eca7..59437180 100644 --- a/content/renderer/geolocation_dispatcher.cc +++ b/content/renderer/geolocation_dispatcher.cc
@@ -81,7 +81,7 @@ permission_service_->RequestPermission( PermissionName::GEOLOCATION, - permissionRequest.securityOrigin().toString().utf8(), + permissionRequest.getSecurityOrigin().toString().utf8(), base::Bind(&GeolocationDispatcher::OnPermissionSet, base::Unretained(this), permission_request_id)); }
diff --git a/content/renderer/gpu/stream_texture_host_android.h b/content/renderer/gpu/stream_texture_host_android.h index 998cff548..8d5da74 100644 --- a/content/renderer/gpu/stream_texture_host_android.h +++ b/content/renderer/gpu/stream_texture_host_android.h
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "content/common/android/surface_texture_peer.h" +#include "gpu/ipc/common/android/surface_texture_peer.h" #include "ipc/ipc_listener.h" #include "ipc/ipc_message.h"
diff --git a/content/renderer/media/android/stream_texture_factory_synchronous_impl.cc b/content/renderer/media/android/stream_texture_factory_synchronous_impl.cc index 137dc98..86a0e37 100644 --- a/content/renderer/media/android/stream_texture_factory_synchronous_impl.cc +++ b/content/renderer/media/android/stream_texture_factory_synchronous_impl.cc
@@ -15,9 +15,9 @@ #include "base/single_thread_task_runner.h" #include "base/synchronization/lock.h" #include "cc/output/context_provider.h" -#include "content/common/android/surface_texture_peer.h" #include "content/renderer/render_thread_impl.h" #include "gpu/command_buffer/client/gles2_interface.h" +#include "gpu/ipc/common/android/surface_texture_peer.h" #include "ui/gl/android/surface_texture.h" using gpu::gles2::GLES2Interface; @@ -183,11 +183,8 @@ scoped_refptr<gfx::SurfaceTexture> surface_texture = context_provider_->GetSurfaceTexture(stream_id); if (surface_texture.get()) { - SurfaceTexturePeer::GetInstance()->EstablishSurfaceTexturePeer( - base::GetCurrentProcessHandle(), - surface_texture, - frame_id, - player_id); + gpu::SurfaceTexturePeer::GetInstance()->EstablishSurfaceTexturePeer( + base::GetCurrentProcessHandle(), surface_texture, frame_id, player_id); } }
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc index 8831cf0..9e84f2d 100644 --- a/content/renderer/media/android/webmediaplayer_android.cc +++ b/content/renderer/media/android/webmediaplayer_android.cc
@@ -320,7 +320,7 @@ DCHECK(main_thread_checker_.CalledOnValidThread()); media::ReportMetrics(load_type, GURL(url), - frame_->document().securityOrigin()); + frame_->document().getSecurityOrigin()); switch (load_type) { case LoadTypeURL: @@ -1647,8 +1647,8 @@ bool is_hls = IsHLSStream(); UMA_HISTOGRAM_BOOLEAN("Media.Android.IsHttpLiveStreamingMedia", is_hls); if (is_hls) { - media::RecordOriginOfHLSPlayback( - blink::WebStringToGURL(frame_->document().securityOrigin().toString())); + media::RecordOriginOfHLSPlayback(blink::WebStringToGURL( + frame_->document().getSecurityOrigin().toString())); } // Assuming that |is_hls| is the ground truth, test predictions.
diff --git a/content/renderer/media/audio_track_recorder.cc b/content/renderer/media/audio_track_recorder.cc index dea0c3d..2664d535 100644 --- a/content/renderer/media/audio_track_recorder.cc +++ b/content/renderer/media/audio_track_recorder.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/macros.h" #include "base/stl_util.h" +#include "content/renderer/media/media_stream_audio_track.h" #include "media/audio/audio_parameters.h" #include "media/base/audio_bus.h" #include "media/base/audio_converter.h" @@ -294,7 +295,7 @@ encoder_thread_("AudioEncoderThread") { DCHECK(main_render_thread_checker_.CalledOnValidThread()); DCHECK(!track_.isNull()); - DCHECK(track_.extraData()); + DCHECK(MediaStreamAudioTrack::From(track_)); // Start the |encoder_thread_|. From this point on, |encoder_| should work // only on |encoder_thread_|, as enforced by DCHECKs.
diff --git a/content/renderer/media/audio_track_recorder_unittest.cc b/content/renderer/media/audio_track_recorder_unittest.cc index 2c5d23f..885ac03 100644 --- a/content/renderer/media/audio_track_recorder_unittest.cc +++ b/content/renderer/media/audio_track_recorder_unittest.cc
@@ -11,7 +11,6 @@ #include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "content/renderer/media/media_stream_audio_source.h" -#include "content/renderer/media/mock_media_constraint_factory.h" #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" #include "content/renderer/media/webrtc_local_audio_track.h" #include "media/audio/simple_sources.h" @@ -209,15 +208,10 @@ // track, which can be used to capture audio data and pass it to the producer. // Adapted from media::WebRTCLocalAudioSourceProviderTest. void PrepareBlinkTrack() { - MockMediaConstraintFactory constraint_factory; - scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer( - -1, StreamDeviceInfo(), - constraint_factory.CreateWebMediaConstraints(), NULL, NULL)); scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> native_track( - new WebRtcLocalAudioTrack(adapter.get(), capturer, NULL)); + new WebRtcLocalAudioTrack(adapter.get())); blink::WebMediaStreamSource audio_source; audio_source.initialize(base::UTF8ToUTF16("dummy_source_id"), blink::WebMediaStreamSource::TypeAudio,
diff --git a/content/renderer/media/cdm/pepper_cdm_wrapper_impl.cc b/content/renderer/media/cdm/pepper_cdm_wrapper_impl.cc index 45405f42..6a53a2f 100644 --- a/content/renderer/media/cdm/pepper_cdm_wrapper_impl.cc +++ b/content/renderer/media/cdm/pepper_cdm_wrapper_impl.cc
@@ -38,7 +38,7 @@ // though the CDM is no longer necessary. // TODO: Consider avoiding this possibility entirely. http://crbug.com/575236 GURL frame_security_origin( - blink::WebStringToGURL(frame->securityOrigin().toString())); + blink::WebStringToGURL(frame->getSecurityOrigin().toString())); if (frame_security_origin != security_origin) { LOG(ERROR) << "Frame has a different origin than the EME call."; return scoped_ptr<PepperCdmWrapper>();
diff --git a/content/renderer/media/media_recorder_handler.cc b/content/renderer/media/media_recorder_handler.cc index e43502e4..b734af8 100644 --- a/content/renderer/media/media_recorder_handler.cc +++ b/content/renderer/media/media_recorder_handler.cc
@@ -135,8 +135,7 @@ } const bool use_audio_tracks = - !audio_tracks.isEmpty() && - MediaStreamAudioTrack::GetTrack(audio_tracks[0]); + !audio_tracks.isEmpty() && MediaStreamAudioTrack::From(audio_tracks[0]); webm_muxer_.reset(new media::WebmMuxer( use_vp9_ ? media::kCodecVP9 : media::kCodecVP8,
diff --git a/content/renderer/media/media_stream_audio_level_calculator.cc b/content/renderer/media/media_stream_audio_level_calculator.cc index ad76a43..936dcf2 100644 --- a/content/renderer/media/media_stream_audio_level_calculator.cc +++ b/content/renderer/media/media_stream_audio_level_calculator.cc
@@ -5,6 +5,7 @@ #include "content/renderer/media/media_stream_audio_level_calculator.h" #include <cmath> +#include <limits> #include "base/logging.h" #include "base/stl_util.h" @@ -28,23 +29,36 @@ } // namespace -MediaStreamAudioLevelCalculator::MediaStreamAudioLevelCalculator() - : counter_(0), - max_amplitude_(0.0f), - level_(0.0f) { +MediaStreamAudioLevelCalculator::Level::Level() : level_(0.0f) {} + +MediaStreamAudioLevelCalculator::Level::~Level() {} + +float MediaStreamAudioLevelCalculator::Level::GetCurrent() const { + base::AutoLock auto_lock(lock_); + return level_; } +void MediaStreamAudioLevelCalculator::Level::Set(float level) { + base::AutoLock auto_lock(lock_); + level_ = level; +} + +MediaStreamAudioLevelCalculator::MediaStreamAudioLevelCalculator() + : counter_(0), max_amplitude_(0.0f), level_(new Level()) {} + MediaStreamAudioLevelCalculator::~MediaStreamAudioLevelCalculator() { + level_->Set(0.0f); } -float MediaStreamAudioLevelCalculator::Calculate( - const media::AudioBus& audio_bus) { - DCHECK(thread_checker_.CalledOnValidThread()); +void MediaStreamAudioLevelCalculator::Calculate( + const media::AudioBus& audio_bus, + bool assume_nonzero_energy) { // |level_| is updated every 10 callbacks. For the case where callback comes // every 10ms, |level_| will be updated approximately every 100ms. static const int kUpdateFrequency = 10; - float max = 0.0f; + float max = + assume_nonzero_energy ? 1.0f / std::numeric_limits<int16_t>::max() : 0.0f; for (int i = 0; i < audio_bus.channels(); ++i) { const float max_this_channel = MaxAmplitude(audio_bus.channel(i), audio_bus.frames()); @@ -54,7 +68,8 @@ max_amplitude_ = std::max(max_amplitude_, max); if (counter_++ == kUpdateFrequency) { - level_ = max_amplitude_; + // Clip the exposed signal level to make sure it is in the range [0.0,1.0]. + level_->Set(std::min(1.0f, max_amplitude_)); // Decay the absolute maximum amplitude by 1/4. max_amplitude_ /= 4.0f; @@ -62,8 +77,6 @@ // Reset the counter. counter_ = 0; } - - return level_; } } // namespace content
diff --git a/content/renderer/media/media_stream_audio_level_calculator.h b/content/renderer/media/media_stream_audio_level_calculator.h index e7d25cc..f093ab4 100644 --- a/content/renderer/media/media_stream_audio_level_calculator.h +++ b/content/renderer/media/media_stream_audio_level_calculator.h
@@ -5,7 +5,9 @@ #ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_LEVEL_CALCULATOR_H_ #define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_LEVEL_CALCULATOR_H_ -#include "base/threading/thread_checker.h" +#include "base/memory/ref_counted.h" +#include "base/synchronization/lock.h" +#include "content/common/content_export.h" namespace media { class AudioBus; @@ -13,30 +15,49 @@ namespace content { -// This class is used by the WebRtcLocalAudioTrack to calculate the level of -// the audio signal. And the audio level will be eventually used by the volume +// This class is used by the WebRtcAudioCapturer to calculate the level of the +// audio signal. And the audio level will be eventually used by the volume // animation UI. +// // The algorithm used by this class is the same as how it is done in // third_party/webrtc/voice_engine/level_indicator.cc. -class MediaStreamAudioLevelCalculator { +class CONTENT_EXPORT MediaStreamAudioLevelCalculator { public: + // Provides thread-safe access to the current signal level. This object is + // intended to be passed to modules running on other threads that poll for the + // current signal level. + class Level : public base::RefCountedThreadSafe<Level> { + public: + float GetCurrent() const; + + private: + friend class MediaStreamAudioLevelCalculator; + friend class base::RefCountedThreadSafe<Level>; + + Level(); + ~Level(); + + void Set(float level); + + mutable base::Lock lock_; + float level_; + }; + MediaStreamAudioLevelCalculator(); ~MediaStreamAudioLevelCalculator(); - // Calculates the signal level of the audio data, returning the absolute value - // of the amplitude of the signal. - float Calculate(const media::AudioBus& audio_bus); + const scoped_refptr<Level>& level() const { return level_; } + + // Scans the audio signal in |audio_bus| and computes a new signal level + // exposed by Level. If |assume_nonzero_energy| is true, then a completely + // zero'ed-out |audio_bus| will be accounted for as having a very faint, + // non-zero level. + void Calculate(const media::AudioBus& audio_bus, bool assume_nonzero_energy); private: - // Used to DCHECK that the constructor and Calculate() are always called on - // the same audio thread. Note that the destructor will be called on a - // different thread, which can be either the main render thread or a new - // audio thread where WebRtcLocalAudioTrack::OnSetFormat() is called. - base::ThreadChecker thread_checker_; - int counter_; float max_amplitude_; - float level_; + const scoped_refptr<Level> level_; }; } // namespace content
diff --git a/content/renderer/media/media_stream_audio_source.cc b/content/renderer/media/media_stream_audio_source.cc index c643140..d2027fd9 100644 --- a/content/renderer/media/media_stream_audio_source.cc +++ b/content/renderer/media/media_stream_audio_source.cc
@@ -4,7 +4,9 @@ #include "content/renderer/media/media_stream_audio_source.h" +#include "content/renderer/media/webrtc_local_audio_track.h" #include "content/renderer/render_frame_impl.h" +#include "third_party/WebKit/public/platform/WebMediaStreamSource.h" namespace content { @@ -13,20 +15,33 @@ const StreamDeviceInfo& device_info, const SourceStoppedCallback& stop_callback, PeerConnectionDependencyFactory* factory) - : render_frame_id_(render_frame_id), factory_(factory) { + : render_frame_id_(render_frame_id), factory_(factory), + weak_factory_(this) { SetDeviceInfo(device_info); SetStopCallback(stop_callback); } MediaStreamAudioSource::MediaStreamAudioSource() - : render_frame_id_(-1), factory_(NULL) { + : render_frame_id_(-1), factory_(NULL), weak_factory_(this) { } MediaStreamAudioSource::~MediaStreamAudioSource() {} +// static +MediaStreamAudioSource* MediaStreamAudioSource::From( + const blink::WebMediaStreamSource& source) { + if (source.isNull() || + source.getType() != blink::WebMediaStreamSource::TypeAudio) { + return nullptr; + } + return static_cast<MediaStreamAudioSource*>(source.getExtraData()); +} + void MediaStreamAudioSource::DoStopSource() { - if (audio_capturer_.get()) + if (audio_capturer_) audio_capturer_->Stop(); + if (webaudio_capturer_) + webaudio_capturer_->Stop(); } void MediaStreamAudioSource::AddTrack( @@ -52,4 +67,20 @@ callback.Run(this, MEDIA_DEVICE_OK, ""); } +void MediaStreamAudioSource::StopAudioDeliveryTo(MediaStreamAudioTrack* track) { + DCHECK(track); + if (audio_capturer_) { + // The cast here is safe because only WebRtcLocalAudioTracks are ever used + // with WebRtcAudioCapturer sources. + // + // TODO(miu): That said, this ugly cast won't be necessary after my + // soon-upcoming refactoring change. + audio_capturer_->RemoveTrack(static_cast<WebRtcLocalAudioTrack*>(track)); + } + if (webaudio_capturer_) { + // A separate source is created for each track, so just stop the source. + webaudio_capturer_->Stop(); + } +} + } // namespace content
diff --git a/content/renderer/media/media_stream_audio_source.h b/content/renderer/media/media_stream_audio_source.h index b2f44d2..6d7da5c 100644 --- a/content/renderer/media/media_stream_audio_source.h +++ b/content/renderer/media/media_stream_audio_source.h
@@ -7,14 +7,23 @@ #include "base/compiler_specific.h" #include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "content/common/content_export.h" #include "content/renderer/media/media_stream_source.h" +#include "content/renderer/media/webaudio_capturer_source.h" #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" #include "content/renderer/media/webrtc_audio_capturer.h" #include "third_party/webrtc/api/mediastreaminterface.h" namespace content { +class MediaStreamAudioTrack; + +// TODO(miu): In a soon-upcoming set of refactoring changes, this class will +// become a base class for managing tracks (part of what WebRtcAudioCapturer +// does today). Then, the rest of WebRtcAudioCapturer will be rolled into a +// subclass. http://crbug.com/577874 class CONTENT_EXPORT MediaStreamAudioSource : NON_EXPORTED_BASE(public MediaStreamSource) { public: @@ -25,27 +34,46 @@ MediaStreamAudioSource(); ~MediaStreamAudioSource() override; + // Returns the MediaStreamAudioSource instance owned by the given blink + // |source| or null. + static MediaStreamAudioSource* From(const blink::WebMediaStreamSource& track); + void AddTrack(const blink::WebMediaStreamTrack& track, const blink::WebMediaConstraints& constraints, const ConstraintsCallback& callback); - void SetLocalAudioSource(webrtc::AudioSourceInterface* source) { - local_audio_source_ = source; + base::WeakPtr<MediaStreamAudioSource> GetWeakPtr() { + return weak_factory_.GetWeakPtr(); } - void SetAudioCapturer(const scoped_refptr<WebRtcAudioCapturer>& capturer) { + // Removes |track| from the list of instances that get a copy of the source + // audio data. + void StopAudioDeliveryTo(MediaStreamAudioTrack* track); + + WebRtcAudioCapturer* audio_capturer() const { return audio_capturer_.get(); } + + void SetAudioCapturer(scoped_ptr<WebRtcAudioCapturer> capturer) { DCHECK(!audio_capturer_.get()); - audio_capturer_ = capturer; - } - - const scoped_refptr<WebRtcAudioCapturer>& GetAudioCapturer() { - return audio_capturer_; + audio_capturer_ = std::move(capturer); } webrtc::AudioSourceInterface* local_audio_source() { return local_audio_source_.get(); } + void SetLocalAudioSource(scoped_refptr<webrtc::AudioSourceInterface> source) { + local_audio_source_ = std::move(source); + } + + WebAudioCapturerSource* webaudio_capturer() const { + return webaudio_capturer_.get(); + } + + void SetWebAudioCapturer(scoped_ptr<WebAudioCapturerSource> capturer) { + DCHECK(!webaudio_capturer_.get()); + webaudio_capturer_ = std::move(capturer); + } + protected: void DoStopSource() override; @@ -53,11 +81,22 @@ const int render_frame_id_; PeerConnectionDependencyFactory* const factory_; + // MediaStreamAudioSource is the owner of either a WebRtcAudioCapturer or a + // WebAudioCapturerSource. + // + // TODO(miu): In a series of soon-upcoming changes, WebRtcAudioCapturer and + // WebAudioCapturerSource will become subclasses of MediaStreamAudioSource + // instead. + scoped_ptr<WebRtcAudioCapturer> audio_capturer_; + scoped_ptr<WebAudioCapturerSource> webaudio_capturer_; + // This member holds an instance of webrtc::LocalAudioSource. This is used // as a container for audio options. scoped_refptr<webrtc::AudioSourceInterface> local_audio_source_; - scoped_refptr<WebRtcAudioCapturer> audio_capturer_; + // Provides weak pointers so that MediaStreamAudioTracks won't call + // StopAudioDeliveryTo() if this instance dies first. + base::WeakPtrFactory<MediaStreamAudioSource> weak_factory_; DISALLOW_COPY_AND_ASSIGN(MediaStreamAudioSource); };
diff --git a/content/renderer/media/media_stream_audio_track.cc b/content/renderer/media/media_stream_audio_track.cc index b7c40747..31c12a0 100644 --- a/content/renderer/media/media_stream_audio_track.cc +++ b/content/renderer/media/media_stream_audio_track.cc
@@ -4,6 +4,7 @@ #include "content/renderer/media/media_stream_audio_track.h" +#include "base/callback_helpers.h" #include "base/logging.h" #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" #include "third_party/webrtc/api/mediastreaminterface.h" @@ -12,13 +13,19 @@ MediaStreamAudioTrack::MediaStreamAudioTrack(bool is_local_track) : MediaStreamTrack(is_local_track) { + DVLOG(1) << "MediaStreamAudioTrack::MediaStreamAudioTrack(is a " + << (is_local_track ? "local" : "remote") << " track)"; } MediaStreamAudioTrack::~MediaStreamAudioTrack() { + DCHECK(main_render_thread_checker_.CalledOnValidThread()); + DVLOG(1) << "MediaStreamAudioTrack::~MediaStreamAudioTrack()"; + DCHECK(stop_callback_.is_null()) + << "BUG: Subclass must ensure Stop() is called."; } // static -MediaStreamAudioTrack* MediaStreamAudioTrack::GetTrack( +MediaStreamAudioTrack* MediaStreamAudioTrack::From( const blink::WebMediaStreamTrack& track) { if (track.isNull() || track.source().getType() != blink::WebMediaStreamSource::TypeAudio) { @@ -27,6 +34,24 @@ return static_cast<MediaStreamAudioTrack*>(track.extraData()); } +void MediaStreamAudioTrack::Start(const base::Closure& stop_callback) { + DCHECK(main_render_thread_checker_.CalledOnValidThread()); + DCHECK(!stop_callback.is_null()); + DCHECK(stop_callback_.is_null()); + DVLOG(1) << "MediaStreamAudioTrack::Start()"; + stop_callback_ = stop_callback; +} + +void MediaStreamAudioTrack::Stop() { + DCHECK(main_render_thread_checker_.CalledOnValidThread()); + DVLOG(1) << "MediaStreamAudioTrack::Stop()"; + if (!stop_callback_.is_null()) + base::ResetAndReturn(&stop_callback_).Run(); + OnStop(); +} + +void MediaStreamAudioTrack::OnStop() {} + webrtc::AudioTrackInterface* MediaStreamAudioTrack::GetAudioAdapter() { NOTREACHED(); return nullptr;
diff --git a/content/renderer/media/media_stream_audio_track.h b/content/renderer/media/media_stream_audio_track.h index 2175b4e..0ef126b4 100644 --- a/content/renderer/media/media_stream_audio_track.h +++ b/content/renderer/media/media_stream_audio_track.h
@@ -5,6 +5,7 @@ #ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_TRACK_H_ #define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_TRACK_H_ +#include "base/callback.h" #include "base/macros.h" #include "content/renderer/media/media_stream_track.h" @@ -16,13 +17,21 @@ class MediaStreamAudioSink; +// TODO(miu): In a soon-upcoming set of refactoring changes, this class will +// take on the functionality of managing sink connections and the audio data +// flow between source and sinks. The WebRTC-specific elements will then be +// moved into a subclass. http://crbug.com/577874 class CONTENT_EXPORT MediaStreamAudioTrack : public MediaStreamTrack { public: explicit MediaStreamAudioTrack(bool is_local_track); + + // Subclasses must ensure the track is stopped (i.e., Stop() has been called + // at least once) before this destructor is invoked. ~MediaStreamAudioTrack() override; - static MediaStreamAudioTrack* GetTrack( - const blink::WebMediaStreamTrack& track); + // Returns the MediaStreamAudioTrack instance owned by the given blink |track| + // or null. + static MediaStreamAudioTrack* From(const blink::WebMediaStreamTrack& track); // Add a sink to the track. This function will trigger a OnSetFormat() // call on the |sink|. @@ -34,6 +43,7 @@ virtual void RemoveSink(MediaStreamAudioSink* sink) = 0; // TODO(tommi, xians): Remove this method. + // TODO(miu): See class-level TODO comment. ;-) virtual webrtc::AudioTrackInterface* GetAudioAdapter(); // Returns the output format of the capture source. May return an invalid @@ -44,7 +54,23 @@ // to the complexity of all types of audio tracks+source implementations. virtual media::AudioParameters GetOutputFormat() const = 0; + // Called to notify this track that the flow of audio data has started from + // the source. |stop_callback| is run by Stop() when the source must halt the + // flow of audio data to this track. + void Start(const base::Closure& stop_callback); + + // Halts the flow of audio data from the source (and to the sinks), and then + // invokes OnStop() to perform any additional actions. + void Stop() final; + + protected: + // Called by Stop() after the source has halted the flow of audio data. + virtual void OnStop(); + private: + // Callback provided to Start() which is run when the audio flow must halt. + base::Closure stop_callback_; + DISALLOW_COPY_AND_ASSIGN(MediaStreamAudioTrack); };
diff --git a/content/renderer/media/media_stream_center.cc b/content/renderer/media/media_stream_center.cc index c520370..32d55a6 100644 --- a/content/renderer/media/media_stream_center.cc +++ b/content/renderer/media/media_stream_center.cc
@@ -15,6 +15,7 @@ #include "content/public/renderer/media_stream_audio_sink.h" #include "content/public/renderer/render_thread.h" #include "content/renderer/media/media_stream.h" +#include "content/renderer/media/media_stream_audio_track.h" #include "content/renderer/media/media_stream_source.h" #include "content/renderer/media/media_stream_video_source.h" #include "content/renderer/media/media_stream_video_track.h" @@ -40,7 +41,7 @@ void CreateNativeAudioMediaStreamTrack( const blink::WebMediaStreamTrack& track, PeerConnectionDependencyFactory* factory) { - DCHECK(!track.extraData()); + DCHECK(!MediaStreamAudioTrack::From(track)); blink::WebMediaStreamSource source = track.source(); DCHECK_EQ(source.getType(), blink::WebMediaStreamSource::TypeAudio); if (source.remote()) {
diff --git a/content/renderer/media/media_stream_renderer_factory_impl.cc b/content/renderer/media/media_stream_renderer_factory_impl.cc index e480d9f..f31dde1 100644 --- a/content/renderer/media/media_stream_renderer_factory_impl.cc +++ b/content/renderer/media/media_stream_renderer_factory_impl.cc
@@ -109,8 +109,8 @@ // and mixes audio from all the tracks that belong to the media stream. // For now, we have separate renderers depending on if the first audio track // in the stream is local or remote. - MediaStreamAudioTrack* audio_track = MediaStreamAudioTrack::GetTrack( - audio_tracks[0]); + MediaStreamAudioTrack* audio_track = + MediaStreamAudioTrack::From(audio_tracks[0]); if (!audio_track) { // This can happen if the track was cloned. // TODO(tommi, perkj): Fix cloning of tracks to handle extra data too.
diff --git a/content/renderer/media/midi_dispatcher.cc b/content/renderer/media/midi_dispatcher.cc index 4cb43e4..26e6444 100644 --- a/content/renderer/media/midi_dispatcher.cc +++ b/content/renderer/media/midi_dispatcher.cc
@@ -40,7 +40,7 @@ : PermissionName::MIDI; permission_service_->RequestPermission( - permission_name, request.securityOrigin().toString().utf8(), + permission_name, request.getSecurityOrigin().toString().utf8(), base::Bind(&MidiDispatcher::OnPermissionSet, base::Unretained(this), permission_request_id)); }
diff --git a/content/renderer/media/mock_media_stream_registry.cc b/content/renderer/media/mock_media_stream_registry.cc index a37ca33b..128024e 100644 --- a/content/renderer/media/mock_media_stream_registry.cc +++ b/content/renderer/media/mock_media_stream_registry.cc
@@ -10,7 +10,6 @@ #include "content/renderer/media/media_stream.h" #include "content/renderer/media/media_stream_audio_source.h" #include "content/renderer/media/media_stream_video_track.h" -#include "content/renderer/media/mock_media_constraint_factory.h" #include "content/renderer/media/mock_media_stream_video_source.h" #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" #include "content/renderer/media/webrtc_local_audio_track.h" @@ -63,21 +62,11 @@ audio_source.setExtraData(new MediaStreamAudioSource()); blink::WebMediaStreamTrack blink_track; blink_track.initialize(audio_source); - const StreamDeviceInfo device_info( - MEDIA_DEVICE_AUDIO_CAPTURE, "Mock audio device", "mock_audio_device_id"); - const MockMediaConstraintFactory constraint_factory; - const blink::WebMediaConstraints constraints = - constraint_factory.CreateWebMediaConstraints(); - const scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer(-1, /* render frame id */ - device_info, constraints, - nullptr, /* audio device */ - nullptr /* audio source */)); const scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(track_id, nullptr /* track source */)); - scoped_ptr<WebRtcLocalAudioTrack> native_track(new WebRtcLocalAudioTrack( - adapter.get(), capturer, nullptr /* webaudio source */)); + scoped_ptr<WebRtcLocalAudioTrack> native_track( + new WebRtcLocalAudioTrack(adapter.get())); blink_track.setExtraData(native_track.release()); test_stream_.addTrack(blink_track); }
diff --git a/content/renderer/media/peer_connection_tracker.cc b/content/renderer/media/peer_connection_tracker.cc index 130f077c..74a01da 100644 --- a/content/renderer/media/peer_connection_tracker.cc +++ b/content/renderer/media/peer_connection_tracker.cc
@@ -656,7 +656,7 @@ DCHECK(main_thread_.CalledOnValidThread()); SendTarget()->Send(new PeerConnectionTrackerHost_GetUserMedia( - user_media_request.securityOrigin().toString().utf8(), + user_media_request.getSecurityOrigin().toString().utf8(), user_media_request.audio(), user_media_request.video(), SerializeMediaConstraints(user_media_request.audioConstraints()), SerializeMediaConstraints(user_media_request.videoConstraints())));
diff --git a/content/renderer/media/rtc_peer_connection_handler.cc b/content/renderer/media/rtc_peer_connection_handler.cc index aab3234..10c6c047f1 100644 --- a/content/renderer/media/rtc_peer_connection_handler.cc +++ b/content/renderer/media/rtc_peer_connection_handler.cc
@@ -1364,7 +1364,7 @@ TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDTMFSender"); DVLOG(1) << "createDTMFSender."; - MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::GetTrack(track); + MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); if (!native_track || !native_track->is_local_track() || track.source().getType() != blink::WebMediaStreamSource::TypeAudio) { DLOG(ERROR) << "The DTMF sender requires a local audio track.";
diff --git a/content/renderer/media/rtc_peer_connection_handler_unittest.cc b/content/renderer/media/rtc_peer_connection_handler_unittest.cc index 0ac11d6c..f1ae3de47 100644 --- a/content/renderer/media/rtc_peer_connection_handler_unittest.cc +++ b/content/renderer/media/rtc_peer_connection_handler_unittest.cc
@@ -20,7 +20,6 @@ #include "content/renderer/media/media_stream_source.h" #include "content/renderer/media/media_stream_video_track.h" #include "content/renderer/media/mock_data_channel_impl.h" -#include "content/renderer/media/mock_media_constraint_factory.h" #include "content/renderer/media/mock_media_stream_video_source.h" #include "content/renderer/media/mock_peer_connection_impl.h" #include "content/renderer/media/mock_web_rtc_peer_connection_handler_client.h" @@ -268,18 +267,10 @@ blink::WebVector<blink::WebMediaStreamTrack> audio_tracks( static_cast<size_t>(1)); audio_tracks[0].initialize(audio_source.id(), audio_source); - StreamDeviceInfo device_info(MEDIA_DEVICE_AUDIO_CAPTURE, "Mock device", - "mock_device_id"); - MockMediaConstraintFactory constraint_factory; - const blink::WebMediaConstraints constraints = - constraint_factory.CreateWebMediaConstraints(); - scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer(-1, device_info, constraints, - nullptr, nullptr)); scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(audio_track_label, nullptr)); scoped_ptr<WebRtcLocalAudioTrack> native_track( - new WebRtcLocalAudioTrack(adapter.get(), capturer, nullptr)); + new WebRtcLocalAudioTrack(adapter.get())); audio_tracks[0].setExtraData(native_track.release()); blink::WebVector<blink::WebMediaStreamTrack> video_tracks( static_cast<size_t>(1)); @@ -521,8 +512,7 @@ blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; local_stream.audioTracks(audio_tracks); MediaStreamAudioSource* native_audio_source = - static_cast<MediaStreamAudioSource*>( - audio_tracks[0].source().getExtraData()); + MediaStreamAudioSource::From(audio_tracks[0].source()); native_audio_source->StopSource(); blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
diff --git a/content/renderer/media/speech_recognition_audio_sink.cc b/content/renderer/media/speech_recognition_audio_sink.cc index 3789422..3beb5a8d 100644 --- a/content/renderer/media/speech_recognition_audio_sink.cc +++ b/content/renderer/media/speech_recognition_audio_sink.cc
@@ -61,11 +61,8 @@ // static bool SpeechRecognitionAudioSink::IsSupportedTrack( const blink::WebMediaStreamTrack& track) { - if (track.source().getType() != blink::WebMediaStreamSource::TypeAudio) - return false; - MediaStreamAudioSource* native_source = - static_cast<MediaStreamAudioSource*>(track.source().getExtraData()); + MediaStreamAudioSource::From(track.source()); if (!native_source) return false;
diff --git a/content/renderer/media/speech_recognition_audio_sink_unittest.cc b/content/renderer/media/speech_recognition_audio_sink_unittest.cc index 64ee434..26256b4 100644 --- a/content/renderer/media/speech_recognition_audio_sink_unittest.cc +++ b/content/renderer/media/speech_recognition_audio_sink_unittest.cc
@@ -13,7 +13,6 @@ #include "base/macros.h" #include "base/strings/utf_string_conversions.h" #include "content/renderer/media/media_stream_audio_source.h" -#include "content/renderer/media/mock_media_constraint_factory.h" #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" #include "content/renderer/media/webrtc_local_audio_track.h" #include "media/audio/audio_parameters.h" @@ -275,26 +274,19 @@ static void PrepareBlinkTrackOfType( const MediaStreamType device_type, blink::WebMediaStreamTrack* blink_track) { - StreamDeviceInfo device_info(device_type, "Mock device", - "mock_device_id"); - MockMediaConstraintFactory constraint_factory; - const blink::WebMediaConstraints constraints = - constraint_factory.CreateWebMediaConstraints(); - scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer(-1, device_info, constraints, NULL, - NULL)); scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> native_track( - new WebRtcLocalAudioTrack(adapter.get(), capturer, NULL)); + new WebRtcLocalAudioTrack(adapter.get())); blink::WebMediaStreamSource blink_audio_source; blink_audio_source.initialize(base::UTF8ToUTF16("dummy_source_id"), blink::WebMediaStreamSource::TypeAudio, base::UTF8ToUTF16("dummy_source_name"), false /* remote */, true /* readonly */); MediaStreamSource::SourceStoppedCallback cb; - blink_audio_source.setExtraData( - new MediaStreamAudioSource(-1, device_info, cb, NULL)); + blink_audio_source.setExtraData(new MediaStreamAudioSource( + -1, StreamDeviceInfo(device_type, "Mock device", "mock_device_id"), cb, + nullptr)); blink_track->initialize(blink::WebString::fromUTF8("dummy_track"), blink_audio_source); blink_track->setExtraData(native_track.release()); @@ -306,7 +298,7 @@ const base::TimeTicks estimated_capture_time = first_frame_capture_time_ + (sample_frames_captured_ * base::TimeDelta::FromSeconds(1) / source_params_.sample_rate()); - native_track()->Capture(*source_bus_, estimated_capture_time, false); + native_track()->Capture(*source_bus_, estimated_capture_time); sample_frames_captured_ += source_bus_->frames(); } }
diff --git a/content/renderer/media/track_audio_renderer.cc b/content/renderer/media/track_audio_renderer.cc index 3a764c05..23f2dadd 100644 --- a/content/renderer/media/track_audio_renderer.cc +++ b/content/renderer/media/track_audio_renderer.cc
@@ -131,7 +131,7 @@ security_origin_(security_origin), volume_(0.0), sink_started_(false) { - DCHECK(MediaStreamAudioTrack::GetTrack(audio_track_)); + DCHECK(MediaStreamAudioTrack::From(audio_track_)); DVLOG(1) << "TrackAudioRenderer::TrackAudioRenderer()"; } @@ -237,7 +237,7 @@ bool TrackAudioRenderer::IsLocalRenderer() const { DCHECK(task_runner_->BelongsToCurrentThread()); - return MediaStreamAudioTrack::GetTrack(audio_track_)->is_local_track(); + return MediaStreamAudioTrack::From(audio_track_)->is_local_track(); } void TrackAudioRenderer::SwitchOutputDevice(
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc index db0fb2e..ac75749e 100644 --- a/content/renderer/media/user_media_client_impl.cc +++ b/content/renderer/media/user_media_client_impl.cc
@@ -203,8 +203,8 @@ } CopyBlinkRequestToStreamControls(user_media_request, &controls); - security_origin = - blink::WebStringToGURL(user_media_request.securityOrigin().toString()); + security_origin = blink::WebStringToGURL( + user_media_request.getSecurityOrigin().toString()); DCHECK(render_frame()->GetWebFrame() == static_cast<blink::WebFrame*>( user_media_request.ownerDocument().frame())); @@ -285,7 +285,7 @@ GURL security_origin; if (!media_devices_request.isNull()) { security_origin = blink::WebStringToGURL( - media_devices_request.securityOrigin().toString()); + media_devices_request.getSecurityOrigin().toString()); } DVLOG(1) << "UserMediaClientImpl::requestMediaDevices(" @@ -1063,7 +1063,7 @@ const blink::WebMediaConstraints& constraints) { DCHECK(track.source().getType() == blink::WebMediaStreamSource::TypeAudio); MediaStreamAudioSource* native_source = - static_cast<MediaStreamAudioSource*>(track.source().getExtraData()); + MediaStreamAudioSource::From(track.source()); DCHECK(native_source); sources_.push_back(track.source());
diff --git a/content/renderer/media/user_media_client_impl_unittest.cc b/content/renderer/media/user_media_client_impl_unittest.cc index 36850f1..0859d86 100644 --- a/content/renderer/media/user_media_client_impl_unittest.cc +++ b/content/renderer/media/user_media_client_impl_unittest.cc
@@ -12,6 +12,7 @@ #include "base/strings/utf_string_conversions.h" #include "content/child/child_process.h" #include "content/renderer/media/media_stream.h" +#include "content/renderer/media/media_stream_audio_source.h" #include "content/renderer/media/media_stream_track.h" #include "content/renderer/media/mock_media_stream_dispatcher.h" #include "content/renderer/media/mock_media_stream_video_source.h" @@ -284,8 +285,8 @@ EXPECT_EQ(desc1_audio_tracks[0].source().id(), desc2_audio_tracks[0].source().id()); - EXPECT_EQ(desc1_audio_tracks[0].source().getExtraData(), - desc2_audio_tracks[0].source().getExtraData()); + EXPECT_EQ(MediaStreamAudioSource::From(desc1_audio_tracks[0].source()), + MediaStreamAudioSource::From(desc2_audio_tracks[0].source())); } // Test that the same source object is not used if two MediaStreams are @@ -314,8 +315,8 @@ EXPECT_NE(desc1_audio_tracks[0].source().id(), desc2_audio_tracks[0].source().id()); - EXPECT_NE(desc1_audio_tracks[0].source().getExtraData(), - desc2_audio_tracks[0].source().getExtraData()); + EXPECT_NE(MediaStreamAudioSource::From(desc1_audio_tracks[0].source()), + MediaStreamAudioSource::From(desc2_audio_tracks[0].source())); } TEST_F(UserMediaClientImplTest, StopLocalTracks) {
diff --git a/content/renderer/media/webaudio_capturer_source.cc b/content/renderer/media/webaudio_capturer_source.cc index 2d66343..3fca4194 100644 --- a/content/renderer/media/webaudio_capturer_source.cc +++ b/content/renderer/media/webaudio_capturer_source.cc
@@ -18,16 +18,22 @@ namespace content { WebAudioCapturerSource::WebAudioCapturerSource( - const blink::WebMediaStreamSource& blink_source) + blink::WebMediaStreamSource* blink_source) : track_(NULL), audio_format_changed_(false), fifo_(base::Bind(&WebAudioCapturerSource::DeliverRebufferedAudio, base::Unretained(this))), - blink_source_(blink_source) {} + blink_source_(*blink_source) { + DCHECK(blink_source); + DCHECK(!blink_source_.isNull()); + DVLOG(1) << "WebAudioCapturerSource::WebAudioCapturerSource()"; + blink_source_.addAudioConsumer(this); +} WebAudioCapturerSource::~WebAudioCapturerSource() { DCHECK(thread_checker_.CalledOnValidThread()); - removeFromBlinkSource(); + DVLOG(1) << "WebAudioCapturerSource::~WebAudioCapturerSource()"; + DeregisterFromBlinkSource(); } void WebAudioCapturerSource::setFormat( @@ -75,9 +81,9 @@ base::AutoLock auto_lock(lock_); track_ = NULL; } - // removeFromBlinkSource() should not be called while |lock_| is acquired, + // DeregisterFromBlinkSource() should not be called while |lock_| is acquired, // as it could result in a deadlock. - removeFromBlinkSource(); + DeregisterFromBlinkSource(); } void WebAudioCapturerSource::consumeAudio( @@ -117,15 +123,10 @@ base::TimeDelta::FromMicroseconds(frame_delay * base::Time::kMicrosecondsPerSecond / params_.sample_rate()); - track_->Capture(audio_bus, reference_time, false); + track_->Capture(audio_bus, reference_time); } -// If registered as audio consumer in |blink_source_|, deregister from -// |blink_source_| and stop keeping a reference to |blink_source_|. -// Failure to call this method when stopping the track might leave an invalid -// WebAudioCapturerSource reference still registered as an audio consumer on -// the blink side. -void WebAudioCapturerSource::removeFromBlinkSource() { +void WebAudioCapturerSource::DeregisterFromBlinkSource() { if (!blink_source_.isNull()) { blink_source_.removeAudioConsumer(this); blink_source_.reset();
diff --git a/content/renderer/media/webaudio_capturer_source.h b/content/renderer/media/webaudio_capturer_source.h index d5b3bb5..f127de3 100644 --- a/content/renderer/media/webaudio_capturer_source.h +++ b/content/renderer/media/webaudio_capturer_source.h
@@ -8,7 +8,6 @@ #include <stddef.h> #include "base/macros.h" -#include "base/memory/ref_counted.h" #include "base/synchronization/lock.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" @@ -31,12 +30,11 @@ // (channels, and sample-rate). // 2. consumeAudio() is called periodically by WebKit which dispatches the // audio stream to the WebRtcLocalAudioTrack::Capture() method. -class WebAudioCapturerSource - : public base::RefCountedThreadSafe<WebAudioCapturerSource>, - public blink::WebAudioDestinationConsumer { +class WebAudioCapturerSource : public blink::WebAudioDestinationConsumer { public: - explicit WebAudioCapturerSource( - const blink::WebMediaStreamSource& blink_source); + explicit WebAudioCapturerSource(blink::WebMediaStreamSource* blink_source); + + ~WebAudioCapturerSource() override; // WebAudioDestinationConsumer implementation. // setFormat() is called early on, so that we can configure the audio track. @@ -47,18 +45,13 @@ size_t number_of_frames) override; // Called when the WebAudioCapturerSource is hooking to a media audio track. - // |track| is the sink of the data flow. |source_provider| is the source of - // the data flow where stream information like delay, volume, key_pressed, - // is stored. + // |track| is the sink of the data flow and must remain alive until Stop() is + // called. void Start(WebRtcLocalAudioTrack* track); // Called when the media audio track is stopping. void Stop(); - protected: - friend class base::RefCountedThreadSafe<WebAudioCapturerSource>; - ~WebAudioCapturerSource() override; - private: // Called by AudioPushFifo zero or more times during the call to // consumeAudio(). Delivers audio data with the required buffer size to the @@ -66,16 +59,13 @@ void DeliverRebufferedAudio(const media::AudioBus& audio_bus, int frame_delay); - // Removes this object from a blink::WebMediaStreamSource with which it - // might be registered. The goal is to avoid dangling pointers. - void removeFromBlinkSource(); + // Deregisters this object from its blink::WebMediaStreamSource. + void DeregisterFromBlinkSource(); // Used to DCHECK that some methods are called on the correct thread. base::ThreadChecker thread_checker_; // The audio track this WebAudioCapturerSource is feeding data to. - // WebRtcLocalAudioTrack is reference counted, and owning this object. - // To avoid circular reference, a raw pointer is kept here. WebRtcLocalAudioTrack* track_; media::AudioParameters params_;
diff --git a/content/renderer/media/webrtc/media_stream_remote_audio_track.cc b/content/renderer/media/webrtc/media_stream_remote_audio_track.cc index e1b5288..d03c806 100644 --- a/content/renderer/media/webrtc/media_stream_remote_audio_track.cc +++ b/content/renderer/media/webrtc/media_stream_remote_audio_track.cc
@@ -120,7 +120,8 @@ MediaStreamRemoteAudioTrack::~MediaStreamRemoteAudioTrack() { DCHECK(main_render_thread_checker_.CalledOnValidThread()); - source()->RemoveAll(this); + // Ensure the track is stopped. + MediaStreamAudioTrack::Stop(); } void MediaStreamRemoteAudioTrack::SetEnabled(bool enabled) { @@ -139,8 +140,12 @@ source()->SetSinksEnabled(this, enabled); } -void MediaStreamRemoteAudioTrack::Stop() { +void MediaStreamRemoteAudioTrack::OnStop() { DCHECK(main_render_thread_checker_.CalledOnValidThread()); + DVLOG(1) << "MediaStreamRemoteAudioTrack::OnStop()"; + + source()->RemoveAll(this); + // Stop means that a track should be stopped permanently. But // since there is no proper way of doing that on a remote track, we can // at least disable the track. Blink will not call down to the content layer
diff --git a/content/renderer/media/webrtc/media_stream_remote_audio_track.h b/content/renderer/media/webrtc/media_stream_remote_audio_track.h index e2a6eaa..4bc85d42 100644 --- a/content/renderer/media/webrtc/media_stream_remote_audio_track.h +++ b/content/renderer/media/webrtc/media_stream_remote_audio_track.h
@@ -25,9 +25,10 @@ const blink::WebMediaStreamSource& source, bool enabled); ~MediaStreamRemoteAudioTrack() override; + // MediaStreamTrack override. void SetEnabled(bool enabled) override; - void Stop() override; + // MediaStreamAudioTrack overrides. void AddSink(MediaStreamAudioSink* sink) override; void RemoveSink(MediaStreamAudioSink* sink) override; media::AudioParameters GetOutputFormat() const override; @@ -35,6 +36,9 @@ webrtc::AudioTrackInterface* GetAudioAdapter() override; private: + // MediaStreamAudioTrack override. + void OnStop() final; + MediaStreamRemoteAudioSource* source() const; blink::WebMediaStreamSource source_; @@ -44,6 +48,7 @@ // Inheriting from ExtraData directly since MediaStreamAudioSource has // too much unrelated bloat. // TODO(tommi): MediaStreamAudioSource needs refactoring. +// TODO(miu): On it! ;-) class MediaStreamRemoteAudioSource : public blink::WebMediaStreamSource::ExtraData { public:
diff --git a/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.cc index 186618b..a268fc5 100644 --- a/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.cc
@@ -370,11 +370,8 @@ return nullptr; } -scoped_refptr<WebAudioCapturerSource> -MockPeerConnectionDependencyFactory::CreateWebAudioSource( - blink::WebMediaStreamSource* source) { - return NULL; -} +void MockPeerConnectionDependencyFactory::CreateWebAudioSource( + blink::WebMediaStreamSource* source) {} scoped_refptr<webrtc::MediaStreamInterface> MockPeerConnectionDependencyFactory::CreateLocalMediaStream( @@ -415,7 +412,7 @@ return new MockIceCandidate(sdp_mid, sdp_mline_index, sdp); } -scoped_refptr<WebRtcAudioCapturer> +scoped_ptr<WebRtcAudioCapturer> MockPeerConnectionDependencyFactory::CreateAudioCapturer( int render_frame_id, const StreamDeviceInfo& device_info, @@ -430,9 +427,4 @@ audio_source); } -void MockPeerConnectionDependencyFactory::StartLocalAudioTrack( - WebRtcLocalAudioTrack* audio_track) { - audio_track->Start(); -} - } // namespace content
diff --git a/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h b/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h index b22f096..a4ef6d16 100644 --- a/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h +++ b/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h
@@ -147,8 +147,7 @@ scoped_refptr<webrtc::VideoTrackSourceInterface> CreateVideoSource( cricket::VideoCapturer* capturer, const blink::WebMediaConstraints& constraints) override; - scoped_refptr<WebAudioCapturerSource> CreateWebAudioSource( - blink::WebMediaStreamSource* source) override; + void CreateWebAudioSource(blink::WebMediaStreamSource* source) override; scoped_refptr<webrtc::MediaStreamInterface> CreateLocalMediaStream( const std::string& label) override; scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack( @@ -166,7 +165,7 @@ int sdp_mline_index, const std::string& sdp) override; - scoped_refptr<WebRtcAudioCapturer> CreateAudioCapturer( + scoped_ptr<WebRtcAudioCapturer> CreateAudioCapturer( int render_frame_id, const StreamDeviceInfo& device_info, const blink::WebMediaConstraints& constraints, @@ -175,8 +174,6 @@ fail_to_create_next_audio_capturer_ = true; } - void StartLocalAudioTrack(WebRtcLocalAudioTrack* audio_track) override; - MockAudioSource* last_audio_source() { return last_audio_source_.get(); } private:
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc index eb49d9d..e4bef0b 100644 --- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -9,6 +9,8 @@ #include <utility> #include <vector> +#include "base/bind.h" +#include "base/bind_helpers.h" #include "base/command_line.h" #include "base/location.h" #include "base/logging.h" @@ -188,8 +190,8 @@ HarmonizeConstraintsAndEffects(&constraints, &device_info.device.input.effects); - scoped_refptr<WebRtcAudioCapturer> capturer(CreateAudioCapturer( - render_frame_id, device_info, audio_constraints, source_data)); + scoped_ptr<WebRtcAudioCapturer> capturer = CreateAudioCapturer( + render_frame_id, device_info, audio_constraints, source_data); if (!capturer.get()) { const std::string log_string = "PCDF::InitializeMediaStreamAudioSource: fails to create capturer"; @@ -201,7 +203,7 @@ // be called multiple times which is likely also a bug. return false; } - source_data->SetAudioCapturer(capturer.get()); + source_data->SetAudioCapturer(std::move(capturer)); // Creates a LocalAudioSource object which holds audio options. // TODO(xians): The option should apply to the track instead of the source. @@ -534,19 +536,17 @@ const blink::WebMediaStreamTrack& track) { blink::WebMediaStreamSource source = track.source(); DCHECK_EQ(source.getType(), blink::WebMediaStreamSource::TypeAudio); - DCHECK(!source.remote()); - MediaStreamAudioSource* source_data = - static_cast<MediaStreamAudioSource*>(source.getExtraData()); + MediaStreamAudioSource* source_data = MediaStreamAudioSource::From(source); - scoped_refptr<WebAudioCapturerSource> webaudio_source; if (!source_data) { if (source.requiresAudioConsumer()) { // We're adding a WebAudio MediaStream. // Create a specific capturer for each WebAudio consumer. - webaudio_source = CreateWebAudioSource(&source); - source_data = static_cast<MediaStreamAudioSource*>(source.getExtraData()); + CreateWebAudioSource(&source); + source_data = MediaStreamAudioSource::From(source); + DCHECK(source_data->webaudio_capturer()); } else { - NOTREACHED() << "Local track missing source extra data."; + NOTREACHED() << "Local track missing MediaStreamAudioSource instance."; return; } } @@ -561,10 +561,22 @@ // TODO(xians): Merge |source| to the capturer(). We can't do this today // because only one capturer() is supported while one |source| is created // for each audio track. - scoped_ptr<WebRtcLocalAudioTrack> audio_track(new WebRtcLocalAudioTrack( - adapter.get(), source_data->GetAudioCapturer(), webaudio_source.get())); + scoped_ptr<WebRtcLocalAudioTrack> audio_track( + new WebRtcLocalAudioTrack(adapter.get())); - StartLocalAudioTrack(audio_track.get()); + // Start the source and connect the audio data flow to the track. + // + // TODO(miu): This logic will me moved to MediaStreamAudioSource (or a + // subclass of it) in soon-upcoming changes. + audio_track->Start(base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + source_data->GetWeakPtr(), + audio_track.get())); + if (source_data->webaudio_capturer()) + source_data->webaudio_capturer()->Start(audio_track.get()); + else if (source_data->audio_capturer()) + source_data->audio_capturer()->AddTrack(audio_track.get()); + else + NOTREACHED(); // Pass the ownership of the native local audio track to the blink track. blink::WebMediaStreamTrack writable_track = track; @@ -576,48 +588,25 @@ blink::WebMediaStreamSource source = track.source(); DCHECK_EQ(source.getType(), blink::WebMediaStreamSource::TypeAudio); DCHECK(source.remote()); - DCHECK(source.getExtraData()); + DCHECK(MediaStreamAudioSource::From(source)); blink::WebMediaStreamTrack writable_track = track; writable_track.setExtraData( new MediaStreamRemoteAudioTrack(source, track.isEnabled())); } -void PeerConnectionDependencyFactory::StartLocalAudioTrack( - WebRtcLocalAudioTrack* audio_track) { - // Start the audio track. This will hook the |audio_track| to the capturer - // as the sink of the audio, and only start the source of the capturer if - // it is the first audio track connecting to the capturer. - audio_track->Start(); -} - -scoped_refptr<WebAudioCapturerSource> -PeerConnectionDependencyFactory::CreateWebAudioSource( +void PeerConnectionDependencyFactory::CreateWebAudioSource( blink::WebMediaStreamSource* source) { DVLOG(1) << "PeerConnectionDependencyFactory::CreateWebAudioSource()"; - scoped_refptr<WebAudioCapturerSource> - webaudio_capturer_source(new WebAudioCapturerSource(*source)); MediaStreamAudioSource* source_data = new MediaStreamAudioSource(); - - // Use the current default capturer for the WebAudio track so that the - // WebAudio track can pass a valid delay value and |need_audio_processing| - // flag to PeerConnection. - // TODO(xians): Remove this after moving APM to Chrome. - if (GetWebRtcAudioDevice()) { - source_data->SetAudioCapturer( - GetWebRtcAudioDevice()->GetDefaultCapturer()); - } + source_data->SetWebAudioCapturer( + make_scoped_ptr(new WebAudioCapturerSource(source))); // Create a LocalAudioSource object which holds audio options. // SetLocalAudioSource() affects core audio parts in third_party/Libjingle. source_data->SetLocalAudioSource(CreateLocalAudioSource(NULL).get()); source->setExtraData(source_data); - - // Replace the default source with WebAudio as source instead. - source->addAudioConsumer(webaudio_capturer_source.get()); - - return webaudio_capturer_source; } scoped_refptr<webrtc::VideoTrackInterface> @@ -758,7 +747,7 @@ } } -scoped_refptr<WebRtcAudioCapturer> +scoped_ptr<WebRtcAudioCapturer> PeerConnectionDependencyFactory::CreateAudioCapturer( int render_frame_id, const StreamDeviceInfo& device_info,
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.h b/content/renderer/media/webrtc/peer_connection_dependency_factory.h index 108785ba..03c3a1a5 100644 --- a/content/renderer/media/webrtc/peer_connection_dependency_factory.h +++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.h
@@ -152,9 +152,9 @@ // Creates a media::AudioCapturerSource with an implementation that is // specific for a WebAudio source. The created WebAudioCapturerSource // instance will function as audio source instead of the default - // WebRtcAudioCapturer. - virtual scoped_refptr<WebAudioCapturerSource> CreateWebAudioSource( - blink::WebMediaStreamSource* source); + // WebRtcAudioCapturer. Ownership of the new WebAudioCapturerSource is + // transferred to |source|. + virtual void CreateWebAudioSource(blink::WebMediaStreamSource* source); // Asks the PeerConnection factory to create a Local VideoTrack object with // the video source using |capturer|. @@ -169,17 +169,12 @@ // Returns a new capturer or existing capturer based on the |render_frame_id| // and |device_info|; if both are valid, it reuses existing capture if any -- // otherwise it creates a new capturer. - virtual scoped_refptr<WebRtcAudioCapturer> CreateAudioCapturer( + virtual scoped_ptr<WebRtcAudioCapturer> CreateAudioCapturer( int render_frame_id, const StreamDeviceInfo& device_info, const blink::WebMediaConstraints& constraints, MediaStreamAudioSource* audio_source); - // Adds the audio device as a sink to the audio track and starts the local - // audio track. This is virtual for test purposes since no real audio device - // exist in unit tests. - virtual void StartLocalAudioTrack(WebRtcLocalAudioTrack* audio_track); - private: // Implement base::MessageLoop::DestructionObserver. // This makes sure the libjingle PeerConnectionFactory is released before
diff --git a/content/renderer/media/webrtc/webrtc_local_audio_track_adapter.cc b/content/renderer/media/webrtc/webrtc_local_audio_track_adapter.cc index 20a3969..f169880c 100644 --- a/content/renderer/media/webrtc/webrtc_local_audio_track_adapter.cc +++ b/content/renderer/media/webrtc/webrtc_local_audio_track_adapter.cc
@@ -23,34 +23,31 @@ webrtc::AudioSourceInterface* track_source) { // TODO(tommi): Change this so that the signaling thread is one of the // parameters to this method. - scoped_refptr<base::SingleThreadTaskRunner> signaling_thread; + scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner; RenderThreadImpl* current = RenderThreadImpl::current(); if (current) { PeerConnectionDependencyFactory* pc_factory = current->GetPeerConnectionDependencyFactory(); - signaling_thread = pc_factory->GetWebRtcSignalingThread(); + signaling_task_runner = pc_factory->GetWebRtcSignalingThread(); + LOG_IF(ERROR, !signaling_task_runner) << "No signaling thread!"; + } else { + LOG(WARNING) << "Assuming single-threaded operation for unit test."; } - LOG_IF(ERROR, !signaling_thread.get()) << "No signaling thread!"; - rtc::RefCountedObject<WebRtcLocalAudioTrackAdapter>* adapter = new rtc::RefCountedObject<WebRtcLocalAudioTrackAdapter>( - label, track_source, signaling_thread); + label, track_source, std::move(signaling_task_runner)); return adapter; } WebRtcLocalAudioTrackAdapter::WebRtcLocalAudioTrackAdapter( const std::string& label, webrtc::AudioSourceInterface* track_source, - const scoped_refptr<base::SingleThreadTaskRunner>& signaling_thread) + scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner) : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(label), owner_(NULL), track_source_(track_source), - signaling_thread_(signaling_thread), - signal_level_(0) { - signaling_thread_checker_.DetachFromThread(); - capture_thread_.DetachFromThread(); -} + signaling_task_runner_(std::move(signaling_task_runner)) {} WebRtcLocalAudioTrackAdapter::~WebRtcLocalAudioTrackAdapter() { } @@ -62,14 +59,17 @@ } void WebRtcLocalAudioTrackAdapter::SetAudioProcessor( - const scoped_refptr<MediaStreamAudioProcessor>& processor) { - // SetAudioProcessor will be called when a new capture thread has been - // initialized, so we need to detach from any current capture thread we're - // checking and attach to the current one. - capture_thread_.DetachFromThread(); - DCHECK(capture_thread_.CalledOnValidThread()); - base::AutoLock auto_lock(lock_); - audio_processor_ = processor; + scoped_refptr<MediaStreamAudioProcessor> processor) { + DCHECK(processor.get()); + DCHECK(!audio_processor_); + audio_processor_ = std::move(processor); +} + +void WebRtcLocalAudioTrackAdapter::SetLevel( + scoped_refptr<MediaStreamAudioLevelCalculator::Level> level) { + DCHECK(level.get()); + DCHECK(!level_); + level_ = std::move(level); } std::string WebRtcLocalAudioTrackAdapter::kind() const { @@ -79,8 +79,9 @@ bool WebRtcLocalAudioTrackAdapter::set_enabled(bool enable) { // If we're not called on the signaling thread, we need to post a task to // change the state on the correct thread. - if (signaling_thread_.get() && !signaling_thread_->BelongsToCurrentThread()) { - signaling_thread_->PostTask(FROM_HERE, + if (signaling_task_runner_ && + !signaling_task_runner_->BelongsToCurrentThread()) { + signaling_task_runner_->PostTask(FROM_HERE, base::Bind( base::IgnoreResult(&WebRtcLocalAudioTrackAdapter::set_enabled), this, enable)); @@ -93,7 +94,8 @@ void WebRtcLocalAudioTrackAdapter::AddSink( webrtc::AudioTrackSinkInterface* sink) { - DCHECK(signaling_thread_checker_.CalledOnValidThread()); + DCHECK(!signaling_task_runner_ || + signaling_task_runner_->RunsTasksOnCurrentThread()); DCHECK(sink); #ifndef NDEBUG // Verify that |sink| has not been added. @@ -112,7 +114,8 @@ void WebRtcLocalAudioTrackAdapter::RemoveSink( webrtc::AudioTrackSinkInterface* sink) { - DCHECK(signaling_thread_checker_.CalledOnValidThread()); + DCHECK(!signaling_task_runner_ || + signaling_task_runner_->RunsTasksOnCurrentThread()); DCHECK(sink); for (ScopedVector<WebRtcAudioSinkAdapter>::iterator it = sink_adapters_.begin(); @@ -126,28 +129,32 @@ } bool WebRtcLocalAudioTrackAdapter::GetSignalLevel(int* level) { - DCHECK(signaling_thread_checker_.CalledOnValidThread()); + DCHECK(!signaling_task_runner_ || + signaling_task_runner_->RunsTasksOnCurrentThread()); - base::AutoLock auto_lock(lock_); - *level = signal_level_; + // |level_| is only set once, so it's safe to read without first acquiring a + // mutex. + if (!level_) + return false; + const float signal_level = level_->GetCurrent(); + DCHECK_GE(signal_level, 0.0f); + DCHECK_LE(signal_level, 1.0f); + // Convert from float in range [0.0,1.0] to an int in range [0,32767]. + *level = static_cast<int>(signal_level * std::numeric_limits<int16_t>::max() + + 0.5f /* rounding to nearest int */); return true; } rtc::scoped_refptr<webrtc::AudioProcessorInterface> WebRtcLocalAudioTrackAdapter::GetAudioProcessor() { - DCHECK(signaling_thread_checker_.CalledOnValidThread()); - base::AutoLock auto_lock(lock_); + DCHECK(!signaling_task_runner_ || + signaling_task_runner_->RunsTasksOnCurrentThread()); return audio_processor_.get(); } -void WebRtcLocalAudioTrackAdapter::SetSignalLevel(int signal_level) { - DCHECK(capture_thread_.CalledOnValidThread()); - base::AutoLock auto_lock(lock_); - signal_level_ = signal_level; -} - webrtc::AudioSourceInterface* WebRtcLocalAudioTrackAdapter::GetSource() const { - DCHECK(signaling_thread_checker_.CalledOnValidThread()); + DCHECK(!signaling_task_runner_ || + signaling_task_runner_->RunsTasksOnCurrentThread()); return track_source_; }
diff --git a/content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h b/content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h index cfe4a98..72b80194 100644 --- a/content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h +++ b/content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h
@@ -11,8 +11,9 @@ #include "base/memory/scoped_vector.h" #include "base/single_thread_task_runner.h" #include "base/synchronization/lock.h" -#include "base/threading/thread_checker.h" #include "content/common/content_export.h" +#include "content/renderer/media/media_stream_audio_level_calculator.h" +#include "content/renderer/media/media_stream_audio_processor.h" #include "third_party/webrtc/api/mediastreamtrack.h" #include "third_party/webrtc/media/base/audiorenderer.h" @@ -31,6 +32,10 @@ class WebRtcAudioSinkAdapter; class WebRtcLocalAudioTrack; +// Provides an implementation of the webrtc::AudioTrackInterface that can be +// bound/unbound to/from a MediaStreamAudioTrack. In other words, this is an +// adapter that sits between the media stream object graph and WebRtc's object +// graph and proxies between the two. class CONTENT_EXPORT WebRtcLocalAudioTrackAdapter : NON_EXPORTED_BASE( public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>) { @@ -42,22 +47,24 @@ WebRtcLocalAudioTrackAdapter( const std::string& label, webrtc::AudioSourceInterface* track_source, - const scoped_refptr<base::SingleThreadTaskRunner>& signaling_thread); + scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner); ~WebRtcLocalAudioTrackAdapter() override; void Initialize(WebRtcLocalAudioTrack* owner); - // Called on the audio thread by the WebRtcLocalAudioTrack to set the signal - // level of the audio data. - void SetSignalLevel(int signal_level); + // Set the object that provides shared access to the current audio signal + // level. This method may only be called once, before the audio data flow + // starts, and before any calls to GetSignalLevel() might be made. + void SetLevel(scoped_refptr<MediaStreamAudioLevelCalculator::Level> level); // Method called by the WebRtcLocalAudioTrack to set the processor that // applies signal processing on the data of the track. // This class will keep a reference of the |processor|. // Called on the main render thread. - void SetAudioProcessor( - const scoped_refptr<MediaStreamAudioProcessor>& processor); + // This method may only be called once, before the audio data flow starts, and + // before any calls to GetAudioProcessor() might be made. + void SetAudioProcessor(scoped_refptr<MediaStreamAudioProcessor> processor); // webrtc::MediaStreamTrack implementation. std::string kind() const override; @@ -80,28 +87,19 @@ rtc::scoped_refptr<webrtc::AudioSourceInterface> track_source_; // Libjingle's signaling thread. - const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; + const scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner_; // The audio processsor that applies audio processing on the data of audio - // track. + // track. This must be set before calls to GetAudioProcessor() are made. scoped_refptr<MediaStreamAudioProcessor> audio_processor_; - // A vector of WebRtc VoE channels that the capturer sends data to. - std::vector<int> voe_channels_; - // A vector of the peer connection sink adapters which receive the audio data // from the audio track. ScopedVector<WebRtcAudioSinkAdapter> sink_adapters_; - // The amplitude of the signal. - int signal_level_; - - // Thread checker for libjingle's signaling thread. - base::ThreadChecker signaling_thread_checker_; - base::ThreadChecker capture_thread_; - - // Protects |voe_channels_|, |audio_processor_| and |signal_level_|. - mutable base::Lock lock_; + // Thread-safe accessor to current audio signal level. This must be set + // before calls to GetSignalLevel() are made. + scoped_refptr<MediaStreamAudioLevelCalculator::Level> level_; }; } // namespace content
diff --git a/content/renderer/media/webrtc/webrtc_local_audio_track_adapter_unittest.cc b/content/renderer/media/webrtc/webrtc_local_audio_track_adapter_unittest.cc index 0230e064..a34937b 100644 --- a/content/renderer/media/webrtc/webrtc_local_audio_track_adapter_unittest.cc +++ b/content/renderer/media/webrtc/webrtc_local_audio_track_adapter_unittest.cc
@@ -4,7 +4,7 @@ #include <stddef.h> -#include "content/renderer/media/mock_media_constraint_factory.h" +#include "content/renderer/media/media_stream_audio_level_calculator.h" #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" #include "content/renderer/media/webrtc_audio_capturer.h" #include "content/renderer/media/webrtc_local_audio_track.h" @@ -38,11 +38,7 @@ : params_(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, media::CHANNEL_LAYOUT_STEREO, 48000, 16, 480), adapter_(WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)) { - MockMediaConstraintFactory constraint_factory; - capturer_ = WebRtcAudioCapturer::CreateCapturer( - -1, StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, "", ""), - constraint_factory.CreateWebMediaConstraints(), NULL, NULL); - track_.reset(new WebRtcLocalAudioTrack(adapter_.get(), capturer_, NULL)); + track_.reset(new WebRtcLocalAudioTrack(adapter_.get())); } protected: @@ -53,7 +49,6 @@ media::AudioParameters params_; scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_; - scoped_refptr<WebRtcAudioCapturer> capturer_; scoped_ptr<WebRtcLocalAudioTrack> track_; }; @@ -79,7 +74,7 @@ EXPECT_CALL(*sink, OnData(_, 16, params_.sample_rate(), params_.channels(), params_.frames_per_buffer())); - track_->Capture(*audio_bus, estimated_capture_time, false); + track_->Capture(*audio_bus, estimated_capture_time); // Remove the sink from the webrtc track. webrtc_track->RemoveSink(sink.get()); @@ -89,14 +84,19 @@ estimated_capture_time += params_.frames_per_buffer() * base::TimeDelta::FromSeconds(1) / params_.sample_rate(); - track_->Capture(*audio_bus, estimated_capture_time, false); + track_->Capture(*audio_bus, estimated_capture_time); } TEST_F(WebRtcLocalAudioTrackAdapterTest, GetSignalLevel) { webrtc::AudioTrackInterface* webrtc_track = static_cast<webrtc::AudioTrackInterface*>(adapter_.get()); - int signal_level = 0; + int signal_level = -1; + EXPECT_FALSE(webrtc_track->GetSignalLevel(&signal_level)); + MediaStreamAudioLevelCalculator calculator; + adapter_->SetLevel(calculator.level()); + signal_level = -1; EXPECT_TRUE(webrtc_track->GetSignalLevel(&signal_level)); + EXPECT_EQ(0, signal_level); } } // namespace content
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc b/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc index a89530a..3c34d79 100644 --- a/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc +++ b/content/renderer/media/webrtc/webrtc_media_stream_adapter.cc
@@ -78,7 +78,7 @@ DCHECK_EQ(track.source().getType(), blink::WebMediaStreamSource::TypeAudio); // A media stream is connected to a peer connection, enable the // peer connection mode for the sources. - MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::GetTrack(track); + MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(track); if (!native_track) { DLOG(ERROR) << "No native track for blink audio track."; return; @@ -92,10 +92,9 @@ if (native_track->is_local_track()) { const blink::WebMediaStreamSource& source = track.source(); - MediaStreamAudioSource* audio_source = - static_cast<MediaStreamAudioSource*>(source.getExtraData()); - if (audio_source && audio_source->GetAudioCapturer().get()) - audio_source->GetAudioCapturer()->EnablePeerConnectionMode(); + MediaStreamAudioSource* audio_source = MediaStreamAudioSource::From(source); + if (audio_source && audio_source->audio_capturer()) + audio_source->audio_capturer()->EnablePeerConnectionMode(); } webrtc_media_stream_->AddTrack(audio_track);
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_adapter_unittest.cc b/content/renderer/media/webrtc/webrtc_media_stream_adapter_unittest.cc index d23cfa9..26546f4f 100644 --- a/content/renderer/media/webrtc/webrtc_media_stream_adapter_unittest.cc +++ b/content/renderer/media/webrtc/webrtc_media_stream_adapter_unittest.cc
@@ -11,7 +11,6 @@ #include "content/renderer/media/media_stream_audio_source.h" #include "content/renderer/media/media_stream_video_source.h" #include "content/renderer/media/media_stream_video_track.h" -#include "content/renderer/media/mock_media_constraint_factory.h" #include "content/renderer/media/mock_media_stream_video_source.h" #include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h" #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" @@ -50,19 +49,11 @@ audio_source.setExtraData(new MediaStreamAudioSource()); audio_track_vector[0].initialize(audio_source); - StreamDeviceInfo device_info(MEDIA_DEVICE_AUDIO_CAPTURE, "Mock device", - "mock_device_id"); - MockMediaConstraintFactory constraint_factory; - const blink::WebMediaConstraints constraints = - constraint_factory.CreateWebMediaConstraints(); - scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer(-1, device_info, constraints, - nullptr, nullptr)); scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create( audio_track_vector[0].id().utf8(), nullptr)); scoped_ptr<WebRtcLocalAudioTrack> native_track( - new WebRtcLocalAudioTrack(adapter.get(), capturer, nullptr)); + new WebRtcLocalAudioTrack(adapter.get())); audio_track_vector[0].setExtraData(native_track.release()); }
diff --git a/content/renderer/media/webrtc_audio_capturer.cc b/content/renderer/media/webrtc_audio_capturer.cc index 9c56be0b..9337756 100644 --- a/content/renderer/media/webrtc_audio_capturer.cc +++ b/content/renderer/media/webrtc_audio_capturer.cc
@@ -24,29 +24,6 @@ namespace content { -namespace { - -// Audio buffer sizes are specified in milliseconds. -const char kAudioLatency[] = "latencyMs"; -const int kMinAudioLatencyMs = 0; -const int kMaxAudioLatencyMs = 10000; - -// Method to check if any of the data in |audio_source| has energy. -bool HasDataEnergy(const media::AudioBus& audio_source) { - for (int ch = 0; ch < audio_source.channels(); ++ch) { - const float* channel_ptr = audio_source.channel(ch); - for (int frame = 0; frame < audio_source.frames(); ++frame) { - if (channel_ptr[frame] != 0) - return true; - } - } - - // All the data is zero. - return false; -} - -} // namespace - // Reference counted container of WebRtcLocalAudioTrack delegate. // TODO(xians): Switch to MediaStreamAudioSinkOwner. class WebRtcAudioCapturer::TrackOwner @@ -56,13 +33,10 @@ : delegate_(track) {} void Capture(const media::AudioBus& audio_bus, - base::TimeTicks estimated_capture_time, - bool force_report_nonzero_energy) { + base::TimeTicks estimated_capture_time) { base::AutoLock lock(lock_); if (delegate_) { - delegate_->Capture(audio_bus, - estimated_capture_time, - force_report_nonzero_energy); + delegate_->Capture(audio_bus, estimated_capture_time); } } @@ -72,13 +46,6 @@ delegate_->OnSetFormat(params); } - void SetAudioProcessor( - const scoped_refptr<MediaStreamAudioProcessor>& processor) { - base::AutoLock lock(lock_); - if (delegate_) - delegate_->SetAudioProcessor(processor); - } - void Reset() { base::AutoLock lock(lock_); delegate_ = NULL; @@ -124,14 +91,14 @@ }; // static -scoped_refptr<WebRtcAudioCapturer> WebRtcAudioCapturer::CreateCapturer( +scoped_ptr<WebRtcAudioCapturer> WebRtcAudioCapturer::CreateCapturer( int render_frame_id, const StreamDeviceInfo& device_info, const blink::WebMediaConstraints& constraints, WebRtcAudioDeviceImpl* audio_device, MediaStreamAudioSource* audio_source) { - scoped_refptr<WebRtcAudioCapturer> capturer = new WebRtcAudioCapturer( - render_frame_id, device_info, constraints, audio_device, audio_source); + scoped_ptr<WebRtcAudioCapturer> capturer(new WebRtcAudioCapturer( + render_frame_id, device_info, constraints, audio_device, audio_source)); if (capturer->Initialize()) return capturer; @@ -206,27 +173,10 @@ device_info_.device.input.sample_rate); } - // Initialize the buffer size to zero, which means it wasn't specified. - // If it is out of range, we return it to zero. - int buffer_size_ms = 0; - int buffer_size_samples = 0; - GetConstraintValueAsInteger(constraints_, kAudioLatency, &buffer_size_ms); - if (buffer_size_ms < kMinAudioLatencyMs || - buffer_size_ms > kMaxAudioLatencyMs) { - DVLOG(1) << "Ignoring out of range buffer size " << buffer_size_ms; - } else { - buffer_size_samples = - device_info_.device.input.sample_rate * buffer_size_ms / 1000; - } - DVLOG_IF(1, buffer_size_samples > 0) - << "Custom audio buffer size: " << buffer_size_samples << " samples"; - // Create and configure the default audio capturing source. SetCapturerSourceInternal( - AudioDeviceFactory::NewInputDevice(render_frame_id_), - channel_layout, - device_info_.device.input.sample_rate, - buffer_size_samples); + AudioDeviceFactory::NewInputDevice(render_frame_id_), channel_layout, + device_info_.device.input.sample_rate); // Add the capturer to the WebRtcAudioDeviceImpl since it needs some hardware // information from the capturer. @@ -265,9 +215,18 @@ } void WebRtcAudioCapturer::AddTrack(WebRtcLocalAudioTrack* track) { + DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(track); DVLOG(1) << "WebRtcAudioCapturer::AddTrack()"; + track->SetLevel(level_calculator_.level()); + + // The track only grabs stats from the audio processor. Stats are only + // available if audio processing is turned on. Therefore, only provide the + // track a reference if audio processing is turned on. + if (audio_processor_->has_audio_processing()) + track->SetAudioProcessor(audio_processor_); + { base::AutoLock auto_lock(lock_); // Verify that |track| is not already added to the list. @@ -311,8 +270,7 @@ void WebRtcAudioCapturer::SetCapturerSourceInternal( const scoped_refptr<media::AudioCapturerSource>& source, media::ChannelLayout channel_layout, - int sample_rate, - int buffer_size) { + int sample_rate) { DCHECK(thread_checker_.CalledOnValidThread()); DVLOG(1) << "SetCapturerSource(channel_layout=" << channel_layout << "," << "sample_rate=" << sample_rate << ")"; @@ -333,23 +291,25 @@ if (old_source.get()) old_source->Stop(); - // If the buffer size is zero, it has not been specified. - // We either default to 10ms, or use the hardware buffer size. - if (buffer_size == 0) - buffer_size = GetBufferSize(sample_rate); - // Dispatch the new parameters both to the sink(s) and to the new source, // also apply the new |constraints|. // The idea is to get rid of any dependency of the microphone parameters // which would normally be used by default. // bits_per_sample is always 16 for now. media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, - channel_layout, sample_rate, 16, buffer_size); + channel_layout, sample_rate, 16, + GetBufferSize(sample_rate)); params.set_effects(device_info_.device.input.effects); + DCHECK(params.IsValid()); { base::AutoLock auto_lock(lock_); - // Notify the |audio_processor_| of the new format. + + // Notify the |audio_processor_| of the new format. We're doing this while + // the lock is held only because the signaling thread might be calling + // GetInputFormat(). Simultaneous reads from the audio thread are NOT the + // concern here since the source is currently stopped (i.e., no audio + // capture calls can be executing). audio_processor_->OnCaptureFormatChanged(params); // Notify all tracks about the new format. @@ -357,7 +317,7 @@ } if (source.get()) - source->Initialize(params, this, session_id()); + source->Initialize(params, this, device_info_.session_id); Start(); } @@ -393,8 +353,7 @@ // WebRtc native buffer size. SetCapturerSourceInternal(AudioDeviceFactory::NewInputDevice(render_frame_id), input_params.channel_layout(), - input_params.sample_rate(), - 0); + input_params.sample_rate()); } void WebRtcAudioCapturer::Start() { @@ -507,26 +466,28 @@ tracks_.RetrieveAndClearTags(&tracks_to_notify_format); } + // Sanity-check the input audio format in debug builds. Then, notify the + // tracks if the format has changed. + // + // Locking is not needed here to read the audio input/output parameters + // because the audio processor format changes only occur while audio capture + // is stopped. DCHECK(audio_processor_->InputFormat().IsValid()); DCHECK_EQ(audio_source->channels(), audio_processor_->InputFormat().channels()); DCHECK_EQ(audio_source->frames(), audio_processor_->InputFormat().frames_per_buffer()); - - // Notify the tracks on when the format changes. This will do nothing if - // |tracks_to_notify_format| is empty. - const media::AudioParameters& output_params = - audio_processor_->OutputFormat(); - for (const auto& track : tracks_to_notify_format) { - track->OnSetFormat(output_params); - track->SetAudioProcessor(audio_processor_); + if (!tracks_to_notify_format.empty()) { + const media::AudioParameters& output_params = + audio_processor_->OutputFormat(); + for (const auto& track : tracks_to_notify_format) + track->OnSetFormat(output_params); } - // Figure out if the pre-processed data has any energy or not, the - // information will be passed to the track to force the calculator - // to report energy in case the post-processed data is zeroed by the audio - // processing. - const bool force_report_nonzero_energy = HasDataEnergy(*audio_source); + // Figure out if the pre-processed data has any energy or not. This + // information will be passed to the level calculator to force it to report + // energy in case the post-processed data is zeroed by the audio processing. + const bool force_report_nonzero_energy = !audio_source->AreFramesZero(); // Push the data to the processor for processing. audio_processor_->PushCaptureData( @@ -542,13 +503,13 @@ current_volume, key_pressed, &processed_data, &processed_data_audio_delay, &new_volume)) { DCHECK(processed_data); + + level_calculator_.Calculate(*processed_data, force_report_nonzero_energy); + const base::TimeTicks processed_data_capture_time = reference_clock_snapshot - processed_data_audio_delay; - for (const auto& track : tracks) { - track->Capture(*processed_data, - processed_data_capture_time, - force_report_nonzero_energy); - } + for (const auto& track : tracks) + track->Capture(*processed_data, processed_data_capture_time); if (new_volume) { SetVolume(new_volume); @@ -563,28 +524,9 @@ WebRtcLogMessage("WAC::OnCaptureError: " + message); } -media::AudioParameters WebRtcAudioCapturer::source_audio_parameters() const { +media::AudioParameters WebRtcAudioCapturer::GetInputFormat() const { base::AutoLock auto_lock(lock_); - return audio_processor_.get() ? audio_processor_->InputFormat() - : media::AudioParameters(); -} - -bool WebRtcAudioCapturer::GetPairedOutputParameters( - int* session_id, - int* output_sample_rate, - int* output_frames_per_buffer) const { - // Don't set output parameters unless all of them are valid. - if (device_info_.session_id <= 0 || - !device_info_.device.matched_output.sample_rate || - !device_info_.device.matched_output.frames_per_buffer) - return false; - - *session_id = device_info_.session_id; - *output_sample_rate = device_info_.device.matched_output.sample_rate; - *output_frames_per_buffer = - device_info_.device.matched_output.frames_per_buffer; - - return true; + return audio_processor_->InputFormat(); } int WebRtcAudioCapturer::GetBufferSize(int sample_rate) const { @@ -617,10 +559,8 @@ const scoped_refptr<media::AudioCapturerSource>& source, media::AudioParameters params) { // Create a new audio stream as source which uses the new source. - SetCapturerSourceInternal(source, - params.channel_layout(), - params.sample_rate(), - 0); + SetCapturerSourceInternal(source, params.channel_layout(), + params.sample_rate()); } } // namespace content
diff --git a/content/renderer/media/webrtc_audio_capturer.h b/content/renderer/media/webrtc_audio_capturer.h index afa5f9e..546c315 100644 --- a/content/renderer/media/webrtc_audio_capturer.h +++ b/content/renderer/media/webrtc_audio_capturer.h
@@ -12,10 +12,12 @@ #include "base/files/file.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" #include "base/synchronization/lock.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "content/common/media/media_stream_options.h" +#include "content/renderer/media/media_stream_audio_level_calculator.h" #include "content/renderer/media/tagged_list.h" #include "media/audio/audio_input_device.h" #include "media/base/audio_capturer_source.h" @@ -41,8 +43,7 @@ // thread or on the main render thread but also other client threads // if an alternative AudioCapturerSource has been set. class CONTENT_EXPORT WebRtcAudioCapturer - : public base::RefCountedThreadSafe<WebRtcAudioCapturer>, - NON_EXPORTED_BASE(public media::AudioCapturerSource::CaptureCallback) { + : NON_EXPORTED_BASE(public media::AudioCapturerSource::CaptureCallback) { public: // Used to construct the audio capturer. |render_frame_id| specifies the // RenderFrame consuming audio for capture; -1 is used for tests. @@ -50,13 +51,15 @@ // created for. |constraints| contains the settings for audio processing. // TODO(xians): Implement the interface for the audio source and move the // |constraints| to ApplyConstraints(). Called on the main render thread. - static scoped_refptr<WebRtcAudioCapturer> CreateCapturer( + static scoped_ptr<WebRtcAudioCapturer> CreateCapturer( int render_frame_id, const StreamDeviceInfo& device_info, const blink::WebMediaConstraints& constraints, WebRtcAudioDeviceImpl* audio_device, MediaStreamAudioSource* audio_source); + ~WebRtcAudioCapturer() override; + // Add a audio track to the sinks of the capturer. // WebRtcAudioDeviceImpl calls this method on the main render thread but // other clients may call it from other threads. The current implementation @@ -84,16 +87,9 @@ // Audio parameters utilized by the source of the audio capturer. // TODO(phoglund): Think over the implications of this accessor and if we can // remove it. - media::AudioParameters source_audio_parameters() const; + media::AudioParameters GetInputFormat() const; - // Gets information about the paired output device. Returns true if such a - // device exists. - bool GetPairedOutputParameters(int* session_id, - int* output_sample_rate, - int* output_frames_per_buffer) const; - - const std::string& device_id() const { return device_info_.device.id; } - int session_id() const { return device_info_.session_id; } + const StreamDeviceInfo& device_info() const { return device_info_; } // Stops recording audio. This method will empty its track lists since // stopping the capturer will implicitly invalidate all its tracks. @@ -110,10 +106,6 @@ const scoped_refptr<media::AudioCapturerSource>& source, media::AudioParameters params); - protected: - friend class base::RefCountedThreadSafe<WebRtcAudioCapturer>; - ~WebRtcAudioCapturer() override; - private: class TrackOwner; typedef TaggedList<TrackOwner> TrackList; @@ -144,8 +136,7 @@ void SetCapturerSourceInternal( const scoped_refptr<media::AudioCapturerSource>& source, media::ChannelLayout channel_layout, - int sample_rate, - int buffer_size); + int sample_rate); // Starts recording audio. // Triggered by AddSink() on the main render thread or a Libjingle working @@ -176,7 +167,7 @@ // Audio processor doing processing like FIFO, AGC, AEC and NS. Its output // data is in a unit of 10 ms data chunk. - scoped_refptr<MediaStreamAudioProcessor> audio_processor_; + const scoped_refptr<MediaStreamAudioProcessor> audio_processor_; bool running_; @@ -205,6 +196,9 @@ // WebRtcAudioCapturer. MediaStreamAudioSource* const audio_source_; + // Used to calculate the signal level that shows in the UI. + MediaStreamAudioLevelCalculator level_calculator_; + DISALLOW_COPY_AND_ASSIGN(WebRtcAudioCapturer); };
diff --git a/content/renderer/media/webrtc_audio_capturer_unittest.cc b/content/renderer/media/webrtc_audio_capturer_unittest.cc index a93aede..3abd3cd 100644 --- a/content/renderer/media/webrtc_audio_capturer_unittest.cc +++ b/content/renderer/media/webrtc_audio_capturer_unittest.cc
@@ -76,25 +76,28 @@ void VerifyAudioParams(const blink::WebMediaConstraints& constraints, bool need_audio_processing) { - capturer_ = WebRtcAudioCapturer::CreateCapturer( - -1, StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, "", "", - params_.sample_rate(), params_.channel_layout(), - params_.frames_per_buffer()), - constraints, NULL, NULL); - capturer_source_ = new MockCapturerSource(); - EXPECT_CALL(*capturer_source_.get(), Initialize(_, capturer_.get(), -1)); - EXPECT_CALL(*capturer_source_.get(), SetAutomaticGainControl(true)); - EXPECT_CALL(*capturer_source_.get(), Start()); - capturer_->SetCapturerSource(capturer_source_, params_); + const scoped_ptr<WebRtcAudioCapturer> capturer = + WebRtcAudioCapturer::CreateCapturer( + -1, StreamDeviceInfo( + MEDIA_DEVICE_AUDIO_CAPTURE, "", "", params_.sample_rate(), + params_.channel_layout(), params_.frames_per_buffer()), + constraints, nullptr, nullptr); + const scoped_refptr<MockCapturerSource> capturer_source( + new MockCapturerSource()); + EXPECT_CALL(*capturer_source.get(), Initialize(_, capturer.get(), -1)); + EXPECT_CALL(*capturer_source.get(), SetAutomaticGainControl(true)); + EXPECT_CALL(*capturer_source.get(), Start()); + capturer->SetCapturerSource(capturer_source, params_); scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); - track_.reset(new WebRtcLocalAudioTrack(adapter.get(), capturer_, NULL)); - track_->Start(); + const scoped_ptr<WebRtcLocalAudioTrack> track( + new WebRtcLocalAudioTrack(adapter.get())); + capturer->AddTrack(track.get()); // Connect a mock sink to the track. scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink()); - track_->AddSink(sink.get()); + track->AddSink(sink.get()); int delay_ms = 65; bool key_pressed = true; @@ -105,22 +108,19 @@ media::AudioCapturerSource::CaptureCallback* callback = static_cast<media::AudioCapturerSource::CaptureCallback*>( - capturer_.get()); + capturer.get()); // Verify the sink is getting the correct values. EXPECT_CALL(*sink, FormatIsSet()); EXPECT_CALL(*sink, OnDataCallback()).Times(AtLeast(1)); callback->Capture(audio_bus.get(), delay_ms, volume, key_pressed); - track_->RemoveSink(sink.get()); - EXPECT_CALL(*capturer_source_.get(), Stop()); - capturer_->Stop(); + track->RemoveSink(sink.get()); + EXPECT_CALL(*capturer_source.get(), Stop()); + capturer->Stop(); } media::AudioParameters params_; - scoped_refptr<MockCapturerSource> capturer_source_; - scoped_refptr<WebRtcAudioCapturer> capturer_; - scoped_ptr<WebRtcLocalAudioTrack> track_; }; TEST_F(WebRtcAudioCapturerTest, VerifyAudioParamsWithAudioProcessing) { @@ -137,12 +137,11 @@ // Set a non-audio constraint. constraint_factory.basic().width.setExact(240); - scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer( - 0, StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, "", "", - params_.sample_rate(), params_.channel_layout(), - params_.frames_per_buffer()), - constraint_factory.CreateWebMediaConstraints(), NULL, NULL)); + scoped_ptr<WebRtcAudioCapturer> capturer(WebRtcAudioCapturer::CreateCapturer( + 0, StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, "", "", + params_.sample_rate(), params_.channel_layout(), + params_.frames_per_buffer()), + constraint_factory.CreateWebMediaConstraints(), NULL, NULL)); EXPECT_TRUE(capturer.get() == NULL); }
diff --git a/content/renderer/media/webrtc_audio_device_impl.cc b/content/renderer/media/webrtc_audio_device_impl.cc index b5dc500..17a0585 100644 --- a/content/renderer/media/webrtc_audio_device_impl.cc +++ b/content/renderer/media/webrtc_audio_device_impl.cc
@@ -170,15 +170,9 @@ DCHECK(!renderer_.get() || !renderer_->IsStarted()) << "The shared audio renderer shouldn't be running"; - // Stop all the capturers to ensure no further OnData() and - // RemoveAudioCapturer() callback. - // Cache the capturers in a local list since WebRtcAudioCapturer::Stop() - // will trigger RemoveAudioCapturer() callback. - CapturerList capturers; - capturers.swap(capturers_); - for (CapturerList::const_iterator iter = capturers.begin(); - iter != capturers.end(); ++iter) { - (*iter)->Stop(); + { + base::AutoLock auto_lock(lock_); + capturers_.clear(); } initialized_ = false; @@ -294,11 +288,10 @@ // Only one microphone is supported at the moment, which is represented by // the default capturer. - scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer()); - if (!capturer.get()) + base::AutoLock auto_lock(lock_); + if (capturers_.empty()) return -1; - - capturer->SetVolume(volume); + capturers_.back()->SetVolume(volume); return 0; } @@ -309,12 +302,10 @@ // We only support one microphone now, which is accessed via the default // capturer. DCHECK(initialized_); - scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer()); - if (!capturer.get()) + base::AutoLock auto_lock(lock_); + if (capturers_.empty()) return -1; - - *volume = static_cast<uint32_t>(capturer->Volume()); - + *volume = static_cast<uint32_t>(capturers_.back()->Volume()); return 0; } @@ -352,11 +343,10 @@ // TODO(xians): These kind of hardware methods do not make much sense since we // support multiple sources. Remove or figure out new APIs for such methods. - scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer()); - if (!capturer.get()) + base::AutoLock auto_lock(lock_); + if (capturers_.empty()) return -1; - - *available = (capturer->source_audio_parameters().channels() == 2); + *available = (capturers_.back()->GetInputFormat().channels() == 2); return 0; } @@ -380,12 +370,11 @@ uint32_t* sample_rate) const { DCHECK(signaling_thread_checker_.CalledOnValidThread()); // We use the default capturer as the recording sample rate. - scoped_refptr<WebRtcAudioCapturer> capturer(GetDefaultCapturer()); - if (!capturer.get()) + base::AutoLock auto_lock(lock_); + if (capturers_.empty()) return -1; - - *sample_rate = static_cast<uint32_t>( - capturer->source_audio_parameters().sample_rate()); + const media::AudioParameters& params = capturers_.back()->GetInputFormat(); + *sample_rate = static_cast<uint32_t>(params.sample_rate()); return 0; } @@ -433,12 +422,11 @@ return true; } -void WebRtcAudioDeviceImpl::AddAudioCapturer( - const scoped_refptr<WebRtcAudioCapturer>& capturer) { +void WebRtcAudioDeviceImpl::AddAudioCapturer(WebRtcAudioCapturer* capturer) { DCHECK(main_thread_checker_.CalledOnValidThread()); DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()"; - DCHECK(capturer.get()); - DCHECK(!capturer->device_id().empty()); + DCHECK(capturer); + DCHECK(!capturer->device_info().device.id.empty()); base::AutoLock auto_lock(lock_); DCHECK(std::find(capturers_.begin(), capturers_.end(), capturer) == @@ -446,29 +434,14 @@ capturers_.push_back(capturer); } -void WebRtcAudioDeviceImpl::RemoveAudioCapturer( - const scoped_refptr<WebRtcAudioCapturer>& capturer) { +void WebRtcAudioDeviceImpl::RemoveAudioCapturer(WebRtcAudioCapturer* capturer) { DCHECK(main_thread_checker_.CalledOnValidThread()); - DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()"; - DCHECK(capturer.get()); + DVLOG(1) << "WebRtcAudioDeviceImpl::RemoveAudioCapturer()"; + DCHECK(capturer); base::AutoLock auto_lock(lock_); capturers_.remove(capturer); } -scoped_refptr<WebRtcAudioCapturer> -WebRtcAudioDeviceImpl::GetDefaultCapturer() const { - // Called on the signaling thread (during initialization), worker - // thread during capture or main thread for a WebAudio source. - // We can't DCHECK on those three checks here since GetDefaultCapturer - // may be the first call and therefore could incorrectly initialize the - // thread checkers. - DCHECK(initialized_); - base::AutoLock auto_lock(lock_); - // Use the last |capturer| which is from the latest getUserMedia call as - // the default capture device. - return capturers_.empty() ? NULL : capturers_.back(); -} - void WebRtcAudioDeviceImpl::AddPlayoutSink( WebRtcPlayoutDataSource::Sink* sink) { DCHECK(main_thread_checker_.CalledOnValidThread()); @@ -498,8 +471,20 @@ if (capturers_.size() != 1) return false; - return capturers_.back()->GetPairedOutputParameters( - session_id, output_sample_rate, output_frames_per_buffer); + // Don't set output parameters unless all of them are valid. + const StreamDeviceInfo& device_info = capturers_.back()->device_info(); + if (device_info.session_id <= 0 || + !device_info.device.matched_output.sample_rate || + !device_info.device.matched_output.frames_per_buffer) { + return false; + } + + *session_id = device_info.session_id; + *output_sample_rate = device_info.device.matched_output.sample_rate; + *output_frames_per_buffer = + device_info.device.matched_output.frames_per_buffer; + + return true; } } // namespace content
diff --git a/content/renderer/media/webrtc_audio_device_impl.h b/content/renderer/media/webrtc_audio_device_impl.h index a3bbf6b..de92afe4d 100644 --- a/content/renderer/media/webrtc_audio_device_impl.h +++ b/content/renderer/media/webrtc_audio_device_impl.h
@@ -7,6 +7,7 @@ #include <stdint.h> +#include <list> #include <string> #include <vector> @@ -306,15 +307,12 @@ // Called on the main renderer thread. bool SetAudioRenderer(WebRtcAudioRenderer* renderer); - // Adds/Removes the capturer to the ADM. + // Adds/Removes the |capturer| to the ADM. Does NOT take ownership. + // Capturers must remain valid until RemoveAudioCapturer() is called. // TODO(xians): Remove these two methods once the ADM does not need to pass // hardware information up to WebRtc. - void AddAudioCapturer(const scoped_refptr<WebRtcAudioCapturer>& capturer); - void RemoveAudioCapturer(const scoped_refptr<WebRtcAudioCapturer>& capturer); - - // Gets the default capturer, which is the last capturer in |capturers_|. - // The method can be called by both Libjingle thread and main render thread. - scoped_refptr<WebRtcAudioCapturer> GetDefaultCapturer() const; + void AddAudioCapturer(WebRtcAudioCapturer* capturer); + void RemoveAudioCapturer(WebRtcAudioCapturer* capturer); // Gets paired device information of the capture device for the audio // renderer. This is used to pass on a session id, sample rate and buffer @@ -331,7 +329,7 @@ } private: - typedef std::list<scoped_refptr<WebRtcAudioCapturer> > CapturerList; + typedef std::list<WebRtcAudioCapturer*> CapturerList; typedef std::list<WebRtcPlayoutDataSource::Sink*> PlayoutDataSinkList; class RenderBuffer; @@ -364,7 +362,9 @@ mutable int ref_count_; // List of captures which provides access to the native audio input layer - // in the browser process. + // in the browser process. The last capturer in this list is considered the + // "default capturer" by the methods implementing the + // webrtc::AudioDeviceModule interface. CapturerList capturers_; // Provides access to the audio renderer in the browser process.
diff --git a/content/renderer/media/webrtc_audio_renderer.cc b/content/renderer/media/webrtc_audio_renderer.cc index 8deb7b5..39d71b48 100644 --- a/content/renderer/media/webrtc_audio_renderer.cc +++ b/content/renderer/media/webrtc_audio_renderer.cc
@@ -601,7 +601,7 @@ media_stream.audioTracks(web_tracks); for (const blink::WebMediaStreamTrack& web_track : web_tracks) { - MediaStreamAudioTrack* track = MediaStreamAudioTrack::GetTrack(web_track); + MediaStreamAudioTrack* track = MediaStreamAudioTrack::From(web_track); // WebRtcAudioRenderer can only render audio tracks received from a remote // peer. Since the actual MediaStream is mutable from JavaScript, we need // to make sure |web_track| is actually a remote track.
diff --git a/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc b/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc index 28acddd..df0c6e8 100644 --- a/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc +++ b/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc
@@ -5,16 +5,14 @@ #include <stddef.h> #include "base/logging.h" -#include "base/strings/utf_string_conversions.h" -#include "content/renderer/media/mock_media_constraint_factory.h" #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" -#include "content/renderer/media/webrtc_audio_capturer.h" #include "content/renderer/media/webrtc_local_audio_source_provider.h" #include "content/renderer/media/webrtc_local_audio_track.h" #include "media/audio/audio_parameters.h" #include "media/base/audio_bus.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" +#include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/web/WebHeap.h" namespace content { @@ -29,19 +27,14 @@ media::CHANNEL_LAYOUT_STEREO, 44100, 16, WebRtcLocalAudioSourceProvider::kWebAudioRenderBufferSize); sink_bus_ = media::AudioBus::Create(sink_params_); - MockMediaConstraintFactory constraint_factory; - scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer( - -1, StreamDeviceInfo(), - constraint_factory.CreateWebMediaConstraints(), NULL, NULL)); scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> native_track( - new WebRtcLocalAudioTrack(adapter.get(), capturer, NULL)); + new WebRtcLocalAudioTrack(adapter.get())); blink::WebMediaStreamSource audio_source; - audio_source.initialize(base::UTF8ToUTF16("dummy_source_id"), + audio_source.initialize(blink::WebString::fromUTF8("dummy_source_id"), blink::WebMediaStreamSource::TypeAudio, - base::UTF8ToUTF16("dummy_source_name"), + blink::WebString::fromUTF8("dummy_source_name"), false /* remote */, true /* readonly */); blink_track_.initialize(blink::WebString::fromUTF8("audio_track"), audio_source);
diff --git a/content/renderer/media/webrtc_local_audio_track.cc b/content/renderer/media/webrtc_local_audio_track.cc index cb48668e..53c55b2 100644 --- a/content/renderer/media/webrtc_local_audio_track.cc +++ b/content/renderer/media/webrtc_local_audio_track.cc
@@ -13,78 +13,49 @@ #include "content/renderer/media/media_stream_audio_processor.h" #include "content/renderer/media/media_stream_audio_sink_owner.h" #include "content/renderer/media/media_stream_audio_track_sink.h" -#include "content/renderer/media/webaudio_capturer_source.h" #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" -#include "content/renderer/media/webrtc_audio_capturer.h" namespace content { WebRtcLocalAudioTrack::WebRtcLocalAudioTrack( - WebRtcLocalAudioTrackAdapter* adapter, - const scoped_refptr<WebRtcAudioCapturer>& capturer, - WebAudioCapturerSource* webaudio_source) - : MediaStreamAudioTrack(true), - adapter_(adapter), - capturer_(capturer), - webaudio_source_(webaudio_source) { - DCHECK(capturer.get() || webaudio_source); + scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter) + : MediaStreamAudioTrack(true), adapter_(std::move(adapter)) { signal_thread_checker_.DetachFromThread(); + DVLOG(1) << "WebRtcLocalAudioTrack::WebRtcLocalAudioTrack()"; adapter_->Initialize(this); - - DVLOG(1) << "WebRtcLocalAudioTrack::WebRtcLocalAudioTrack()"; } WebRtcLocalAudioTrack::~WebRtcLocalAudioTrack() { DCHECK(main_render_thread_checker_.CalledOnValidThread()); DVLOG(1) << "WebRtcLocalAudioTrack::~WebRtcLocalAudioTrack()"; - // Users might not call Stop() on the track. - Stop(); + // Ensure the track is stopped. + MediaStreamAudioTrack::Stop(); } media::AudioParameters WebRtcLocalAudioTrack::GetOutputFormat() const { DCHECK(main_render_thread_checker_.CalledOnValidThread()); - if (webaudio_source_.get()) { - return media::AudioParameters(); - } else { - return capturer_->GetOutputFormat(); - } + base::AutoLock auto_lock(lock_); + return audio_parameters_; } void WebRtcLocalAudioTrack::Capture(const media::AudioBus& audio_bus, - base::TimeTicks estimated_capture_time, - bool force_report_nonzero_energy) { + base::TimeTicks estimated_capture_time) { DCHECK(capture_thread_checker_.CalledOnValidThread()); DCHECK(!estimated_capture_time.is_null()); - // Calculate the signal level regardless of whether the track is disabled or - // enabled. If |force_report_nonzero_energy| is true, |audio_bus| contains - // post-processed data that may be all zeros even though the signal contained - // energy before the processing. In this case, report nonzero energy even if - // the energy of the data in |audio_bus| is zero. - const float minimum_signal_level = - force_report_nonzero_energy ? 1.0f / std::numeric_limits<int16_t>::max() - : 0.0f; - const float signal_level = std::max( - minimum_signal_level, - std::min(1.0f, level_calculator_->Calculate(audio_bus))); - const int signal_level_as_pcm16 = - static_cast<int>(signal_level * std::numeric_limits<int16_t>::max() + - 0.5f /* rounding to nearest int */); - adapter_->SetSignalLevel(signal_level_as_pcm16); - - scoped_refptr<WebRtcAudioCapturer> capturer; SinkList::ItemList sinks; SinkList::ItemList sinks_to_notify_format; { base::AutoLock auto_lock(lock_); - capturer = capturer_; sinks = sinks_.Items(); sinks_.RetrieveAndClearTags(&sinks_to_notify_format); } // Notify the tracks on when the format changes. This will do nothing if - // |sinks_to_notify_format| is empty. + // |sinks_to_notify_format| is empty. Note that accessing |audio_parameters_| + // without holding the |lock_| is valid since |audio_parameters_| is only + // changed on the current thread. for (const auto& sink : sinks_to_notify_format) sink->OnSetFormat(audio_parameters_); @@ -105,22 +76,20 @@ capture_thread_checker_.DetachFromThread(); DCHECK(capture_thread_checker_.CalledOnValidThread()); - audio_parameters_ = params; - level_calculator_.reset(new MediaStreamAudioLevelCalculator()); - base::AutoLock auto_lock(lock_); + audio_parameters_ = params; // Remember to notify all sinks of the new format. sinks_.TagAll(); } +void WebRtcLocalAudioTrack::SetLevel( + scoped_refptr<MediaStreamAudioLevelCalculator::Level> level) { + adapter_->SetLevel(std::move(level)); +} + void WebRtcLocalAudioTrack::SetAudioProcessor( - const scoped_refptr<MediaStreamAudioProcessor>& processor) { - // if the |processor| does not have audio processing, which can happen if - // kDisableAudioTrackProcessing is set set or all the constraints in - // the |processor| are turned off. In such case, we pass NULL to the - // adapter to indicate that no stats can be gotten from the processor. - adapter_->SetAudioProcessor(processor->has_audio_processing() ? - processor : NULL); + scoped_refptr<MediaStreamAudioProcessor> processor) { + adapter_->SetAudioProcessor(std::move(processor)); } void WebRtcLocalAudioTrack::AddSink(MediaStreamAudioSink* sink) { @@ -166,63 +135,22 @@ removed_item->Reset(); } -void WebRtcLocalAudioTrack::Start() { - DCHECK(main_render_thread_checker_.CalledOnValidThread()); - DVLOG(1) << "WebRtcLocalAudioTrack::Start()"; - if (webaudio_source_.get()) { - // If the track is hooking up with WebAudio, do NOT add the track to the - // capturer as its sink otherwise two streams in different clock will be - // pushed through the same track. - webaudio_source_->Start(this); - } else if (capturer_.get()) { - capturer_->AddTrack(this); - } - - SinkList::ItemList sinks; - { - base::AutoLock auto_lock(lock_); - sinks = sinks_.Items(); - } - for (SinkList::ItemList::const_iterator it = sinks.begin(); - it != sinks.end(); - ++it) { - (*it)->OnReadyStateChanged(blink::WebMediaStreamSource::ReadyStateLive); - } -} - void WebRtcLocalAudioTrack::SetEnabled(bool enabled) { DCHECK(main_render_thread_checker_.CalledOnValidThread()); if (adapter_.get()) adapter_->set_enabled(enabled); } -void WebRtcLocalAudioTrack::Stop() { +void WebRtcLocalAudioTrack::OnStop() { DCHECK(main_render_thread_checker_.CalledOnValidThread()); - DVLOG(1) << "WebRtcLocalAudioTrack::Stop()"; - if (!capturer_.get() && !webaudio_source_.get()) - return; + DVLOG(1) << "WebRtcLocalAudioTrack::OnStop()"; - if (webaudio_source_.get()) { - // Called Stop() on the |webaudio_source_| explicitly so that - // |webaudio_source_| won't push more data to the track anymore. - // Also note that the track is not registered as a sink to the |capturer_| - // in such case and no need to call RemoveTrack(). - webaudio_source_->Stop(); - } else { - // It is necessary to call RemoveTrack on the |capturer_| to avoid getting - // audio callback after Stop(). - capturer_->RemoveTrack(this); - } - - // Protect the pointers using the lock when accessing |sinks_| and - // setting the |capturer_| to NULL. + // Protect the pointers using the lock when accessing |sinks_|. SinkList::ItemList sinks; { base::AutoLock auto_lock(lock_); sinks = sinks_.Items(); sinks_.Clear(); - webaudio_source_ = NULL; - capturer_ = NULL; } for (SinkList::ItemList::const_iterator it = sinks.begin();
diff --git a/content/renderer/media/webrtc_local_audio_track.h b/content/renderer/media/webrtc_local_audio_track.h index 2eafbd1..d3d28d5 100644 --- a/content/renderer/media/webrtc_local_audio_track.h +++ b/content/renderer/media/webrtc_local_audio_track.h
@@ -10,11 +10,11 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/synchronization/lock.h" #include "base/threading/thread_checker.h" #include "content/renderer/media/media_stream_audio_track.h" #include "content/renderer/media/tagged_list.h" +#include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" #include "media/audio/audio_parameters.h" namespace media { @@ -28,22 +28,14 @@ class MediaStreamAudioSink; class MediaStreamAudioSinkOwner; class MediaStreamAudioTrackSink; -class WebAudioCapturerSource; -class WebRtcAudioCapturer; -class WebRtcLocalAudioTrackAdapter; -// A WebRtcLocalAudioTrack instance contains the implementations of -// MediaStreamTrackExtraData. -// When an instance is created, it will register itself as a track to the -// WebRtcAudioCapturer to get the captured data, and forward the data to -// its |sinks_|. The data flow can be stopped by disabling the audio track. -// TODO(tommi): Rename to MediaStreamLocalAudioTrack. +// A WebRtcLocalAudioTrack manages thread-safe connects/disconnects to sinks, +// and the delivery of audio data from the source to the sinks. class CONTENT_EXPORT WebRtcLocalAudioTrack : NON_EXPORTED_BASE(public MediaStreamAudioTrack) { public: - WebRtcLocalAudioTrack(WebRtcLocalAudioTrackAdapter* adapter, - const scoped_refptr<WebRtcAudioCapturer>& capturer, - WebAudioCapturerSource* webaudio_source); + explicit WebRtcLocalAudioTrack( + scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter); ~WebRtcLocalAudioTrack() override; @@ -56,56 +48,39 @@ // Called on the main render thread. void RemoveSink(MediaStreamAudioSink* sink) override; - // Starts the local audio track. Called on the main render thread and - // should be called only once when audio track is created. - void Start(); - // Overrides for MediaStreamTrack. - void SetEnabled(bool enabled) override; - - // Stops the local audio track. Called on the main render thread and - // should be called only once when audio track going away. - void Stop() override; - webrtc::AudioTrackInterface* GetAudioAdapter() override; - - // Returns the output format of the capture source. May return an invalid - // AudioParameters if the format is not yet available. - // Called on the main render thread. media::AudioParameters GetOutputFormat() const override; // Method called by the capturer to deliver the capture data. // Called on the capture audio thread. void Capture(const media::AudioBus& audio_bus, - base::TimeTicks estimated_capture_time, - bool force_report_nonzero_energy); + base::TimeTicks estimated_capture_time); // Method called by the capturer to set the audio parameters used by source // of the capture data.. // Called on the capture audio thread. void OnSetFormat(const media::AudioParameters& params); - // Method called by the capturer to set the processor that applies signal - // processing on the data of the track. - // Called on the capture audio thread. - void SetAudioProcessor( - const scoped_refptr<MediaStreamAudioProcessor>& processor); + // Called by the capturer before the audio data flow begins to set the object + // that provides shared access to the current audio signal level. + void SetLevel(scoped_refptr<MediaStreamAudioLevelCalculator::Level> level); + + // Called by the capturer before the audio data flow begins to provide a + // reference to the audio processor so that the track can query stats from it. + void SetAudioProcessor(scoped_refptr<MediaStreamAudioProcessor> processor); private: typedef TaggedList<MediaStreamAudioTrackSink> SinkList; + // MediaStreamAudioTrack override. + void OnStop() final; + // All usage of libjingle is through this adapter. The adapter holds // a pointer to this object, but no reference. const scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_; - // The provider of captured data to render. - scoped_refptr<WebRtcAudioCapturer> capturer_; - - // The source of the audio track which is used by WebAudio, which provides - // data to the audio track when hooking up with WebAudio. - scoped_refptr<WebAudioCapturerSource> webaudio_source_; - // A tagged list of sinks that the audio data is fed to. Tags // indicate tracks that need to be notified that the audio format // has changed. @@ -121,13 +96,8 @@ mutable base::Lock lock_; // Audio parameters of the audio capture stream. - // Accessed on only the audio capture thread. media::AudioParameters audio_parameters_; - // Used to calculate the signal level that shows in the UI. - // Accessed on only the audio thread. - scoped_ptr<MediaStreamAudioLevelCalculator> level_calculator_; - DISALLOW_COPY_AND_ASSIGN(WebRtcLocalAudioTrack); };
diff --git a/content/renderer/media/webrtc_local_audio_track_unittest.cc b/content/renderer/media/webrtc_local_audio_track_unittest.cc index 7c478c8..1e9868c 100644 --- a/content/renderer/media/webrtc_local_audio_track_unittest.cc +++ b/content/renderer/media/webrtc_local_audio_track_unittest.cc
@@ -95,7 +95,7 @@ int session_id)); MOCK_METHOD0(OnStart, void()); MOCK_METHOD0(OnStop, void()); - MOCK_METHOD1(SetVolume, void(double volume)); + void SetVolume(double volume) final {} MOCK_METHOD1(SetAutomaticGainControl, void(bool enable)); void Initialize(const media::AudioParameters& params, @@ -165,12 +165,16 @@ StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_CAPTURE, std::string(), std::string()); - capturer_ = WebRtcAudioCapturer::CreateCapturer( - -1, device, constraint_factory.CreateWebMediaConstraints(), NULL, - audio_source); - audio_source->SetAudioCapturer(capturer_.get()); - capturer_source_ = new MockCapturerSource(capturer_.get()); - EXPECT_CALL(*capturer_source_.get(), OnInitialize(_, capturer_.get(), -1)) + { + scoped_ptr<WebRtcAudioCapturer> capturer = + WebRtcAudioCapturer::CreateCapturer( + -1, device, constraint_factory.CreateWebMediaConstraints(), + nullptr, audio_source); + capturer_ = capturer.get(); + audio_source->SetAudioCapturer(std::move(capturer)); + } + capturer_source_ = new MockCapturerSource(capturer_); + EXPECT_CALL(*capturer_source_.get(), OnInitialize(_, capturer_, -1)) .WillOnce(Return()); EXPECT_CALL(*capturer_source_.get(), SetAutomaticGainControl(true)); EXPECT_CALL(*capturer_source_.get(), OnStart()); @@ -184,8 +188,8 @@ media::AudioParameters params_; blink::WebMediaStreamSource blink_source_; + WebRtcAudioCapturer* capturer_; // Owned by |blink_source_|. scoped_refptr<MockCapturerSource> capturer_source_; - scoped_refptr<WebRtcAudioCapturer> capturer_; }; // Creates a capturer and audio track, fakes its audio thread, and @@ -196,8 +200,12 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track( - new WebRtcLocalAudioTrack(adapter.get(), capturer_, NULL)); - track->Start(); + new WebRtcLocalAudioTrack(adapter.get())); + track->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track.get())); + capturer_->AddTrack(track.get()); EXPECT_TRUE(track->GetAudioAdapter()->enabled()); scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink()); @@ -226,12 +234,16 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track( - new WebRtcLocalAudioTrack(adapter.get(), capturer_, NULL)); - track->Start(); + new WebRtcLocalAudioTrack(adapter.get())); + track->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track.get())); + capturer_->AddTrack(track.get()); EXPECT_TRUE(track->GetAudioAdapter()->enabled()); EXPECT_TRUE(track->GetAudioAdapter()->set_enabled(false)); scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink()); - const media::AudioParameters params = capturer_->source_audio_parameters(); + const media::AudioParameters params = capturer_->GetInputFormat(); base::WaitableEvent event(false, false); EXPECT_CALL(*sink, FormatIsSet()).Times(1); EXPECT_CALL(*sink, CaptureData()).Times(0); @@ -259,11 +271,15 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_1( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track_1( - new WebRtcLocalAudioTrack(adapter_1.get(), capturer_, NULL)); - track_1->Start(); + new WebRtcLocalAudioTrack(adapter_1.get())); + track_1->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track_1.get())); + capturer_->AddTrack(track_1.get()); EXPECT_TRUE(track_1->GetAudioAdapter()->enabled()); scoped_ptr<MockMediaStreamAudioSink> sink_1(new MockMediaStreamAudioSink()); - const media::AudioParameters params = capturer_->source_audio_parameters(); + const media::AudioParameters params = capturer_->GetInputFormat(); base::WaitableEvent event_1(false, false); EXPECT_CALL(*sink_1, FormatIsSet()).WillOnce(Return()); EXPECT_CALL(*sink_1, CaptureData()).Times(AtLeast(1)) @@ -276,8 +292,12 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_2( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track_2( - new WebRtcLocalAudioTrack(adapter_2.get(), capturer_, NULL)); - track_2->Start(); + new WebRtcLocalAudioTrack(adapter_2.get())); + track_2->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track_2.get())); + capturer_->AddTrack(track_2.get()); EXPECT_TRUE(track_2->GetAudioAdapter()->enabled()); // Verify both |sink_1| and |sink_2| get data. @@ -315,8 +335,12 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track( - new WebRtcLocalAudioTrack(adapter.get(), capturer_, NULL)); - track->Start(); + new WebRtcLocalAudioTrack(adapter.get())); + track->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track.get())); + capturer_->AddTrack(track.get()); // When the track goes away, it will automatically stop the // |capturer_source_|. @@ -331,14 +355,22 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter1( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track1( - new WebRtcLocalAudioTrack(adapter1.get(), capturer_, NULL)); - track1->Start(); + new WebRtcLocalAudioTrack(adapter1.get())); + track1->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track1.get())); + capturer_->AddTrack(track1.get()); scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter2( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track2( - new WebRtcLocalAudioTrack(adapter2.get(), capturer_, NULL)); - track2->Start(); + new WebRtcLocalAudioTrack(adapter2.get())); + track2->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track2.get())); + capturer_->AddTrack(track2.get()); track1->Stop(); // When the last track is stopped, it will automatically stop the @@ -354,8 +386,12 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_1( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track_1( - new WebRtcLocalAudioTrack(adapter_1.get(), capturer_, NULL)); - track_1->Start(); + new WebRtcLocalAudioTrack(adapter_1.get())); + track_1->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track_1.get())); + capturer_->AddTrack(track_1.get()); // Verify the data flow by connecting the sink to |track_1|. scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink()); @@ -372,8 +408,12 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_2( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track_2( - new WebRtcLocalAudioTrack(adapter_2.get(), capturer_, NULL)); - track_2->Start(); + new WebRtcLocalAudioTrack(adapter_2.get())); + track_2->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track_2.get())); + capturer_->AddTrack(track_2.get()); // Stop the capturer will clear up the track lists in the capturer. EXPECT_CALL(*capturer_source_.get(), OnStop()); @@ -404,8 +444,12 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_1( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track_1( - new WebRtcLocalAudioTrack(adapter_1.get(), capturer_, NULL)); - track_1->Start(); + new WebRtcLocalAudioTrack(adapter_1.get())); + track_1->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track_1.get())); + capturer_->AddTrack(track_1.get()); // Verify the data flow by connecting the |sink_1| to |track_1|. scoped_ptr<MockMediaStreamAudioSink> sink_1(new MockMediaStreamAudioSink()); @@ -418,7 +462,7 @@ MockConstraintFactory constraint_factory; StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_CAPTURE, std::string(), std::string()); - scoped_refptr<WebRtcAudioCapturer> new_capturer( + scoped_ptr<WebRtcAudioCapturer> new_capturer( WebRtcAudioCapturer::CreateCapturer( -1, device, constraint_factory.CreateWebMediaConstraints(), NULL, NULL)); @@ -437,8 +481,12 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_2( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track_2( - new WebRtcLocalAudioTrack(adapter_2.get(), new_capturer, NULL)); - track_2->Start(); + new WebRtcLocalAudioTrack(adapter_2.get())); + track_2->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track_2.get())); + new_capturer->AddTrack(track_2.get()); // Verify the data flow by connecting the |sink_2| to |track_2|. scoped_ptr<MockMediaStreamAudioSink> sink_2(new MockMediaStreamAudioSink()); @@ -471,12 +519,11 @@ // Create a capturer with new source which works with the format above. MockConstraintFactory factory; factory.DisableDefaultAudioConstraints(); - scoped_refptr<WebRtcAudioCapturer> capturer( - WebRtcAudioCapturer::CreateCapturer( - -1, StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, "", "", - params.sample_rate(), params.channel_layout(), - params.frames_per_buffer()), - factory.CreateWebMediaConstraints(), NULL, NULL)); + scoped_ptr<WebRtcAudioCapturer> capturer(WebRtcAudioCapturer::CreateCapturer( + -1, + StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, "", "", params.sample_rate(), + params.channel_layout(), params.frames_per_buffer()), + factory.CreateWebMediaConstraints(), NULL, NULL)); scoped_refptr<MockCapturerSource> source( new MockCapturerSource(capturer.get())); EXPECT_CALL(*source.get(), OnInitialize(_, capturer.get(), -1)); @@ -488,8 +535,12 @@ scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL)); scoped_ptr<WebRtcLocalAudioTrack> track( - new WebRtcLocalAudioTrack(adapter.get(), capturer, NULL)); - track->Start(); + new WebRtcLocalAudioTrack(adapter.get())); + track->Start( + base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo, + MediaStreamAudioSource::From(blink_source_)->GetWeakPtr(), + track.get())); + capturer->AddTrack(track.get()); // Verify the data flow by connecting the |sink| to |track|. scoped_ptr<MockMediaStreamAudioSink> sink(new MockMediaStreamAudioSink());
diff --git a/content/renderer/mojo_context_state.cc b/content/renderer/mojo_context_state.cc index 5495fb97..6d71589 100644 --- a/content/renderer/mojo_context_state.cc +++ b/content/renderer/mojo_context_state.cc
@@ -99,7 +99,8 @@ module_added_(false), module_prefix_(for_layout_tests ? "layout-test-mojom://" - : frame_->securityOrigin().toString().utf8() + "/") { + : frame_->getSecurityOrigin().toString().utf8() + + "/") { gin::PerContextData* context_data = gin::PerContextData::From(context); gin::ContextHolder* context_holder = context_data->context_holder(); runner_.reset(new MojoMainRunner(frame_, context_holder));
diff --git a/content/renderer/pepper/event_conversion.cc b/content/renderer/pepper/event_conversion.cc index e7f5c69..88655b2e 100644 --- a/content/renderer/pepper/event_conversion.cc +++ b/content/renderer/pepper/event_conversion.cc
@@ -270,10 +270,11 @@ WebTouchPoint CreateWebTouchPoint(const PP_TouchPoint& pp_pt, WebTouchPoint::State state) { WebTouchPoint pt; + pt.pointerType = blink::WebPointerProperties::PointerType::Touch; pt.id = pp_pt.id; pt.position.x = pp_pt.position.x; pt.position.y = pp_pt.position.y; - // TODO bug:http://code.google.com/p/chromium/issues/detail?id=93902 + // TODO(crbug.com/93902): Add screen coordinate calculation. pt.screenPosition.x = 0; pt.screenPosition.y = 0; pt.force = pp_pt.pressure; @@ -402,6 +403,8 @@ WebMouseEvent* BuildMouseEvent(const InputEventData& event) { WebMouseEvent* mouse_event = new WebMouseEvent(); + mouse_event->pointerType = blink::WebPointerProperties::PointerType::Mouse; + switch (event.event_type) { case PP_INPUTEVENT_TYPE_MOUSEDOWN: mouse_event->type = WebInputEvent::MouseDown;
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index 1c8fba3..e0fa103 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -299,7 +299,7 @@ return false; WebElement plugin_element = instance->container()->element(); - *security_origin = plugin_element.document().securityOrigin(); + *security_origin = plugin_element.document().getSecurityOrigin(); return true; } @@ -3180,8 +3180,8 @@ blink::WebDocument main_document = containing_document.frame()->view()->mainFrame()->document(); - return containing_document.securityOrigin().canAccess( - main_document.securityOrigin()); + return containing_document.getSecurityOrigin().canAccess( + main_document.getSecurityOrigin()); } void PepperPluginInstanceImpl::KeepSizeAttributesBeforeFullscreen() {
diff --git a/content/renderer/pepper/plugin_instance_throttler_impl.cc b/content/renderer/pepper/plugin_instance_throttler_impl.cc index 5a153b7..009e7d5 100644 --- a/content/renderer/pepper/plugin_instance_throttler_impl.cc +++ b/content/renderer/pepper/plugin_instance_throttler_impl.cc
@@ -141,7 +141,7 @@ if (frame) { float zoom_factor = GetWebPlugin()->container()->pageZoomFactor(); auto status = frame->GetPeripheralContentStatus( - frame->GetWebFrame()->top()->securityOrigin(), content_origin, + frame->GetWebFrame()->top()->getSecurityOrigin(), content_origin, gfx::Size(roundf(unobscured_size.width() / zoom_factor), roundf(unobscured_size.height() / zoom_factor))); if (status != RenderFrame::CONTENT_STATUS_PERIPHERAL) {
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 0639df51..125edab 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -2445,7 +2445,7 @@ WebPluginInfo info; std::string mime_type; bool found = false; - WebString top_origin = frame->top()->securityOrigin().toString(); + WebString top_origin = frame->top()->getSecurityOrigin().toString(); Send(new FrameHostMsg_GetPluginInfo(routing_id_, params.url, blink::WebStringToGURL(top_origin), params.mimeType.utf8(), &found, &info, @@ -2480,14 +2480,14 @@ blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url)); if (!web_stream.isNull()) return CreateWebMediaPlayerForMediaStream(client, sink_id, - frame_->securityOrigin()); + frame_->getSecurityOrigin()); RenderThreadImpl* render_thread = RenderThreadImpl::current(); scoped_refptr<media::RestartableAudioRendererSink> audio_renderer_sink = AudioDeviceFactory::NewRestartableAudioRendererSink( AudioDeviceFactory::kSourceMediaElement, routing_id_, 0, - sink_id.utf8(), frame_->securityOrigin()); + sink_id.utf8(), frame_->getSecurityOrigin()); media::WebMediaPlayerParams::Context3DCB context_3d_cb = base::Bind(&GetSharedMainThreadContext3D); @@ -3718,7 +3718,7 @@ // If we need to set the first party, then we need to set the request's // initiator as well; it will not be updated during redirects. - request.setRequestorOrigin(frame->document().securityOrigin()); + request.setRequestorOrigin(frame->document().getSecurityOrigin()); } WebDataSource* provisional_data_source = frame->provisionalDataSource(); @@ -3845,7 +3845,7 @@ extra_data->set_render_frame_id(routing_id_); extra_data->set_is_main_frame(!parent); extra_data->set_frame_origin( - blink::WebStringToGURL(frame->document().securityOrigin().toString())); + blink::WebStringToGURL(frame->document().getSecurityOrigin().toString())); extra_data->set_parent_is_main_frame(parent && !parent->parent()); extra_data->set_parent_render_frame_id(parent_routing_id); extra_data->set_allow_download( @@ -4072,7 +4072,7 @@ blink::WebStorageQuotaType type, unsigned long long requested_size, blink::WebStorageQuotaCallbacks callbacks) { - WebSecurityOrigin origin = frame_->document().securityOrigin(); + WebSecurityOrigin origin = frame_->document().getSecurityOrigin(); if (origin.isUnique()) { // Unique origins cannot store persistent state. callbacks.didFail(blink::WebStorageQuotaErrorAbort); @@ -4227,17 +4227,15 @@ bool blocked = true; Send(new FrameHostMsg_Are3DAPIsBlocked( routing_id_, - blink::WebStringToGURL(frame_->top()->securityOrigin().toString()), - THREE_D_API_TYPE_WEBGL, - &blocked)); + blink::WebStringToGURL(frame_->top()->getSecurityOrigin().toString()), + THREE_D_API_TYPE_WEBGL, &blocked)); return !blocked; } void RenderFrameImpl::didLoseWebGLContext(int arb_robustness_status_code) { Send(new FrameHostMsg_DidLose3DContext( - blink::WebStringToGURL(frame_->top()->securityOrigin().toString()), - THREE_D_API_TYPE_WEBGL, - arb_robustness_status_code)); + blink::WebStringToGURL(frame_->top()->getSecurityOrigin().toString()), + THREE_D_API_TYPE_WEBGL, arb_robustness_status_code)); } blink::WebScreenOrientationClient* @@ -4474,10 +4472,11 @@ // TODO(alexmos): Origins for URLs with non-standard schemes are excluded due // to https://crbug.com/439608 and will be replicated as unique origins. if (!is_swapped_out_) { - std::string scheme = frame->document().securityOrigin().protocol().utf8(); + std::string scheme = + frame->document().getSecurityOrigin().protocol().utf8(); if (url::IsStandard(scheme.c_str(), url::Component(0, static_cast<int>(scheme.length())))) { - params.origin = frame->document().securityOrigin(); + params.origin = frame->document().getSecurityOrigin(); } }
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index a1fbd871..202c5f9 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -1995,12 +1995,10 @@ void RenderThreadImpl::OnCreateNewSharedWorker( const WorkerProcessMsg_CreateWorker_Params& params) { // EmbeddedSharedWorkerStub will self-destruct. - new EmbeddedSharedWorkerStub(params.url, - params.name, - params.content_security_policy, - params.security_policy_type, - params.pause_on_start, - params.route_id); + new EmbeddedSharedWorkerStub( + params.url, params.name, params.content_security_policy, + params.security_policy_type, params.creation_address_space, + params.pause_on_start, params.route_id); } void RenderThreadImpl::OnMemoryPressure( @@ -2016,10 +2014,13 @@ // Trigger full v8 garbage collection on memory pressure notifications. // This will potentially hang the renderer for a long time, however, when // we receive a memory pressure notification, we might be about to be - // killed. - blink::mainThreadIsolate()->LowMemoryNotification(); - RenderThread::Get()->PostTaskToAllWebWorkers( - base::Bind(&LowMemoryNotificationOnThisThread)); + // killed. Because of the janky hang don't do this to foreground + // renderers. + if (RendererIsHidden()) { + blink::mainThreadIsolate()->LowMemoryNotification(); + RenderThread::Get()->PostTaskToAllWebWorkers( + base::Bind(&LowMemoryNotificationOnThisThread)); + } } if (memory_pressure_level ==
diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc index dd884d8..67bc93a 100644 --- a/content/renderer/render_thread_impl_browsertest.cc +++ b/content/renderer/render_thread_impl_browsertest.cc
@@ -187,7 +187,8 @@ InitializeMojo(); thread_ = new RenderThreadImplForTest( InProcessChildThreadParams(test_helper_->GetChannelId(), - test_helper_->GetIOTaskRunner()), + test_helper_->GetIOTaskRunner(), + test_helper_->GetMessagePipeHandle()), std::move(renderer_scheduler), test_task_counter_); cmd->InitFromArgv(old_argv);
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index be020d4c..a47e73df 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -178,7 +178,7 @@ result.sandbox_flags = frame->effectiveSandboxFlags(); // result.should_enforce_strict_mixed_content_checking is calculated in the // browser... - result.origin = frame->securityOrigin(); + result.origin = frame->getSecurityOrigin(); return result; } @@ -932,7 +932,8 @@ EXPECT_TRUE(web_frame->firstChild()->isWebRemoteFrame()); // Expect the origin to be updated properly. - blink::WebSecurityOrigin origin = web_frame->firstChild()->securityOrigin(); + blink::WebSecurityOrigin origin = + web_frame->firstChild()->getSecurityOrigin(); EXPECT_EQ(origin.toString(), WebString::fromUTF8(replication_state.origin.Serialize())); @@ -943,7 +944,7 @@ RenderFrame::FromWebFrame(web_frame->lastChild())); child_frame2->SwapOut(kProxyRoutingId + 1, true, replication_state); EXPECT_TRUE(web_frame->lastChild()->isWebRemoteFrame()); - EXPECT_TRUE(web_frame->lastChild()->securityOrigin().isUnique()); + EXPECT_TRUE(web_frame->lastChild()->getSecurityOrigin().isUnique()); } // Test for https://crbug.com/568676, where a parent detaches a remote child
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index d831ca9..807be31 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -1623,11 +1623,11 @@ params.opener_top_level_frame_url = creator->top()->document().url(); } else { params.opener_top_level_frame_url = - blink::WebStringToGURL(creator->top()->securityOrigin().toString()); + blink::WebStringToGURL(creator->top()->getSecurityOrigin().toString()); } GURL security_url(blink::WebStringToGURL( - creator->document().securityOrigin().toString())); + creator->document().getSecurityOrigin().toString())); if (!security_url.is_valid()) security_url = GURL(); params.opener_security_origin = security_url;
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 75052c4..2347d801 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -9,6 +9,7 @@ #include "base/auto_reset.h" #include "base/bind.h" #include "base/command_line.h" +#include "base/feature_list.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" @@ -38,6 +39,7 @@ #include "content/common/input_messages.h" #include "content/common/swapped_out_messages.h" #include "content/common/view_messages.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/context_menu_params.h" #include "content/renderer/cursor_utils.h" @@ -1759,10 +1761,7 @@ bool RenderWidget::IsUsingImeThread() { #if defined(OS_ANDROID) - return base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableImeThread) && - !base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableImeThread); + return base::FeatureList::IsEnabled(features::kImeThread); #else return false; #endif
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index a5f1637d..90f827e 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -929,7 +929,9 @@ HtmlVideoElementCapturerSource::CreateFromWebMediaPlayerImpl( web_media_player, content::RenderThread::Get()->GetIOMessageLoopProxy()), - false /* is_remote */, false /* is_readonly */, web_media_stream); + false, // is_remote + false, // is_readonly + web_media_stream); #endif }
diff --git a/content/renderer/service_worker/embedded_worker_dispatcher.cc b/content/renderer/service_worker/embedded_worker_dispatcher.cc index 74d711d5..7ed1a41 100644 --- a/content/renderer/service_worker/embedded_worker_dispatcher.cc +++ b/content/renderer/service_worker/embedded_worker_dispatcher.cc
@@ -97,8 +97,9 @@ params.wait_for_debugger ? blink::WebEmbeddedWorkerStartData::WaitForDebugger : blink::WebEmbeddedWorkerStartData::DontWaitForDebugger; - start_data.v8CacheOptions = - static_cast<blink::WebSettings::V8CacheOptions>(params.v8_cache_options); + start_data.v8CacheOptions = static_cast<blink::WebSettings::V8CacheOptions>( + params.settings.v8_cache_options); + start_data.dataSaverEnabled = params.settings.data_saver_enabled; start_data.pauseAfterDownloadMode = params.pause_after_download ? blink::WebEmbeddedWorkerStartData::PauseAfterDownload
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc index 63ce5068..a41be61 100644 --- a/content/renderer/shared_worker/embedded_shared_worker_stub.cc +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
@@ -23,7 +23,6 @@ #include "ipc/ipc_message_macros.h" #include "third_party/WebKit/public/platform/URLConversion.h" #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" -#include "third_party/WebKit/public/platform/WebURLRequest.h" #include "third_party/WebKit/public/web/WebDataSource.h" #include "third_party/WebKit/public/web/WebSharedWorker.h" #include "third_party/WebKit/public/web/WebSharedWorkerClient.h" @@ -125,11 +124,10 @@ const base::string16& name, const base::string16& content_security_policy, blink::WebContentSecurityPolicyType security_policy_type, + blink::WebAddressSpace creation_address_space, bool pause_on_start, int route_id) - : route_id_(route_id), - name_(name), - url_(url) { + : route_id_(route_id), name_(name), url_(url) { RenderThreadImpl::current()->AddEmbeddedWorkerRoute(route_id_, this); impl_ = blink::WebSharedWorker::create(this); if (pause_on_start) { @@ -139,8 +137,8 @@ } worker_devtools_agent_.reset( new SharedWorkerDevToolsAgent(route_id, impl_)); - impl_->startWorkerContext(url, name_, - content_security_policy, security_policy_type); + impl_->startWorkerContext(url, name_, content_security_policy, + security_policy_type, creation_address_space); } EmbeddedSharedWorkerStub::~EmbeddedSharedWorkerStub() {
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.h b/content/renderer/shared_worker/embedded_shared_worker_stub.h index 232f55a..876a0b2 100644 --- a/content/renderer/shared_worker/embedded_shared_worker_stub.h +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.h
@@ -11,6 +11,7 @@ #include "content/child/child_message_filter.h" #include "content/child/scoped_child_process_reference.h" #include "ipc/ipc_listener.h" +#include "third_party/WebKit/public/platform/WebAddressSpace.h" #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/web/WebContentSecurityPolicy.h" #include "third_party/WebKit/public/web/WebSharedWorkerClient.h" @@ -49,6 +50,7 @@ const base::string16& name, const base::string16& content_security_policy, blink::WebContentSecurityPolicyType security_policy_type, + blink::WebAddressSpace creation_address_space, bool pause_on_start, int route_id);
diff --git a/content/renderer/shared_worker_repository.cc b/content/renderer/shared_worker_repository.cc index 93b1a06..607e044 100644 --- a/content/renderer/shared_worker_repository.cc +++ b/content/renderer/shared_worker_repository.cc
@@ -27,6 +27,7 @@ DocumentID document_id, const blink::WebString& content_security_policy, blink::WebContentSecurityPolicyType security_policy_type, + blink::WebAddressSpace creation_address_space, blink::WebSharedWorkerCreationContextType creation_context_type, blink::WebWorkerCreationError* error) { ViewHostMsg_CreateWorker_Params params; @@ -36,6 +37,7 @@ params.security_policy_type = security_policy_type; params.document_id = document_id; params.render_frame_route_id = render_frame()->GetRoutingID(); + params.creation_address_space = creation_address_space; params.creation_context_type = creation_context_type; ViewHostMsg_CreateWorker_Reply reply; Send(new ViewHostMsg_CreateWorker(params, &reply));
diff --git a/content/renderer/shared_worker_repository.h b/content/renderer/shared_worker_repository.h index 70d73d3..93ac628 100644 --- a/content/renderer/shared_worker_repository.h +++ b/content/renderer/shared_worker_repository.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "content/public/renderer/render_frame_observer.h" +#include "third_party/WebKit/public/platform/WebAddressSpace.h" #include "third_party/WebKit/public/web/WebContentSecurityPolicy.h" #include "third_party/WebKit/public/web/WebSharedWorkerCreationContextType.h" #include "third_party/WebKit/public/web/WebSharedWorkerRepositoryClient.h" @@ -30,6 +31,7 @@ DocumentID document_id, const blink::WebString& content_security_policy, blink::WebContentSecurityPolicyType, + blink::WebAddressSpace, blink::WebSharedWorkerCreationContextType, blink::WebWorkerCreationError* error) override; void documentDetached(DocumentID document_id) override;
diff --git a/content/shell/renderer/layout_test/blink_test_runner.cc b/content/shell/renderer/layout_test/blink_test_runner.cc index 13f30a3..ad29daf 100644 --- a/content/shell/renderer/layout_test/blink_test_runner.cc +++ b/content/shell/renderer/layout_test/blink_test_runner.cc
@@ -770,7 +770,9 @@ #if defined(ENABLE_WEBRTC) return AddVideoTrackToMediaStream( make_scoped_ptr(new MockVideoCapturerSource()), - false /* is_remote */, false /* is_readonly */, stream); + false, // is_remote + false, // is_readonly + stream); #else return false; #endif @@ -782,7 +784,12 @@ #if defined(ENABLE_WEBRTC) return AddAudioTrackToMediaStream( make_scoped_refptr(new MockAudioCapturerSource()), - false /* is_remote */, false /* is_readonly */, stream); + 48000, // sample rate + media::CHANNEL_LAYOUT_STEREO, + 480, // sample frames per buffer + false, // is_remote + false, // is_readonly + stream); #else return false; #endif
diff --git a/content/test/content_test_suite.cc b/content/test/content_test_suite.cc index 701f59c..318e34e 100644 --- a/content/test/content_test_suite.cc +++ b/content/test/content_test_suite.cc
@@ -111,7 +111,7 @@ testing::UnitTest::GetInstance()->listeners(); listeners.Append(new TestInitializationListener); #if defined(OS_ANDROID) - SurfaceTextureManager::SetInstance( + gpu::SurfaceTextureManager::SetInstance( InProcessSurfaceTextureManager::GetInstance()); #endif #if defined(USE_OZONE)
diff --git a/content/test/data/service_worker/add_save_data_to_title.js b/content/test/data/service_worker/add_save_data_to_title.js new file mode 100644 index 0000000..7facfe5 --- /dev/null +++ b/content/test/data/service_worker/add_save_data_to_title.js
@@ -0,0 +1,10 @@ +// 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. + +this.onfetch = function(event) { + var value = event.request.headers.get('Save-Data'); + var blob = new Blob(['<title>save-data='+ value + '</title>']); + var response = new Response(blob); + event.respondWith(response); +};
diff --git a/content/test/data/service_worker/add_save_data_to_title.js.mock-http-headers b/content/test/data/service_worker/add_save_data_to_title.js.mock-http-headers new file mode 100644 index 0000000..c9a3625 --- /dev/null +++ b/content/test/data/service_worker/add_save_data_to_title.js.mock-http-headers
@@ -0,0 +1,2 @@ +HTTP/1.1 200 OK +Content-Type: text/javascript
diff --git a/content/test/data/service_worker/fetch_event_pass_through.js b/content/test/data/service_worker/fetch_event_pass_through.js new file mode 100644 index 0000000..fc23dd2 --- /dev/null +++ b/content/test/data/service_worker/fetch_event_pass_through.js
@@ -0,0 +1,5 @@ +// 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. + +this.onfetch = function(event) { };
diff --git a/content/test/data/service_worker/fetch_event_pass_through.js.mock-http-headers b/content/test/data/service_worker/fetch_event_pass_through.js.mock-http-headers new file mode 100644 index 0000000..c9a3625 --- /dev/null +++ b/content/test/data/service_worker/fetch_event_pass_through.js.mock-http-headers
@@ -0,0 +1,2 @@ +HTTP/1.1 200 OK +Content-Type: text/javascript
diff --git a/content/test/data/service_worker/fetch_in_install.js b/content/test/data/service_worker/fetch_in_install.js new file mode 100644 index 0000000..68df2dc --- /dev/null +++ b/content/test/data/service_worker/fetch_in_install.js
@@ -0,0 +1,5 @@ +// 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. + +this.oninstall = function(e) { e.waitUntil(fetch('fetch_in_install.html')); }; \ No newline at end of file
diff --git a/content/test/data/service_worker/fetch_in_install.js.mock-http-headers b/content/test/data/service_worker/fetch_in_install.js.mock-http-headers new file mode 100644 index 0000000..c9a3625 --- /dev/null +++ b/content/test/data/service_worker/fetch_in_install.js.mock-http-headers
@@ -0,0 +1,2 @@ +HTTP/1.1 200 OK +Content-Type: text/javascript
diff --git a/content/test/gpu/page_sets/gpu_process_tests.py b/content/test/gpu/page_sets/gpu_process_tests.py index e76b9c0e..f1ce3eb 100644 --- a/content/test/gpu/page_sets/gpu_process_tests.py +++ b/content/test/gpu/page_sets/gpu_process_tests.py
@@ -143,6 +143,32 @@ expectations=expectations) +class SkipGpuProcessSharedPageState(GpuProcessSharedPageState): + def __init__(self, test, finder_options, story_set): + super(SkipGpuProcessSharedPageState, self).__init__( + test, finder_options, story_set) + options = finder_options.browser_options + + options.AppendExtraBrowserArgs('--disable-gpu') + options.AppendExtraBrowserArgs('--skip-gpu-data-loading') + + +class SkipGpuProcessPage(gpu_test_base.PageBase): + + def __init__(self, story_set, expectations): + super(SkipGpuProcessPage, self).__init__( + url='chrome:gpu', + name='GpuProcess.skip_gpu_process', + page_set=story_set, + shared_page_state_class=SkipGpuProcessSharedPageState, + expectations=expectations) + + def Validate(self, tab, results): + has_gpu_process_js = 'chrome.gpuBenchmarking.hasGpuProcess()' + has_gpu_process = tab.EvaluateJavaScript(has_gpu_process_js) + if has_gpu_process: + raise page_test.Failure('GPU process detected') + class GpuProcessTestsStorySet(story_set_module.StorySet): """ Tests that accelerated content triggers the creation of a GPU process """ @@ -167,6 +193,7 @@ self.AddStory(GpuInfoCompletePage(self, expectations)) self.AddStory(NoGpuProcessPage(self, expectations)) self.AddStory(SoftwareGpuProcessPage(self, expectations)) + self.AddStory(SkipGpuProcessPage(self, expectations)) @property def allow_mixed_story_states(self):
diff --git a/content/test/render_thread_impl_browser_test_ipc_helper.cc b/content/test/render_thread_impl_browser_test_ipc_helper.cc index 1577bb4..241ec1c 100644 --- a/content/test/render_thread_impl_browser_test_ipc_helper.cc +++ b/content/test/render_thread_impl_browser_test_ipc_helper.cc
@@ -5,6 +5,7 @@ #include "content/test/render_thread_impl_browser_test_ipc_helper.h" #include "content/common/mojo/channel_init.h" +#include "content/public/common/mojo_channel_switches.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { @@ -23,7 +24,7 @@ SetupIpcThread(); - if (IPC::ChannelMojo::ShouldBeUsed()) { + if (ShouldUseMojoChannel()) { SetupMojo(); } else { channel_ = IPC::ChannelProxy::Create(channel_id_, IPC::Channel::MODE_SERVER, @@ -50,9 +51,11 @@ mojo_application_host_->OverrideIOTaskRunnerForTest( ipc_thread_->task_runner()); + mojo::MessagePipe pipe; channel_ = IPC::ChannelProxy::Create( - IPC::ChannelMojo::CreateServerFactory(channel_id_), dummy_listener_.get(), - ipc_thread_->task_runner()); + IPC::ChannelMojo::CreateServerFactory(std::move(pipe.handle0)), + dummy_listener_.get(), ipc_thread_->task_runner()); + message_pipe_handle_ = std::move(pipe.handle1); mojo_application_host_->Init(); mojo_application_host_->Activate(channel_.get(),
diff --git a/content/test/render_thread_impl_browser_test_ipc_helper.h b/content/test/render_thread_impl_browser_test_ipc_helper.h index 1a534ad..b0816515 100644 --- a/content/test/render_thread_impl_browser_test_ipc_helper.h +++ b/content/test/render_thread_impl_browser_test_ipc_helper.h
@@ -34,6 +34,10 @@ scoped_refptr<base::SingleThreadTaskRunner> GetIOTaskRunner() const; + mojo::MessagePipeHandle GetMessagePipeHandle() { + return message_pipe_handle_.release(); + } + private: class DummyListener; @@ -46,6 +50,7 @@ scoped_ptr<DummyListener> dummy_listener_; scoped_ptr<IPC::ScopedIPCSupport> ipc_support_; scoped_ptr<MojoApplicationHost> mojo_application_host_; + mojo::ScopedMessagePipeHandle message_pipe_handle_; std::string channel_id_; };
diff --git a/device/bluetooth/bluetooth_adapter_bluez.h b/device/bluetooth/bluetooth_adapter_bluez.h index 4f847a55..3d402d4f 100644 --- a/device/bluetooth/bluetooth_adapter_bluez.h +++ b/device/bluetooth/bluetooth_adapter_bluez.h
@@ -46,8 +46,8 @@ class BluetoothRemoteGattDescriptorBlueZ; class BluetoothRemoteGattServiceBlueZ; -// The BluetoothAdapterBlueZ class implements BluetoothAdapter for the -// Chrome OS platform. +// The BluetoothAdapterBlueZ class implements BluetoothAdapter for platforms +// that use BlueZ. // // All methods are called from the dbus origin / UI thread and are generally // not assumed to be thread-safe.
diff --git a/device/bluetooth/bluetooth_advertisement_bluez.h b/device/bluetooth/bluetooth_advertisement_bluez.h index bde8cc8..f72b2459 100644 --- a/device/bluetooth/bluetooth_advertisement_bluez.h +++ b/device/bluetooth/bluetooth_advertisement_bluez.h
@@ -20,7 +20,7 @@ class BluetoothAdapterBlueZ; // The BluetoothAdvertisementBlueZ class implements BluetoothAdvertisement -// for the Chrome OS platform. +// for platforms that use BlueZ. class DEVICE_BLUETOOTH_EXPORT BluetoothAdvertisementBlueZ : public device::BluetoothAdvertisement, public bluez::BluetoothLEAdvertisementServiceProvider::Delegate {
diff --git a/device/bluetooth/bluetooth_bluez_unittest.cc b/device/bluetooth/bluetooth_bluez_unittest.cc index f2823dd..5186bdc 100644 --- a/device/bluetooth/bluetooth_bluez_unittest.cc +++ b/device/bluetooth/bluetooth_bluez_unittest.cc
@@ -4164,10 +4164,9 @@ EXPECT_EQ(0, callback_count_); EXPECT_EQ(1, error_callback_count_--) << "RegisterAudioSink error"; - BluetoothAdapterBlueZ* adapter_chrome_os = + BluetoothAdapterBlueZ* adapter_bluez = static_cast<BluetoothAdapterBlueZ*>(adapter_.get()); - EXPECT_EQ(nullptr, - adapter_chrome_os->GetDeviceWithPath(dbus::ObjectPath(""))); + EXPECT_EQ(nullptr, adapter_bluez->GetDeviceWithPath(dbus::ObjectPath(""))); // Notify methods presume objects exist that are owned by the adapter and // destroyed in Shutdown(). Mocks are not attempted here that won't exist, @@ -4184,12 +4183,12 @@ // NotifyGattCharacteristicValueChanged // NotifyGattDescriptorValueChanged - EXPECT_EQ(dbus::ObjectPath(""), adapter_chrome_os->object_path()); + EXPECT_EQ(dbus::ObjectPath(""), adapter_bluez->object_path()); adapter_profile_ = nullptr; FakeBluetoothProfileServiceProviderDelegate profile_delegate; - adapter_chrome_os->UseProfile( + adapter_bluez->UseProfile( BluetoothUUID(), dbus::ObjectPath(""), bluez::BluetoothProfileManagerClient::Options(), &profile_delegate, base::Bind(&BluetoothBlueZTest::ProfileRegisteredCallback, @@ -4203,25 +4202,25 @@ // Protected and private methods: - adapter_chrome_os->RemovePairingDelegateInternal(&pairing_delegate); + adapter_bluez->RemovePairingDelegateInternal(&pairing_delegate); // AdapterAdded() invalid post Shutdown because it calls SetAdapter. - adapter_chrome_os->AdapterRemoved(dbus::ObjectPath("x")); - adapter_chrome_os->AdapterPropertyChanged(dbus::ObjectPath("x"), ""); - adapter_chrome_os->DeviceAdded(dbus::ObjectPath("")); - adapter_chrome_os->DeviceRemoved(dbus::ObjectPath("")); - adapter_chrome_os->DevicePropertyChanged(dbus::ObjectPath(""), ""); - adapter_chrome_os->InputPropertyChanged(dbus::ObjectPath(""), ""); + adapter_bluez->AdapterRemoved(dbus::ObjectPath("x")); + adapter_bluez->AdapterPropertyChanged(dbus::ObjectPath("x"), ""); + adapter_bluez->DeviceAdded(dbus::ObjectPath("")); + adapter_bluez->DeviceRemoved(dbus::ObjectPath("")); + adapter_bluez->DevicePropertyChanged(dbus::ObjectPath(""), ""); + adapter_bluez->InputPropertyChanged(dbus::ObjectPath(""), ""); // bluez::BluetoothAgentServiceProvider::Delegate omitted, dbus will be // shutdown, // with the exception of Released. - adapter_chrome_os->Released(); + adapter_bluez->Released(); - adapter_chrome_os->OnRegisterAgent(); - adapter_chrome_os->OnRegisterAgentError("", ""); - adapter_chrome_os->OnRequestDefaultAgent(); - adapter_chrome_os->OnRequestDefaultAgentError("", ""); + adapter_bluez->OnRegisterAgent(); + adapter_bluez->OnRegisterAgentError("", ""); + adapter_bluez->OnRequestDefaultAgent(); + adapter_bluez->OnRequestDefaultAgentError("", ""); - adapter_chrome_os->OnRegisterAudioSink( + adapter_bluez->OnRegisterAudioSink( base::Bind(&BluetoothBlueZTest::AudioSinkAcquiredCallback, base::Unretained(this)), base::Bind(&BluetoothBlueZTest::AudioSinkErrorCallback, @@ -4234,27 +4233,27 @@ // SetAdapter will DCHECK after Shutdown(). // SetDefaultAdapterName will DCHECK after Shutdown(). // RemoveAdapter will DCHECK after Shutdown(). - adapter_chrome_os->PoweredChanged(false); - adapter_chrome_os->DiscoverableChanged(false); - adapter_chrome_os->DiscoveringChanged(false); - adapter_chrome_os->PresentChanged(false); + adapter_bluez->PoweredChanged(false); + adapter_bluez->DiscoverableChanged(false); + adapter_bluez->DiscoveringChanged(false); + adapter_bluez->PresentChanged(false); - adapter_chrome_os->OnSetDiscoverable(GetCallback(), GetErrorCallback(), true); + adapter_bluez->OnSetDiscoverable(GetCallback(), GetErrorCallback(), true); EXPECT_EQ(0, callback_count_) << "OnSetDiscoverable error"; EXPECT_EQ(1, error_callback_count_--) << "OnSetDiscoverable error"; - adapter_chrome_os->OnPropertyChangeCompleted(GetCallback(), - GetErrorCallback(), true); + adapter_bluez->OnPropertyChangeCompleted(GetCallback(), GetErrorCallback(), + true); EXPECT_EQ(0, callback_count_) << "OnPropertyChangeCompleted error"; EXPECT_EQ(1, error_callback_count_--) << "OnPropertyChangeCompleted error"; - adapter_chrome_os->AddDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->AddDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); EXPECT_EQ(0, callback_count_) << "AddDiscoverySession error"; EXPECT_EQ(1, error_callback_count_--) << "AddDiscoverySession error"; - adapter_chrome_os->RemoveDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->RemoveDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); EXPECT_EQ(0, callback_count_) << "RemoveDiscoverySession error"; EXPECT_EQ(1, error_callback_count_--) << "RemoveDiscoverySession error"; @@ -4267,7 +4266,7 @@ // OnRegisterProfile SetProfileDelegate, OnRegisterProfileError, require // UseProfile to be set first, do so again here just before calling them. - adapter_chrome_os->UseProfile( + adapter_bluez->UseProfile( BluetoothUUID(), dbus::ObjectPath(""), bluez::BluetoothProfileManagerClient::Options(), &profile_delegate, base::Bind(&BluetoothBlueZTest::ProfileRegisteredCallback, @@ -4279,7 +4278,7 @@ EXPECT_EQ(0, callback_count_) << "UseProfile error"; EXPECT_EQ(1, error_callback_count_--) << "UseProfile error"; - adapter_chrome_os->SetProfileDelegate( + adapter_bluez->SetProfileDelegate( BluetoothUUID(), dbus::ObjectPath(""), &profile_delegate, base::Bind(&BluetoothBlueZTest::ProfileRegisteredCallback, base::Unretained(this)), @@ -4288,11 +4287,11 @@ EXPECT_EQ(0, callback_count_) << "SetProfileDelegate error"; EXPECT_EQ(1, error_callback_count_--) << "SetProfileDelegate error"; - adapter_chrome_os->OnRegisterProfileError(BluetoothUUID(), "", ""); + adapter_bluez->OnRegisterProfileError(BluetoothUUID(), "", ""); EXPECT_EQ(0, callback_count_) << "OnRegisterProfileError error"; EXPECT_EQ(0, error_callback_count_) << "OnRegisterProfileError error"; - adapter_chrome_os->ProcessQueuedDiscoveryRequests(); + adapter_bluez->ProcessQueuedDiscoveryRequests(); // From BluetoothAdapater: @@ -4317,16 +4316,15 @@ TEST_F(BluetoothBlueZTest, Shutdown_OnStartDiscovery) { const int kNumberOfDiscoverySessions = 10; GetAdapter(); - BluetoothAdapterBlueZ* adapter_chrome_os = + BluetoothAdapterBlueZ* adapter_bluez = static_cast<BluetoothAdapterBlueZ*>(adapter_.get()); for (int i = 0; i < kNumberOfDiscoverySessions; i++) { - adapter_chrome_os->AddDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->AddDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); } adapter_->Shutdown(); - adapter_chrome_os->OnStartDiscovery(GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->OnStartDiscovery(GetCallback(), GetDiscoveryErrorCallback()); EXPECT_EQ(0, callback_count_); EXPECT_EQ(kNumberOfDiscoverySessions, error_callback_count_); @@ -4336,16 +4334,16 @@ TEST_F(BluetoothBlueZTest, Shutdown_OnStartDiscoveryError) { const int kNumberOfDiscoverySessions = 10; GetAdapter(); - BluetoothAdapterBlueZ* adapter_chrome_os = + BluetoothAdapterBlueZ* adapter_bluez = static_cast<BluetoothAdapterBlueZ*>(adapter_.get()); for (int i = 0; i < kNumberOfDiscoverySessions; i++) { - adapter_chrome_os->AddDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->AddDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); } adapter_->Shutdown(); - adapter_chrome_os->OnStartDiscoveryError(GetCallback(), - GetDiscoveryErrorCallback(), "", ""); + adapter_bluez->OnStartDiscoveryError(GetCallback(), + GetDiscoveryErrorCallback(), "", ""); EXPECT_EQ(0, callback_count_); EXPECT_EQ(kNumberOfDiscoverySessions, error_callback_count_); @@ -4355,26 +4353,25 @@ TEST_F(BluetoothBlueZTest, Shutdown_OnStopDiscovery) { const int kNumberOfDiscoverySessions = 10; GetAdapter(); - BluetoothAdapterBlueZ* adapter_chrome_os = + BluetoothAdapterBlueZ* adapter_bluez = static_cast<BluetoothAdapterBlueZ*>(adapter_.get()); // In order to queue up discovery sessions before an OnStopDiscovery call // RemoveDiscoverySession must be called, so Add, Start, and Remove: - adapter_chrome_os->AddDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); - adapter_chrome_os->OnStartDiscovery(GetCallback(), - GetDiscoveryErrorCallback()); - adapter_chrome_os->RemoveDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->AddDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); + adapter_bluez->OnStartDiscovery(GetCallback(), GetDiscoveryErrorCallback()); + adapter_bluez->RemoveDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); callback_count_ = 0; error_callback_count_ = 0; // Can now queue discovery sessions while waiting for OnStopDiscovery. for (int i = 0; i < kNumberOfDiscoverySessions; i++) { - adapter_chrome_os->AddDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->AddDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); } adapter_->Shutdown(); - adapter_chrome_os->OnStopDiscovery(GetCallback()); + adapter_bluez->OnStopDiscovery(GetCallback()); // 1 successful stopped discovery from RemoveDiscoverySession, and // kNumberOfDiscoverySessions errors from AddDiscoverySession/OnStopDiscovery. @@ -4386,26 +4383,25 @@ TEST_F(BluetoothBlueZTest, Shutdown_OnStopDiscoveryError) { const int kNumberOfDiscoverySessions = 10; GetAdapter(); - BluetoothAdapterBlueZ* adapter_chrome_os = + BluetoothAdapterBlueZ* adapter_bluez = static_cast<BluetoothAdapterBlueZ*>(adapter_.get()); // In order to queue up discovery sessions before an OnStopDiscoveryError call // RemoveDiscoverySession must be called, so Add, Start, and Remove: - adapter_chrome_os->AddDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); - adapter_chrome_os->OnStartDiscovery(GetCallback(), - GetDiscoveryErrorCallback()); - adapter_chrome_os->RemoveDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->AddDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); + adapter_bluez->OnStartDiscovery(GetCallback(), GetDiscoveryErrorCallback()); + adapter_bluez->RemoveDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); callback_count_ = 0; error_callback_count_ = 0; // Can now queue discovery sessions while waiting for OnStopDiscoveryError. for (int i = 0; i < kNumberOfDiscoverySessions; i++) { - adapter_chrome_os->AddDiscoverySession(nullptr, GetCallback(), - GetDiscoveryErrorCallback()); + adapter_bluez->AddDiscoverySession(nullptr, GetCallback(), + GetDiscoveryErrorCallback()); } adapter_->Shutdown(); - adapter_chrome_os->OnStopDiscoveryError(GetDiscoveryErrorCallback(), "", ""); + adapter_bluez->OnStopDiscoveryError(GetDiscoveryErrorCallback(), "", ""); // 1 error reported to RemoveDiscoverySession because of OnStopDiscoveryError, // and kNumberOfDiscoverySessions errors queued with AddDiscoverySession.
diff --git a/device/bluetooth/bluetooth_gatt_connection_bluez.h b/device/bluetooth/bluetooth_gatt_connection_bluez.h index e9bee29..1ea0a32 100644 --- a/device/bluetooth/bluetooth_gatt_connection_bluez.h +++ b/device/bluetooth/bluetooth_gatt_connection_bluez.h
@@ -22,8 +22,8 @@ namespace bluez { -// BluetoothGattConnectionBlueZ implements BluetoothGattConnection for the -// Chrome OS platform. +// BluetoothGattConnectionBlueZ implements BluetoothGattConnection for +// platforms that use BlueZ. class BluetoothGattConnectionBlueZ : public device::BluetoothGattConnection, public bluez::BluetoothDeviceClient::Observer {
diff --git a/device/bluetooth/bluetooth_gatt_notify_session_bluez.h b/device/bluetooth/bluetooth_gatt_notify_session_bluez.h index 4c99d47..88336d8 100644 --- a/device/bluetooth/bluetooth_gatt_notify_session_bluez.h +++ b/device/bluetooth/bluetooth_gatt_notify_session_bluez.h
@@ -23,7 +23,7 @@ class BluetoothRemoteGattCharacteristicBlueZ; // BluetoothGattNotifySessionBlueZ implements -// BluetoothGattNotifySession for the Chrome OS platform. +// BluetoothGattNotifySession for platforms that use BlueZ. class BluetoothGattNotifySessionBlueZ : public device::BluetoothGattNotifySession, public bluez::BluetoothGattCharacteristicClient::Observer {
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_bluez.h b/device/bluetooth/bluetooth_remote_gatt_characteristic_bluez.h index 9976975..e46ddf9 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_bluez.h +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_bluez.h
@@ -34,8 +34,8 @@ class BluetoothRemoteGattServiceBlueZ; // The BluetoothRemoteGattCharacteristicBlueZ class implements -// BluetoothGattCharacteristic for remote GATT characteristics on the Chrome OS -// platform. +// BluetoothGattCharacteristic for remote GATT characteristics for platforms +// that use BlueZ. class BluetoothRemoteGattCharacteristicBlueZ : public device::BluetoothGattCharacteristic, public bluez::BluetoothGattDescriptorClient::Observer { @@ -134,7 +134,7 @@ bool notify_call_pending_; // Mapping from GATT descriptor object paths to descriptor objects owned by - // this characteristic. Since the Chrome OS implementation uses object paths + // this characteristic. Since the BlueZ implementation uses object paths // as unique identifiers, we also use this mapping to return descriptors by // identifier. typedef std::map<dbus::ObjectPath, BluetoothRemoteGattDescriptorBlueZ*>
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_bluez.h b/device/bluetooth/bluetooth_remote_gatt_descriptor_bluez.h index 9af09136..fab4f7c 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_bluez.h +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_bluez.h
@@ -27,8 +27,8 @@ class BluetoothRemoteGattCharacteristicBlueZ; // The BluetoothRemoteGattDescriptorBlueZ class implements -// BluetoothGattDescriptor for remote GATT characteristic descriptors on the -// Chrome OS platform. +// BluetoothGattDescriptor for remote GATT characteristic descriptors for +// platforms that use BlueZ. class BluetoothRemoteGattDescriptorBlueZ : public device::BluetoothGattDescriptor { public:
diff --git a/device/bluetooth/bluetooth_remote_gatt_service_bluez.h b/device/bluetooth/bluetooth_remote_gatt_service_bluez.h index 483db24d..20aaffae 100644 --- a/device/bluetooth/bluetooth_remote_gatt_service_bluez.h +++ b/device/bluetooth/bluetooth_remote_gatt_service_bluez.h
@@ -36,7 +36,7 @@ class BluetoothRemoteGattDescriptorBlueZ; // The BluetoothRemoteGattServiceBlueZ class implements BluetootGattService -// for remote GATT services on the Chrome OS platform. +// for remote GATT services for platforms that use BlueZ. class BluetoothRemoteGattServiceBlueZ : public device::BluetoothGattService, public bluez::BluetoothGattServiceClient::Observer, @@ -130,7 +130,7 @@ BluetoothDeviceBlueZ* device_; // Mapping from GATT characteristic object paths to characteristic objects. - // owned by this service. Since the Chrome OS implementation uses object + // owned by this service. Since the BlueZ implementation uses object // paths as unique identifiers, we also use this mapping to return // characteristics by identifier. CharacteristicMap characteristics_;
diff --git a/device/bluetooth/bluetooth_socket_bluez.h b/device/bluetooth/bluetooth_socket_bluez.h index b1870ab..a1b2a51 100644 --- a/device/bluetooth/bluetooth_socket_bluez.h +++ b/device/bluetooth/bluetooth_socket_bluez.h
@@ -30,8 +30,8 @@ class BluetoothAdapterBlueZ; class BluetoothAdapterProfileBlueZ; -// The BluetoothSocketBlueZ class implements BluetoothSocket for the -// Chrome OS platform. +// The BluetoothSocketBlueZ class implements BluetoothSocket for platforms that +// use BlueZ. // // This class is not thread-safe, but is only called from the UI thread. class DEVICE_BLUETOOTH_EXPORT BluetoothSocketBlueZ
diff --git a/docs/closure_compilation.md b/docs/closure_compilation.md index 931029c..2c8fdcd 100644 --- a/docs/closure_compilation.md +++ b/docs/closure_compilation.md
@@ -2,21 +2,43 @@ ## I just need to fix the compile! -To locally run closure compiler like the bots, do this: +### Pre-requisites +You'll need Java 7 (preferably the OpenJDK version). To install on Ubuntu: ```shell -cd $CHROMIUM_SRC -# sudo apt-get install openjdk-7-jre # may be required -GYP_GENERATORS=ninja tools/gyp/gyp --depth . third_party/closure_compiler/compiled_resources.gyp -ninja -C out/Default +sudo apt-get install openjdk-7-jre ``` -To run the v2 gyp format, change the last 2 lines to: +On Mac or Windows, visit: +[http://www.oracle.com/technetwork/java/javase/downloads/index.html](http://www.oracle.com/technetwork/java/javase/downloads/index.html) +### Using ninja to compile the code + +We use GYP and ninja as our build system. To generate the ninja files from GYP: ```shell -# notice the 2 in compiled_resources2.gyp +# notice the 2 in compiled_resources.gyp GYP_GENERATORS=ninja tools/gyp/gyp --depth . third_party/closure_compiler/compiled_resources2.gyp -ninja -C out/Default +``` + +To compile the JavaScript: +```shell +ninja -C out/Default -j4 +``` + +The output should look something like this: +```shell +ninja: Entering directory `out/Default/' +[30/106] ACTION Compiling chrome/browser/resources/md_history/constants.js +``` + +To generate and run the **deprecated** v1 gyp format, remove the "2" from "compiled_resources2.gyp": +```shell +$ GYP_GENERATORS=ninja tools/gyp/gyp --depth . third_party/closure_compiler/compiled_resources.gyp +``` + +Compiling works the same way for both v1 and v2 systems: +```shell +ninja -C out/Default -j4 ``` ## Background
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc index a9bd739..b8368546 100644 --- a/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc +++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc
@@ -155,7 +155,7 @@ std::pair<int, scoped_ptr<base::Timer>>( ++timer_id_, std::move(timer))); DCHECK(insert_ret.second); - timer->Start(FROM_HERE, + insert_ret.first->second->Start(FROM_HERE, base::TimeDelta::FromSeconds(seconds), base::Bind(&wds::Source::OnTimerEvent, base::Unretained(wfd_source_.get()),
diff --git a/extensions/renderer/content_watcher.cc b/extensions/renderer/content_watcher.cc index 95c8a57e..8c99e11 100644 --- a/extensions/renderer/content_watcher.cc +++ b/extensions/renderer/content_watcher.cc
@@ -89,10 +89,10 @@ void ContentWatcher::NotifyBrowserOfChange( blink::WebLocalFrame* changed_frame) const { blink::WebFrame* const top_frame = changed_frame->top(); - const blink::WebSecurityOrigin top_origin = top_frame->securityOrigin(); + const blink::WebSecurityOrigin top_origin = top_frame->getSecurityOrigin(); // Want to aggregate matched selectors from all frames where an // extension with access to top_origin could run on the frame. - if (!top_origin.canAccess(changed_frame->document().securityOrigin())) { + if (!top_origin.canAccess(changed_frame->document().getSecurityOrigin())) { // If the changed frame can't be accessed by the top frame, then // no change in it could affect the set of selectors we'd send back. return; @@ -101,7 +101,7 @@ std::set<base::StringPiece> transitive_selectors; for (blink::WebFrame* frame = top_frame; frame; frame = frame->traverseNext(/*wrap=*/false)) { - if (top_origin.canAccess(frame->securityOrigin())) { + if (top_origin.canAccess(frame->getSecurityOrigin())) { std::map<blink::WebFrame*, std::set<std::string> >::const_iterator frame_selectors = matching_selectors_.find(frame); if (frame_selectors != matching_selectors_.end()) {
diff --git a/extensions/renderer/extension_frame_helper.cc b/extensions/renderer/extension_frame_helper.cc index c063f84a..300e16e8 100644 --- a/extensions/renderer/extension_frame_helper.cc +++ b/extensions/renderer/extension_frame_helper.cc
@@ -44,7 +44,7 @@ // This logic matches ExtensionWebContentsObserver::GetExtensionFromFrame. blink::WebSecurityOrigin origin = - frame_helper->render_frame()->GetWebFrame()->securityOrigin(); + frame_helper->render_frame()->GetWebFrame()->getSecurityOrigin(); if (origin.isUnique() || !base::EqualsASCII(base::StringPiece16(origin.protocol()), kExtensionScheme) ||
diff --git a/extensions/renderer/extension_injection_host.cc b/extensions/renderer/extension_injection_host.cc index 8e0d9b3c..6e5b042 100644 --- a/extensions/renderer/extension_injection_host.cc +++ b/extensions/renderer/extension_injection_host.cc
@@ -51,7 +51,7 @@ int tab_id, bool is_declarative) const { blink::WebSecurityOrigin top_frame_security_origin = - render_frame->GetWebFrame()->top()->securityOrigin(); + render_frame->GetWebFrame()->top()->getSecurityOrigin(); // Only whitelisted extensions may run scripts on another extension's page. if (top_frame_security_origin.protocol().utf8() == kExtensionScheme && top_frame_security_origin.host().utf8() != extension_->id() &&
diff --git a/extensions/renderer/programmatic_script_injector.cc b/extensions/renderer/programmatic_script_injector.cc index e19a4c98..eea394b 100644 --- a/extensions/renderer/programmatic_script_injector.cc +++ b/extensions/renderer/programmatic_script_injector.cc
@@ -34,7 +34,7 @@ finished_(false) { if (url_.SchemeIs(url::kAboutScheme)) { origin_for_about_error_ = - render_frame->GetWebFrame()->securityOrigin().toString().utf8(); + render_frame->GetWebFrame()->getSecurityOrigin().toString().utf8(); } }
diff --git a/extensions/renderer/script_context.cc b/extensions/renderer/script_context.cc index abf38d4..f6f47f33 100644 --- a/extensions/renderer/script_context.cc +++ b/extensions/renderer/script_context.cc
@@ -292,8 +292,8 @@ if (parent && !parent->document().isNull()) { // Only return the parent URL if the frame can access it. const blink::WebDocument& parent_document = parent->document(); - if (frame->document().securityOrigin().canAccess( - parent_document.securityOrigin())) { + if (frame->document().getSecurityOrigin().canAccess( + parent_document.getSecurityOrigin())) { return parent_document.url(); } }
diff --git a/extensions/renderer/script_context.h b/extensions/renderer/script_context.h index b59a97f..48c873ce 100644 --- a/extensions/renderer/script_context.h +++ b/extensions/renderer/script_context.h
@@ -133,7 +133,7 @@ // Get the URL of this context's web frame. // // TODO(kalman): Remove this and replace with a GetOrigin() call which reads - // of WebDocument::securityOrigin(): + // of WebDocument::getSecurityOrigin(): // - The URL can change (e.g. pushState) but the origin cannot. Luckily it // appears as though callers don't make security decisions based on the // result of url() so it's not a problem... yet.
diff --git a/extensions/renderer/script_context_set.cc b/extensions/renderer/script_context_set.cc index 18f367c..35a05b6 100644 --- a/extensions/renderer/script_context_set.cc +++ b/extensions/renderer/script_context_set.cc
@@ -45,11 +45,11 @@ GURL frame_url = ScriptContext::GetDataSourceURLForFrame(frame); Feature::Context context_type = ClassifyJavaScriptContext(extension, extension_group, frame_url, - frame->document().securityOrigin()); + frame->document().getSecurityOrigin()); Feature::Context effective_context_type = ClassifyJavaScriptContext( effective_extension, extension_group, ScriptContext::GetEffectiveDocumentURL(frame, frame_url, true), - frame->document().securityOrigin()); + frame->document().getSecurityOrigin()); ScriptContext* context = new ScriptContext(v8_context, frame, extension, context_type,
diff --git a/extensions/strings/extensions_strings_es.xtb b/extensions/strings/extensions_strings_es.xtb index 141fae4b..30d9f92e 100644 --- a/extensions/strings/extensions_strings_es.xtb +++ b/extensions/strings/extensions_strings_es.xtb
@@ -49,7 +49,7 @@ <translation id="8341840687457896278">Esta extensión no ha podido proporcionar credenciales a una solicitud de red porque otra extensión (<ph name="EXTENSION_NAME" />) ha proporcionado otras credenciales.</translation> <translation id="8602184400052594090">Falta el archivo de manifiesto o no se puede leer.</translation> <translation id="8636666366616799973">El paquete no es válido. Detalles: "<ph name="ERROR_MESSAGE" />"</translation> -<translation id="8670869118777164560">Esta extensión no ha podido redireccionar una solicitud de red a <ph name="ATTEMPTED_REDIRECT_DESTINATION" /> porque otra extensión (<ph name="EXTENSION_NAME" />) la ha redireccionado a <ph name="ACTUAL_REDIRECT_DESTINATION" />.</translation> +<translation id="8670869118777164560">Esta extensión no ha podido redirigir una solicitud de red a <ph name="ATTEMPTED_REDIRECT_DESTINATION" /> porque otra extensión (<ph name="EXTENSION_NAME" />) la ha redireccionado a <ph name="ACTUAL_REDIRECT_DESTINATION" />.</translation> <translation id="8712265948125780616">Descompresor de extensiones</translation> <translation id="8825366169884721447">Esta extensión no ha podido modificar el encabezado de solicitud "<ph name="HEADER_NAME" />" de una solicitud de red porque la modificación ha entrado en conflicto con otra extensión (<ph name="EXTENSION_NAME" />).</translation> <translation id="9111791539553342076">Esta extensión no ha podido modificar el encabezado de respuesta "<ph name="HEADER_NAME" />" de una solicitud de red porque la modificación ha entrado en conflicto con otra extensión (<ph name="EXTENSION_NAME" />).</translation>
diff --git a/extensions/strings/extensions_strings_fa.xtb b/extensions/strings/extensions_strings_fa.xtb index c80c4f1..8c1d5ea 100644 --- a/extensions/strings/extensions_strings_fa.xtb +++ b/extensions/strings/extensions_strings_fa.xtb
@@ -23,7 +23,7 @@ <translation id="4233778200880751280">صفحه درباره «<ph name="ABOUT_PAGE" />» بارگیری نشد.</translation> <translation id="4434145631756268951">{0,select, single{انتخاب دستگاه USB}multiple{انتخاب دستگاههای USB}other{UNUSED}}</translation> <translation id="4811956658694082538">بسته نصب نشد چون پردازش برنامه سودمند انجام نشد. سعی کنید chrome را راهاندازی مجدد نمایید و دوباره امتحان کنید.</translation> -<translation id="5026754133087629784">نمای وب: <ph name="WEBVIEW_TAG_NAME" /></translation> +<translation id="5026754133087629784">وبنما: <ph name="WEBVIEW_TAG_NAME" /></translation> <translation id="5356315618422219272">Appview: <ph name="APPVIEW_TAG_NAME" /></translation> <translation id="5456409301717116725">این برنامهٔ افزودنی شامل فایل کلید «<ph name="KEY_PATH" />» است. احتمالاً نمیخواهید این کار را انجام دهید.</translation> <translation id="5627523580512561598">برنامهٔ افزودنی <ph name="EXTENSION_NAME" /></translation>
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index aeaa5655..3c8586b 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -958,6 +958,12 @@ case GL_NUM_PROGRAM_BINARY_FORMATS: *params = capabilities_.num_program_binary_formats; return true; + case GL_PACK_SKIP_PIXELS: + *params = pack_skip_pixels_; + return true; + case GL_PACK_SKIP_ROWS: + *params = pack_skip_rows_; + return true; case GL_PIXEL_PACK_BUFFER_BINDING: *params = bound_pixel_pack_buffer_; return true; @@ -973,6 +979,15 @@ case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = capabilities_.uniform_buffer_offset_alignment; return true; + case GL_UNPACK_SKIP_IMAGES: + *params = unpack_skip_images_; + return true; + case GL_UNPACK_SKIP_PIXELS: + *params = unpack_skip_pixels_; + return true; + case GL_UNPACK_SKIP_ROWS: + *params = unpack_skip_rows_; + return true; // Non-cached ES3 parameters. case GL_DRAW_BUFFER0: @@ -994,8 +1009,6 @@ case GL_DRAW_FRAMEBUFFER_BINDING: case GL_FRAGMENT_SHADER_DERIVATIVE_HINT: case GL_PACK_ROW_LENGTH: - case GL_PACK_SKIP_PIXELS: - case GL_PACK_SKIP_ROWS: case GL_PRIMITIVE_RESTART_FIXED_INDEX: case GL_PROGRAM_BINARY_FORMATS: case GL_RASTERIZER_DISCARD: @@ -1013,9 +1026,6 @@ case GL_UNIFORM_BUFFER_START: case GL_UNPACK_IMAGE_HEIGHT: case GL_UNPACK_ROW_LENGTH: - case GL_UNPACK_SKIP_IMAGES: - case GL_UNPACK_SKIP_PIXELS: - case GL_UNPACK_SKIP_ROWS: case GL_VERTEX_ARRAY_BINDING: return false; default: @@ -1764,6 +1774,45 @@ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPixelStorei(" << GLES2Util::GetStringPixelStore(pname) << ", " << param << ")"); + // We have to validate before caching these parameters because we use them + // to compute image sizes on the client side. + switch (pname) { + case GL_PACK_ALIGNMENT: + case GL_UNPACK_ALIGNMENT: + if (param != 1 && param != 2 && param != 4 && param != 8) { + SetGLError(GL_INVALID_VALUE, "glPixelStorei", "invalid param"); + return; + } + break; + case GL_PACK_ROW_LENGTH: + case GL_PACK_SKIP_PIXELS: + case GL_PACK_SKIP_ROWS: + case GL_UNPACK_IMAGE_HEIGHT: + case GL_UNPACK_SKIP_IMAGES: + if (capabilities_.major_version < 3) { + SetGLError(GL_INVALID_ENUM, "glPixelStorei", "invalid pname"); + return; + } + if (param < 0) { + SetGLError(GL_INVALID_VALUE, "glPixelStorei", "invalid param"); + return; + } + break; + case GL_UNPACK_ROW_LENGTH: + case GL_UNPACK_SKIP_ROWS: + case GL_UNPACK_SKIP_PIXELS: + // These parameters are always enabled in ES2 by EXT_unpack_subimage. + if (param < 0) { + SetGLError(GL_INVALID_VALUE, "glPixelStorei", "invalid param"); + return; + } + break; + default: + SetGLError(GL_INVALID_ENUM, "glPixelStorei", "invalid pname"); + return; + } + // Do not send SKIP parameters to the service side. + // Handle them on the client side. switch (pname) { case GL_PACK_ALIGNMENT: pack_alignment_ = param; @@ -1773,29 +1822,35 @@ break; case GL_PACK_SKIP_PIXELS: pack_skip_pixels_ = param; - break; + return; case GL_PACK_SKIP_ROWS: pack_skip_rows_ = param; - break; + return; case GL_UNPACK_ALIGNMENT: unpack_alignment_ = param; break; - case GL_UNPACK_ROW_LENGTH_EXT: + case GL_UNPACK_ROW_LENGTH: unpack_row_length_ = param; + if (capabilities_.major_version < 3) { + // In ES2 with EXT_unpack_subimage, it's handled on the client side + // and there is no need to send it to the service side. + return; + } break; case GL_UNPACK_IMAGE_HEIGHT: unpack_image_height_ = param; break; - case GL_UNPACK_SKIP_ROWS_EXT: + case GL_UNPACK_SKIP_ROWS: unpack_skip_rows_ = param; - break; - case GL_UNPACK_SKIP_PIXELS_EXT: + return; + case GL_UNPACK_SKIP_PIXELS: unpack_skip_pixels_ = param; - break; + return; case GL_UNPACK_SKIP_IMAGES: unpack_skip_images_ = param; - break; + return; default: + NOTREACHED(); break; } helper_->PixelStorei(pname, param); @@ -3547,14 +3602,6 @@ TRACE_EVENT0("gpu", "GLES2::ReadPixels"); typedef cmds::ReadPixels::Result Result; - if (bound_pixel_pack_buffer_) { - GLuint offset = ToGLuint(pixels); - helper_->ReadPixels( - xoffset, yoffset, width, height, format, type, 0, offset, 0, 0, false); - CheckGLError(); - return; - } - uint32_t size; uint32_t unpadded_row_size; uint32_t padded_row_size; @@ -3575,6 +3622,20 @@ SetGLError(GL_INVALID_VALUE, "glReadPixels", "size too large."); return; } + + if (bound_pixel_pack_buffer_) { + base::CheckedNumeric<GLuint> offset = ToGLuint(pixels); + offset += skip_size; + if (!offset.IsValid()) { + SetGLError(GL_INVALID_VALUE, "glReadPixels", "skip size too large."); + return; + } + helper_->ReadPixels(xoffset, yoffset, width, height, format, type, 0, + offset.ValueOrDefault(0), 0, 0, false); + CheckGLError(); + return; + } + uint32_t service_padded_row_size = 0; if (pack_row_length_ > 0 && pack_row_length_ != width) { if (!GLES2Util::ComputeImagePaddedRowSize(width, @@ -3600,7 +3661,7 @@ bound_pixel_pack_transfer_buffer_id_, "glReadPixels", offset, size); if (buffer && buffer->shm_id() != -1) { helper_->ReadPixels(xoffset, yoffset, width, height, format, type, - buffer->shm_id(), buffer->shm_offset(), + buffer->shm_id(), buffer->shm_offset() + offset, 0, 0, true); CheckGLError(); }
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc index 8d50686..3bacee23 100644 --- a/gpu/command_buffer/client/gles2_implementation_unittest.cc +++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -2502,7 +2502,7 @@ pixels.get() + kHeight / 2 * padded_row_size, mem2.ptr)); } -TEST_F(GLES2ImplementationTest, SubImageUnpack) { +TEST_F(GLES2ImplementationTest, SubImage2DUnpack) { static const GLint unpack_alignments[] = { 1, 2, 4, 8 }; static const GLenum kFormat = GL_RGB; @@ -2527,58 +2527,84 @@ static const GLint kTexSubYOffset = 103; struct { - cmds::PixelStorei pixel_store_i[4]; + cmds::PixelStorei pixel_store_i; cmds::TexImage2D tex_image_2d; } texImageExpected; struct { - cmds::PixelStorei pixel_store_i[4]; + cmds::PixelStorei pixel_store_i; cmds::TexImage2D tex_image_2d; cmds::TexSubImage2D tex_sub_image_2d; } texSubImageExpected; - uint32_t src_size; - ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( - kSrcWidth, kSrcSubImageY1, 1, kFormat, kType, 8, &src_size, NULL, NULL)); + uint32_t pixel_size; + PixelStoreParams pixel_params; + // Makes sure the pixels size is large enough for all tests. + pixel_params.alignment = 8; + ASSERT_TRUE(GLES2Util::ComputeImageDataSizesES3( + kSrcWidth, kSrcSubImageY1, 1, kFormat, kType, + pixel_params, &pixel_size, nullptr, nullptr, nullptr, nullptr)); scoped_ptr<uint8_t[]> src_pixels; - src_pixels.reset(new uint8_t[src_size]); - for (size_t i = 0; i < src_size; ++i) { - src_pixels[i] = static_cast<int8_t>(i); + src_pixels.reset(new uint8_t[pixel_size]); + for (size_t i = 0; i < pixel_size; ++i) { + src_pixels[i] = static_cast<uint8_t>(i % 255); } for (int sub = 0; sub < 2; ++sub) { for (size_t a = 0; a < arraysize(unpack_alignments); ++a) { - GLint alignment = unpack_alignments[a]; - uint32_t size; - uint32_t unpadded_row_size; - uint32_t padded_row_size; - ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( - kSrcSubImageWidth, kSrcSubImageHeight, 1, kFormat, kType, alignment, - &size, &unpadded_row_size, &padded_row_size)); - ASSERT_TRUE(size <= MaxTransferBufferSize()); - ExpectedMemoryInfo mem = GetExpectedMemory(size); - const void* commands = GetPut(); + + GLint alignment = unpack_alignments[a]; gl_->PixelStorei(GL_UNPACK_ALIGNMENT, alignment); - gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, kSrcWidth); - gl_->PixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, kSrcSubImageX0); - gl_->PixelStorei(GL_UNPACK_SKIP_ROWS_EXT, kSrcSubImageY0); + gl_->PixelStorei(GL_UNPACK_ROW_LENGTH, kSrcWidth); + gl_->PixelStorei(GL_UNPACK_SKIP_PIXELS, kSrcSubImageX0); + gl_->PixelStorei(GL_UNPACK_SKIP_ROWS, kSrcSubImageY0); + + uint32_t client_size; + uint32_t client_unpadded_row_size; + uint32_t client_padded_row_size; + uint32_t client_skip_size; + { + PixelStoreParams params; + params.alignment = alignment; + params.row_length = kSrcWidth; + params.skip_pixels = kSrcSubImageX0; + params.skip_rows = kSrcSubImageY0; + ASSERT_TRUE(GLES2Util::ComputeImageDataSizesES3( + kSrcSubImageWidth, kSrcSubImageHeight, 1, kFormat, kType, params, + &client_size, &client_unpadded_row_size, &client_padded_row_size, + &client_skip_size, nullptr)); + ASSERT_TRUE(client_size + client_skip_size <= pixel_size); + } + + uint32_t service_size; + uint32_t service_unpadded_row_size; + uint32_t service_padded_row_size; + uint32_t service_skip_size; + { + PixelStoreParams params; + // For pixels we send to service side, we already applied all unpack + // parameters except for UNPACK_ALIGNMENT. + params.alignment = alignment; + ASSERT_TRUE(GLES2Util::ComputeImageDataSizesES3( + kSrcSubImageWidth, kSrcSubImageHeight, 1, kFormat, kType, params, + &service_size, &service_unpadded_row_size, &service_padded_row_size, + &service_skip_size, nullptr)); + ASSERT_TRUE(service_size <= MaxTransferBufferSize()); + ASSERT_TRUE(service_skip_size == 0); + ASSERT_TRUE(client_unpadded_row_size == service_unpadded_row_size); + } + + ExpectedMemoryInfo mem = GetExpectedMemory(service_size); if (sub) { gl_->TexImage2D( GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kBorder, - kFormat, kType, NULL); + kFormat, kType, nullptr); gl_->TexSubImage2D( GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, src_pixels.get()); - texSubImageExpected.pixel_store_i[0].Init( - GL_UNPACK_ALIGNMENT, alignment); - texSubImageExpected.pixel_store_i[1].Init( - GL_UNPACK_ROW_LENGTH_EXT, kSrcWidth); - texSubImageExpected.pixel_store_i[2].Init( - GL_UNPACK_SKIP_PIXELS_EXT, kSrcSubImageX0); - texSubImageExpected.pixel_store_i[3].Init( - GL_UNPACK_SKIP_ROWS_EXT, kSrcSubImageY0); + texSubImageExpected.pixel_store_i.Init(GL_UNPACK_ALIGNMENT, alignment); texSubImageExpected.tex_image_2d.Init( GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kFormat, kType, 0, 0); @@ -2586,37 +2612,25 @@ GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, mem.id, mem.offset, GL_FALSE); - EXPECT_EQ(0, memcmp( - &texSubImageExpected, commands, sizeof(texSubImageExpected))); + EXPECT_EQ(0, memcmp(&texSubImageExpected, commands, + sizeof(texSubImageExpected))); } else { gl_->TexImage2D( GL_TEXTURE_2D, kLevel, kFormat, kSrcSubImageWidth, kSrcSubImageHeight, kBorder, kFormat, kType, src_pixels.get()); - texImageExpected.pixel_store_i[0].Init(GL_UNPACK_ALIGNMENT, alignment); - texImageExpected.pixel_store_i[1].Init( - GL_UNPACK_ROW_LENGTH_EXT, kSrcWidth); - texImageExpected.pixel_store_i[2].Init( - GL_UNPACK_SKIP_PIXELS_EXT, kSrcSubImageX0); - texImageExpected.pixel_store_i[3].Init( - GL_UNPACK_SKIP_ROWS_EXT, kSrcSubImageY0); + texImageExpected.pixel_store_i.Init(GL_UNPACK_ALIGNMENT, alignment); texImageExpected.tex_image_2d.Init( GL_TEXTURE_2D, kLevel, kFormat, kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, mem.id, mem.offset); - EXPECT_EQ(0, memcmp( - &texImageExpected, commands, sizeof(texImageExpected))); + EXPECT_EQ(0, memcmp(&texImageExpected, commands, + sizeof(texImageExpected))); } - uint32_t src_padded_row_size; - ASSERT_TRUE(GLES2Util::ComputeImagePaddedRowSize( - kSrcWidth, kFormat, kType, alignment, &src_padded_row_size)); - uint32_t bytes_per_group = - GLES2Util::ComputeImageGroupSize(kFormat, kType); for (int y = 0; y < kSrcSubImageHeight; ++y) { - const uint8_t* src_row = src_pixels.get() + - (kSrcSubImageY0 + y) * src_padded_row_size + - bytes_per_group * kSrcSubImageX0; - const uint8_t* dst_row = mem.ptr + y * padded_row_size; - EXPECT_EQ(0, memcmp(src_row, dst_row, unpadded_row_size)); + const uint8_t* src_row = + src_pixels.get() + client_skip_size + y * client_padded_row_size; + const uint8_t* dst_row = mem.ptr + y * service_padded_row_size; + EXPECT_EQ(0, memcmp(src_row, dst_row, service_unpadded_row_size)); } ClearCommands(); }
diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc index a430d1d8b..85cde3b 100644 --- a/gpu/command_buffer/service/context_state.cc +++ b/gpu/command_buffer/service/context_state.cc
@@ -461,15 +461,9 @@ if (bound_pixel_unpack_buffer.get()) { glPixelStorei(GL_UNPACK_ROW_LENGTH, unpack_row_length); glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, unpack_image_height); - glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpack_skip_pixels); - glPixelStorei(GL_UNPACK_SKIP_ROWS, unpack_skip_rows); - glPixelStorei(GL_UNPACK_SKIP_IMAGES, unpack_skip_images); } else { glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0); - glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); - glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); - glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0); } } @@ -599,23 +593,23 @@ } PixelStoreParams ContextState::GetPackParams() { + DCHECK_EQ(0, pack_skip_pixels); + DCHECK_EQ(0, pack_skip_rows); PixelStoreParams params; params.alignment = pack_alignment; params.row_length = pack_row_length; - params.skip_pixels = pack_skip_pixels; - params.skip_rows = pack_skip_rows; return params; } PixelStoreParams ContextState::GetUnpackParams(Dimension dimension) { + DCHECK_EQ(0, unpack_skip_pixels); + DCHECK_EQ(0, unpack_skip_rows); + DCHECK_EQ(0, unpack_skip_images); PixelStoreParams params; params.alignment = unpack_alignment; params.row_length = unpack_row_length; - params.skip_pixels = unpack_skip_pixels; - params.skip_rows = unpack_skip_rows; if (dimension == k3D) { params.image_height = unpack_image_height; - params.skip_images = unpack_skip_images; } return params; }
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index a0ebe050..dcb0046 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc
@@ -389,10 +389,9 @@ // Pre es3, there are no PBOS and all unpack state is handled in client side. // With es3, unpack state is needed in server side. We always mark these // enums as valid and pass them to drivers only when a valid PBO is bound. + // UNPACK_ROW_LENGTH, UNPACK_SKIP_ROWS, and UNPACK_SKIP_PIXELS are enabled, + // but there is no need to add them to pixel_store validtor. AddExtensionString("GL_EXT_unpack_subimage"); - validators_.pixel_store.AddValue(GL_UNPACK_ROW_LENGTH); - validators_.pixel_store.AddValue(GL_UNPACK_SKIP_ROWS); - validators_.pixel_store.AddValue(GL_UNPACK_SKIP_PIXELS); if (feature_flags_.enable_subscribe_uniform) { AddExtensionString("GL_CHROMIUM_subscribe_uniform");
diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc index 21b48986..63d6b5f8 100644 --- a/gpu/command_buffer/service/feature_info_unittest.cc +++ b/gpu/command_buffer/service/feature_info_unittest.cc
@@ -323,9 +323,6 @@ EXPECT_FALSE(info_->validators()->frame_buffer_parameter.IsValid( GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT)); EXPECT_FALSE(info_->feature_flags().chromium_image_ycbcr_422); - EXPECT_TRUE(info_->validators()->pixel_store.IsValid(GL_UNPACK_ROW_LENGTH)); - EXPECT_TRUE(info_->validators()->pixel_store.IsValid(GL_UNPACK_SKIP_ROWS)); - EXPECT_TRUE(info_->validators()->pixel_store.IsValid(GL_UNPACK_SKIP_PIXELS)); } TEST_P(FeatureInfoTest, InitializeWithANGLE) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 739ee86..49dbed8c 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -9547,23 +9547,25 @@ } break; case GL_PACK_ROW_LENGTH: - case GL_PACK_SKIP_PIXELS: - case GL_PACK_SKIP_ROWS: case GL_UNPACK_ROW_LENGTH: case GL_UNPACK_IMAGE_HEIGHT: - case GL_UNPACK_SKIP_PIXELS: - case GL_UNPACK_SKIP_ROWS: - case GL_UNPACK_SKIP_IMAGES: if (param < 0) { LOCAL_SET_GL_ERROR( GL_INVALID_VALUE, "glPixelStorei", "invalid param"); return error::kNoError; } + break; + case GL_PACK_SKIP_PIXELS: + case GL_PACK_SKIP_ROWS: + case GL_UNPACK_SKIP_PIXELS: + case GL_UNPACK_SKIP_ROWS: + case GL_UNPACK_SKIP_IMAGES: + // All SKIP parameters are handled on the client side and should never + // be passed to the service side. + return error::kInvalidArguments; default: break; } - // For pack skip parameters, we don't apply them and handle them in command - // buffer. // For alignment parameters, we always apply them. // For other parameters, we don't apply them if no buffer is bound at // PIXEL_PACK or PIXEL_UNPACK. We will handle pack and unpack according to @@ -9573,14 +9575,8 @@ if (state_.bound_pixel_pack_buffer.get()) glPixelStorei(pname, param); break; - case GL_PACK_SKIP_PIXELS: - case GL_PACK_SKIP_ROWS: - break; case GL_UNPACK_ROW_LENGTH: case GL_UNPACK_IMAGE_HEIGHT: - case GL_UNPACK_SKIP_PIXELS: - case GL_UNPACK_SKIP_ROWS: - case GL_UNPACK_SKIP_IMAGES: if (state_.bound_pixel_unpack_buffer.get()) glPixelStorei(pname, param); break; @@ -9595,12 +9591,6 @@ case GL_PACK_ROW_LENGTH: state_.pack_row_length = param; break; - case GL_PACK_SKIP_PIXELS: - state_.pack_skip_pixels = param; - break; - case GL_PACK_SKIP_ROWS: - state_.pack_skip_rows = param; - break; case GL_UNPACK_ALIGNMENT: state_.unpack_alignment = param; break; @@ -9610,15 +9600,6 @@ case GL_UNPACK_IMAGE_HEIGHT: state_.unpack_image_height = param; break; - case GL_UNPACK_SKIP_PIXELS: - state_.unpack_skip_pixels = param; - break; - case GL_UNPACK_SKIP_ROWS: - state_.unpack_skip_rows = param; - break; - case GL_UNPACK_SKIP_IMAGES: - state_.unpack_skip_images = param; - break; default: // Validation should have prevented us from getting here. NOTREACHED();
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 1b2484ba..e3c0627 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -1976,15 +1976,6 @@ EXPECT_CALL(*gl_, PixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, PixelStorei(GL_UNPACK_SKIP_PIXELS, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, PixelStorei(GL_UNPACK_SKIP_ROWS, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, PixelStorei(GL_UNPACK_SKIP_IMAGES, 0)) - .Times(1) - .RetiresOnSaturation(); } }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc index 5301a499..35a8197 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc
@@ -55,25 +55,13 @@ void SetupUpdateES3UnpackParametersExpectations( ::gfx::MockGLInterface* gl, GLint row_length, - GLint image_height, - GLint skip_pixels, - GLint skip_rows, - GLint skip_images) { + GLint image_height) { EXPECT_CALL(*gl, PixelStorei(GL_UNPACK_ROW_LENGTH, row_length)) .Times(1) .RetiresOnSaturation(); EXPECT_CALL(*gl, PixelStorei(GL_UNPACK_IMAGE_HEIGHT, image_height)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl, PixelStorei(GL_UNPACK_SKIP_ROWS, skip_rows)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl, PixelStorei(GL_UNPACK_SKIP_PIXELS, skip_pixels)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl, PixelStorei(GL_UNPACK_SKIP_IMAGES, skip_images)) - .Times(1) - .RetiresOnSaturation(); } } // namespace anonymous @@ -431,12 +419,12 @@ // is cached and not passed down to GL. EXPECT_CALL(*gl_, PixelStorei(_, _)).Times(0); cmds::PixelStorei cmd; - cmd.Init(GL_UNPACK_SKIP_ROWS, 2); + cmd.Init(GL_UNPACK_ROW_LENGTH, 8); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); // When a PIXEL_UNPACK_BUFFER is bound, all cached unpack parameters are // applied to GL. - SetupUpdateES3UnpackParametersExpectations(gl_.get(), 0, 0, 0, 2, 0); + SetupUpdateES3UnpackParametersExpectations(gl_.get(), 8, 0); DoBindBuffer(GL_PIXEL_UNPACK_BUFFER, client_buffer_id_, kServiceBufferId); // Now with a bound PIXEL_UNPACK_BUFFER, all PixelStorei calls with unpack @@ -449,16 +437,16 @@ // Now unbind PIXEL_UNPACK_BUFFER, all ES3 unpack parameters are set back to // 0. - SetupUpdateES3UnpackParametersExpectations(gl_.get(), 0, 0, 0, 0, 0); + SetupUpdateES3UnpackParametersExpectations(gl_.get(), 0, 0); DoBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0, 0); // Again, PixelStorei calls with unpack parameters are cached. EXPECT_CALL(*gl_, PixelStorei(_, _)).Times(0); - cmd.Init(GL_UNPACK_SKIP_ROWS, 3); + cmd.Init(GL_UNPACK_ROW_LENGTH, 32); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); // Bind a PIXEL_UNPACK_BUFFER again. - SetupUpdateES3UnpackParametersExpectations(gl_.get(), 16, 0, 0, 3, 0); + SetupUpdateES3UnpackParametersExpectations(gl_.get(), 32, 0); DoBindBuffer(GL_PIXEL_UNPACK_BUFFER, client_buffer_id_, kServiceBufferId); }
diff --git a/gpu/config/gpu_driver_bug_list_json.cc b/gpu/config/gpu_driver_bug_list_json.cc index 325a1e6..a7195b1b 100644 --- a/gpu/config/gpu_driver_bug_list_json.cc +++ b/gpu/config/gpu_driver_bug_list_json.cc
@@ -1765,6 +1765,21 @@ "features": [ "max_texture_size_limit_4096" ] + }, + { + "id": 148, + "description": "Mali-4xx GPU on JB doesn't support DetachGLContext", + "os": { + "type": "android", + "version": { + "op": "<=", + "value": "4.4.4" + } + }, + "gl_renderer": ".*Mali-4.*", + "features": [ + "surface_texture_cant_detach" + ] } ] }
diff --git a/gpu/config/gpu_driver_bug_workaround_type.h b/gpu/config/gpu_driver_bug_workaround_type.h index d65cdca..71ea843 100644 --- a/gpu/config/gpu_driver_bug_workaround_type.h +++ b/gpu/config/gpu_driver_bug_workaround_type.h
@@ -120,6 +120,8 @@ set_texture_filter_before_generating_mipmap) \ GPU_OP(SIMULATE_OUT_OF_MEMORY_ON_LARGE_TEXTURES, \ simulate_out_of_memory_on_large_textures) \ + GPU_OP(SURFACE_TEXTURE_CANT_DETACH, \ + surface_texture_cant_detach) \ GPU_OP(SWIZZLE_RGBA_FOR_ASYNC_READPIXELS, \ swizzle_rgba_for_async_readpixels) \ GPU_OP(TEXSUBIMAGE_FASTER_THAN_TEXIMAGE, \
diff --git a/gpu/gpu_ipc_common.gypi b/gpu/gpu_ipc_common.gypi index 9cbe65a8..a986b289 100644 --- a/gpu/gpu_ipc_common.gypi +++ b/gpu/gpu_ipc_common.gypi
@@ -28,5 +28,13 @@ '../ipc/ipc.gyp:ipc', ], }], + ['OS=="android"', { + 'sources': [ + 'ipc/common/android/surface_texture_manager.cc', + 'ipc/common/android/surface_texture_manager.h', + 'ipc/common/android/surface_texture_peer.cc', + 'ipc/common/android/surface_texture_peer.h', + ] + }] ], }
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn index 5d4cb18..67c4d8b 100644 --- a/gpu/ipc/common/BUILD.gn +++ b/gpu/ipc/common/BUILD.gn
@@ -25,6 +25,15 @@ "memory_stats.h", ] + if (is_android) { + sources += [ + "android/surface_texture_manager.cc", + "android/surface_texture_manager.h", + "android/surface_texture_peer.cc", + "android/surface_texture_peer.h", + ] + } + configs += [ "//gpu:gpu_implementation", "//third_party/khronos:khronos_headers",
diff --git a/content/common/android/surface_texture_manager.cc b/gpu/ipc/common/android/surface_texture_manager.cc similarity index 77% rename from content/common/android/surface_texture_manager.cc rename to gpu/ipc/common/android/surface_texture_manager.cc index c2cb6ee..22b27d0 100644 --- a/content/common/android/surface_texture_manager.cc +++ b/gpu/ipc/common/android/surface_texture_manager.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/common/android/surface_texture_manager.h" +#include "gpu/ipc/common/android/surface_texture_manager.h" #include "base/logging.h" -namespace content { +namespace gpu { namespace { -SurfaceTextureManager* g_instance = NULL; +SurfaceTextureManager* g_instance = nullptr; } // namespace @@ -25,4 +25,4 @@ g_instance = instance; } -} // namespace content +} // namespace gpu
diff --git a/content/common/android/surface_texture_manager.h b/gpu/ipc/common/android/surface_texture_manager.h similarity index 77% rename from content/common/android/surface_texture_manager.h rename to gpu/ipc/common/android/surface_texture_manager.h index 30a17dc9..3179d4a3 100644 --- a/content/common/android/surface_texture_manager.h +++ b/gpu/ipc/common/android/surface_texture_manager.h
@@ -2,19 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_COMMON_ANDROID_SURFACE_TEXTURE_MANAGER_H_ -#define CONTENT_COMMON_ANDROID_SURFACE_TEXTURE_MANAGER_H_ +#ifndef GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_MANAGER_H_ +#define GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_MANAGER_H_ -#include "content/common/content_export.h" +#include "gpu/gpu_export.h" #include "ui/gfx/native_widget_types.h" namespace gfx { class SurfaceTexture; } -namespace content { +namespace gpu { -class CONTENT_EXPORT SurfaceTextureManager { +class GPU_EXPORT SurfaceTextureManager { public: static SurfaceTextureManager* GetInstance(); static void SetInstance(SurfaceTextureManager* instance); @@ -37,6 +37,6 @@ virtual ~SurfaceTextureManager() {} }; -} // namespace content +} // namespace gpu -#endif // CONTENT_COMMON_ANDROID_SURFACE_TEXTURE_MANAGER_H_ +#endif // GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_MANAGER_H_
diff --git a/content/common/android/surface_texture_peer.cc b/gpu/ipc/common/android/surface_texture_peer.cc similarity index 67% rename from content/common/android/surface_texture_peer.cc rename to gpu/ipc/common/android/surface_texture_peer.cc index a6fade4..397c5ba 100644 --- a/content/common/android/surface_texture_peer.cc +++ b/gpu/ipc/common/android/surface_texture_peer.cc
@@ -2,21 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/common/android/surface_texture_peer.h" +#include "gpu/ipc/common/android/surface_texture_peer.h" #include "base/logging.h" -namespace content { +namespace gpu { namespace { -SurfaceTexturePeer* g_instance_ = NULL; +SurfaceTexturePeer* g_instance_ = nullptr; } // namespace -SurfaceTexturePeer::SurfaceTexturePeer() { -} +SurfaceTexturePeer::SurfaceTexturePeer() {} -SurfaceTexturePeer::~SurfaceTexturePeer() { -} +SurfaceTexturePeer::~SurfaceTexturePeer() {} // static SurfaceTexturePeer* SurfaceTexturePeer::GetInstance() { @@ -30,4 +28,4 @@ g_instance_ = instance; } -} // namespace content +} // namespace gpu
diff --git a/content/common/android/surface_texture_peer.h b/gpu/ipc/common/android/surface_texture_peer.h similarity index 74% rename from content/common/android/surface_texture_peer.h rename to gpu/ipc/common/android/surface_texture_peer.h index 0afe3ef..06bfd944 100644 --- a/content/common/android/surface_texture_peer.h +++ b/gpu/ipc/common/android/surface_texture_peer.h
@@ -2,16 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_ -#define CONTENT_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_ +#ifndef GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_ +#define GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_ #include "base/macros.h" #include "base/process/process.h" +#include "gpu/gpu_export.h" #include "ui/gl/android/surface_texture.h" -namespace content { +namespace gpu { -class SurfaceTexturePeer { +class GPU_EXPORT SurfaceTexturePeer { public: static SurfaceTexturePeer* GetInstance(); @@ -33,6 +34,6 @@ DISALLOW_COPY_AND_ASSIGN(SurfaceTexturePeer); }; -} // namespace content +} // namespace gpu -#endif // CONTENT_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_ +#endif // GPU_IPC_COMMON_ANDROID_SURFACE_TEXTURE_PEER_H_
diff --git a/gpu/vulkan/BUILD.gn b/gpu/vulkan/BUILD.gn new file mode 100644 index 0000000..274071f --- /dev/null +++ b/gpu/vulkan/BUILD.gn
@@ -0,0 +1,51 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ui.gni") + +config("vulkan_config") { + defines = [ "ENABLE_VULKAN" ] + if (use_x11) { + defines += [ "VK_USE_PLATFORM_XLIB_KHR" ] + } +} + +component("vulkan") { + output_name = "vulkan_wrapper" + + if (is_linux && enable_vulkan) { + assert(use_x11, "Vulkan only support x11 at this point.") + sources = [ + "vulkan_export.h", + "vulkan_implementation.cc", + "vulkan_implementation.h", + "vulkan_surface.cc", + "vulkan_surface.h", + ] + + configs += [ "//build/config:precompiled_headers" ] + defines = [ "VULKAN_IMPLEMENTATION" ] + + all_dependent_configs = [ ":vulkan_config" ] + libs = [ "vulkan" ] + + include_dirs = [ "/usr/include" ] + if (target_cpu == "x64") { + lib_dirs = [ "/usr/lib/x86_64-linux-gnu" ] + } else { + assert(false, "Unsupported vulkan target: " + target_cpu) + } + + deps = [ + "//base", + "//ui/base", + "//ui/gfx", + ] + + if (use_x11) { + deps += [ "//ui/gfx/x" ] + configs += [ "//build/config/linux:x11" ] + } + } +}
diff --git a/gpu/vulkan/OWNERS b/gpu/vulkan/OWNERS new file mode 100644 index 0000000..905e1f4 --- /dev/null +++ b/gpu/vulkan/OWNERS
@@ -0,0 +1,2 @@ +piman@chromium.org +dyen@chromium.org
diff --git a/gpu/vulkan/vulkan_export.h b/gpu/vulkan/vulkan_export.h new file mode 100644 index 0000000..0a0d1c2 --- /dev/null +++ b/gpu/vulkan/vulkan_export.h
@@ -0,0 +1,29 @@ +// Copyright (c) 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 GPU_VULKAN_VULKAN_EXPORT_H_ +#define GPU_VULKAN_VULKAN_EXPORT_H_ + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(VULKAN_IMPLEMENTATION) +#define VULKAN_EXPORT __declspec(dllexport) +#else +#define VULKAN_EXPORT __declspec(dllimport) +#endif // defined(GL_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(VULKAN_IMPLEMENTATION) +#define VULKAN_EXPORT __attribute__((visibility("default"))) +#else +#define VULKAN_EXPORT +#endif +#endif + +#else // defined(COMPONENT_BUILD) +#define VULKAN_EXPORT +#endif + +#endif // GPU_VULKAN_VULKAN_EXPORT_H_
diff --git a/gpu/vulkan/vulkan_implementation.cc b/gpu/vulkan/vulkan_implementation.cc new file mode 100644 index 0000000..808ed84 --- /dev/null +++ b/gpu/vulkan/vulkan_implementation.cc
@@ -0,0 +1,179 @@ +// Copyright (c) 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 "gpu/vulkan/vulkan_implementation.h" + +#include <string> +#include <vector> +#include <vulkan/vulkan.h> + +#include "base/macros.h" + +#if defined(VK_USE_PLATFORM_XLIB_KHR) +#include "ui/gfx/x/x11_types.h" +#endif // defined(VK_USE_PLATFORM_XLIB_KHR) + +namespace gpu { + +struct VulkanInstance { + VulkanInstance() : valid(false) {} + + void Initialize() { + valid = InitializeVulkanInstance() && InitializeVulkanDevice(); + } + + bool InitializeVulkanInstance() { + VkResult status = VK_SUCCESS; + + VkApplicationInfo app_info = {}; + app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + app_info.pApplicationName = "Chromium"; + app_info.apiVersion = VK_MAKE_VERSION(1, 0, 2); + + const char* instance_extensions[] = { + VK_KHR_SURFACE_EXTENSION_NAME, + +#if defined(VK_USE_PLATFORM_XLIB_KHR) + VK_KHR_XLIB_SURFACE_EXTENSION_NAME, +#endif // defined(VK_USE_PLATFORM_XLIB_KHR) + }; + + VkInstanceCreateInfo instance_create_info = {}; + instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + instance_create_info.pApplicationInfo = &app_info; + instance_create_info.ppEnabledExtensionNames = instance_extensions; + instance_create_info.enabledExtensionCount = arraysize(instance_extensions); + + status = vkCreateInstance(&instance_create_info, nullptr, &vk_instance); + DCHECK_EQ(VK_SUCCESS, status); + if (VK_SUCCESS != status) + return false; + + return true; + } + + bool InitializeVulkanDevice() { + VkResult status = VK_SUCCESS; + + uint32_t device_count = 0; + status = vkEnumeratePhysicalDevices(vk_instance, &device_count, nullptr); + if (VK_SUCCESS != status || device_count == 0) + return false; + + std::vector<VkPhysicalDevice> devices(device_count); + status = + vkEnumeratePhysicalDevices(vk_instance, &device_count, devices.data()); + if (VK_SUCCESS != status) { + LOG(ERROR) << "vkEnumeratePhysicalDevices() failed: " << status; + return false; + } + +// TODO(dyen): Enable this once vkGetPhysicalDeviceXlibPresentationSupportKHR() +// is properly supported in the driver. +#if 0 && defined(VK_USE_PLATFORM_XLIB_KHR) + Display* xdisplay = gfx::GetXDisplay(); + VisualID visual_id = + XVisualIDFromVisual(DefaultVisual(xdisplay, DefaultScreen(xdisplay))); +#endif // defined(VK_USE_PLATFORM_XLIB_KHR) + + int device_index = -1; + int queue_index = -1; + for (size_t i = 0; i < devices.size(); ++i) { + const VkPhysicalDevice& device = devices[i]; + uint32_t queue_count = 0; + vkGetPhysicalDeviceQueueFamilyProperties(device, &queue_count, nullptr); + if (queue_count) { + std::vector<VkQueueFamilyProperties> queue_properties(queue_count); + vkGetPhysicalDeviceQueueFamilyProperties(device, &queue_count, + queue_properties.data()); + for (size_t n = 0; n < queue_properties.size(); ++n) { + if ((queue_properties[n].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) + continue; + +// TODO(dyen): Enable this once vkGetPhysicalDeviceXlibPresentationSupportKHR() +// is properly supported in the driver. +#if 1 +#elif defined(VK_USE_PLATFORM_XLIB_KHR) + if (!vkGetPhysicalDeviceXlibPresentationSupportKHR( + device, n, xdisplay, visual_id)) { + continue; + } +#else +#error Non-Supported Vulkan implementation. +#endif + + queue_index = static_cast<int>(n); + break; + } + + if (-1 != queue_index) { + device_index = static_cast<int>(i); + break; + } + } + } + + if (queue_index == -1) + return false; + + float queue_priority = 0.0f; + VkDeviceQueueCreateInfo queue_create_info = {}; + queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queue_create_info.queueFamilyIndex = queue_index; + queue_create_info.queueCount = 1; + queue_create_info.pQueuePriorities = &queue_priority; + + const char* device_extensions[] = {VK_KHR_SWAPCHAIN_EXTENSION_NAME}; + + VkDeviceCreateInfo device_create_info = {}; + device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + device_create_info.queueCreateInfoCount = 1; + device_create_info.pQueueCreateInfos = &queue_create_info; + device_create_info.enabledExtensionCount = arraysize(device_extensions); + device_create_info.ppEnabledExtensionNames = device_extensions; + + status = vkCreateDevice(devices[device_index], &device_create_info, nullptr, + &vk_device); + if (VK_SUCCESS != status) + return false; + + vkGetDeviceQueue(vk_device, queue_index, 0, &vk_queue); + + return true; + } + + bool valid; + VkInstance vk_instance; + VkDevice vk_device; + VkQueue vk_queue; +}; + +static VulkanInstance* vulkan_instance = nullptr; + +bool InitializeVulkan() { + DCHECK(!vulkan_instance); + vulkan_instance = new VulkanInstance; + vulkan_instance->Initialize(); + return vulkan_instance->valid; +} + +VkInstance GetVulkanInstance() { + DCHECK(vulkan_instance); + DCHECK(vulkan_instance->valid); + return vulkan_instance->vk_instance; +} + +VkDevice GetVulkanDevice() { + DCHECK(vulkan_instance); + DCHECK(vulkan_instance->valid); + return vulkan_instance->vk_device; +} + +VkQueue GetVulkanQueue() { + DCHECK(vulkan_instance); + DCHECK(vulkan_instance->valid); + return vulkan_instance->vk_queue; +} + +} // namespace gpu
diff --git a/gpu/vulkan/vulkan_implementation.h b/gpu/vulkan/vulkan_implementation.h new file mode 100644 index 0000000..69214b2 --- /dev/null +++ b/gpu/vulkan/vulkan_implementation.h
@@ -0,0 +1,20 @@ +// Copyright (c) 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 GPU_VULKAN_VULKAN_IMPLEMENTATION_H_ +#define GPU_VULKAN_VULKAN_IMPLEMENTATION_H_ + +#include <vulkan/vulkan.h> + +namespace gpu { + +bool InitializeVulkan(); + +VkInstance GetVulkanInstance(); +VkDevice GetVulkanDevice(); +VkQueue GetVulkanQueue(); + +} // namespace gpu + +#endif // GPU_VULKAN_VULKAN_WSI_API_IMPLEMENTATION_H_
diff --git a/gpu/vulkan/vulkan_surface.cc b/gpu/vulkan/vulkan_surface.cc new file mode 100644 index 0000000..158ab4a --- /dev/null +++ b/gpu/vulkan/vulkan_surface.cc
@@ -0,0 +1,23 @@ +// Copyright (c) 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 "gpu/vulkan/vulkan_surface.h" + +#include "gpu/vulkan/vulkan_implementation.h" + +namespace gpu { + +VulkanSurface::VulkanSurface() {} + +// static +bool VulkanSurface::InitializeOneOff() { + if (!InitializeVulkan()) + return false; + + return true; +} + +VulkanSurface::~VulkanSurface() {} + +} // namespace gpu
diff --git a/gpu/vulkan/vulkan_surface.h b/gpu/vulkan/vulkan_surface.h new file mode 100644 index 0000000..3dfb928 --- /dev/null +++ b/gpu/vulkan/vulkan_surface.h
@@ -0,0 +1,24 @@ +// Copyright (c) 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 GPU_VULKAN_VULKAN_SURFACE_H_ +#define GPU_VULKAN_VULKAN_SURFACE_H_ + +#include "gpu/vulkan/vulkan_export.h" + +namespace gpu { + +class VULKAN_EXPORT VulkanSurface { + public: + VulkanSurface(); + + static bool InitializeOneOff(); + + protected: + virtual ~VulkanSurface(); +}; + +} // namespace gpu + +#endif // GPU_VULKAN_VULKAN_SURFACE_H_
diff --git a/infra/scripts/runtest_wrapper.py b/infra/scripts/runtest_wrapper.py index fe9835f..e97f125 100755 --- a/infra/scripts/runtest_wrapper.py +++ b/infra/scripts/runtest_wrapper.py
@@ -19,9 +19,6 @@ def main(argv): parser = argparse.ArgumentParser() - # TODO(phajdan.jr): Remove after cleaning up build repo side. - parser.add_argument( - '--path-build', help='Path to the build repo') parser.add_argument('args', nargs='*', help='Arguments to pass to runtest.py') args = parser.parse_args(argv)
diff --git a/ios/chrome/app/resources/history/history_mobile.css b/ios/chrome/app/resources/history/history_mobile.css index 3b6f9a3..a10a1d79 100644 --- a/ios/chrome/app/resources/history/history_mobile.css +++ b/ios/chrome/app/resources/history/history_mobile.css
@@ -197,6 +197,7 @@ -webkit-flex: auto; -webkit-flex-flow: column; -webkit-padding-start: 48px; + -webkit-margin-start: 8px; background-size: 32px; line-height: 1.3; } @@ -278,11 +279,15 @@ @media only screen and (max-width:600px) { - /* Omit the time on very small screens. */ + /* Omit the time and favicon margin on very small screens. */ .entry .time { display: none; } + .entry .visit-entry { + -webkit-margin-start: 0; + } + } /* @media only screen and (max-width:600px) */ @media only screen and (min-width:720px) {
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb index 29d8020..09b12653 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Chromium በሚቀጥለው ጊዜ ከዚህ ጣቢያ የመጡ የ<ph name="LANGUAGE_NAME" /> ገጾችን እንዲተረጎምልዎ ይፈልጋሉ?</translation> <translation id="3805899903892079518">Chromium የእርስዎ ፎቶዎች ወይም ቪዲዮዎች መዳረሻ የለውም። በiOS ቅንብሮች > ግላዊነት > ፎቶዎች ውስጥ መዳረሻን ያንቁ።</translation> <translation id="6068866989048414399">የChromium አገልግሎት ውል</translation> +<translation id="6268381023930128611">ከChromium ተዘግቶ ይወጣ?</translation> <translation id="6424492062988593837">Chromium አሁን ተሻሽሏል! አዲስ ስሪት አለ።</translation> <translation id="6600954340915313787">ወደ Chrome ተቀድቷል</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb index fb2c071a4..60d12b5 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">هل ترغب في أن يعرض Chromium ترجمة صفحات <ph name="LANGUAGE_NAME" /> من موقع الويب هذا في المرة القادمة؟</translation> <translation id="3805899903892079518">لا تتوفر لدى Chromium إمكانية الدخول إلى الصور أو مقاطع الفيديو. تستطيع تمكين الدخول في إعدادات نظام التشغيل iOS > الخصوصية > الصور.</translation> <translation id="6068866989048414399">بنود خدمة Chromium</translation> +<translation id="6268381023930128611">هل تريد الخروج من Chromium؟</translation> <translation id="6424492062988593837">لقد أصبح Chromium أفضل من ذي قبل! يتوفر إصدار جديد.</translation> <translation id="6600954340915313787">تم النسخ إلى Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb index 590c8c529..8378b1ca 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Искате ли следващия път Chromium да предложи да преведе от <ph name="LANGUAGE_NAME" /> страниците от този сайт?</translation> <translation id="3805899903892079518">Chromium няма достъп до снимките или видеоклиповете ви. Активирайте го от „Settings“ > „Privacy“ > „Photos“ в iOS.</translation> <translation id="6068866989048414399">Общи условия на Chromium</translation> +<translation id="6268381023930128611">Искате ли да излезете от Chromium?</translation> <translation id="6424492062988593837">Chromium току-що се подобри! Налице е нова версия.</translation> <translation id="6600954340915313787">Копирано в Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb index 72869e74..5423beae 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">আপনি কি পরবর্তী বারে এই সাইটটির <ph name="LANGUAGE_NAME" /> পৃষ্ঠাগুলিকে অনুবাদ করে দেওয়ার জন্য Chromium কে বলতে চান?</translation> <translation id="3805899903892079518">আপনার ফটো এবং ভিডিওগুলিতে Chromium এর অ্যাক্সেস নেই৷ iOS সেটিংস > গোপনীয়তা > ফটোগুলিতে অ্যাক্সেস সক্ষম করুন৷</translation> <translation id="6068866989048414399">Chromium পরিষেবার শর্তাদি</translation> +<translation id="6268381023930128611">Chromium থেকে সাইন আউট করবেন?</translation> <translation id="6424492062988593837">Chrome আরো ভাল হয়েছে! একটি নতুন সংস্করণ উপলব্ধ আছে৷</translation> <translation id="6600954340915313787">Chrome-এ প্রতিলিপি করা হয়েছে</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb index 131d7eb..ac88b86b 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">La propera vegada, voleu que Chromium s'ofereixi per traduir les pàgines d'aquest lloc escrites en <ph name="LANGUAGE_NAME" />?</translation> <translation id="3805899903892079518">Chromium no té accés als vostres vídeos o fotos. Permeteu-li l'accés a iOS, a Configuració > Privadesa > Fotos.</translation> <translation id="6068866989048414399">Condicions del servei de Chromium</translation> +<translation id="6268381023930128611">Voleu tancar la sessió de Chromium?</translation> <translation id="6424492062988593837">Chrome ara és millor. Hi ha una versió nova disponible.</translation> <translation id="6600954340915313787">Copiada de Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb index 18e96baa..2c1822ab 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Chcete, aby prohlížeč Chromium příště pro stránky v jazyce <ph name="LANGUAGE_NAME" /> z tohoto webu nabízel překlad?</translation> <translation id="3805899903892079518">Chromium nemá přístup k vašim fotkám nebo videím. Povolte přístup v systému iOS v Nastavení > Soukromí > Fotky.</translation> <translation id="6068866989048414399">Smluvní podmínky prohlížeče Chromium</translation> +<translation id="6268381023930128611">Odhlásit se z prohlížeče Chromium?</translation> <translation id="6424492062988593837">Chromium je opět o něco lepší. K dispozici je nová verze.</translation> <translation id="6600954340915313787">Zkopírováno do Chromu</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb index c23355c..07d88ff 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Skal Chromium tilbyde at oversætte sider på <ph name="LANGUAGE_NAME" /> fra dette website næste gang?</translation> <translation id="3805899903892079518">Chromium har ikke adgang til dine billeder eller videoer. Gå til iOS Indstillinger > Privatliv > Billeder for at få adgang.</translation> <translation id="6068866989048414399">Chromium Servicevilkår</translation> +<translation id="6268381023930128611">Vil du logge ud af Chromium?</translation> <translation id="6424492062988593837">Chromium er lige blevet bedre! Der er en ny tilgængelig version.</translation> <translation id="6600954340915313787">Kopieret til Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb index f4687bf..6ebeb9fc 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Soll Chromium beim nächsten Mal eine Übersetzung von Seiten dieser Website anbieten, die auf <ph name="LANGUAGE_NAME" /> sind?</translation> <translation id="3805899903892079518">Chromium hat keinen Zugriff auf Ihre Fotos und Videos. Aktivieren Sie den Zugriff unter "iOS-Einstellungen > Datenschutz > Fotos".</translation> <translation id="6068866989048414399">Chromium-Nutzungsbedingungen</translation> +<translation id="6268381023930128611">Von Chromium abmelden?</translation> <translation id="6424492062988593837">Chromium ist jetzt noch besser! Es ist eine neue Version verfügbar.</translation> <translation id="6600954340915313787">In Chrome kopiert</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb index de31e30e..45f6388 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Θέλετε να προσφερθεί το Chromium να μεταφράσει σελίδες αυτού του ιστότοπου που είναι γραμμένες στα <ph name="LANGUAGE_NAME" /> την επόμενη φορά;</translation> <translation id="3805899903892079518">Το Chromium δεν έχει πρόσβαση σε φωτογραφίες ή βίντεό σας. Ενεργ. πρόσβασης στις Ρυθμίσεις iOS > Απόρρητο > Φωτογραφίες.</translation> <translation id="6068866989048414399">Όροι Παροχ. Υπηρεσιών Chromium</translation> +<translation id="6268381023930128611">Θέλετε να αποσυνδεθείτε από το Chromium;</translation> <translation id="6424492062988593837">Το Chromium μόλις βελτιώθηκε! Μια νέα έκδοση είναι διαθέσιμη.</translation> <translation id="6600954340915313787">Αντιγράφηκε στο Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb index 7ff56e1a..7b714f5 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Would you like Chromium to offer to translate <ph name="LANGUAGE_NAME" /> pages from this site next time?</translation> <translation id="3805899903892079518">Chromium does not have access to your photos or videos. Enable access in iOS Settings > Privacy > Photos.</translation> <translation id="6068866989048414399">Chromium Terms of Service</translation> +<translation id="6268381023930128611">Sign out of Chromium?</translation> <translation id="6424492062988593837">Chromium just got better! A new version is available.</translation> <translation id="6600954340915313787">Copied to Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb index df5cb48..31a7447 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">¿Quieres que Google Chrome te ofrezca traducir las páginas de este sitio que estén en <ph name="LANGUAGE_NAME" /> la próxima vez?</translation> <translation id="3805899903892079518">Chromium no tiene acceso a tus fotos o videos. Habilita el acceso en Configuración de iOS > Privacidad > Fotos.</translation> <translation id="6068866989048414399">Condiciones del servicio de Chromium</translation> +<translation id="6268381023930128611">¿Salir de Chromium?</translation> <translation id="6424492062988593837">¡Chromium mejoró! Hay una nueva versión disponible.</translation> <translation id="6600954340915313787">Se copió en Chrome.</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb index 39ce7b3..efdf982 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">¿Quieres que Chromium te ofrezca la posibilidad de traducir las páginas en <ph name="LANGUAGE_NAME" /> de este sitio web la próxima vez?</translation> <translation id="3805899903892079518">Chromium no puede acceder a tus fotos y vídeos (para permitirlo, ve a Ajustes de iOS > Privacidad > Fotos).</translation> <translation id="6068866989048414399">Condiciones de Servicio de Chromium</translation> +<translation id="6268381023930128611">¿Cerrar sesión en Chromium?</translation> <translation id="6424492062988593837">Chromium sigue mejorando. Hay una nueva versión disponible.</translation> <translation id="6600954340915313787">Copiada a Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb index a7f15cf9f..98274b63 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Kas soovite, et Chromium pakuks järgmisel korral sellel saidil <ph name="LANGUAGE_NAME" /> keeles olevate lehtede tõlkimise võimalust?</translation> <translation id="3805899903892079518">Chromiumil pole juurdepääsu fotodele ega videotele. Lubage iOS-is juurdepääs valikutega Seaded > Privaatsus > Fotod.</translation> <translation id="6068866989048414399">Chromiumi teenusetingimused</translation> +<translation id="6268381023930128611">Kas logida Chromiumist välja?</translation> <translation id="6424492062988593837">Chromium muutus just veelgi paremaks! Saadaval on uus versioon.</translation> <translation id="6600954340915313787">Chrome'i kopeeritud</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb index a0dbc5aa..0d6d0c62 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">میخواهید دفعه دیگر Chromium پیشنهاد ترجمه صفحات <ph name="LANGUAGE_NAME" /> را از این سایت بدهد؟</translation> <translation id="3805899903892079518">Chromium به عکسها یا ویدیوهای شما دسترسی ندارد. با رفتن به تنظیمات iOS > حریم خصوصی > عکسها دسترسی را فعال کنید.</translation> <translation id="6068866989048414399">شرایط خدمات Chromium</translation> +<translation id="6268381023930128611">از Chromium خارج میشوید؟</translation> <translation id="6424492062988593837">Chromium بهتر شده است! نسخه جدید آن در دسترس است.</translation> <translation id="6600954340915313787">کپی در Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb index 99adefbb..bbc7f4d 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Haluatko Chromiumin ehdottavan sivuston kielellä <ph name="LANGUAGE_NAME" /> kirjoitettujen sivujen kääntämistä seuraavalla kerralla?</translation> <translation id="3805899903892079518">Chromium ei voi käyttää kuviasi tai videoitasi. Anna käyttöoikeus kohdassa iOS-asetukset > Tietosuoja > Kuvat.</translation> <translation id="6068866989048414399">Chromiumin käyttöehdot</translation> +<translation id="6268381023930128611">Kirjaudutaanko ulos?</translation> <translation id="6424492062988593837">Chromiumista tuli juuri entistä parempi! Uusi versio on saatavilla.</translation> <translation id="6600954340915313787">Kopioitiin Chromeen.</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb index 6241c53..2a5d1054 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Gusto mo bang mag-alok ang Chromium na isalin ang mga <ph name="LANGUAGE_NAME" /> page mula sa site na ito sa susunod na pagkakataon?</translation> <translation id="3805899903892079518">Walang access ang Chromium sa mga larawan o video mo. I-enable ang access sa Mga Setting ng iOS > Privacy > Mga Larawan.</translation> <translation id="6068866989048414399">Tuntunin ng Serbisyo ng Chromium</translation> +<translation id="6268381023930128611">Mag-sign out sa Chromium?</translation> <translation id="6424492062988593837">Naging mas mahusay na ang Chromium! Available na ang bagong bersyon.</translation> <translation id="6600954340915313787">Kinopya sa Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb index 3467436..37bc9939 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Souhaitez-vous que Chromium vous propose de traduire les pages de ce site rédigées en <ph name="LANGUAGE_NAME" /> lors de votre prochaine visite ?</translation> <translation id="3805899903892079518">Chromium n'a pas accès à vos photos ni à vos vidéos. Activez l'accès dans iOS via Réglages > Confidentialité > Photos.</translation> <translation id="6068866989048414399">Conditions d'utilisation Chromium</translation> +<translation id="6268381023930128611">Se déconnecter de Chromium ?</translation> <translation id="6424492062988593837">Chromium a été amélioré ! Une nouvelle version est désormais disponible.</translation> <translation id="6600954340915313787">Copiée dans Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb index 4c5f953..3559e4b7 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">શું તમે Chromium ને આ સાઇટથી આગલી વખતે <ph name="LANGUAGE_NAME" /> પૃષ્ઠોને અનુવાદ કરવાની ઓફર કરવા માગો છો?</translation> <translation id="3805899903892079518">Chromium ને તમારા ફોટા અથવા વિડિઓઝની ઍક્સેસ નથી. iOS સેટિંગ્સ > ગોપનીયતા > ફોટામાં ઍક્સેસને સક્ષમ કરો.</translation> <translation id="6068866989048414399">Chromium સેવાની શરતો</translation> +<translation id="6268381023930128611">Chromium માંથી સાઇન આઉટ કરીએ?</translation> <translation id="6424492062988593837">Chrome હમણાં જ વધુ સારું થયું છે! નવું સંસ્કરણ ઉપલબ્ધ છે.</translation> <translation id="6600954340915313787">Chrome માં કોપી કરાયું</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb index 5c358ba3..156df49b 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">क्या आप चाहते हैं कि Chromium अगली बार इस साइट के <ph name="LANGUAGE_NAME" /> पृष्ठों का अनुवाद करने का ऑफ़र दे?</translation> <translation id="3805899903892079518">Chromium के पास आपकी फ़ोटो या वीडियो का एक्सेस नहीं है. iOS सेटिंग > गोपनीयता > फ़ोटो में एक्सेस सक्षम करें.</translation> <translation id="6068866989048414399">Chromium सेवा की शर्तें</translation> +<translation id="6268381023930128611">क्रोमियम से प्रस्थान करें?</translation> <translation id="6424492062988593837">Chrome अब बेहतर हो गया है! नया वर्शन उपलब्ध है.</translation> <translation id="6600954340915313787">Chrome पर कॉपी किया गया</translation> <translation id="7337881442233988129">क्रोमियम</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb index e57b4d1..64360a39 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Želite li da Chromium sljedeći put ponudi prijevod stranica s te web-lokacije za <ph name="LANGUAGE_NAME" />?</translation> <translation id="3805899903892079518">Chromium nema pristup fotografijama ni videozapisima. Omogućite pristup u Postavkama iOS-a > Privatnost > Fotografije.</translation> <translation id="6068866989048414399">Uvjeti pružanja Chromiuma</translation> +<translation id="6268381023930128611">Želite li se odjaviti iz Chromiuma?</translation> <translation id="6424492062988593837">Chromium je postao još bolji! Dostupna je nova verzija.</translation> <translation id="6600954340915313787">Kopirano u Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb index 8bd83c5d..26a4984 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Szeretné, hogy a Chromium a jövőben felajánlja e webhely <ph name="LANGUAGE_NAME" /> nyelvű oldalainak fordítását?</translation> <translation id="3805899903892079518">A Chromium nem fér hozzá az Ön képeihez és videóihoz. Engedélyezés iOS-en: Beállítások > Adatvédelem > Fényképek.</translation> <translation id="6068866989048414399">Chromium – ÁSZF</translation> +<translation id="6268381023930128611">Kijelentkezik a Chromiumból?</translation> <translation id="6424492062988593837">A Chromium most még jobb lett! Új verzió áll rendelkezésre.</translation> <translation id="6600954340915313787">A Chrome-ba másolva</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb index b15029c..a327dbe8 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Ingin Chromium menawarkan untuk menerjemahkan laman berbahasa <ph name="LANGUAGE_NAME" /> dari situs ini saat Anda mengunjunginya lagi?</translation> <translation id="3805899903892079518">Chromium tidak memiliki akses ke foto atau video Anda. Izinkan akses di iOS Settings > Privacy > Photos.</translation> <translation id="6068866989048414399">Persyaratan Layanan Chromium</translation> +<translation id="6268381023930128611">Keluar dari Chromium?</translation> <translation id="6424492062988593837">Chromium jadi semakin baik! Versi baru telah tersedia.</translation> <translation id="6600954340915313787">Disalin ke Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb index e2dde46a..70cf326 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Vuoi che Chromium ti proponga di tradurre le pagine di questo sito in <ph name="LANGUAGE_NAME" /> al prossimo accesso?</translation> <translation id="3805899903892079518">Chromium non ha accesso alle tue foto o ai tuoi video. Attiva l'accesso in Impostazioni iOS > Privacy > Foto.</translation> <translation id="6068866989048414399">Termini di servizio di Chromium</translation> +<translation id="6268381023930128611">Uscire da Chromium?</translation> <translation id="6424492062988593837">Chromium è stato migliorato. È disponibile una nuova versione.</translation> <translation id="6600954340915313787">Copiata in Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb index d2986a4..0a5828d 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">האם ברצונך ש-Chromium יציע בפעם הבאה לתרגם דפים ב-<ph name="LANGUAGE_NAME" /> מאתר זה?</translation> <translation id="3805899903892079518">ל-Chromium אין גישה לתמונות או לסרטונים שלך. אפשר גישה ב'הגדרות iOS' > 'פרטיות' > 'תמונות'.</translation> <translation id="6068866989048414399">התנאים וההגבלות של Chromium</translation> +<translation id="6268381023930128611">האם לצאת מ-Chromium?</translation> <translation id="6424492062988593837">Chromium ממשיך להשתפר! קיימת גירסה חדשה.</translation> <translation id="6600954340915313787">הועתק אל Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb index 2c3d949e..99636c6 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">次回から Chromium でこのサイトの <ph name="LANGUAGE_NAME" /> ページの翻訳を表示しますか?</translation> <translation id="3805899903892079518">Chromium で写真または動画にアクセスできません。iOS の [設定] > [プライバシー] > [写真] でアクセスを有効にしてください。</translation> <translation id="6068866989048414399">Chromium 利用規約</translation> +<translation id="6268381023930128611">Chromium からログアウトしますか?</translation> <translation id="6424492062988593837">Chromium のアップデートが見つかりました。新しいバージョンが利用可能です。</translation> <translation id="6600954340915313787">Chrome にコピー済み</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb index 80b6fe2..69734bd 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">ಮುಂದಿನ ಬಾರಿ ಈ ಸೈಟ್ನಿಂದ <ph name="LANGUAGE_NAME" /> ಪುಟಗಳನ್ನು ಅನುವಾದಿಸಲು Chromium ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸಲು ನೀವು ಬಯಸುವಿರಾ?</translation> <translation id="3805899903892079518">Chromium ನಿಮ್ಮ ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೋಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ. iOS ಸೆಟ್ಟಿಂಗ್ಗಳು > ಗೌಪ್ಯತೆ > ಫೋಟೋಗಳಲ್ಲಿ ಪ್ರವೇಶವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="6068866989048414399">Chromium ಸೇವಾ ನಿಯಮಗಳು</translation> +<translation id="6268381023930128611">Chromium ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದೇ?</translation> <translation id="6424492062988593837">Chrome ಈಗ ತಾನೇ ಉತ್ತಮಗೊಂಡಿದೆ! ಹೊಸ ಆವೃತ್ತಿ ಲಭ್ಯವಿದೆ.</translation> <translation id="6600954340915313787">Chrome ಗೆ ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb index 41f1191..3d36781 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">다음에 Chromium에서 이 사이트의 <ph name="LANGUAGE_NAME" /> 페이지를 번역하시겠습니까?</translation> <translation id="3805899903892079518">Chromium에서 사진 또는 동영상에 액세스할 수 없습니다. 'iOS 설정 > 개인정보 보호 > 사진'에서 액세스를 허용하세요.</translation> <translation id="6068866989048414399">Chromium 서비스 약관</translation> +<translation id="6268381023930128611">Chromium에서 로그아웃</translation> <translation id="6424492062988593837">한층 개선된 Chromium의 최신 버전이 출시되었습니다.</translation> <translation id="6600954340915313787">Chrome에 복사됨</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb index 00fd63d..4c52991 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Ar norėtumėte, kad kitą kartą „Chromium“ būtų siūloma išversti šios svetainės puslapius <ph name="LANGUAGE_NAME" /> k.?</translation> <translation id="3805899903892079518">„Chromium“ nepasiekia nuotraukų ar vaizdo įr. Įgalinkite prieigą apsil. „iOS“ nustatymai“ > „Privatumas“ > „Nuotraukos“.</translation> <translation id="6068866989048414399">„Chromium“ pasl. teikimo sąl.</translation> +<translation id="6268381023930128611">Atsijungti nuo „Chromium“?</translation> <translation id="6424492062988593837">„Chromium“ patobulėjo! Galima nauja versija.</translation> <translation id="6600954340915313787">Nukopijuota į „Chrome“</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb index a63f033d..eceb4b6 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Vai vēlaties, lai Chromium nākamreiz piedāvātu šīs vietnes lapas, kuru saturs ir šādā valodā: <ph name="LANGUAGE_NAME" />?</translation> <translation id="3805899903892079518">Chromium nevar piekļūt jūsu fotoattēliem un videoklipiem. Iespējojiet piekļuvi: iOS Settings > Privacy > Photos.</translation> <translation id="6068866989048414399">Chromium pakalpojumu sniegšanas noteikumi</translation> +<translation id="6268381023930128611">Vai izrakstīties no Chromium?</translation> <translation id="6424492062988593837">Lietojumprogramma Chromium ir uzlabota! Ir pieejama jauna versija.</translation> <translation id="6600954340915313787">Nokopēta pārlūkā Chrome.</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb index 16a03981..75f4dba 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">അടുത്ത തവണ ഈ സൈറ്റിൽ നിന്ന് <ph name="LANGUAGE_NAME" /> പേജുകൾ വിവർത്തനം ചെയ്യാൻ Chromium ഓഫർ ചെയ്യുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടോ?</translation> <translation id="3805899903892079518">Chromium-ത്തിന് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കോ വീഡിയോകളിലേക്കോ ആക്സസ്സ് ഇല്ല. iOS ക്രമീകരണം > സ്വകാര്യത > ഫോട്ടോകൾ എന്നതിൽ ആക്സസ്സ് പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="6068866989048414399">Chromium സേവന നിബന്ധനകൾ</translation> +<translation id="6268381023930128611">Chromium-ത്തിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യണോ?</translation> <translation id="6424492062988593837">Chromium ഒന്നുകൂടി മികച്ചതായി! ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്.</translation> <translation id="6600954340915313787">Chrome-ലേക്ക് പ്കർത്തി</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb index 5813be2b..7774e63 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Chromium ने या साइटवरून पुढील वेळी <ph name="LANGUAGE_NAME" /> पृष्ठे भाषांतरित करण्याची ऑफर द्यावी असे आपण इच्छिता?</translation> <translation id="3805899903892079518">Chromium ला आपल्या फोटो किंवा व्हिडिओंमध्ये प्रवेश नाही. iOS सेटिंग्ज> गोपनीयता> फोटो मध्ये प्रवेश सक्षम करा.</translation> <translation id="6068866989048414399">Chromium सेवा अटी</translation> +<translation id="6268381023930128611">Chromium मधून साइन आउट करायचे?</translation> <translation id="6424492062988593837">Chrome आता सर्वोत्तम झाले आहे! नवीन आवृत्ती उपलब्ध आहे.</translation> <translation id="6600954340915313787">Chrome वर कॉपी केले</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb index 80cfc3f..f8469271 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Adakah anda mahu Chromium menawarkan halaman <ph name="LANGUAGE_NAME" /> dari tapak ini diterjemahkan pada masa akan datang?</translation> <translation id="3805899903892079518">Chromium tidak mempunyai akses kepada foto atau video anda. Dayakan akses dalam Tetapan iOS > Privasi > Foto.</translation> <translation id="6068866989048414399">Syarat Perkhidmatan Chromium</translation> +<translation id="6268381023930128611">Log keluar daripada Chromium?</translation> <translation id="6424492062988593837">Chromium telah dipertingkatkan! Versi baharu kini boleh didapati.</translation> <translation id="6600954340915313787">Disalin ke Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb index 25f04db2..8f54702 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Wil je dat Chromium de volgende keer aanbiedt om pagina's in het <ph name="LANGUAGE_NAME" /> op deze site te vertalen?</translation> <translation id="3805899903892079518">Chromium heeft geen toegang tot je foto's of video's. Schakel toegang in via iOS-instellingen > Privacy > Foto's.</translation> <translation id="6068866989048414399">Servicevoorwaarden van Chromium</translation> +<translation id="6268381023930128611">Uitloggen bij Chromium?</translation> <translation id="6424492062988593837">Chromium is nu nog beter! Er is een nieuwe versie beschikbaar.</translation> <translation id="6600954340915313787">Gekopieerd naar Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb index b2c93d7..8f74d34 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Vil du at Chromium skal tilby å oversette sider på <ph name="LANGUAGE_NAME" /> på dette nettstedet neste gang?</translation> <translation id="3805899903892079518">Chromium har ikke tilgang til bildene eller videoene dine. Slå på tilgangen i iOS-innstillingene > Personvern > Bilder.</translation> <translation id="6068866989048414399">Vilkår for Chromium</translation> +<translation id="6268381023930128611">Vil du logge av Chromium?</translation> <translation id="6424492062988593837">Chromium har blitt enda bedre. En ny versjon er nå tilgjengelig.</translation> <translation id="6600954340915313787">Kopiert til Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb index 459c5a5..4dca208 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Czy następnym razem Chromium ma zaproponować Ci tłumaczenie stron tej witryny, których język to <ph name="LANGUAGE_NAME" />?</translation> <translation id="3805899903892079518">Chromium nie ma dostępu do Twoich zdjęć ani filmów. Aby włączyć dostęp w iOS, wybierz Ustawienia > Prywatność > Zdjęcia.</translation> <translation id="6068866989048414399">Warunki korzystania z Chromium</translation> +<translation id="6268381023930128611">Wylogować z Chromium?</translation> <translation id="6424492062988593837">Chromium jest teraz jeszcze lepsze! Dostępna jest nowa wersja.</translation> <translation id="6600954340915313787">Skopiowana do Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb index 7ed4a30..0634f20 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Deseja que na próxima vez o Chromium ofereça a tradução de páginas em <ph name="LANGUAGE_NAME" /> deste site?</translation> <translation id="3805899903892079518">O Chromium não têm acesso às suas fotos ou seus vídeos. Permita o acesso em "Configurações do iOS" > "Privacidade" > "Fotos".</translation> <translation id="6068866989048414399">Termos de Serviço do Chromium</translation> +<translation id="6268381023930128611">Sair do Chromium?</translation> <translation id="6424492062988593837">O Chromium ficou ainda melhor! Uma nova versão está disponível.</translation> <translation id="6600954340915313787">Copiado no Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb index dc24eed..e05ea5e 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Pretende que o Chromium se ofereça para traduzir as páginas em <ph name="LANGUAGE_NAME" /> deste site da próxima vez?</translation> <translation id="3805899903892079518">O Chromium não tem acesso aos seus vídeos ou fotos. Ative o acesso nas Definições do iOS > Privacidade > Fotos.</translation> <translation id="6068866989048414399">Termos de Utilização do Chromium</translation> +<translation id="6268381023930128611">Pretende terminar sessão no Chromium?</translation> <translation id="6424492062988593837">O Chromium ficou ainda melhor! Está disponível uma nova versão.</translation> <translation id="6600954340915313787">Copiado para o Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb index afeb9531..22b9960 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Dorești ca data viitoare Chromium să propună traducerea paginilor în limba <ph name="LANGUAGE_NAME" /> de pe acest site?</translation> <translation id="3805899903892079518">Chromium nu are acces la fotografii și videoclipuri. Activează accesul din Setări iOS > Confidențialitate > Fotografii.</translation> <translation id="6068866989048414399">Termenii și condițiile Chromium</translation> +<translation id="6268381023930128611">Te deconectezi de la Chromium?</translation> <translation id="6424492062988593837">Chromium a devenit și mai bun! Este disponibilă o nouă versiune.</translation> <translation id="6600954340915313787">Copiat în Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb index 463642e..ed67a3e 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Хотите, чтобы Chromium всегда предлагал перевести этот сайт, когда обнаружит на его страницах <ph name="LANGUAGE_NAME" />?</translation> <translation id="3805899903892079518">У Chromium нет доступа к вашим фото и видео. Чтобы предоставить его, нажмите "Настройки > Конфиденциальность > Фотографии".</translation> <translation id="6068866989048414399">Условия использования Chromium</translation> +<translation id="6268381023930128611">Выйти из Chromium?</translation> <translation id="6424492062988593837">Chromium становится лучше! Доступна новая версия.</translation> <translation id="6600954340915313787">Скопировано в Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb index 5f910c9..cde4e8c 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Chcete, aby prehliadač Chromium nabudúce ponúkol možnosť prekladu stránok v jazyku <ph name="LANGUAGE_NAME" />?</translation> <translation id="3805899903892079518">Chromium nemá prístup k vašim fotkám ani videám. Prístup povoľte v časti Nastavenia systému iOS > Súkromie > Fotky.</translation> <translation id="6068866989048414399">Zmluvné podmienky prehliadača Chromium</translation> +<translation id="6268381023930128611">Odhlásiť sa z prehliadača Chromium?</translation> <translation id="6424492062988593837">Systém Chromium bol práve vylepšený. K dispozícii je nová verzia.</translation> <translation id="6600954340915313787">Skopírovaná do prehliadača Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb index ba847c18..a9a4ddc 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Želite, da Chromium naslednjič ponudi prevod strani v jeziku <ph name="LANGUAGE_NAME" /> s tega spletnega mesta?</translation> <translation id="3805899903892079518">Chromium nima dostopa do fotografij ali videoposnetkov. Omogočite dostop v sistemu iOS: Settings > Privacy > Photos.</translation> <translation id="6068866989048414399">Pogoji storitve za Chromium</translation> +<translation id="6268381023930128611">Se želite odjaviti iz Chromiuma?</translation> <translation id="6424492062988593837">Chromium je izboljšan! Na voljo je nova različica.</translation> <translation id="6600954340915313787">Kopirano v Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb index 40403bd96..6edc566 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Желите ли да Chromium следећи пут понуди да преведе странице са овог сајта чији је језик <ph name="LANGUAGE_NAME" />?</translation> <translation id="3805899903892079518">Chromium не може да приступа сликама или видео снимцима. Омогућите приступ у iOS Settings (Подешавања iOS-а) > Privacy (Приватност) > Photos (Слике).</translation> <translation id="6068866989048414399">Chromium услови коришћења услуге</translation> +<translation id="6268381023930128611">Желите ли да се одјавите из Chromium-а?</translation> <translation id="6424492062988593837">Chromium је управо постао бољи! Доступна је нова верзија.</translation> <translation id="6600954340915313787">Копирана у Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb index f6ce34aa..dc137ec 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Vill du att Chromium ska översätta sidor skrivna på <ph name="LANGUAGE_NAME" /> på den här webbplatsen nästa gång?</translation> <translation id="3805899903892079518">Chromium har inte åtkomst till dina foton eller videor. Aktivera åtkomst i iOS-inställningar > Sekretess > Foton.</translation> <translation id="6068866989048414399">Användarvillkor för Chromium</translation> +<translation id="6268381023930128611">Vill du logga ut från Chromium?</translation> <translation id="6424492062988593837">Chrome har blivit ännu bättre! En ny version finns tillgänglig.</translation> <translation id="6600954340915313787">Kopierat till Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb index 11db55ff..0a31ca30 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Je, ungependa Chromium ijitolee kutafsiri kurasa za <ph name="LANGUAGE_NAME" /> kwenye tovuti hii wakati ujao?</translation> <translation id="3805899903892079518">Chromium haina uwezo wa kufikia picha au video zako. Washa uwezo wa kufikia katika Mipangilio ya iOS > Faragha > Picha.</translation> <translation id="6068866989048414399">Sheria na Masharti ya Chromium</translation> +<translation id="6268381023930128611">Ungependa kuondoka kwenye Chromium?</translation> <translation id="6424492062988593837">Chromium imekuwa bora! Toleo jipya linapatikana.</translation> <translation id="6600954340915313787">Imenakiliwa kwenye Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb index 22e6534d..1ebe062 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">அடுத்த முறை இந்தத் தளத்தின் <ph name="LANGUAGE_NAME" /> பக்கங்களை மொழிபெயர்க்கவா என்று Chromium கேட்க வேண்டுமென விரும்புகிறீர்களா?</translation> <translation id="3805899903892079518">Chromiumக்கு படங்கள் அல்லது வீடியோக்களுக்கான அணுகலில்லை. அணுகலை iOS அமைப்புகள் > தனியுரிமை > படங்கள் இல் இயக்கவும்.</translation> <translation id="6068866989048414399">Chromium இன் சேவை விதிமுறைகள்</translation> +<translation id="6268381023930128611">Chromium இலிருந்து வெளியேறவா?</translation> <translation id="6424492062988593837">Chromium தற்போதுதான் சிறப்பைப் பெற்றது! புதிய பதிப்பு உள்ளது.</translation> <translation id="6600954340915313787">Chromeக்கு நகலெடுக்கப்பட்டது</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb index 3e0392b..b27b738 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">మీరు తదుపరి సారి సందర్శించినప్పుడు Chromium ఈ సైట్లోని <ph name="LANGUAGE_NAME" /> పేజీలను అనువదించే సదుపాయాన్ని అందించాలని కోరుకుంటున్నారా?</translation> <translation id="3805899903892079518">Chromium మీ ఫోటోలు లేదా వీడియోలకు ప్రాప్యతను కలిగి లేదు. iOS సెట్టింగ్లు > గోప్యత > ఫోటోల్లో ప్రాప్యతను ప్రారంభించండి.</translation> <translation id="6068866989048414399">Chromium సేవా నిబంధనలు</translation> +<translation id="6268381023930128611">Chromium నుండి సైన్ అవుట్ చేయాలా?</translation> <translation id="6424492062988593837">Chrome ఇప్పుడే మెరుగుపరచబడింది! క్రొత్త సంస్కరణ అందుబాటులో ఉంది.</translation> <translation id="6600954340915313787">Chromeకి కాపీ చేయబడింది</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb index 5af6a82..ddc716b 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">คุณต้องการให้ Chromium เสนอการแปลหน้าภาษา<ph name="LANGUAGE_NAME" />จากเว็บไซต์นี้ในครั้งถัดไปไหม</translation> <translation id="3805899903892079518">Chromium ไม่มีสิทธิ์เข้าถึงรูปภาพหรือวิดีโอของคุณ เปิดใช้การเข้าถึงได้ในการตั้งค่า iOS > ความเป็นส่วนตัว > รูปภาพ</translation> <translation id="6068866989048414399">ข้อกำหนดในการให้บริการ Chromium</translation> +<translation id="6268381023930128611">ต้องการออกจาก Chromium ใช่ไหม</translation> <translation id="6424492062988593837">Chromium พัฒนาใหม่! มีรุ่นใหม่ให้ใช้งานแล้ว</translation> <translation id="6600954340915313787">คัดลอกไปยัง Chrome แล้ว</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb index 69b5834..000e58c 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Chromium'un bir dahaki sefere bu siteden <ph name="LANGUAGE_NAME" /> dilindeki sayfaları çevirmeyi önermesini ister misiniz?</translation> <translation id="3805899903892079518">Chromium, fotoğraflarınıza veya videolarınıza erişemiyor. iOS Ayarlar > Gizlilik > Fotoğraflar'dan erişimi etkinleştirin.</translation> <translation id="6068866989048414399">Chromium Hizmet Şartları</translation> +<translation id="6268381023930128611">Chromium oturumunu kapatıyor musunuz?</translation> <translation id="6424492062988593837">Chromium daha da iyi hale geldi! Yeni bir sürüm var.</translation> <translation id="6600954340915313787">Chrome'a kopyalandı</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb index 38c7fce..4bb5b7e 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Хочете, щоб Chromium наступного разу пропонував перекласти сторінки цього сайту, написані такою мовою: <ph name="LANGUAGE_NAME" />?</translation> <translation id="3805899903892079518">Chromium не має доступу до ваших фото чи відео. Надайте доступ у меню iOS "Параметри > Конфіденційність > Фото".</translation> <translation id="6068866989048414399">Умови використання Chromium</translation> +<translation id="6268381023930128611">Вийти з Chromium?</translation> <translation id="6424492062988593837">Chromium став ще кращим! Доступна нова версія.</translation> <translation id="6600954340915313787">Скопійовано в Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb index d6fa904..a2762f7 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">Bạn có muốn Chromium đề xuất dịch các trang <ph name="LANGUAGE_NAME" /> của trang web này vào lần tiếp theo không?</translation> <translation id="3805899903892079518">Chromium không có quyền truy cập ảnh hoặc video của bạn. Hãy cho phép truy cập Cài đặt iOS > Bảo mật > Ảnh.</translation> <translation id="6068866989048414399">Điều khoản dịch vụ của Chromium</translation> +<translation id="6268381023930128611">Đăng xuất khỏi Chromium?</translation> <translation id="6424492062988593837">Chromium được cải tiến hơn! Đã có phiên bản mới.</translation> <translation id="6600954340915313787">Đã sao chép vào Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb index fa4049fe..c4a214f 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">下次访问这个网站时,您希望 Chromium 翻译其中的<ph name="LANGUAGE_NAME" />网页吗?</translation> <translation id="3805899903892079518">Chromium 无权访问您的照片或视频。请依次点按 iOS 中的“设置”>“隐私”>“照片”,授予其访问权限。</translation> <translation id="6068866989048414399">Chromium 服务条款</translation> +<translation id="6268381023930128611">退出 Chromium?</translation> <translation id="6424492062988593837">Chromium 刚刚经过了改进!新版本已推出。</translation> <translation id="6600954340915313787">已复制到 Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb index 9370713..96416d6 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
@@ -6,6 +6,7 @@ <translation id="2195025571279539885">下次造訪這個網站時,需要 Chromium 為您翻譯其中的<ph name="LANGUAGE_NAME" />網頁嗎?</translation> <translation id="3805899903892079518">Chromium 無法存取您的相片或影片,請前往「iOS 設定」中的 [隱私權] > [相片] 啟用存取權。</translation> <translation id="6068866989048414399">Chromium 服務條款</translation> +<translation id="6268381023930128611">要登出 Chromium 嗎?</translation> <translation id="6424492062988593837">Chromium 現在變得更進步了!歡迎您升級使用新版本。</translation> <translation id="6600954340915313787">已複製到 Chrome</translation> <translation id="7337881442233988129">Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb index e4b472ba..6fd1947 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome няма достъп до снимките или видеоклиповете ви. Активирайте го от „Settings“ > „Privacy“ > „Photos“ в iOS.</translation> <translation id="415767770115540173">Подобрете практическата си работа с Google в Chrome въз основа на местоположението ви.</translation> +<translation id="424864128008805179">Искате ли да излезете от Chrome?</translation> <translation id="6600954340915313787">Копирано в Chrome</translation> <translation id="690638524486313356">Общи условия на Google Chrome</translation> <translation id="7400722733683201933">Всичко за Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb index ea78c3a1..36158c7 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">আপনার ছবি বা ভিডিওতে Google Chrome এর অ্যাক্সেস নেই। iOS সেটিংস > গোপনীয়তা > ফটোগুলিতে অ্যাক্সেস সক্ষম করুন।</translation> <translation id="415767770115540173">আপনার অবস্থানের উপর ভিত্তি করে Chrome এ আরো ভাল Google অভিজ্ঞতা পান।</translation> +<translation id="424864128008805179">Chrome থেকে সাইন আউট করবেন?</translation> <translation id="6600954340915313787">Chrome-এ প্রতিলিপি করা হয়েছে</translation> <translation id="690638524486313356">Google Chrome পরিষেবার শর্তাবলী</translation> <translation id="7400722733683201933">Google Chrome সম্বন্ধে</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb index f0126822..7ab55e6 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome no té accés als vostres vídeos o fotos. Permeteu-li l'accés a iOS, a Configuració > Privadesa > Fotos.</translation> <translation id="415767770115540173">Si compartiu la ubicació, millorareu la vostra experiència a Chrome.</translation> +<translation id="424864128008805179">Voleu tancar la sessió de Chrome?</translation> <translation id="6600954340915313787">Copiada de Chrome</translation> <translation id="690638524486313356">Condicions del servei de Google Chrome</translation> <translation id="7400722733683201933">Quant a Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb index 1db1da9b..bb63dc6 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome nemá přístup k vašim fotkám nebo videím. Povolte přístup v systému iOS v Nastavení > Soukromí > Fotky.</translation> <translation id="415767770115540173">Služby Google mohou v prohlížeči Chrome díky údajům o poloze fungovat lépe.</translation> +<translation id="424864128008805179">Odhlásit se z Chromu?</translation> <translation id="6600954340915313787">Zkopírováno do Chromu</translation> <translation id="690638524486313356">Smluvní podmínky Google Chrome</translation> <translation id="7400722733683201933">O aplikaci Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb index 9bb0a3e..20e975c4 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome har ikke adgang til dine billeder eller videoer. Gå til iOS Indstillinger > Privatliv > Billeder for at få adgang.</translation> <translation id="415767770115540173">Få en bedre Google-oplevelse i Chrome baseret på din placering.</translation> +<translation id="424864128008805179">Vil du logge ud af Chrome?</translation> <translation id="6600954340915313787">Kopieret til Chrome</translation> <translation id="690638524486313356">Google Chrome Servicevilkår</translation> <translation id="7400722733683201933">Om Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb index 001a945..3a910aea 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Chrome hat keinen Zugriff auf Ihre Fotos und Videos. Aktivieren Sie den Zugriff unter "iOS-Einstellungen > Datenschutz > Fotos".</translation> <translation id="415767770115540173">Profitieren Sie von einer verbesserten Google-Nutzererfahrung in Chrome auf der Grundlage Ihres Standorts.</translation> +<translation id="424864128008805179">Von Chrome abmelden?</translation> <translation id="6600954340915313787">In Chrome kopiert</translation> <translation id="690638524486313356">Chrome-Nutzungsbedingungen</translation> <translation id="7400722733683201933">Über Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb index 8dbfcd9d..58c0855 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome no puede acceder a tus fotos ni videos. Habilita el acceso en Configuración de iOS > Privacidad > Fotos.</translation> <translation id="415767770115540173">Obtén una mejor experiencia de Google en Chrome según tu ubicación.</translation> +<translation id="424864128008805179">¿Quieres salir de Chrome?</translation> <translation id="6600954340915313787">Se copió en Chrome.</translation> <translation id="690638524486313356">Condiciones del servicio de Google Chrome</translation> <translation id="7400722733683201933">Acerca de Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb index 423bd6c..b753b258 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome no puede acceder a tus fotos y vídeos (para permitirlo, ve a Ajustes de iOS > Privacidad > Fotos).</translation> <translation id="415767770115540173">Disfruta de una mejor experiencia en Chrome compartiendo tu ubicación.</translation> +<translation id="424864128008805179">¿Cerrar sesión en Chrome?</translation> <translation id="6600954340915313787">Copiada a Chrome</translation> <translation id="690638524486313356">Condiciones de Servicio de Google Chrome</translation> <translation id="7400722733683201933">Información de Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb index 3a2588a..ab126021 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome'il pole juurdepääsu fotodele ega videotele. Lubage iOS-is juurdep. valikutega Seaded > Privaatsus > Fotod.</translation> <translation id="415767770115540173">Asukohapõhised andmed tagavad teile parema Google Chrome'i kasutuskogemuse.</translation> +<translation id="424864128008805179">Kas logida Chrome'ist välja?</translation> <translation id="6600954340915313787">Chrome'i kopeeritud</translation> <translation id="690638524486313356">Google Chrome'i teenusetingimused</translation> <translation id="7400722733683201933">Google Chrome'i kohta</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb index 6375cd2..393e8ca0 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb
@@ -9,7 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome به عکسها یا ویدیوهای شما دسترسی ندارد. با رفتن به تنظیمات iOS > حریم خصوصی > عکسها دسترسی را فعال کنید.</translation> <translation id="415767770115540173">با Chrome تجربه بهتری از Google براساس موقعیت مکانیتان داشته باشید.</translation> -<translation id="424864128008805179">از Chrome ثبت خروج میکنید؟</translation> +<translation id="424864128008805179">از سیستم Chrome خارج می شوید؟</translation> <translation id="6600954340915313787">کپی در Chrome</translation> <translation id="690638524486313356">شرایط خدمات Google Chrome</translation> <translation id="7400722733683201933">درباره Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb index 0dd47d7..1a5799c 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Walang access ang Google Chrome sa larawan o video. I-enable ang access sa Mga Setting ng iOS > Privacy > Mga Larawan.</translation> <translation id="415767770115540173">Magkaroon ng mas mahusay na karanasan sa Google sa Chrome batay sa iyong lokasyon.</translation> +<translation id="424864128008805179">Mag-sign out sa Chrome?</translation> <translation id="6600954340915313787">Kinopya sa Chrome</translation> <translation id="690638524486313356">Tuntunin ng Serbisyo ng Google Chrome</translation> <translation id="7400722733683201933">Tungkol sa Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb index bd89b0c..e0c5bb5 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome n'a pas accès à vos photos ni à vos vidéos. Activez l'accès dans iOS via Réglages > Confidentialité > Photos.</translation> <translation id="415767770115540173">Améliorez votre expérience Google dans Chrome grâce à votre position.</translation> +<translation id="424864128008805179">Se déconnecter de Chrome ?</translation> <translation id="6600954340915313787">Copiée dans Chrome</translation> <translation id="690638524486313356">Conditions d'utilisation Google Chrome</translation> <translation id="7400722733683201933">À propos de Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb index 401574b..5c3a066 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome ને તમારા ફોટા અથવા વિડિઓઝની ઍક્સેસ નથી. iOS સેટિંગ્સ > ગોપનીયતા > ફોટામાં ઍક્સેસને સક્ષમ કરો.</translation> <translation id="415767770115540173">Chrome માં તમારા સ્થાન પર આધારિત બહેતર Google અનુભવ મેળવો.</translation> +<translation id="424864128008805179">Chrome માંથી સાઇન આઉટ કરીએ?</translation> <translation id="6600954340915313787">Chrome માં કોપી કરાયું</translation> <translation id="690638524486313356">Google Chrome સેવાની શરતો</translation> <translation id="7400722733683201933">Google Chrome વિશે</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb index 675be531..12467999 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome के पास आपकी फ़ोटो या वीडियो का एक्सेस नहीं है. iOS सेटिंग > गोपनीयता > फ़ोटो में एक्सेस सक्षम करें.</translation> <translation id="415767770115540173">अपने स्थान के आधार पर Chrome में एक बेहतर Google अनुभव प्राप्त करें.</translation> +<translation id="424864128008805179">Chrome से प्रस्थान करें?</translation> <translation id="6600954340915313787">Chrome पर कॉपी किया गया</translation> <translation id="690638524486313356">Google Chrome सेवा की शर्तें</translation> <translation id="7400722733683201933">Google Chrome के बारे में</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb index e016278..a4dc101 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">A Google Chrome nem fér hozzá az Ön képeihez és videóihoz. Engedélyezés iOS-en: Beállítások > Adatvédelem > Fényképek.</translation> <translation id="415767770115540173">Jobb Google-felhasználói élmény a Chrome-ban a tartózkodási hely alapján.</translation> +<translation id="424864128008805179">Kijelentkezés a Chrome-ból</translation> <translation id="6600954340915313787">A Chrome-ba másolva</translation> <translation id="690638524486313356">Google Chrome – ÁSZF</translation> <translation id="7400722733683201933">A Google Chrome névjegye</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb index 232da12..09ea73b 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">ל-Google Chrome אין גישה לתמונות או לסרטונים שלך. אפשר גישה ב'הגדרות iOS' > 'פרטיות' > 'תמונות'.</translation> <translation id="415767770115540173">תוכל ליהנות מחוויית Google משופרת ב-Chrome בהתבסס על המיקום שלך.</translation> +<translation id="424864128008805179">האם לצאת מ-Chrome?</translation> <translation id="6600954340915313787">הועתק אל Chrome</translation> <translation id="690638524486313356">התנאים וההגבלות של Google Chrome</translation> <translation id="7400722733683201933">אודות Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb index fa7743b..862575a 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome で写真または動画にアクセスできません。iOS の [設定] > [プライバシー] > [写真] でアクセスを有効にしてください。</translation> <translation id="415767770115540173">ユーザーの場所に基づいてChromeでGoogleを使いやすくします。</translation> +<translation id="424864128008805179">Chrome からログアウトしますか?</translation> <translation id="6600954340915313787">Chrome にコピー済み</translation> <translation id="690638524486313356">Google Chrome 利用規約</translation> <translation id="7400722733683201933">Google Chrome について</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb index 66e444e..9f3109d 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">ನಿಮ್ಮ ಫೋಟೋಗಳು ಅಥವಾ ವೀಡಿಯೊಗಳಿಗೆ Google Chrome ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ. iOS ಸೆಟ್ಟಿಂಗ್ಗಳು > ಗೌಪ್ಯತೆ > ಫೋಟೋಗಳಲ್ಲಿ ಪ್ರವೇಶವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation> <translation id="415767770115540173">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಆಧರಿಸಿ Chrome ನಲ್ಲಿ ಉತ್ತಮ Google ಅನುಭವವನ್ನು ಪಡೆಯಿರಿ.</translation> +<translation id="424864128008805179">Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದೇ?</translation> <translation id="6600954340915313787">Chrome ಗೆ ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="690638524486313356">Google Chrome ಸೇವಾ ನಿಯಮಗಳು</translation> <translation id="7400722733683201933">Google Chrome ಬಗ್ಗೆ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb index ff0ce58..ffce0d4 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Chrome이 사진 또는 동영상에 액세스할 수 없습니다. 'iOS 설정 > 개인정보 보호 > 사진'에서 액세스를 허용하세요.</translation> <translation id="415767770115540173">위치 정보를 기반으로 Chrome에서 더 나은 Google 환경을 이용할 수 있습니다.</translation> +<translation id="424864128008805179">Chrome에서 로그아웃하시겠습니까?</translation> <translation id="6600954340915313787">Chrome에 복사됨</translation> <translation id="690638524486313356">Chrome 서비스 약관</translation> <translation id="7400722733683201933">Chrome 정보</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb index ee60dd67..5b88fdc 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">„Google Inc.“</translation> <translation id="3988789688219830639">„Google Chrome“ nepasiekia nuotraukų ar vaizdo įr. Įgal. prieigą apsil. „iOS“ nustatymai“ > „Privatumas“ > „Nuotraukos“.</translation> <translation id="415767770115540173">Patogiau naudokitės „Google“ funkcijomis naudodami pagal vietovę pritaikytą „Chrome“.</translation> +<translation id="424864128008805179">Atsijungti nuo „Chrome“?</translation> <translation id="6600954340915313787">Nukopijuota į „Chrome“</translation> <translation id="690638524486313356">„Google Chrome“ pasl. teik. s.</translation> <translation id="7400722733683201933">Apie „Google Chrome“</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb index f69fe01..4ef4155 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome nevar piekļūt jūsu fotoattēliem vai videoklipiem. Iespējojiet piekļuvi: iOS Settings > Privacy > Photos.</translation> <translation id="415767770115540173">Uzlabojiet savu Google pakalpojumu izmantošanas pieredzi pārlūkā Chrome, sūtot informāciju par savu atrašanās vietu.</translation> +<translation id="424864128008805179">Vai izrakstīties no pārlūka Chrome?</translation> <translation id="6600954340915313787">Nokopēta pārlūkā Chrome.</translation> <translation id="690638524486313356">Google Chrome pakalpojumu sniegšanas noteikumi</translation> <translation id="7400722733683201933">Par Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb index 6484beaa..83e319d 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome-ന് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കോ വീഡിയോകളിലേക്കോ ആക്സസ്സ് ഇല്ല. iOS ക്രമീകരണം > സ്വകാര്യത > ഫോട്ടോകൾ എന്നതിൽ ആക്സസ്സ് പ്രവർത്തനക്ഷമമാക്കുക.</translation> <translation id="415767770115540173">Chrome-ൽ നിങ്ങളുടെ ലൊക്കേഷൻ അടിസ്ഥാനമാക്കിയുള്ള ഒരു മികച്ച Google അനുഭവം നേടുക.</translation> +<translation id="424864128008805179">Chrome-ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യണോ?</translation> <translation id="6600954340915313787">Chrome-ലേക്ക് പ്കർത്തി</translation> <translation id="690638524486313356">Google Chrome സേവന നിബന്ധനകൾ</translation> <translation id="7400722733683201933">Google Chrome നെ കുറിച്ച്</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb index 4fef254..6e79436 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome ला आपल्या फोटो आणि व्हिडिओंमध्ये प्रवेश नाही. iOS सेटिंग्ज > गोपनीयता > फोटो मध्ये प्रवेश सक्षम करा.</translation> <translation id="415767770115540173">आपल्या स्थानावर आधारित Chrome मध्ये उत्कृष्ट Google अनुभव मिळवा.</translation> +<translation id="424864128008805179">Chrome मधून साइन आउट करायचे?</translation> <translation id="6600954340915313787">Chrome वर कॉपी केले</translation> <translation id="690638524486313356">Google Chrome सेवा अटी</translation> <translation id="7400722733683201933">Google Chrome बद्दल</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb index a9e596d..13913ab 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome har ikke tilgang til bildene eller videoene dine. Slå på tilgangen i iOS-innstillingene > Personvern > Bilder.</translation> <translation id="415767770115540173">Få en bedre Google-opplevelse i Chrome basert på hvor du er.</translation> +<translation id="424864128008805179">Vil du logge av Chrome?</translation> <translation id="6600954340915313787">Kopiert til Chrome</translation> <translation id="690638524486313356">Vilkår for Google Chrome</translation> <translation id="7400722733683201933">Om Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb index cb0f9a2..e8cbd644 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome nie ma dostępu do Twoich zdjęć ani filmów. Aby włączyć dostęp w iOS, wybierz Ustawienia > Prywatność > Zdjęcia.</translation> <translation id="415767770115540173">Włączenie udostępniania lokalizacji w Chrome pozwala w pełni korzystać z usług Google.</translation> +<translation id="424864128008805179">Wylogować z Chrome?</translation> <translation id="6600954340915313787">Skopiowana do Chrome</translation> <translation id="690638524486313356">Warunki korzystania z Google Chrome</translation> <translation id="7400722733683201933">Google Chrome – informacje</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb index e679d09a..63bd3fe7 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome nu are acces la fotografii și videoclipuri. Activează accesul din Setări iOS > Confidențialitate > Fotografii.</translation> <translation id="415767770115540173">Beneficiază de o experiență Google mai bună în Chrome pe baza locației.</translation> +<translation id="424864128008805179">Te deconectezi de la Chrome?</translation> <translation id="6600954340915313787">Copiat în Chrome</translation> <translation id="690638524486313356">Termenii și condițiile Google Chrome</translation> <translation id="7400722733683201933">Despre Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb index 9031f27..b22eeae 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">У Google Chrome нет доступа к вашим фото и видео. Чтобы предоставить его, нажмите "Настройки > Конфиденциальность > Фотографии".</translation> <translation id="415767770115540173">Разрешите браузеру определять ваше местоположение и пользуйтесь дополнительными возможностями Chrome.</translation> +<translation id="424864128008805179">Выйти из Chrome?</translation> <translation id="6600954340915313787">Скопировано в Chrome</translation> <translation id="690638524486313356">Условия использования Google Chrome</translation> <translation id="7400722733683201933">О браузере Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb index d375524..588dca5 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome nima dostopa do fotografij ali videoposnetkov. Omogočite dostop v sistemu iOS: Settings > Privacy > Photos.</translation> <translation id="415767770115540173">Get a better Google experience in Chrome based on your location.</translation> +<translation id="424864128008805179">Se želite odjaviti iz Chroma?</translation> <translation id="6600954340915313787">Kopirano v Chrome</translation> <translation id="690638524486313356">Pogoji storitve za Google Chrome</translation> <translation id="7400722733683201933">O brskalniku Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb index 0a63e46..83d3be13 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome не може да приступа сликама или видео снимцима. Омогућите приступ у iOS Settings (Подешавања iOS-а) > Privacy (Приватност) > Photos (Слике).</translation> <translation id="415767770115540173">Побољшајте Google доживљај у Chrome-у на основу локације.</translation> +<translation id="424864128008805179">Желите ли да се одјавите из Chrome-а?</translation> <translation id="6600954340915313787">Копирана у Chrome</translation> <translation id="690638524486313356">Google Chrome услови коришћења услуге</translation> <translation id="7400722733683201933">О програму Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb index 2eb99f3..680c333 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome har inte åtkomst till dina foton eller videor. Aktivera åtkomst i iOS-inställningar > Sekretess > Foton.</translation> <translation id="415767770115540173">Ange din plats och få en bättre upplevelse av Google när du använder Chrome.</translation> +<translation id="424864128008805179">Vill du logga ut från Chrome?</translation> <translation id="6600954340915313787">Kopierat till Chrome</translation> <translation id="690638524486313356">Användarvillkor för Google Chrome</translation> <translation id="7400722733683201933">Om Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb index 97746b1..4bf9eda 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chromeக்கு படங்கள் அல்லது வீடியோக்களுக்கான அணுகலில்லை. அணுகலை iOS அமைப்புகள் > தனியுரிமை > படங்கள் இல் இயக்கவும்.</translation> <translation id="415767770115540173">உங்கள் இருப்பிடத்தின் அடிப்படையில், Chrome இல் சிறந்த Google அனுபவத்தைப் பெறவும்.</translation> +<translation id="424864128008805179">Chrome இலிருந்து வெளியேறவா?</translation> <translation id="6600954340915313787">Chromeக்கு நகலெடுக்கப்பட்டது</translation> <translation id="690638524486313356">Google Chrome இன் சேவை விதிமுறைகள்</translation> <translation id="7400722733683201933">Google Chrome பற்றி</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb index 32bec57..cd6ab2a 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome మీ ఫోటోలు లేదా వీడియోలకు ప్రాప్యతను కలిగి లేదు. iOS సెట్టింగ్లు > గోప్యత > ఫోటోల్లో ప్రాప్యతను ప్రారంభించండి.</translation> <translation id="415767770115540173">మీ స్థానం ఆధారంగా Chromeలో మెరుగైన Google అనుభవాన్ని పొందండి.</translation> +<translation id="424864128008805179">Chrome నుండి సైన్ అవుట్ చేయాలా?</translation> <translation id="6600954340915313787">Chromeకి కాపీ చేయబడింది</translation> <translation id="690638524486313356">Google Chrome సేవా నిబంధనలు</translation> <translation id="7400722733683201933">Google Chrome గురించి</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb index f13ad46..814ed8a 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome ไม่มีสิทธิ์เข้าถึงรูปภาพหรือวิดีโอของคุณ เปิดการเข้าถึงได้ในการตั้งค่า iOS > ความเป็นส่วนตัว > รูปภาพ</translation> <translation id="415767770115540173">รับประสบการณ์การใช้งาน Google ที่ดีขึ้นใน Chrome โดยอิงตามตำแหน่งของคุณ</translation> +<translation id="424864128008805179">ต้องการออกจากระบบ Chrome ไหม</translation> <translation id="6600954340915313787">คัดลอกไปยัง Chrome แล้ว</translation> <translation id="690638524486313356">ข้อกำหนดในการให้บริการ Google Chrome</translation> <translation id="7400722733683201933">เกี่ยวกับ Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb index d1d84c8d..ab86286 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome, fotoğraflarınıza veya videolarınıza erişemiyor. iOS Ayarlar > Gizlilik > Fotoğraflar'dan erişimi etkinleştirin.</translation> <translation id="415767770115540173">Chrome'da, konumunuza dayalı olarak daha iyi bir Google deneyimi yaşayın.</translation> +<translation id="424864128008805179">Chrome oturumu kapatılsın mı?</translation> <translation id="6600954340915313787">Chrome'a kopyalandı</translation> <translation id="690638524486313356">Google Chrome Hizmet Şartları</translation> <translation id="7400722733683201933">Google Chrome hakkında</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb index 28a7b43b..d7bccd1 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome не має доступу до ваших фото чи відео. Надайте доступ у меню iOS "Параметри > Конфіденційність > Фото".</translation> <translation id="415767770115540173">Знаючи ваше місцезнаходження, Google зможе створити для вас зручніші умови роботи в Chrome.</translation> +<translation id="424864128008805179">Вийти з Chrome?</translation> <translation id="6600954340915313787">Скопійовано в Chrome</translation> <translation id="690638524486313356">Умови використання Google Chrome</translation> <translation id="7400722733683201933">Про Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb index 1e56d90..78d2d2a9 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome 无权访问您的照片或视频。请依次点按 iOS 中的“设置”>“隐私”>“照片”,授予其访问权限。</translation> <translation id="415767770115540173">要在 Chrome 中获得更好的 Google 使用体验,需要用到您的位置信息。</translation> +<translation id="424864128008805179">退出 Chrome?</translation> <translation id="6600954340915313787">已复制到 Chrome</translation> <translation id="690638524486313356">Google Chrome 服务条款</translation> <translation id="7400722733683201933">关于Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb index edcc6c9..c3b9452 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
@@ -9,6 +9,7 @@ <translation id="3870154837782082782">Google Inc.</translation> <translation id="3988789688219830639">Google Chrome 無法存取您的相片或影片,請前往「iOS 設定」中的 [隱私權] > [相片] 啟用存取權。</translation> <translation id="415767770115540173">在您使用 Chrome 時,讓 Google 根據您的位置資訊提供更優質的服務。</translation> +<translation id="424864128008805179">要登出 Chrome 嗎?</translation> <translation id="6600954340915313787">已複製到 Chrome</translation> <translation id="690638524486313356">Google Chrome 服務條款</translation> <translation id="7400722733683201933">關於 Google Chrome</translation>
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn index fbc8c23..f0ee057 100644 --- a/ios/chrome/browser/BUILD.gn +++ b/ios/chrome/browser/BUILD.gn
@@ -117,12 +117,6 @@ "crash_report/crash_report_user_application_state.mm", "crash_report/crash_upload_list.cc", "crash_report/crash_upload_list.h", - "data_reduction_proxy/ios_chrome_data_reduction_proxy_io_data.h", - "data_reduction_proxy/ios_chrome_data_reduction_proxy_io_data.mm", - "data_reduction_proxy/ios_chrome_data_reduction_proxy_settings.cc", - "data_reduction_proxy/ios_chrome_data_reduction_proxy_settings.h", - "data_reduction_proxy/ios_chrome_data_reduction_proxy_settings_factory.cc", - "data_reduction_proxy/ios_chrome_data_reduction_proxy_settings_factory.h", "dom_distiller/distiller_viewer.cc", "dom_distiller/distiller_viewer.h", "dom_distiller/dom_distiller_service_factory.cc", @@ -532,7 +526,6 @@ "//components/cookie_config", "//components/crash/core/browser", "//components/crash/core/common", - "//components/data_reduction_proxy/core/common", "//components/dom_distiller/core", "//components/dom_distiller/ios", "//components/favicon/core",
diff --git a/ios/chrome/browser/favicon/large_icon_cache.cc b/ios/chrome/browser/favicon/large_icon_cache.cc index 2841a67..b05b79b9 100644 --- a/ios/chrome/browser/favicon/large_icon_cache.cc +++ b/ios/chrome/browser/favicon/large_icon_cache.cc
@@ -28,9 +28,9 @@ void LargeIconCache::SetCachedResult( const GURL& url, const favicon_base::LargeIconResult& result) { - LargeIconCacheEntry* entry = new LargeIconCacheEntry; + scoped_ptr<LargeIconCacheEntry> entry(new LargeIconCacheEntry); entry->result = CloneLargeIconResult(result); - cache_.Put(url, entry); + cache_.Put(url, std::move(entry)); } scoped_ptr<favicon_base::LargeIconResult> LargeIconCache::GetCachedResult(
diff --git a/ios/chrome/browser/favicon/large_icon_cache.h b/ios/chrome/browser/favicon/large_icon_cache.h index 67abec9..5d7d4472 100644 --- a/ios/chrome/browser/favicon/large_icon_cache.h +++ b/ios/chrome/browser/favicon/large_icon_cache.h
@@ -47,7 +47,7 @@ scoped_ptr<favicon_base::LargeIconResult> CloneLargeIconResult( const favicon_base::LargeIconResult& large_icon_result); - base::OwningMRUCache<GURL, LargeIconCacheEntry*> cache_; + base::MRUCache<GURL, scoped_ptr<LargeIconCacheEntry>> cache_; DISALLOW_COPY_AND_ASSIGN(LargeIconCache); };
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h index 76cbf33..baf891e 100644 --- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h +++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "components/infobars/core/confirm_infobar_delegate.h" +#include "components/password_manager/core/browser/password_manager_metrics_util.h" namespace password_manager { class PasswordFormManager; @@ -33,13 +34,6 @@ ~IOSChromeSavePasswordInfoBarDelegate() override; private: - enum ResponseType { - NO_RESPONSE = 0, - REMEMBER_PASSWORD, - DO_NOT_REMEMBER_PASSWORD, - NUM_RESPONSE_TYPES, - }; - IOSChromeSavePasswordInfoBarDelegate( bool is_smart_lock_branding_enabled, scoped_ptr<password_manager::PasswordFormManager> form_to_save); @@ -60,7 +54,7 @@ scoped_ptr<password_manager::PasswordFormManager> form_to_save_; // Used to track the results we get from the info bar. - ResponseType infobar_response_; + password_manager::metrics_util::ResponseType infobar_response_; // Whether to show the password manager branded as Smart Lock. bool is_smart_lock_branding_enabled_;
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm index 6724251..67da5c4 100644 --- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm +++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
@@ -40,14 +40,15 @@ IOSChromeSavePasswordInfoBarDelegate::~IOSChromeSavePasswordInfoBarDelegate() { UMA_HISTOGRAM_ENUMERATION("PasswordManager.InfoBarResponse", - infobar_response_, NUM_RESPONSE_TYPES); + infobar_response_, + password_manager::metrics_util::NUM_RESPONSE_TYPES); } IOSChromeSavePasswordInfoBarDelegate::IOSChromeSavePasswordInfoBarDelegate( bool is_smart_lock_branding_enabled, scoped_ptr<PasswordFormManager> form_to_save) : form_to_save_(std::move(form_to_save)), - infobar_response_(NO_RESPONSE), + infobar_response_(password_manager::metrics_util::NO_RESPONSE), is_smart_lock_branding_enabled_(is_smart_lock_branding_enabled) {} infobars::InfoBarDelegate::Type @@ -85,14 +86,14 @@ bool IOSChromeSavePasswordInfoBarDelegate::Accept() { DCHECK(form_to_save_); form_to_save_->Save(); - infobar_response_ = REMEMBER_PASSWORD; + infobar_response_ = password_manager::metrics_util::REMEMBER_PASSWORD; return true; } bool IOSChromeSavePasswordInfoBarDelegate::Cancel() { DCHECK(form_to_save_); form_to_save_->PermanentlyBlacklist(); - infobar_response_ = DO_NOT_REMEMBER_PASSWORD; + infobar_response_ = password_manager::metrics_util::NEVER_REMEMBER_PASSWORD; return true; }
diff --git a/ios/chrome/browser/signin/gaia_auth_fetcher_ios_unittest.mm b/ios/chrome/browser/signin/gaia_auth_fetcher_ios_unittest.mm index 822ac27..9b5fa1c 100644 --- a/ios/chrome/browser/signin/gaia_auth_fetcher_ios_unittest.mm +++ b/ios/chrome/browser/signin/gaia_auth_fetcher_ios_unittest.mm
@@ -11,7 +11,6 @@ #include "ios/chrome/browser/signin/gaia_auth_fetcher_ios_private.h" #include "ios/web/public/test/test_browser_state.h" #include "ios/web/public/test/test_web_thread_bundle.h" -#include "ios/web/public/test/web_test_util.h" #include "net/url_request/test_url_fetcher_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -149,7 +148,6 @@ // Tests whether the WKWebView is actually stopped when the browser state is // inactive. TEST_F(GaiaAuthFetcherIOSTest, OnInactive) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); [[GetMockWKWebView() expect] stopLoading]; web::BrowserState::GetActiveStateManager(&browser_state_)->SetActive(false); EXPECT_OCMOCK_VERIFY(GetMockWKWebView());
diff --git a/ios/chrome/browser/snapshots/lru_cache.h b/ios/chrome/browser/snapshots/lru_cache.h index 872a236..dcc4c81 100644 --- a/ios/chrome/browser/snapshots/lru_cache.h +++ b/ios/chrome/browser/snapshots/lru_cache.h
@@ -7,21 +7,11 @@ #import <Foundation/Foundation.h> -// The LRUCache delegate is called before an item is evicted from the cache. -@protocol LRUCacheDelegate - -- (void)lruCacheWillEvictObject:(id<NSObject>)object; - -@end - // This class implements a cache with a limited size. Once the cache reach its // size limit, it will start to evict items in a Least Recently Used order // (where the term "used" is determined in terms of query to the cache). @interface LRUCache : NSObject -// The delegate of the LRUCache called when objects are evicted from the cache. -@property(nonatomic, assign) id<LRUCacheDelegate> delegate; - // The maximum amount of items that the cache can hold before starting to // evict. The value 0 is used to signify that the cache can hold an unlimited // amount of elements (i.e. never evicts). @@ -43,18 +33,13 @@ // Adds the pair |key|, |obj| to the cache. If the value of the maxCacheSize // property is non zero, the cache may evict an elements if the maximum cache // size is reached. If the |key| is already present in the cache, the value for -// that key is replaced by |object|. For any evicted object and if the delegate -// is -// non nil, it will receive a call to the lruCacheWillEvictObject: selector. +// that key is replaced by |object|. - (void)setObject:(id<NSObject>)object forKey:(NSObject*)key; -// Remove the key, value pair corresponding to the given |key|. If the delegate -// is non nil, it will receive a call to the lruCacheWillEvictObject: selector. +// Remove the key, value pair corresponding to the given |key|. - (void)removeObjectForKey:(id<NSObject>)key; -// Remove all objects from the cache. For all evicted objects and if the -// delegate is non nil, it will receive a call to the lruCacheWillEvictObject: -// selector. +// Remove all objects from the cache. - (void)removeAllObjects; // Returns the amount of items that the cache currently hold.
diff --git a/ios/chrome/browser/snapshots/lru_cache.mm b/ios/chrome/browser/snapshots/lru_cache.mm index 3b70f65..d9a35c6 100644 --- a/ios/chrome/browser/snapshots/lru_cache.mm +++ b/ios/chrome/browser/snapshots/lru_cache.mm
@@ -14,21 +14,6 @@ namespace { -class MRUCacheNSObjectDelegate { - public: - MRUCacheNSObjectDelegate(id<LRUCacheDelegate> delegate) - : delegate_(delegate) {} - - MRUCacheNSObjectDelegate(const MRUCacheNSObjectDelegate& other) = default; - - void operator()(const base::scoped_nsprotocol<id<NSObject>>& payload) const { - [delegate_ lruCacheWillEvictObject:payload.get()]; - } - - private: - id<LRUCacheDelegate> delegate_; // Weak. -}; - struct NSObjectEqualTo { bool operator()(const base::scoped_nsprotocol<id<NSObject>>& obj1, const base::scoped_nsprotocol<id<NSObject>>& obj2) const { @@ -52,20 +37,17 @@ : public base::MRUCacheBase<base::scoped_nsprotocol<id<NSObject>>, base::scoped_nsprotocol<id<NSObject>>, NSObjectHash, - MRUCacheNSObjectDelegate, MRUCacheNSObjectHashMap> { private: typedef base::MRUCacheBase<base::scoped_nsprotocol<id<NSObject>>, base::scoped_nsprotocol<id<NSObject>>, NSObjectHash, - MRUCacheNSObjectDelegate, MRUCacheNSObjectHashMap> ParentType; public: - NSObjectMRUCache(typename ParentType::size_type max_size, - const MRUCacheNSObjectDelegate& deletor) - : ParentType(max_size, deletor) {} + explicit NSObjectMRUCache(typename ParentType::size_type max_size) + : ParentType(max_size) {} private: DISALLOW_COPY_AND_ASSIGN(NSObjectMRUCache); @@ -73,14 +55,10 @@ } // namespace -@interface LRUCache ()<LRUCacheDelegate> -@end - @implementation LRUCache { scoped_ptr<NSObjectMRUCache> _cache; } -@synthesize delegate = _delegate; @synthesize maxCacheSize = _maxCacheSize; - (instancetype)init { @@ -92,8 +70,7 @@ self = [super init]; if (self) { _maxCacheSize = maxCacheSize; - MRUCacheNSObjectDelegate cacheDelegateDeletor(self); - _cache.reset(new NSObjectMRUCache(self.maxCacheSize, cacheDelegateDeletor)); + _cache.reset(new NSObjectMRUCache(self.maxCacheSize)); } return self; } @@ -131,10 +108,4 @@ return _cache->empty(); } -#pragma mark - Private - -- (void)lruCacheWillEvictObject:(id<NSObject>)obj { - [self.delegate lruCacheWillEvictObject:obj]; -} - @end
diff --git a/ios/chrome/browser/snapshots/lru_cache_unittest.mm b/ios/chrome/browser/snapshots/lru_cache_unittest.mm index 858a5c3..ef0b920 100644 --- a/ios/chrome/browser/snapshots/lru_cache_unittest.mm +++ b/ios/chrome/browser/snapshots/lru_cache_unittest.mm
@@ -6,32 +6,10 @@ #import "ios/chrome/browser/snapshots/lru_cache.h" #include "testing/gtest/include/gtest/gtest.h" -@interface LRUCacheTestDelegate : NSObject<LRUCacheDelegate> - -@property(nonatomic, retain) id<NSObject> lastEvictedObject; -@property(nonatomic, assign) NSInteger evictedObjectsCount; - -@end - -@implementation LRUCacheTestDelegate - -@synthesize lastEvictedObject = _lastEvictedObject; -@synthesize evictedObjectsCount = _evictedObjectsCount; - -- (void)lruCacheWillEvictObject:(id<NSObject>)obj { - self.lastEvictedObject = obj; - ++_evictedObjectsCount; -} - -@end - namespace { TEST(LRUCacheTest, Basic) { base::scoped_nsobject<LRUCache> cache([[LRUCache alloc] initWithCacheSize:3]); - base::scoped_nsobject<LRUCacheTestDelegate> delegate( - [[LRUCacheTestDelegate alloc] init]); - [cache setDelegate:delegate]; base::scoped_nsobject<NSString> value1( [[NSString alloc] initWithString:@"Value 1"]); @@ -51,8 +29,6 @@ [cache setObject:value4 forKey:@"VALUE 4"]; EXPECT_TRUE([cache count] == 3); - EXPECT_TRUE([delegate evictedObjectsCount] == 1); - EXPECT_TRUE([delegate lastEvictedObject] == value1.get()); // Check LRU behaviour, the value least recently added value should have been // evicted.
diff --git a/ios/net/cookies/cookie_store_ios.h b/ios/net/cookies/cookie_store_ios.h index 29feb38b..c80e7d3e 100644 --- a/ios/net/cookies/cookie_store_ios.h +++ b/ios/net/cookies/cookie_store_ios.h
@@ -162,6 +162,8 @@ const std::string& name, const CookieChangedCallback& callback) override; + bool IsEphemeral() override; + private: // For tests. friend struct CookieStoreIOSTestTraits;
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm index 0d5f0017..32d760f 100644 --- a/ios/net/cookies/cookie_store_ios.mm +++ b/ios/net/cookies/cookie_store_ios.mm
@@ -999,6 +999,10 @@ return hook_map_[key]->Add(callback); } +bool CookieStoreIOS::IsEphemeral() { + return cookie_monster_->IsEphemeral(); +} + bool CookieStoreIOS::UpdateCacheForCookieFromSystem( const GURL& gurl, const std::string& name,
diff --git a/ios/net/cookies/cookie_store_ios_unittest.mm b/ios/net/cookies/cookie_store_ios_unittest.mm index e37c5e9..c436cc9 100644 --- a/ios/net/cookies/cookie_store_ios_unittest.mm +++ b/ios/net/cookies/cookie_store_ios_unittest.mm
@@ -179,6 +179,10 @@ return scoped_ptr<CookieStore::CookieChangedSubscription>(); } + bool IsEphemeral() override { + return store_->IsEphemeral(); + } + private: void RoundTrip() { CookieStoreIOS::SwitchSynchronizedStore(store_.get(), dummy_store_.get());
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn index bf1b54bd..9ac855e1 100644 --- a/ios/web/BUILD.gn +++ b/ios/web/BUILD.gn
@@ -341,8 +341,8 @@ "public/test/response_providers/file_based_response_provider_impl.mm", "public/test/response_providers/response_provider.h", "public/test/response_providers/response_provider.mm", - "public/test/scoped_Testing_web_client.h", - "public/test/scoped_Testing_web_client.mm", + "public/test/scoped_testing_web_client.h", + "public/test/scoped_testing_web_client.mm", "public/test/test_browser_state.cc", "public/test/test_browser_state.h", "public/test/test_web_client.h",
diff --git a/ios/web/browser_state_web_view_partition_inttest.mm b/ios/web/browser_state_web_view_partition_inttest.mm index 14a470c..9e39ea6 100644 --- a/ios/web/browser_state_web_view_partition_inttest.mm +++ b/ios/web/browser_state_web_view_partition_inttest.mm
@@ -11,7 +11,6 @@ #include "ios/web/public/browser_state.h" #import "ios/web/public/test/http_server.h" #include "ios/web/public/test/response_providers/string_response_provider.h" -#include "ios/web/public/test/web_test_util.h" #import "ios/web/public/web_view_creation_util.h" #import "ios/web/test/web_int_test.h" #import "ios/web/web_state/ui/web_view_js_utils.h" @@ -43,7 +42,6 @@ class BrowserStateWebViewPartitionTest : public web::WebIntTest { protected: void SetUp() override { - CR_TEST_REQUIRES_WK_WEB_VIEW(); web::WebIntTest::SetUp(); otr_browser_state_.SetOffTheRecord(true); @@ -56,8 +54,6 @@ } void TearDown() override { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - web::test::HttpServer& server = web::test::HttpServer::GetSharedInstance(); server.RemoveResponseProvider(provider_.release()); @@ -145,8 +141,6 @@ // Tests that cookies are partitioned between web views created with a // non-OTR BrowserState and an OTR BrowserState. TEST_F(BrowserStateWebViewPartitionTest, Cookies) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - base::scoped_nsobject<WKWebView> web_view_1( web::CreateWKWebView(CGRectZero, GetBrowserState())); LoadTestWebPage(web_view_1); @@ -171,8 +165,6 @@ // Tests that localStorage is partitioned between web views created with a // non-OTR BrowserState and an OTR BrowserState. TEST_F(BrowserStateWebViewPartitionTest, LocalStorage) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - base::scoped_nsobject<WKWebView> web_view_1( web::CreateWKWebView(CGRectZero, GetBrowserState())); LoadTestWebPage(web_view_1);
diff --git a/ios/web/public/web_state/ui/crw_native_content.h b/ios/web/public/web_state/ui/crw_native_content.h index 91f1391..263b101 100644 --- a/ios/web/public/web_state/ui/crw_native_content.h +++ b/ios/web/public/web_state/ui/crw_native_content.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "ios/web/public/block_types.h" #include "url/gurl.h" @protocol CRWNativeContentDelegate; @@ -49,6 +50,12 @@ // Notifies the CRWNativeContent that it has been hidden. - (void)wasHidden; +// Evaluates JavaScript on the native view. |handler| is called with the results +// of the evaluation. If the native view cannot evaluate JS at the moment, +// |handler| is called with an NSError. +- (void)evaluateJavaScript:(NSString*)script + stringResultHandler:(web::JavaScriptCompletion)handler; + // Returns |YES| if CRWNativeContent wants the keyboard shield when the keyboard // is up. - (BOOL)wantsKeyboardShield;
diff --git a/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm b/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm index 0e4b5455..15992012 100644 --- a/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm +++ b/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm
@@ -10,7 +10,6 @@ #import "base/mac/scoped_nsobject.h" #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" -#include "ios/web/public/test/web_test_util.h" #import "ios/web/public/web_view_creation_util.h" #import "ios/web/test/web_test.h" #import "ios/web/web_state/ui/crw_wk_script_message_router.h"
diff --git a/ios/web/web_state/js/page_script_util_unittest.mm b/ios/web/web_state/js/page_script_util_unittest.mm index 5eee4f2..90ed3f2 100644 --- a/ios/web/web_state/js/page_script_util_unittest.mm +++ b/ios/web/web_state/js/page_script_util_unittest.mm
@@ -13,7 +13,6 @@ #import "ios/web/public/test/js_test_util.h" #include "ios/web/public/test/test_browser_state.h" #import "ios/web/public/test/test_web_client.h" -#include "ios/web/public/test/web_test_util.h" #import "ios/web/public/web_view_creation_util.h" #import "ios/web/test/web_test.h" #include "testing/gtest_mac.h" @@ -36,7 +35,6 @@ // Tests that WKWebView early page script is a valid script that injects global // __gCrWeb object. TEST_F(PageScriptUtilTest, WKWebViewEarlyPageScript) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); base::scoped_nsobject<WKWebView> web_view( CreateWKWebView(CGRectZero, GetBrowserState())); EvaluateJavaScript(web_view, GetEarlyPageScript(WK_WEB_VIEW_TYPE)); @@ -54,7 +52,6 @@ // Tests that embedder's WKWebView script is included into early script. TEST_F(PageScriptUtilTest, WKEmbedderScript) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); GetWebClient()->SetEarlyPageScript(@"__gCrEmbedder = {};", WK_WEB_VIEW_TYPE); base::scoped_nsobject<WKWebView> web_view( CreateWKWebView(CGRectZero, GetBrowserState()));
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index 92b8bed0..6f7657af 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -23,7 +23,6 @@ #import "ios/web/navigation/navigation_manager_impl.h" #include "ios/web/public/referrer.h" #include "ios/web/public/test/test_web_view_content_view.h" -#include "ios/web/public/test/web_test_util.h" #import "ios/web/public/web_state/crw_web_controller_observer.h" #import "ios/web/public/web_state/ui/crw_content_view.h" #import "ios/web/public/web_state/ui/crw_web_view_content_view.h"
diff --git a/ios/web/web_state/ui/crw_wk_script_message_router_unittest.mm b/ios/web/web_state/ui/crw_wk_script_message_router_unittest.mm index c6b73aa2..2e91f43 100644 --- a/ios/web/web_state/ui/crw_wk_script_message_router_unittest.mm +++ b/ios/web/web_state/ui/crw_wk_script_message_router_unittest.mm
@@ -9,7 +9,7 @@ #include "ios/web/public/test/scoped_testing_web_client.h" #include "ios/web/public/test/test_browser_state.h" #import "ios/web/public/test/test_web_client.h" -#include "ios/web/public/test/web_test_util.h" +#import "ios/web/public/web_view_creation_util.h" #import "ios/web/test/web_test.h" #include "third_party/ocmock/OCMock/OCMock.h" #include "third_party/ocmock/gtest_support.h" @@ -33,7 +33,6 @@ protected: void SetUp() override { web::WebTest::SetUp(); - CR_TEST_REQUIRES_WK_WEB_VIEW(); // Mock WKUserContentController object. controller_mock_.reset( [[OCMockObject mockForClass:[WKUserContentController class]] retain]); @@ -89,15 +88,11 @@ // Tests CRWWKScriptMessageRouter designated initializer. TEST_F(CRWWKScriptMessageRouterTest, Initialization) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - EXPECT_TRUE(router_); } // Tests registration/deregistation of message handlers. TEST_F(CRWWKScriptMessageRouterTest, HandlerRegistration) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - [[controller_mock_ expect] addScriptMessageHandler:router_ name:name1_]; [[controller_mock_ expect] addScriptMessageHandler:router_ name:name2_]; @@ -117,8 +112,6 @@ // WKScriptMessageHandler is not removed if CRWWKScriptMessageRouter has valid // message handlers. TEST_F(CRWWKScriptMessageRouterTest, HandlerRegistrationLeak) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - [[controller_mock_ expect] addScriptMessageHandler:router_ name:name1_]; // -removeScriptMessageHandlerForName must not be called. @@ -131,8 +124,6 @@ // Tests deregistation of all message handlers. TEST_F(CRWWKScriptMessageRouterTest, RemoveAllHandlers) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - [[controller_mock_ expect] addScriptMessageHandler:router_ name:name1_]; [[controller_mock_ expect] addScriptMessageHandler:router_ name:name2_]; @@ -151,8 +142,6 @@ // WKScriptMessageHandler is not removed if CRWWKScriptMessageRouter has valid // message handlers. TEST_F(CRWWKScriptMessageRouterTest, RemoveAllHandlersLeak) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - [[controller_mock_ expect] addScriptMessageHandler:router_ name:name1_]; [[controller_mock_ expect] addScriptMessageHandler:router_ name:name2_]; [[controller_mock_ expect] addScriptMessageHandler:router_ name:name3_]; @@ -171,8 +160,6 @@ // Tests proper routing of WKScriptMessage object depending on message name and // web view. TEST_F(CRWWKScriptMessageRouterTest, Routing) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - // It's expected that messages handlers will be called once and in order. __block NSInteger last_called_handler = 0; id message1 = GetScriptMessageMock(web_view1_, name1_);
diff --git a/ios/web/web_state/ui/crw_wk_simple_web_view_controller_unittest.mm b/ios/web/web_state/ui/crw_wk_simple_web_view_controller_unittest.mm index ea6ca996..5153f5a 100644 --- a/ios/web/web_state/ui/crw_wk_simple_web_view_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_wk_simple_web_view_controller_unittest.mm
@@ -11,7 +11,6 @@ #import "base/test/ios/wait_util.h" #include "ios/web/public/test/test_browser_state.h" #import "ios/web/public/test/test_web_client.h" -#include "ios/web/public/test/web_test_util.h" #import "ios/web/public/web_view_creation_util.h" #import "ios/web/test/web_test.h" #include "testing/gtest/include/gtest/gtest.h" @@ -25,7 +24,6 @@ class CRWWKSimpleWebViewControllerTest : public web::WebTest { protected: void SetUp() override { - CR_TEST_REQUIRES_WK_WEB_VIEW(); web::WebTest::SetUp(); mock_web_view_.reset( [[OCMockObject niceMockForClass:[WKWebView class]] retain]); @@ -36,11 +34,6 @@ [web_view_controller_ setDelegate:mock_delegate_]; } - void TearDown() override { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - web::WebTest::TearDown(); - } - // Tests that |shouldStartLoadWithRequest:| decision by the delegate is // respected by the CRWSWKimpleWebViewController. void TestShouldStartLoadRespected(BOOL expected_decision) { @@ -76,14 +69,12 @@ // Tests to make sure a CRWWKSimpleWebViewController correctly sets the backing // WKWebView. TEST_F(CRWWKSimpleWebViewControllerTest, View) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); EXPECT_EQ(mock_web_view_.get(), [web_view_controller_ view]); } // Tests to make sure a CRWWKSimpleWebViewController correctly sets the backing // WKWebView's navigation delegate TEST_F(CRWWKSimpleWebViewControllerTest, Delegate) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); base::scoped_nsobject<WKWebView> web_view( web::CreateWKWebView(CGRectZero, GetBrowserState())); ASSERT_TRUE(web_view); @@ -96,7 +87,6 @@ // Tests that CRWWKSimpleWebViewController can correctly retrieve the title from // the underlying WKWebView. TEST_F(CRWWKSimpleWebViewControllerTest, Title) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); [[[mock_web_view_ stub] andReturn:@"The Rolling Stones"] title]; EXPECT_NSEQ(@"The Rolling Stones", [web_view_controller_ title]); } @@ -104,7 +94,6 @@ // Tests that CRWWKSimpleWebViewController correctly reloads from the underlying // WKWebView. TEST_F(CRWWKSimpleWebViewControllerTest, Reload) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); [static_cast<WKWebView*>([mock_web_view_ expect]) reload]; [web_view_controller_ reload]; EXPECT_OCMOCK_VERIFY(mock_web_view_); @@ -113,7 +102,6 @@ // Tests that CRWWKSimpleWebViewController correctly returns the web view's // scroll view. TEST_F(CRWWKSimpleWebViewControllerTest, ScrollView) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); base::scoped_nsobject<UIScrollView> scroll_view([[UIScrollView alloc] init]); [[[mock_web_view_ stub] andReturn:scroll_view] scrollView]; EXPECT_EQ(scroll_view, [web_view_controller_ scrollView]); @@ -122,7 +110,6 @@ // Tests that CRWWKSimpleWebViewControllerTest correctly loads a request from // the underlying WKWebView. TEST_F(CRWWKSimpleWebViewControllerTest, LoadRequest) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; [static_cast<WKWebView*>([mock_web_view_ expect]) loadRequest:request]; @@ -133,7 +120,6 @@ // Tests that CRWWKSimpleWebViewControllerTest correctly loads a html request // from the underlying WKWebView. TEST_F(CRWWKSimpleWebViewControllerTest, LoadHTMLString) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); NSURL* base_url = [NSURL URLWithString:@"http://google.com"]; NSString* html_string = @"<html>Some html</html>"; [static_cast<WKWebView*>([mock_web_view_ expect]) loadHTMLString:html_string @@ -148,7 +134,6 @@ // TODO(shreyasv): Revisit this test if mockHTTPServer is moved to // ios_web_unittests. TEST_F(CRWWKSimpleWebViewControllerTest, ShouldStartLoad) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); NSURLRequest* request = [NSURLRequest requestWithURL: [NSURL URLWithString:@"http://google.com"]]; base::scoped_nsobject<WKNavigationAction> navigation_action( @@ -167,20 +152,17 @@ // Tests that |shouldStartLoadWithRequest:| YES decision by the delegate is // respected by the CRWSWKimpleWebViewController TEST_F(CRWWKSimpleWebViewControllerTest, ShouldStartLoadRespectedYes) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); TestShouldStartLoadRespected(YES); } // Tests that |shouldStartLoadWithRequest:| NO decision by the delegate is // respected by the CRWSWKimpleWebViewController TEST_F(CRWWKSimpleWebViewControllerTest, ShouldStartLoadRespectedNo) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); TestShouldStartLoadRespected(NO); } // Tests that |titleMayHaveChanged:| is correctly called on the delegate. TEST_F(CRWWKSimpleWebViewControllerTest, TitleMayHaveChanged) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); base::scoped_nsobject<WKWebView> web_view( web::CreateWKWebView(CGRectZero, GetBrowserState())); base::scoped_nsobject<WKWebView> mock_web_view( @@ -202,7 +184,6 @@ // Tests correct JavaScript evaluation. TEST_F(CRWWKSimpleWebViewControllerTest, JavaScriptEvaluation) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); NSString* const kTestResult = @"result"; NSError* const test_error = [NSError errorWithDomain:@"" code:0 userInfo:nil]; id run_completion_handler = ^(NSInvocation* invocation) {
diff --git a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm index d5f2340c8..0d481bbf 100644 --- a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm +++ b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
@@ -1850,9 +1850,11 @@ return; } - // Directly cancelled navigations are simply discarded without handling - // their potential errors. - if (![_pendingNavigationInfo cancelled]) { + // Handle load cancellation for directly cancelled navigations without + // handling their potential errors. Otherwise, handle the error. + if ([_pendingNavigationInfo cancelled]) { + [self loadCancelled]; + } else { error = WKWebViewErrorWithSource(error, PROVISIONAL_LOAD); if (web::IsWKWebViewSSLCertError(error))
diff --git a/ios/web/web_state/ui/wk_back_forward_list_item_holder_unittest.mm b/ios/web/web_state/ui/wk_back_forward_list_item_holder_unittest.mm index 3d4c6e64..8be0bdcf 100644 --- a/ios/web/web_state/ui/wk_back_forward_list_item_holder_unittest.mm +++ b/ios/web/web_state/ui/wk_back_forward_list_item_holder_unittest.mm
@@ -8,7 +8,6 @@ #include "ios/web/navigation/navigation_item_impl.h" #include "ios/web/public/navigation_item.h" -#include "ios/web/public/test/web_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest_mac.h" #include "testing/platform_test.h" @@ -21,7 +20,6 @@ // Tests that FromNavigationItem returns the same holder for the same // NavigationItem. TEST_F(WKBackForwardListItemHolderTest, GetHolderFromNavigationItem) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); scoped_ptr<web::NavigationItem> item(NavigationItem::Create()); WKBackForwardListItemHolder* holder1 = WKBackForwardListItemHolder::FromNavigationItem(item.get()); @@ -33,7 +31,6 @@ // Tests that FromNavigationItem returns different holders for different // NavigationItem objects. TEST_F(WKBackForwardListItemHolderTest, GetHolderFromDifferentNavigationItem) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); // Create two NavigationItem objects. scoped_ptr<web::NavigationItem> item1(NavigationItem::Create()); scoped_ptr<web::NavigationItem> item2(NavigationItem::Create()); @@ -52,7 +49,6 @@ // because WKBackForwardListItem alloc/release is not designed to be called // directly and will crash. TEST_F(WKBackForwardListItemHolderTest, GetBackForwardListItemFromHolder) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); scoped_ptr<web::NavigationItem> item(NavigationItem::Create()); base::scoped_nsobject<NSObject> input([[NSObject alloc] init]); WKBackForwardListItemHolder* holder = @@ -65,7 +61,6 @@ // Tests that acessors for navigation type work as expected. TEST_F(WKBackForwardListItemHolderTest, GetNavigationTypeFromHolder) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); scoped_ptr<web::NavigationItem> item(NavigationItem::Create()); WKBackForwardListItemHolder* holder = WKBackForwardListItemHolder::FromNavigationItem(item.get()); @@ -112,7 +107,6 @@ // instead of WKBackForwardListItem because WKBackForwardListItem alloc/ // release is not designed to be called directly and will crash. TEST_F(WKBackForwardListItemHolderTest, GetNilBackForwardListItemFromHolder) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); scoped_ptr<web::NavigationItem> item(NavigationItem::Create()); WKBackForwardListItemHolder* holder = WKBackForwardListItemHolder::FromNavigationItem(item.get());
diff --git a/ios/web/web_state/ui/wk_web_view_configuration_provider_unittest.mm b/ios/web/web_state/ui/wk_web_view_configuration_provider_unittest.mm index f4ae2c5..5831b288 100644 --- a/ios/web/web_state/ui/wk_web_view_configuration_provider_unittest.mm +++ b/ios/web/web_state/ui/wk_web_view_configuration_provider_unittest.mm
@@ -6,11 +6,9 @@ #import <WebKit/WebKit.h> -#include "base/ios/ios_util.h" #import "base/ios/weak_nsobject.h" #include "ios/web/public/test/scoped_testing_web_client.h" #include "ios/web/public/test/test_browser_state.h" -#include "ios/web/public/test/web_test_util.h" #include "ios/web/public/web_client.h" #import "ios/web/web_state/js/page_script_util.h" #import "ios/web/web_state/ui/crw_wk_script_message_router.h" @@ -45,8 +43,6 @@ // configuration and configurations returned by the same provider will always // have the same process pool. TEST_F(WKWebViewConfigurationProviderTest, ConfigurationOwnerhip) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - // Configuration is not nil. WKWebViewConfigurationProvider& provider = GetProvider(&browser_state_); ASSERT_TRUE(provider.GetWebViewConfiguration()); @@ -66,10 +62,6 @@ // Tests Non-OffTheRecord configuration. TEST_F(WKWebViewConfigurationProviderTest, NoneOffTheRecordConfiguration) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - if (!base::ios::IsRunningOnIOS9OrLater()) - return; - browser_state_.SetOffTheRecord(false); WKWebViewConfigurationProvider& provider = GetProvider(&browser_state_); EXPECT_TRUE(provider.GetWebViewConfiguration().websiteDataStore.persistent); @@ -77,10 +69,6 @@ // Tests OffTheRecord configuration. TEST_F(WKWebViewConfigurationProviderTest, OffTheRecordConfiguration) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - if (!base::ios::IsRunningOnIOS9OrLater()) - return; - browser_state_.SetOffTheRecord(true); WKWebViewConfigurationProvider& provider = GetProvider(&browser_state_); WKWebViewConfiguration* config = provider.GetWebViewConfiguration(); @@ -90,8 +78,6 @@ // Tests that internal configuration object can not be changed by clients. TEST_F(WKWebViewConfigurationProviderTest, ConfigurationProtection) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - WKWebViewConfigurationProvider& provider = GetProvider(&browser_state_); WKWebViewConfiguration* config = provider.GetWebViewConfiguration(); base::scoped_nsobject<WKProcessPool> pool([[config processPool] retain]); @@ -121,8 +107,6 @@ // Tests that script message router is bound to correct user content controller. TEST_F(WKWebViewConfigurationProviderTest, ScriptMessageRouter) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - ASSERT_TRUE(GetProvider().GetWebViewConfiguration().userContentController); EXPECT_EQ(GetProvider().GetWebViewConfiguration().userContentController, GetProvider().GetScriptMessageRouter().userContentController); @@ -131,8 +115,6 @@ // Tests that both configuration and script message router are deallocated after // |Purge| call. TEST_F(WKWebViewConfigurationProviderTest, Purge) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - base::WeakNSObject<id> config; base::WeakNSObject<id> router; @autoreleasepool { // Make sure that resulting copy is deallocated. @@ -151,8 +133,6 @@ // Tests that configuration's userContentController has only one script with the // same content as web::GetEarlyPageScript(WK_WEB_VIEW_TYPE) returns. TEST_F(WKWebViewConfigurationProviderTest, UserScript) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - WKWebViewConfiguration* config = GetProvider().GetWebViewConfiguration(); NSArray* scripts = config.userContentController.userScripts; EXPECT_EQ(1U, scripts.count);
diff --git a/ios/web/web_state/web_view_internal_creation_util_unittest.mm b/ios/web/web_state/web_view_internal_creation_util_unittest.mm index cd18bfc..6696286 100644 --- a/ios/web/web_state/web_view_internal_creation_util_unittest.mm +++ b/ios/web/web_state/web_view_internal_creation_util_unittest.mm
@@ -14,7 +14,6 @@ #include "ios/web/public/test/test_browser_state.h" #import "ios/web/public/test/test_web_client.h" #include "ios/web/public/test/test_web_thread.h" -#include "ios/web/public/test/web_test_util.h" #import "ios/web/public/web_view_creation_util.h" #import "ios/web/test/web_test.h" #import "ios/web/web_state/ui/crw_simple_web_view_controller.h" @@ -132,8 +131,6 @@ // Tests web::CreateWKWebView function that it correctly returns a WKWebView // with the correct frame and WKProcessPool. TEST_F(WebViewCreationUtilsTest, WKWebViewCreationWithBrowserState) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - base::scoped_nsobject<WKWebView> web_view( CreateWKWebView(kTestFrame, GetBrowserState())); @@ -152,8 +149,6 @@ // Tests that web::CreateWKWebView always returns a web view with the same // processPool. TEST_F(WebViewCreationUtilsTest, WKWebViewsShareProcessPool) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - base::scoped_nsobject<WKWebView> web_view( CreateWKWebView(kTestFrame, GetBrowserState())); ASSERT_TRUE(web_view); @@ -173,7 +168,6 @@ // Tests that getting a WKWebView from the util methods correctly maintains // the global active wkwebview count (which is debug-only). TEST_F(WebViewCreationUtilsTest, GetActiveWKWebViewsCount) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); base::scoped_nsobject<WKWebView> web_view1( CreateWKWebView(CGRectZero, GetBrowserState())); EXPECT_EQ(1U, GetActiveWKWebViewsCount());
diff --git a/ios/web/web_state/wk_web_view_security_util_unittest.mm b/ios/web/web_state/wk_web_view_security_util_unittest.mm index 97cb2e3b..7f946cf 100644 --- a/ios/web/web_state/wk_web_view_security_util_unittest.mm +++ b/ios/web/web_state/wk_web_view_security_util_unittest.mm
@@ -10,7 +10,6 @@ #include "base/mac/scoped_cftyperef.h" #include "base/memory/scoped_ptr.h" #include "crypto/rsa_private_key.h" -#include "ios/web/public/test/web_test_util.h" #include "net/cert/x509_cert_types.h" #include "net/cert/x509_certificate.h" #include "net/cert/x509_util.h" @@ -155,8 +154,6 @@ // NSURLErrorDomain domain, NSURLErrorSecureConnectionFailed error code and // certificate chain. TEST_F(WKWebViewSecurityUtilTest, CheckSecureConnectionFailedWithCertError) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - EXPECT_TRUE(IsWKWebViewSSLCertError([NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorSecureConnectionFailed @@ -167,8 +164,6 @@ // NSURLErrorDomain domain, NSURLErrorSecureConnectionFailed error code and no // certificate chain. TEST_F(WKWebViewSecurityUtilTest, CheckSecureConnectionFailedWithoutCertError) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - EXPECT_FALSE(IsWKWebViewSSLCertError([NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorSecureConnectionFailed @@ -178,8 +173,6 @@ // Tests that IsWKWebViewSSLCertError returns YES for NSError with // NSURLErrorDomain domain and certificates error codes. TEST_F(WKWebViewSecurityUtilTest, CheckCertificateSSLError) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - EXPECT_TRUE(IsWKWebViewSSLCertError([NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorServerCertificateHasBadDate @@ -201,8 +194,6 @@ // Tests that IsWKWebViewSSLCertError returns NO for NSError with // NSURLErrorDomain domain and non cert SSL error codes. TEST_F(WKWebViewSecurityUtilTest, CheckNonCertificateSSLError) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - EXPECT_FALSE(IsWKWebViewSSLCertError([NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorClientCertificateRejected @@ -216,8 +207,6 @@ // Tests that IsWKWebViewSSLCertError returns NO for NSError with // NSURLErrorDomain domain and NSURLErrorDataLengthExceedsMaximum error code. TEST_F(WKWebViewSecurityUtilTest, CheckDataLengthExceedsMaximumError) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - EXPECT_FALSE(IsWKWebViewSSLCertError([NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorDataLengthExceedsMaximum @@ -227,8 +216,6 @@ // Tests that IsWKWebViewSSLCertError returns NO for NSError with // NSURLErrorDomain domain and NSURLErrorCannotLoadFromNetwork error code. TEST_F(WKWebViewSecurityUtilTest, CheckCannotLoadFromNetworkError) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - EXPECT_FALSE(IsWKWebViewSSLCertError([NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCannotLoadFromNetwork @@ -237,8 +224,6 @@ // Tests GetSSLInfoFromWKWebViewSSLCertError with NSError and self-signed cert. TEST_F(WKWebViewSecurityUtilTest, SSLInfoFromErrorWithCert) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - NSError* unknownCertError = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorServerCertificateHasUnknownRoot
diff --git a/ios/web/web_view_counter_impl_unittest.mm b/ios/web/web_view_counter_impl_unittest.mm index 3ed855d..20a2e3d 100644 --- a/ios/web/web_view_counter_impl_unittest.mm +++ b/ios/web/web_view_counter_impl_unittest.mm
@@ -11,7 +11,6 @@ #include "ios/web/public/test/test_browser_state.h" #import "ios/web/public/test/test_web_client.h" #include "ios/web/public/test/test_web_thread_bundle.h" -#include "ios/web/public/test/web_test_util.h" #include "ios/web/public/web_client.h" #import "ios/web/public/web_view_counter.h" #import "ios/web/public/web_view_creation_util.h" @@ -46,8 +45,6 @@ // Tests that WebViewCounter correctly maintains the count of WKWebViews. TEST_F(WebViewCounterTest, WKWebViewCount) { - CR_TEST_REQUIRES_WK_WEB_VIEW(); - WebViewCounterImpl* web_view_counter = WebViewCounterImpl::FromBrowserState(browser_state_.get()); ASSERT_TRUE(web_view_counter);
diff --git a/ios/web/webui/crw_web_ui_manager.mm b/ios/web/webui/crw_web_ui_manager.mm index 99c437b6..84cd21a 100644 --- a/ios/web/webui/crw_web_ui_manager.mm +++ b/ios/web/webui/crw_web_ui_manager.mm
@@ -181,6 +181,9 @@ // Retrieve favicon resource and set favicon background image via JavaScript. base::WeakNSObject<CRWWebUIManager> weakSelf(self); void (^faviconHandler)(NSData*) = ^void(NSData* data) { + base::scoped_nsobject<CRWWebUIManager> strongSelf([weakSelf retain]); + if (!strongSelf) + return; NSString* base64EncodedResource = [data base64EncodedStringWithOptions:0]; NSString* dataURLString = [NSString stringWithFormat:@"data:image/png;base64,%@", base64EncodedResource]; @@ -188,7 +191,7 @@ NSString* script = [NSString stringWithFormat:@"chrome.setFaviconBackground('%@', '%@');", faviconURLString, dataURLString]; - [weakSelf webState]->ExecuteJavaScriptAsync( + [strongSelf webState]->ExecuteJavaScriptAsync( base::SysNSStringToUTF16(script)); }; [self fetchResourceWithURL:faviconURL completionHandler:faviconHandler];
diff --git a/ipc/handle_attachment_win.cc b/ipc/handle_attachment_win.cc index 39c4ef7..cb6a7bacf 100644 --- a/ipc/handle_attachment_win.cc +++ b/ipc/handle_attachment_win.cc
@@ -24,6 +24,10 @@ } } +HandleAttachmentWin::HandleAttachmentWin(const HANDLE& handle, + FromWire from_wire) + : handle_(handle), permissions_(HandleWin::INVALID), owns_handle_(true) {} + HandleAttachmentWin::HandleAttachmentWin(const WireFormat& wire_format) : BrokerableAttachment(wire_format.attachment_id), handle_(LongToHandle(wire_format.handle)),
diff --git a/ipc/handle_attachment_win.h b/ipc/handle_attachment_win.h index 5e04bdb..ff0ce91 100644 --- a/ipc/handle_attachment_win.h +++ b/ipc/handle_attachment_win.h
@@ -58,6 +58,13 @@ // result. Should only be called by the sender of a Chrome IPC message. HandleAttachmentWin(const HANDLE& handle, HandleWin::Permissions permissions); + enum FromWire { + FROM_WIRE, + }; + // This constructor takes ownership of |handle|. Should only be called by the + // receiver of a Chrome IPC message. + HandleAttachmentWin(const HANDLE& handle, FromWire from_wire); + // This constructor takes ownership of |wire_format.handle| without making a // copy. Should only be called by the receiver of a Chrome IPC message. explicit HandleAttachmentWin(const WireFormat& wire_format);
diff --git a/ipc/ipc_message_macros.h b/ipc/ipc_message_macros.h index ea28d0c..38f428e 100644 --- a/ipc/ipc_message_macros.h +++ b/ipc/ipc_message_macros.h
@@ -249,7 +249,7 @@ #define IPC_SYNC_MESSAGE_ROUTED(msg_class, in, out) \ IPC_MESSAGE_DECL(msg_class, ROUTED, IPC_TUPLE in, IPC_TUPLE out) -#define IPC_TUPLE(...) std::tuple<__VA_ARGS__> +#define IPC_TUPLE(...) IPC::CheckedTuple<__VA_ARGS__>::Tuple #define IPC_MESSAGE_DECL(msg_name, kind, in_tuple, out_tuple) \ struct IPC_MESSAGE_EXPORT msg_name##_Meta { \
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h index d92d833..9369f023 100644 --- a/ipc/ipc_message_utils.h +++ b/ipc/ipc_message_utils.h
@@ -76,12 +76,26 @@ struct NoParams { }; +// Specializations are checked by 'IPC checker' part of find-bad-constructs +// Clang plugin (see WriteParam() below for the details). +template <typename... Ts> +struct CheckedTuple { + typedef std::tuple<Ts...> Tuple; +}; + template <class P> static inline void GetParamSize(base::PickleSizer* sizer, const P& p) { typedef typename SimilarTypeTraits<P>::Type Type; ParamTraits<Type>::GetSize(sizer, static_cast<const Type&>(p)); } +// This function is checked by 'IPC checker' part of find-bad-constructs +// Clang plugin to make it's not called on the following types: +// 1. long / unsigned long (but not typedefs to) +// 2. intmax_t, uintmax_t, intptr_t, uintptr_t, wint_t, +// size_t, rsize_t, ssize_t, ptrdiff_t, dev_t, off_t, clock_t, +// time_t, suseconds_t (including typedefs to) +// 3. Any template referencing types above (e.g. std::vector<size_t>) template <class P> static inline void WriteParam(base::Pickle* m, const P& p) { typedef typename SimilarTypeTraits<P>::Type Type;
diff --git a/ipc/mach_port_attachment_mac.cc b/ipc/mach_port_attachment_mac.cc index 65baa34..47fd4e9 100644 --- a/ipc/mach_port_attachment_mac.cc +++ b/ipc/mach_port_attachment_mac.cc
@@ -20,6 +20,9 @@ << "MachPortAttachmentMac mach_port_mod_refs"; } } +MachPortAttachmentMac::MachPortAttachmentMac(mach_port_t mach_port, + FromWire from_wire) + : mach_port_(mach_port), owns_mach_port_(true) {} MachPortAttachmentMac::MachPortAttachmentMac(const WireFormat& wire_format) : BrokerableAttachment(wire_format.attachment_id),
diff --git a/ipc/mach_port_attachment_mac.h b/ipc/mach_port_attachment_mac.h index 244014e..658cff4 100644 --- a/ipc/mach_port_attachment_mac.h +++ b/ipc/mach_port_attachment_mac.h
@@ -51,6 +51,13 @@ // IPC message. explicit MachPortAttachmentMac(mach_port_t mach_port); + enum FromWire { + FROM_WIRE, + }; + // This constructor takes ownership of |mach_port|, but does not modify its + // ref count. Should only be called by the receiver of a Chrome IPC message. + MachPortAttachmentMac(mach_port_t mach_port, FromWire from_wire); + // This constructor takes ownership of |wire_format.mach_port|, but does not // modify its ref count. Should only be called by the receiver of a Chrome IPC // message.
diff --git a/ipc/mojo/BUILD.gn b/ipc/mojo/BUILD.gn index 9804845..22f063a 100644 --- a/ipc/mojo/BUILD.gn +++ b/ipc/mojo/BUILD.gn
@@ -43,10 +43,7 @@ test("ipc_mojo_unittests") { sources = [ - # TODO(rockot): Re-enable these when we're ready to start using ChannelMojo - # again. They need to be updated to support multiprocess testing with the - # current Mojo EDK implementation. - #"ipc_channel_mojo_unittest.cc", + "ipc_channel_mojo_unittest.cc", "ipc_mojo_bootstrap_unittest.cc", "run_all_unittests.cc", ]
diff --git a/ipc/mojo/ipc.mojom b/ipc/mojo/ipc.mojom index dfc5770..6b69ced5 100644 --- a/ipc/mojo/ipc.mojom +++ b/ipc/mojo/ipc.mojom
@@ -4,9 +4,21 @@ module IPC.mojom; +struct SerializedHandle { + handle the_handle; + + enum Type { + MOJO_HANDLE, + WIN_HANDLE, + MACH_PORT, + }; + + Type type; +}; + struct Message { array<uint8> data; - array<handle>? handles; + array<SerializedHandle>? handles; }; interface Channel {
diff --git a/ipc/mojo/ipc_channel_mojo.cc b/ipc/mojo/ipc_channel_mojo.cc index 69936481..8832d8d 100644 --- a/ipc/mojo/ipc_channel_mojo.cc +++ b/ipc/mojo/ipc_channel_mojo.cc
@@ -29,30 +29,59 @@ #include "ipc/ipc_platform_file_attachment_posix.h" #endif +#if defined(OS_MACOSX) +#include "ipc/mach_port_attachment_mac.h" +#endif + +#if defined(OS_WIN) +#include "ipc/handle_attachment_win.h" +#endif + namespace IPC { namespace { class MojoChannelFactory : public ChannelFactory { public: - MojoChannelFactory(const std::string& token, Channel::Mode mode) - : token_(token), mode_(mode) {} + MojoChannelFactory(mojo::ScopedMessagePipeHandle handle, Channel::Mode mode) + : handle_(std::move(handle)), mode_(mode) {} - std::string GetName() const override { - return token_; - } + std::string GetName() const override { return ""; } scoped_ptr<Channel> BuildChannel(Listener* listener) override { - return ChannelMojo::Create(token_, mode_, listener); + return ChannelMojo::Create(std::move(handle_), mode_, listener); } private: - const std::string token_; + mojo::ScopedMessagePipeHandle handle_; const Channel::Mode mode_; DISALLOW_COPY_AND_ASSIGN(MojoChannelFactory); }; +mojom::SerializedHandlePtr CreateSerializedHandle( + mojo::ScopedHandle handle, + mojom::SerializedHandle::Type type) { + mojom::SerializedHandlePtr serialized_handle = mojom::SerializedHandle::New(); + serialized_handle->the_handle = std::move(handle); + serialized_handle->type = type; + return serialized_handle; +} + +MojoResult WrapPlatformHandle(mojo::edk::ScopedPlatformHandle handle, + mojom::SerializedHandle::Type type, + mojom::SerializedHandlePtr* serialized) { + MojoHandle wrapped_handle; + MojoResult wrap_result = mojo::edk::CreatePlatformHandleWrapper( + std::move(handle), &wrapped_handle); + if (wrap_result != MOJO_RESULT_OK) + return wrap_result; + + *serialized = CreateSerializedHandle( + mojo::MakeScopedHandle(mojo::Handle(wrapped_handle)), type); + return MOJO_RESULT_OK; +} + #if defined(OS_POSIX) && !defined(OS_NACL) base::ScopedFD TakeOrDupFile(internal::PlatformFileAttachment* attachment) { @@ -62,6 +91,109 @@ #endif +MojoResult WrapAttachmentImpl(MessageAttachment* attachment, + mojom::SerializedHandlePtr* serialized) { + if (attachment->GetType() == MessageAttachment::TYPE_MOJO_HANDLE) { + *serialized = CreateSerializedHandle( + static_cast<internal::MojoHandleAttachment&>(*attachment).TakeHandle(), + mojom::SerializedHandle::Type::MOJO_HANDLE); + return MOJO_RESULT_OK; + } +#if defined(OS_POSIX) && !defined(OS_NACL) + if (attachment->GetType() == MessageAttachment::TYPE_PLATFORM_FILE) { + // We dup() the handles in IPC::Message to transmit. + // IPC::MessageAttachmentSet has intricate lifecycle semantics + // of FDs, so just to dup()-and-own them is the safest option. + base::ScopedFD file = TakeOrDupFile( + static_cast<IPC::internal::PlatformFileAttachment*>(attachment)); + if (!file.is_valid()) { + DPLOG(WARNING) << "Failed to dup FD to transmit."; + return MOJO_RESULT_UNKNOWN; + } + + return WrapPlatformHandle(mojo::edk::ScopedPlatformHandle( + mojo::edk::PlatformHandle(file.release())), + mojom::SerializedHandle::Type::MOJO_HANDLE, + serialized); + } +#endif +#if defined(OS_MACOSX) + DCHECK_EQ(attachment->GetType(), + MessageAttachment::TYPE_BROKERABLE_ATTACHMENT); + DCHECK_EQ(static_cast<BrokerableAttachment&>(*attachment).GetBrokerableType(), + BrokerableAttachment::MACH_PORT); + internal::MachPortAttachmentMac& mach_port_attachment = + static_cast<internal::MachPortAttachmentMac&>(*attachment); + MojoResult result = WrapPlatformHandle( + mojo::edk::ScopedPlatformHandle( + mojo::edk::PlatformHandle(mach_port_attachment.get_mach_port())), + mojom::SerializedHandle::Type::MACH_PORT, serialized); + mach_port_attachment.reset_mach_port_ownership(); + return result; +#elif defined(OS_WIN) + DCHECK_EQ(attachment->GetType(), + MessageAttachment::TYPE_BROKERABLE_ATTACHMENT); + DCHECK_EQ(static_cast<BrokerableAttachment&>(*attachment).GetBrokerableType(), + BrokerableAttachment::WIN_HANDLE); + internal::HandleAttachmentWin& handle_attachment = + static_cast<internal::HandleAttachmentWin&>(*attachment); + MojoResult result = WrapPlatformHandle( + mojo::edk::ScopedPlatformHandle( + mojo::edk::PlatformHandle(handle_attachment.get_handle())), + mojom::SerializedHandle::Type::WIN_HANDLE, serialized); + handle_attachment.reset_handle_ownership(); + return result; +#else + NOTREACHED(); + return MOJO_RESULT_UNKNOWN; +#endif // defined(OS_MACOSX) +} + +MojoResult WrapAttachment(MessageAttachment* attachment, + mojo::Array<mojom::SerializedHandlePtr>* handles) { + mojom::SerializedHandlePtr serialized_handle; + MojoResult wrap_result = WrapAttachmentImpl(attachment, &serialized_handle); + if (wrap_result != MOJO_RESULT_OK) { + LOG(WARNING) << "Pipe failed to wrap handles. Closing: " << wrap_result; + return wrap_result; + } + handles->push_back(std::move(serialized_handle)); + return MOJO_RESULT_OK; +} + +MojoResult UnwrapAttachment(mojom::SerializedHandlePtr handle, + scoped_refptr<MessageAttachment>* attachment) { + if (handle->type == mojom::SerializedHandle::Type::MOJO_HANDLE) { + *attachment = + new IPC::internal::MojoHandleAttachment(std::move(handle->the_handle)); + return MOJO_RESULT_OK; + } + mojo::edk::ScopedPlatformHandle platform_handle; + MojoResult unwrap_result = mojo::edk::PassWrappedPlatformHandle( + handle->the_handle.release().value(), &platform_handle); + if (unwrap_result != MOJO_RESULT_OK) + return unwrap_result; +#if defined(OS_MACOSX) + if (handle->type == mojom::SerializedHandle::Type::MACH_PORT && + platform_handle.get().type == mojo::edk::PlatformHandle::Type::MACH) { + *attachment = new internal::MachPortAttachmentMac( + platform_handle.release().port, + internal::MachPortAttachmentMac::FROM_WIRE); + return MOJO_RESULT_OK; + } +#endif // defined(OS_MACOSX) +#if defined(OS_WIN) + if (handle->type == mojom::SerializedHandle::Type::WIN_HANDLE) { + *attachment = new internal::HandleAttachmentWin( + platform_handle.release().handle, + internal::HandleAttachmentWin::FROM_WIRE); + return MOJO_RESULT_OK; + } +#endif // defined(OS_WIN) + NOTREACHED(); + return MOJO_RESULT_UNKNOWN; +} + } // namespace //------------------------------------------------------------------------------ @@ -74,53 +206,40 @@ } // static -scoped_ptr<ChannelMojo> ChannelMojo::Create(const std::string& token, - Mode mode, - Listener* listener) { - return make_scoped_ptr( - new ChannelMojo(token, mode, listener)); +scoped_ptr<ChannelMojo> ChannelMojo::Create( + mojo::ScopedMessagePipeHandle handle, + Mode mode, + Listener* listener) { + return make_scoped_ptr(new ChannelMojo(std::move(handle), mode, listener)); } // static scoped_ptr<ChannelFactory> ChannelMojo::CreateServerFactory( - const std::string& token) { + mojo::ScopedMessagePipeHandle handle) { return make_scoped_ptr( - new MojoChannelFactory(token, Channel::MODE_SERVER)); + new MojoChannelFactory(std::move(handle), Channel::MODE_SERVER)); } // static scoped_ptr<ChannelFactory> ChannelMojo::CreateClientFactory( - const std::string& token) { + mojo::ScopedMessagePipeHandle handle) { return make_scoped_ptr( - new MojoChannelFactory(token, Channel::MODE_CLIENT)); + new MojoChannelFactory(std::move(handle), Channel::MODE_CLIENT)); } -ChannelMojo::ChannelMojo(const std::string& token, +ChannelMojo::ChannelMojo(mojo::ScopedMessagePipeHandle handle, Mode mode, Listener* listener) - : listener_(listener), - peer_pid_(base::kNullProcessId), - waiting_connect_(true), - weak_factory_(this) { + : listener_(listener), waiting_connect_(true), weak_factory_(this) { // Create MojoBootstrap after all members are set as it touches // ChannelMojo from a different thread. - bootstrap_ = MojoBootstrap::Create(token, mode, this); + bootstrap_ = MojoBootstrap::Create(std::move(handle), mode, this); } ChannelMojo::~ChannelMojo() { Close(); } -scoped_ptr<internal::MessagePipeReader, ChannelMojo::ReaderDeleter> -ChannelMojo::CreateMessageReader(mojom::ChannelAssociatedPtrInfo sender, - mojom::ChannelAssociatedRequest receiver) { - mojom::ChannelAssociatedPtr sender_ptr; - sender_ptr.Bind(std::move(sender)); - return scoped_ptr<internal::MessagePipeReader, ChannelMojo::ReaderDeleter>( - new internal::MessagePipeReader(std::move(sender_ptr), - std::move(receiver), this)); -} - bool ChannelMojo::Connect() { DCHECK(!message_reader_); bootstrap_->Connect(); @@ -138,8 +257,8 @@ mojom::ChannelAssociatedPtrInfo send_channel, mojom::ChannelAssociatedRequest receive_channel, int32_t peer_pid) { - set_peer_pid(peer_pid); - InitMessageReader(std::move(send_channel), std::move(receive_channel)); + InitMessageReader(std::move(send_channel), std::move(receive_channel), + peer_pid); } void ChannelMojo::OnBootstrapError() { @@ -147,9 +266,13 @@ } void ChannelMojo::InitMessageReader(mojom::ChannelAssociatedPtrInfo sender, - mojom::ChannelAssociatedRequest receiver) { - scoped_ptr<internal::MessagePipeReader, ChannelMojo::ReaderDeleter> reader = - CreateMessageReader(std::move(sender), std::move(receiver)); + mojom::ChannelAssociatedRequest receiver, + base::ProcessId peer_pid) { + mojom::ChannelAssociatedPtr sender_ptr; + sender_ptr.Bind(std::move(sender)); + scoped_ptr<internal::MessagePipeReader, ChannelMojo::ReaderDeleter> reader( + new internal::MessagePipeReader(std::move(sender_ptr), + std::move(receiver), peer_pid, this)); for (size_t i = 0; i < pending_messages_.size(); ++i) { bool sent = reader->Send(std::move(pending_messages_[i])); @@ -192,7 +315,10 @@ } base::ProcessId ChannelMojo::GetPeerPID() const { - return peer_pid_; + if (!message_reader_) + return base::kNullProcessId; + + return message_reader_->GetPeerPid(); } base::ProcessId ChannelMojo::GetSelfPID() const { @@ -203,6 +329,10 @@ TRACE_EVENT2("ipc,toplevel", "ChannelMojo::OnMessageReceived", "class", IPC_MESSAGE_ID_CLASS(message.type()), "line", IPC_MESSAGE_ID_LINE(message.type())); + if (AttachmentBroker* broker = AttachmentBroker::GetGlobal()) { + if (broker->OnMessageReceived(message)) + return; + } listener_->OnMessageReceived(message); if (message.dispatch_error()) listener_->OnBadMessageReceived(message); @@ -221,81 +351,53 @@ // static MojoResult ChannelMojo::ReadFromMessageAttachmentSet( Message* message, - mojo::Array<mojo::ScopedHandle>* handles) { - // We dup() the handles in IPC::Message to transmit. - // IPC::MessageAttachmentSet has intricate lifecycle semantics - // of FDs, so just to dup()-and-own them is the safest option. + mojo::Array<mojom::SerializedHandlePtr>* handles) { if (message->HasAttachments()) { MessageAttachmentSet* set = message->attachment_set(); for (unsigned i = 0; i < set->num_non_brokerable_attachments(); ++i) { - scoped_refptr<MessageAttachment> attachment = - set->GetNonBrokerableAttachmentAt(i); - switch (attachment->GetType()) { - case MessageAttachment::TYPE_PLATFORM_FILE: -#if defined(OS_POSIX) && !defined(OS_NACL) - { - base::ScopedFD file = - TakeOrDupFile(static_cast<IPC::internal::PlatformFileAttachment*>( - attachment.get())); - if (!file.is_valid()) { - DPLOG(WARNING) << "Failed to dup FD to transmit."; - set->CommitAllDescriptors(); - return MOJO_RESULT_UNKNOWN; - } - - MojoHandle wrapped_handle; - MojoResult wrap_result = mojo::edk::CreatePlatformHandleWrapper( - mojo::edk::ScopedPlatformHandle( - mojo::edk::PlatformHandle(file.release())), - &wrapped_handle); - if (MOJO_RESULT_OK != wrap_result) { - LOG(WARNING) << "Pipe failed to wrap handles. Closing: " - << wrap_result; - set->CommitAllDescriptors(); - return wrap_result; - } - - handles->push_back( - mojo::MakeScopedHandle(mojo::Handle(wrapped_handle))); - } -#else - NOTREACHED(); -#endif // defined(OS_POSIX) && !defined(OS_NACL) - break; - case MessageAttachment::TYPE_MOJO_HANDLE: { - mojo::ScopedHandle handle = - static_cast<IPC::internal::MojoHandleAttachment*>( - attachment.get())->TakeHandle(); - handles->push_back(std::move(handle)); - } break; - case MessageAttachment::TYPE_BROKERABLE_ATTACHMENT: - // Brokerable attachments are handled by the AttachmentBroker so - // there's no need to do anything here. - NOTREACHED(); - break; + MojoResult result = WrapAttachment( + set->GetNonBrokerableAttachmentAt(i).get(), handles); + if (result != MOJO_RESULT_OK) { + set->CommitAllDescriptors(); + return result; } } - + for (unsigned i = 0; i < set->num_brokerable_attachments(); ++i) { + MojoResult result = + WrapAttachment(set->GetBrokerableAttachmentAt(i).get(), handles); + if (result != MOJO_RESULT_OK) { + set->CommitAllDescriptors(); + return result; + } + } set->CommitAllDescriptors(); } - return MOJO_RESULT_OK; } // static MojoResult ChannelMojo::WriteToMessageAttachmentSet( - mojo::Array<mojo::ScopedHandle> handle_buffer, + mojo::Array<mojom::SerializedHandlePtr> handle_buffer, Message* message) { for (size_t i = 0; i < handle_buffer.size(); ++i) { + scoped_refptr<MessageAttachment> unwrapped_attachment; + MojoResult unwrap_result = UnwrapAttachment(std::move(handle_buffer[i]), + &unwrapped_attachment); + if (unwrap_result != MOJO_RESULT_OK) { + LOG(WARNING) << "Pipe failed to unwrap handles. Closing: " + << unwrap_result; + return unwrap_result; + } + DCHECK(unwrapped_attachment); + bool ok = message->attachment_set()->AddAttachment( - new IPC::internal::MojoHandleAttachment(std::move(handle_buffer[i]))); + std::move(unwrapped_attachment)); DCHECK(ok); if (!ok) { LOG(ERROR) << "Failed to add new Mojo handle."; return MOJO_RESULT_UNKNOWN; } } - return MOJO_RESULT_OK; }
diff --git a/ipc/mojo/ipc_channel_mojo.h b/ipc/mojo/ipc_channel_mojo.h index a996790..c1b659a 100644 --- a/ipc/mojo/ipc_channel_mojo.h +++ b/ipc/mojo/ipc_channel_mojo.h
@@ -26,8 +26,9 @@ // Mojo-based IPC::Channel implementation over a Mojo message pipe. // -// ChannelMojo builds a Mojo MessagePipe using the provided token and builds an -// associated interface for each direction on the channel. +// ChannelMojo builds a Mojo MessagePipe using the provided message pipe +// |handle| and builds an associated interface for each direction on the +// channel. // // TODO(morrita): Add APIs to create extra MessagePipes to let // Mojo-based objects talk over this Channel. @@ -40,8 +41,8 @@ // True if ChannelMojo should be used regardless of the flag. static bool ShouldBeUsed(); - // Create ChannelMojo. A bootstrap channel is created as well. - static scoped_ptr<ChannelMojo> Create(const std::string& token, + // Creates a ChannelMojo. + static scoped_ptr<ChannelMojo> Create(mojo::ScopedMessagePipeHandle handle, Mode mode, Listener* listener); @@ -49,10 +50,10 @@ // The factory is used to create Mojo-based ChannelProxy family. // |host| must not be null. static scoped_ptr<ChannelFactory> CreateServerFactory( - const std::string& token); + mojo::ScopedMessagePipeHandle handle); static scoped_ptr<ChannelFactory> CreateClientFactory( - const std::string& token); + mojo::ScopedMessagePipeHandle handle); ~ChannelMojo() override; @@ -71,11 +72,11 @@ // These access protected API of IPC::Message, which has ChannelMojo // as a friend class. static MojoResult WriteToMessageAttachmentSet( - mojo::Array<mojo::ScopedHandle> handle_buffer, + mojo::Array<mojom::SerializedHandlePtr> handle_buffer, Message* message); static MojoResult ReadFromMessageAttachmentSet( Message* message, - mojo::Array<mojo::ScopedHandle>* handles); + mojo::Array<mojom::SerializedHandlePtr>* handles); // MojoBootstrapDelegate implementation void OnPipesAvailable(mojom::ChannelAssociatedPtrInfo send_channel, @@ -89,27 +90,21 @@ void OnPipeError(internal::MessagePipeReader* reader) override; private: - ChannelMojo(const std::string& token, + ChannelMojo(mojo::ScopedMessagePipeHandle handle, Mode mode, Listener* listener); void InitMessageReader(mojom::ChannelAssociatedPtrInfo sender, - mojom::ChannelAssociatedRequest receiver); - - void set_peer_pid(base::ProcessId pid) { peer_pid_ = pid; } + mojom::ChannelAssociatedRequest receiver, + base::ProcessId peer_pid); // ChannelMojo needs to kill its MessagePipeReader in delayed manner // because the channel wants to kill these readers during the // notifications invoked by them. typedef internal::MessagePipeReader::DelayedDeleter ReaderDeleter; - scoped_ptr<internal::MessagePipeReader, ReaderDeleter> CreateMessageReader( - mojom::ChannelAssociatedPtrInfo sender, - mojom::ChannelAssociatedRequest receiver); - scoped_ptr<MojoBootstrap> bootstrap_; Listener* listener_; - base::ProcessId peer_pid_; scoped_ptr<internal::MessagePipeReader, ReaderDeleter> message_reader_; std::vector<scoped_ptr<Message>> pending_messages_;
diff --git a/ipc/mojo/ipc_channel_mojo_unittest.cc b/ipc/mojo/ipc_channel_mojo_unittest.cc index ec5efa6..ac09ac3 100644 --- a/ipc/mojo/ipc_channel_mojo_unittest.cc +++ b/ipc/mojo/ipc_channel_mojo_unittest.cc
@@ -15,6 +15,7 @@ #include "base/pickle.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/test/test_io_thread.h" #include "base/test/test_timeouts.h" #include "base/thread_task_runner_handle.h" #include "base/threading/thread.h" @@ -22,21 +23,45 @@ #include "ipc/ipc_message.h" #include "ipc/ipc_test_base.h" #include "ipc/ipc_test_channel_listener.h" +#include "ipc/mojo/ipc_channel_mojo.h" #include "ipc/mojo/ipc_mojo_handle_attachment.h" #include "ipc/mojo/ipc_mojo_message_helper.h" #include "ipc/mojo/ipc_mojo_param_traits.h" +#include "mojo/edk/test/mojo_test_base.h" +#include "mojo/edk/test/multiprocess_test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" #if defined(OS_POSIX) #include "base/file_descriptor_posix.h" #include "ipc/ipc_platform_file_attachment_posix.h" #endif +#define DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(client_name, test_base) \ + class client_name##_MainFixture : public test_base { \ + public: \ + void Main(); \ + }; \ + MULTIPROCESS_TEST_MAIN_WITH_SETUP( \ + client_name##TestChildMain, \ + ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) { \ + CHECK(!mojo::edk::test::MultiprocessTestHelper::primordial_pipe_token \ + .empty()); \ + client_name##_MainFixture test; \ + test.Init(mojo::edk::CreateChildMessagePipe( \ + mojo::edk::test::MultiprocessTestHelper::primordial_pipe_token)); \ + test.Main(); \ + return (::testing::Test::HasFatalFailure() || \ + ::testing::Test::HasNonfatalFailure()) \ + ? 1 \ + : 0; \ + } \ + void client_name##_MainFixture::Main() + namespace { class ListenerThatExpectsOK : public IPC::Listener { public: - ListenerThatExpectsOK() - : received_ok_(false) {} + ListenerThatExpectsOK() : received_ok_(false) {} ~ListenerThatExpectsOK() override {} @@ -58,8 +83,8 @@ } static void SendOK(IPC::Sender* sender) { - IPC::Message* message = new IPC::Message( - 0, 2, IPC::Message::PRIORITY_NORMAL); + IPC::Message* message = + new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL); message->WriteString(std::string("OK")); ASSERT_TRUE(sender->Send(message)); } @@ -70,13 +95,12 @@ class ChannelClient { public: - explicit ChannelClient(IPC::Listener* listener, const char* name) { - channel_ = IPC::ChannelMojo::Create(main_message_loop_.task_runner(), - IPCTestBase::GetChannelName(name), - IPC::Channel::MODE_CLIENT, listener); + void Init(mojo::ScopedMessagePipeHandle handle) { + handle_ = std::move(handle); } - - void Connect() { + void Connect(IPC::Listener* listener) { + channel_ = IPC::ChannelMojo::Create(std::move(handle_), + IPC::Channel::MODE_CLIENT, listener); CHECK(channel_->Connect()); } @@ -93,48 +117,46 @@ private: base::MessageLoopForIO main_message_loop_; + mojo::ScopedMessagePipeHandle handle_; scoped_ptr<IPC::ChannelMojo> channel_; }; -class IPCChannelMojoTestBase : public IPCTestBase { +class IPCChannelMojoTest : public testing::Test { public: + IPCChannelMojoTest() : io_thread_(base::TestIOThread::Mode::kAutoStart) {} + + void TearDown() override { base::RunLoop().RunUntilIdle(); } + void InitWithMojo(const std::string& test_client_name) { - Init(test_client_name); + handle_ = helper_.StartChild(test_client_name); } - void TearDown() override { - // Make sure Mojo IPC support is properly shutdown on the I/O loop before - // TearDown continues. - base::RunLoop run_loop; - task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure()); - run_loop.Run(); - - IPCTestBase::TearDown(); + void CreateChannel(IPC::Listener* listener) { + channel_ = IPC::ChannelMojo::Create(std::move(handle_), + IPC::Channel::MODE_SERVER, listener); } + + bool ConnectChannel() { return channel_->Connect(); } + + void DestroyChannel() { channel_.reset(); } + + bool WaitForClientShutdown() { return helper_.WaitForChildTestShutdown(); } + + IPC::Sender* sender() { return channel(); } + IPC::Channel* channel() { return channel_.get(); } + + private: + base::MessageLoop message_loop_; + base::TestIOThread io_thread_; + mojo::edk::test::MultiprocessTestHelper helper_; + mojo::ScopedMessagePipeHandle handle_; + scoped_ptr<IPC::Channel> channel_; }; -class IPCChannelMojoTest : public IPCChannelMojoTestBase { - protected: - scoped_ptr<IPC::ChannelFactory> CreateChannelFactory( - const IPC::ChannelHandle& handle, - base::SequencedTaskRunner* runner) override { - return IPC::ChannelMojo::CreateServerFactory(task_runner(), handle); - } - - bool DidStartClient() override { - bool ok = IPCTestBase::DidStartClient(); - DCHECK(ok); - return ok; - } -}; - - class TestChannelListenerWithExtraExpectations : public IPC::TestChannelListener { public: - TestChannelListenerWithExtraExpectations() - : is_connected_called_(false) { - } + TestChannelListenerWithExtraExpectations() : is_connected_called_(false) {} void OnChannelConnected(int32_t peer_pid) override { IPC::TestChannelListener::OnChannelConnected(peer_pid); @@ -149,8 +171,7 @@ }; // Times out on Android; see http://crbug.com/502290 -// Times out on Linux. crbug.com/585784 -#if defined(OS_ANDROID) || defined(OS_LINUX) +#if defined(OS_ANDROID) #define MAYBE_ConnectedFromClient DISABLED_ConnectedFromClient #else #define MAYBE_ConnectedFromClient ConnectedFromClient @@ -163,15 +184,12 @@ CreateChannel(&listener); listener.Init(sender()); ASSERT_TRUE(ConnectChannel()); - ASSERT_TRUE(StartClient()); - IPC::TestChannelListener::SendOneMessage( - sender(), "hello from parent"); + IPC::TestChannelListener::SendOneMessage(sender(), "hello from parent"); base::MessageLoop::current()->Run(); - EXPECT_TRUE(base::kNullProcessId != this->channel()->GetPeerPID()); - this->channel()->Close(); + channel()->Close(); EXPECT_TRUE(WaitForClientShutdown()); EXPECT_TRUE(listener.is_connected_called()); @@ -181,28 +199,22 @@ } // A long running process that connects to us -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestClient) { +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestClient, ChannelClient) { TestChannelListenerWithExtraExpectations listener; - ChannelClient client(&listener, "IPCChannelMojoTestClient"); - client.Connect(); - listener.Init(client.channel()); + Connect(&listener); + listener.Init(channel()); - IPC::TestChannelListener::SendOneMessage( - client.channel(), "hello from child"); + IPC::TestChannelListener::SendOneMessage(channel(), "hello from child"); base::MessageLoop::current()->Run(); EXPECT_TRUE(listener.is_connected_called()); EXPECT_TRUE(listener.HasSentAll()); - client.Close(); - - return 0; + Close(); } class ListenerExpectingErrors : public IPC::Listener { public: - ListenerExpectingErrors() - : has_error_(false) { - } + ListenerExpectingErrors() : has_error_(false) {} void OnChannelConnected(int32_t peer_pid) override { base::MessageLoop::current()->QuitWhenIdle(); @@ -221,30 +233,11 @@ bool has_error_; }; - -class IPCChannelMojoErrorTest : public IPCChannelMojoTestBase { - protected: - scoped_ptr<IPC::ChannelFactory> CreateChannelFactory( - const IPC::ChannelHandle& handle, - base::SequencedTaskRunner* runner) override { - return IPC::ChannelMojo::CreateServerFactory(task_runner(), handle); - } - - bool DidStartClient() override { - bool ok = IPCTestBase::DidStartClient(); - DCHECK(ok); - return ok; - } -}; - class ListenerThatQuits : public IPC::Listener { public: - ListenerThatQuits() { - } + ListenerThatQuits() {} - bool OnMessageReceived(const IPC::Message& message) override { - return true; - } + bool OnMessageReceived(const IPC::Message& message) override { return true; } void OnChannelConnected(int32_t peer_pid) override { base::MessageLoop::current()->QuitWhenIdle(); @@ -252,26 +245,23 @@ }; // A long running process that connects to us. -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoErraticTestClient) { +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoErraticTestClient, + ChannelClient) { ListenerThatQuits listener; - ChannelClient client(&listener, "IPCChannelMojoErraticTestClient"); - client.Connect(); + Connect(&listener); base::MessageLoop::current()->Run(); - client.Close(); - - return 0; + Close(); } // Times out on Android; see http://crbug.com/502290 -// Times out on Linux. crbug.com/585784 -#if defined(OS_ANDROID) || defined(OS_LINUX) +#if defined(OS_ANDROID) #define MAYBE_SendFailWithPendingMessages DISABLED_SendFailWithPendingMessages #else #define MAYBE_SendFailWithPendingMessages SendFailWithPendingMessages #endif -TEST_F(IPCChannelMojoErrorTest, MAYBE_SendFailWithPendingMessages) { +TEST_F(IPCChannelMojoTest, MAYBE_SendFailWithPendingMessages) { InitWithMojo("IPCChannelMojoErraticTestClient"); // Set up IPC channel and start client. @@ -284,14 +274,13 @@ std::string overly_large_data(kMaxMessageNumBytes, '*'); // This messages are queued as pending. for (size_t i = 0; i < 10; ++i) { - IPC::TestChannelListener::SendOneMessage( - sender(), overly_large_data.c_str()); + IPC::TestChannelListener::SendOneMessage(sender(), + overly_large_data.c_str()); } - ASSERT_TRUE(StartClient()); base::MessageLoop::current()->Run(); - this->channel()->Close(); + channel()->Close(); EXPECT_TRUE(WaitForClientShutdown()); EXPECT_TRUE(listener.has_error()); @@ -337,6 +326,9 @@ std::string content(GetSendingFileContent().size(), ' '); uint32_t num_bytes = static_cast<uint32_t>(content.size()); + ASSERT_EQ(MOJO_RESULT_OK, + mojo::Wait(pipe.get(), MOJO_HANDLE_SIGNAL_READABLE, + MOJO_DEADLINE_INDEFINITE, nullptr)); EXPECT_EQ(MOJO_RESULT_OK, mojo::ReadMessageRaw(pipe.get(), &content[0], &num_bytes, nullptr, nullptr, 0)); @@ -413,8 +405,7 @@ }; // Times out on Android; see http://crbug.com/502290 -// Times out on Linux. crbug.com/585784 -#if defined(OS_ANDROID) || defined(OS_LINUX) +#if defined(OS_ANDROID) #define MAYBE_SendMessagePipe DISABLED_SendMessagePipe #else #define MAYBE_SendMessagePipe SendMessagePipe @@ -425,34 +416,33 @@ ListenerThatExpectsOK listener; CreateChannel(&listener); ASSERT_TRUE(ConnectChannel()); - ASSERT_TRUE(StartClient()); TestingMessagePipe pipe; HandleSendingHelper::WritePipeThenSend(channel(), &pipe); base::MessageLoop::current()->Run(); - this->channel()->Close(); + channel()->Close(); EXPECT_TRUE(WaitForClientShutdown()); DestroyChannel(); } -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestSendMessagePipeClient) { +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendMessagePipeClient, + ChannelClient) { ListenerThatExpectsMessagePipe listener; - ChannelClient client(&listener, "IPCChannelMojoTestSendMessagePipeClient"); - client.Connect(); - listener.set_sender(client.channel()); + Connect(&listener); + listener.set_sender(channel()); base::MessageLoop::current()->Run(); - client.Close(); - - return 0; + Close(); } void ReadOK(mojo::MessagePipeHandle pipe) { std::string should_be_ok("xx"); uint32_t num_bytes = static_cast<uint32_t>(should_be_ok.size()); + CHECK_EQ(MOJO_RESULT_OK, mojo::Wait(pipe, MOJO_HANDLE_SIGNAL_READABLE, + MOJO_DEADLINE_INDEFINITE, nullptr)); CHECK_EQ(MOJO_RESULT_OK, mojo::ReadMessageRaw(pipe, &should_be_ok[0], &num_bytes, nullptr, nullptr, 0)); @@ -497,22 +487,22 @@ bool receiving_valid_; }; -void ParamTraitMessagePipeClient(bool receiving_valid_handle, - const char* channel_name) { - ListenerThatExpectsMessagePipeUsingParamTrait listener( - receiving_valid_handle); - ChannelClient client(&listener, channel_name); - client.Connect(); - listener.set_sender(client.channel()); +class ParamTraitMessagePipeClient : public ChannelClient { + public: + void RunTest(bool receiving_valid_handle) { + ListenerThatExpectsMessagePipeUsingParamTrait listener( + receiving_valid_handle); + Connect(&listener); + listener.set_sender(channel()); - base::MessageLoop::current()->Run(); + base::MessageLoop::current()->Run(); - client.Close(); -} + Close(); + } +}; // Times out on Android; see http://crbug.com/502290 -// Times out on Linux. crbug.com/585784 -#if defined(OS_ANDROID) || defined(OS_LINUX) +#if defined(OS_ANDROID) #define MAYBE_ParamTraitValidMessagePipe DISABLED_ParamTraitValidMessagePipe #else #define MAYBE_ParamTraitValidMessagePipe ParamTraitValidMessagePipe @@ -523,7 +513,6 @@ ListenerThatExpectsOK listener; CreateChannel(&listener); ASSERT_TRUE(ConnectChannel()); - ASSERT_TRUE(StartClient()); TestingMessagePipe pipe; @@ -532,22 +521,21 @@ pipe.peer.release()); WriteOK(pipe.self.get()); - this->channel()->Send(message.release()); + channel()->Send(message.release()); base::MessageLoop::current()->Run(); - this->channel()->Close(); + channel()->Close(); EXPECT_TRUE(WaitForClientShutdown()); DestroyChannel(); } -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(ParamTraitValidMessagePipeClient) { - ParamTraitMessagePipeClient(true, "ParamTraitValidMessagePipeClient"); - return 0; +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ParamTraitValidMessagePipeClient, + ParamTraitMessagePipeClient) { + RunTest(true); } // Times out on Android; see http://crbug.com/502290 -// Times out on Linux. crbug.com/585784 -#if defined(OS_ANDROID) || defined(OS_LINUX) +#if defined(OS_ANDROID) #define MAYBE_ParamTraitInvalidMessagePipe DISABLED_ParamTraitInvalidMessagePipe #else #define MAYBE_ParamTraitInvalidMessagePipe ParamTraitInvalidMessagePipe @@ -558,43 +546,35 @@ ListenerThatExpectsOK listener; CreateChannel(&listener); ASSERT_TRUE(ConnectChannel()); - ASSERT_TRUE(StartClient()); mojo::MessagePipeHandle invalid_handle; scoped_ptr<IPC::Message> message(new IPC::Message()); IPC::ParamTraits<mojo::MessagePipeHandle>::Write(message.get(), invalid_handle); - this->channel()->Send(message.release()); + channel()->Send(message.release()); base::MessageLoop::current()->Run(); - this->channel()->Close(); + channel()->Close(); EXPECT_TRUE(WaitForClientShutdown()); DestroyChannel(); } -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(ParamTraitInvalidMessagePipeClient) { - ParamTraitMessagePipeClient(false, "ParamTraitInvalidMessagePipeClient"); - return 0; +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ParamTraitInvalidMessagePipeClient, + ParamTraitMessagePipeClient) { + RunTest(false); } -// Times out on Linux. crbug.com/585784 -#if defined(OS_LINUX) -#define MAYBE_SendFailAfterClose DISABLED_SendFailAfterClose -#else -#define MAYBE_SendFailAfterClose SendFailAfterClose -#endif -TEST_F(IPCChannelMojoTest, MAYBE_SendFailAfterClose) { +TEST_F(IPCChannelMojoTest, SendFailAfterClose) { InitWithMojo("IPCChannelMojoTestSendOkClient"); ListenerThatExpectsOK listener; CreateChannel(&listener); ASSERT_TRUE(ConnectChannel()); - ASSERT_TRUE(StartClient()); base::MessageLoop::current()->Run(); - this->channel()->Close(); - ASSERT_FALSE(this->channel()->Send(new IPC::Message())); + channel()->Close(); + ASSERT_FALSE(channel()->Send(new IPC::Message())); EXPECT_TRUE(WaitForClientShutdown()); DestroyChannel(); @@ -602,12 +582,9 @@ class ListenerSendingOneOk : public IPC::Listener { public: - ListenerSendingOneOk() { - } + ListenerSendingOneOk() {} - bool OnMessageReceived(const IPC::Message& message) override { - return true; - } + bool OnMessageReceived(const IPC::Message& message) override { return true; } void OnChannelConnected(int32_t peer_pid) override { ListenerThatExpectsOK::SendOK(sender_); @@ -620,86 +597,21 @@ IPC::Sender* sender_; }; -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestSendOkClient) { +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendOkClient, + ChannelClient) { ListenerSendingOneOk listener; - ChannelClient client(&listener, "IPCChannelMojoTestSendOkClient"); - client.Connect(); - listener.set_sender(client.channel()); + Connect(&listener); + listener.set_sender(channel()); base::MessageLoop::current()->Run(); - client.Close(); - - return 0; + Close(); } -#if defined(OS_WIN) -class IPCChannelMojoDeadHandleTest : public IPCChannelMojoTestBase { - protected: - scoped_ptr<IPC::ChannelFactory> CreateChannelFactory( - const IPC::ChannelHandle& handle, - base::SequencedTaskRunner* runner) override { - return IPC::ChannelMojo::CreateServerFactory(task_runner(), handle); - } - - bool DidStartClient() override { - IPCTestBase::DidStartClient(); - // const base::ProcessHandle client = client_process().Handle(); - // Forces GetFileHandleForProcess() fail. It happens occasionally - // in production, so we should exercise it somehow. - // TODO(morrita): figure out how to safely test this. See crbug.com/464109. - // ::CloseHandle(client); - return true; - } -}; - -// Times out on Linux. crbug.com/585784 -#if defined(OS_LINUX) -#define MAYBE_InvalidClientHandle DISABLED_InvalidClientHandle -#else -#define MAYBE_InvalidClientHandle InvalidClientHandle -#endif -TEST_F(IPCChannelMojoDeadHandleTest, MAYBE_InvalidClientHandle) { - // Any client type is fine as it is going to be killed anyway. - InitWithMojo("IPCChannelMojoTestDoNothingClient"); - - // Set up IPC channel and start client. - ListenerExpectingErrors listener; - CreateChannel(&listener); - ASSERT_TRUE(ConnectChannel()); - - ASSERT_TRUE(StartClient()); - base::MessageLoop::current()->Run(); - - this->channel()->Close(); - - // TODO(morrita): We need CloseHandle() call in DidStartClient(), - // which has been disabled since crrev.com/843113003, to - // make this fail. See crbug.com/464109. - // EXPECT_FALSE(WaitForClientShutdown()); - WaitForClientShutdown(); - EXPECT_TRUE(listener.has_error()); - - DestroyChannel(); -} - -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestDoNothingClient) { - ListenerThatQuits listener; - ChannelClient client(&listener, "IPCChannelMojoTestDoNothingClient"); - client.Connect(); - - // Quits without running the message loop as this client won't - // receive any messages from the server. - - return 0; -} -#endif - #if defined(OS_POSIX) class ListenerThatExpectsFile : public IPC::Listener { public: - ListenerThatExpectsFile() - : sender_(NULL) {} + ListenerThatExpectsFile() : sender_(NULL) {} ~ListenerThatExpectsFile() override {} @@ -711,9 +623,7 @@ return true; } - void OnChannelError() override { - NOTREACHED(); - } + void OnChannelError() override { NOTREACHED(); } void set_sender(IPC::Sender* sender) { sender_ = sender; } @@ -722,8 +632,7 @@ }; // Times out on Android; see http://crbug.com/502290 -// Times out on Linux. crbug.com/585784 -#if defined(OS_ANDROID) || defined(OS_LINUX) +#if defined(OS_ANDROID) #define MAYBE_SendPlatformHandle DISABLED_SendPlatformHandle #else #define MAYBE_SendPlatformHandle SendPlatformHandle @@ -734,7 +643,6 @@ ListenerThatExpectsOK listener; CreateChannel(&listener); ASSERT_TRUE(ConnectChannel()); - ASSERT_TRUE(StartClient()); base::File file(HandleSendingHelper::GetSendingFilePath(), base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | @@ -742,24 +650,21 @@ HandleSendingHelper::WriteFileThenSend(channel(), file); base::MessageLoop::current()->Run(); - this->channel()->Close(); + channel()->Close(); EXPECT_TRUE(WaitForClientShutdown()); DestroyChannel(); } -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestSendPlatformHandleClient) { +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendPlatformHandleClient, + ChannelClient) { ListenerThatExpectsFile listener; - ChannelClient client( - &listener, "IPCChannelMojoTestSendPlatformHandleClient"); - client.Connect(); - listener.set_sender(client.channel()); + Connect(&listener); + listener.set_sender(channel()); base::MessageLoop::current()->Run(); - client.Close(); - - return 0; + Close(); } class ListenerThatExpectsFileAndPipe : public IPC::Listener { @@ -786,8 +691,7 @@ }; // Times out on Android; see http://crbug.com/502290 -// Times out on Linux. crbug.com/585784 -#if defined(OS_ANDROID) || defined(OS_LINUX) +#if defined(OS_ANDROID) #define MAYBE_SendPlatformHandleAndPipe DISABLED_SendPlatformHandleAndPipe #else #define MAYBE_SendPlatformHandleAndPipe SendPlatformHandleAndPipe @@ -798,7 +702,6 @@ ListenerThatExpectsOK listener; CreateChannel(&listener); ASSERT_TRUE(ConnectChannel()); - ASSERT_TRUE(StartClient()); base::File file(HandleSendingHelper::GetSendingFilePath(), base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | @@ -807,25 +710,22 @@ HandleSendingHelper::WriteFileAndPipeThenSend(channel(), file, &pipe); base::MessageLoop::current()->Run(); - this->channel()->Close(); + channel()->Close(); EXPECT_TRUE(WaitForClientShutdown()); DestroyChannel(); } -MULTIPROCESS_IPC_TEST_CLIENT_MAIN( - IPCChannelMojoTestSendPlatformHandleAndPipeClient) { +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT( + IPCChannelMojoTestSendPlatformHandleAndPipeClient, + ChannelClient) { ListenerThatExpectsFileAndPipe listener; - ChannelClient client(&listener, - "IPCChannelMojoTestSendPlatformHandleAndPipeClient"); - client.Connect(); - listener.set_sender(client.channel()); + Connect(&listener); + listener.set_sender(channel()); base::MessageLoop::current()->Run(); - client.Close(); - - return 0; + Close(); } #endif @@ -847,19 +747,12 @@ } }; -// Times out on Linux. crbug.com/585784 -#if defined(OS_LINUX) -#define MAYBE_VerifyGlobalPid DISABLED_VerifyGlobalPid -#else -#define MAYBE_VerifyGlobalPid VerifyGlobalPid -#endif -TEST_F(IPCChannelMojoTest, MAYBE_VerifyGlobalPid) { +TEST_F(IPCChannelMojoTest, VerifyGlobalPid) { InitWithMojo("IPCChannelMojoTestVerifyGlobalPidClient"); ListenerThatVerifiesPeerPid listener; CreateChannel(&listener); ASSERT_TRUE(ConnectChannel()); - ASSERT_TRUE(StartClient()); base::MessageLoop::current()->Run(); channel()->Close(); @@ -868,20 +761,17 @@ DestroyChannel(); } -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestVerifyGlobalPidClient) { +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestVerifyGlobalPidClient, + ChannelClient) { IPC::Channel::SetGlobalPid(kMagicChildId); ListenerThatQuits listener; - ChannelClient client(&listener, - "IPCChannelMojoTestVerifyGlobalPidClient"); - client.Connect(); + Connect(&listener); base::MessageLoop::current()->Run(); - client.Close(); - - return 0; + Close(); } -#endif // OS_LINUX +#endif // OS_LINUX } // namespace
diff --git a/ipc/mojo/ipc_message_pipe_reader.cc b/ipc/mojo/ipc_message_pipe_reader.cc index ab5466e3..76e323b 100644 --- a/ipc/mojo/ipc_message_pipe_reader.cc +++ b/ipc/mojo/ipc_message_pipe_reader.cc
@@ -21,8 +21,10 @@ MessagePipeReader::MessagePipeReader( mojom::ChannelAssociatedPtr sender, mojo::AssociatedInterfaceRequest<mojom::Channel> receiver, + base::ProcessId peer_pid, MessagePipeReader::Delegate* delegate) : delegate_(delegate), + peer_pid_(peer_pid), sender_(std::move(sender)), binding_(this, std::move(receiver)) { sender_.set_connection_error_handler( @@ -78,6 +80,7 @@ ? "" : reinterpret_cast<const char*>(&ipc_message->data[0]), static_cast<uint32_t>(ipc_message->data.size())); + message.set_sender_pid(peer_pid_); DVLOG(4) << "Receive " << message.type() << ": " << message.size(); MojoResult write_result = ChannelMojo::WriteToMessageAttachmentSet(
diff --git a/ipc/mojo/ipc_message_pipe_reader.h b/ipc/mojo/ipc_message_pipe_reader.h index 38ca6a8a..75fe7ad4 100644 --- a/ipc/mojo/ipc_message_pipe_reader.h +++ b/ipc/mojo/ipc_message_pipe_reader.h
@@ -71,6 +71,7 @@ // Note that MessagePipeReader doesn't delete |delegate|. MessagePipeReader(mojom::ChannelAssociatedPtr sender, mojo::AssociatedInterfaceRequest<mojom::Channel> receiver, + base::ProcessId peer_pid, Delegate* delegate); ~MessagePipeReader() override; @@ -84,6 +85,8 @@ bool Send(scoped_ptr<Message> message); + base::ProcessId GetPeerPid() const { return peer_pid_; } + protected: void OnPipeClosed(); void OnPipeError(MojoResult error); @@ -93,6 +96,7 @@ // |delegate_| is null once the message pipe is closed. Delegate* delegate_; + base::ProcessId peer_pid_; mojom::ChannelAssociatedPtr sender_; mojo::AssociatedBinding<mojom::Channel> binding_; base::ThreadChecker thread_checker_;
diff --git a/ipc/mojo/ipc_mojo.gyp b/ipc/mojo/ipc_mojo.gyp index cb22889..75c85d9 100644 --- a/ipc/mojo/ipc_mojo.gyp +++ b/ipc/mojo/ipc_mojo.gyp
@@ -71,10 +71,7 @@ 'sources': [ 'run_all_unittests.cc', - # TODO(rockot): Re-enable these when we're ready to start using - # ChannelMojo again. They need to be updated to support multiprocess - # testing with the current Mojo EDK implementation. - #"ipc_channel_mojo_unittest.cc", + "ipc_channel_mojo_unittest.cc", 'ipc_mojo_bootstrap_unittest.cc', ], 'conditions': [
diff --git a/ipc/mojo/ipc_mojo_bootstrap.cc b/ipc/mojo/ipc_mojo_bootstrap.cc index 6ace754..a80b461 100644 --- a/ipc/mojo/ipc_mojo_bootstrap.cc +++ b/ipc/mojo/ipc_mojo_bootstrap.cc
@@ -45,8 +45,7 @@ void MojoServerBootstrap::Connect() { DCHECK_EQ(state(), STATE_INITIALIZED); - bootstrap_.Bind( - mojom::BootstrapPtrInfo(mojo::edk::CreateParentMessagePipe(token()), 0)); + bootstrap_.Bind(mojom::BootstrapPtrInfo(TakeHandle(), 0)); bootstrap_.set_connection_error_handler( base::Bind(&MojoServerBootstrap::Fail, base::Unretained(this))); @@ -105,7 +104,7 @@ MojoClientBootstrap::MojoClientBootstrap() : binding_(this) {} void MojoClientBootstrap::Connect() { - binding_.Bind(mojo::edk::CreateChildMessagePipe(token())); + binding_.Bind(TakeHandle()); binding_.set_connection_error_handler( base::Bind(&MojoClientBootstrap::Fail, base::Unretained(this))); } @@ -126,16 +125,17 @@ // MojoBootstrap // static -scoped_ptr<MojoBootstrap> MojoBootstrap::Create(const std::string& token, - Channel::Mode mode, - Delegate* delegate) { +scoped_ptr<MojoBootstrap> MojoBootstrap::Create( + mojo::ScopedMessagePipeHandle handle, + Channel::Mode mode, + Delegate* delegate) { CHECK(mode == Channel::MODE_CLIENT || mode == Channel::MODE_SERVER); scoped_ptr<MojoBootstrap> self = mode == Channel::MODE_CLIENT ? scoped_ptr<MojoBootstrap>(new MojoClientBootstrap()) : scoped_ptr<MojoBootstrap>(new MojoServerBootstrap()); - self->Init(token, delegate); + self->Init(std::move(handle), delegate); return self; } @@ -144,8 +144,9 @@ MojoBootstrap::~MojoBootstrap() {} -void MojoBootstrap::Init(const std::string& token, Delegate* delegate) { - token_ = token; +void MojoBootstrap::Init(mojo::ScopedMessagePipeHandle handle, + Delegate* delegate) { + handle_ = std::move(handle); delegate_ = delegate; } @@ -166,4 +167,8 @@ return state() == STATE_ERROR; } +mojo::ScopedMessagePipeHandle MojoBootstrap::TakeHandle() { + return std::move(handle_); +} + } // namespace IPC
diff --git a/ipc/mojo/ipc_mojo_bootstrap.h b/ipc/mojo/ipc_mojo_bootstrap.h index 4c97850..23e0e91 100644 --- a/ipc/mojo/ipc_mojo_bootstrap.h +++ b/ipc/mojo/ipc_mojo_bootstrap.h
@@ -38,9 +38,9 @@ virtual void OnBootstrapError() = 0; }; - // Create the MojoBootstrap instance, using |token| to create the message - // pipe, in mode as specified by |mode|. The result is passed to |delegate|. - static scoped_ptr<MojoBootstrap> Create(const std::string& token, + // Create the MojoBootstrap instance, using |handle| as the message pipe, in + // mode as specified by |mode|. The result is passed to |delegate|. + static scoped_ptr<MojoBootstrap> Create(mojo::ScopedMessagePipeHandle handle, Channel::Mode mode, Delegate* delegate); @@ -66,12 +66,12 @@ State state() const { return state_; } void set_state(State state) { state_ = state; } - const std::string& token() { return token_; } + mojo::ScopedMessagePipeHandle TakeHandle(); private: - void Init(const std::string& token, Delegate* delegate); + void Init(mojo::ScopedMessagePipeHandle, Delegate* delegate); - std::string token_; + mojo::ScopedMessagePipeHandle handle_; Delegate* delegate_; State state_;
diff --git a/ipc/mojo/ipc_mojo_bootstrap_unittest.cc b/ipc/mojo/ipc_mojo_bootstrap_unittest.cc index efd2b809..66ccdea 100644 --- a/ipc/mojo/ipc_mojo_bootstrap_unittest.cc +++ b/ipc/mojo/ipc_mojo_bootstrap_unittest.cc
@@ -57,8 +57,6 @@ quit_callback_.Run(); } -const char kMojoChannelToken[] = "IPCMojoBootstrapTest token"; - // Times out on Android; see http://crbug.com/502290 #if defined(OS_ANDROID) #define MAYBE_Connect DISABLED_Connect @@ -69,9 +67,10 @@ base::MessageLoop message_loop; base::RunLoop run_loop; TestingDelegate delegate(run_loop.QuitClosure()); + RUN_CHILD_ON_PIPE(IPCMojoBootstrapTestClient, pipe) scoped_ptr<IPC::MojoBootstrap> bootstrap = IPC::MojoBootstrap::Create( - kMojoChannelToken, IPC::Channel::MODE_SERVER, &delegate); - RUN_CHILD_ON_PIPE(IPCMojoBootstrapTestClient, unused_pipe) + mojo::MakeScopedHandle(mojo::MessagePipeHandle(pipe)), + IPC::Channel::MODE_SERVER, &delegate); bootstrap->Connect(); run_loop.Run(); @@ -92,13 +91,14 @@ // A long running process that connects to us. DEFINE_TEST_CLIENT_TEST_WITH_PIPE(IPCMojoBootstrapTestClient, - IPCMojoBootstrapTest, - unused_pipe) { + IPCMojoBootstrapTest, + pipe) { base::MessageLoop message_loop; base::RunLoop run_loop; TestingDelegate delegate(run_loop.QuitClosure()); scoped_ptr<IPC::MojoBootstrap> bootstrap = IPC::MojoBootstrap::Create( - kMojoChannelToken, IPC::Channel::MODE_CLIENT, &delegate); + mojo::MakeScopedHandle(mojo::MessagePipeHandle(pipe)), + IPC::Channel::MODE_CLIENT, &delegate); bootstrap->Connect();
diff --git a/ipc/mojo/ipc_mojo_handle_attachment.cc b/ipc/mojo/ipc_mojo_handle_attachment.cc index ccce0d95..b2e16f1 100644 --- a/ipc/mojo/ipc_mojo_handle_attachment.cc +++ b/ipc/mojo/ipc_mojo_handle_attachment.cc
@@ -27,8 +27,7 @@ base::PlatformFile MojoHandleAttachment::TakePlatformFile() { mojo::edk::ScopedPlatformHandle platform_handle; MojoResult unwrap_result = mojo::edk::PassWrappedPlatformHandle( - handle_.get().value(), &platform_handle); - handle_.reset(); + handle_.release().value(), &platform_handle); if (unwrap_result != MOJO_RESULT_OK) { LOG(ERROR) << "Pipe failed to covert handles. Closing: " << unwrap_result; return -1;
diff --git a/ipc/mojo/ipc_mojo_perftest.cc b/ipc/mojo/ipc_mojo_perftest.cc index 92b79f8..b1c6c86 100644 --- a/ipc/mojo/ipc_mojo_perftest.cc +++ b/ipc/mojo/ipc_mojo_perftest.cc
@@ -17,31 +17,22 @@ namespace IPC { namespace { -const char kPerftestToken[] = "perftest-token"; - class MojoChannelPerfTest : public test::IPCChannelPerfTestBase { public: - MojoChannelPerfTest() { token_ = mojo::edk::GenerateRandomToken(); } - void TearDown() override { - { - base::AutoLock l(ipc_support_lock_); - ipc_support_.reset(); - } + ipc_support_.reset(); test::IPCChannelPerfTestBase::TearDown(); } scoped_ptr<ChannelFactory> CreateChannelFactory( const ChannelHandle& handle, base::SequencedTaskRunner* runner) override { - EnsureIpcSupport(); - return ChannelMojo::CreateServerFactory(token_); + ipc_support_.reset(new mojo::edk::test::ScopedIPCSupport(io_task_runner())); + return ChannelMojo::CreateServerFactory( + helper_.StartChild("MojoPerfTestClient")); } bool StartClient() override { - EnsureIpcSupport(); - helper_.StartChildWithExtraSwitch("MojoPerfTestClient", kPerftestToken, - token_); return true; } @@ -49,17 +40,7 @@ return helper_.WaitForChildTestShutdown(); } - void EnsureIpcSupport() { - base::AutoLock l(ipc_support_lock_); - if (!ipc_support_) { - ipc_support_.reset( - new mojo::edk::test::ScopedIPCSupport(io_task_runner())); - } - } - mojo::edk::test::MultiprocessTestHelper helper_; - std::string token_; - base::Lock ipc_support_lock_; scoped_ptr<mojo::edk::test::ScopedIPCSupport> ipc_support_; }; @@ -99,8 +80,11 @@ scoped_ptr<Channel> CreateChannel(Listener* listener) override; + int Run(MojoHandle handle); + private: mojo::edk::test::ScopedIPCSupport ipc_support_; + mojo::ScopedMessagePipeHandle handle_; }; MojoPerfTestClient::MojoPerfTestClient() @@ -109,16 +93,19 @@ } scoped_ptr<Channel> MojoPerfTestClient::CreateChannel(Listener* listener) { - return scoped_ptr<Channel>(ChannelMojo::Create( - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - kPerftestToken), - Channel::MODE_CLIENT, listener)); + return scoped_ptr<Channel>( + ChannelMojo::Create(std::move(handle_), Channel::MODE_CLIENT, listener)); +} + +int MojoPerfTestClient::Run(MojoHandle handle) { + handle_ = mojo::MakeScopedHandle(mojo::MessagePipeHandle(handle)); + return RunMain(); } MULTIPROCESS_TEST_MAIN(MojoPerfTestClientTestChildMain) { MojoPerfTestClient client; - - int rv = client.RunMain(); + int rv = mojo::edk::test::MultiprocessTestHelper::RunClientMain( + base::Bind(&MojoPerfTestClient::Run, base::Unretained(&client))); base::RunLoop run_loop; run_loop.RunUntilIdle();
diff --git a/mash/init/BUILD.gn b/mash/init/BUILD.gn index 010fb38..adb69cd 100644 --- a/mash/init/BUILD.gn +++ b/mash/init/BUILD.gn
@@ -20,6 +20,7 @@ ":manifest", "//base", "//components/mus/public/cpp", + "//components/mus/public/interfaces", "//mash/init/public/interfaces", "//mojo/public/cpp/bindings", "//mojo/services/tracing/public/cpp",
diff --git a/mash/init/init.cc b/mash/init/init.cc index 98aea78..55c5d7a 100644 --- a/mash/init/init.cc +++ b/mash/init/init.cc
@@ -6,13 +6,14 @@ #include "base/bind.h" #include "base/command_line.h" +#include "base/guid.h" #include "mojo/shell/public/cpp/connection.h" #include "mojo/shell/public/cpp/connector.h" namespace mash { namespace init { -Init::Init() : connector_(nullptr) {} +Init::Init() : connector_(nullptr), login_user_id_(base::GenerateGUID()) {} Init::~Init() {} void Init::Initialize(mojo::Connector* connector, @@ -20,11 +21,14 @@ uint32_t id) { connector_ = connector; mus_connection_ = connector_->Connect("mojo:mus"); + mus_connection_->GetInterface(&user_access_manager_); + user_access_manager_->SetActiveUser(login_user_id_); StartWindowManager(); StartLogin(); } void Init::LoginAs(const mojo::String& user_id) { + user_access_manager_->SetActiveUser(user_id); connections_["mojo:mash_login"].reset(); connections_["mojo:desktop_wm"].reset(); mojo::Connector::ConnectParams params( @@ -37,14 +41,16 @@ } void Init::StartWindowManager() { - mojo::Connector::ConnectParams params(mojo::Identity("mojo:desktop_wm", "2")); + mojo::Connector::ConnectParams params( + mojo::Identity("mojo:desktop_wm", login_user_id_)); StartRestartableService( ¶ms, base::Bind(&Init::StartWindowManager, base::Unretained(this))); } void Init::StartLogin() { - mojo::Connector::ConnectParams params(mojo::Identity("mojo:mash_login", "2")); + mojo::Connector::ConnectParams params( + mojo::Identity("mojo:mash_login", login_user_id_)); StartRestartableService( ¶ms, base::Bind(&Init::StartLogin, base::Unretained(this)));
diff --git a/mash/init/init.h b/mash/init/init.h index 04812c10..f0d34e1 100644 --- a/mash/init/init.h +++ b/mash/init/init.h
@@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" +#include "components/mus/public/interfaces/user_access_manager.mojom.h" #include "mash/init/public/interfaces/login.mojom.h" #include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/shell/public/cpp/connector.h" @@ -53,6 +54,8 @@ std::map<std::string, scoped_ptr<mojo::Connection>> connections_; mojo::BindingSet<mojom::Login> login_bindings_; scoped_ptr<mojo::Connection> mus_connection_; + mus::mojom::UserAccessManagerPtr user_access_manager_; + const std::string login_user_id_; DISALLOW_COPY_AND_ASSIGN(Init); };
diff --git a/mash/login/login.cc b/mash/login/login.cc index 49bfd34..7604850 100644 --- a/mash/login/login.cc +++ b/mash/login/login.cc
@@ -4,6 +4,7 @@ #include "mash/login/login.h" +#include "base/guid.h" #include "base/macros.h" #include "base/message_loop/message_loop.h" #include "base/strings/utf_string_conversions.h" @@ -27,6 +28,8 @@ public: explicit LoginView(Login* login) : login_(login), + user_id_1_(base::GenerateGUID()), + user_id_2_(base::GenerateGUID()), login_button_1_( new views::LabelButton(this, base::ASCIIToUTF16("Timothy"))), login_button_2_( @@ -72,9 +75,9 @@ // Login... mojo::Connector::ConnectParams params("mojo:mash_shell"); if (sender == login_button_1_) { - login_->login()->LoginAs("3"); + login_->login()->LoginAs(user_id_1_); } else if (sender == login_button_2_) { - login_->login()->LoginAs("4"); + login_->login()->LoginAs(user_id_2_); } else { NOTREACHED(); } @@ -82,6 +85,8 @@ } Login* login_; + const std::string user_id_1_; + const std::string user_id_2_; views::LabelButton* login_button_1_; views::LabelButton* login_button_2_;
diff --git a/mash/wm/BUILD.gn b/mash/wm/BUILD.gn index 935186ca..39f95ec 100644 --- a/mash/wm/BUILD.gn +++ b/mash/wm/BUILD.gn
@@ -154,7 +154,6 @@ "//base", "//base/test:test_config", "//components/mus/public/cpp", - "//components/mus/public/cpp/tests:test_support", "//components/mus/public/interfaces", "//mojo/common:common_base", "//mojo/converters/geometry",
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn index f790419..ef69b2d7 100644 --- a/media/base/BUILD.gn +++ b/media/base/BUILD.gn
@@ -559,6 +559,16 @@ } } +fuzzer_test("media_bit_reader_fuzzer") { + sources = [ + "bit_reader_fuzzertest.cc", + ] + deps = [ + "//base", + "//media", + ] +} + fuzzer_test("media_container_names_fuzzer") { sources = [ "container_names_fuzzertest.cc",
diff --git a/media/base/bit_reader_core.cc b/media/base/bit_reader_core.cc index 32d2d53..237470c 100644 --- a/media/base/bit_reader_core.cc +++ b/media/base/bit_reader_core.cc
@@ -86,8 +86,11 @@ byte_stream_provider_->GetBytes(nbytes, &byte_stream_window); DCHECK_GE(window_size, 0); DCHECK_LE(window_size, nbytes); - if (window_size < nbytes) + if (window_size < nbytes) { + // Note that some bytes were consumed. + bits_read_ += 8 * window_size; return false; + } num_bits -= 8 * nbytes; bits_read_ += 8 * nbytes; }
diff --git a/media/base/bit_reader_fuzzertest.cc b/media/base/bit_reader_fuzzertest.cc new file mode 100644 index 0000000..762a9b63 --- /dev/null +++ b/media/base/bit_reader_fuzzertest.cc
@@ -0,0 +1,37 @@ +// 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 <stddef.h> +#include <stdint.h> + +#include "base/hash.h" +#include "base/numerics/safe_conversions.h" +#include "media/base/bit_reader.h" +#include "media/base/test_random.h" + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + media::BitReader reader(data, base::checked_cast<int>(size)); + + // Need a simple random number generator to generate the number of bits to + // read/skip in a reproducible way (given the same |data|). Using Hash() to + // ensure the seed varies significantly over minor changes in |data|. + media::TestRandom rnd(base::Hash(reinterpret_cast<const char*>(data), size)); + + // Read and skip through the data in |reader|. + while (reader.bits_available() > 0) { + if (rnd.Rand() & 1) { + // Read up to 64 bits. This may fail if there is not enough bits + // remaining, but it doesn't matter (testing for failures is also good). + uint64_t value; + if (!reader.ReadBits(rnd.Rand() % 64 + 1, &value)) + break; + } else { + // Skip up to 128 bits. As above, this may fail. + if (!reader.SkipBits(rnd.Rand() % 128 + 1)) + break; + } + } + return 0; +}
diff --git a/media/blink/webencryptedmediaclient_impl.cc b/media/blink/webencryptedmediaclient_impl.cc index abf9eff..8d2aa2e18 100644 --- a/media/blink/webencryptedmediaclient_impl.cc +++ b/media/blink/webencryptedmediaclient_impl.cc
@@ -102,12 +102,12 @@ if (GetMediaClient()) { GURL security_origin( - blink::WebStringToGURL(request.securityOrigin().toString())); + blink::WebStringToGURL(request.getSecurityOrigin().toString())); GetMediaClient()->RecordRapporURL("Media.OriginUrl.EME", security_origin); blink::WebString error_message; - if (!request.securityOrigin().isPotentiallyTrustworthy(error_message)) { + if (!request.getSecurityOrigin().isPotentiallyTrustworthy(error_message)) { GetMediaClient()->RecordRapporURL("Media.OriginUrl.EME.Insecure", security_origin); } @@ -115,7 +115,7 @@ key_system_config_selector_.SelectConfig( request.keySystem(), request.supportedConfigurations(), - request.securityOrigin(), are_secure_codecs_supported_cb_.Run(), + request.getSecurityOrigin(), are_secure_codecs_supported_cb_.Run(), base::Bind(&WebEncryptedMediaClientImpl::OnRequestSucceeded, weak_factory_.GetWeakPtr(), request), base::Bind(&WebEncryptedMediaClientImpl::OnRequestNotSupported, @@ -139,8 +139,8 @@ // TODO(sandersd): Pass |are_secure_codecs_required| along and use it to // configure the CDM security level and use of secure surfaces on Android. request.requestSucceeded(WebContentDecryptionModuleAccessImpl::Create( - request.keySystem(), request.securityOrigin(), accumulated_configuration, - cdm_config, weak_factory_.GetWeakPtr())); + request.keySystem(), request.getSecurityOrigin(), + accumulated_configuration, cdm_config, weak_factory_.GetWeakPtr())); } void WebEncryptedMediaClientImpl::OnRequestNotSupported(
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 96f787e..071e70ea 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -282,7 +282,7 @@ DCHECK(main_task_runner_->BelongsToCurrentThread()); GURL gurl(url); - ReportMetrics(load_type, gurl, frame_->document().securityOrigin()); + ReportMetrics(load_type, gurl, frame_->document().getSecurityOrigin()); // Set subresource URL for crash reporting. base::debug::SetCrashKeyValue("subresource_url", gurl.spec()); @@ -1270,7 +1270,7 @@ client_->readyStateChanged(); } -blink::WebAudioSourceProvider* WebMediaPlayerImpl::audioSourceProvider() { +blink::WebAudioSourceProvider* WebMediaPlayerImpl::getAudioSourceProvider() { return audio_source_provider_.get(); }
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h index 9cba070..0dd640de 100644 --- a/media/blink/webmediaplayer_impl.h +++ b/media/blink/webmediaplayer_impl.h
@@ -158,7 +158,7 @@ bool premultiply_alpha, bool flip_y) override; - blink::WebAudioSourceProvider* audioSourceProvider() override; + blink::WebAudioSourceProvider* getAudioSourceProvider() override; void setContentDecryptionModule( blink::WebContentDecryptionModule* cdm,
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc index aa052dd..0109dc7 100644 --- a/media/filters/gpu_video_decoder.cc +++ b/media/filters/gpu_video_decoder.cc
@@ -476,13 +476,24 @@ NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); return; } - const PictureBuffer& pb = it->second; + PictureBuffer& pb = it->second; + if (picture.size_changed()) { + // Update the PictureBuffer size to match that of the Picture. Some VDA's + // (e.g. Android) will handle resolution changes internally without + // requesting new PictureBuffers. Sending a Picture of unmatched size is + // the signal that we should update the size of our PictureBuffer. + DCHECK(pb.size() != picture.visible_rect().size()); + DVLOG(3) << __FUNCTION__ << " Updating size of PictureBuffer[" << pb.id() + << "] from:" << pb.size().ToString() + << " to:" << picture.visible_rect().size().ToString(); + pb.set_size(picture.visible_rect().size()); + } // Update frame's timestamp. base::TimeDelta timestamp; - // Some of the VDAs like DXVA, AVDA, and VTVDA don't support and thus don't - // provide us with visible size in picture.size, passing (0, 0) instead, so - // for those cases drop it and use config information instead. + // Some of the VDAs like DXVA, and VTVDA don't support and thus don't provide + // us with visible size in picture.size, passing (0, 0) instead, so for those + // cases drop it and use config information instead. gfx::Rect visible_rect; gfx::Size natural_size; GetBufferData(picture.bitstream_buffer_id(), ×tamp, &visible_rect,
diff --git a/media/video/picture.cc b/media/video/picture.cc index 315ad65..41546732 100644 --- a/media/video/picture.cc +++ b/media/video/picture.cc
@@ -35,6 +35,7 @@ : picture_buffer_id_(picture_buffer_id), bitstream_buffer_id_(bitstream_buffer_id), visible_rect_(visible_rect), - allow_overlay_(allow_overlay) {} + allow_overlay_(allow_overlay), + size_changed_(false) {} } // namespace media
diff --git a/media/video/picture.h b/media/video/picture.h index 5ec3c55d..13d7c90 100644 --- a/media/video/picture.h +++ b/media/video/picture.h
@@ -35,6 +35,7 @@ gfx::Size size() const { return size_; } + void set_size(const gfx::Size& size) { size_ = size; } // Returns the id of the texture. // NOTE: The texture id in the renderer process corresponds to a different @@ -59,6 +60,8 @@ // This is the media-namespace equivalent of PP_Picture_Dev. class MEDIA_EXPORT Picture { public: + // Defaults |size_changed_| to false. Size changed is currently only used + // by AVDA and is set via set_size_changd(). Picture(int32_t picture_buffer_id, int32_t bitstream_buffer_id, const gfx::Rect& visible_rect, @@ -81,11 +84,20 @@ bool allow_overlay() const { return allow_overlay_; } + // Returns true when the VDA has adjusted the resolution of this Picture + // without requesting new PictureBuffers. GpuVideoDecoder should read this + // as a signal to update the size of the corresponding PicutreBuffer using + // visible_rect() upon receiving this Picture from a VDA. + bool size_changed() const { return size_changed_; }; + + void set_size_changed(bool size_changed) { size_changed_ = size_changed; } + private: int32_t picture_buffer_id_; int32_t bitstream_buffer_id_; gfx::Rect visible_rect_; bool allow_overlay_; + bool size_changed_; }; } // namespace media
diff --git a/mojo/converters/blink/blink_input_events_type_converters.cc b/mojo/converters/blink/blink_input_events_type_converters.cc index 48a2143..c7857c9241 100644 --- a/mojo/converters/blink/blink_input_events_type_converters.cc +++ b/mojo/converters/blink/blink_input_events_type_converters.cc
@@ -74,6 +74,7 @@ scoped_ptr<blink::WebInputEvent> BuildWebMouseEventFrom( const mus::mojom::EventPtr& event) { scoped_ptr<blink::WebMouseEvent> web_event(new blink::WebMouseEvent); + // TODO(crbug.com/593375): Set pointerType from event->pointer_data->kind if (event->pointer_data && event->pointer_data->location) SetWebMouseEventLocation(*(event->pointer_data->location), web_event.get());
diff --git a/mojo/edk/embedder/embedder.h b/mojo/edk/embedder/embedder.h index 95b3b21..99191a9 100644 --- a/mojo/edk/embedder/embedder.h +++ b/mojo/edk/embedder/embedder.h
@@ -75,8 +75,8 @@ MojoHandle* platform_handle_wrapper_handle); // Retrieves the |PlatformHandle| that was wrapped into a |MojoHandle| (using -// |CreatePlatformHandleWrapper()| above). Note that the |MojoHandle| must still -// be closed separately. +// |CreatePlatformHandleWrapper()| above). Note that the |MojoHandle| is closed +// on success. MOJO_SYSTEM_IMPL_EXPORT MojoResult PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle, ScopedPlatformHandle* platform_handle);
diff --git a/mojo/mojo_base.gyp b/mojo/mojo_base.gyp index a3f6ba6..69f970a2 100644 --- a/mojo/mojo_base.gyp +++ b/mojo/mojo_base.gyp
@@ -126,6 +126,7 @@ 'mojom_files': [ 'services/catalog/public/interfaces/catalog.mojom', 'services/catalog/public/interfaces/resolver.mojom', + 'shell/public/interfaces/capabilities.mojom', 'shell/public/interfaces/connector.mojom', 'shell/public/interfaces/interface_provider.mojom', 'shell/public/interfaces/shell.mojom', @@ -142,6 +143,7 @@ 'type': 'static_library', 'sources': [ 'shell/public/cpp/application_runner.h', + 'shell/public/cpp/capabilities.h', 'shell/public/cpp/connect.h', 'shell/public/cpp/connection.h', 'shell/public/cpp/connector.h', @@ -153,6 +155,7 @@ 'shell/public/cpp/interface_factory_impl.h', 'shell/public/cpp/interface_registry.h', 'shell/public/cpp/lib/application_runner.cc', + 'shell/public/cpp/lib/capabilities.cc', 'shell/public/cpp/lib/connection_impl.cc', 'shell/public/cpp/lib/connection_impl.h', 'shell/public/cpp/lib/connector_impl.cc',
diff --git a/mojo/mojo_edk_tests.gyp b/mojo/mojo_edk_tests.gyp index 82c1d04..1055a86 100644 --- a/mojo/mojo_edk_tests.gyp +++ b/mojo/mojo_edk_tests.gyp
@@ -172,7 +172,6 @@ '../testing/gtest.gyp:gtest', 'mojo_edk.gyp:mojo_run_all_perftests', 'mojo_public.gyp:mojo_public_test_utils', - 'mojo_public.gyp:mojo_utility', ], 'sources': [ 'public/c/system/tests/core_perftest.cc',
diff --git a/mojo/public/c/system/tests/BUILD.gn b/mojo/public/c/system/tests/BUILD.gn index 5d852adb..0dd7052 100644 --- a/mojo/public/c/system/tests/BUILD.gn +++ b/mojo/public/c/system/tests/BUILD.gn
@@ -32,7 +32,6 @@ deps = [ "//mojo/public/cpp/system", "//mojo/public/cpp/test_support:test_utils", - "//mojo/public/cpp/utility", "//testing/gtest", ] }
diff --git a/mojo/public/c/system/tests/core_perftest.cc b/mojo/public/c/system/tests/core_perftest.cc index dc5566e7..80734d30 100644 --- a/mojo/public/c/system/tests/core_perftest.cc +++ b/mojo/public/c/system/tests/core_perftest.cc
@@ -10,24 +10,26 @@ #include <stdint.h> #include <stdio.h> +#include "base/threading/simple_thread.h" #include "mojo/public/cpp/system/macros.h" #include "mojo/public/cpp/test_support/test_support.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "testing/gtest/include/gtest/gtest.h" -// TODO(vtl): (here and below) crbug.com/342893 #if !defined(WIN32) #include <time.h> -#include "mojo/public/cpp/utility/thread.h" #endif // !defined(WIN32) namespace { #if !defined(WIN32) -class MessagePipeWriterThread : public mojo::Thread { +class MessagePipeWriterThread : public base::SimpleThread { public: MessagePipeWriterThread(MojoHandle handle, uint32_t num_bytes) - : handle_(handle), num_bytes_(num_bytes), num_writes_(0) {} + : SimpleThread("MessagePipeWriterThread"), + handle_(handle), + num_bytes_(num_bytes), + num_writes_(0) {} ~MessagePipeWriterThread() override {} void Run() override { @@ -62,10 +64,12 @@ DISALLOW_COPY_AND_ASSIGN(MessagePipeWriterThread); }; -class MessagePipeReaderThread : public mojo::Thread { +class MessagePipeReaderThread : public base::SimpleThread { public: explicit MessagePipeReaderThread(MojoHandle handle) - : handle_(handle), num_reads_(0) {} + : SimpleThread("MessagePipeReaderThread"), + handle_(handle), + num_reads_(0) {} ~MessagePipeReaderThread() override {} void Run() override {
diff --git a/mojo/public/cpp/bindings/lib/connector.cc b/mojo/public/cpp/bindings/lib/connector.cc index 812b4c11..c7378f0b6 100644 --- a/mojo/public/cpp/bindings/lib/connector.cc +++ b/mojo/public/cpp/bindings/lib/connector.cc
@@ -368,16 +368,18 @@ if (error_ || !message_pipe_.is_valid()) return; - if (!force_pipe_reset && force_async_handler) - force_pipe_reset = true; - - if (paused_) { - // If the user has paused receiving messages, we shouldn't call the error - // handler right away. We need to wait until the user starts receiving - // messages again. + if (during_sync_handle_watcher_callback() || paused_) { + // Enforce calling the error handler asynchronously if: + // - currently we are in a sync handle watcher callback. We don't want the + // error handler to reenter an ongoing sync call. + // - the user has paused receiving messages. We need to wait until the user + // starts receiving messages again. force_async_handler = true; } + if (!force_pipe_reset && force_async_handler) + force_pipe_reset = true; + if (force_pipe_reset) { CancelWait(); MayAutoLock locker(lock_.get());
diff --git a/mojo/public/cpp/bindings/lib/router.cc b/mojo/public/cpp/bindings/lib/router.cc index ddfc0cfa8..d929e804 100644 --- a/mojo/public/cpp/bindings/lib/router.cc +++ b/mojo/public/cpp/bindings/lib/router.cc
@@ -93,11 +93,13 @@ next_request_id_(0), testing_mode_(false), pending_task_for_messages_(false), + encountered_error_(false), weak_factory_(this) { filters_.SetSink(&thunk_); if (expects_sync_requests) connector_.RegisterSyncHandleWatch(); connector_.set_incoming_receiver(filters_.GetHead()); + connector_.set_connection_error_handler([this]() { OnConnectionError(); }); } Router::~Router() {} @@ -205,6 +207,12 @@ } pending_task_for_messages_ = false; + + // We may have already seen a connection error from the connector, but + // haven't notified the user because we want to process all the queued + // messages first. We should do it now. + if (connector_.encountered_error() && !encountered_error_) + OnConnectionError(); } bool Router::HandleMessageInternal(Message* message) { @@ -250,6 +258,21 @@ } } +void Router::OnConnectionError() { + DCHECK(!encountered_error_); + + if (!pending_messages_.empty()) { + // After all the pending messages are processed, we will check whether an + // error has been encountered and run the user's connection error handler + // if necessary. + DCHECK(pending_task_for_messages_); + return; + } + + encountered_error_ = true; + error_handler_.Run(); +} + // ---------------------------------------------------------------------------- } // namespace internal
diff --git a/mojo/public/cpp/bindings/lib/router.h b/mojo/public/cpp/bindings/lib/router.h index 2fec5d2..6374f18a 100644 --- a/mojo/public/cpp/bindings/lib/router.h +++ b/mojo/public/cpp/bindings/lib/router.h
@@ -37,14 +37,14 @@ // Sets the error handler to receive notifications when an error is // encountered while reading from the pipe or waiting to read from the pipe. void set_connection_error_handler(const Closure& error_handler) { - connector_.set_connection_error_handler(error_handler); + error_handler_ = error_handler; } // Returns true if an error was encountered while reading from the pipe or // waiting to read from the pipe. bool encountered_error() const { DCHECK(thread_checker_.CalledOnValidThread()); - return connector_.encountered_error(); + return encountered_error_; } // Is the router bound to a MessagePipe handle? @@ -143,9 +143,10 @@ bool HandleIncomingMessage(Message* message); void HandleQueuedMessages(); - bool HandleMessageInternal(Message* message); + void OnConnectionError(); + HandleIncomingMessageThunk thunk_; FilterChain filters_; Connector connector_; @@ -158,6 +159,8 @@ // Whether a task has been posted to trigger processing of // |pending_messages_|. bool pending_task_for_messages_; + bool encountered_error_; + Closure error_handler_; base::ThreadChecker thread_checker_; base::WeakPtrFactory<Router> weak_factory_; };
diff --git a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc b/mojo/public/cpp/bindings/tests/sync_method_unittest.cc index 207a6e2..f1a4767 100644 --- a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc +++ b/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
@@ -345,6 +345,120 @@ EXPECT_TRUE(async_echo_response_dispatched); } +TEST_F(SyncMethodTest, QueuedMessagesProcessedBeforeErrorNotification) { + // Test that while an interface pointer is waiting for the response to a sync + // call, async responses are queued. If the message pipe is disconnected + // before the queued messages are processed, the connection error + // notification is delayed until all the queued messages are processed. + + TestSyncPtr ptr; + TestSyncImpl impl(GetProxy(&ptr)); + + int32_t async_echo_request_value = -1; + TestSync::AsyncEchoCallback async_echo_request_callback; + base::RunLoop run_loop1; + impl.set_async_echo_handler( + [&async_echo_request_value, &async_echo_request_callback, &run_loop1]( + int32_t value, const TestSync::AsyncEchoCallback& callback) { + async_echo_request_value = value; + async_echo_request_callback = callback; + run_loop1.Quit(); + }); + + bool async_echo_response_dispatched = false; + base::RunLoop run_loop2; + ptr->AsyncEcho(123, + [&async_echo_response_dispatched, &run_loop2](int32_t result) { + async_echo_response_dispatched = true; + EXPECT_EQ(123, result); + run_loop2.Quit(); + }); + // Run until the AsyncEcho request reaches the service side. + run_loop1.Run(); + + impl.set_echo_handler( + [&impl, &async_echo_request_value, &async_echo_request_callback]( + int32_t value, const TestSync::EchoCallback& callback) { + // Send back the async response first. + EXPECT_FALSE(async_echo_request_callback.is_null()); + async_echo_request_callback.Run(async_echo_request_value); + + impl.binding()->Close(); + }); + + bool connection_error_dispatched = false; + base::RunLoop run_loop3; + ptr.set_connection_error_handler( + [&connection_error_dispatched, &run_loop3]() { + connection_error_dispatched = true; + run_loop3.Quit(); + }); + + int32_t result_value = -1; + ASSERT_FALSE(ptr->Echo(456, &result_value)); + EXPECT_EQ(-1, result_value); + ASSERT_FALSE(connection_error_dispatched); + EXPECT_FALSE(ptr.encountered_error()); + + // Although the AsyncEcho response arrives before the Echo response, it should + // be queued and not yet dispatched. + EXPECT_FALSE(async_echo_response_dispatched); + + // Run until the AsyncEcho response is dispatched. + run_loop2.Run(); + + EXPECT_TRUE(async_echo_response_dispatched); + ASSERT_FALSE(connection_error_dispatched); + EXPECT_FALSE(ptr.encountered_error()); + + // Run until the error notification is dispatched. + run_loop3.Run(); + + ASSERT_TRUE(connection_error_dispatched); + EXPECT_TRUE(ptr.encountered_error()); +} + +TEST_F(SyncMethodTest, InvalidMessageDuringSyncCall) { + // Test that while an interface pointer is waiting for the response to a sync + // call, an invalid incoming message will disconnect the message pipe, cause + // the sync call to return false, and run the connection error handler + // asynchronously. + + MessagePipe pipe; + + TestSyncPtr ptr; + ptr.Bind(TestSyncPtrInfo(std::move(pipe.handle0), 0u)); + + MessagePipeHandle raw_binding_handle = pipe.handle1.get(); + TestSyncImpl impl(MakeRequest<TestSync>(std::move(pipe.handle1))); + + impl.set_echo_handler([&raw_binding_handle]( + int32_t value, const TestSync::EchoCallback& callback) { + // Write a 1-byte message, which is considered invalid. + char invalid_message = 0; + MojoResult result = + WriteMessageRaw(raw_binding_handle, &invalid_message, 1u, nullptr, 0u, + MOJO_WRITE_MESSAGE_FLAG_NONE); + ASSERT_EQ(MOJO_RESULT_OK, result); + callback.Run(value); + }); + + bool connection_error_dispatched = false; + base::RunLoop run_loop; + ptr.set_connection_error_handler([&connection_error_dispatched, &run_loop]() { + connection_error_dispatched = true; + run_loop.Quit(); + }); + + int32_t result_value = -1; + ASSERT_FALSE(ptr->Echo(456, &result_value)); + EXPECT_EQ(-1, result_value); + ASSERT_FALSE(connection_error_dispatched); + + run_loop.Run(); + ASSERT_TRUE(connection_error_dispatched); +} + } // namespace } // namespace test } // namespace mojo
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl index de7469c..15124540 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -3,7 +3,6 @@ {%- set class_name = interface.name %} {%- set proxy_name = interface.name ~ "Proxy" %} -{%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} {%- macro alloc_params(struct, serialization_context) %} bool success = true; @@ -35,7 +34,7 @@ {%- endmacro %} {#--- Begin #} -MOJO_STATIC_CONST_MEMBER_DEFINITION const char {{class_name}}::Name_[] = "{{namespace_as_string}}::{{class_name}}"; +MOJO_STATIC_CONST_MEMBER_DEFINITION const char {{class_name}}::Name_[] = "{{namespace}}.{{class_name}}"; MOJO_STATIC_CONST_MEMBER_DEFINITION const uint32_t {{class_name}}::Version_; {#--- Constants #}
diff --git a/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl index 527e15fb..6f80b04 100644 --- a/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl +++ b/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl
@@ -59,7 +59,7 @@ new {{manager_class(interface, True)}}() { public String getName() { - return "{{namespace|replace(".","::")}}::{{interface.name}}"; + return "{{namespace}}.{{interface.name}}"; } public int getVersion() {
diff --git a/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl index 1b5cafa0..0f442b8 100644 --- a/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl +++ b/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl
@@ -161,7 +161,7 @@ } var {{interface.name}} = { - name: '{{namespace|replace(".","::")}}::{{interface.name}}', + name: '{{namespace}}.{{interface.name}}', proxyClass: {{interface.name}}Proxy, stubClass: {{interface.name}}Stub, validateRequest: validate{{interface.name}}Request,
diff --git a/mojo/services/catalog/builder.cc b/mojo/services/catalog/builder.cc index cd011120..9d7d5b7 100644 --- a/mojo/services/catalog/builder.cc +++ b/mojo/services/catalog/builder.cc
@@ -6,30 +6,106 @@ #include "base/values.h" #include "mojo/services/catalog/store.h" +#include "mojo/shell/public/cpp/capabilities.h" #include "mojo/shell/public/cpp/names.h" +// TODO(beng): this code should do better error handling instead of CHECKing so +// much. + namespace catalog { -CapabilityFilter BuildCapabilityFilter(const base::DictionaryValue& value) { - CapabilityFilter filter; +mojo::CapabilitySpec BuildCapabilitiesV0( + const base::DictionaryValue& value) { + mojo::CapabilitySpec capabilities; base::DictionaryValue::Iterator it(value); for (; !it.IsAtEnd(); it.Advance()) { const base::ListValue* values = nullptr; CHECK(it.value().GetAsList(&values)); - AllowedInterfaces interfaces; + mojo::CapabilityRequest spec; for (auto i = values->begin(); i != values->end(); ++i) { - std::string iface_name; + mojo::Interface interface_name; const base::Value* v = *i; - CHECK(v->GetAsString(&iface_name)); - interfaces.insert(iface_name); + CHECK(v->GetAsString(&interface_name)); + spec.interfaces.insert(interface_name); } - filter[it.key()] = interfaces; + capabilities.required[it.key()] = spec; } - return filter; + return capabilities; +} + +void ReadStringSet(const base::ListValue& list_value, + std::set<std::string>* string_set) { + DCHECK(string_set); + for (auto i = list_value.begin(); i != list_value.end(); ++i) { + std::string value; + const base::Value* value_value = *i; + CHECK(value_value->GetAsString(&value)); + string_set->insert(value); + } +} + +void ReadStringSetFromValue(const base::Value& value, + std::set<std::string>* string_set) { + const base::ListValue* list_value = nullptr; + CHECK(value.GetAsList(&list_value)); + ReadStringSet(*list_value, string_set); +} + +void ReadStringSetFromDictionary(const base::DictionaryValue& dictionary, + const std::string& key, + std::set<std::string>* string_set) { + const base::ListValue* list_value = nullptr; + if (dictionary.HasKey(key)) + CHECK(dictionary.GetList(key, &list_value)); + if (list_value) + ReadStringSet(*list_value, string_set); +} + +mojo::CapabilitySpec BuildCapabilitiesV1( + const base::DictionaryValue& value) { + mojo::CapabilitySpec capabilities; + + const base::DictionaryValue* provided_value = nullptr; + if (value.HasKey(Store::kCapabilities_ProvidedKey)) { + CHECK(value.GetDictionary(Store::kCapabilities_ProvidedKey, + &provided_value)); + } + if (provided_value) { + mojo::CapabilityRequest provided; + base::DictionaryValue::Iterator it(*provided_value); + for(; !it.IsAtEnd(); it.Advance()) { + mojo::Interfaces interfaces; + ReadStringSetFromValue(it.value(), &interfaces); + capabilities.provided[it.key()] = interfaces; + } + } + + const base::DictionaryValue* required_value = nullptr; + if (value.HasKey(Store::kCapabilities_RequiredKey)) { + CHECK(value.GetDictionary(Store::kCapabilities_RequiredKey, + &required_value)); + } + if (required_value) { + base::DictionaryValue::Iterator it(*required_value); + for (; !it.IsAtEnd(); it.Advance()) { + mojo::CapabilityRequest spec; + const base::DictionaryValue* entry_value = nullptr; + CHECK(it.value().GetAsDictionary(&entry_value)); + ReadStringSetFromDictionary( + *entry_value, Store::kCapabilities_ClassesKey, &spec.classes); + ReadStringSetFromDictionary( + *entry_value, Store::kCapabilities_InterfacesKey, &spec.interfaces); + capabilities.required[it.key()] = spec; + } + } + return capabilities; } Entry BuildEntry(const base::DictionaryValue& value) { Entry entry; + int manifest_version = 0; + if (value.HasKey(Store::kManifestVersionKey)) + CHECK(value.GetInteger(Store::kManifestVersionKey, &manifest_version)); std::string name_string; CHECK(value.GetString(Store::kNameKey, &name_string)); CHECK(mojo::IsValidName(name_string)) << "Invalid Name: " << name_string; @@ -42,23 +118,47 @@ CHECK(value.GetString(Store::kDisplayNameKey, &entry.display_name)); const base::DictionaryValue* capabilities = nullptr; CHECK(value.GetDictionary(Store::kCapabilitiesKey, &capabilities)); - entry.capabilities = BuildCapabilityFilter(*capabilities); - + if (manifest_version == 0) + entry.capabilities = BuildCapabilitiesV0(*capabilities); + else + entry.capabilities = BuildCapabilitiesV1(*capabilities); return entry; } -void SerializeEntry(const Entry& entry, base::DictionaryValue** value) { - *value = new base::DictionaryValue; - (*value)->SetString(Store::kNameKey, entry.name); - (*value)->SetString(Store::kDisplayNameKey, entry.display_name); - base::DictionaryValue* capabilities = new base::DictionaryValue; - for (const auto& pair : entry.capabilities) { +scoped_ptr<base::DictionaryValue> SerializeEntry(const Entry& entry) { + scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue); + value->SetInteger(Store::kManifestVersionKey, 1); + value->SetString(Store::kNameKey, entry.name); + value->SetString(Store::kDisplayNameKey, entry.display_name); + value->SetString(Store::kQualifierKey, entry.qualifier); + scoped_ptr<base::DictionaryValue> spec(new base::DictionaryValue); + + scoped_ptr<base::DictionaryValue> provided(new base::DictionaryValue); + for (const auto& i : entry.capabilities.provided) { scoped_ptr<base::ListValue> interfaces(new base::ListValue); - for (const auto& iface_name : pair.second) - interfaces->AppendString(iface_name); - capabilities->Set(pair.first, std::move(interfaces)); + for (const auto& interface_name : i.second) + interfaces->AppendString(interface_name); + provided->Set(i.first, std::move(interfaces)); } - (*value)->Set(Store::kCapabilitiesKey, make_scoped_ptr(capabilities)); + spec->Set(Store::kCapabilities_ProvidedKey, std::move(provided)); + + scoped_ptr<base::DictionaryValue> required(new base::DictionaryValue); + for (const auto& i : entry.capabilities.required) { + scoped_ptr<base::DictionaryValue> request(new base::DictionaryValue); + scoped_ptr<base::ListValue> classes(new base::ListValue); + for (const auto& class_name : i.second.classes) + classes->AppendString(class_name); + request->Set(Store::kCapabilities_ClassesKey, std::move(classes)); + scoped_ptr<base::ListValue> interfaces(new base::ListValue); + for (const auto& interface_name : i.second.interfaces) + interfaces->AppendString(interface_name); + request->Set(Store::kCapabilities_InterfacesKey, std::move(interfaces)); + required->Set(i.first, std::move(request)); + } + spec->Set(Store::kCapabilities_RequiredKey, std::move(required)); + + value->Set(Store::kCapabilitiesKey, std::move(spec)); + return value; } } // namespace catalog
diff --git a/mojo/services/catalog/builder.h b/mojo/services/catalog/builder.h index 2f3e1aa3..71eebf10 100644 --- a/mojo/services/catalog/builder.h +++ b/mojo/services/catalog/builder.h
@@ -15,7 +15,7 @@ Entry BuildEntry(const base::DictionaryValue& value); -void SerializeEntry(const Entry& entry, base::DictionaryValue** value); +scoped_ptr<base::DictionaryValue> SerializeEntry(const Entry& entry); } // namespace catalog
diff --git a/mojo/services/catalog/builder_unittest.cc b/mojo/services/catalog/builder_unittest.cc index 4290a2f..1705be8 100644 --- a/mojo/services/catalog/builder_unittest.cc +++ b/mojo/services/catalog/builder_unittest.cc
@@ -9,15 +9,27 @@ #include "base/macros.h" #include "base/path_service.h" #include "base/values.h" +#include "mojo/shell/public/cpp/capabilities.h" #include "mojo/shell/public/cpp/names.h" #include "testing/gtest/include/gtest/gtest.h" +namespace catalog { + class BuilderTest : public testing::Test { public: BuilderTest() {} ~BuilderTest() override {} protected: + scoped_ptr<base::Value> ReadEntry(const std::string& manifest, Entry* entry) { + DCHECK(entry); + scoped_ptr<base::Value> value = ReadManifest(manifest); + base::DictionaryValue* dictionary = nullptr; + CHECK(value->GetAsDictionary(&dictionary)); + *entry = BuildEntry(*dictionary); + return value; + } + scoped_ptr<base::Value> ReadManifest(const std::string& manifest) { base::FilePath manifest_path; PathService::Get(base::DIR_SOURCE_ROOT, &manifest_path); @@ -40,13 +52,9 @@ DISALLOW_COPY_AND_ASSIGN(BuilderTest); }; -namespace catalog { - TEST_F(BuilderTest, Simple) { - scoped_ptr<base::Value> value = ReadManifest("simple"); - base::DictionaryValue* dictionary = nullptr; - CHECK(value->GetAsDictionary(&dictionary)); - Entry entry = BuildEntry(*dictionary); + Entry entry; + ReadEntry("simple", &entry); EXPECT_EQ("mojo:foo", entry.name); EXPECT_EQ(mojo::GetNamePath(entry.name), entry.qualifier); @@ -54,10 +62,8 @@ } TEST_F(BuilderTest, Instance) { - scoped_ptr<base::Value> value = ReadManifest("instance"); - base::DictionaryValue* dictionary = nullptr; - CHECK(value->GetAsDictionary(&dictionary)); - Entry entry = BuildEntry(*dictionary); + Entry entry; + ReadEntry("instance", &entry); EXPECT_EQ("mojo:foo", entry.name); EXPECT_EQ("bar", entry.qualifier); @@ -65,19 +71,30 @@ } TEST_F(BuilderTest, Capabilities) { - scoped_ptr<base::Value> value = ReadManifest("capabilities"); - base::DictionaryValue* dictionary = nullptr; - CHECK(value->GetAsDictionary(&dictionary)); - Entry entry = BuildEntry(*dictionary); + Entry entry; + ReadEntry("capabilities", &entry); EXPECT_EQ("mojo:foo", entry.name); EXPECT_EQ("bar", entry.qualifier); EXPECT_EQ("Foo", entry.display_name); - CapabilityFilter filter; - AllowedInterfaces interfaces; - interfaces.insert("mojo::Bar"); - filter["mojo:bar"] = interfaces; - EXPECT_EQ(filter, entry.capabilities); + mojo::CapabilitySpec spec; + mojo::CapabilityRequest request; + request.interfaces.insert("mojo::Bar"); + spec.required["mojo:bar"] = request; + EXPECT_EQ(spec, entry.capabilities); +} + +TEST_F(BuilderTest, Serialization) { + Entry entry; + scoped_ptr<base::Value> value = ReadEntry("serialization", &entry); + + scoped_ptr<base::DictionaryValue> serialized(SerializeEntry(entry)); + + // We can't just compare values, since during deserialization some of the + // lists get converted to std::sets, which are sorted, so Value::Equals will + // fail. + Entry reconstituted = BuildEntry(*serialized.get()); + EXPECT_EQ(entry, reconstituted); } TEST_F(BuilderTest, Malformed) {
diff --git a/mojo/services/catalog/catalog.cc b/mojo/services/catalog/catalog.cc index 6d5518c..661ec215 100644 --- a/mojo/services/catalog/catalog.cc +++ b/mojo/services/catalog/catalog.cc
@@ -148,16 +148,10 @@ mojo::GetNamePath(resolved_name) + extension); } - mojo::shell::mojom::CapabilityFilterPtr filter( - mojo::shell::mojom::CapabilityFilter::New()); - filter->filter = mojo::Map<mojo::String, mojo::Array<mojo::String>>(); - for (const auto& entry : entry_iter->second.capabilities) { - mojo::Array<mojo::String> interfaces; - for (auto interface_name : entry.second) - interfaces.push_back(interface_name); - filter->filter.insert(entry.first, std::move(interfaces)); - } - callback.Run(resolved_name, qualifier, std::move(filter), + mojo::shell::mojom::CapabilitySpecPtr capabilities_ptr = + mojo::shell::mojom::CapabilitySpec::From(entry_iter->second.capabilities); + + callback.Run(resolved_name, qualifier, std::move(capabilities_ptr), file_url.spec()); } @@ -203,11 +197,8 @@ void Catalog::SerializeCatalog() { scoped_ptr<base::ListValue> catalog(new base::ListValue); - for (const auto& entry : catalog_) { - base::DictionaryValue* dictionary = nullptr; - SerializeEntry(entry.second, &dictionary); - catalog->Append(make_scoped_ptr(dictionary)); - } + for (const auto& entry : catalog_) + catalog->Append(SerializeEntry(entry.second)); if (store_) store_->UpdateStore(std::move(catalog)); }
diff --git a/mojo/services/catalog/data/serialization b/mojo/services/catalog/data/serialization new file mode 100644 index 0000000..46057028 --- /dev/null +++ b/mojo/services/catalog/data/serialization
@@ -0,0 +1,18 @@ +{ + "manifest_version": 1, + "name": "mojo:foo", + "display_name": "Foo", + "process-group": "bar", + "capabilities": { + "provided": { + "foo": ["mojo::Bar", "mojo::Baz"], + "bar": ["mojo::Bork"] + }, + "required": { + "mojo:bar": { + "classes": ["a", "b"], + "interfaces": ["mojo::Blork", "mojo::Blark"] + } + } + } +}
diff --git a/mojo/services/catalog/entry.cc b/mojo/services/catalog/entry.cc index 9ed445a..9aec915e 100644 --- a/mojo/services/catalog/entry.cc +++ b/mojo/services/catalog/entry.cc
@@ -10,4 +10,10 @@ Entry::Entry(const Entry& other) = default; Entry::~Entry() {} +bool Entry::operator==(const Entry& other) const { + return other.name == name && other.qualifier == qualifier && + other.display_name == display_name && + other.capabilities == capabilities; +} + } // catalog
diff --git a/mojo/services/catalog/entry.h b/mojo/services/catalog/entry.h index 4f2f64a..4b7ffa8 100644 --- a/mojo/services/catalog/entry.h +++ b/mojo/services/catalog/entry.h
@@ -5,17 +5,11 @@ #ifndef MOJO_SERVICES_CATALOG_ENTRY_H_ #define MOJO_SERVICES_CATALOG_ENTRY_H_ -#include <map> -#include <set> #include <string> -namespace catalog { +#include "mojo/shell/public/cpp/capabilities.h" -// A set of names of interfaces that may be exposed to an application. -using AllowedInterfaces = std::set<std::string>; -// A map of allowed applications to allowed interface sets. See shell.mojom for -// more details. -using CapabilityFilter = std::map<std::string, AllowedInterfaces>; +namespace catalog { // Static information about an application package known to the Catalog. struct Entry { @@ -23,10 +17,12 @@ Entry(const Entry& other); ~Entry(); + bool operator==(const Entry& other) const; + std::string name; std::string qualifier; std::string display_name; - CapabilityFilter capabilities; + mojo::CapabilitySpec capabilities; }; } // namespace catalog
diff --git a/mojo/services/catalog/store.cc b/mojo/services/catalog/store.cc index 3bce188..c48aa72 100644 --- a/mojo/services/catalog/store.cc +++ b/mojo/services/catalog/store.cc
@@ -7,6 +7,8 @@ namespace catalog { // static +const char Store::kManifestVersionKey[] = "manifest_version"; +// static const char Store::kNameKey[] = "name"; // static const char Store::kQualifierKey[] = "process-group"; @@ -14,5 +16,13 @@ const char Store::kDisplayNameKey[] = "display_name"; // static const char Store::kCapabilitiesKey[] = "capabilities"; +// static +const char Store::kCapabilities_ProvidedKey[] = "provided"; +// static +const char Store::kCapabilities_RequiredKey[] = "required"; +// static +const char Store::kCapabilities_ClassesKey[] = "classes"; +// static +const char Store::kCapabilities_InterfacesKey[] = "interfaces"; } // namespace catalog
diff --git a/mojo/services/catalog/store.h b/mojo/services/catalog/store.h index 74309b6..cb763d51 100644 --- a/mojo/services/catalog/store.h +++ b/mojo/services/catalog/store.h
@@ -14,15 +14,24 @@ // contents of the store, so no one else must modify its contents. class Store { public: + // Value is an integer. + static const char kManifestVersionKey[]; // Value is a string. static const char kNameKey[]; // Value is a string. static const char kQualifierKey[]; // Value is a string. static const char kDisplayNameKey[]; - // Value is a dictionary that maps from the filter to a list of string - // interfaces. + // Value is a dictionary. static const char kCapabilitiesKey[]; + // Value is a dictionary. + static const char kCapabilities_ProvidedKey[]; + // Value is a dictionary. + static const char kCapabilities_RequiredKey[]; + // Value is a list. + static const char kCapabilities_ClassesKey[]; + // Value is a list. + static const char kCapabilities_InterfacesKey[]; virtual ~Store() {}
diff --git a/mojo/shell/public/cpp/BUILD.gn b/mojo/shell/public/cpp/BUILD.gn index b1f0345..53318b1 100644 --- a/mojo/shell/public/cpp/BUILD.gn +++ b/mojo/shell/public/cpp/BUILD.gn
@@ -21,6 +21,7 @@ source_set("sources") { sources = [ "application_runner.h", + "capabilities.h", "connect.h", "connection.h", "connector.h", @@ -31,6 +32,7 @@ "interface_factory_impl.h", "interface_registry.h", "lib/application_runner.cc", + "lib/capabilities.cc", "lib/connection_impl.cc", "lib/connection_impl.h", "lib/connector_impl.cc",
diff --git a/mojo/shell/public/cpp/capabilities.h b/mojo/shell/public/cpp/capabilities.h new file mode 100644 index 0000000..39bc387f --- /dev/null +++ b/mojo/shell/public/cpp/capabilities.h
@@ -0,0 +1,65 @@ +// 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 MOJO_SHELL_PUBLIC_CPP_CAPABILITIES_H_ +#define MOJO_SHELL_PUBLIC_CPP_CAPABILITIES_H_ + +#include <map> +#include <set> +#include <string> + +#include "mojo/shell/public/interfaces/shell_resolver.mojom.h" + +namespace mojo { +using Class = std::string; +using Classes = std::set<std::string>; +using Interface = std::string; +using Interfaces = std::set<std::string>; +using Name = std::string; + +// See comments in mojo/shell/public/interfaces/capabilities.mojom for a +// description of CapabilityRequest and CapabilitySpec. + +struct CapabilityRequest { + CapabilityRequest(); + ~CapabilityRequest(); + bool operator==(const CapabilityRequest& other) const; + Classes classes; + Interfaces interfaces; +}; + +struct CapabilitySpec { + CapabilitySpec(); + ~CapabilitySpec(); + bool operator==(const CapabilitySpec& other) const; + std::map<Class, Interfaces> provided; + std::map<Name, CapabilityRequest> required; +}; + +template <> +struct TypeConverter<shell::mojom::CapabilitySpecPtr, CapabilitySpec> { + static shell::mojom::CapabilitySpecPtr Convert( + const CapabilitySpec& input); +}; +template <> +struct TypeConverter<CapabilitySpec, shell::mojom::CapabilitySpecPtr> { + static CapabilitySpec Convert( + const shell::mojom::CapabilitySpecPtr& input); +}; + +template <> +struct TypeConverter<shell::mojom::CapabilityRequestPtr, + CapabilityRequest> { + static shell::mojom::CapabilityRequestPtr Convert( + const CapabilityRequest& input); +}; +template <> +struct TypeConverter<CapabilityRequest, + shell::mojom::CapabilityRequestPtr> { + static CapabilityRequest Convert( + const shell::mojom::CapabilityRequestPtr& input); +}; +} // namespace mojo + +#endif // MOJO_SHELL_PUBLIC_CPP_CAPABILITIES_H_
diff --git a/mojo/shell/public/cpp/lib/application_test_base.cc b/mojo/shell/public/cpp/lib/application_test_base.cc index dcd7dc33..c895a24 100644 --- a/mojo/shell/public/cpp/lib/application_test_base.cc +++ b/mojo/shell/public/cpp/lib/application_test_base.cc
@@ -57,7 +57,7 @@ uint32_t source_id, shell::mojom::InterfaceProviderRequest local_interfaces, shell::mojom::InterfaceProviderPtr remote_interfaces, - Array<String> allowed_interfaces, + shell::mojom::CapabilityRequestPtr capability_spec, const String& name) override { CHECK(false); }
diff --git a/mojo/shell/public/cpp/lib/capabilities.cc b/mojo/shell/public/cpp/lib/capabilities.cc new file mode 100644 index 0000000..cc3fc18 --- /dev/null +++ b/mojo/shell/public/cpp/lib/capabilities.cc
@@ -0,0 +1,70 @@ +// 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 "mojo/shell/public/cpp/capabilities.h" + +namespace mojo { + +CapabilityRequest::CapabilityRequest() {} +CapabilityRequest::~CapabilityRequest() {} + +bool CapabilityRequest::operator==(const CapabilityRequest& other) const { + return other.classes == classes && other.interfaces == interfaces; +} + +CapabilitySpec::CapabilitySpec() {} +CapabilitySpec::~CapabilitySpec() {} + +bool CapabilitySpec::operator==(const CapabilitySpec& other) const { + return other.provided == provided && other.required == required; +} + +// static +shell::mojom::CapabilitySpecPtr +TypeConverter<shell::mojom::CapabilitySpecPtr, CapabilitySpec>::Convert( + const CapabilitySpec& input) { + shell::mojom::CapabilitySpecPtr spec(shell::mojom::CapabilitySpec::New()); + spec->provided = + mojo::Map<mojo::String, mojo::Array<mojo::String>>::From(input.provided); + spec->required = + mojo::Map<mojo::String, shell::mojom::CapabilityRequestPtr>::From( + input.required); + return spec; +} + +// static +CapabilitySpec +TypeConverter<CapabilitySpec, shell::mojom::CapabilitySpecPtr>::Convert( + const shell::mojom::CapabilitySpecPtr& input) { + CapabilitySpec spec; + spec.provided = input->provided.To<std::map<Class, Interfaces>>(); + spec.required = + input->required.To<std::map<Name, CapabilityRequest>>(); + return spec; +} + +// static +shell::mojom::CapabilityRequestPtr +TypeConverter<shell::mojom::CapabilityRequestPtr, + CapabilityRequest>::Convert( + const CapabilityRequest& input) { + shell::mojom::CapabilityRequestPtr request( + shell::mojom::CapabilityRequest::New()); + request->classes = mojo::Array<mojo::String>::From(input.classes); + request->interfaces = mojo::Array<mojo::String>::From(input.interfaces); + return request; +} + +// static +CapabilityRequest +TypeConverter<CapabilityRequest, + shell::mojom::CapabilityRequestPtr>::Convert( + const shell::mojom::CapabilityRequestPtr& input) { + CapabilityRequest request; + request.classes = input->classes.To<std::set<std::string>>(); + request.interfaces = input->interfaces.To<std::set<std::string>>(); + return request; +} + +} // namespace mojo
diff --git a/mojo/shell/public/cpp/lib/shell_connection.cc b/mojo/shell/public/cpp/lib/shell_connection.cc index 8ee729d0..2e2a7ec 100644 --- a/mojo/shell/public/cpp/lib/shell_connection.cc +++ b/mojo/shell/public/cpp/lib/shell_connection.cc
@@ -6,6 +6,7 @@ #include "base/logging.h" #include "base/message_loop/message_loop.h" #include "mojo/public/cpp/bindings/interface_ptr.h" +#include "mojo/shell/public/cpp/capabilities.h" #include "mojo/shell/public/cpp/connector.h" #include "mojo/shell/public/cpp/lib/connection_impl.h" #include "mojo/shell/public/cpp/lib/connector_impl.h" @@ -49,12 +50,12 @@ uint32_t source_id, shell::mojom::InterfaceProviderRequest local_interfaces, shell::mojom::InterfaceProviderPtr remote_interfaces, - Array<String> allowed_interfaces, + shell::mojom::CapabilityRequestPtr allowed_capabilities, const String& name) { scoped_ptr<Connection> registry(new internal::ConnectionImpl( name, source.To<Identity>(), source_id, std::move(remote_interfaces), std::move(local_interfaces), - allowed_interfaces.To<std::set<std::string>>(), + allowed_capabilities->interfaces.To<std::set<std::string>>(), Connection::State::CONNECTED)); if (!client_->AcceptConnection(registry.get())) return;
diff --git a/mojo/shell/public/cpp/shell_connection.h b/mojo/shell/public/cpp/shell_connection.h index 7ec245b..e0b1eb10 100644 --- a/mojo/shell/public/cpp/shell_connection.h +++ b/mojo/shell/public/cpp/shell_connection.h
@@ -66,7 +66,7 @@ uint32_t source_id, shell::mojom::InterfaceProviderRequest remote_interfaces, shell::mojom::InterfaceProviderPtr local_interfaces, - Array<String> allowed_interfaces, + shell::mojom::CapabilityRequestPtr allowed_capabilities, const String& name) override; void OnConnectionError();
diff --git a/mojo/shell/public/cpp/test/BUILD.gn b/mojo/shell/public/cpp/test/BUILD.gn new file mode 100644 index 0000000..d074dbc --- /dev/null +++ b/mojo/shell/public/cpp/test/BUILD.gn
@@ -0,0 +1,28 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//testing/test.gni") + +group("test") { + testonly = true + deps = [ + ":run_all_shelltests", + ] +} + +source_set("run_all_shelltests") { + testonly = true + + sources = [ + "run_all_shelltests.cc", + ] + + deps = [ + "//base", + "//base/test:test_support", + "//mojo/edk/system", + "//mojo/shell/background:lib", + "//mojo/shell/background:main", + ] +}
diff --git a/mojo/shell/tests/mojo_shell_unittests.cc b/mojo/shell/public/cpp/test/run_all_shelltests.cc similarity index 95% rename from mojo/shell/tests/mojo_shell_unittests.cc rename to mojo/shell/public/cpp/test/run_all_shelltests.cc index 946d9c9..ee19ea2 100644 --- a/mojo/shell/tests/mojo_shell_unittests.cc +++ b/mojo/shell/public/cpp/test/run_all_shelltests.cc
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <signal.h> - #include "base/test/launcher/unit_test_launcher.h" #include "base/test/test_suite.h" #include "mojo/edk/embedder/embedder.h"
diff --git a/mojo/shell/public/interfaces/BUILD.gn b/mojo/shell/public/interfaces/BUILD.gn index 683e5025..0eeac14 100644 --- a/mojo/shell/public/interfaces/BUILD.gn +++ b/mojo/shell/public/interfaces/BUILD.gn
@@ -7,6 +7,7 @@ # GYP version: mojo/mojo_base.gyp:mojo_application_bindings mojom("interfaces") { sources = [ + "capabilities.mojom", "connector.mojom", "interface_provider.mojom", "shell.mojom",
diff --git a/mojo/shell/public/interfaces/capabilities.mojom b/mojo/shell/public/interfaces/capabilities.mojom new file mode 100644 index 0000000..563b88c1 --- /dev/null +++ b/mojo/shell/public/interfaces/capabilities.mojom
@@ -0,0 +1,47 @@ +// 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. + +module mojo.shell.mojom; + +// Mojo Capabilities ----------------------------------------------------------- +// +// Mojo applications expose interfaces and capability classes to one another. +// +// An interface is just a Mojo interface, defined in a mojom file like this one. +// In a CapabilitySpec, an interface is represented by its fully qualified name, +// which is serialized based on the interface name and module: +// module::path::InterfaceName. +// +// A class is an alias to something, either a set of interface names granted +// with that class, or some behavior specific to the application that provides +// it. + +// Describes the set of classes and interfaces required by an application. +// Note that there may be overlap between the interfaces implied by the +// resolution of classes and those specified in |interfaces|. The set of +// interfaces granted to the requestor is the union of these sets. +struct CapabilityRequest { + // An array of class names required. + array<string> classes; + // An array of interface names required. + array<string> interfaces; +}; + +// Describes the capabilities offered and requested by an application. +// This struct is populated from the application manifest. +struct CapabilitySpec { + // The classes offered by this application, and for each class an array of + // interfaces. If no interfaces are granted with a class, the array will be + // empty. + // A map of class name -> array of interfaces. The array can be empty, + // non-empty, or ["*"], which means allow access to all interfaces. + map<string, array<string>> provided; + + // The applications this application needs to speak to, and the classes and + // interfaces it requests. + // A map of application name -> spec. "*" is also supported as the key, which + // supplies a CapabilityRequest for all applications in addition to specific + // ones specified. + map<string, CapabilityRequest> required; +};
diff --git a/mojo/shell/public/interfaces/shell.mojom b/mojo/shell/public/interfaces/shell.mojom index 5e0469f3..04dcd1d 100644 --- a/mojo/shell/public/interfaces/shell.mojom +++ b/mojo/shell/public/interfaces/shell.mojom
@@ -5,7 +5,6 @@ module mojo.shell.mojom; import "mojo/shell/public/interfaces/connector.mojom"; -import "mojo/shell/public/interfaces/shell_client_factory.mojom"; struct InstanceInfo { uint32 id;
diff --git a/mojo/shell/public/interfaces/shell_client.mojom b/mojo/shell/public/interfaces/shell_client.mojom index d6a223e..260bb2c0 100644 --- a/mojo/shell/public/interfaces/shell_client.mojom +++ b/mojo/shell/public/interfaces/shell_client.mojom
@@ -4,6 +4,7 @@ module mojo.shell.mojom; +import "mojo/shell/public/interfaces/capabilities.mojom"; import "mojo/shell/public/interfaces/connector.mojom"; import "mojo/shell/public/interfaces/interface_provider.mojom"; @@ -69,6 +70,6 @@ uint32 source_id, InterfaceProvider&? local_interfaces, InterfaceProvider? remote_interfaces, - array<string> allowed_interfaces, + CapabilityRequest allowed_capabilities, string resolved_name); };
diff --git a/mojo/shell/public/interfaces/shell_resolver.mojom b/mojo/shell/public/interfaces/shell_resolver.mojom index b5e6d29..090bf83 100644 --- a/mojo/shell/public/interfaces/shell_resolver.mojom +++ b/mojo/shell/public/interfaces/shell_resolver.mojom
@@ -4,19 +4,7 @@ module mojo.shell.mojom; -// Specifies a whitelist of applications and services an application can connect -// to. Connections to applications not explicitly specified here as a key are -// rejected. Connections to services not specified in an application's allowed -// interfaces value are not made. -// A "*" value as the only key in an otherwise empty map means the application -// may connect to any other application. -// A "*" value as the only string in an otherwise empty array of interface names -// means the application may connect to any service in that application. -// An empty interface name array means the application may not connect to any -// services exposed by the application it is connecting to. -struct CapabilityFilter { - map<string, array<string>> filter; -}; +import "mojo/shell/public/interfaces/capabilities.mojom"; // Implemented exclusively for the Mojo Shell's use in resolving mojo: names // and reading static manifest information. @@ -46,6 +34,6 @@ ResolveMojoName(string mojo_name) => (string resolved_mojo_name, string qualifier, - CapabilityFilter? filter, + CapabilitySpec? capability_spec, string? mojo_file_url); };
diff --git a/mojo/shell/runner/host/BUILD.gn b/mojo/shell/runner/host/BUILD.gn index f7b45383..67066af7 100644 --- a/mojo/shell/runner/host/BUILD.gn +++ b/mojo/shell/runner/host/BUILD.gn
@@ -69,19 +69,23 @@ deps = [ ":child_process_base", ":native_application_support", - "//base", "//base:base_static", "//base:i18n", - "//mojo/edk/system", "//mojo/message_pump", "//mojo/platform_handle:platform_handle_impl", - "//mojo/shell", "//mojo/shell/public/cpp:sources", - "//mojo/shell/public/interfaces", "//mojo/shell/runner:init", "//mojo/shell/runner/common", ] + public_deps = [ + "//base", + "//mojo/edk/system", + "//mojo/public/cpp/system", + "//mojo/shell", + "//mojo/shell/public/interfaces", + ] + if (is_linux && !is_android) { sources += [ "linux_sandbox.cc",
diff --git a/mojo/shell/shell.cc b/mojo/shell/shell.cc index 8dac715..1daa93a4 100644 --- a/mojo/shell/shell.cc +++ b/mojo/shell/shell.cc
@@ -38,7 +38,7 @@ void EmptyResolverCallback(const String& resolved_name, const String& resolved_instance, - mojom::CapabilityFilterPtr base_filter, + mojom::CapabilitySpecPtr capabilities, const String& file_url) {} } @@ -47,28 +47,28 @@ return Identity("mojo:shell", mojom::kRootUserID); } -CapabilityFilter GetPermissiveCapabilityFilter() { - CapabilityFilter filter; - AllowedInterfaces interfaces; - interfaces.insert("*"); - filter["*"] = interfaces; - return filter; +CapabilitySpec GetPermissiveCapabilities() { + CapabilitySpec capabilities; + CapabilityRequest spec; + spec.interfaces.insert("*"); + capabilities.required["*"] = spec; + return capabilities; } -AllowedInterfaces GetAllowedInterfaces(const CapabilityFilter& filter, - const Identity& identity) { - // Start by looking for interfaces specific to the supplied identity. - auto it = filter.find(identity.name()); - if (it != filter.end()) +CapabilityRequest GetCapabilityRequest(const CapabilitySpec& spec, + const Identity& identity) { + // Start by looking for specs specific to the supplied identity. + auto it = spec.required.find(identity.name()); + if (it != spec.required.end()) return it->second; // Fall back to looking for a wildcard rule. - it = filter.find("*"); - if (filter.size() == 1 && it != filter.end()) + it = spec.required.find("*"); + if (spec.required.size() == 1 && it != spec.required.end()) return it->second; // Finally, nothing is allowed. - return AllowedInterfaces(); + return CapabilityRequest(); } // Encapsulates a connection to an instance of an application, tracked by the @@ -82,12 +82,13 @@ Instance(mojom::ShellClientPtr shell_client, mojo::shell::Shell* shell, const Identity& identity, - const CapabilityFilter& filter) + const CapabilitySpec& capabilities) : shell_(shell), id_(GenerateUniqueID()), identity_(identity), - filter_(filter), - allow_any_application_(filter.size() == 1 && filter.count("*") == 1), + capabilities_(capabilities), + allow_any_application_(capabilities.required.size() == 1 && + capabilities.required.count("*") == 1), shell_client_(std::move(shell_client)), pid_receiver_binding_(this), weak_factory_(this) { @@ -112,17 +113,17 @@ params->connect_callback().Run(mojom::ConnectResult::SUCCEEDED, identity_.user_id(), id_); uint32_t source_id = mojom::kInvalidInstanceID; - AllowedInterfaces interfaces; - interfaces.insert("*"); + CapabilityRequest spec; + spec.interfaces.insert("*"); Instance* source = shell_->GetExistingInstance(params->source()); if (source) { - interfaces = GetAllowedInterfaces(source->filter_, identity_); + spec = GetCapabilityRequest(source->capabilities_, identity_); source_id = source->id(); } shell_client_->AcceptConnection( mojom::Identity::From(params->source()), source_id, params->TakeRemoteInterfaces(), params->TakeLocalInterfaces(), - Array<String>::From(interfaces), params->target().name()); + mojom::CapabilityRequest::From(spec), params->target().name()); } void StartWithClientProcessConnection( @@ -185,7 +186,7 @@ // - a user id other than its own, kInheritUserID or kRootUserID. // - a non-empty instance name. // - a non-null client_process_connection. - if (!ValidateCapabilityFilter(target, callback)) + if (!ValidateCapabilities(target, callback)) return; scoped_ptr<ConnectParams> params(new ConnectParams); @@ -263,13 +264,14 @@ return true; } - bool ValidateCapabilityFilter(const Identity& target, - const ConnectCallback& callback) { + bool ValidateCapabilities(const Identity& target, + const ConnectCallback& callback) { if (allow_any_application_ || - filter_.find(target.name()) != filter_.end()) { + capabilities_.required.find(target.name()) != + capabilities_.required.end()) { return true; } - LOG(ERROR) << "CapabilityFilter prevented connection from: " << + LOG(ERROR) << "Capabilities prevented connection from: " << identity_.name() << " to: " << target.name(); callback.Run(mojom::ConnectResult::ACCESS_DENIED, mojom::kInheritUserID, mojom::kInvalidInstanceID); @@ -294,7 +296,7 @@ // process is launched. const uint32_t id_; const Identity identity_; - const CapabilityFilter filter_; + const CapabilitySpec capabilities_; const bool allow_any_application_; mojom::ShellClientPtr shell_client_; Binding<mojom::PIDReceiver> pid_receiver_binding_; @@ -330,8 +332,7 @@ native_runner_factory_(std::move(native_runner_factory)), weak_ptr_factory_(this) { mojom::ShellClientRequest request; - CreateInstance(CreateShellIdentity(), GetPermissiveCapabilityFilter(), - &request); + CreateInstance(CreateShellIdentity(), GetPermissiveCapabilities(), &request); shell_connection_.reset(new ShellConnection(this, std::move(request))); InitCatalog(std::move(catalog_store)); @@ -385,8 +386,8 @@ DCHECK(!GetExistingInstance(target)); mojom::ShellClientRequest request; - embedder_instance_ = CreateInstance( - target, GetPermissiveCapabilityFilter(), &request); + embedder_instance_ = + CreateInstance(target, GetPermissiveCapabilities(), &request); DCHECK(embedder_instance_); return request; @@ -433,7 +434,7 @@ // TODO(beng): Does the catalog actually have to be run with a permissive // filter? Identity identity(name, mojom::kRootUserID); - CreateInstance(identity, GetPermissiveCapabilityFilter(), &request); + CreateInstance(identity, GetPermissiveCapabilities(), &request); loader_raw->Load(name, std::move(request)); ConnectToInterface(this, CreateShellIdentity(), name, &shell_resolver_); @@ -495,13 +496,13 @@ } Shell::Instance* Shell::CreateInstance(const Identity& target_id, - const CapabilityFilter& filter, + const CapabilitySpec& capabilities, mojom::ShellClientRequest* request) { CHECK(target_id.user_id() != mojom::kInheritUserID); mojom::ShellClientPtr shell_client; *request = GetProxy(&shell_client); Instance* instance = - new Instance(std::move(shell_client), this, target_id, filter); + new Instance(std::move(shell_client), this, target_id, capabilities); DCHECK(identity_to_instance_.find(target_id) == identity_to_instance_.end()); identity_to_instance_[target_id] = instance; @@ -563,7 +564,7 @@ void Shell::OnGotResolvedName(scoped_ptr<ConnectParams> params, const String& resolved_name, const String& resolved_instance, - mojom::CapabilityFilterPtr base_filter, + mojom::CapabilitySpecPtr capabilities_ptr, const String& file_url) { std::string instance_name = params->target().instance(); if (instance_name == GetNamePath(params->target().name()) && @@ -581,22 +582,22 @@ return; Identity source = params->source(); - // |base_filter| can be null when there is no manifest, e.g. for URL types - // not resolvable by the resolver. - CapabilityFilter filter = GetPermissiveCapabilityFilter(); - if (!base_filter.is_null()) - filter = base_filter->filter.To<CapabilityFilter>(); + // |capabilities_ptr| can be null when there is no manifest, e.g. for URL + // types not resolvable by the resolver. + CapabilitySpec capabilities = GetPermissiveCapabilities(); + if (!capabilities_ptr.is_null()) + capabilities = capabilities_ptr.To<CapabilitySpec>(); mojom::ClientProcessConnectionPtr client_process_connection = params->TakeClientProcessConnection(); mojom::ShellClientRequest request; - Instance* instance = CreateInstance(target, filter, &request); + Instance* instance = CreateInstance(target, capabilities, &request); instance->ConnectToClient(std::move(params)); if (LoadWithLoader(target, &request)) return; - CHECK(!file_url.is_null() && !base_filter.is_null()); + CHECK(!file_url.is_null() && !capabilities_ptr.is_null()); if (target.name() != resolved_name) { // In cases where a package alias is resolved, we have to use the instance
diff --git a/mojo/shell/shell.h b/mojo/shell/shell.h index 7169ec10..2d66593e 100644 --- a/mojo/shell/shell.h +++ b/mojo/shell/shell.h
@@ -17,6 +17,7 @@ #include "mojo/shell/connect_params.h" #include "mojo/shell/loader.h" #include "mojo/shell/native_runner.h" +#include "mojo/shell/public/cpp/capabilities.h" #include "mojo/shell/public/cpp/identity.h" #include "mojo/shell/public/cpp/interface_factory.h" #include "mojo/shell/public/cpp/shell_client.h" @@ -36,25 +37,10 @@ class ShellConnection; namespace shell { -// A set of names of interfaces that may be exposed to an application. -using AllowedInterfaces = std::set<std::string>; -// A map of allowed applications to allowed interface sets. See shell.mojom for -// more details. -using CapabilityFilter = std::map<std::string, AllowedInterfaces>; - // Creates an identity for the Shell, used when the Shell connects to // applications. Identity CreateShellIdentity(); -// Returns a capability filter that allows an application to connect to any -// other application and any service exposed by other applications. -CapabilityFilter GetPermissiveCapabilityFilter(); - -// Returns the set of interfaces that an application instance with |filter| is -// allowed to see from an instance with |identity|. -AllowedInterfaces GetAllowedInterfaces(const CapabilityFilter& filter, - const Identity& identity); - class Shell : public ShellClient { public: // API for testing. @@ -141,17 +127,9 @@ bool ConnectToExistingInstance(scoped_ptr<ConnectParams>* params); Instance* CreateInstance(const Identity& target_id, - const CapabilityFilter& filter, + const CapabilitySpec& capabilities, mojom::ShellClientRequest* request); - // Called from the instance implementing mojom::Shell. |user_id| must be - // resolved by the instance (i.e. must not be mojom::kInheritUserID). - void CreateInstanceForFactory( - mojom::ShellClientFactoryPtr factory, - const std::string& name, - const std::string& user_id, - mojom::CapabilityFilterPtr filter, - mojom::PIDReceiverRequest pid_receiver); // Called from the instance implementing mojom::Shell. void AddInstanceListener(mojom::InstanceListenerPtr listener); @@ -171,12 +149,12 @@ // |resolved_name| is the mojo: name identifying the physical package // application. // |file_url| is the resolved file:// URL of the physical package. - // |base_filter| is the CapabilityFilter the requested application should be + // |base_filter| is the CapabilitySpecPtr the requested application should be // run with, from its manifest. void OnGotResolvedName(scoped_ptr<ConnectParams> params, const String& resolved_name, const String& resolved_instance, - mojom::CapabilityFilterPtr base_filter, + mojom::CapabilitySpecPtr capabilities, const String& file_url); // Tries to load |target| with an Loader. Returns true if one was registered
diff --git a/mojo/shell/tests/BUILD.gn b/mojo/shell/tests/BUILD.gn index 37283ac9..91c2970 100644 --- a/mojo/shell/tests/BUILD.gn +++ b/mojo/shell/tests/BUILD.gn
@@ -17,7 +17,6 @@ test("mojo_shell_unittests") { sources = [ "loader_unittest.cc", - "mojo_shell_unittests.cc", ] deps = [ @@ -25,6 +24,7 @@ "//base", "//base/test:test_support", "//mojo/edk/system", + "//mojo/public/cpp/bindings", "//mojo/public/cpp/system", "//mojo/services/catalog:unittests", "//mojo/shell", @@ -32,6 +32,8 @@ "//mojo/shell/background:main", "//mojo/shell/background/tests:unittests", "//mojo/shell/public/cpp", + "//mojo/shell/public/cpp/test:run_all_shelltests", + "//mojo/shell/public/interfaces", "//mojo/shell/tests/connect", "//mojo/shell/tests/lifecycle", "//mojo/shell/tests/shell",
diff --git a/mojo/shell/tests/connect/connect_test_app_manifest.json b/mojo/shell/tests/connect/connect_test_app_manifest.json index 39099fb4..ae25a530 100644 --- a/mojo/shell/tests/connect/connect_test_app_manifest.json +++ b/mojo/shell/tests/connect/connect_test_app_manifest.json
@@ -1,7 +1,10 @@ { + "manifest_version": 1, "name": "mojo:connect_test_app", "display_name": "Connect Test App", "capabilities": { - "mojo:connect_test_a": ["*"] + "required": { + "mojo:connect_test_a": { "interfaces": ["*"] } + } } }
diff --git a/mojo/shell/tests/connect/connect_unittests_manifest.json b/mojo/shell/tests/connect/connect_unittests_manifest.json index cb8e865..a36e640 100644 --- a/mojo/shell/tests/connect/connect_unittests_manifest.json +++ b/mojo/shell/tests/connect/connect_unittests_manifest.json
@@ -3,9 +3,9 @@ "display_name": "Connect Unittests", "capabilities": { "mojo:connect_test_package": ["*"], - "mojo:connect_test_app": ["mojo::shell::test::mojom::ConnectTestService", - "mojo::shell::test::mojom::StandaloneApp"], - "mojo:connect_test_a": ["mojo::shell::test::mojom::ConnectTestService", - "mojo::shell::test::mojom::StandaloneApp"] + "mojo:connect_test_app": ["mojo.shell.test.mojom.ConnectTestService", + "mojo.shell.test.mojom.StandaloneApp"], + "mojo:connect_test_a": ["mojo.shell.test.mojom.ConnectTestService", + "mojo.shell.test.mojom.StandaloneApp"] } }
diff --git a/mojo/shell/tests/shell/target_manifest.json b/mojo/shell/tests/shell/target_manifest.json index 68ddc21..f751592 100644 --- a/mojo/shell/tests/shell/target_manifest.json +++ b/mojo/shell/tests/shell/target_manifest.json
@@ -1,5 +1,5 @@ { "name": "exe:shell_unittest_target", "display_name": "Shell Unittest: Target", - "capabilities": { "mojo:shell_unittest": [ "mojo::shell::test::mojom::CreateInstanceTest" ] } + "capabilities": { "mojo:shell_unittest": [ "mojo.shell.test.mojom.CreateInstanceTest" ] } }
diff --git a/mojo/tools/data/apptests b/mojo/tools/data/apptests index 68cef9e6..a8f0a35 100644 --- a/mojo/tools/data/apptests +++ b/mojo/tools/data/apptests
@@ -21,13 +21,6 @@ # # TODO(vtl|msw): Add a way of specifying data dependencies. -mus_apptests = { 'test': 'mojo:mus_apptests' } -# osmesa is not used on android, so no flags are needed for -# mus_apptests. -if config.target_os != config.OS_ANDROID: - mus_apptests['args'] = [ '--use-x11-test-config', - '--override-use-gl-with-osmesa-for-tests' ] - # WARNING: If you add a test make sure the gn target mojo_apptests depends upon # it. tests = [ @@ -71,16 +64,6 @@ # 'test': 'mojo:media_pipeline_integration_apptests', # 'type': 'gtest_isolated', # }, - # TODO(crbug.com/560626): Fix and enable mus_apptests on Android. - mus_apptests, - # TODO(sky): enable when works (http://crbug.com/577274 and likely - # http://crbug.com/569367). -# { -# 'test': 'mojo:views_apptests', -# 'type': 'gtest_isolated', -# 'args': ['--use-x11-test-config', -# '--override-use-gl-with-osmesa-for-tests', '--enable-logging'] -# }, { 'test': 'mojo:leveldb_apptests', 'type': 'gtest_isolated',
diff --git a/net/cert/ct_log_response_parser.cc b/net/cert/ct_log_response_parser.cc index 628eef2..5baf1b3 100644 --- a/net/cert/ct_log_response_parser.cc +++ b/net/cert/ct_log_response_parser.cc
@@ -145,9 +145,7 @@ signed_tree_head->version = SignedTreeHead::V1; signed_tree_head->tree_size = parsed_sth.tree_size; - signed_tree_head->timestamp = - base::Time::UnixEpoch() + base::TimeDelta::FromMilliseconds( - static_cast<int64_t>(parsed_sth.timestamp)); + signed_tree_head->timestamp = base::Time::FromJsTime(parsed_sth.timestamp); signed_tree_head->signature = parsed_sth.signature; memcpy(signed_tree_head->sha256_root_hash, parsed_sth.sha256_root_hash.c_str(),
diff --git a/net/cert/ct_log_response_parser_unittest.cc b/net/cert/ct_log_response_parser_unittest.cc index fad7590..e505b05 100644 --- a/net/cert/ct_log_response_parser_unittest.cc +++ b/net/cert/ct_log_response_parser_unittest.cc
@@ -95,6 +95,23 @@ ASSERT_FALSE(FillSignedTreeHead(*too_short_hash_json.get(), &tree_head)); } +TEST(CTLogResponseParserTest, ParsesJsonSTHWithLargeTimestamp) { + SignedTreeHead tree_head; + + scoped_ptr<base::Value> large_timestamp_json = + ParseJson(CreateSignedTreeHeadJsonString( + 100, INT64_C(1) << 34, GetSampleSTHSHA256RootHash(), + GetSampleSTHTreeHeadSignature())); + + ASSERT_TRUE(FillSignedTreeHead(*large_timestamp_json.get(), &tree_head)); + + base::Time expected_time = + base::Time::UnixEpoch() + + base::TimeDelta::FromMilliseconds(INT64_C(1) << 34); + + EXPECT_EQ(tree_head.timestamp, expected_time); +} + TEST(CTLogResponseParserTest, ParsesConsistencyProofSuccessfully) { std::string first(32, 'a'); std::string second(32, 'b');
diff --git a/net/cert/signed_tree_head.cc b/net/cert/signed_tree_head.cc index ef1ab70..b430b37 100644 --- a/net/cert/signed_tree_head.cc +++ b/net/cert/signed_tree_head.cc
@@ -6,6 +6,8 @@ #include <string.h> +#include <ostream> + #include "base/strings/string_number_conversions.h" namespace net { @@ -29,17 +31,16 @@ SignedTreeHead::~SignedTreeHead() {} -std::ostream& operator<<(std::ostream& stream, const SignedTreeHead& sth) { - return stream << "{\n" - << "\t\"version\": " << sth.version << ",\n" - << "\t\"timestamp\": " << sth.timestamp << ",\n" - << "\t\"tree_size\": " << sth.tree_size << ",\n" - << "\t\"sha256_root_hash\": \"" - << base::HexEncode(sth.sha256_root_hash, kSthRootHashLength) - << "\",\n\t\"log_id\": \"" - << base::HexEncode(sth.log_id.data(), sth.log_id.size()) - << "\"\n" - << "}"; +void PrintTo(const SignedTreeHead& sth, std::ostream* os) { + (*os) << "{\n" + << "\t\"version\": " << sth.version << ",\n" + << "\t\"timestamp\": " << sth.timestamp << ",\n" + << "\t\"tree_size\": " << sth.tree_size << ",\n" + << "\t\"sha256_root_hash\": \"" + << base::HexEncode(sth.sha256_root_hash, kSthRootHashLength) + << "\",\n\t\"log_id\": \"" + << base::HexEncode(sth.log_id.data(), sth.log_id.size()) << "\"\n" + << "}"; } } // namespace ct
diff --git a/net/cert/signed_tree_head.h b/net/cert/signed_tree_head.h index 6ff93b0..73b6fdc 100644 --- a/net/cert/signed_tree_head.h +++ b/net/cert/signed_tree_head.h
@@ -49,8 +49,7 @@ std::string log_id; }; -NET_EXPORT std::ostream& operator<<(std::ostream& stream, - const SignedTreeHead& sth); +NET_EXPORT void PrintTo(const SignedTreeHead& sth, std::ostream* os); } // namespace ct
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc index c2b1871..c73e74a 100644 --- a/net/cookies/cookie_monster.cc +++ b/net/cookies/cookie_monster.cc
@@ -251,8 +251,7 @@ } // Predicate to support PartitionCookieByPriority(). -struct CookiePriorityEqualsTo - : std::unary_function<const CookieMonster::CookieMap::iterator, bool> { +struct CookiePriorityEqualsTo { explicit CookiePriorityEqualsTo(CookiePriority priority) : priority_(priority) {} @@ -1013,6 +1012,10 @@ base::Bind(&RunAsync, base::ThreadTaskRunnerHandle::Get(), callback)); } +bool CookieMonster::IsEphemeral() { + return store_.get() == nullptr; +} + CookieMonster::~CookieMonster() { DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h index 14c5a08..8ad7395 100644 --- a/net/cookies/cookie_monster.h +++ b/net/cookies/cookie_monster.h
@@ -215,6 +215,8 @@ const std::string& name, const CookieChangedCallback& callback) override; + bool IsEphemeral() override; + private: // For queueing the cookie monster calls. class CookieMonsterTask;
diff --git a/net/cookies/cookie_store.h b/net/cookies/cookie_store.h index 6485261..c44139b0 100644 --- a/net/cookies/cookie_store.h +++ b/net/cookies/cookie_store.h
@@ -202,6 +202,11 @@ const std::string& name, const CookieChangedCallback& callback) = 0; + // Returns true if this cookie store is ephemeral, and false if it is backed + // by some sort of persistence layer. + // TODO(nharper): Remove this method once crbug.com/548423 has been closed. + virtual bool IsEphemeral() = 0; + protected: CookieStore(); };
diff --git a/net/cookies/cookie_store_test_helpers.cc b/net/cookies/cookie_store_test_helpers.cc index 50ae05d..fdb8e92 100644 --- a/net/cookies/cookie_store_test_helpers.cc +++ b/net/cookies/cookie_store_test_helpers.cc
@@ -214,6 +214,10 @@ return scoped_ptr<CookieStore::CookieChangedSubscription>(); } +bool DelayedCookieMonster::IsEphemeral() { + return true; +} + // // CookieURLHelper //
diff --git a/net/cookies/cookie_store_test_helpers.h b/net/cookies/cookie_store_test_helpers.h index e2f566b..068296c7 100644 --- a/net/cookies/cookie_store_test_helpers.h +++ b/net/cookies/cookie_store_test_helpers.h
@@ -93,6 +93,8 @@ AddCallbackForCookie(const GURL& url, const std::string& name, const CookieChangedCallback& callback) override; + bool IsEphemeral() override; + private: // Be called immediately from CookieMonster.
diff --git a/net/ssl/channel_id_service.cc b/net/ssl/channel_id_service.cc index e17b813..7cae014 100644 --- a/net/ssl/channel_id_service.cc +++ b/net/ssl/channel_id_service.cc
@@ -8,6 +8,7 @@ #include <limits> #include <utility> +#include "base/atomic_sequence_num.h" #include "base/bind.h" #include "base/bind_helpers.h" #include "base/callback_helpers.h" @@ -38,6 +39,8 @@ namespace { +base::StaticAtomicSequenceNumber g_next_id; + // Used by the GetDomainBoundCertResult histogram to record the final // outcome of each GetChannelID or GetOrCreateChannelID call. // Do not re-use values. @@ -288,12 +291,12 @@ const scoped_refptr<base::TaskRunner>& task_runner) : channel_id_store_(channel_id_store), task_runner_(task_runner), + id_(g_next_id.GetNext()), requests_(0), key_store_hits_(0), inflight_joins_(0), workers_created_(0), - weak_ptr_factory_(this) { -} + weak_ptr_factory_(this) {} ChannelIDService::~ChannelIDService() { STLDeleteValues(&inflight_);
diff --git a/net/ssl/channel_id_service.h b/net/ssl/channel_id_service.h index eb4a92ae..ef57797 100644 --- a/net/ssl/channel_id_service.h +++ b/net/ssl/channel_id_service.h
@@ -129,6 +129,10 @@ // Returns the backing ChannelIDStore. ChannelIDStore* GetChannelIDStore(); + // Returns an ID that is unique across all instances of ChannelIDService in + // this process. TODO(nharper): remove this once crbug.com/548423 is resolved. + int GetUniqueID() const { return id_; } + // Public only for unit testing. int channel_id_count(); uint64_t requests() const { return requests_; } @@ -171,6 +175,7 @@ scoped_ptr<ChannelIDStore> channel_id_store_; scoped_refptr<base::TaskRunner> task_runner_; + const int id_; // inflight_ maps from a server to an active generation which is taking // place.
diff --git a/net/ssl/ssl_client_session_cache_openssl.cc b/net/ssl/ssl_client_session_cache_openssl.cc index 6246bd5..a413eeeaf 100644 --- a/net/ssl/ssl_client_session_cache_openssl.cc +++ b/net/ssl/ssl_client_session_cache_openssl.cc
@@ -40,7 +40,7 @@ CacheEntryMap::iterator iter = cache_.Get(cache_key); if (iter == cache_.end()) return nullptr; - if (IsExpired(iter->second, clock_->Now())) { + if (IsExpired(iter->second.get(), clock_->Now())) { cache_.Erase(iter); return nullptr; } @@ -52,12 +52,12 @@ base::AutoLock lock(lock_); // Make a new entry. - CacheEntry* entry = new CacheEntry; + scoped_ptr<CacheEntry> entry(new CacheEntry); entry->session.reset(SSL_SESSION_up_ref(session)); entry->creation_time = clock_->Now(); // Takes ownership. - cache_.Put(cache_key, entry); + cache_.Put(cache_key, std::move(entry)); } void SSLClientSessionCacheOpenSSL::Flush() { @@ -88,7 +88,7 @@ base::Time now = clock_->Now(); CacheEntryMap::iterator iter = cache_.begin(); while (iter != cache_.end()) { - if (IsExpired(iter->second, now)) { + if (IsExpired(iter->second.get(), now)) { iter = cache_.Erase(iter); } else { ++iter;
diff --git a/net/ssl/ssl_client_session_cache_openssl.h b/net/ssl/ssl_client_session_cache_openssl.h index f3518b1..a432b595 100644 --- a/net/ssl/ssl_client_session_cache_openssl.h +++ b/net/ssl/ssl_client_session_cache_openssl.h
@@ -66,11 +66,7 @@ }; using CacheEntryMap = - base::MRUCacheBase<std::string, - CacheEntry*, - std::hash<std::string>, - base::MRUCachePointerDeletor<CacheEntry*>, - base::MRUCacheHashMap>; + base::HashingMRUCache<std::string, scoped_ptr<CacheEntry>>; // Returns true if |entry| is expired as of |now|. bool IsExpired(CacheEntry* entry, const base::Time& now);
diff --git a/net/url_request/url_request_context.cc b/net/url_request/url_request_context.cc index 3f4f55a..e52021c6 100644 --- a/net/url_request/url_request_context.cc +++ b/net/url_request/url_request_context.cc
@@ -34,7 +34,8 @@ backoff_manager_(nullptr), sdch_manager_(nullptr), network_quality_estimator_(nullptr), - url_requests_(new std::set<const URLRequest*>) {} + url_requests_(new std::set<const URLRequest*>), + has_known_mismatched_cookie_store_(false) {} URLRequestContext::~URLRequestContext() { AssertNoURLRequests();
diff --git a/net/url_request/url_request_context.h b/net/url_request/url_request_context.h index f51f5cb..ee165b4 100644 --- a/net/url_request/url_request_context.h +++ b/net/url_request/url_request_context.h
@@ -219,6 +219,21 @@ network_quality_estimator_ = network_quality_estimator; } + // This is a temporary flag to aid in debugging crbug.com/548423. A + // CookieStore that is persisted shouldn't be used with a ChannelIDStore that + // is ephemeral, but there are occasional cases where that is ok. This method + // returns whether this URLRequestContext is in a situation where the + // ephemerality of the stores don't match and it has been determined that it + // is ok to do that. This helps in logging to filter legitimate cases of this + // mismatch from other cases. + bool has_known_mismatched_cookie_store() const { + return has_known_mismatched_cookie_store_; + } + + void set_has_known_mismatched_cookie_store() { + has_known_mismatched_cookie_store_ = true; + } + private: // --------------------------------------------------------------------------- // Important: When adding any new members below, consider whether they need to @@ -253,6 +268,7 @@ // --------------------------------------------------------------------------- scoped_ptr<std::set<const URLRequest*> > url_requests_; + bool has_known_mismatched_cookie_store_; DISALLOW_COPY_AND_ASSIGN(URLRequestContext); };
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc index 6204faa..39a4a41b 100644 --- a/net/url_request/url_request_http_job.cc +++ b/net/url_request/url_request_http_job.cc
@@ -41,6 +41,7 @@ #include "net/http/http_transaction_factory.h" #include "net/http/http_util.h" #include "net/proxy/proxy_info.h" +#include "net/ssl/channel_id_service.h" #include "net/ssl/ssl_cert_request_info.h" #include "net/ssl/ssl_config_service.h" #include "net/url_request/http_user_agent_settings.h" @@ -64,6 +65,59 @@ method == "TRACE"; } +void LogChannelIDAndCookieStores(const net::URLRequestContext* context, + const net::SSLInfo& ssl_info) { + if (!ssl_info.channel_id_sent) + return; + // This enum is used for an UMA histogram - don't reuse or renumber entries. + enum { + // Value 0 was removed (CID_EPHEMERAL_COOKIE_EPHEMERAL) + CID_EPHEMERAL_COOKIE_PERSISTENT = 1, + CID_PERSISTENT_COOKIE_EPHEMERAL = 2, + // Value 3 was removed (CID_PERSISTENT_COOKIE_PERSISTENT) + NO_COOKIE_STORE = 4, + NO_CHANNEL_ID_STORE = 5, + KNOWN_MISMATCH = 6, + EPHEMERAL_MATCH = 7, + EPHEMERAL_MISMATCH = 8, + PERSISTENT_MATCH = 9, + PERSISTENT_MISMATCH = 10, + EPHEMERALITY_MAX + } ephemerality; + const net::HttpNetworkSession::Params* params = + context->GetNetworkSessionParams(); + net::CookieStore* cookie_store = context->cookie_store(); + if (params == nullptr || params->channel_id_service == nullptr) { + ephemerality = NO_CHANNEL_ID_STORE; + } else if (cookie_store == nullptr) { + ephemerality = NO_COOKIE_STORE; + } else if (params->channel_id_service->GetChannelIDStore()->IsEphemeral()) { + if (cookie_store->IsEphemeral()) { + if (context->channel_id_service() && + params->channel_id_service->GetUniqueID() == + context->channel_id_service()->GetUniqueID()) { + ephemerality = EPHEMERAL_MATCH; + } else { + ephemerality = EPHEMERAL_MISMATCH; + } + } else if (context->has_known_mismatched_cookie_store()) { + ephemerality = KNOWN_MISMATCH; + } else { + ephemerality = CID_EPHEMERAL_COOKIE_PERSISTENT; + } + } else if (cookie_store->IsEphemeral()) { + ephemerality = CID_PERSISTENT_COOKIE_EPHEMERAL; + } else if (context->channel_id_service() && + params->channel_id_service->GetUniqueID() == + context->channel_id_service()->GetUniqueID()) { + ephemerality = PERSISTENT_MATCH; + } else { + ephemerality = PERSISTENT_MISMATCH; + } + UMA_HISTOGRAM_ENUMERATION("Net.TokenBinding.StoreEphemerality", ephemerality, + EPHEMERALITY_MAX); +} + } // namespace namespace net { @@ -914,6 +968,8 @@ return; } } + LogChannelIDAndCookieStores(request_->context(), + transaction_->GetResponseInfo()->ssl_info); SaveCookiesAndNotifyHeadersComplete(OK); } else if (IsCertificateError(result)) {
diff --git a/remoting/client/jni/chromoting_jni_instance.cc b/remoting/client/jni/chromoting_jni_instance.cc index 540c955..d1602110 100644 --- a/remoting/client/jni/chromoting_jni_instance.cc +++ b/remoting/client/jni/chromoting_jni_instance.cc
@@ -10,6 +10,7 @@ #include <utility> #include "base/bind.h" +#include "base/callback_helpers.h" #include "base/logging.h" #include "jingle/glue/thread_wrapper.h" #include "net/socket/client_socket_factory.h" @@ -21,7 +22,6 @@ #include "remoting/client/jni/chromoting_jni_runtime.h" #include "remoting/client/jni/jni_frame_consumer.h" #include "remoting/client/software_video_renderer.h" -#include "remoting/client/token_fetcher_proxy.h" #include "remoting/protocol/chromium_port_allocator_factory.h" #include "remoting/protocol/chromium_socket_factory.h" #include "remoting/protocol/host_stub.h" @@ -74,16 +74,12 @@ xmpp_config_.auth_token = auth_token; // Initialize |authenticator_|. - scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher> - token_fetcher(new TokenFetcherProxy( - base::Bind(&ChromotingJniInstance::FetchThirdPartyToken, - weak_factory_.GetWeakPtr()), - host_pubkey)); - authenticator_.reset(new protocol::NegotiatingClientAuthenticator( pairing_id, pairing_secret, host_id_, - base::Bind(&ChromotingJniInstance::FetchSecret, this), - std::move(token_fetcher))); + base::Bind(&ChromotingJniInstance::FetchSecret, + weak_factory_.GetWeakPtr()), + base::Bind(&ChromotingJniInstance::FetchThirdPartyToken, + weak_factory_.GetWeakPtr(), host_pubkey))); // Post a task to start connection jni_runtime_->network_task_runner()->PostTask( @@ -128,25 +124,22 @@ } void ChromotingJniInstance::FetchThirdPartyToken( - const GURL& token_url, - const std::string& client_id, + const std::string& host_public_key, + const std::string& token_url, const std::string& scope, - base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy) { + const protocol::ThirdPartyTokenFetchedCallback& token_fetched_callback) { DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); - DCHECK(!token_fetcher_proxy_.get()); + DCHECK(third_party_token_fetched_callback_.is_null()); __android_log_print(ANDROID_LOG_INFO, "ThirdPartyAuth", "Fetching Third Party Token from user."); - token_fetcher_proxy_ = token_fetcher_proxy; + third_party_token_fetched_callback_ = token_fetched_callback; jni_runtime_->ui_task_runner()->PostTask( - FROM_HERE, - base::Bind(&ChromotingJniRuntime::FetchThirdPartyToken, - base::Unretained(jni_runtime_), - token_url, - client_id, - scope)); + FROM_HERE, base::Bind(&ChromotingJniRuntime::FetchThirdPartyToken, + base::Unretained(jni_runtime_), token_url, + host_public_key, scope)); } void ChromotingJniInstance::HandleOnThirdPartyTokenFetched( @@ -157,9 +150,9 @@ __android_log_print( ANDROID_LOG_INFO, "ThirdPartyAuth", "Third Party Token Fetched."); - if (token_fetcher_proxy_.get()) { - token_fetcher_proxy_->OnTokenFetched(token, shared_secret); - token_fetcher_proxy_.reset(); + if (!third_party_token_fetched_callback_.is_null()) { + base::ResetAndReturn(&third_party_token_fetched_callback_) + .Run(token, shared_secret); } else { __android_log_print( ANDROID_LOG_WARN,
diff --git a/remoting/client/jni/chromoting_jni_instance.h b/remoting/client/jni/chromoting_jni_instance.h index e31bb28a..9eab8d97 100644 --- a/remoting/client/jni/chromoting_jni_instance.h +++ b/remoting/client/jni/chromoting_jni_instance.h
@@ -33,7 +33,6 @@ class ChromotingJniRuntime; class ClientStatusLogger; class JniFrameConsumer; -class TokenFetcherProxy; // ClientUserInterface that indirectly makes and receives JNI calls. class ChromotingJniInstance @@ -62,10 +61,10 @@ // Requests the android app to fetch a third-party token. void FetchThirdPartyToken( - const GURL& token_url, - const std::string& client_id, + const std::string& host_public_key, + const std::string& token_url, const std::string& scope, - const base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy); + const protocol::ThirdPartyTokenFetchedCallback& token_fetched_callback); // Called by the android app when the token is fetched. void HandleOnThirdPartyTokenFetched(const std::string& token, @@ -163,7 +162,7 @@ XmppSignalStrategy::XmppServerConfig xmpp_config_; scoped_ptr<XmppSignalStrategy> signaling_; // Must outlive client_ scoped_ptr<ClientStatusLogger> client_status_logger_; - base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy_; + protocol::ThirdPartyTokenFetchedCallback third_party_token_fetched_callback_; // Pass this the user's PIN once we have it. To be assigned and accessed on // the UI thread, but must be posted to the network thread to call it.
diff --git a/remoting/client/jni/chromoting_jni_runtime.cc b/remoting/client/jni/chromoting_jni_runtime.cc index b1b36b7..37303b3 100644 --- a/remoting/client/jni/chromoting_jni_runtime.cc +++ b/remoting/client/jni/chromoting_jni_runtime.cc
@@ -308,14 +308,13 @@ env, j_host.obj(), j_id.obj(), j_secret.obj()); } -void ChromotingJniRuntime::FetchThirdPartyToken(const GURL& token_url, +void ChromotingJniRuntime::FetchThirdPartyToken(const std::string& token_url, const std::string& client_id, const std::string& scope) { DCHECK(ui_task_runner_->BelongsToCurrentThread()); JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jstring> j_url = - ConvertUTF8ToJavaString(env, token_url.spec()); + ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, token_url); ScopedJavaLocalRef<jstring> j_client_id = ConvertUTF8ToJavaString(env, client_id); ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope);
diff --git a/remoting/client/jni/chromoting_jni_runtime.h b/remoting/client/jni/chromoting_jni_runtime.h index af2c4094..b6128c1e 100644 --- a/remoting/client/jni/chromoting_jni_runtime.h +++ b/remoting/client/jni/chromoting_jni_runtime.h
@@ -88,7 +88,7 @@ // Pops up a third party login page to fetch token required for // authentication. Call on UI thread. - void FetchThirdPartyToken(const GURL& token_url, + void FetchThirdPartyToken(const std::string& token_url, const std::string& client_id, const std::string& scope);
diff --git a/remoting/client/plugin/chromoting_instance.cc b/remoting/client/plugin/chromoting_instance.cc index 2b1974b..1365821 100644 --- a/remoting/client/plugin/chromoting_instance.cc +++ b/remoting/client/plugin/chromoting_instance.cc
@@ -51,7 +51,6 @@ #include "remoting/client/plugin/pepper_video_renderer_2d.h" #include "remoting/client/plugin/pepper_video_renderer_3d.h" #include "remoting/client/software_video_renderer.h" -#include "remoting/client/token_fetcher_proxy.h" #include "remoting/proto/control.pb.h" #include "remoting/protocol/connection_to_host.h" #include "remoting/protocol/host_stub.h" @@ -461,17 +460,17 @@ } void ChromotingInstance::FetchThirdPartyToken( - const GURL& token_url, const std::string& host_public_key, + const std::string& token_url, const std::string& scope, - base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy) { + const protocol::ThirdPartyTokenFetchedCallback& token_fetched_callback) { // Once the Session object calls this function, it won't continue the // authentication until the callback is called (or connection is canceled). // So, it's impossible to reach this with a callback already registered. - DCHECK(!token_fetcher_proxy_.get()); - token_fetcher_proxy_ = token_fetcher_proxy; + DCHECK(third_party_token_fetched_callback_.is_null()); + third_party_token_fetched_callback_ = token_fetched_callback; scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); - data->SetString("tokenUrl", token_url.spec()); + data->SetString("tokenUrl", token_url); data->SetString("hostPublicKey", host_public_key); data->SetString("scope", scope); PostLegacyJsonMessage("fetchThirdPartyToken", std::move(data)); @@ -697,16 +696,14 @@ protocol::TransportRole::CLIENT)); // Create Authenticator. - scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher> - token_fetcher(new TokenFetcherProxy( - base::Bind(&ChromotingInstance::FetchThirdPartyToken, - weak_factory_.GetWeakPtr()), - host_public_key)); + protocol::FetchThirdPartyTokenCallback fetch_third_party_token_callback = + base::Bind(&ChromotingInstance::FetchThirdPartyToken, + weak_factory_.GetWeakPtr(), host_public_key); scoped_ptr<protocol::Authenticator> authenticator( new protocol::NegotiatingClientAuthenticator( client_pairing_id, client_paired_secret, authentication_tag, - fetch_secret_callback, std::move(token_fetcher))); + fetch_secret_callback, fetch_third_party_token_callback)); scoped_ptr<protocol::CandidateSessionConfig> config = protocol::CandidateSessionConfig::CreateDefault(); @@ -910,9 +907,9 @@ LOG(ERROR) << "Invalid onThirdPartyTokenFetched data."; return; } - if (token_fetcher_proxy_.get()) { - token_fetcher_proxy_->OnTokenFetched(token, shared_secret); - token_fetcher_proxy_.reset(); + if (!third_party_token_fetched_callback_.is_null()) { + base::ResetAndReturn(&third_party_token_fetched_callback_) + .Run(token, shared_secret); } else { LOG(WARNING) << "Ignored OnThirdPartyTokenFetched without a pending fetch."; }
diff --git a/remoting/client/plugin/chromoting_instance.h b/remoting/client/plugin/chromoting_instance.h index 52b6efd7..7b91854c 100644 --- a/remoting/client/plugin/chromoting_instance.h +++ b/remoting/client/plugin/chromoting_instance.h
@@ -66,7 +66,6 @@ class DelegatingSignalStrategy; class PepperAudioPlayer; class PepperMouseLocker; -class TokenFetcherProxy; class ChromotingInstance : public ClientUserInterface, public PepperVideoRenderer::EventHandler, @@ -162,10 +161,10 @@ // Requests the webapp to fetch a third-party token. void FetchThirdPartyToken( - const GURL& token_url, const std::string& host_public_key, + const std::string& token_url, const std::string& scope, - const base::WeakPtr<TokenFetcherProxy> pepper_token_fetcher); + const protocol::ThirdPartyTokenFetchedCallback& token_fetched_callback); // Updates the specified UMA enumeration histogram with the input value. void UpdateUmaEnumHistogram(const std::string& histogram_name, @@ -283,7 +282,7 @@ bool use_async_pin_dialog_; protocol::SecretFetchedCallback secret_fetched_callback_; - base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy_; + protocol::ThirdPartyTokenFetchedCallback third_party_token_fetched_callback_; base::RepeatingTimer stats_update_timer_;
diff --git a/remoting/client/token_fetcher_proxy.cc b/remoting/client/token_fetcher_proxy.cc deleted file mode 100644 index 1079290..0000000 --- a/remoting/client/token_fetcher_proxy.cc +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "remoting/client/token_fetcher_proxy.h" - -#include "base/callback_helpers.h" - -namespace remoting { - -TokenFetcherProxy::TokenFetcherProxy( - const TokenFetcherCallback& token_fetcher_impl, - const std::string& host_public_key) - : host_public_key_(host_public_key), - token_fetcher_impl_(token_fetcher_impl), - weak_factory_(this) { -} - -TokenFetcherProxy::~TokenFetcherProxy() { -} - -void TokenFetcherProxy::FetchThirdPartyToken( - const GURL& token_url, - const std::string& scope, - const TokenFetchedCallback& token_fetched_callback) { - token_fetched_callback_ = token_fetched_callback; - token_fetcher_impl_.Run( - token_url, host_public_key_, scope, weak_factory_.GetWeakPtr()); -} - -void TokenFetcherProxy::OnTokenFetched( - const std::string& token, const std::string& shared_secret) { - if (!token_fetched_callback_.is_null()) { - base::ResetAndReturn(&token_fetched_callback_).Run(token, shared_secret); - } -} - -} // namespace remoting
diff --git a/remoting/client/token_fetcher_proxy.h b/remoting/client/token_fetcher_proxy.h deleted file mode 100644 index 17916ce..0000000 --- a/remoting/client/token_fetcher_proxy.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef REMOTING_CLIENT_TOKEN_FETCHER_PROXY_H_ -#define REMOTING_CLIENT_TOKEN_FETCHER_PROXY_H_ - -#include "base/callback.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "remoting/protocol/third_party_client_authenticator.h" - -namespace remoting { - -class TokenFetcherProxy - : public protocol::ThirdPartyClientAuthenticator::TokenFetcher { - public: - typedef base::Callback<void( - const GURL& token_url, - const std::string& host_public_key, - const std::string& scope, - base::WeakPtr<TokenFetcherProxy>)> TokenFetcherCallback; - - TokenFetcherProxy(const TokenFetcherCallback& token_fetcher_impl, - const std::string& host_public_key); - ~TokenFetcherProxy() override; - - // protocol::TokenClientAuthenticator::TokenFetcher interface. - void FetchThirdPartyToken( - const GURL& token_url, - const std::string& scope, - const TokenFetchedCallback& token_fetched_callback) override; - - // Called by the token fetching implementation when the token is fetched. - void OnTokenFetched(const std::string& token, - const std::string& shared_secret); - - private: - std::string host_public_key_; - TokenFetcherCallback token_fetcher_impl_; - TokenFetchedCallback token_fetched_callback_; - base::WeakPtrFactory<TokenFetcherProxy> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(TokenFetcherProxy); -}; - -} // namespace remoting - -#endif // REMOTING_CLIENT_TOKEN_FETCHER_PROXY_H_
diff --git a/remoting/protocol/authenticator.h b/remoting/protocol/authenticator.h index febf38c..8b89111 100644 --- a/remoting/protocol/authenticator.h +++ b/remoting/protocol/authenticator.h
@@ -25,6 +25,27 @@ bool pairing_supported, const SecretFetchedCallback& secret_fetched_callback)> FetchSecretCallback; +// Callback passed to |FetchTokenCallback|, and called once the client +// authentication finishes. |token| is an opaque string that should be sent +// directly to the host. |shared_secret| should be used by the client to +// create a V2Authenticator. In case of failure, the callback is called with +// an empty |token| and |shared_secret|. +typedef base::Callback<void(const std::string& token, + const std::string& shared_secret)> + ThirdPartyTokenFetchedCallback; + +// Fetches a third party token from |token_url|. |host_public_key| is sent to +// the server so it can later authenticate the host. |scope| is a string with a +// space-separated list of attributes for this connection (e.g. +// "hostjid:abc@example.com/123 clientjid:def@example.org/456". +// |token_fetched_callback| is called when the client authentication ends, on +// the same thread on which FetchThirdPartyTokenCallback was originally called. +typedef base::Callback<void( + const std::string& token_url, + const std::string& scope, + const ThirdPartyTokenFetchedCallback& token_fetched_callback)> + FetchThirdPartyTokenCallback; + // Authenticator is an abstract interface for authentication protocol // implementations. Different implementations of this interface may be used on // each side of the connection depending of type of the auth protocol. Client
diff --git a/remoting/protocol/negotiating_authenticator_unittest.cc b/remoting/protocol/negotiating_authenticator_unittest.cc index 5ed3a32..0161e65 100644 --- a/remoting/protocol/negotiating_authenticator_unittest.cc +++ b/remoting/protocol/negotiating_authenticator_unittest.cc
@@ -72,7 +72,7 @@ pairing_expected); client_as_negotiating_authenticator_ = new NegotiatingClientAuthenticator( client_id, client_paired_secret, kTestHostId, fetch_secret_callback, - nullptr); + FetchThirdPartyTokenCallback()); client_.reset(client_as_negotiating_authenticator_); }
diff --git a/remoting/protocol/negotiating_client_authenticator.cc b/remoting/protocol/negotiating_client_authenticator.cc index 3ea252a..c6cda5d 100644 --- a/remoting/protocol/negotiating_client_authenticator.cc +++ b/remoting/protocol/negotiating_client_authenticator.cc
@@ -26,15 +26,16 @@ const std::string& shared_secret, const std::string& authentication_tag, const FetchSecretCallback& fetch_secret_callback, - scoped_ptr<ThirdPartyClientAuthenticator::TokenFetcher> token_fetcher) + const FetchThirdPartyTokenCallback& fetch_third_party_token_callback) : NegotiatingAuthenticatorBase(MESSAGE_READY), client_pairing_id_(client_pairing_id), shared_secret_(shared_secret), authentication_tag_(authentication_tag), fetch_secret_callback_(fetch_secret_callback), - token_fetcher_(std::move(token_fetcher)), + fetch_third_party_token_callback_(fetch_third_party_token_callback), weak_factory_(this) { - AddMethod(Method::THIRD_PARTY); + if (!fetch_third_party_token_callback.is_null()) + AddMethod(Method::THIRD_PARTY); AddMethod(Method::SPAKE2_PAIR); AddMethod(Method::SPAKE2_SHARED_SECRET_HMAC); AddMethod(Method::SPAKE2_SHARED_SECRET_PLAIN); @@ -112,13 +113,9 @@ const base::Closure& resume_callback) { DCHECK(current_method_ != Method::INVALID); if (current_method_ == Method::THIRD_PARTY) { - // |ThirdPartyClientAuthenticator| takes ownership of |token_fetcher_|. - // The authentication method negotiation logic should guarantee that only - // one |ThirdPartyClientAuthenticator| will need to be created per session. - DCHECK(token_fetcher_); current_authenticator_.reset(new ThirdPartyClientAuthenticator( base::Bind(&V2Authenticator::CreateForClient), - std::move(token_fetcher_))); + fetch_third_party_token_callback_)); resume_callback.Run(); } else { DCHECK(current_method_ == Method::SPAKE2_SHARED_SECRET_PLAIN ||
diff --git a/remoting/protocol/negotiating_client_authenticator.h b/remoting/protocol/negotiating_client_authenticator.h index c664a65..abdb58ca 100644 --- a/remoting/protocol/negotiating_client_authenticator.h +++ b/remoting/protocol/negotiating_client_authenticator.h
@@ -28,7 +28,7 @@ const std::string& shared_secret, const std::string& authentication_tag, const FetchSecretCallback& fetch_secret_callback, - scoped_ptr<ThirdPartyClientAuthenticator::TokenFetcher> token_fetcher_); + const FetchThirdPartyTokenCallback& fetch_third_party_token_callback); ~NegotiatingClientAuthenticator() override; @@ -75,7 +75,7 @@ FetchSecretCallback fetch_secret_callback_; // Used for third party authenticators. - scoped_ptr<ThirdPartyClientAuthenticator::TokenFetcher> token_fetcher_; + FetchThirdPartyTokenCallback fetch_third_party_token_callback_; // Internal NegotiatingClientAuthenticator data. bool method_set_by_host_ = false;
diff --git a/remoting/protocol/third_party_authenticator_unittest.cc b/remoting/protocol/third_party_authenticator_unittest.cc index 7b9c46d..f4d8046d 100644 --- a/remoting/protocol/third_party_authenticator_unittest.cc +++ b/remoting/protocol/third_party_authenticator_unittest.cc
@@ -43,16 +43,16 @@ namespace protocol { class ThirdPartyAuthenticatorTest : public AuthenticatorTestBase { - class FakeTokenFetcher : public ThirdPartyClientAuthenticator::TokenFetcher { + class FakeTokenFetcher { public: void FetchThirdPartyToken( - const GURL& token_url, + const std::string& token_url, const std::string& scope, - const TokenFetchedCallback& token_fetched_callback) override { - ASSERT_EQ(token_url.spec(), kTokenUrl); - ASSERT_EQ(scope, kTokenScope); - ASSERT_FALSE(token_fetched_callback.is_null()); - on_token_fetched_ = token_fetched_callback; + const ThirdPartyTokenFetchedCallback& token_fetched_callback) { + ASSERT_EQ(token_url, kTokenUrl); + ASSERT_EQ(scope, kTokenScope); + ASSERT_FALSE(token_fetched_callback.is_null()); + on_token_fetched_ = token_fetched_callback; } void OnTokenFetched(const std::string& token, @@ -62,7 +62,7 @@ } private: - TokenFetchedCallback on_token_fetched_; + ThirdPartyTokenFetchedCallback on_token_fetched_; }; class FakeTokenValidator : public TokenValidator { @@ -105,13 +105,13 @@ host_.reset(new ThirdPartyHostAuthenticator( base::Bind(&V2Authenticator::CreateForHost, host_cert_, key_pair_), make_scoped_ptr(token_validator_))); - token_fetcher_ = new FakeTokenFetcher(); client_.reset(new ThirdPartyClientAuthenticator( base::Bind(&V2Authenticator::CreateForClient), - make_scoped_ptr(token_fetcher_))); + base::Bind(&FakeTokenFetcher::FetchThirdPartyToken, + base::Unretained(&token_fetcher_)))); } - FakeTokenFetcher* token_fetcher_; + FakeTokenFetcher token_fetcher_; FakeTokenValidator* token_validator_; private: @@ -122,11 +122,9 @@ ASSERT_NO_FATAL_FAILURE(InitAuthenticators()); ASSERT_NO_FATAL_FAILURE(RunHostInitiatedAuthExchange()); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, client_->state()); - ASSERT_NO_FATAL_FAILURE(token_fetcher_->OnTokenFetched( - kToken, kSharedSecret)); + ASSERT_NO_FATAL_FAILURE(token_fetcher_.OnTokenFetched(kToken, kSharedSecret)); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, host_->state()); - ASSERT_NO_FATAL_FAILURE( - token_validator_->OnTokenValidated(kSharedSecret)); + ASSERT_NO_FATAL_FAILURE(token_validator_->OnTokenValidated(kSharedSecret)); // Both sides have finished. ASSERT_EQ(Authenticator::ACCEPTED, host_->state()); @@ -149,8 +147,7 @@ ASSERT_NO_FATAL_FAILURE(InitAuthenticators()); ASSERT_NO_FATAL_FAILURE(RunHostInitiatedAuthExchange()); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, client_->state()); - ASSERT_NO_FATAL_FAILURE( - token_fetcher_->OnTokenFetched(kToken, std::string())); + ASSERT_NO_FATAL_FAILURE(token_fetcher_.OnTokenFetched(kToken, std::string())); // The end result is that the client rejected the connection, since it // couldn't fetch the secret. @@ -161,7 +158,7 @@ ASSERT_NO_FATAL_FAILURE(InitAuthenticators()); ASSERT_NO_FATAL_FAILURE(RunHostInitiatedAuthExchange()); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, client_->state()); - ASSERT_NO_FATAL_FAILURE(token_fetcher_->OnTokenFetched( + ASSERT_NO_FATAL_FAILURE(token_fetcher_.OnTokenFetched( kToken, kSharedSecret)); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, host_->state()); ASSERT_NO_FATAL_FAILURE(token_validator_->OnTokenValidated(std::string())); @@ -175,7 +172,7 @@ ASSERT_NO_FATAL_FAILURE(RunHostInitiatedAuthExchange()); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, client_->state()); ASSERT_NO_FATAL_FAILURE( - token_fetcher_->OnTokenFetched(std::string(), std::string())); + token_fetcher_.OnTokenFetched(std::string(), std::string())); // The end result is that the client rejected the connection, since it // couldn't fetch the token. @@ -187,8 +184,7 @@ ASSERT_NO_FATAL_FAILURE(InitAuthenticators()); ASSERT_NO_FATAL_FAILURE(RunHostInitiatedAuthExchange()); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, client_->state()); - ASSERT_NO_FATAL_FAILURE(token_fetcher_->OnTokenFetched( - kToken, kSharedSecret)); + ASSERT_NO_FATAL_FAILURE(token_fetcher_.OnTokenFetched(kToken, kSharedSecret)); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, host_->state()); ASSERT_NO_FATAL_FAILURE( token_validator_->OnTokenValidated(kSharedSecretBad)); @@ -202,7 +198,7 @@ ASSERT_NO_FATAL_FAILURE(RunHostInitiatedAuthExchange()); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, client_->state()); ASSERT_NO_FATAL_FAILURE( - token_fetcher_->OnTokenFetched(kToken, kSharedSecretBad)); + token_fetcher_.OnTokenFetched(kToken, kSharedSecretBad)); ASSERT_EQ(Authenticator::PROCESSING_MESSAGE, host_->state()); ASSERT_NO_FATAL_FAILURE( token_validator_->OnTokenValidated(kSharedSecret));
diff --git a/remoting/protocol/third_party_client_authenticator.cc b/remoting/protocol/third_party_client_authenticator.cc index 0b199b75..dd21135 100644 --- a/remoting/protocol/third_party_client_authenticator.cc +++ b/remoting/protocol/third_party_client_authenticator.cc
@@ -14,17 +14,17 @@ #include "remoting/base/rsa_key_pair.h" #include "remoting/protocol/channel_authenticator.h" #include "third_party/webrtc/libjingle/xmllite/xmlelement.h" -#include "url/gurl.h" namespace remoting { namespace protocol { ThirdPartyClientAuthenticator::ThirdPartyClientAuthenticator( const CreateBaseAuthenticatorCallback& create_base_authenticator_callback, - scoped_ptr<TokenFetcher> token_fetcher) + const FetchThirdPartyTokenCallback& fetch_token_callback) : ThirdPartyAuthenticatorBase(WAITING_MESSAGE), create_base_authenticator_callback_(create_base_authenticator_callback), - token_fetcher_(std::move(token_fetcher)) {} + fetch_token_callback_(std::move(fetch_token_callback)), + weak_factory_(this) {} ThirdPartyClientAuthenticator::~ThirdPartyClientAuthenticator() {} @@ -45,11 +45,10 @@ token_state_ = PROCESSING_MESSAGE; - // |token_fetcher_| is owned, so Unretained() is safe here. - token_fetcher_->FetchThirdPartyToken( - GURL(token_url), token_scope, base::Bind( - &ThirdPartyClientAuthenticator::OnThirdPartyTokenFetched, - base::Unretained(this), resume_callback)); + fetch_token_callback_.Run( + token_url, token_scope, + base::Bind(&ThirdPartyClientAuthenticator::OnThirdPartyTokenFetched, + weak_factory_.GetWeakPtr(), resume_callback)); } void ThirdPartyClientAuthenticator::AddTokenElements(
diff --git a/remoting/protocol/third_party_client_authenticator.h b/remoting/protocol/third_party_client_authenticator.h index 7ebc04f..ea94887f 100644 --- a/remoting/protocol/third_party_client_authenticator.h +++ b/remoting/protocol/third_party_client_authenticator.h
@@ -12,9 +12,6 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "remoting/protocol/third_party_authenticator_base.h" -#include "url/gurl.h" - -class GURL; namespace remoting { namespace protocol { @@ -29,38 +26,12 @@ // |V2Authenticator|, which is used to establish the encrypted connection. class ThirdPartyClientAuthenticator : public ThirdPartyAuthenticatorBase { public: - class TokenFetcher { - public: - // Callback passed to |FetchThirdPartyToken|, and called once the client - // authentication finishes. |token| is an opaque string that should be sent - // directly to the host. |shared_secret| should be used by the client to - // create a V2Authenticator. In case of failure, the callback is called with - // an empty |token| and |shared_secret|. - typedef base::Callback<void( - const std::string& token, - const std::string& shared_secret)> TokenFetchedCallback; - - virtual ~TokenFetcher() {} - - // Fetches a third party token from |token_url|. |host_public_key| is sent - // to the server so it can later authenticate the host. |scope| is a string - // with a space-separated list of attributes for this connection (e.g. - // "hostjid:abc@example.com/123 clientjid:def@example.org/456". - // |token_fetched_callback| is called when the client authentication ends, - // in the same thread |FetchThirdPartyToken| was originally called. - // The request is canceled if the TokenFetcher is destroyed. - virtual void FetchThirdPartyToken( - const GURL& token_url, - const std::string& scope, - const TokenFetchedCallback& token_fetched_callback) = 0; - }; - // Creates a third-party client authenticator. // |create_base_authenticator_callback| is used to create the base // authenticator. |token_fetcher| is used to get the authentication token. ThirdPartyClientAuthenticator( const CreateBaseAuthenticatorCallback& create_base_authenticator_callback, - scoped_ptr<TokenFetcher> token_fetcher); + const FetchThirdPartyTokenCallback& fetch_token_callback); ~ThirdPartyClientAuthenticator() override; protected: @@ -75,9 +46,11 @@ const std::string& shared_secret); CreateBaseAuthenticatorCallback create_base_authenticator_callback_; - scoped_ptr<TokenFetcher> token_fetcher_; + FetchThirdPartyTokenCallback fetch_token_callback_; std::string token_; + base::WeakPtrFactory<ThirdPartyClientAuthenticator> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(ThirdPartyClientAuthenticator); };
diff --git a/remoting/remoting_srcs.gypi b/remoting/remoting_srcs.gypi index fe81e68..59a0559 100644 --- a/remoting/remoting_srcs.gypi +++ b/remoting/remoting_srcs.gypi
@@ -293,8 +293,6 @@ 'client/server_log_entry_client.h', 'client/software_video_renderer.cc', 'client/software_video_renderer.h', - 'client/token_fetcher_proxy.cc', - 'client/token_fetcher_proxy.h', 'client/touch_input_scaler.cc', 'client/touch_input_scaler.h', ],
diff --git a/remoting/test/protocol_perftest.cc b/remoting/test/protocol_perftest.cc index 72943b0..cfbe304 100644 --- a/remoting/test/protocol_perftest.cc +++ b/remoting/test/protocol_perftest.cc
@@ -394,7 +394,7 @@ std::string(), // client_pairing_secret kHostId, base::Bind(&ProtocolPerfTest::FetchPin, base::Unretained(this)), - nullptr)); + protocol::FetchThirdPartyTokenCallback())); client_.reset( new ChromotingClient(client_context_.get(), this, this, nullptr)); client_->set_protocol_config(protocol_config_->Clone());
diff --git a/remoting/test/test_chromoting_client.cc b/remoting/test/test_chromoting_client.cc index cd7674c..917980ca 100644 --- a/remoting/test/test_chromoting_client.cc +++ b/remoting/test/test_chromoting_client.cc
@@ -18,7 +18,6 @@ #include "remoting/client/audio_player.h" #include "remoting/client/chromoting_client.h" #include "remoting/client/client_context.h" -#include "remoting/client/token_fetcher_proxy.h" #include "remoting/protocol/chromium_port_allocator_factory.h" #include "remoting/protocol/host_stub.h" #include "remoting/protocol/negotiating_client_authenticator.h" @@ -30,6 +29,9 @@ #include "remoting/test/connection_setup_info.h" #include "remoting/test/test_video_renderer.h" +namespace remoting { +namespace test { + namespace { const char kXmppHostName[] = "talk.google.com"; const int kXmppPortNumber = 5222; @@ -38,35 +40,25 @@ void FetchThirdPartyToken( const std::string& authorization_token, const std::string& shared_secret, - const GURL& token_url, - const std::string& host_public_key, + const std::string& token_url, const std::string& scope, - base::WeakPtr<remoting::TokenFetcherProxy> token_fetcher_proxy) { - VLOG(2) << "FetchThirdPartyToken(" - << "token_url: " << token_url << ", " - << "host_public_key: " << host_public_key << ", " - << "scope: " << scope << ") Called"; + const protocol::ThirdPartyTokenFetchedCallback& token_fetched_callback) { + VLOG(2) << "FetchThirdPartyToken(" + << "token_url: " << token_url << ", " + << "scope: " << scope << ") Called"; - if (token_fetcher_proxy) { - token_fetcher_proxy->OnTokenFetched(authorization_token, shared_secret); - token_fetcher_proxy.reset(); - } else { - LOG(ERROR) << "Invalid token fetcher proxy passed in"; - } + token_fetched_callback.Run(authorization_token, shared_secret); } void FetchSecret( const std::string& client_secret, bool pairing_expected, - const remoting::protocol::SecretFetchedCallback& secret_fetched_callback) { + const protocol::SecretFetchedCallback& secret_fetched_callback) { secret_fetched_callback.Run(client_secret); } } // namespace -namespace remoting { -namespace test { - TestChromotingClient::TestChromotingClient() : TestChromotingClient(nullptr) {} @@ -134,23 +126,21 @@ new ChromiumUrlRequestFactory(request_context_getter)), network_settings, protocol::TransportRole::CLIENT)); - scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher> - token_fetcher(new TokenFetcherProxy( - base::Bind(&FetchThirdPartyToken, - connection_setup_info.authorization_code, - connection_setup_info.shared_secret), - connection_setup_info.public_key)); - protocol::FetchSecretCallback fetch_secret_callback; if (!connection_setup_info.pin.empty()) { fetch_secret_callback = base::Bind(&FetchSecret, connection_setup_info.pin); } + protocol::FetchThirdPartyTokenCallback fetch_third_party_token_callback = + base::Bind(&FetchThirdPartyToken, + connection_setup_info.authorization_code, + connection_setup_info.shared_secret); + scoped_ptr<protocol::Authenticator> authenticator( new protocol::NegotiatingClientAuthenticator( connection_setup_info.pairing_id, connection_setup_info.shared_secret, connection_setup_info.host_id, fetch_secret_callback, - std::move(token_fetcher))); + fetch_third_party_token_callback)); chromoting_client_->Start( signal_strategy_.get(), std::move(authenticator), transport_context,
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index ee02c55..c251024 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -239,6 +239,10 @@ # define SK_SUPPORT_LEGACY_EVAL_CUBIC #endif +#ifndef SK_SUPPORT_LEGACY_PEEKPIXELS_PARMS +# define SK_SUPPORT_LEGACY_PEEKPIXELS_PARMS +#endif + ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 80a577f..982f1dc 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -842,6 +842,12 @@ "swarming": { "can_use_on_swarming_builders": true }, + "test": "mus_ws_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, "test": "nacl_loader_unittests" }, { @@ -932,9 +938,6 @@ "test": "views_unittests" }, { - "test": "window_manager_unittests" - }, - { "swarming": { "can_use_on_swarming_builders": true }, @@ -1241,6 +1244,12 @@ "swarming": { "can_use_on_swarming_builders": true }, + "test": "mus_ws_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, "test": "nacl_loader_unittests" }, {
diff --git a/testing/buildbot/chromium.mojo.json b/testing/buildbot/chromium.mojo.json index d3debac..32da10ea 100644 --- a/testing/buildbot/chromium.mojo.json +++ b/testing/buildbot/chromium.mojo.json
@@ -16,6 +16,9 @@ ], "gtest_tests": [ { + "test": "mus_ws_unittests" + }, + { "test": "views_mus_unittests" } ], @@ -32,6 +35,9 @@ ], "gtest_tests": [ { + "test": "mus_ws_unittests" + }, + { "test": "views_mus_unittests" } ],
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index 3ece26de..e59172c 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -95,20 +95,6 @@ { "name": "host_info", "script": "host_info.py" - }, - { - "args": [ - "gpu_perftests" - ], - "name": "gpu_perftests", - "script": "gtest_perf_test.py" - }, - { - "args": [ - "cc_perftests" - ], - "name": "cc_perftests", - "script": "gtest_perf_test.py" } ] },
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index cb45f9e..e104989 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -1752,13 +1752,13 @@ "test": "mash_unittests" }, { + "test": "mus_ws_unittests" + }, + { "test": "resource_provider_unittests" }, { "test": "ui_touch_selection_unittests" - }, - { - "test": "window_manager_unittests" } ] },
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 8c95f753..00e2fdd 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -388,6 +388,10 @@ "label": "//mash:mash_unittests", "type": "unknown", }, + "mus_ws_unittests": { + "label": "//components/mus/ws:mus_ws_unittests", + "type": "windowed_test_launcher", + }, "nacl_loader_unittests": { "label": "//components/nacl/loader:nacl_loader_unittests", "type": "raw", @@ -538,10 +542,6 @@ "label": "//third_party/WebKit/Source/web:webkit_unit_tests", "type": "console_test_launcher", }, - "window_manager_unittests": { - "label": "//components/mus/ws:window_manager_unittests", - "type": "unknown", - }, "wm_unittests": { "label": "//ui/wm:wm_unittests", "type": "windowed_test_launcher",
diff --git a/testing/chromoting/chromoting_browser_tests.isolate b/testing/chromoting/chromoting_browser_tests.isolate index 1c81b5a..2263b089 100644 --- a/testing/chromoting/chromoting_browser_tests.isolate +++ b/testing/chromoting/chromoting_browser_tests.isolate
@@ -80,7 +80,6 @@ 'variables': { 'files': [ '<(PRODUCT_DIR)/<(mac_product_name).app/', - '<(PRODUCT_DIR)/exif.so', ], }, }],
diff --git a/testing/libfuzzer/fuzzers/BUILD.gn b/testing/libfuzzer/fuzzers/BUILD.gn index 56a4257..95e40467 100644 --- a/testing/libfuzzer/fuzzers/BUILD.gn +++ b/testing/libfuzzer/fuzzers/BUILD.gn
@@ -233,18 +233,6 @@ ] } -if (is_linux) { - # libexif_fuzzer is linux only atm - fuzzer_test("libexif_parser_fuzzer") { - sources = [ - "libexif_parser_fuzzer.cc", - ] - deps = [ - "//third_party/libexif:libexif_fuzzers", - ] - } -} - fuzzer_test("libpng_read_fuzzer") { sources = [ "libpng_read_fuzzer.cc",
diff --git a/testing/libfuzzer/fuzzers/libexif_parser_fuzzer.cc b/testing/libfuzzer/fuzzers/libexif_parser_fuzzer.cc deleted file mode 100644 index 3e15edb..0000000 --- a/testing/libfuzzer/fuzzers/libexif_parser_fuzzer.cc +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stddef.h> -#include <stdint.h> - -#include "libexif/exif-data.h" -#include "libexif/exif-system.h" - -extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - ExifData* exif_data = exif_data_new_from_data(data, size); - exif_data_unref(exif_data); - return 0; -}
diff --git a/testing/libfuzzer/fuzzers/re2_fuzzer.cc b/testing/libfuzzer/fuzzers/re2_fuzzer.cc index 4ac6c92..353aa7e 100644 --- a/testing/libfuzzer/fuzzers/re2_fuzzer.cc +++ b/testing/libfuzzer/fuzzers/re2_fuzzer.cc
@@ -12,8 +12,8 @@ using std::string; -void Test(const string &buffer, const string &pattern, - const RE2::Options &options) { +void Test(const string& buffer, const string& pattern, + const RE2::Options& options) { RE2 re(pattern, options); if (!re.ok()) return; @@ -44,7 +44,7 @@ } // Entry point for LibFuzzer. -extern "C" int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { if (size < 1) return 0;
diff --git a/testing/scripts/common.py b/testing/scripts/common.py index c27f5d4..dabd96e1 100644 --- a/testing/scripts/common.py +++ b/testing/scripts/common.py
@@ -72,7 +72,6 @@ sys.executable, os.path.join( cmd_args.paths['checkout'], 'infra', 'scripts', 'runtest_wrapper.py'), - '--path-build', cmd_args.paths['build'], '--', ] else:
diff --git a/testing/variations/fieldtrial_testing_config_android.json b/testing/variations/fieldtrial_testing_config_android.json index ecbbb13199..365fe5e 100644 --- a/testing/variations/fieldtrial_testing_config_android.json +++ b/testing/variations/fieldtrial_testing_config_android.json
@@ -123,6 +123,14 @@ "group_name": "Enabled" } ], + "ImeThread": [ + { + "enable_features": [ + "ImeThread" + ], + "group_name": "Enabled" + } + ], "InvalidationsGCMUpstream": [ { "group_name": "Enabled" @@ -210,6 +218,9 @@ ], "PhysicalWeb": [ { + "enable_features": [ + "PhysicalWeb" + ], "group_name": "Enabled" } ], @@ -273,6 +284,14 @@ "group_name": "DontShowAndDontSend" } ], + "ResourcePriorities": [ + { + "group_name": "AllExceptAsyncScripts_11011_1_1_10" + }, + { + "group_name": "Control" + } + ], "SafeBrowsingAndroid": [ { "group_name": "Enabled",
diff --git a/testing/variations/fieldtrial_testing_config_linux.json b/testing/variations/fieldtrial_testing_config_linux.json index 4980dc32..7d529da 100644 --- a/testing/variations/fieldtrial_testing_config_linux.json +++ b/testing/variations/fieldtrial_testing_config_linux.json
@@ -140,6 +140,14 @@ "group_name": "DontShowAndDontSend" } ], + "ResourcePriorities": [ + { + "group_name": "AllExceptAsyncScripts_11011_1_1_10" + }, + { + "group_name": "Control" + } + ], "SafeBrowsingReportPhishingErrorLink": [ { "group_name": "Enabled"
diff --git a/testing/variations/fieldtrial_testing_config_mac.json b/testing/variations/fieldtrial_testing_config_mac.json index ab15574..cc2ef24f 100644 --- a/testing/variations/fieldtrial_testing_config_mac.json +++ b/testing/variations/fieldtrial_testing_config_mac.json
@@ -156,6 +156,14 @@ "group_name": "DontShowAndDontSend" } ], + "ResourcePriorities": [ + { + "group_name": "AllExceptAsyncScripts_11011_1_1_10" + }, + { + "group_name": "Control" + } + ], "SafeBrowsingReportPhishingErrorLink": [ { "group_name": "Enabled"
diff --git a/testing/variations/fieldtrial_testing_config_win.json b/testing/variations/fieldtrial_testing_config_win.json index be152db1..5c9e3347 100644 --- a/testing/variations/fieldtrial_testing_config_win.json +++ b/testing/variations/fieldtrial_testing_config_win.json
@@ -223,6 +223,14 @@ "group_name": "DontShowAndDontSend" } ], + "ResourcePriorities": [ + { + "group_name": "AllExceptAsyncScripts_11011_1_1_10" + }, + { + "group_name": "Control" + } + ], "SRTPromptFieldTrial": [ { "group_name": "On"
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 6ba0db835..46365a0 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -268,12 +268,9 @@ crbug.com/542541 [ Debug ] virtual/trustedeventsdefaultaction/fast/events/click-count.html [ Pass Failure ] crbug.com/542541 [ Debug ] virtual/pointerevent/fast/events/click-count.html [ Pass Failure ] -crbug.com/567837 virtual/scalefactor200/fast/hidpi/static/ [ NeedsManualRebaseline ] -crbug.com/567837 virtual/scalefactor150/fast/hidpi/static/ [ NeedsManualRebaseline ] -crbug.com/567837 [ Win Linux ] virtual/scalefactor200withzoom/fast/hidpi/static/ [ NeedsManualRebaseline ] crbug.com/567837 [ Mac Android ] virtual/scalefactor200withzoom/fast/hidpi/static [ Skip ] -# TODO(oshima): Fix the popup's size adjustmenet. -crbug.com/567837 [ Mac ] virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance.html [ Skip ] +# TODO(oshima): Fix the popup's size adjustment. The test below is commented out as it is already skipped by the larger set above. +# crbug.com/567837 [ Mac ] virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance.html [ Skip ] # TODO(oshima): Move the event scaling code to eventSender and remove this. crbug.com/567837 virtual/scalefactor200/fast/hidpi/static/mousewheel-scroll-amount.html [ Skip ] @@ -534,6 +531,16 @@ crbug.com/325673 imported/web-platform-tests/custom-elements/concepts/custom-elements-type-naming.html [ Failure ] crbug.com/542660 fast/css/absolute-inline-alignment-2.html [ Failure ] +crbug.com/593184 editing/input/reveal-caret-of-multiline-input.html [ NeedsRebaseline ] +crbug.com/593184 fast/forms/textarea/basic-textareas-quirks.html [ NeedsRebaseline ] +crbug.com/593184 fast/forms/textarea/textarea-scroll-height.html [ NeedsRebaseline ] +crbug.com/593184 fast/forms/textarea/textarea-scrollbar.html [ NeedsRebaseline ] +crbug.com/593184 fast/forms/textarea/textarea-scrolled-focus-ring.html [ NeedsRebaseline ] +crbug.com/593184 fast/forms/textarea/textarea-scrolled-mask.html [ NeedsRebaseline ] +crbug.com/593184 fast/forms/textarea/textarea-scrolled-type.html [ NeedsRebaseline ] +crbug.com/593184 fast/forms/textarea/textarea-width.html [ NeedsRebaseline ] +crbug.com/593184 fast/parser/open-comment-in-textarea.html [ NeedsRebaseline ] +crbug.com/593184 fast/text/international/unicode-bidi-plaintext-in-textarea.html [ NeedsRebaseline ] # Ref tests that needs investigation. crbug.com/404597 [ Mac ] fast/css3-text/css3-text-justify/text-justify-crash.html [ Failure ] @@ -987,6 +994,8 @@ crbug.com/336604 imported/csswg-test/css-flexbox-1/flexbox_visibility-collapse.html [ Failure ] crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-width-flex-items-006.xht [ Failure ] +crbug.com/519124 fast/text/zero-font-size.html [ NeedsRebaseline ] + crbug.com/467127 imported/csswg-test/css-flexbox-1/flex-grow-006.html [ Failure ] crbug.com/467127 imported/csswg-test/css-flexbox-1/flexbox_justifycontent-center-overflow.html [ Failure ] crbug.com/467127 imported/csswg-test/css-flexbox-1/getcomputedstyle/flexbox_computedstyle_align-items-invalid.html [ Failure ] @@ -1227,6 +1236,8 @@ crbug.com/353746 virtual/android/fullscreen/video-specified-size.html [ Failure Pass ] +crbug.com/589525 svg/text/lengthAdjust-text-metrics.html [ NeedsRebaseline ] + crbug.com/527270 accessibility/name-calc-img.html [ Failure Pass Timeout ] # This test has different results in Debug and Release. @@ -1333,8 +1344,6 @@ crbug.com/588061 [ Debug ] inspector/sources/debugger-breakpoints/debugger-reload-breakpoints-with-source-maps.html [ Pass Failure ] -crbug.com/248063 [ Win ] plugins/plugin-clip-subframe.html [ Pass Failure ] - crbug.com/588103 fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer.html [ Pass Failure ] crbug.com/591821 fast/events/iframe-object-onload.html [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/fast/block/float/block-with-negative-margin-clears-float-expected.txt b/third_party/WebKit/LayoutTests/fast/block/float/block-with-negative-margin-clears-float-expected.txt new file mode 100644 index 0000000..1a567a8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/block/float/block-with-negative-margin-clears-float-expected.txt
@@ -0,0 +1,3 @@ +crbug.com/591243: Clear floats when we have negative margin and are separated from the float by a div that doesn't track it. + + PASS
diff --git a/third_party/WebKit/LayoutTests/fast/block/float/block-with-negative-margin-clears-float.html b/third_party/WebKit/LayoutTests/fast/block/float/block-with-negative-margin-clears-float.html new file mode 100644 index 0000000..680874df --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/block/float/block-with-negative-margin-clears-float.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<style> + #container { + width: 100px; + } + + .float { + float: right; + height: 50px; + width: 100%; + background: green; + } + + #clear { + clear: both; + height: 1px; + } + + #next { + margin-top: -50px; + line-height: 0; + } + + span { + display: inline-block; + width: 100%; + height: 50px; + background: green; + } +</style> +<p>crbug.com/591243: Clear floats when we have negative margin and are separated from the float by a div that doesn't track it.</p> +<div id="container" data-expected-height=100> + <div class="float"></div> + <div id="clear"></div> + <div id="next"> + <span></span> + </div> +</div> +<script src="../../../resources/check-layout.js"></script> +<script> + checkLayout("#container"); +</script> +
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-content-alignment-and-self-alignment-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-content-alignment-and-self-alignment-expected.txt index e7c4fbd..80a6647b 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-content-alignment-and-self-alignment-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-content-alignment-and-self-alignment-expected.txt
@@ -24,6 +24,30 @@ direction: LTR | distribution: 'stretch' | self-alignment: end PASS +direction: LTR | distribution: 'default' | self-alignment: center + +PASS +direction: LTR | distribution: 'default' | self-alignment: end + +PASS +direction: LTR | distribution: 'space-between' | self-alignment: center + +PASS +direction: LTR | distribution: 'space-between' | self-alignment: end + +PASS +direction: LTR | rows/columns gap: 20px/40px | distribution: 'default' | self-alignment: center + +PASS +direction: LTR | rows/columns gap: 20px/40px | distribution: 'default' | self-alignment: end + +PASS +direction: LTR | rows/columns gap: 20px/40px | distribution: 'space-between' | self-alignment: center + +PASS +direction: LTR | rows/columns gap: 20px/40px | distribution: 'space-between' | self-alignment: end + +PASS direction: RTL | distribution: 'space-between' | self-alignment: center PASS @@ -48,3 +72,27 @@ direction: RTL | distribution: 'stretch' | self-alignment: end PASS +direction: RTL | distribution: 'default' | self-alignment: center + +PASS +direction: RTL | distribution: 'default' | self-alignment: end + +PASS +direction: RTL | distribution: 'space-between' | self-alignment: center + +PASS +direction: RTL | distribution: 'space-between' | self-alignment: end + +PASS +direction: RTL | rows/columns gap: 20px/40px | distribution: 'default' | self-alignment: center + +PASS +direction: RTL | rows/columns gap: 20px/40px | distribution: 'default' | self-alignment: end + +PASS +direction: RTL | rows/columns gap: 20px/40px | distribution: 'space-between' | self-alignment: center + +PASS +direction: RTL | rows/columns gap: 20px/40px | distribution: 'space-between' | self-alignment: end + +PASS
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-content-alignment-and-self-alignment.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-content-alignment-and-self-alignment.html index 8e8768c..60aa726 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-content-alignment-and-self-alignment.html +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-content-alignment-and-self-alignment.html
@@ -10,14 +10,39 @@ } .grid { + position: relative; +} +.spanningTwo { grid-auto-columns: 20px; grid-auto-rows: 40px; grid-template-areas: "a a b" "c d b"; - position: relative; width: 300px; height: 200px; } +.spanningThree { + grid-auto-columns: 50px; + grid-auto-rows: 50px; + grid-template-areas: ". . . . . ." + ". b b b c ." + ". . . . c ." + ". . . . c ." + ". . . . . ."; + width: 550px; + height: 450px; +} + +.gridRowColumnGaps { + grid-row-gap: 20px; + grid-column-gap: 10px; +} + +.i1 { grid-row: 1; } +.i2 { grid-row: 2; } +.i3 { grid-row: 3; grid-column: 6; } +.i4 { grid-row: 4; grid-column: 6; } +.i5 { grid-row: 5; grid-column: 6; } + .a { grid-area: a; background-color: blue; @@ -39,11 +64,14 @@ grid-auto-rows: minmax(40px, auto); } - .cell { width: 20px; height: 40px; } +.cell1 { + width: 20px; + height: 20px; +} </style> </head> <body onload="checkLayout('.grid')"> @@ -52,7 +80,7 @@ <div style="position: relative"> <p>direction: LTR | distribution: 'space-between' | self-alignment: center</p> - <div class="grid contentSpaceBetween" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceBetween" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfCenter" data-offset-x="70" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfCenter" data-offset-x="280" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="0" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div> @@ -62,7 +90,7 @@ <div style="position: relative"> <p>direction: LTR | distribution: 'space-between' | self-alignment: end</p> - <div class="grid contentSpaceBetween" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceBetween" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfEnd" data-offset-x="140" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfEnd" data-offset-x="280" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="0" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div> @@ -72,7 +100,7 @@ <div style="position: relative"> <p>direction: LTR | distribution: 'space-around' | self-alignment: center</p> - <div class="grid contentSpaceAround" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceAround" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfCenter" data-offset-x="90" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfCenter" data-offset-x="240" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="40" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div> @@ -82,7 +110,7 @@ <div style="position: relative"> <p>direction: LTR | distribution: 'space-around' | self-alignment: end</p> - <div class="grid contentSpaceAround" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceAround" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfEnd" data-offset-x="140" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfEnd" data-offset-x="240" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="40" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div> @@ -92,7 +120,7 @@ <div style="position: relative"> <p>direction: LTR | distribution: 'space-evenly' | self-alignment: center</p> - <div class="grid contentSpaceEvenly" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceEvenly" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfCenter" data-offset-x="100" data-offset-y="40" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfCenter" data-offset-x="220" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="60" data-offset-y="120" data-expected-width="20" data-expected-height="40"></div> @@ -102,7 +130,7 @@ <div style="position: relative"> <p>direction: LTR | distribution: 'space-evenly' | self-alignment: end</p> - <div class="grid contentSpaceEvenly" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceEvenly" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfEnd" data-offset-x="140" data-offset-y="40" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfEnd" data-offset-x="220" data-offset-y="120" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="60" data-offset-y="120" data-expected-width="20" data-expected-height="40"></div> @@ -112,7 +140,7 @@ <div style="position: relative"> <p>direction: LTR | distribution: 'stretch' | self-alignment: center</p> - <div class="grid stretchedGrid contentStretch" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo stretchedGrid contentStretch" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfCenter alignSelfCenter" data-offset-x="90" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div> <div class="b cell justifySelfCenter alignSelfCenter" data-offset-x="240" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="0" data-offset-y="100" data-expected-width="100" data-expected-height="100"></div> @@ -122,7 +150,7 @@ <div style="position: relative"> <p>direction: LTR | distribution: 'stretch' | self-alignment: end</p> - <div class="grid stretchedGrid contentStretch" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo stretchedGrid contentStretch" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfEnd alignSelfEnd" data-offset-x="180" data-offset-y="60" data-expected-width="20" data-expected-height="40"></div> <div class="b cell justifySelfEnd alignSelfEnd" data-offset-x="280" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="0" data-offset-y="100" data-expected-width="100" data-expected-height="100"></div> @@ -130,10 +158,164 @@ </div> </div> +<div style="position: relative"> + <p>direction: LTR | distribution: 'default' | self-alignment: center</p> + <div class="grid spanningThree"> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfCenter" data-offset-x="115" data-offset-y="50" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfCenter" data-offset-x="200" data-offset-y="115" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: LTR | distribution: 'default' | self-alignment: end</p> + <div class="grid spanningThree"> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfEnd" data-offset-x="180" data-offset-y="50" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfEnd" data-offset-x="200" data-offset-y="180" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: LTR | distribution: 'space-between' | self-alignment: center</p> + <div class="grid spanningThree contentSpaceBetween"> + <div class="i1" style="background: blue;"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfCenter" data-offset-x="215" data-offset-y="100" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfCenter" data-offset-x="400" data-offset-y="215" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: LTR | distribution: 'space-between' | self-alignment: end</p> + <div class="grid spanningThree contentSpaceBetween"> + <div class="i1" style="background: blue;"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfEnd" data-offset-x="330" data-offset-y="100" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfEnd" data-offset-x="400" data-offset-y="330" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: LTR | rows/columns gap: 20px/40px | distribution: 'default' | self-alignment: center</p> + <div class="grid spanningThree gridRowColumnGaps"> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfCenter" data-offset-x="135" data-offset-y="70" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfCenter" data-offset-x="240" data-offset-y="155" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: LTR | rows/columns gap: 20px/40px | distribution: 'default' | self-alignment: end</p> + <div class="grid spanningThree gridRowColumnGaps"> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfEnd" data-offset-x="210" data-offset-y="70" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfEnd" data-offset-x="240" data-offset-y="240" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<!-- Same expected result than without gaps because space-between just use the remaining availalbe space. --> +<div style="position: relative"> + <p>direction: LTR | rows/columns gap: 20px/40px | distribution: 'space-between' | self-alignment: center</p> + <div class="grid spanningThree contentSpaceBetween gridRowColumnGaps"> + <div class="i1" style="background: blue;"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfCenter" data-offset-x="215" data-offset-y="100" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfCenter" data-offset-x="400" data-offset-y="215" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<!-- Same expected result than without gaps because space-between just use the remaining availalbe space. --> +<div style="position: relative"> + <p>direction: LTR | rows/columns gap: 20px/40px | distribution: 'space-between' | self-alignment: end</p> + <div class="grid spanningThree contentSpaceBetween gridRowColumnGaps"> + <div class="i1" style="background: blue;"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfEnd" data-offset-x="330" data-offset-y="100" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfEnd" data-offset-x="400" data-offset-y="330" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + <!-- RTL direction. --> <div style="position: relative"> <p>direction: RTL | distribution: 'space-between' | self-alignment: center</p> - <div class="grid contentSpaceBetween directionRTL" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceBetween directionRTL" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfCenter" data-offset-x="210" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfCenter" data-offset-x="0" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="280" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div> @@ -143,7 +325,7 @@ <div style="position: relative"> <p>direction: RTL | distribution: 'space-between' | self-alignment: end</p> - <div class="grid contentSpaceBetween directionRTL" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceBetween directionRTL" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfEnd" data-offset-x="140" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfEnd" data-offset-x="0" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="280" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div> @@ -153,7 +335,7 @@ <div style="position: relative"> <p>direction: RTL | distribution: 'space-around' | self-alignment: center</p> - <div class="grid contentSpaceAround directionRTL" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceAround directionRTL" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfCenter" data-offset-x="190" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfCenter" data-offset-x="40" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="240" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div> @@ -163,7 +345,7 @@ <div style="position: relative"> <p>direction: RTL | distribution: 'space-around' | self-alignment: end</p> - <div class="grid contentSpaceAround directionRTL" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceAround directionRTL" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfEnd" data-offset-x="140" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfEnd" data-offset-x="40" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="240" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div> @@ -173,7 +355,7 @@ <div style="position: relative"> <p>direction: RTL | distribution: 'space-evenly' | self-alignment: center</p> - <div class="grid contentSpaceEvenly directionRTL" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceEvenly directionRTL" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfCenter" data-offset-x="180" data-offset-y="40" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfCenter" data-offset-x="60" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="220" data-offset-y="120" data-expected-width="20" data-expected-height="40"></div> @@ -183,7 +365,7 @@ <div style="position: relative"> <p>direction: RTL | distribution: 'space-evenly' | self-alignment: end</p> - <div class="grid contentSpaceEvenly directionRTL" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo contentSpaceEvenly directionRTL" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfEnd" data-offset-x="140" data-offset-y="40" data-expected-width="20" data-expected-height="40"></div> <div class="b cell alignSelfEnd" data-offset-x="60" data-offset-y="120" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="220" data-offset-y="120" data-expected-width="20" data-expected-height="40"></div> @@ -193,7 +375,7 @@ <div style="position: relative"> <p>direction: RTL | distribution: 'stretch' | self-alignment: center</p> - <div class="grid stretchedGrid contentStretch directionRTL" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo stretchedGrid contentStretch directionRTL" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfCenter alignSelfCenter" data-offset-x="190" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div> <div class="b cell justifySelfCenter alignSelfCenter" data-offset-x="40" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="200" data-offset-y="100" data-expected-width="100" data-expected-height="100"></div> @@ -203,7 +385,7 @@ <div style="position: relative"> <p>direction: RTL | distribution: 'stretch' | self-alignment: end</p> - <div class="grid stretchedGrid contentStretch directionRTL" data-expected-width="300" data-expected-height="200"> + <div class="grid spanningTwo stretchedGrid contentStretch directionRTL" data-expected-width="300" data-expected-height="200"> <div class="a cell justifySelfEnd alignSelfEnd" data-offset-x="100" data-offset-y="60" data-expected-width="20" data-expected-height="40"></div> <div class="b cell justifySelfEnd alignSelfEnd" data-offset-x="0" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div> <div class="c" data-offset-x="200" data-offset-y="100" data-expected-width="100" data-expected-height="100"></div> @@ -211,5 +393,157 @@ </div> </div> +<div style="position: relative"> + <p>direction: RTL | distribution: 'default' | self-alignment: center</p> + <div class="grid spanningThree directionRTL"> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfCenter" data-offset-x="415" data-offset-y="50" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfCenter" data-offset-x="330" data-offset-y="115" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: RTL | distribution: 'default' | self-alignment: end</p> + <div class="grid spanningThree directionRTL"> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfEnd" data-offset-x="350" data-offset-y="50" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfEnd" data-offset-x="330" data-offset-y="180" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: RTL | distribution: 'space-between' | self-alignment: center</p> + <div class="grid spanningThree contentSpaceBetween directionRTL"> + <div class="i1" style="background: blue;"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfCenter" data-offset-x="315" data-offset-y="100" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfCenter" data-offset-x="130" data-offset-y="215" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: RTL | distribution: 'space-between' | self-alignment: end</p> + <div class="grid spanningThree contentSpaceBetween directionRTL"> + <div class="i1" style="background: blue;"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfEnd" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfEnd" data-offset-x="130" data-offset-y="330" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: RTL | rows/columns gap: 20px/40px | distribution: 'default' | self-alignment: center</p> + <div class="grid spanningThree gridRowColumnGaps directionRTL"> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfCenter" data-offset-x="395" data-offset-y="70" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfCenter" data-offset-x="290" data-offset-y="155" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: RTL | rows/columns gap: 20px/40px | distribution: 'default' | self-alignment: end</p> + <div class="grid spanningThree gridRowColumnGaps directionRTL"> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfEnd" data-offset-x="320" data-offset-y="70" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfEnd" data-offset-x="290" data-offset-y="240" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: RTL | rows/columns gap: 20px/40px | distribution: 'space-between' | self-alignment: center</p> + <div class="grid spanningThree contentSpaceBetween gridRowColumnGaps directionRTL"> + <div class="i1" style="background: blue;"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfCenter" data-offset-x="315" data-offset-y="100" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfCenter" data-offset-x="130" data-offset-y="215" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + +<div style="position: relative"> + <p>direction: RTL | rows/columns gap: 20px/40px | distribution: 'space-between' | self-alignment: end</p> + <div class="grid spanningThree contentSpaceBetween gridRowColumnGaps directionRTL"> + <div class="i1" style="background: blue;"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i1" style="background: blue"></div> + <div class="i1" style="background: red"></div> + <div class="i2" style="background: red"></div> + <div class="i2" style="background: blue"></div> + <div class="b cell1 justifySelfEnd" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="20"></div> + <div class="c cell1 alignSelfEnd" data-offset-x="130" data-offset-y="330" data-expected-width="20" data-expected-height="20"></div> + <div class="i3" style="background: red"></div> + <div class="i4" style="background: blue"></div> + <div class="i5" style="background: red"></div> + </div> +</div> + </body> </html>
diff --git a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html index f79c6dbe..f268655 100644 --- a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html +++ b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html
@@ -69,8 +69,7 @@ } shouldBeEqualToNumber("lastPointerEvent.pointerId", 1); - // TODO(crbug.com/557817): linux_chromium_rel_ng fails here, sets to empty string. - // shouldBeEqualToString("lastPointerEvent.pointerType", "mouse"); + shouldBeEqualToString("lastPointerEvent.pointerType", "mouse"); shouldBeTrue("lastPointerEvent.isPrimary"); numericAttributes.forEach(function(attribute) {
diff --git a/third_party/WebKit/LayoutTests/fast/events/pointerevents/touch-pointer-event-properties.html b/third_party/WebKit/LayoutTests/fast/events/pointerevents/touch-pointer-event-properties.html index 0b0f118..9ebfd50 100644 --- a/third_party/WebKit/LayoutTests/fast/events/pointerevents/touch-pointer-event-properties.html +++ b/third_party/WebKit/LayoutTests/fast/events/pointerevents/touch-pointer-event-properties.html
@@ -22,7 +22,7 @@ test(function() { assert_between_inclusive(event.pointerId, 1, POINTER_PROPERTIES.length); var pp = POINTER_PROPERTIES[event.pointerId-1]; - for ( var i in pp ) + for (var i in pp) assert_equals(event[i], pp[i], "" + i); }, "Pointer event properties for pointer " + event.pointerId + " on " + event.type); } @@ -34,19 +34,22 @@ var x = target0.offsetLeft + 2; var y = target0.offsetTop + 2; - for ( var i = 0 ; i < POINTER_PROPERTIES.length ; ++i ) { + for (var i = 0 ; i < POINTER_PROPERTIES.length; ++i) { var pp = POINTER_PROPERTIES[i]; - eventSender.addTouchPoint(x + i, y + i, pp["width"], pp["height"], pp["pressure"], pp["tiltX"], pp["tiltY"], pp["pointerType"]); + if (i != POINTER_PROPERTIES.length-1) + eventSender.addTouchPoint(x + i, y + i, pp["width"], pp["height"], pp["pressure"], pp["tiltX"], pp["tiltY"], pp["pointerType"]); + else // Test default pointerType + eventSender.addTouchPoint(x + i, y + i, pp["width"], pp["height"], pp["pressure"], pp["tiltX"], pp["tiltY"]); } eventSender.touchStart(); - for ( var i = 0 ; i < POINTER_PROPERTIES.length ; ++i ) { + for (var i = 0 ; i < POINTER_PROPERTIES.length; ++i) { var pp = POINTER_PROPERTIES[i]; eventSender.updateTouchPoint(i, x + i + 20, y + i + 20); } eventSender.touchMove(); - for ( var i = 0 ; i < POINTER_PROPERTIES.length ; ++i ) + for (var i = 0 ; i < POINTER_PROPERTIES.length ; ++i) eventSender.releaseTouchPoint(i); eventSender.touchEnd();
diff --git a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-preline-eol-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-preline-eol-expected.txt index dac87d7..2c3c90c 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-preline-eol-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-preline-eol-expected.txt
@@ -1,4 +1,4 @@ This is a testharness.js-based test. -FAIL TEXTAREA with white-space:pre-line should not produce nbsp by Enter key assert_equals: expected "P1\n\nP2\n\n\n\nP3\n" but got "P1\n\nP2\n\n \nP3\n" +FAIL TEXTAREA with white-space:pre-line should not produce nbsp by Enter key assert_equals: expected "P1\n\nP2\n\n\n\nP3\n" but got "P1\n\nP2\n\n P3\n" Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/scroll-during-selection-expected.txt b/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/scroll-during-selection-expected.txt new file mode 100644 index 0000000..25670b1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/scroll-during-selection-expected.txt
@@ -0,0 +1,11 @@ +TEXT +This test verifies that text selection does not prevent smooth scrolls running on the main thread. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS scrollY became 40 +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html b/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html new file mode 100644 index 0000000..03bedac --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html
@@ -0,0 +1,39 @@ +<!DOCTYPE html> +<script src="../../../resources/js-test.js"></script> +<style> +body { + height: 1000px; +} +#fixed { + position:fixed; + right: 20px; + width: 100px; + height: 40px; + background-color: #ace; +} +#text { + font: bold 18pt monospace; +} +</style> +<div id="fixed"></div> +<div id="text">TEXT</div> +<div id="console"></div> +<script> + +var jsTestIsAsync = true; + +description( + "This test verifies that text selection does not prevent smooth " + + "scrolls running on the main thread."); + +eventSender.dragMode = false; + +// Start a text selection. +eventSender.mouseMoveTo(20, 20); +eventSender.mouseDown(); +eventSender.mouseMoveTo(40, 20); + +eventSender.mouseScrollBy(0, -1); +shouldBecomeEqual("scrollY", "40", finishJSTest); + +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js index fe55ddb..1db91d7 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
@@ -225,6 +225,13 @@ return ".../" + value.substr(lastIndex); } +InspectorTest.formatters.formatAsDescription = function(value) +{ + if (!value) + return value; + return "\"" + value.replace(/^function [gs]et /, "function ") + "\""; +} + InspectorTest.addObject = function(object, customFormatters, prefix, firstLinePrefix) { prefix = prefix || "";
diff --git a/third_party/WebKit/LayoutTests/http/tests/intersection-observer/iframe-cross-origin.html b/third_party/WebKit/LayoutTests/http/tests/intersection-observer/iframe-cross-origin.html index 3324515..0132d6d5 100644 --- a/third_party/WebKit/LayoutTests/http/tests/intersection-observer/iframe-cross-origin.html +++ b/third_party/WebKit/LayoutTests/http/tests/intersection-observer/iframe-cross-origin.html
@@ -61,7 +61,11 @@ } window.addEventListener("message", handleMessage); + iframe.onload = function() { - iframe.contentWindow.postMessage("", "*") -}; + // See LayoutTests/intersection-observer/README for explanation of double RAF. + requestAnimationFrame(() => { + requestAnimationFrame(() => { iframe.contentWindow.postMessage("", "*") }) + }); +} </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/intersection-observer/resources/cross-origin-subframe.html b/third_party/WebKit/LayoutTests/http/tests/intersection-observer/resources/cross-origin-subframe.html index d2a40dd..eda791fa 100644 --- a/third_party/WebKit/LayoutTests/http/tests/intersection-observer/resources/cross-origin-subframe.html +++ b/third_party/WebKit/LayoutTests/http/tests/intersection-observer/resources/cross-origin-subframe.html
@@ -14,60 +14,54 @@ // Instead of RAF-ing, we just post an empty message to the parent window, which will // RAF when it is received, and then send us a message to cause the next step to run. -function observer_callback(changes) { - for (var i in changes) - entries.push(changes[i]); -} - // Use a rootMargin here, and verify it does NOT get applied for the cross-origin case. -var observer = new IntersectionObserver(observer_callback, {rootMargin: "7px"}); +var observer = new IntersectionObserver( + changes => { entries = entries.concat(changes) }, + { rootMargin: "7px" } +); observer.observe(target); function step0() { - setTimeout(function() { - nextStep = step1; - port.postMessage({actual: entries.map(entryToJson), expected: []}, "*"); - entries = []; - port.postMessage({scrollTo: 200}, "*"); - }); + entries = entries.concat(observer.takeRecords()); + nextStep = step1; + port.postMessage({actual: entries.map(entryToJson), expected: []}, "*"); + entries = []; + port.postMessage({scrollTo: 200}, "*"); } function step1() { - setTimeout(function() { - port.postMessage({actual: entries.map(entryToJson), expected: []}, "*"); - entries = []; - scroller.scrollTop = 250; - nextStep = step2; - port.postMessage({}, "*"); - }); + entries = entries.concat(observer.takeRecords()); + port.postMessage({actual: entries.map(entryToJson), expected: []}, "*"); + entries = []; + scroller.scrollTop = 250; + nextStep = step2; + port.postMessage({}, "*"); } function step2() { - setTimeout(function() { - var expected = [{ - boundingClientRect: coordinatesToClientRectJson(-42, 108, 58, 8), - intersectionRect: coordinatesToClientRectJson(0, 108, 58, 8), - rootBounds: "null", - target: target.id - }]; - port.postMessage({actual: entries.map(entryToJson), expected: expected}, "*"); - entries = []; - nextStep = step3; - port.postMessage({scrollTo: 100}, "*"); - }); + entries = entries.concat(observer.takeRecords()); + var expected = [{ + boundingClientRect: coordinatesToClientRectJson(-42, 108, 58, 8), + intersectionRect: coordinatesToClientRectJson(0, 108, 58, 8), + rootBounds: "null", + target: target.id + }]; + port.postMessage({actual: entries.map(entryToJson), expected: expected}, "*"); + entries = []; + nextStep = step3; + port.postMessage({scrollTo: 100}, "*"); } function step3() { - setTimeout(function() { - var expected = [{ - boundingClientRect: coordinatesToClientRectJson(-42, 108, 58, 8), - intersectionRect: coordinatesToClientRectJson(0, 0, 0, 0), - rootBounds: "null", - target: target.id - }]; - port.postMessage({actual: entries.map(entryToJson), expected: expected}, "*"); - port.postMessage({DONE: 1}, "*"); - }); + entries = entries.concat(observer.takeRecords()); + var expected = [{ + boundingClientRect: coordinatesToClientRectJson(-42, 108, 58, 8), + intersectionRect: coordinatesToClientRectJson(0, 0, 0, 0), + rootBounds: "null", + target: target.id + }]; + port.postMessage({actual: entries.map(entryToJson), expected: expected}, "*"); + port.postMessage({DONE: 1}, "*"); } function handleMessage(event)
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/pushmessagedata-worker.js b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/pushmessagedata-worker.js index 16fa54b7..df0ba48 100644 --- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/pushmessagedata-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/pushmessagedata-worker.js
@@ -27,32 +27,9 @@ }, 'PushEvent can be initialized from ArrayBuffer, ArrayBufferView and USVStrings.'); test(function() { - var pushMessageData = createPushMessageData(); + assert_equals(createPushMessageData(undefined), null); - assert_equals(pushMessageData.arrayBuffer().byteLength, 0); - - assert_equals(pushMessageData.blob().size, 0); - assert_equals(pushMessageData.blob().type, ''); - - // PushMessageData.json() is specified to be identical to JSON.parse() with - // the message's data as the argument. JSON.parse('') throws an exception, - // so verify that calling json() without a body throws the same exception. - try { - pushMessageData.json(); - assert_unreached('Expected an exception to be thrown.'); - } catch (eventDataException) { - try { - JSON.parse(''); - assert_unreached('Expected an exception to be thrown.'); - } catch (jsonParseException) { - assert_equals(eventDataException.name, jsonParseException.name); - assert_equals(eventDataException.message, jsonParseException.message); - } - } - - assert_equals(pushMessageData.text().length, 0); - -}, 'PushMessageData is empty by default.'); +}, 'PushMessageData is null by default.'); test(function() { const binaryContents = [1, 2, 3];
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-from-sharedworker.html b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-from-sharedworker.html index 79fa7169..102908d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-from-sharedworker.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-from-sharedworker.html
@@ -1,5 +1,6 @@ <script> var w = new SharedWorker("/security/cors-rfc1918/resources/post-addressspace-to-owner.js"); + w.onerror = function (e) { window.parent.postMessage({ "origin": e.name }, "*"); } w.port.onmessage = function (e) { window.parent.postMessage(e.data, "*"); }
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/debugger/access-obsolete-frame-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/debugger/access-obsolete-frame-expected.txt index fbe6c23..856e153 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/debugger/access-obsolete-frame-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector-protocol/debugger/access-obsolete-frame-expected.txt
@@ -6,6 +6,4 @@ PASS, error message as expected setVariableValue PASS, error message as expected -getStepInPositions -PASS, error message as expected
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/debugger/access-obsolete-frame.html b/third_party/WebKit/LayoutTests/inspector-protocol/debugger/access-obsolete-frame.html index bd1f320..b4bb0e5c5 100644 --- a/third_party/WebKit/LayoutTests/inspector-protocol/debugger/access-obsolete-frame.html +++ b/third_party/WebKit/LayoutTests/inspector-protocol/debugger/access-obsolete-frame.html
@@ -15,18 +15,18 @@ InspectorTest.eventHandler["Debugger.paused"] = handleDebuggerPausedOne; InspectorTest.sendCommand("Runtime.evaluate", { "expression": "setTimeout(testFunction, 0)" }); - + var obsoleteTopFrameId; - + function handleDebuggerPausedOne(messageObject) { InspectorTest.log("Paused on 'debugger;'"); var topFrame = messageObject.params.callFrames[0]; obsoleteTopFrameId = topFrame.callFrameId; - + InspectorTest.eventHandler["Debugger.paused"] = undefined; - + InspectorTest.sendCommand("Debugger.resume", { }, callbackResume); } @@ -36,34 +36,27 @@ InspectorTest.log("restartFrame"); InspectorTest.sendCommand("Debugger.restartFrame", { callFrameId: obsoleteTopFrameId }, callbackRestartFrame); } - + function callbackRestartFrame(response) { logErrorResponse(response); InspectorTest.log("evaluateOnFrame"); InspectorTest.sendCommand("Debugger.evaluateOnCallFrame", { callFrameId: obsoleteTopFrameId, expression: "0"} , callbackEvaluate); } - + function callbackEvaluate(response) { logErrorResponse(response); InspectorTest.log("setVariableValue"); InspectorTest.sendCommand("Debugger.setVariableValue", { callFrameId: obsoleteTopFrameId, scopeNumber: 0, variableName: "a", newValue: { value: 0 } }, callbackSetVariableValue); } - + function callbackSetVariableValue(response) { logErrorResponse(response); - InspectorTest.log("getStepInPositions"); - InspectorTest.sendCommand("Debugger.getStepInPositions", { callFrameId: obsoleteTopFrameId }, callbackGetStepInPositions); - } - - function callbackGetStepInPositions(response) - { - logErrorResponse(response); InspectorTest.completeTest(); } - + function logErrorResponse(response) { if (response.error) {
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/debugger/getStepInPositions-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/debugger/getStepInPositions-expected.txt deleted file mode 100644 index c43ca16..0000000 --- a/third_party/WebKit/LayoutTests/inspector-protocol/debugger/getStepInPositions-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -Paused on 'debugger;' -Paused on the next statement -PASS -
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/debugger/getStepInPositions.html b/third_party/WebKit/LayoutTests/inspector-protocol/debugger/getStepInPositions.html deleted file mode 100644 index 0f34335..0000000 --- a/third_party/WebKit/LayoutTests/inspector-protocol/debugger/getStepInPositions.html +++ /dev/null
@@ -1,54 +0,0 @@ -<html> -<head> -<script type="text/javascript" src="../../http/tests/inspector-protocol/inspector-protocol-test.js"></script> -<script> - -function TestFunction() -{ - debugger; - f(f1(2, 4), - f2(f3(), f4(5))); -} - -function test() -{ - InspectorTest.sendCommand("Debugger.enable", {}); - - InspectorTest.eventHandler["Debugger.paused"] = handleDebuggerPausedOne; - - InspectorTest.sendCommand("Runtime.evaluate", { "expression": "setTimeout(TestFunction, 0)" }); - - function handleDebuggerPausedOne(messageObject) - { - InspectorTest.log("Paused on 'debugger;'"); - - InspectorTest.eventHandler["Debugger.paused"] = handleDebuggerPausedTwo; - InspectorTest.sendCommand("Debugger.stepOver", { }); - } - - function handleDebuggerPausedTwo(messageObject) - { - InspectorTest.log("Paused on the next statement"); - var topFrame = messageObject.params.callFrames[0]; - - InspectorTest.eventHandler["Debugger.paused"] = undefined; - - InspectorTest.sendCommand("Debugger.getStepInPositions", { callFrameId: topFrame.callFrameId }, callbackGetStepInPositions); - } - - function callbackGetStepInPositions(response) - { - var positions = response.result.stepInPositions; - if (positions.length >= 3) - InspectorTest.log("PASS"); - else - InspectorTest.log("FAIL"); - - InspectorTest.completeTest(); - } -} -</script> -</head> -<body onLoad="runTest();"> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/input/eventTimestamp-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/input/eventTimestamp-expected.txt new file mode 100644 index 0000000..796c9ab --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/input/eventTimestamp-expected.txt
@@ -0,0 +1,21 @@ +-----Event----- +type: keydown +-----Event----- +type: keydown +-----Event----- +type: mousedown +-----Event----- +type: mousedown +-----Event----- +type: touchstart +-----Event----- +type: touchstart +-----Verify----- +Received 6 timestamps +timeStamps offsets is as expected. +timeStamps offsets is as expected. +timeStamps offsets is as expected. +timeStamps offsets is as expected. +timeStamps offsets is as expected. +timeStamps offsets is as expected. +
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/input/eventTimestamp.html b/third_party/WebKit/LayoutTests/inspector-protocol/input/eventTimestamp.html new file mode 100644 index 0000000..fe385b95 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/input/eventTimestamp.html
@@ -0,0 +1,124 @@ +<script type="text/javascript" src="../../http/tests/inspector-protocol/inspector-protocol-test.js"></script> +<script> +window.addEventListener("keydown", logEvent); +window.addEventListener("mousedown", logEvent); +window.addEventListener("touchstart", logEvent); + +var receivedTimestamps = []; + +function logEvent(event) +{ + log("-----Event-----"); + log("type: " + event.type); + receivedTimestamps.push(event.timeStamp); +} + +function verifyTimestamps() +{ + log("-----Verify-----"); + log("Received " + receivedTimestamps.length + " timestamps"); + + // Event.timeStamp values are in milliseconds + var expectedOffsets = [0, 5000, 10000, 15000, 20000, 25000]; + var receivedOffsets = receivedTimestamps.map(function(timestamp) { + return timestamp - receivedTimestamps[0]; + }); + for (var i = 0; i < receivedOffsets.length; ++i) { + if (isNear(receivedOffsets[i], expectedOffsets[i])) + log("timeStamps offsets is as expected."); + else + log("timeStamp offset is expected " + expectedOffsets[i] + " but it is:" + receivedOffsets[i]); + } + + function isNear(a, b) { + var epsilon = 0.5; + return Math.abs(b - a) < epsilon; + } + +} + +function test() +{ + // We send epoch timestamp but expect to receive high-res timestamps + var baseEpochTimestamp = Date.now() / 1000; // in seconds + var sentTimestamps = [0, 5, 10, 15, 20, 25].map(function(offset) { + return baseEpochTimestamp + offset; + }); + + var commands = [{ + value: "Input.dispatchKeyEvent", + event: { + "type": "rawKeyDown", + "timestamp": sentTimestamps[0] + } + }, { + value: "Input.dispatchKeyEvent", + event: { + "type": "rawKeyDown", + "timestamp": sentTimestamps[1] + } + }, { + value: "Input.dispatchMouseEvent", + event: { + "type": "mousePressed", + "timestamp": sentTimestamps[2], + "button": "left", + "clickCount": 1, + "x": 100, + "y": 200 + } + }, { + value: "Input.dispatchMouseEvent", + event: { + "type": "mousePressed", + "timestamp": sentTimestamps[3], + "button": "left", + "clickCount": 1, + "x": 100, + "y": 200 + } + }, { + value: "Input.dispatchTouchEvent", + event: { + "type": "touchStart", + "timestamp": sentTimestamps[4], + "touchPoints": [{ + "state": "touchPressed", + "x": 100, + "y": 200 + }] + } + }, { + value: "Input.dispatchTouchEvent", + event: { + "type": "touchStart", + "timestamp": sentTimestamps[5], + "touchPoints": [{ + "state": "touchPressed", + "x": 100, + "y": 100 + }] + + } + }]; + + for (var i = 0; i < commands.length; i++) + InspectorTest.sendCommand(commands[i].value, commands[i].event, checkResponse.bind(undefined, i == commands.length - 1)); + + function checkResponse(isLastCommand, msg) + { + if (msg.error) + InspectorTest.log("Error: " + msg.error.message); + if (isLastCommand) { + InspectorTest.sendCommandOrDie("Runtime.evaluate", { + expression: 'verifyTimestamps()' + }, function() { + InspectorTest.completeTest(); + }); + } + } +} +</script> + +<body onload="runTest()"> +</body> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-eval-scoped-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-eval-scoped-expected.txt index 02042e71..0208a3f5 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-eval-scoped-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/console/console-eval-scoped-expected.txt
@@ -21,7 +21,7 @@ enumerable : true get : { className : "Function" - description : "function get getter() { }" + description : "function getter() { }" objectId : <string> type : "function" } @@ -41,7 +41,7 @@ name : "setter" set : { className : "Function" - description : "function set setter(_) { }" + description : "function setter(_) { }" objectId : <string> type : "function" }
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-eval-scoped.html b/third_party/WebKit/LayoutTests/inspector/console/console-eval-scoped.html index ca13df6c..14f7129 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-eval-scoped.html +++ b/third_party/WebKit/LayoutTests/inspector/console/console-eval-scoped.html
@@ -82,7 +82,7 @@ function step2(error, properties) { for (var i = 0; i < properties.length; i++) - InspectorTest.dump(properties[i], { objectId: "formatAsTypeName" }); + InspectorTest.dump(properties[i], { objectId: "formatAsTypeName", description: "formatAsDescription" }); next(); }
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt index 10717ee4..05b5249 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt
@@ -50,7 +50,7 @@ console-format-es6.html:11 Object {a: Symbol(), Symbol(a): 2} a: Symbol() getter: (...) - get getter: get getter() + get getter: getter() Symbol(a): 2 __proto__: Object console-format-es6.html:12 [Object] @@ -61,7 +61,7 @@ Object {a: Symbol(), Symbol(a): 2} a: Symbol() getter: (...) - get getter: get getter() + get getter: getter() Symbol(a): 2 __proto__: Object console-format-es6.html:11 Map {Object {a: Symbol(), Symbol(a): 2} => Object {foo: 1}}
diff --git a/third_party/WebKit/LayoutTests/inspector/runtime/runtime-getProperties-expected.txt b/third_party/WebKit/LayoutTests/inspector/runtime/runtime-getProperties-expected.txt index 5a92b89..338d884 100644 --- a/third_party/WebKit/LayoutTests/inspector/runtime/runtime-getProperties-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/runtime/runtime-getProperties-expected.txt
@@ -7,14 +7,14 @@ { enumerable : true getter : { - description : "function get foo() { return 1; }" + description : "function () { return 1; }" objectId : <string> type : "function" } isOwn : true name : "foo" setter : { - description : "function set foo(value) { }" + description : "function (value) { }" objectId : <string> type : "function" } @@ -27,7 +27,7 @@ { enumerable : true getter : { - description : "function get foo() { return 1; }" + description : "function () { return 1; }" objectId : <string> type : "function" }
diff --git a/third_party/WebKit/LayoutTests/inspector/runtime/runtime-getProperties.html b/third_party/WebKit/LayoutTests/inspector/runtime/runtime-getProperties.html index 7ec3470..40485d4 100644 --- a/third_party/WebKit/LayoutTests/inspector/runtime/runtime-getProperties.html +++ b/third_party/WebKit/LayoutTests/inspector/runtime/runtime-getProperties.html
@@ -55,7 +55,7 @@ { var value = propertyObject[fieldName]; if (value) - propertyObject[fieldName] = { type: value.type, description: value.description.replace("function foo", "function "), objectId: value.objectId }; + propertyObject[fieldName] = { type: value.type, description: value.description.replace(/^function [gs]et foo/, "function "), objectId: value.objectId }; } function dumpProperty(property)
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-aggregated-details.html b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-aggregated-details.html index 99cbeb1..a68fad9 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-aggregated-details.html +++ b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-aggregated-details.html
@@ -576,8 +576,8 @@ InspectorTest.setTraceEvents(InspectorTest.timelineModel(), InspectorTest.tracingModel(), rawTraceEvents); timeline.requestWindowTimes(0, Infinity); - for (var grouping in WebInspector.AggregatedTimelineTreeView.GroupBy) { - var groupingValue = WebInspector.AggregatedTimelineTreeView.GroupBy[grouping]; + for (var grouping in WebInspector.TimelineAggregator.GroupBy) { + var groupingValue = WebInspector.TimelineAggregator.GroupBy[grouping]; testEventTree(WebInspector.TimelinePanel.DetailsTab.CallTree, groupingValue); testEventTree(WebInspector.TimelinePanel.DetailsTab.BottomUp, groupingValue); } @@ -599,14 +599,19 @@ } var rootNode = callTree._dataGrid.rootNode(); for (var node of rootNode.children) - printEventTree(1, node._profileNode); + printEventTree(1, node._profileNode, node._treeView); } - function printEventTree(padding, node) + function printEventTree(padding, node, treeView) { - var name = node.name || (node.event.name === WebInspector.TimelineModel.RecordType.JSFrame - ? WebInspector.beautifyFunctionName(node.event.args["data"]["functionName"]) - : WebInspector.TimelineUIUtils.eventTitle(node.event)); + var name; + if (node.isGroupNode()) { + name = treeView._displayInfoForGroupNode(node).name; + } else { + name = node.event.name === WebInspector.TimelineModel.RecordType.JSFrame + ? WebInspector.beautifyFunctionName(node.event.args["data"]["functionName"]) + : WebInspector.TimelineUIUtils.eventTitle(node.event); + } InspectorTest.addResult(" ".repeat(padding) + name + ": " + [node.selfTime, node.totalTime].map(function (t) { return t.toFixed(3); }).join(" ")); (node.children || new Map()).forEach(printEventTree.bind(null, padding + 1)); }
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/README b/third_party/WebKit/LayoutTests/intersection-observer/README new file mode 100644 index 0000000..4dad2f33 --- /dev/null +++ b/third_party/WebKit/LayoutTests/intersection-observer/README
@@ -0,0 +1,29 @@ +All of the IntersectionObserver tests feature the following idiom: + +<script> +var observer = new IntersectionObserver(...) +function test_function() { + var entries = observer.takeRecords(); + // Verify entries +} +onload = function() { + observer.observe(target); + requestAnimationFrame(() => { requestAnimationFrame(test_function) }); +} + + +Subsequent steps in the test use a single RAF to give the observer a chance to +generate notifications, but the double RAF is required in the onload handler. +Here's the chain of events: + +- onload + - observer.observe() + - First RAF handler is registered +- BeginFrame + - RAF handlers run + - Second RAF handler is registered + - UpdateAllLifecyclePhases + - IntersectionObserver generates notifications +- BeginFrame + - RAF handlers run + - Second RAF handler verifies observer notifications.
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/containing-block.html b/third_party/WebKit/LayoutTests/intersection-observer/containing-block.html index f7db8fb..819ec5fa 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/containing-block.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/containing-block.html
@@ -19,81 +19,79 @@ </div> <script> - description("Test that no notifications are generated when root is not in the containing block chain of target."); - var root = document.getElementById("root"); - var target = document.getElementById("target"); - var entries = []; +description("Test that no notifications are generated when root is not in the containing block chain of target."); +var root = document.getElementById("root"); +var target = document.getElementById("target"); +var entries = []; - function observer_callback(changes) { - changes.forEach(function(e) { entries.push(e) }); +var observer = new IntersectionObserver( + changes => { entries = entries.concat(changes) }, + { root: root } +); + +onload = function() { + observer.observe(target); + shouldBeEqualToNumber("entries.length", 0); + target.style.top = "10px"; + // See README for explanation of double RAF. + requestAnimationFrame(() => { requestAnimationFrame(step1) }); +}; + +function step1() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + if (entries.length > 0) { + shouldBeEqualToNumber("entries[0].boundingClientRect.left", 58); + shouldBeEqualToNumber("entries[0].boundingClientRect.right", 158); + shouldBeEqualToNumber("entries[0].boundingClientRect.top", 18); + shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 118); + shouldBeEqualToNumber("entries[0].intersectionRect.left", 58); + shouldBeEqualToNumber("entries[0].intersectionRect.right", 158); + shouldBeEqualToNumber("entries[0].intersectionRect.top", 18); + shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 118); + shouldBeEqualToNumber("entries[0].rootBounds.left", 8); + shouldBeEqualToNumber("entries[0].rootBounds.right", 193); + shouldBeEqualToNumber("entries[0].rootBounds.top", 8); + shouldBeEqualToNumber("entries[0].rootBounds.bottom", 208); + shouldEvaluateToSameObject("entries[0].target", target); } - new IntersectionObserver(observer_callback, {root: root}).observe(target); + target.style.top = "250px"; + requestAnimationFrame(step2); +} - function step0() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 0); - target.style.top = "10px"; - requestAnimationFrame(step1); - }); +function step2() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + if (entries.length > 1) { + shouldBeEqualToNumber("entries[1].boundingClientRect.left", 58); + shouldBeEqualToNumber("entries[1].boundingClientRect.right", 158); + shouldBeEqualToNumber("entries[1].boundingClientRect.top", 258); + shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 358); + shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); + shouldBeEqualToNumber("entries[1].rootBounds.left", 8); + shouldBeEqualToNumber("entries[1].rootBounds.right", 193); + shouldBeEqualToNumber("entries[1].rootBounds.top", 8); + shouldBeEqualToNumber("entries[1].rootBounds.bottom", 208); + shouldEvaluateToSameObject("entries[1].target", target); } + root.style.position = "static"; + target.style.top = "10px"; + requestAnimationFrame(step3); +} - function step1() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - shouldBeEqualToNumber("entries[0].boundingClientRect.left", 58); - shouldBeEqualToNumber("entries[0].boundingClientRect.right", 158); - shouldBeEqualToNumber("entries[0].boundingClientRect.top", 18); - shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 118); - shouldBeEqualToNumber("entries[0].intersectionRect.left", 58); - shouldBeEqualToNumber("entries[0].intersectionRect.right", 158); - shouldBeEqualToNumber("entries[0].intersectionRect.top", 18); - shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 118); - shouldBeEqualToNumber("entries[0].rootBounds.left", 8); - shouldBeEqualToNumber("entries[0].rootBounds.right", 193); - shouldBeEqualToNumber("entries[0].rootBounds.top", 8); - shouldBeEqualToNumber("entries[0].rootBounds.bottom", 208); - shouldEvaluateToSameObject("entries[0].target", target); - target.style.top = "250px"; - requestAnimationFrame(step2); - }); - } +function step3() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + target.style.top = "250px"; + requestAnimationFrame(step4); +} - function step2() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - shouldBeEqualToNumber("entries[1].boundingClientRect.left", 58); - shouldBeEqualToNumber("entries[1].boundingClientRect.right", 158); - shouldBeEqualToNumber("entries[1].boundingClientRect.top", 258); - shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 358); - shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); - shouldBeEqualToNumber("entries[1].rootBounds.left", 8); - shouldBeEqualToNumber("entries[1].rootBounds.right", 193); - shouldBeEqualToNumber("entries[1].rootBounds.top", 8); - shouldBeEqualToNumber("entries[1].rootBounds.bottom", 208); - shouldEvaluateToSameObject("entries[1].target", target); - root.style.position = "static"; - target.style.top = "10px"; - requestAnimationFrame(step3); - }); - } - - function step3() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - target.style.top = "250px"; - requestAnimationFrame(step4); - }); - } - - function step4() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - finishJSTest(); - }); - } - - step0(); +function step4() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + finishJSTest(); +} </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/iframe-no-root-expected.txt b/third_party/WebKit/LayoutTests/intersection-observer/iframe-no-root-expected.txt index a8fc7831..a744f4e 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/iframe-no-root-expected.txt +++ b/third_party/WebKit/LayoutTests/intersection-observer/iframe-no-root-expected.txt
@@ -5,6 +5,7 @@ PASS entries.length is 0 PASS entries.length is 0 +PASS entries.length is 0 PASS entries.length is 1 PASS entries[0].boundingClientRect.left is 8 PASS entries[0].boundingClientRect.right is 108
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/iframe-no-root.html b/third_party/WebKit/LayoutTests/intersection-observer/iframe-no-root.html index 912e286f..134b645 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/iframe-no-root.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/iframe-no-root.html
@@ -8,81 +8,76 @@ <script> description("Simple intersection observer test with no explicit root and target in an iframe."); var entries = []; +var observer = new IntersectionObserver(changes => { entries = entries.concat(changes) }, {}); var targetIframe = document.getElementById("target-iframe"); +var target; +var iframeScroller; targetIframe.onload = function() { - var target = targetIframe.contentDocument.getElementById("target"); - var iframeScroller = targetIframe.contentDocument.scrollingElement; - - observer_callback = function(changes) { - for (var i in changes) - entries.push(changes[i]); - }; - var observer = new IntersectionObserver(observer_callback, {}); + target = targetIframe.contentDocument.getElementById("target"); + iframeScroller = targetIframe.contentDocument.scrollingElement; observer.observe(target); + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + // See README for explanation of double RAF. + requestAnimationFrame(() => { requestAnimationFrame(step0) }); +} - function step0() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 0); - document.scrollingElement.scrollTop = 200; - requestAnimationFrame(step1); - }); +function step0() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + document.scrollingElement.scrollTop = 200; + requestAnimationFrame(step1); +} + +function step1() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + iframeScroller.scrollTop = 250; + requestAnimationFrame(step2); +} + +function step2() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + if (entries.length > 0) { + shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[0].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[0].boundingClientRect.top", -42); + shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 58); + shouldBeEqualToNumber("entries[0].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[0].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[0].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 58); + shouldBeEqualToNumber("entries[0].rootBounds.left", 0); + shouldBeEqualToNumber("entries[0].rootBounds.right", 785); + shouldBeEqualToNumber("entries[0].rootBounds.top", 0); + shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[0].target", target); } + document.scrollingElement.scrollTop = 100; + requestAnimationFrame(step3); +} - function step1() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 0); - iframeScroller.scrollTop = 250; - requestAnimationFrame(step2); - }); +function step3() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + if (entries.length > 1) { + shouldBeEqualToNumber("entries[1].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[1].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[1].boundingClientRect.top", -42); + shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 58); + shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); + shouldBeEqualToNumber("entries[1].rootBounds.left", 0); + shouldBeEqualToNumber("entries[1].rootBounds.right", 785); + shouldBeEqualToNumber("entries[1].rootBounds.top", 0); + shouldBeEqualToNumber("entries[1].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[1].target", target); } - - function step2() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - if (entries.length > 0) { - shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[0].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[0].boundingClientRect.top", -42); - shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 58); - shouldBeEqualToNumber("entries[0].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[0].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[0].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 58); - shouldBeEqualToNumber("entries[0].rootBounds.left", 0); - shouldBeEqualToNumber("entries[0].rootBounds.right", 785); - shouldBeEqualToNumber("entries[0].rootBounds.top", 0); - shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[0].target", target); - } - document.scrollingElement.scrollTop = 100; - requestAnimationFrame(step3); - }); - } - - function step3() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - if (entries.length > 1) { - shouldBeEqualToNumber("entries[1].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[1].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[1].boundingClientRect.top", -42); - shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 58); - shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); - shouldBeEqualToNumber("entries[1].rootBounds.left", 0); - shouldBeEqualToNumber("entries[1].rootBounds.right", 785); - shouldBeEqualToNumber("entries[1].rootBounds.top", 0); - shouldBeEqualToNumber("entries[1].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[1].target", target); - } - finishJSTest(); - document.scrollingElement.scrollTop = 0; - }); - } - - step0(); + finishJSTest(); + document.scrollingElement.scrollTop = 0; } </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/multiple-thresholds-expected.txt b/third_party/WebKit/LayoutTests/intersection-observer/multiple-thresholds-expected.txt index b3d7f60..512532f 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/multiple-thresholds-expected.txt +++ b/third_party/WebKit/LayoutTests/intersection-observer/multiple-thresholds-expected.txt
@@ -4,6 +4,7 @@ PASS entries.length is 0 +PASS entries.length is 0 PASS entries.length is 1 PASS entries[0].boundingClientRect.left is 8 PASS entries[0].boundingClientRect.right is 108
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/multiple-thresholds.html b/third_party/WebKit/LayoutTests/intersection-observer/multiple-thresholds.html index 94db094..cee4e94 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/multiple-thresholds.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/multiple-thresholds.html
@@ -6,194 +6,202 @@ <div style="width:100%; height:700px;"></div> <script> - description("Intersection observer test with multiple thresholds."); - var target = document.getElementById("target"); - var entries = []; +description("Intersection observer test with multiple thresholds."); +var target = document.getElementById("target"); +var entries = []; +var observer = new IntersectionObserver( + changes => { entries = entries.concat(changes) }, + { threshold: [0, 0.25, 0.5, 0.75, 1] } +); - observer_callback = function(changes) { - for (var i in changes) - entries.push(changes[i]); - }; - var observer = new IntersectionObserver(observer_callback, { - threshold: [0, 0.25, 0.5, 0.75, 1] - }); +onload = function() { observer.observe(target); + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + // See README for explanation of double RAF. + requestAnimationFrame(() => { requestAnimationFrame(step0) }); +} - function step0() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 0); - document.scrollingElement.scrollTop = 120; - requestAnimationFrame(step1); - }); +function step0() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + document.scrollingElement.scrollTop = 120; + requestAnimationFrame(step1); +} + +function step1() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + if (entries.length > 0) { + shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[0].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[0].boundingClientRect.top", 588); + shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 688); + shouldBeEqualToNumber("entries[0].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[0].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[0].intersectionRect.top", 588); + shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 600); + shouldBeEqualToNumber("entries[0].rootBounds.left", 0); + shouldBeEqualToNumber("entries[0].rootBounds.right", 785); + shouldBeEqualToNumber("entries[0].rootBounds.top", 0); + shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[0].target", target); } + document.scrollingElement.scrollTop = 160; + requestAnimationFrame(step2); +} - function step1() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[0].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[0].boundingClientRect.top", 588); - shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 688); - shouldBeEqualToNumber("entries[0].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[0].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[0].intersectionRect.top", 588); - shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 600); - shouldBeEqualToNumber("entries[0].rootBounds.left", 0); - shouldBeEqualToNumber("entries[0].rootBounds.right", 785); - shouldBeEqualToNumber("entries[0].rootBounds.top", 0); - shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[0].target", target); - document.scrollingElement.scrollTop = 160; - requestAnimationFrame(step2); - }); +function step2() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + if (entries.length > 1) { + shouldBeEqualToNumber("entries[1].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[1].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[1].boundingClientRect.top", 548); + shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 648); + shouldBeEqualToNumber("entries[1].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[1].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[1].intersectionRect.top", 548); + shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 600); + shouldBeEqualToNumber("entries[1].rootBounds.left", 0); + shouldBeEqualToNumber("entries[1].rootBounds.right", 785); + shouldBeEqualToNumber("entries[1].rootBounds.top", 0); + shouldBeEqualToNumber("entries[1].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[1].target", target); } + document.scrollingElement.scrollTop = 200; + requestAnimationFrame(step3); +} - function step2() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - shouldBeEqualToNumber("entries[1].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[1].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[1].boundingClientRect.top", 548); - shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 648); - shouldBeEqualToNumber("entries[1].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[1].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[1].intersectionRect.top", 548); - shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 600); - shouldBeEqualToNumber("entries[1].rootBounds.left", 0); - shouldBeEqualToNumber("entries[1].rootBounds.right", 785); - shouldBeEqualToNumber("entries[1].rootBounds.top", 0); - shouldBeEqualToNumber("entries[1].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[1].target", target); - document.scrollingElement.scrollTop = 200; - requestAnimationFrame(step3); - }); +function step3() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 3); + if (entries.length > 2) { + shouldBeEqualToNumber("entries[2].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[2].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[2].boundingClientRect.top", 508); + shouldBeEqualToNumber("entries[2].boundingClientRect.bottom", 608); + shouldBeEqualToNumber("entries[2].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[2].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[2].intersectionRect.top", 508); + shouldBeEqualToNumber("entries[2].intersectionRect.bottom", 600); + shouldBeEqualToNumber("entries[2].rootBounds.left", 0); + shouldBeEqualToNumber("entries[2].rootBounds.right", 785); + shouldBeEqualToNumber("entries[2].rootBounds.top", 0); + shouldBeEqualToNumber("entries[2].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[2].target", target); } + document.scrollingElement.scrollTop = 240; + requestAnimationFrame(step4); +} - function step3() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 3); - shouldBeEqualToNumber("entries[2].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[2].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[2].boundingClientRect.top", 508); - shouldBeEqualToNumber("entries[2].boundingClientRect.bottom", 608); - shouldBeEqualToNumber("entries[2].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[2].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[2].intersectionRect.top", 508); - shouldBeEqualToNumber("entries[2].intersectionRect.bottom", 600); - shouldBeEqualToNumber("entries[2].rootBounds.left", 0); - shouldBeEqualToNumber("entries[2].rootBounds.right", 785); - shouldBeEqualToNumber("entries[2].rootBounds.top", 0); - shouldBeEqualToNumber("entries[2].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[2].target", target); - document.scrollingElement.scrollTop = 240; - requestAnimationFrame(step4); - }); +function step4() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 4); + if (entries.length > 3) { + shouldBeEqualToNumber("entries[3].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[3].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[3].boundingClientRect.top", 468); + shouldBeEqualToNumber("entries[3].boundingClientRect.bottom", 568); + shouldBeEqualToNumber("entries[3].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[3].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[3].intersectionRect.top", 468); + shouldBeEqualToNumber("entries[3].intersectionRect.bottom", 568); + shouldBeEqualToNumber("entries[3].rootBounds.left", 0); + shouldBeEqualToNumber("entries[3].rootBounds.right", 785); + shouldBeEqualToNumber("entries[3].rootBounds.top", 0); + shouldBeEqualToNumber("entries[3].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[3].target", target); } + document.scrollingElement.scrollTop = 740; + requestAnimationFrame(step5); +} - function step4() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 4); - shouldBeEqualToNumber("entries[3].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[3].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[3].boundingClientRect.top", 468); - shouldBeEqualToNumber("entries[3].boundingClientRect.bottom", 568); - shouldBeEqualToNumber("entries[3].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[3].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[3].intersectionRect.top", 468); - shouldBeEqualToNumber("entries[3].intersectionRect.bottom", 568); - shouldBeEqualToNumber("entries[3].rootBounds.left", 0); - shouldBeEqualToNumber("entries[3].rootBounds.right", 785); - shouldBeEqualToNumber("entries[3].rootBounds.top", 0); - shouldBeEqualToNumber("entries[3].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[3].target", target); - document.scrollingElement.scrollTop = 740; - requestAnimationFrame(step5); - }); +function step5() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 5); + if (entries.length > 4) { + shouldBeEqualToNumber("entries[4].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[4].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[4].boundingClientRect.top", -32); + shouldBeEqualToNumber("entries[4].boundingClientRect.bottom", 68); + shouldBeEqualToNumber("entries[4].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[4].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[4].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[4].intersectionRect.bottom", 68); + shouldBeEqualToNumber("entries[4].rootBounds.left", 0); + shouldBeEqualToNumber("entries[4].rootBounds.right", 785); + shouldBeEqualToNumber("entries[4].rootBounds.top", 0); + shouldBeEqualToNumber("entries[4].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[4].target", target); } + document.scrollingElement.scrollTop = 760; + requestAnimationFrame(step6); +} - function step5() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 5); - shouldBeEqualToNumber("entries[4].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[4].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[4].boundingClientRect.top", -32); - shouldBeEqualToNumber("entries[4].boundingClientRect.bottom", 68); - shouldBeEqualToNumber("entries[4].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[4].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[4].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[4].intersectionRect.bottom", 68); - shouldBeEqualToNumber("entries[4].rootBounds.left", 0); - shouldBeEqualToNumber("entries[4].rootBounds.right", 785); - shouldBeEqualToNumber("entries[4].rootBounds.top", 0); - shouldBeEqualToNumber("entries[4].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[4].target", target); - document.scrollingElement.scrollTop = 760; - requestAnimationFrame(step6); - }); +function step6() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 6); + if (entries.length > 5) { + shouldBeEqualToNumber("entries[5].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[5].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[5].boundingClientRect.top", -52); + shouldBeEqualToNumber("entries[5].boundingClientRect.bottom", 48); + shouldBeEqualToNumber("entries[5].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[5].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[5].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[5].intersectionRect.bottom", 48); + shouldBeEqualToNumber("entries[5].rootBounds.left", 0); + shouldBeEqualToNumber("entries[5].rootBounds.right", 785); + shouldBeEqualToNumber("entries[5].rootBounds.top", 0); + shouldBeEqualToNumber("entries[5].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[5].target", target); } + document.scrollingElement.scrollTop = 800; + requestAnimationFrame(step7); +} - function step6() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 6); - shouldBeEqualToNumber("entries[5].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[5].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[5].boundingClientRect.top", -52); - shouldBeEqualToNumber("entries[5].boundingClientRect.bottom", 48); - shouldBeEqualToNumber("entries[5].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[5].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[5].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[5].intersectionRect.bottom", 48); - shouldBeEqualToNumber("entries[5].rootBounds.left", 0); - shouldBeEqualToNumber("entries[5].rootBounds.right", 785); - shouldBeEqualToNumber("entries[5].rootBounds.top", 0); - shouldBeEqualToNumber("entries[5].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[5].target", target); - document.scrollingElement.scrollTop = 800; - requestAnimationFrame(step7); - }); +function step7() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 7); + if (entries.length > 6) { + shouldBeEqualToNumber("entries[6].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[6].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[6].boundingClientRect.top", -92); + shouldBeEqualToNumber("entries[6].boundingClientRect.bottom", 8); + shouldBeEqualToNumber("entries[6].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[6].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[6].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[6].intersectionRect.bottom", 8); + shouldBeEqualToNumber("entries[6].rootBounds.left", 0); + shouldBeEqualToNumber("entries[6].rootBounds.right", 785); + shouldBeEqualToNumber("entries[6].rootBounds.top", 0); + shouldBeEqualToNumber("entries[6].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[6].target", target); } + document.scrollingElement.scrollTop = 820; + requestAnimationFrame(step8); +} - function step7() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 7); - shouldBeEqualToNumber("entries[6].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[6].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[6].boundingClientRect.top", -92); - shouldBeEqualToNumber("entries[6].boundingClientRect.bottom", 8); - shouldBeEqualToNumber("entries[6].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[6].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[6].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[6].intersectionRect.bottom", 8); - shouldBeEqualToNumber("entries[6].rootBounds.left", 0); - shouldBeEqualToNumber("entries[6].rootBounds.right", 785); - shouldBeEqualToNumber("entries[6].rootBounds.top", 0); - shouldBeEqualToNumber("entries[6].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[6].target", target); - document.scrollingElement.scrollTop = 820; - requestAnimationFrame(step8); - }); +function step8() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 8); + if (entries.length > 7) { + shouldBeEqualToNumber("entries[7].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[7].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[7].boundingClientRect.top", -112); + shouldBeEqualToNumber("entries[7].boundingClientRect.bottom", -12); + shouldBeEqualToNumber("entries[7].intersectionRect.left", 0); + shouldBeEqualToNumber("entries[7].intersectionRect.right", 0); + shouldBeEqualToNumber("entries[7].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[7].intersectionRect.bottom", 0); + shouldBeEqualToNumber("entries[7].rootBounds.left", 0); + shouldBeEqualToNumber("entries[7].rootBounds.right", 785); + shouldBeEqualToNumber("entries[7].rootBounds.top", 0); + shouldBeEqualToNumber("entries[7].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[7].target", target); } - - function step8() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 8); - shouldBeEqualToNumber("entries[7].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[7].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[7].boundingClientRect.top", -112); - shouldBeEqualToNumber("entries[7].boundingClientRect.bottom", -12); - shouldBeEqualToNumber("entries[7].intersectionRect.left", 0); - shouldBeEqualToNumber("entries[7].intersectionRect.right", 0); - shouldBeEqualToNumber("entries[7].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[7].intersectionRect.bottom", 0); - shouldBeEqualToNumber("entries[7].rootBounds.left", 0); - shouldBeEqualToNumber("entries[7].rootBounds.right", 785); - shouldBeEqualToNumber("entries[7].rootBounds.top", 0); - shouldBeEqualToNumber("entries[7].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[7].target", target); - finishJSTest(); - document.scrollingElement.scrollTop = 0; - }); - } - - step0(); + finishJSTest(); + document.scrollingElement.scrollTop = 0; +} </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/observer-without-js-reference.html b/third_party/WebKit/LayoutTests/intersection-observer/observer-without-js-reference.html index 637a955f3..b4fbd3b 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/observer-without-js-reference.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/observer-without-js-reference.html
@@ -6,19 +6,26 @@ <div style="width:100%; height:700px;"></div> <script> - jsTestIsAsync = true; - description("IntersectionObserver continues to produce notifications when it has no javascript references."); - var target = document.getElementById("target"); - var entries = []; - new IntersectionObserver(function(changes) { - entries.push(...changes); - }).observe(target); - gc(); - document.scrollingElement.scrollTop = 300; - requestAnimationFrame(function () { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - finishJSTest(); - }); - }); +jsTestIsAsync = true; +description("IntersectionObserver continues to produce notifications when it has no javascript references."); +var target = document.getElementById("target"); +var entries = []; +new IntersectionObserver(function(changes) { + entries.push(...changes); +}).observe(target); +gc(); +document.scrollingElement.scrollTop = 300; +// See README for explanation of double RAF. +requestAnimationFrame(() => { requestAnimationFrame(() => { + // In other IntersectionObserver tests, observer.takeRecords() is used to ensure that + // all pending notifications are taken. Because this test specifically tests the + // case where the observer object has no js references, it can't use takeRecords(). + // However, the IntersectionObserver spec mandates that all notifications must be + // sent within 100ms of being generated, so this timeout effectively tests conformance + // with that requirement. + setTimeout(() => { + shouldBeEqualToNumber("entries.length", 1); + finishJSTest(); + }, 100) +}) }); </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/root-margin-expected.txt b/third_party/WebKit/LayoutTests/intersection-observer/root-margin-expected.txt index 910c278..a88ff82 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/root-margin-expected.txt +++ b/third_party/WebKit/LayoutTests/intersection-observer/root-margin-expected.txt
@@ -3,11 +3,13 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS new IntersectionObserver(observer_callback, { rootMargin: '1.4px' }) did not throw exception. -PASS new IntersectionObserver(observer_callback, { rootMargin: '1.4px 2px' }) did not throw exception. -PASS new IntersectionObserver(observer_callback, { rootMargin: '1.4px 2px 3%' }) did not throw exception. -PASS new IntersectionObserver(observer_callback, { rootMargin: '1.4px 2px 3% 40px junk junk junk' }) did not throw exception. +PASS new IntersectionObserver(c => {}, { rootMargin: '1.4px' }) did not throw exception. +PASS new IntersectionObserver(c => {}, { rootMargin: '1.4px 2px' }) did not throw exception. +PASS new IntersectionObserver(c => {}, { rootMargin: '1.4px 2px 3%' }) did not throw exception. +PASS new IntersectionObserver(c => {}, { rootMargin: '1.4px 2px 3% 40px junk junk junk' }) did not throw exception. PASS entries.length is 0 +PASS entries.length is 0 +PASS entries.length is 1 PASS entries.length is 1 PASS entries[0].boundingClientRect.left is 912 PASS entries[0].boundingClientRect.right is 1012
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/root-margin.html b/third_party/WebKit/LayoutTests/intersection-observer/root-margin.html index c5dd9433..dda62ea3 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/root-margin.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/root-margin.html
@@ -10,83 +10,84 @@ <div style="width:100%; height:700px;"></div> <script> - description("Intersection observer test with root margin and implicit root."); - var target = document.getElementById("target"); - var entries = []; +description("Intersection observer test with root margin and implicit root."); +var target = document.getElementById("target"); +var entries = []; +var observer = new IntersectionObserver( + changes => { entries = entries.concat(changes) }, + { rootMargin: "10px 20% 40% 30px" } +); - function observer_callback(changes) { - for (var i in changes) - entries.push(changes[i]); - } +shouldNotThrow("new IntersectionObserver(c => {}, { rootMargin: '1.4px' })"); +shouldNotThrow("new IntersectionObserver(c => {}, { rootMargin: '1.4px 2px' })"); +shouldNotThrow("new IntersectionObserver(c => {}, { rootMargin: '1.4px 2px 3%' })"); +shouldNotThrow("new IntersectionObserver(c => {}, { rootMargin: '1.4px 2px 3% 40px junk junk junk' })"); - var observer = new IntersectionObserver(observer_callback, { - rootMargin: "10px 20% 40% 30px" - }); +onload = function() { observer.observe(target); + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + // See README for explanation of double RAF. + requestAnimationFrame(() => { requestAnimationFrame(step0) }); +} - function step0() { - setTimeout(function() { - shouldNotThrow("new IntersectionObserver(observer_callback, { rootMargin: '1.4px' })"); - shouldNotThrow("new IntersectionObserver(observer_callback, { rootMargin: '1.4px 2px' })"); - shouldNotThrow("new IntersectionObserver(observer_callback, { rootMargin: '1.4px 2px 3%' })"); - shouldNotThrow("new IntersectionObserver(observer_callback, { rootMargin: '1.4px 2px 3% 40px junk junk junk' })"); - shouldBeEqualToNumber("entries.length", 0); - document.scrollingElement.scrollLeft = 100; - requestAnimationFrame(step1); - }); +function step0() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + document.scrollingElement.scrollLeft = 100; + requestAnimationFrame(step1); +} + +function step1() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + if (entries.length > 0) { + shouldBeEqualToNumber("entries.length", 1); + shouldBeEqualToNumber("entries[0].boundingClientRect.left", 912); + shouldBeEqualToNumber("entries[0].boundingClientRect.right", 1012); + shouldBeEqualToNumber("entries[0].boundingClientRect.top", 708); + shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 808); + shouldBeEqualToNumber("entries[0].intersectionRect.left", 912); + shouldBeEqualToNumber("entries[0].intersectionRect.right", 942); + shouldBeEqualToNumber("entries[0].intersectionRect.top", 708); + shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 808); + shouldBeEqualToNumber("entries[0].rootBounds.left", -30); + shouldBeEqualToNumber("entries[0].rootBounds.right", 942); + shouldBeEqualToNumber("entries[0].rootBounds.top", -10); + shouldBeEqualToNumber("entries[0].rootBounds.bottom", 819); + shouldEvaluateToSameObject("entries[0].target", target); } + document.scrollingElement.scrollTop = 800; + requestAnimationFrame(step2); +} - function step1() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - shouldBeEqualToNumber("entries[0].boundingClientRect.left", 912); - shouldBeEqualToNumber("entries[0].boundingClientRect.right", 1012); - shouldBeEqualToNumber("entries[0].boundingClientRect.top", 708); - shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 808); - shouldBeEqualToNumber("entries[0].intersectionRect.left", 912); - shouldBeEqualToNumber("entries[0].intersectionRect.right", 942); - shouldBeEqualToNumber("entries[0].intersectionRect.top", 708); - shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 808); - shouldBeEqualToNumber("entries[0].rootBounds.left", -30); - shouldBeEqualToNumber("entries[0].rootBounds.right", 942); - shouldBeEqualToNumber("entries[0].rootBounds.top", -10); - shouldBeEqualToNumber("entries[0].rootBounds.bottom", 819); - shouldEvaluateToSameObject("entries[0].target", target); - document.scrollingElement.scrollTop = 800; - requestAnimationFrame(step2); - }); +function step2() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + document.scrollingElement.scrollTop = 900; + requestAnimationFrame(step3); +} + +function step3() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + if (entries.length > 1) { + shouldBeEqualToNumber("entries[1].boundingClientRect.left", 912); + shouldBeEqualToNumber("entries[1].boundingClientRect.right", 1012); + shouldBeEqualToNumber("entries[1].boundingClientRect.top", -192); + shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", -92); + shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); + shouldBeEqualToNumber("entries[1].rootBounds.left", -30); + shouldBeEqualToNumber("entries[1].rootBounds.right", 942); + shouldBeEqualToNumber("entries[1].rootBounds.top", -10); + shouldBeEqualToNumber("entries[1].rootBounds.bottom", 819); + shouldEvaluateToSameObject("entries[1].target", target); } - - function step2() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - document.scrollingElement.scrollTop = 900; - requestAnimationFrame(step3); - }); - } - - function step3() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - shouldBeEqualToNumber("entries[1].boundingClientRect.left", 912); - shouldBeEqualToNumber("entries[1].boundingClientRect.right", 1012); - shouldBeEqualToNumber("entries[1].boundingClientRect.top", -192); - shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", -92); - shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); - shouldBeEqualToNumber("entries[1].rootBounds.left", -30); - shouldBeEqualToNumber("entries[1].rootBounds.right", 942); - shouldBeEqualToNumber("entries[1].rootBounds.top", -10); - shouldBeEqualToNumber("entries[1].rootBounds.bottom", 819); - shouldEvaluateToSameObject("entries[1].target", target); - - finishJSTest(); - document.scrollingElement.scrollLeft = 0; - document.scrollingElement.scrollTop = 0; - }); - } - - step0(); + finishJSTest(); + document.scrollingElement.scrollLeft = 0; + document.scrollingElement.scrollTop = 0; +} </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/same-document-no-root.html b/third_party/WebKit/LayoutTests/intersection-observer/same-document-no-root.html index 168a2cf..5d8a01b8 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/same-document-no-root.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/same-document-no-root.html
@@ -6,68 +6,67 @@ <div style="width:100%; height:700px;"></div> <script> - description("Simple intersection observer test with no explicit root and one document."); - var target = document.getElementById("target"); - var entries = []; - observer_callback = function(changes) { - for (var i in changes) - entries.push(changes[i]); - }; - var observer = new IntersectionObserver(observer_callback, {}); +description("Simple intersection observer test with no explicit root and one document."); +var target = document.getElementById("target"); +var entries = []; +var observer = new IntersectionObserver(changes => { entries = entries.concat(changes) }); + +onload = function() { observer.observe(target); + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + document.scrollingElement.scrollTop = 300; + // See README for explanation of double RAF. + requestAnimationFrame(() => { requestAnimationFrame(step1) }); +}; - onload = function() { - shouldBeEqualToNumber("entries.length", 0); - document.scrollingElement.scrollTop = 300; - requestAnimationFrame(step1); - }; +function step1() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + if (entries.length > 0) { + shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[0].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[0].boundingClientRect.top", 408); + shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 508); + shouldBeEqualToNumber("entries[0].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[0].intersectionRect.right", 108); + shouldBeEqualToNumber("entries[0].intersectionRect.top", 408); + shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 508); + shouldBeEqualToNumber("entries[0].rootBounds.left", 0); + shouldBeEqualToNumber("entries[0].rootBounds.right", 785); + shouldBeEqualToNumber("entries[0].rootBounds.top", 0); + shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[0].target", target); - function step1() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[0].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[0].boundingClientRect.top", 408); - shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 508); - shouldBeEqualToNumber("entries[0].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[0].intersectionRect.right", 108); - shouldBeEqualToNumber("entries[0].intersectionRect.top", 408); - shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 508); - shouldBeEqualToNumber("entries[0].rootBounds.left", 0); - shouldBeEqualToNumber("entries[0].rootBounds.right", 785); - shouldBeEqualToNumber("entries[0].rootBounds.top", 0); - shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[0].target", target); - - // ClientRect members of IntersectionObserverEntry should be stable. - shouldEvaluateToSameObject("entries[0].boundingClientRect", entries[0].boundingClientRect); - shouldEvaluateToSameObject("entries[0].intersectionRect", entries[0].intersectionRect); - shouldEvaluateToSameObject("entries[0].rootBounds", entries[0].rootBounds); - - document.scrollingElement.scrollTop = 100; - requestAnimationFrame(step2); - }); + // ClientRect members of IntersectionObserverEntry should be stable. + shouldEvaluateToSameObject("entries[0].boundingClientRect", entries[0].boundingClientRect); + shouldEvaluateToSameObject("entries[0].intersectionRect", entries[0].intersectionRect); + shouldEvaluateToSameObject("entries[0].rootBounds", entries[0].rootBounds); } + document.scrollingElement.scrollTop = 100; + requestAnimationFrame(step2); +} - function step2() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - shouldBeEqualToNumber("entries[1].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[1].boundingClientRect.right", 108); - shouldBeEqualToNumber("entries[1].boundingClientRect.top", 608); - shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 708); - shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); - shouldBeEqualToNumber("entries[1].rootBounds.left", 0); - shouldBeEqualToNumber("entries[1].rootBounds.right", 785); - shouldBeEqualToNumber("entries[1].rootBounds.top", 0); - shouldBeEqualToNumber("entries[1].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[1].target", target); - finishJSTest(); - document.scrollingElement.scrollTop = 0; - }); +function step2() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + if (entries.length > 1) { + shouldBeEqualToNumber("entries[1].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[1].boundingClientRect.right", 108); + shouldBeEqualToNumber("entries[1].boundingClientRect.top", 608); + shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 708); + shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); + shouldBeEqualToNumber("entries[1].rootBounds.left", 0); + shouldBeEqualToNumber("entries[1].rootBounds.right", 785); + shouldBeEqualToNumber("entries[1].rootBounds.top", 0); + shouldBeEqualToNumber("entries[1].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[1].target", target); } + finishJSTest(); + document.scrollingElement.scrollTop = 0; +} </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/same-document-root-expected.txt b/third_party/WebKit/LayoutTests/intersection-observer/same-document-root-expected.txt index 157d6e5e..af7109b2 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/same-document-root-expected.txt +++ b/third_party/WebKit/LayoutTests/intersection-observer/same-document-root-expected.txt
@@ -5,6 +5,7 @@ PASS entries.length is 0 PASS entries.length is 0 +PASS entries.length is 0 PASS entries.length is 1 PASS entries[0].boundingClientRect.left is 11 PASS entries[0].boundingClientRect.right is 111
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/same-document-root.html b/third_party/WebKit/LayoutTests/intersection-observer/same-document-root.html index d96f6d1..05a808b 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/same-document-root.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/same-document-root.html
@@ -9,105 +9,107 @@ <div style="width:100%;height:700px;"></div> <script> - description("Simple intersection observer test with explicit root and target in the same document."); - var target = document.getElementById("target"); - var root = document.getElementById("root"); - var entries = []; +description("Simple intersection observer test with explicit root and target in the same document."); +var target = document.getElementById("target"); +var root = document.getElementById("root"); +var entries = []; +var observer = new IntersectionObserver( + changes => { entries = entries.concat(changes) }, + { root: document.getElementById("root") } +); - observer_callback = function(changes) { - for (var i in changes) - entries.push(changes[i]); - }; - var observer = new IntersectionObserver(observer_callback, {"root": document.getElementById("root")}); +onload = function() { observer.observe(target); + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + requestAnimationFrame(() => { requestAnimationFrame(step0) }); +} - // Test that notifications are not generated when the target is overflow clipped by the root. - function step0() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 0); - document.scrollingElement.scrollTop = 600; - requestAnimationFrame(step1); - }); +// Test that notifications are not generated when the target is overflow clipped by the root. +function step0() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + document.scrollingElement.scrollTop = 600; + requestAnimationFrame(step1); +} + +function step1() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + root.scrollTop = 150; + requestAnimationFrame(step2); +} + +function step2() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + if (entries.length > 0) { + shouldBeEqualToNumber("entries[0].boundingClientRect.left", 11); + shouldBeEqualToNumber("entries[0].boundingClientRect.right", 111); + shouldBeEqualToNumber("entries[0].boundingClientRect.top", 261); + shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 361); + shouldBeEqualToNumber("entries[0].intersectionRect.left", 11); + shouldBeEqualToNumber("entries[0].intersectionRect.right", 111); + shouldBeEqualToNumber("entries[0].intersectionRect.top", 261); + shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 311); + shouldBeEqualToNumber("entries[0].rootBounds.left", 11); + shouldBeEqualToNumber("entries[0].rootBounds.right", 111); + shouldBeEqualToNumber("entries[0].rootBounds.top", 111); + shouldBeEqualToNumber("entries[0].rootBounds.bottom", 311); + shouldEvaluateToSameObject("entries[0].target", target); } + document.scrollingElement.scrollTop = 0; + requestAnimationFrame(step3); +} - function step1() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 0); - root.scrollTop = 150; - requestAnimationFrame(step2); - }); +function step3() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + root.scrollTop = 0; + requestAnimationFrame(step4); +} + +function step4() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + if (entries.length > 1) { + shouldBeEqualToNumber("entries[1].boundingClientRect.left", 11); + shouldBeEqualToNumber("entries[1].boundingClientRect.right", 111); + shouldBeEqualToNumber("entries[1].boundingClientRect.top", 1011); + shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 1111); + shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); + shouldBeEqualToNumber("entries[1].rootBounds.left", 11); + shouldBeEqualToNumber("entries[1].rootBounds.right", 111); + shouldBeEqualToNumber("entries[1].rootBounds.top", 711); + shouldBeEqualToNumber("entries[1].rootBounds.bottom", 911); + shouldEvaluateToSameObject("entries[1].target", target); } + root.scrollTop = 150; + requestAnimationFrame(step5); +} - function step2() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - shouldBeEqualToNumber("entries[0].boundingClientRect.left", 11); - shouldBeEqualToNumber("entries[0].boundingClientRect.right", 111); - shouldBeEqualToNumber("entries[0].boundingClientRect.top", 261); - shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 361); - shouldBeEqualToNumber("entries[0].intersectionRect.left", 11); - shouldBeEqualToNumber("entries[0].intersectionRect.right", 111); - shouldBeEqualToNumber("entries[0].intersectionRect.top", 261); - shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 311); - shouldBeEqualToNumber("entries[0].rootBounds.left", 11); - shouldBeEqualToNumber("entries[0].rootBounds.right", 111); - shouldBeEqualToNumber("entries[0].rootBounds.top", 111); - shouldBeEqualToNumber("entries[0].rootBounds.bottom", 311); - shouldEvaluateToSameObject("entries[0].target", target); - document.scrollingElement.scrollTop = 0; - requestAnimationFrame(step3); - }); +// This tests that notifications are generated even when the root element is off screen. +function step5() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 3); + if (entries.length > 2) { + shouldBeEqualToNumber("entries[2].boundingClientRect.left", 11); + shouldBeEqualToNumber("entries[2].boundingClientRect.right", 111); + shouldBeEqualToNumber("entries[2].boundingClientRect.top", 861); + shouldBeEqualToNumber("entries[2].boundingClientRect.bottom", 961); + shouldBeEqualToNumber("entries[2].intersectionRect.left", 11); + shouldBeEqualToNumber("entries[2].intersectionRect.right", 111); + shouldBeEqualToNumber("entries[2].intersectionRect.top", 861); + shouldBeEqualToNumber("entries[2].intersectionRect.bottom", 911); + shouldBeEqualToNumber("entries[2].rootBounds.left", 11); + shouldBeEqualToNumber("entries[2].rootBounds.right", 111); + shouldBeEqualToNumber("entries[2].rootBounds.top", 711); + shouldBeEqualToNumber("entries[2].rootBounds.bottom", 911); + shouldEvaluateToSameObject("entries[2].target", target); } - - function step3() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - root.scrollTop = 0; - requestAnimationFrame(step4); - }); - } - - function step4() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - shouldBeEqualToNumber("entries[1].boundingClientRect.left", 11); - shouldBeEqualToNumber("entries[1].boundingClientRect.right", 111); - shouldBeEqualToNumber("entries[1].boundingClientRect.top", 1011); - shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 1111); - shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); - shouldBeEqualToNumber("entries[1].rootBounds.left", 11); - shouldBeEqualToNumber("entries[1].rootBounds.right", 111); - shouldBeEqualToNumber("entries[1].rootBounds.top", 711); - shouldBeEqualToNumber("entries[1].rootBounds.bottom", 911); - shouldEvaluateToSameObject("entries[1].target", target); - root.scrollTop = 150; - requestAnimationFrame(step5); - }); - } - - // This tests that notifications are generated even when the root element is off screen. - function step5() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 3); - shouldBeEqualToNumber("entries[2].boundingClientRect.left", 11); - shouldBeEqualToNumber("entries[2].boundingClientRect.right", 111); - shouldBeEqualToNumber("entries[2].boundingClientRect.top", 861); - shouldBeEqualToNumber("entries[2].boundingClientRect.bottom", 961); - shouldBeEqualToNumber("entries[2].intersectionRect.left", 11); - shouldBeEqualToNumber("entries[2].intersectionRect.right", 111); - shouldBeEqualToNumber("entries[2].intersectionRect.top", 861); - shouldBeEqualToNumber("entries[2].intersectionRect.bottom", 911); - shouldBeEqualToNumber("entries[2].rootBounds.left", 11); - shouldBeEqualToNumber("entries[2].rootBounds.right", 111); - shouldBeEqualToNumber("entries[2].rootBounds.top", 711); - shouldBeEqualToNumber("entries[2].rootBounds.bottom", 911); - shouldEvaluateToSameObject("entries[2].target", target); - finishJSTest(); - }); - } - - step0(); + finishJSTest(); +} </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/same-document-zero-size-target.html b/third_party/WebKit/LayoutTests/intersection-observer/same-document-zero-size-target.html index 4a5b435..d29df905 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/same-document-zero-size-target.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/same-document-zero-size-target.html
@@ -6,68 +6,66 @@ <div style="width:100%; height:700px;"></div> <script> - description("Iintersection observer test with zero-size target element."); - var target = document.getElementById("target"); - var entries = []; - observer_callback = function(changes) { - for (var i in changes) - entries.push(changes[i]); - }; - var observer = new IntersectionObserver(observer_callback, {}); +description("Iintersection observer test with zero-size target element."); +var target = document.getElementById("target"); +var entries = []; +var observer = new IntersectionObserver(changes => { entries = entries.concat(changes) }, {}); + +onload = function() { observer.observe(target); + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 0); + document.scrollingElement.scrollTop = 300; + // See README for explanation of double RAF. + requestAnimationFrame(() => { requestAnimationFrame(step1) }); +}; - onload = function() { - shouldBeEqualToNumber("entries.length", 0); - document.scrollingElement.scrollTop = 300; - requestAnimationFrame(step1); - }; +function step1() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 1); + if (entries.length > 0) { + shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[0].boundingClientRect.right", 9); + shouldBeEqualToNumber("entries[0].boundingClientRect.top", 408); + shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 409); + shouldBeEqualToNumber("entries[0].intersectionRect.left", 8); + shouldBeEqualToNumber("entries[0].intersectionRect.right", 9); + shouldBeEqualToNumber("entries[0].intersectionRect.top", 408); + shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 409); + shouldBeEqualToNumber("entries[0].rootBounds.left", 0); + shouldBeEqualToNumber("entries[0].rootBounds.right", 785); + shouldBeEqualToNumber("entries[0].rootBounds.top", 0); + shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[0].target", target); - function step1() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 1); - shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[0].boundingClientRect.right", 9); - shouldBeEqualToNumber("entries[0].boundingClientRect.top", 408); - shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 409); - shouldBeEqualToNumber("entries[0].intersectionRect.left", 8); - shouldBeEqualToNumber("entries[0].intersectionRect.right", 9); - shouldBeEqualToNumber("entries[0].intersectionRect.top", 408); - shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 409); - shouldBeEqualToNumber("entries[0].rootBounds.left", 0); - shouldBeEqualToNumber("entries[0].rootBounds.right", 785); - shouldBeEqualToNumber("entries[0].rootBounds.top", 0); - shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[0].target", target); - - // ClientRect members of IntersectionObserverEntry should be stable. - shouldEvaluateToSameObject("entries[0].boundingClientRect", entries[0].boundingClientRect); - shouldEvaluateToSameObject("entries[0].intersectionRect", entries[0].intersectionRect); - shouldEvaluateToSameObject("entries[0].rootBounds", entries[0].rootBounds); - - document.scrollingElement.scrollTop = 100; - requestAnimationFrame(step2); - }); + // ClientRect members of IntersectionObserverEntry should be stable. + shouldEvaluateToSameObject("entries[0].boundingClientRect", entries[0].boundingClientRect); + shouldEvaluateToSameObject("entries[0].intersectionRect", entries[0].intersectionRect); + shouldEvaluateToSameObject("entries[0].rootBounds", entries[0].rootBounds); } + document.scrollingElement.scrollTop = 100; + requestAnimationFrame(step2); +} - function step2() { - setTimeout(function() { - shouldBeEqualToNumber("entries.length", 2); - shouldBeEqualToNumber("entries[1].boundingClientRect.left", 8); - shouldBeEqualToNumber("entries[1].boundingClientRect.right", 9); - shouldBeEqualToNumber("entries[1].boundingClientRect.top", 608); - shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 609); - shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); - shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); - shouldBeEqualToNumber("entries[1].rootBounds.left", 0); - shouldBeEqualToNumber("entries[1].rootBounds.right", 785); - shouldBeEqualToNumber("entries[1].rootBounds.top", 0); - shouldBeEqualToNumber("entries[1].rootBounds.bottom", 600); - shouldEvaluateToSameObject("entries[1].target", target); - finishJSTest(); - document.scrollingElement.scrollTop = 0; - }); +function step2() { + entries = entries.concat(observer.takeRecords()); + shouldBeEqualToNumber("entries.length", 2); + if (entries.length > 1) { + shouldBeEqualToNumber("entries[1].boundingClientRect.left", 8); + shouldBeEqualToNumber("entries[1].boundingClientRect.right", 9); + shouldBeEqualToNumber("entries[1].boundingClientRect.top", 608); + shouldBeEqualToNumber("entries[1].boundingClientRect.bottom", 609); + shouldBeEqualToNumber("entries[1].intersectionRect.left", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.right", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.top", 0); + shouldBeEqualToNumber("entries[1].intersectionRect.bottom", 0); + shouldBeEqualToNumber("entries[1].rootBounds.left", 0); + shouldBeEqualToNumber("entries[1].rootBounds.right", 785); + shouldBeEqualToNumber("entries[1].rootBounds.top", 0); + shouldBeEqualToNumber("entries[1].rootBounds.bottom", 600); + shouldEvaluateToSameObject("entries[1].target", target); } - + finishJSTest(); + document.scrollingElement.scrollTop = 0; +} </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html b/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html index 47f1dcc..fa967660 100644 --- a/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html +++ b/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html
@@ -8,6 +8,8 @@ description("Test that intersection observer time is relative to time in the callback context."); var topWindowEntries = []; var iframeWindowEntries = []; +var topWindowObserver; +var iframeWindowObserver; var targetIframe; var iframeScroller; var topWindowTime; @@ -15,36 +17,36 @@ var timestampTolerance = 24; // 1.5 times frame duration. function step0() { - setTimeout(function() { - // Test results are only significant if there's a sufficient gap between - // top window time and iframe window time. - topWindowTime = performance.now(); - iframeWindowTime = targetIframe.contentWindow.performance.now(); - shouldBeGreaterThan("topWindowTime - iframeWindowTime", "2 * timestampTolerance"); + // Test results are only significant if there's a sufficient gap between + // top window time and iframe window time. + topWindowTime = performance.now(); + iframeWindowTime = targetIframe.contentWindow.performance.now(); + shouldBeGreaterThan("topWindowTime - iframeWindowTime", "2 * timestampTolerance"); - shouldBeEqualToNumber("topWindowEntries.length", 0); - shouldBeEqualToNumber("iframeWindowEntries.length", 0); - document.scrollingElement.scrollTop = 200; - iframeScroller.scrollTop = 250; - requestAnimationFrame(step1); - }); + topWindowEntries = topWindowEntries.concat(topWindowObserver.takeRecords()); + iframeWindowEntries = iframeWindowEntries.concat(iframeWindowObserver.takeRecords()); + shouldBeEqualToNumber("topWindowEntries.length", 0); + shouldBeEqualToNumber("iframeWindowEntries.length", 0); + document.scrollingElement.scrollTop = 200; + iframeScroller.scrollTop = 250; + requestAnimationFrame(step1); } function step1() { - setTimeout(function() { - topWindowTime = performance.now(); - iframeWindowTime = targetIframe.contentWindow.performance.now(); - shouldBeEqualToNumber("topWindowEntries.length", 1); - if (topWindowEntries.length) { - shouldBeCloseTo("topWindowEntries[0].time", "topWindowTime", timestampTolerance); - } - shouldBeEqualToNumber("iframeWindowEntries.length", 1); - if (iframeWindowEntries.length) { - shouldBeCloseTo("iframeWindowEntries[0].time", "iframeWindowTime", timestampTolerance); - } - finishJSTest(); - document.scrollingElement.scrollTop = 0; - }); + topWindowEntries = topWindowEntries.concat(topWindowObserver.takeRecords()); + iframeWindowEntries = iframeWindowEntries.concat(iframeWindowObserver.takeRecords()); + topWindowTime = performance.now(); + iframeWindowTime = targetIframe.contentWindow.performance.now(); + shouldBeEqualToNumber("topWindowEntries.length", 1); + if (topWindowEntries.length) { + shouldBeCloseTo("topWindowEntries[0].time", "topWindowTime", timestampTolerance); + } + shouldBeEqualToNumber("iframeWindowEntries.length", 1); + if (iframeWindowEntries.length) { + shouldBeCloseTo("iframeWindowEntries[0].time", "iframeWindowTime", timestampTolerance); + } + finishJSTest(); + document.scrollingElement.scrollTop = 0; } function runTest() { @@ -53,18 +55,19 @@ // Observer created here, callback created in iframe context. Timestamps should be // from this window. - var observer = new IntersectionObserver(targetIframe.contentDocument.createObserverCallback(topWindowEntries), {}); - observer.observe(target); + topWindowObserver = new IntersectionObserver(targetIframe.contentDocument.createObserverCallback(topWindowEntries), {}); + topWindowObserver.observe(target); // Callback created here, observer created in iframe. Timestamps should be // from iframe window. - observer = targetIframe.contentDocument.createObserver(function(newEntries) { + iframeWindowObserver = targetIframe.contentDocument.createObserver(function(newEntries) { for (var i = 0; i < newEntries.length; i++) iframeWindowEntries.push(newEntries[i]); }); - observer.observe(target); + iframeWindowObserver.observe(target); - step0(); + // See README for explanation of double RAF. + requestAnimationFrame(() => { requestAnimationFrame(step0) }); } window.onload = function() {
diff --git a/third_party/WebKit/LayoutTests/platform/linux/plugins/plugin-clip-subframe-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/plugins/plugin-clip-subframe-expected.txt deleted file mode 100644 index 8b13789..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/plugins/plugin-clip-subframe-expected.txt +++ /dev/null
@@ -1 +0,0 @@ -
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/input/reveal-caret-of-multiline-input-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/input/reveal-caret-of-multiline-input-expected.txt index 75b2ec0..8d0af1a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/input/reveal-caret-of-multiline-input-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/editing/input/reveal-caret-of-multiline-input-expected.txt
@@ -12,98 +12,68 @@ layer at (8,26) size 81x136 clip at (9,27) size 64x134 scrollY 98.00 scrollHeight 420 LayoutTextControl {TEXTAREA} at (0,0) size 81x136 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 60x416 - LayoutText {#text} at (0,0) size 14x13 + LayoutText {#text} at (0,0) size 19x403 text run at (0,0) width 14: "00" - LayoutBR {BR} at (13,0) size 1x13 - LayoutText {#text} at (0,13) size 13x13 + text run at (13,0) width 1: " " text run at (0,13) width 13: "01" - LayoutBR {BR} at (12,13) size 1x13 - LayoutText {#text} at (0,26) size 14x13 + text run at (12,13) width 1: " " text run at (0,26) width 14: "02" - LayoutBR {BR} at (13,26) size 1x13 - LayoutText {#text} at (0,39) size 14x13 + text run at (13,26) width 1: " " text run at (0,39) width 14: "03" - LayoutBR {BR} at (13,39) size 1x13 - LayoutText {#text} at (0,52) size 14x13 + text run at (13,39) width 1: " " text run at (0,52) width 14: "04" - LayoutBR {BR} at (14,52) size 0x13 - LayoutText {#text} at (0,65) size 14x13 + text run at (14,52) width 0: " " text run at (0,65) width 14: "05" - LayoutBR {BR} at (13,65) size 1x13 - LayoutText {#text} at (0,78) size 14x13 + text run at (13,65) width 1: " " text run at (0,78) width 14: "06" - LayoutBR {BR} at (13,78) size 1x13 - LayoutText {#text} at (0,91) size 13x13 + text run at (13,78) width 1: " " text run at (0,91) width 13: "07" - LayoutBR {BR} at (12,91) size 1x13 - LayoutText {#text} at (0,104) size 14x13 + text run at (12,91) width 1: " " text run at (0,104) width 14: "08" - LayoutBR {BR} at (13,104) size 1x13 - LayoutText {#text} at (0,117) size 14x13 + text run at (13,104) width 1: " " text run at (0,117) width 14: "09" - LayoutBR {BR} at (13,117) size 1x13 - LayoutText {#text} at (0,130) size 13x13 + text run at (13,117) width 1: " " text run at (0,130) width 13: "10" - LayoutBR {BR} at (12,130) size 1x13 - LayoutText {#text} at (0,143) size 11x13 + text run at (12,130) width 1: " " text run at (0,143) width 11: "11" - LayoutBR {BR} at (10,143) size 1x13 - LayoutText {#text} at (0,156) size 19x13 + text run at (10,143) width 1: " " text run at (0,156) width 19: ">12" - LayoutBR {BR} at (18,156) size 1x13 - LayoutText {#text} at (0,169) size 13x13 + text run at (18,156) width 1: " " text run at (0,169) width 13: "13" - LayoutBR {BR} at (12,169) size 1x13 - LayoutText {#text} at (0,182) size 13x13 + text run at (12,169) width 1: " " text run at (0,182) width 13: "14" - LayoutBR {BR} at (12,182) size 1x13 - LayoutText {#text} at (0,195) size 12x13 + text run at (12,182) width 1: " " text run at (0,195) width 12: "15" - LayoutBR {BR} at (11,195) size 1x13 - LayoutText {#text} at (0,208) size 13x13 + text run at (11,195) width 1: " " text run at (0,208) width 13: "16" - LayoutBR {BR} at (12,208) size 1x13 - LayoutText {#text} at (0,221) size 12x13 + text run at (12,208) width 1: " " text run at (0,221) width 12: "17" - LayoutBR {BR} at (11,221) size 1x13 - LayoutText {#text} at (0,234) size 13x13 + text run at (11,221) width 1: " " text run at (0,234) width 13: "18" - LayoutBR {BR} at (12,234) size 1x13 - LayoutText {#text} at (0,247) size 13x13 + text run at (12,234) width 1: " " text run at (0,247) width 13: "19" - LayoutBR {BR} at (12,247) size 1x13 - LayoutText {#text} at (0,260) size 14x13 + text run at (12,247) width 1: " " text run at (0,260) width 14: "20" - LayoutBR {BR} at (13,260) size 1x13 - LayoutText {#text} at (0,273) size 12x13 + text run at (13,260) width 1: " " text run at (0,273) width 12: "21" - LayoutBR {BR} at (11,273) size 1x13 - LayoutText {#text} at (0,286) size 14x13 + text run at (11,273) width 1: " " text run at (0,286) width 14: "22" - LayoutBR {BR} at (13,286) size 1x13 - LayoutText {#text} at (0,299) size 14x13 + text run at (13,286) width 1: " " text run at (0,299) width 14: "23" - LayoutBR {BR} at (13,299) size 1x13 - LayoutText {#text} at (0,312) size 14x13 + text run at (13,299) width 1: " " text run at (0,312) width 14: "24" - LayoutBR {BR} at (13,312) size 1x13 - LayoutText {#text} at (0,325) size 14x13 + text run at (13,312) width 1: " " text run at (0,325) width 14: "25" - LayoutBR {BR} at (13,325) size 1x13 - LayoutText {#text} at (0,338) size 14x13 + text run at (13,325) width 1: " " text run at (0,338) width 14: "26" - LayoutBR {BR} at (13,338) size 1x13 - LayoutText {#text} at (0,351) size 13x13 + text run at (13,338) width 1: " " text run at (0,351) width 13: "27" - LayoutBR {BR} at (12,351) size 1x13 - LayoutText {#text} at (0,364) size 14x13 + text run at (12,351) width 1: " " text run at (0,364) width 14: "28" - LayoutBR {BR} at (13,364) size 1x13 - LayoutText {#text} at (0,377) size 14x13 + text run at (13,364) width 1: " " text run at (0,377) width 14: "29" - LayoutBR {BR} at (13,377) size 1x13 - LayoutText {#text} at (0,390) size 14x13 + text run at (13,377) width 1: " " text run at (0,390) width 14: "30" - LayoutBR {BR} at (13,390) size 1x13 + text run at (13,390) width 1: " " LayoutBR {BR} at (0,403) size 0x13 -caret: position 1 of child 24 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body +caret: position 37 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/basic-textareas-quirks-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/basic-textareas-quirks-expected.txt index 10d2092..87233ca 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/basic-textareas-quirks-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/basic-textareas-quirks-expected.txt
@@ -689,203 +689,161 @@ layer at (376,879) size 141x47 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollWidth 183 scrollHeight 212 LayoutTextControl {TEXTAREA} at (14.61,1) size 141x47 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x208 - LayoutText {#text} at (0,0) size 4x13 + LayoutText {#text} at (0,0) size 182x195 text run at (0,0) width 4: " " - LayoutBR {BR} at (3,11) size 1x0 - LayoutText {#text} at (0,13) size 182x13 + text run at (3,0) width 1: " " text run at (0,13) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,26) size 182x13 + text run at (181,13) width 1: " " text run at (0,26) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,39) size 182x13 + text run at (181,26) width 1: " " text run at (0,39) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,52) size 182x13 + text run at (181,39) width 1: " " text run at (0,52) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,65) size 182x13 + text run at (181,52) width 1: " " text run at (0,65) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,78) size 182x13 + text run at (181,65) width 1: " " text run at (0,78) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,91) size 182x13 + text run at (181,78) width 1: " " text run at (0,91) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,104) size 182x13 + text run at (181,91) width 1: " " text run at (0,104) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,117) size 182x13 + text run at (181,104) width 1: " " text run at (0,117) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,130) size 182x13 + text run at (181,117) width 1: " " text run at (0,130) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,143) size 182x13 + text run at (181,130) width 1: " " text run at (0,143) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,156) size 182x13 + text run at (181,143) width 1: " " text run at (0,156) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,169) size 182x13 + text run at (181,156) width 1: " " text run at (0,169) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 - LayoutText {#text} at (0,182) size 182x13 + text run at (181,169) width 1: " " text run at (0,182) width 182: "This is a text area with wrap=\"soft\"" - LayoutBR {BR} at (0,0) size 0x0 + text run at (181,182) width 1: " " LayoutBR {BR} at (0,195) size 0x13 layer at (376,945) size 141x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 394 LayoutTextControl {TEXTAREA} at (14.61,1) size 141x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x390 - LayoutText {#text} at (0,0) size 4x13 + LayoutText {#text} at (0,0) size 120x377 text run at (0,0) width 4: " " - LayoutBR {BR} at (3,11) size 1x0 - LayoutText {#text} at (0,13) size 120x26 + text run at (3,0) width 1: " " text run at (0,13) width 116: "This is a text area with" text run at (115,13) width 5: " " text run at (0,26) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,37) size 1x0 - LayoutText {#text} at (0,39) size 120x26 + text run at (62,26) width 1: " " text run at (0,39) width 116: "This is a text area with" text run at (115,39) width 5: " " text run at (0,52) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,63) size 1x0 - LayoutText {#text} at (0,65) size 120x26 + text run at (62,52) width 1: " " text run at (0,65) width 116: "This is a text area with" text run at (115,65) width 5: " " text run at (0,78) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,89) size 1x0 - LayoutText {#text} at (0,91) size 120x26 + text run at (62,78) width 1: " " text run at (0,91) width 116: "This is a text area with" text run at (115,91) width 5: " " text run at (0,104) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,115) size 1x0 - LayoutText {#text} at (0,117) size 120x26 + text run at (62,104) width 1: " " text run at (0,117) width 116: "This is a text area with" text run at (115,117) width 5: " " text run at (0,130) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,141) size 1x0 - LayoutText {#text} at (0,143) size 120x26 + text run at (62,130) width 1: " " text run at (0,143) width 116: "This is a text area with" text run at (115,143) width 5: " " text run at (0,156) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,167) size 1x0 - LayoutText {#text} at (0,169) size 120x26 + text run at (62,156) width 1: " " text run at (0,169) width 116: "This is a text area with" text run at (115,169) width 5: " " text run at (0,182) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,193) size 1x0 - LayoutText {#text} at (0,195) size 120x26 + text run at (62,182) width 1: " " text run at (0,195) width 116: "This is a text area with" text run at (115,195) width 5: " " text run at (0,208) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,219) size 1x0 - LayoutText {#text} at (0,221) size 120x26 + text run at (62,208) width 1: " " text run at (0,221) width 116: "This is a text area with" text run at (115,221) width 5: " " text run at (0,234) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,245) size 1x0 - LayoutText {#text} at (0,247) size 120x26 + text run at (62,234) width 1: " " text run at (0,247) width 116: "This is a text area with" text run at (115,247) width 5: " " text run at (0,260) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,271) size 1x0 - LayoutText {#text} at (0,273) size 120x26 + text run at (62,260) width 1: " " text run at (0,273) width 116: "This is a text area with" text run at (115,273) width 5: " " text run at (0,286) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,297) size 1x0 - LayoutText {#text} at (0,299) size 120x26 + text run at (62,286) width 1: " " text run at (0,299) width 116: "This is a text area with" text run at (115,299) width 5: " " text run at (0,312) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,323) size 1x0 - LayoutText {#text} at (0,325) size 120x26 + text run at (62,312) width 1: " " text run at (0,325) width 116: "This is a text area with" text run at (115,325) width 5: " " text run at (0,338) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,349) size 1x0 - LayoutText {#text} at (0,351) size 120x26 + text run at (62,338) width 1: " " text run at (0,351) width 116: "This is a text area with" text run at (115,351) width 5: " " text run at (0,364) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,375) size 1x0 + text run at (62,364) width 1: " " LayoutBR {BR} at (0,377) size 0x13 layer at (376,996) size 141x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 394 LayoutTextControl {TEXTAREA} at (14.61,1) size 141x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x390 - LayoutText {#text} at (0,0) size 4x13 + LayoutText {#text} at (0,0) size 120x377 text run at (0,0) width 4: " " - LayoutBR {BR} at (3,11) size 1x0 - LayoutText {#text} at (0,13) size 120x26 + text run at (3,0) width 1: " " text run at (0,13) width 116: "This is a text area with" text run at (115,13) width 5: " " text run at (0,26) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,37) size 1x0 - LayoutText {#text} at (0,39) size 120x26 + text run at (62,26) width 1: " " text run at (0,39) width 116: "This is a text area with" text run at (115,39) width 5: " " text run at (0,52) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,63) size 1x0 - LayoutText {#text} at (0,65) size 120x26 + text run at (62,52) width 1: " " text run at (0,65) width 116: "This is a text area with" text run at (115,65) width 5: " " text run at (0,78) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,89) size 1x0 - LayoutText {#text} at (0,91) size 120x26 + text run at (62,78) width 1: " " text run at (0,91) width 116: "This is a text area with" text run at (115,91) width 5: " " text run at (0,104) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,115) size 1x0 - LayoutText {#text} at (0,117) size 120x26 + text run at (62,104) width 1: " " text run at (0,117) width 116: "This is a text area with" text run at (115,117) width 5: " " text run at (0,130) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,141) size 1x0 - LayoutText {#text} at (0,143) size 120x26 + text run at (62,130) width 1: " " text run at (0,143) width 116: "This is a text area with" text run at (115,143) width 5: " " text run at (0,156) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,167) size 1x0 - LayoutText {#text} at (0,169) size 120x26 + text run at (62,156) width 1: " " text run at (0,169) width 116: "This is a text area with" text run at (115,169) width 5: " " text run at (0,182) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,193) size 1x0 - LayoutText {#text} at (0,195) size 120x26 + text run at (62,182) width 1: " " text run at (0,195) width 116: "This is a text area with" text run at (115,195) width 5: " " text run at (0,208) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,219) size 1x0 - LayoutText {#text} at (0,221) size 120x26 + text run at (62,208) width 1: " " text run at (0,221) width 116: "This is a text area with" text run at (115,221) width 5: " " text run at (0,234) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,245) size 1x0 - LayoutText {#text} at (0,247) size 120x26 + text run at (62,234) width 1: " " text run at (0,247) width 116: "This is a text area with" text run at (115,247) width 5: " " text run at (0,260) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,271) size 1x0 - LayoutText {#text} at (0,273) size 120x26 + text run at (62,260) width 1: " " text run at (0,273) width 116: "This is a text area with" text run at (115,273) width 5: " " text run at (0,286) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,297) size 1x0 - LayoutText {#text} at (0,299) size 120x26 + text run at (62,286) width 1: " " text run at (0,299) width 116: "This is a text area with" text run at (115,299) width 5: " " text run at (0,312) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,323) size 1x0 - LayoutText {#text} at (0,325) size 120x26 + text run at (62,312) width 1: " " text run at (0,325) width 116: "This is a text area with" text run at (115,325) width 5: " " text run at (0,338) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,349) size 1x0 - LayoutText {#text} at (0,351) size 120x26 + text run at (62,338) width 1: " " text run at (0,351) width 116: "This is a text area with" text run at (115,351) width 5: " " text run at (0,364) width 63: "wrap=\"soft\"" - LayoutBR {BR} at (62,375) size 1x0 + text run at (62,364) width 1: " " LayoutBR {BR} at (0,377) size 0x13
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scroll-height-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scroll-height-expected.txt index 9738805e..469a032 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scroll-height-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scroll-height-expected.txt
@@ -10,59 +10,44 @@ layer at (8,8) size 200x200 clip at (9,9) size 183x198 scrollHeight 316 LayoutTextControl {TEXTAREA} at (0,0) size 200x200 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 179x312 - LayoutText {#text} at (0,0) size 82x13 + LayoutText {#text} at (0,0) size 82x299 text run at (0,0) width 82: "Lots of content." - LayoutBR {BR} at (81,11) size 1x0 - LayoutText {#text} at (0,13) size 82x13 + text run at (81,0) width 1: " " text run at (0,13) width 82: "Lots of content." - LayoutBR {BR} at (81,24) size 1x0 - LayoutText {#text} at (0,26) size 82x13 + text run at (81,13) width 1: " " text run at (0,26) width 82: "Lots of content." - LayoutBR {BR} at (81,37) size 1x0 - LayoutText {#text} at (0,39) size 82x13 + text run at (81,26) width 1: " " text run at (0,39) width 82: "Lots of content." - LayoutBR {BR} at (81,50) size 1x0 - LayoutBR {BR} at (0,52) size 0x13 - LayoutText {#text} at (0,65) size 82x13 + text run at (81,39) width 1: " " + text run at (0,52) width 0: " " text run at (0,65) width 82: "Lots of content." - LayoutBR {BR} at (81,76) size 1x0 - LayoutText {#text} at (0,78) size 82x13 + text run at (81,65) width 1: " " text run at (0,78) width 82: "Lots of content." - LayoutBR {BR} at (81,89) size 1x0 - LayoutBR {BR} at (0,91) size 0x13 - LayoutText {#text} at (0,104) size 82x13 + text run at (81,78) width 1: " " + text run at (0,91) width 0: " " text run at (0,104) width 82: "Lots of content." - LayoutBR {BR} at (81,115) size 1x0 - LayoutText {#text} at (0,117) size 82x13 + text run at (81,104) width 1: " " text run at (0,117) width 82: "Lots of content." - LayoutBR {BR} at (81,128) size 1x0 - LayoutBR {BR} at (0,130) size 0x13 - LayoutText {#text} at (0,143) size 82x13 + text run at (81,117) width 1: " " + text run at (0,130) width 0: " " text run at (0,143) width 82: "Lots of content." - LayoutBR {BR} at (81,154) size 1x0 - LayoutText {#text} at (0,156) size 82x13 + text run at (81,143) width 1: " " text run at (0,156) width 82: "Lots of content." - LayoutBR {BR} at (81,167) size 1x0 - LayoutBR {BR} at (0,169) size 0x13 - LayoutText {#text} at (0,182) size 82x13 + text run at (81,156) width 1: " " + text run at (0,169) width 0: " " text run at (0,182) width 82: "Lots of content." - LayoutBR {BR} at (81,193) size 1x0 - LayoutText {#text} at (0,195) size 82x13 + text run at (81,182) width 1: " " text run at (0,195) width 82: "Lots of content." - LayoutBR {BR} at (81,206) size 1x0 - LayoutBR {BR} at (0,208) size 0x13 - LayoutText {#text} at (0,221) size 82x13 + text run at (81,195) width 1: " " + text run at (0,208) width 0: " " text run at (0,221) width 82: "Lots of content." - LayoutBR {BR} at (81,232) size 1x0 - LayoutText {#text} at (0,234) size 82x13 + text run at (81,221) width 1: " " text run at (0,234) width 82: "Lots of content." - LayoutBR {BR} at (81,245) size 1x0 - LayoutBR {BR} at (0,247) size 0x13 - LayoutText {#text} at (0,260) size 82x13 + text run at (81,234) width 1: " " + text run at (0,247) width 0: " " text run at (0,260) width 82: "Lots of content." - LayoutBR {BR} at (81,271) size 1x0 - LayoutText {#text} at (0,273) size 82x13 + text run at (81,260) width 1: " " text run at (0,273) width 82: "Lots of content." - LayoutBR {BR} at (81,284) size 1x0 - LayoutBR {BR} at (0,286) size 0x13 + text run at (81,273) width 1: " " + text run at (0,286) width 0: " " LayoutBR {BR} at (0,299) size 0x13
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrollbar-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrollbar-expected.txt index d402bb76..432485a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrollbar-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrollbar-expected.txt
@@ -10,18 +10,15 @@ layer at (8,26) size 141x84 clip at (9,27) size 124x82 scrollHeight 121 LayoutTextControl {TEXTAREA} at (0,18) size 141x84 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x117 - LayoutText {#text} at (0,0) size 6x13 + LayoutText {#text} at (0,0) size 8x52 text run at (0,0) width 6: "1" - LayoutBR {BR} at (5,11) size 1x0 - LayoutText {#text} at (0,13) size 7x13 + text run at (5,0) width 1: " " text run at (0,13) width 7: "2" - LayoutBR {BR} at (6,24) size 1x0 - LayoutText {#text} at (0,26) size 7x13 + text run at (6,13) width 1: " " text run at (0,26) width 7: "3" - LayoutBR {BR} at (6,37) size 1x0 - LayoutText {#text} at (0,39) size 8x13 + text run at (6,26) width 1: " " text run at (0,39) width 8: "4" - LayoutBR {BR} at (7,50) size 1x0 + text run at (7,39) width 1: " " LayoutText {#text} at (0,52) size 7x13 text run at (0,52) width 7: "5" LayoutText {#text} at (6,52) size 1x13 @@ -40,4 +37,4 @@ text run at (7,91) width 1: " " LayoutText {#text} at (0,104) size 0x13 text run at (0,104) width 0: " " -caret: position 0 of child 16 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body +caret: position 0 of child 9 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt index 2b0fc90..fe5a1ee 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt
@@ -10,17 +10,14 @@ layer at (8,26) size 141x32 clip at (9,27) size 124x30 scrollY 39.00 scrollHeight 69 LayoutTextControl {TEXTAREA} at (0,18) size 141x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x65 - LayoutText {#text} at (0,0) size 6x13 + LayoutText {#text} at (0,0) size 8x52 text run at (0,0) width 6: "1" - LayoutBR {BR} at (5,0) size 1x13 - LayoutText {#text} at (0,13) size 7x13 + text run at (5,0) width 1: " " text run at (0,13) width 7: "2" - LayoutBR {BR} at (6,13) size 1x13 - LayoutText {#text} at (0,26) size 7x13 + text run at (6,13) width 1: " " text run at (0,26) width 7: "3" - LayoutBR {BR} at (6,26) size 1x13 - LayoutText {#text} at (0,39) size 8x13 + text run at (6,26) width 1: " " text run at (0,39) width 8: "4" - LayoutBR {BR} at (7,39) size 1x13 + text run at (7,39) width 1: " " LayoutBR {BR} at (0,52) size 0x13 -caret: position 0 of child 8 {BR} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body +caret: position 0 of child 1 {BR} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-mask-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-mask-expected.txt index 98e5599..15d83677 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-mask-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-mask-expected.txt
@@ -10,16 +10,13 @@ layer at (8,26) size 141x32 clip at (9,27) size 124x30 transparent scrollY 39.00 scrollHeight 69 LayoutTextControl {TEXTAREA} at (0,18) size 141x32 [bgcolor=#D3D3D3] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x65 - LayoutText {#text} at (0,0) size 6x13 + LayoutText {#text} at (0,0) size 8x52 text run at (0,0) width 6: "1" - LayoutBR {BR} at (5,0) size 1x13 - LayoutText {#text} at (0,13) size 7x13 + text run at (5,0) width 1: " " text run at (0,13) width 7: "2" - LayoutBR {BR} at (6,13) size 1x13 - LayoutText {#text} at (0,26) size 7x13 + text run at (6,13) width 1: " " text run at (0,26) width 7: "3" - LayoutBR {BR} at (6,26) size 1x13 - LayoutText {#text} at (0,39) size 8x13 + text run at (6,26) width 1: " " text run at (0,39) width 8: "4" - LayoutBR {BR} at (7,39) size 1x13 + text run at (7,39) width 1: " " LayoutBR {BR} at (0,52) size 0x13
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-type-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-type-expected.txt index 04aeda3..bed0687 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-type-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-scrolled-type-expected.txt
@@ -14,65 +14,46 @@ layer at (8,26) size 141x97 clip at (9,27) size 124x95 scrollY 182.00 scrollHeight 277 LayoutTextControl {TEXTAREA} at (0,18) size 141x97 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x273 - LayoutText {#text} at (0,0) size 6x13 + LayoutText {#text} at (0,0) size 40x260 text run at (0,0) width 6: "1" - LayoutBR {BR} at (5,11) size 1x0 - LayoutText {#text} at (0,13) size 7x13 + text run at (5,0) width 1: " " text run at (0,13) width 7: "2" - LayoutBR {BR} at (6,24) size 1x0 - LayoutText {#text} at (0,26) size 7x13 + text run at (6,13) width 1: " " text run at (0,26) width 7: "3" - LayoutBR {BR} at (6,37) size 1x0 - LayoutText {#text} at (0,39) size 8x13 + text run at (6,26) width 1: " " text run at (0,39) width 8: "4" - LayoutBR {BR} at (7,50) size 1x0 - LayoutText {#text} at (0,52) size 7x13 + text run at (7,39) width 1: " " text run at (0,52) width 7: "5" - LayoutBR {BR} at (6,63) size 1x0 - LayoutText {#text} at (0,65) size 7x13 + text run at (6,52) width 1: " " text run at (0,65) width 7: "6" - LayoutBR {BR} at (7,76) size 0x0 - LayoutText {#text} at (0,78) size 7x13 + text run at (7,65) width 0: " " text run at (0,78) width 7: "7" - LayoutBR {BR} at (6,89) size 1x0 - LayoutText {#text} at (0,91) size 8x13 + text run at (6,78) width 1: " " text run at (0,91) width 8: "8" - LayoutBR {BR} at (7,102) size 1x0 - LayoutText {#text} at (0,104) size 7x13 + text run at (7,91) width 1: " " text run at (0,104) width 7: "9" - LayoutBR {BR} at (7,115) size 0x0 - LayoutText {#text} at (0,117) size 13x13 + text run at (7,104) width 0: " " text run at (0,117) width 13: "10" - LayoutBR {BR} at (12,128) size 1x0 - LayoutText {#text} at (0,130) size 11x13 + text run at (12,117) width 1: " " text run at (0,130) width 11: "11" - LayoutBR {BR} at (10,141) size 1x0 - LayoutText {#text} at (0,143) size 12x13 + text run at (10,130) width 1: " " text run at (0,143) width 12: "12" - LayoutBR {BR} at (11,154) size 1x0 - LayoutText {#text} at (0,156) size 13x13 + text run at (11,143) width 1: " " text run at (0,156) width 13: "13" - LayoutBR {BR} at (12,167) size 1x0 - LayoutText {#text} at (0,169) size 13x13 + text run at (12,156) width 1: " " text run at (0,169) width 13: "14" - LayoutBR {BR} at (12,180) size 1x0 - LayoutText {#text} at (0,182) size 12x13 + text run at (12,169) width 1: " " text run at (0,182) width 12: "15" - LayoutBR {BR} at (11,193) size 1x0 - LayoutText {#text} at (0,195) size 13x13 + text run at (11,182) width 1: " " text run at (0,195) width 13: "16" - LayoutBR {BR} at (12,206) size 1x0 - LayoutText {#text} at (0,208) size 12x13 + text run at (12,195) width 1: " " text run at (0,208) width 12: "17" - LayoutBR {BR} at (11,219) size 1x0 - LayoutText {#text} at (0,221) size 40x13 + text run at (11,208) width 1: " " text run at (0,221) width 40: "18 Pass" - LayoutBR {BR} at (39,232) size 1x0 - LayoutText {#text} at (0,234) size 13x13 + text run at (39,221) width 1: " " text run at (0,234) width 13: "19" - LayoutBR {BR} at (12,245) size 1x0 - LayoutText {#text} at (0,247) size 14x13 + text run at (12,234) width 1: " " text run at (0,247) width 14: "20" - LayoutBR {BR} at (13,258) size 1x0 + text run at (13,247) width 1: " " LayoutBR {BR} at (0,260) size 0x13 -caret: position 7 of child 34 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body +caret: position 49 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-width-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-width-expected.txt index 198bf16..18805e0d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-width-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/textarea/textarea-width-expected.txt
@@ -16,5 +16,5 @@ LayoutText {#text} at (0,0) size 540x24 text run at (0,0) width 540: "1234567890abcdefghijABCDEFGHIJ1234567890abcdefghijABCDEFGHIJ12345X7890abcdefghijABCDEFGXIJ" text run at (0,12) width 180: "1234567890abcdefghijABCDEFGHIJ" - LayoutBR {BR} at (179,22) size 1x0 + text run at (179,12) width 1: " " LayoutBR {BR} at (0,24) size 0x12
diff --git a/third_party/WebKit/LayoutTests/platform/mac/plugins/plugin-clip-subframe-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/plugins/plugin-clip-subframe-expected.txt deleted file mode 100644 index 73b286f..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/plugins/plugin-clip-subframe-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -CONSOLE MESSAGE: line 5: NPP_SetWindow: NULL window, Rect {0, 0, 300, 150}, Clip Rect {65518, 65318, 65518, 65318}, Type 2 -
diff --git a/third_party/WebKit/LayoutTests/platform/win/plugins/plugin-clip-subframe-expected.txt b/third_party/WebKit/LayoutTests/platform/win/plugins/plugin-clip-subframe-expected.txt deleted file mode 100644 index 3b9fba2f..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/plugins/plugin-clip-subframe-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -CONSOLE MESSAGE: line 5: NPP_SetWindow: non-NULL window, Rect {0, 0, 300, 150}, Clip Rect {0, 0, 0, 0}, Type 1 -
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/gesture-scroll-amount-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/gesture-scroll-amount-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/gesture-scroll-amount-expected.txt rename to third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/gesture-scroll-amount-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/mousewheel-scroll-amount-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/mousewheel-scroll-amount-expected.txt similarity index 78% rename from third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/mousewheel-scroll-amount-expected.txt rename to third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/mousewheel-scroll-amount-expected.txt index 48b79ab..a2a09cc 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/mousewheel-scroll-amount-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/mousewheel-scroll-amount-expected.txt
@@ -1,4 +1,4 @@ -This test ensures that mouse wheel ticks scrolls the right amount pixels in high dpi mode. +This test ensures that mouse wheel ticks scrolls the right number of pixels in high dpi mode. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/plugins/plugin-clip-subframe.html b/third_party/WebKit/LayoutTests/plugins/plugin-clip-subframe.html deleted file mode 100644 index f90049b..0000000 --- a/third_party/WebKit/LayoutTests/plugins/plugin-clip-subframe.html +++ /dev/null
@@ -1,31 +0,0 @@ -<!doctype html> -<html> -<script> -function test() { - // Increase the size of the container so the iframe becomes visible. - document.getElementById("container").style.height = "400px"; - document.getElementById("container").offsetWidth; - setTimeout(done, 10); -} - -function done() { - if (testRunner) { - testRunner.dumpAsText(); - testRunner.notifyDone(); - } -} - -function runTest() { - if (testRunner) - testRunner.waitUntilDone(); - document.getElementById("container").offsetWidth; - setTimeout(test, 10); -} -</script> -<body onload="runTest()"> - -<div id = "container" style="overflow: hidden; width:100px; height:100px"> -<iframe id='subframe' src='resources/plugin-clip-subframe-iframe.html' width=500 height=500 style="margin-top:200px"></iframe> -</div> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/plugins/resources/plugin-clip-subframe-iframe.html b/third_party/WebKit/LayoutTests/plugins/resources/plugin-clip-subframe-iframe.html deleted file mode 100644 index e70c4aa..0000000 --- a/third_party/WebKit/LayoutTests/plugins/resources/plugin-clip-subframe-iframe.html +++ /dev/null
@@ -1,11 +0,0 @@ -<script> -var lastMessage; -function windowWasSet(msg) { - if (msg != lastMessage) - console.log(msg); - lastMessage = msg; -} -</script> - -<embed id="testCPlugin" type="application/x-webkit-test-netscape" test="log-npp-set-window"></embed> -<div id="output"></div>
diff --git a/third_party/WebKit/LayoutTests/svg/custom/svg-image-par-none-no-intrinsic-size-expected.html b/third_party/WebKit/LayoutTests/svg/custom/svg-image-par-none-no-intrinsic-size-expected.html index 57755c4..6e5bd58 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/svg-image-par-none-no-intrinsic-size-expected.html +++ b/third_party/WebKit/LayoutTests/svg/custom/svg-image-par-none-no-intrinsic-size-expected.html
@@ -1,2 +1,5 @@ <!DOCTYPE html> -<div style="width: 100px; height: 200px; background-color: green"></div> +<div style="display: inline-block; width: 100px; height: 200px; background-color: green"></div> +<svg width="100" height="200" preserveAspectRatio="none" viewBox="0 0 100 100"> + <circle r="50" cx="50" cy="50" fill="green"/> +</svg>
diff --git a/third_party/WebKit/LayoutTests/svg/custom/svg-image-par-none-no-intrinsic-size.html b/third_party/WebKit/LayoutTests/svg/custom/svg-image-par-none-no-intrinsic-size.html index 865c97a..5f5b8357 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/svg-image-par-none-no-intrinsic-size.html +++ b/third_party/WebKit/LayoutTests/svg/custom/svg-image-par-none-no-intrinsic-size.html
@@ -3,3 +3,7 @@ <image width="100" height="200" preserveAspectRatio="none" xlink:href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 200'><rect width='100' height='200' fill='green'/></svg>"/> </svg> +<svg width="100" height="200"> + <image width="100" height="200" preserveAspectRatio="none" + xlink:href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><circle r='50' cx='50' cy='50' fill='green'/></svg>"/> +</svg>
diff --git a/third_party/WebKit/LayoutTests/svg/hittest/text-small-font-size-and-viewbox-expected.txt b/third_party/WebKit/LayoutTests/svg/hittest/text-small-font-size-and-viewbox-expected.txt new file mode 100644 index 0000000..f1218a7e --- /dev/null +++ b/third_party/WebKit/LayoutTests/svg/hittest/text-small-font-size-and-viewbox-expected.txt
@@ -0,0 +1,6 @@ +ABCDEFGH +ABCDEFGH +This is a testharness.js-based test. +PASS Hit-test of text with fractional (< 1) font-size and small (high scalefactor) viewBox +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/svg/hittest/text-small-font-size-and-viewbox.html b/third_party/WebKit/LayoutTests/svg/hittest/text-small-font-size-and-viewbox.html new file mode 100644 index 0000000..564bece --- /dev/null +++ b/third_party/WebKit/LayoutTests/svg/hittest/text-small-font-size-and-viewbox.html
@@ -0,0 +1,54 @@ +<!DOCTYPE html> +<title>Hit-test of text with fractional (< 1) font-size and small (high scalefactor) viewBox</title> +<script src="../../resources/ahem.js"></script> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<style> +svg { + margin: 0px; + padding: 0px; + position: absolute; + top: 0px; + left: 0px; + width: 800px; +} +</style> +<svg viewBox="0 0 22 28" font-family="Ahem" font-size="0.125" fill="blue"> + <text y="2.438"><a xlink:href="#">ABCDEFGH</a></text> + <text y="4.698" x="7.571"><a xlink:href="#">ABCDEFGH</a></text> +</svg> +<script> +test(function() { + var links = document.querySelectorAll('a'); + + [ + { x: 2, y: 85 }, + { x: 4, y: 87 }, + { x: 2, y: 89 }, + { x: 6, y: 85 }, + { x: 4, y: 87 }, + { x: 6, y: 89 }, + { x: 10, y: 87 }, + { x: 14, y: 87 }, + { x: 18, y: 87 }, + { x: 22, y: 87 }, + { x: 26, y: 87 }, + ].forEach(function(point) { + assert_equals(document.elementFromPoint(point.x, point.y), links[0], point.x + ',' + point.y); + }); + + [ + { x: 278, y: 169 }, + { x: 276, y: 171 }, + { x: 278, y: 169 }, + { x: 280, y: 171 }, + { x: 284, y: 169 }, + { x: 288, y: 169 }, + { x: 292, y: 169 }, + { x: 296, y: 169 }, + { x: 300, y: 169 }, + ].forEach(function(point) { + assert_equals(document.elementFromPoint(point.x, point.y), links[1], point.x + ',' + point.y); + }); +}); +</script>
diff --git a/third_party/WebKit/LayoutTests/svg/text/lengthAdjust-text-metrics-expected.txt b/third_party/WebKit/LayoutTests/svg/text/lengthAdjust-text-metrics-expected.txt index a3f1da3..917f661 100644 --- a/third_party/WebKit/LayoutTests/svg/text/lengthAdjust-text-metrics-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/text/lengthAdjust-text-metrics-expected.txt
@@ -18,9 +18,9 @@ FAIL lengthToString(svgText.getSubStringLength(0, 2)) should be 117.9. Was 115.2. FAIL lengthToString(svgText.getSubStringLength(0, 3)) should be 169.2. Was 169.7. PASS lengthToString(svgText.getSubStringLength(0, 4)) is "200.0" -FAIL lengthToString(svgText.getSubStringLength(1, 1)) should be 56.4. Was 60.6. -FAIL lengthToString(svgText.getSubStringLength(1, 2)) should be 107.7. Was 115.2. -FAIL lengthToString(svgText.getSubStringLength(1, 3)) should be 138.5. Was 145.5. +FAIL lengthToString(svgText.getSubStringLength(1, 1)) should be 56.4. Was 48.6. +FAIL lengthToString(svgText.getSubStringLength(1, 2)) should be 107.7. Was 103.1. +FAIL lengthToString(svgText.getSubStringLength(1, 3)) should be 138.5. Was 133.4. FAIL lengthToString(svgText.getSubStringLength(2, 1)) should be 51.3. Was 54.5. FAIL lengthToString(svgText.getSubStringLength(2, 2)) should be 82.1. Was 84.8. FAIL lengthToString(svgText.getSubStringLength(3, 1)) should be 30.8. Was 30.3.
diff --git a/third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js b/third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js index d11c38e..029a772 100644 --- a/third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js +++ b/third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js
@@ -134,20 +134,19 @@ } open() { - // TODO(reillyg): Check if the device is opened and return - // OpenDeviceError.ALREADY_OPEN. + assert_false(this.opened_); this.opened_ = true; return Promise.resolve({ error: device.OpenDeviceError.OK }); } close() { + assert_true(this.opened_); this.opened_ = false; - return Promise.resolve({}); + return Promise.resolve({ error: device.OpenDeviceError.OK }); } setConfiguration(value) { - if (!this.opened_) - return Promise.resolve({ success: false }); + assert_true(this.opened_); let selected_configuration = this.info_.configurations.find( configuration => configuration.configuration_value == value); @@ -160,8 +159,7 @@ } claimInterface(interfaceNumber) { - if (!this.opened_) - return Promise.resolve({ success: false }); + assert_true(this.opened_); if (this.currentConfiguration_ === undefined) return Promise.resolve({ success: false }); @@ -179,8 +177,7 @@ } releaseInterface(interfaceNumber) { - if (!this.opened_) - return Promise.resolve({ success: false }); + assert_true(this.opened_); if (this.currentConfiguration_ === undefined) return Promise.resolve({ success: false }); @@ -194,7 +191,9 @@ } setInterfaceAlternateSetting(interfaceNumber, alternateSetting) { - if (!this.opened_ || this.currentConfiguration_ === undefined) + assert_true(this.opened_); + + if (this.currentConfiguration_ === undefined) return Promise.resolve({ success: false }); if (!this.claimedInterfaces_.has(interfaceNumber)) @@ -215,15 +214,18 @@ } reset() { - return Promise.resolve({ success: this.opened_ }); + assert_true(this.opened_); + return Promise.resolve({ success: true }); } clearHalt(endpoint) { + assert_true(this.opened_); // TODO(reillyg): Check that endpoint is valid. - return Promise.resolve({ success: this.opened_ }); + return Promise.resolve({ success: true }); } controlTransferIn(params, length, timeout) { + assert_true(this.opened_); return Promise.resolve({ status: device.TransferStatus.OK, data: [length >> 8, length & 0xff, params.request, params.value >> 8, @@ -232,6 +234,7 @@ } controlTransferOut(params, data, timeout) { + assert_true(this.opened_); return Promise.resolve({ status: device.TransferStatus.OK, bytesWritten: data.byteLength @@ -239,6 +242,7 @@ } genericTransferIn(endpointNumber, length, timeout) { + assert_true(this.opened_); // TODO(reillyg): Check that endpoint is valid. let data = new Array(length); for (let i = 0; i < length; ++i) @@ -250,6 +254,7 @@ } genericTransferOut(endpointNumber, data, timeout) { + assert_true(this.opened_); // TODO(reillyg): Check that endpoint is valid. return Promise.resolve({ status: device.TransferStatus.OK, @@ -258,6 +263,7 @@ } isochronousTransferIn(endpointNumber, packetLengths, timeout) { + assert_true(this.opened_); // TODO(reillyg): Check that endpoint is valid. let data = new Array(packetLengths.reduce((a, b) => a + b, 0)); let dataOffset = 0; @@ -275,6 +281,7 @@ } isochronousTransferOut(endpointNumber, data, packetLengths, timeout) { + assert_true(this.opened_); // TODO(reillyg): Check that endpoint is valid. let packets = new Array(packetLengths.length); for (let i = 0; i < packetLengths.length; ++i) {
diff --git a/third_party/WebKit/LayoutTests/usb/usbDevice.html b/third_party/WebKit/LayoutTests/usb/usbDevice.html index bd71cc6b..722f2db 100644 --- a/third_party/WebKit/LayoutTests/usb/usbDevice.html +++ b/third_party/WebKit/LayoutTests/usb/usbDevice.html
@@ -7,14 +7,25 @@ <script> 'use strict'; -function assertRejectsWithNotFoundError(promise) { +function assertRejectsWithError(promise, name, message) { return promise.then(() => { - assert_unreached('promise should reject'); + assert_unreached('expected promise to reject with ' + name); }, error => { - assert_equals(error.code, DOMException.NOT_FOUND_ERR); + assert_equals(error.name, name); + if (message !== undefined) + assert_equals(error.message, message); }); } +function assertRejectsWithNotFoundError(promise) { + return assertRejectsWithError(promise, 'NotFoundError'); +} + +function assertRejectsWithNotOpenError(promise) { + return assertRejectsWithError( + promise, 'InvalidStateError', 'The device must be open()ed first.') +} + usb_test(usb => { usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); return navigator.usb.getDevices().then(devices => { @@ -29,7 +40,13 @@ return navigator.usb.getDevices().then(devices => { assert_equals(1, devices.length); let device = devices[0]; - return device.open().then(() => device.close()); + assert_false(device.opened); + return device.open().then(() => { + assert_true(device.opened); + return device.close().then(() => { + assert_false(device.opened); + }); + }); }); }, 'a device can be opened and closed'); @@ -38,6 +55,43 @@ return navigator.usb.getDevices().then(devices => { assert_equals(1, devices.length); let device = devices[0]; + return device.open() + .then(() => device.open()) + .then(() => device.open()) + .then(() => device.open()) + .then(() => device.close()) + .then(() => device.close()) + .then(() => device.close()) + .then(() => device.close()); + }); +}, 'open and close can be called multiple times'); + +usb_test(usb => { + usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); + return navigator.usb.getDevices().then(devices => { + assert_equals(1, devices.length); + let device = devices[0]; + return Promise.all([ + device.open(), + assertRejectsWithError(device.open(), 'InvalidStateError', + 'An open() or close() task is in progress.'), + assertRejectsWithError(device.close(), 'InvalidStateError', + 'An open() or close() task is in progress.'), + ]).then(() => Promise.all([ + device.close(), + assertRejectsWithError(device.open(), 'InvalidStateError', + 'An open() or close() task is in progress.'), + assertRejectsWithError(device.close(), 'InvalidStateError', + 'An open() or close() task is in progress.'), + ])); + }); +}, 'open and close cannot be called again while open or close are in progress'); + +usb_test(usb => { + usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); + return navigator.usb.getDevices().then(devices => { + assert_equals(1, devices.length); + let device = devices[0]; return device.open().then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); return assertRejectsWithNotFoundError(device.close()); @@ -62,6 +116,42 @@ usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); return navigator.usb.getDevices().then(devices => { assert_equals(1, devices.length); + var device = devices[0]; + return Promise.all([ + assertRejectsWithNotOpenError(device.setConfiguration(1)), + assertRejectsWithNotOpenError(device.claimInterface(0)), + assertRejectsWithNotOpenError(device.releaseInterface(0)), + assertRejectsWithNotOpenError(device.setInterface(0, 1)), + assertRejectsWithNotOpenError(device.controlTransferIn({ + requestType: 'vendor', + recipient: 'device', + request: 0x42, + value: 0x1234, + index: 0x5678 + }, 7)), + assertRejectsWithNotOpenError(device.controlTransferOut({ + requestType: 'vendor', + recipient: 'device', + request: 0x42, + value: 0x1234, + index: 0x5678 + }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))), + assertRejectsWithNotOpenError(device.clearHalt(1)), + assertRejectsWithNotOpenError(device.transferIn(1, 8)), + assertRejectsWithNotOpenError( + device.transferOut(1, new ArrayBuffer(8))), + assertRejectsWithNotOpenError(device.isochronousTransferIn(1, [8])), + assertRejectsWithNotOpenError( + device.isochronousTransferOut(1, new ArrayBuffer(8), [8])), + assertRejectsWithNotOpenError(device.reset()) + ]); + }); +}, 'methods requiring it reject when the device is not open'); + +usb_test(usb => { + usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); + return navigator.usb.getDevices().then(devices => { + assert_equals(1, devices.length); let device = devices[0]; return device.open() .then(() => device.setConfiguration(1)) @@ -97,14 +187,8 @@ assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.getConfiguration() - .then(() => { - assert_unreached('getConfiguration should reject'); - }) - .catch(error => { - assert_equals(error.code, DOMException.NOT_FOUND_ERR); - return Promise.resolve(); - })) + .then(() => + assertRejectsWithError(device.getConfiguration(), 'NotFoundError')) .then(() => device.close()); }); }, 'querying an unset configuration raises NotFoundError'); @@ -128,15 +212,9 @@ assert_equals(1, devices.length); let device = devices[0]; return device.open() - .then(() => device.claimInterface(0) - .then(() => { - assert_unreached('claimInterface should reject'); - }) - .catch(error => { + .then(() => // TODO(reillyg): This should be INVALID_STATE_ERR. - assert_equals(error.code, DOMException.NETWORK_ERR); - return Promise.resolve(); - })) + assertRejectsWithError(device.claimInterface(0), 'NetworkError')) .then(() => device.close()); }); }, 'claiming an interface fails without an active configuration');
diff --git a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt index 9b6375e..3ed7dd3 100644 --- a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt
@@ -11,6 +11,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -36,6 +37,7 @@ PASS lastPointerEvent.bubbles is false PASS lastPointerEvent.cancelable is false PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -61,6 +63,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -88,6 +91,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 25 PASS lastPointerEvent.clientY is 41 @@ -113,6 +117,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -140,6 +145,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -165,6 +171,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -190,6 +197,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -215,6 +223,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -240,6 +249,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -265,6 +275,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -624,6 +635,7 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 13 PASS lastPointerEvent.clientY is 21 @@ -649,6 +661,7 @@ PASS lastPointerEvent.bubbles is false PASS lastPointerEvent.cancelable is false PASS lastPointerEvent.pointerId is 1 +PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 13 PASS lastPointerEvent.clientY is 21
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index 135fb89..5c91ba2 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -5614,6 +5614,7 @@ getter deviceVersionSubminor getter guid getter manufacturerName + getter opened getter productId getter productName getter serialNumber
diff --git a/third_party/WebKit/LayoutTests/whitespace.txt b/third_party/WebKit/LayoutTests/whitespace.txt index 7fb10c4..a1d6222 100644 --- a/third_party/WebKit/LayoutTests/whitespace.txt +++ b/third_party/WebKit/LayoutTests/whitespace.txt
@@ -13,3 +13,4 @@ A PNG image exploded nearby, "Aw Snap!". What was that? T'was the sound of a broken interval record. +
diff --git a/third_party/WebKit/Source/bindings/core/v8/ActiveDOMCallback.cpp b/third_party/WebKit/Source/bindings/core/v8/ActiveDOMCallback.cpp index 7ad6a7a..b0b057be 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ActiveDOMCallback.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ActiveDOMCallback.cpp
@@ -47,13 +47,13 @@ bool ActiveDOMCallback::canInvokeCallback() const { - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); return context && !context->activeDOMObjectsAreSuspended() && !context->activeDOMObjectsAreStopped(); } bool ActiveDOMCallback::isScriptControllerTerminating() const { - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); if (context && context->isWorkerGlobalScope()) { WorkerOrWorkletScriptController* scriptController = toWorkerGlobalScope(context)->scriptController(); if (!scriptController || scriptController->isExecutionForbidden() || scriptController->isExecutionTerminating())
diff --git a/third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp b/third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp index 66d06a05..a9f64e96 100644 --- a/third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp
@@ -42,7 +42,7 @@ static bool isOriginAccessibleFromDOMWindow(const SecurityOrigin* targetOrigin, const LocalDOMWindow* accessingWindow) { - return accessingWindow && accessingWindow->document()->securityOrigin()->canAccessCheckSuborigins(targetOrigin); + return accessingWindow && accessingWindow->document()->getSecurityOrigin()->canAccessCheckSuborigins(targetOrigin); } static bool canAccessFrame(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const SecurityOrigin* targetFrameOrigin, const DOMWindow* targetWindow, ExceptionState& exceptionState) @@ -75,7 +75,7 @@ const Frame* frame = target->frame(); if (!frame || !frame->securityContext()) return false; - return canAccessFrame(isolate, accessingWindow, frame->securityContext()->securityOrigin(), target, exceptionState); + return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), target, exceptionState); } bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const DOMWindow* target, SecurityReportingOption reportingOption) @@ -84,7 +84,7 @@ const Frame* frame = target->frame(); if (!frame || !frame->securityContext()) return false; - return canAccessFrame(isolate, accessingWindow, frame->securityContext()->securityOrigin(), target, reportingOption); + return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), target, reportingOption); } bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const EventTarget* target, ExceptionState& exceptionState) @@ -100,7 +100,7 @@ const Frame* frame = window->frame(); if (!frame || !frame->securityContext()) return false; - return canAccessFrame(isolate, accessingWindow, frame->securityContext()->securityOrigin(), window, exceptionState); + return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), window, exceptionState); } bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Location* target, ExceptionState& exceptionState) @@ -109,7 +109,7 @@ const Frame* frame = target->frame(); if (!frame || !frame->securityContext()) return false; - return canAccessFrame(isolate, accessingWindow, frame->securityContext()->securityOrigin(), frame->domWindow(), exceptionState); + return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), frame->domWindow(), exceptionState); } bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Location* target, SecurityReportingOption reportingOption) @@ -118,28 +118,28 @@ const Frame* frame = target->frame(); if (!frame || !frame->securityContext()) return false; - return canAccessFrame(isolate, accessingWindow, frame->securityContext()->securityOrigin(), frame->domWindow(), reportingOption); + return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), frame->domWindow(), reportingOption); } bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Node* target, ExceptionState& exceptionState) { if (!target) return false; - return canAccessFrame(isolate, accessingWindow, target->document().securityOrigin(), target->document().domWindow(), exceptionState); + return canAccessFrame(isolate, accessingWindow, target->document().getSecurityOrigin(), target->document().domWindow(), exceptionState); } bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Node* target, SecurityReportingOption reportingOption) { if (!target) return false; - return canAccessFrame(isolate, accessingWindow, target->document().securityOrigin(), target->document().domWindow(), reportingOption); + return canAccessFrame(isolate, accessingWindow, target->document().getSecurityOrigin(), target->document().domWindow(), reportingOption); } bool BindingSecurity::shouldAllowAccessToFrame(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Frame* target, SecurityReportingOption reportingOption) { if (!target || !target->securityContext()) return false; - return canAccessFrame(isolate, accessingWindow, target->securityContext()->securityOrigin(), target->domWindow(), reportingOption); + return canAccessFrame(isolate, accessingWindow, target->securityContext()->getSecurityOrigin(), target->domWindow(), reportingOption); } } // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/CallbackPromiseAdapter.h b/third_party/WebKit/Source/bindings/core/v8/CallbackPromiseAdapter.h index 3ec99b3..baabc3c 100644 --- a/third_party/WebKit/Source/bindings/core/v8/CallbackPromiseAdapter.h +++ b/third_party/WebKit/Source/bindings/core/v8/CallbackPromiseAdapter.h
@@ -160,7 +160,7 @@ { typename S::WebType result(adopt(r)); ScriptPromiseResolver* resolver = this->resolver(); - if (!resolver->executionContext() || resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!resolver->getExecutionContext() || resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; resolver->resolve(S::take(resolver, pass(result))); } @@ -172,7 +172,7 @@ void onSuccess() override { ScriptPromiseResolver* resolver = this->resolver(); - if (!resolver->executionContext() || resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!resolver->getExecutionContext() || resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; resolver->resolve(); } @@ -185,7 +185,7 @@ { typename T::WebType result(adopt(e)); ScriptPromiseResolver* resolver = this->resolver(); - if (!resolver->executionContext() || resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!resolver->getExecutionContext() || resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; resolver->reject(T::take(resolver, pass(result))); } @@ -197,7 +197,7 @@ void onError() override { ScriptPromiseResolver* resolver = this->resolver(); - if (!resolver->executionContext() || resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!resolver->getExecutionContext() || resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; resolver->reject(); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/Dictionary.cpp b/third_party/WebKit/Source/bindings/core/v8/Dictionary.cpp index d1a5c2a..f971970 100644 --- a/third_party/WebKit/Source/bindings/core/v8/Dictionary.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/Dictionary.cpp
@@ -63,7 +63,7 @@ ASSERT(m_isolate); ASSERT(m_exceptionState); #if ENABLE(ASSERT) - m_exceptionState->onStackObjectChecker().add(this); + m_exceptionState->getOnStackObjectChecker().add(this); #endif } @@ -71,7 +71,7 @@ { #if ENABLE(ASSERT) if (m_exceptionState) - m_exceptionState->onStackObjectChecker().remove(this); + m_exceptionState->getOnStackObjectChecker().remove(this); #endif } @@ -81,12 +81,12 @@ m_isolate = optionsObject.m_isolate; #if ENABLE(ASSERT) if (m_exceptionState) - m_exceptionState->onStackObjectChecker().remove(this); + m_exceptionState->getOnStackObjectChecker().remove(this); #endif m_exceptionState = optionsObject.m_exceptionState; #if ENABLE(ASSERT) if (m_exceptionState) - m_exceptionState->onStackObjectChecker().add(this); + m_exceptionState->getOnStackObjectChecker().add(this); #endif return *this; }
diff --git a/third_party/WebKit/Source/bindings/core/v8/ExceptionState.cpp b/third_party/WebKit/Source/bindings/core/v8/ExceptionState.cpp index a2a79c2..191f03d 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ExceptionState.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ExceptionState.cpp
@@ -52,7 +52,7 @@ void ExceptionState::reject(ScriptPromiseResolver* resolver) { - resolver->reject(m_exception.newLocal(resolver->scriptState()->isolate())); + resolver->reject(m_exception.newLocal(resolver->getScriptState()->isolate())); clearException(); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/ExceptionState.h b/third_party/WebKit/Source/bindings/core/v8/ExceptionState.h index 7aba7dcf..b34865a 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ExceptionState.h +++ b/third_party/WebKit/Source/bindings/core/v8/ExceptionState.h
@@ -116,7 +116,7 @@ } #if ENABLE(ASSERT) - OnStackObjectChecker& onStackObjectChecker() { return m_onStackObjectChecker; } + OnStackObjectChecker& getOnStackObjectChecker() { return m_onStackObjectChecker; } #endif protected:
diff --git a/third_party/WebKit/Source/bindings/core/v8/Iterable.h b/third_party/WebKit/Source/bindings/core/v8/Iterable.h index e91c67b5..e493adb 100644 --- a/third_party/WebKit/Source/bindings/core/v8/Iterable.h +++ b/third_party/WebKit/Source/bindings/core/v8/Iterable.h
@@ -71,7 +71,7 @@ } v8::Local<v8::Value> result; - if (!V8ScriptRunner::callFunction(v8Callback, scriptState->executionContext(), v8ThisArg, 3, args, isolate).ToLocal(&result)) { + if (!V8ScriptRunner::callFunction(v8Callback, scriptState->getExecutionContext(), v8ThisArg, 3, args, isolate).ToLocal(&result)) { exceptionState.rethrowV8Exception(tryCatch.Exception()); return; }
diff --git a/third_party/WebKit/Source/bindings/core/v8/NPV8Object.cpp b/third_party/WebKit/Source/bindings/core/v8/NPV8Object.cpp index a24ec20..ce0c4f0d 100644 --- a/third_party/WebKit/Source/bindings/core/v8/NPV8Object.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/NPV8Object.cpp
@@ -140,7 +140,7 @@ if (V8PerContextData* perContextData = V8PerContextData::from(object->CreationContext())) { int v8ObjectHash = object->GetIdentityHash(); ASSERT(v8ObjectHash); - V8NPObjectMap* v8NPObjectMap = perContextData->v8NPObjectMap(); + V8NPObjectMap* v8NPObjectMap = perContextData->getV8NPObjectMap(); V8NPObjectMap::iterator iter = v8NPObjectMap->find(v8ObjectHash); if (iter != v8NPObjectMap->end()) { V8NPObjectVector& objects = iter->value; @@ -195,7 +195,7 @@ v8::Local<v8::Object> v8Object = v8::Local<v8::Object>::New(isolate, v8NpObject->v8Object); ASSERT(!v8Object->CreationContext().IsEmpty()); if (V8PerContextData* perContextData = V8PerContextData::from(v8Object->CreationContext())) { - V8NPObjectMap* v8NPObjectMap = perContextData->v8NPObjectMap(); + V8NPObjectMap* v8NPObjectMap = perContextData->getV8NPObjectMap(); int v8ObjectHash = v8Object->GetIdentityHash(); ASSERT(v8ObjectHash); V8NPObjectMap::iterator iter = v8NPObjectMap->find(v8ObjectHash);
diff --git a/third_party/WebKit/Source/bindings/core/v8/PrivateScriptRunner.cpp b/third_party/WebKit/Source/bindings/core/v8/PrivateScriptRunner.cpp index 5351df6..5dd9f1c2 100644 --- a/third_party/WebKit/Source/bindings/core/v8/PrivateScriptRunner.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/PrivateScriptRunner.cpp
@@ -162,7 +162,7 @@ static v8::Local<v8::Object> classObjectOfPrivateScript(ScriptState* scriptState, String className) { ASSERT(scriptState->perContextData()); - ASSERT(scriptState->executionContext()); + ASSERT(scriptState->getExecutionContext()); v8::Isolate* isolate = scriptState->isolate(); v8::Local<v8::Value> compiledClass = scriptState->perContextData()->compiledPrivateScript(className); if (compiledClass.IsEmpty()) { @@ -196,7 +196,7 @@ if (classObject->Get(scriptState->context(), v8String(isolate, "initialize")).ToLocal(&initializeFunction) && initializeFunction->IsFunction()) { v8::TryCatch block(isolate); v8::Local<v8::Value> result; - if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(initializeFunction), scriptState->executionContext(), holder, 0, 0, isolate).ToLocal(&result)) { + if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(initializeFunction), scriptState->getExecutionContext(), holder, 0, 0, isolate).ToLocal(&result)) { fprintf(stderr, "Private script error: Object constructor threw an exception.\n"); dumpV8Message(context, block.Message()); RELEASE_ASSERT_NOT_REACHED(); @@ -305,7 +305,7 @@ initializeHolderIfNeeded(scriptState, classObject, holder); v8::TryCatch block(isolate); v8::Local<v8::Value> result; - if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(getter), scriptState->executionContext(), holder, 0, 0, isolate).ToLocal(&result)) { + if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(getter), scriptState->getExecutionContext(), holder, 0, 0, isolate).ToLocal(&result)) { rethrowExceptionInPrivateScript(isolate, block, scriptStateInUserScript, ExceptionState::GetterContext, attributeName, className); block.ReThrow(); return v8::Local<v8::Value>(); @@ -331,7 +331,7 @@ v8::Local<v8::Value> argv[] = { v8Value }; v8::TryCatch block(isolate); v8::Local<v8::Value> result; - if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(setter), scriptState->executionContext(), holder, WTF_ARRAY_LENGTH(argv), argv, isolate).ToLocal(&result)) { + if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(setter), scriptState->getExecutionContext(), holder, WTF_ARRAY_LENGTH(argv), argv, isolate).ToLocal(&result)) { rethrowExceptionInPrivateScript(isolate, block, scriptStateInUserScript, ExceptionState::SetterContext, attributeName, className); block.ReThrow(); return false; @@ -350,7 +350,7 @@ initializeHolderIfNeeded(scriptState, classObject, holder); v8::TryCatch block(scriptState->isolate()); v8::Local<v8::Value> result; - if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(method), scriptState->executionContext(), holder, argc, argv, scriptState->isolate()).ToLocal(&result)) { + if (!V8ScriptRunner::callFunction(v8::Local<v8::Function>::Cast(method), scriptState->getExecutionContext(), holder, argc, argv, scriptState->isolate()).ToLocal(&result)) { rethrowExceptionInPrivateScript(scriptState->isolate(), block, scriptStateInUserScript, ExceptionState::ExecutionContext, methodName, className); block.ReThrow(); return v8::Local<v8::Value>();
diff --git a/third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp index 49ddfe5..ba889fe 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp
@@ -59,10 +59,10 @@ { ASSERT(!v.isEmpty()); m_isSet = true; - v8::TryCatch block(v.scriptState()->isolate()); + v8::TryCatch block(v.getScriptState()->isolate()); v8::Local<v8::Value> value; v8::Local<v8::Value> item = v.v8Value(); - if (!item->IsObject() || !v8Call(v8UnpackIteratorResult(v.scriptState(), item.As<v8::Object>(), &m_isDone), value)) { + if (!item->IsObject() || !v8Call(v8UnpackIteratorResult(v.getScriptState(), item.As<v8::Object>(), &m_isDone), value)) { m_isValid = false; return; } @@ -134,7 +134,7 @@ , m_block(isolate()) , m_document(Document::create()) { - scriptState()->setExecutionContext(m_document.get()); + getScriptState()->setExecutionContext(m_document.get()); } ~ReadableStreamOperationsTest() override { @@ -143,8 +143,8 @@ EXPECT_FALSE(m_block.HasCaught()); } - ScriptState* scriptState() const { return m_scope.scriptState(); } - v8::Isolate* isolate() const { return scriptState()->isolate(); } + ScriptState* getScriptState() const { return m_scope.getScriptState(); } + v8::Isolate* isolate() const { return getScriptState()->isolate(); } ScriptValue eval(const char* s) { @@ -155,11 +155,11 @@ ADD_FAILURE(); return ScriptValue(); } - if (!v8Call(v8::Script::Compile(scriptState()->context(), source), script)) { + if (!v8Call(v8::Script::Compile(getScriptState()->context(), source), script)) { ADD_FAILURE() << "Compilation fails"; return ScriptValue(); } - return ScriptValue(scriptState(), script->Run(scriptState()->context())); + return ScriptValue(getScriptState(), script->Run(getScriptState()->context())); } ScriptValue evalWithPrintingError(const char* s) { @@ -179,23 +179,23 @@ TEST_F(ReadableStreamOperationsTest, IsReadableStream) { - EXPECT_FALSE(ReadableStreamOperations::isReadableStream(scriptState(), ScriptValue(scriptState(), v8::Undefined(isolate())))); - EXPECT_FALSE(ReadableStreamOperations::isReadableStream(scriptState(), ScriptValue::createNull(scriptState()))); - EXPECT_FALSE(ReadableStreamOperations::isReadableStream(scriptState(), ScriptValue(scriptState(), v8::Object::New(isolate())))); + EXPECT_FALSE(ReadableStreamOperations::isReadableStream(getScriptState(), ScriptValue(getScriptState(), v8::Undefined(isolate())))); + EXPECT_FALSE(ReadableStreamOperations::isReadableStream(getScriptState(), ScriptValue::createNull(getScriptState()))); + EXPECT_FALSE(ReadableStreamOperations::isReadableStream(getScriptState(), ScriptValue(getScriptState(), v8::Object::New(isolate())))); ScriptValue stream = evalWithPrintingError("new ReadableStream()"); EXPECT_FALSE(stream.isEmpty()); - EXPECT_TRUE(ReadableStreamOperations::isReadableStream(scriptState(), stream)); + EXPECT_TRUE(ReadableStreamOperations::isReadableStream(getScriptState(), stream)); } TEST_F(ReadableStreamOperationsTest, IsReadableStreamReaderInvalid) { - EXPECT_FALSE(ReadableStreamOperations::isReadableStreamReader(scriptState(), ScriptValue(scriptState(), v8::Undefined(isolate())))); - EXPECT_FALSE(ReadableStreamOperations::isReadableStreamReader(scriptState(), ScriptValue::createNull(scriptState()))); - EXPECT_FALSE(ReadableStreamOperations::isReadableStreamReader(scriptState(), ScriptValue(scriptState(), v8::Object::New(isolate())))); + EXPECT_FALSE(ReadableStreamOperations::isReadableStreamReader(getScriptState(), ScriptValue(getScriptState(), v8::Undefined(isolate())))); + EXPECT_FALSE(ReadableStreamOperations::isReadableStreamReader(getScriptState(), ScriptValue::createNull(getScriptState()))); + EXPECT_FALSE(ReadableStreamOperations::isReadableStreamReader(getScriptState(), ScriptValue(getScriptState(), v8::Object::New(isolate())))); ScriptValue stream = evalWithPrintingError("new ReadableStream()"); EXPECT_FALSE(stream.isEmpty()); - EXPECT_FALSE(ReadableStreamOperations::isReadableStreamReader(scriptState(), stream)); + EXPECT_FALSE(ReadableStreamOperations::isReadableStreamReader(getScriptState(), stream)); } TEST_F(ReadableStreamOperationsTest, GetReader) @@ -203,23 +203,23 @@ ScriptValue stream = evalWithPrintingError("new ReadableStream()"); EXPECT_FALSE(stream.isEmpty()); - EXPECT_FALSE(ReadableStreamOperations::isLocked(scriptState(), stream)); + EXPECT_FALSE(ReadableStreamOperations::isLocked(getScriptState(), stream)); ScriptValue reader; { TrackExceptionState es; - reader = ReadableStreamOperations::getReader(scriptState(), stream, es); + reader = ReadableStreamOperations::getReader(getScriptState(), stream, es); ASSERT_FALSE(es.hadException()); } - EXPECT_TRUE(ReadableStreamOperations::isLocked(scriptState(), stream)); + EXPECT_TRUE(ReadableStreamOperations::isLocked(getScriptState(), stream)); ASSERT_FALSE(reader.isEmpty()); - EXPECT_FALSE(ReadableStreamOperations::isReadableStream(scriptState(), reader)); - EXPECT_TRUE(ReadableStreamOperations::isReadableStreamReader(scriptState(), reader)); + EXPECT_FALSE(ReadableStreamOperations::isReadableStream(getScriptState(), reader)); + EXPECT_TRUE(ReadableStreamOperations::isReadableStreamReader(getScriptState(), reader)); // Already locked! { TrackExceptionState es; - reader = ReadableStreamOperations::getReader(scriptState(), stream, es); + reader = ReadableStreamOperations::getReader(getScriptState(), stream, es); ASSERT_TRUE(es.hadException()); } ASSERT_TRUE(reader.isEmpty()); @@ -230,11 +230,11 @@ ScriptValue stream = evalWithPrintingError("stream = new ReadableStream()"); EXPECT_FALSE(stream.isEmpty()); - EXPECT_FALSE(ReadableStreamOperations::isDisturbed(scriptState(), stream)); + EXPECT_FALSE(ReadableStreamOperations::isDisturbed(getScriptState(), stream)); ASSERT_FALSE(evalWithPrintingError("stream.cancel()").isEmpty()); - EXPECT_TRUE(ReadableStreamOperations::isDisturbed(scriptState(), stream)); + EXPECT_TRUE(ReadableStreamOperations::isDisturbed(getScriptState(), stream)); } TEST_F(ReadableStreamOperationsTest, Read) @@ -244,16 +244,16 @@ "function start(c) { controller = c; }" "new ReadableStream({start}).getReader()"); EXPECT_FALSE(reader.isEmpty()); - ASSERT_TRUE(ReadableStreamOperations::isReadableStreamReader(scriptState(), reader)); + ASSERT_TRUE(ReadableStreamOperations::isReadableStreamReader(getScriptState(), reader)); Iteration* it1 = new Iteration(); Iteration* it2 = new Iteration(); - ReadableStreamOperations::read(scriptState(), reader).then( - Function::createFunction(scriptState(), it1), - NotReached::createFunction(scriptState())); - ReadableStreamOperations::read(scriptState(), reader).then( - Function::createFunction(scriptState(), it2), - NotReached::createFunction(scriptState())); + ReadableStreamOperations::read(getScriptState(), reader).then( + Function::createFunction(getScriptState(), it1), + NotReached::createFunction(getScriptState())); + ReadableStreamOperations::read(getScriptState(), reader).then( + Function::createFunction(getScriptState(), it2), + NotReached::createFunction(getScriptState())); v8::MicrotasksScope::PerformCheckpoint(isolate()); EXPECT_FALSE(it1->isSet()); @@ -280,26 +280,26 @@ TEST_F(ReadableStreamOperationsTest, CreateReadableStreamWithCustomUnderlyingSourceAndStrategy) { - auto underlyingSource = new TestUnderlyingSource(scriptState()); + auto underlyingSource = new TestUnderlyingSource(getScriptState()); - ScriptValue strategy = ReadableStreamOperations::createCountQueuingStrategy(scriptState(), 10); + ScriptValue strategy = ReadableStreamOperations::createCountQueuingStrategy(getScriptState(), 10); ASSERT_FALSE(strategy.isEmpty()); - ScriptValue stream = ReadableStreamOperations::createReadableStream(scriptState(), underlyingSource, strategy); + ScriptValue stream = ReadableStreamOperations::createReadableStream(getScriptState(), underlyingSource, strategy); ASSERT_FALSE(stream.isEmpty()); EXPECT_EQ(10, underlyingSource->desiredSize()); - underlyingSource->enqueue(ScriptValue::from(scriptState(), "a")); + underlyingSource->enqueue(ScriptValue::from(getScriptState(), "a")); EXPECT_EQ(9, underlyingSource->desiredSize()); - underlyingSource->enqueue(ScriptValue::from(scriptState(), "b")); + underlyingSource->enqueue(ScriptValue::from(getScriptState(), "b")); EXPECT_EQ(8, underlyingSource->desiredSize()); ScriptValue reader; { TrackExceptionState es; - reader = ReadableStreamOperations::getReader(scriptState(), stream, es); + reader = ReadableStreamOperations::getReader(getScriptState(), stream, es); ASSERT_FALSE(es.hadException()); } ASSERT_FALSE(reader.isEmpty()); @@ -307,9 +307,9 @@ Iteration* it1 = new Iteration(); Iteration* it2 = new Iteration(); Iteration* it3 = new Iteration(); - ReadableStreamOperations::read(scriptState(), reader).then(Function::createFunction(scriptState(), it1), NotReached::createFunction(scriptState())); - ReadableStreamOperations::read(scriptState(), reader).then(Function::createFunction(scriptState(), it2), NotReached::createFunction(scriptState())); - ReadableStreamOperations::read(scriptState(), reader).then(Function::createFunction(scriptState(), it3), NotReached::createFunction(scriptState())); + ReadableStreamOperations::read(getScriptState(), reader).then(Function::createFunction(getScriptState(), it1), NotReached::createFunction(getScriptState())); + ReadableStreamOperations::read(getScriptState(), reader).then(Function::createFunction(getScriptState(), it2), NotReached::createFunction(getScriptState())); + ReadableStreamOperations::read(getScriptState(), reader).then(Function::createFunction(getScriptState(), it3), NotReached::createFunction(getScriptState())); v8::MicrotasksScope::PerformCheckpoint(isolate());
diff --git a/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp b/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp index 8b075ca4..60cc07d 100644 --- a/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp
@@ -50,7 +50,7 @@ // If execution termination has been triggered, quietly bail out. if (m_scriptState->isolate()->IsExecutionTerminating()) return; - ExecutionContext* executionContext = m_scriptState->executionContext(); + ExecutionContext* executionContext = m_scriptState->getExecutionContext(); if (!executionContext) return; @@ -99,7 +99,7 @@ void revoke() { - ExecutionContext* executionContext = m_scriptState->executionContext(); + ExecutionContext* executionContext = m_scriptState->getExecutionContext(); if (!executionContext) return;
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp index daa0565a..c14bd9f 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp
@@ -468,7 +468,7 @@ } if (frame()->document() && frame()->document()->isViewSource()) { - ASSERT(frame()->document()->securityOrigin()->isUnique()); + ASSERT(frame()->document()->getSecurityOrigin()->isUnique()); return true; } @@ -585,7 +585,7 @@ if (!isolatedWorldWindowProxy->isContextInitialized()) return; - ScriptState* scriptState = isolatedWorldWindowProxy->scriptState(); + ScriptState* scriptState = isolatedWorldWindowProxy->getScriptState(); v8::Context::Scope scope(scriptState->context()); v8::Local<v8::Array> resultArray = v8::Array::New(isolate(), sources.size());
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptController.h b/third_party/WebKit/Source/bindings/core/v8/ScriptController.h index 09f290d..b5f258f9 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptController.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptController.h
@@ -155,7 +155,7 @@ v8::Isolate* isolate() const { return m_windowProxyManager->isolate(); } - WindowProxyManager* windowProxyManager() const { return m_windowProxyManager.get(); } + WindowProxyManager* getWindowProxyManager() const { return m_windowProxyManager.get(); } private: explicit ScriptController(LocalFrame*);
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptFunction.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptFunction.cpp index 3e6b096..41d5aac5 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptFunction.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptFunction.cpp
@@ -20,7 +20,7 @@ { ASSERT(args.Data()->IsExternal()); ScriptFunction* scriptFunction = static_cast<ScriptFunction*>(v8::Local<v8::External>::Cast(args.Data())->Value()); - ScriptValue result = scriptFunction->call(ScriptValue(scriptFunction->scriptState(), args[0])); + ScriptValue result = scriptFunction->call(ScriptValue(scriptFunction->getScriptState(), args[0])); v8SetReturnValue(args, result.v8Value()); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptFunction.h b/third_party/WebKit/Source/bindings/core/v8/ScriptFunction.h index 0ffe7095..2159275 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptFunction.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptFunction.h
@@ -53,7 +53,7 @@ class CORE_EXPORT ScriptFunction : public GarbageCollectedFinalized<ScriptFunction> { public: virtual ~ScriptFunction() { } - ScriptState* scriptState() const { return m_scriptState.get(); } + ScriptState* getScriptState() const { return m_scriptState.get(); } DEFINE_INLINE_VIRTUAL_TRACE() { } protected:
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromise.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptPromise.cpp index b3a198ba..e473714e 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromise.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromise.cpp
@@ -174,7 +174,7 @@ { if (m_resolver.isEmpty()) return ScriptPromise(); - return ScriptPromise(m_resolver.scriptState(), v8Promise()); + return ScriptPromise(m_resolver.getScriptState(), v8Promise()); } void ScriptPromise::InternalResolver::resolve(v8::Local<v8::Value> value)
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseProperty.h b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseProperty.h index 73d270ed..61679bc0 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseProperty.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseProperty.h
@@ -96,7 +96,7 @@ ASSERT_NOT_REACHED(); return; } - if (!executionContext() || executionContext()->activeDOMObjectsAreStopped()) + if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolved = value; resolveOrReject(Resolved); @@ -110,7 +110,7 @@ ASSERT_NOT_REACHED(); return; } - if (!executionContext() || executionContext()->activeDOMObjectsAreStopped()) + if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) return; m_rejected = value; resolveOrReject(Rejected);
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyBase.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyBase.cpp index c355d764..edd1331 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyBase.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyBase.cpp
@@ -32,11 +32,11 @@ ScriptPromise ScriptPromisePropertyBase::promise(DOMWrapperWorld& world) { - if (!executionContext()) + if (!getExecutionContext()) return ScriptPromise(); v8::HandleScope handleScope(m_isolate); - v8::Local<v8::Context> context = toV8Context(executionContext(), world); + v8::Local<v8::Context> context = toV8Context(getExecutionContext(), world); if (context.IsEmpty()) return ScriptPromise(); ScriptState* scriptState = ScriptState::from(context); @@ -72,7 +72,7 @@ void ScriptPromisePropertyBase::resolveOrReject(State targetState) { - ASSERT(executionContext()); + ASSERT(getExecutionContext()); ASSERT(m_state == Pending); ASSERT(targetState == Resolved || targetState == Rejected);
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyTest.cpp index f6601dd3..52af5edc 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyTest.cpp
@@ -86,7 +86,7 @@ : GarbageCollectedScriptWrappable("holder") , m_property(new Property(executionContext, toGarbageCollectedScriptWrappable(), Property::Ready)) { } - Property* property() { return m_property; } + Property* getProperty() { return m_property; } GarbageCollectedScriptWrappable* toGarbageCollectedScriptWrappable() { return this; } DEFINE_INLINE_VIRTUAL_TRACE() @@ -108,7 +108,7 @@ { return adoptRef(new RefCountedHolder(executionContext)); } - Property* property() { return m_property; } + Property* getProperty() { return m_property; } RefCountedScriptWrappable* toRefCountedScriptWrappable() { return this; } private: @@ -182,8 +182,8 @@ } GarbageCollectedHolder* holder() { return m_holder; } - Property* property() { return m_holder->property(); } - ScriptPromise promise(DOMWrapperWorld& world) { return property()->promise(world); } + Property* getProperty() { return m_holder->getProperty(); } + ScriptPromise promise(DOMWrapperWorld& world) { return getProperty()->promise(world); } private: Persistent<GarbageCollectedHolder> m_holder; @@ -191,22 +191,22 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, Promise_IsStableObjectInMainWorld) { - ScriptPromise v = property()->promise(DOMWrapperWorld::mainWorld()); - ScriptPromise w = property()->promise(DOMWrapperWorld::mainWorld()); + ScriptPromise v = getProperty()->promise(DOMWrapperWorld::mainWorld()); + ScriptPromise w = getProperty()->promise(DOMWrapperWorld::mainWorld()); EXPECT_EQ(v, w); ASSERT_FALSE(v.isEmpty()); { ScriptState::Scope scope(mainScriptState()); EXPECT_EQ(v.v8Value().As<v8::Object>()->CreationContext(), toV8Context(&document(), mainWorld())); } - EXPECT_EQ(Property::Pending, property()->getState()); + EXPECT_EQ(Property::Pending, getProperty()->getState()); } TEST_F(ScriptPromisePropertyGarbageCollectedTest, Promise_IsStableObjectInVariousWorlds) { - ScriptPromise u = property()->promise(otherWorld()); - ScriptPromise v = property()->promise(DOMWrapperWorld::mainWorld()); - ScriptPromise w = property()->promise(DOMWrapperWorld::mainWorld()); + ScriptPromise u = getProperty()->promise(otherWorld()); + ScriptPromise v = getProperty()->promise(DOMWrapperWorld::mainWorld()); + ScriptPromise w = getProperty()->promise(DOMWrapperWorld::mainWorld()); EXPECT_NE(mainScriptState(), otherScriptState()); EXPECT_NE(&mainWorld(), &otherWorld()); EXPECT_NE(u, v); @@ -221,7 +221,7 @@ ScriptState::Scope scope(mainScriptState()); EXPECT_EQ(v.v8Value().As<v8::Object>()->CreationContext(), toV8Context(&document(), mainWorld())); } - EXPECT_EQ(Property::Pending, property()->getState()); + EXPECT_EQ(Property::Pending, getProperty()->getState()); } TEST_F(ScriptPromisePropertyGarbageCollectedTest, Promise_IsStableObjectAfterSettling) @@ -229,8 +229,8 @@ ScriptPromise v = promise(DOMWrapperWorld::mainWorld()); GarbageCollectedScriptWrappable* value = new GarbageCollectedScriptWrappable("value"); - property()->resolve(value); - EXPECT_EQ(Property::Resolved, property()->getState()); + getProperty()->resolve(value); + EXPECT_EQ(Property::Resolved, getProperty()->getState()); ScriptPromise w = promise(DOMWrapperWorld::mainWorld()); EXPECT_EQ(v, w); @@ -254,13 +254,13 @@ gc(); EXPECT_TRUE(observation->wasCollected()); - EXPECT_EQ(Property::Pending, property()->getState()); + EXPECT_EQ(Property::Pending, getProperty()->getState()); } TEST_F(ScriptPromisePropertyGarbageCollectedTest, Resolve_ResolvesScriptPromise) { - ScriptPromise promise = property()->promise(DOMWrapperWorld::mainWorld()); - ScriptPromise otherPromise = property()->promise(otherWorld()); + ScriptPromise promise = getProperty()->promise(DOMWrapperWorld::mainWorld()); + ScriptPromise otherPromise = getProperty()->promise(otherWorld()); ScriptValue actual, otherActual; size_t nResolveCalls = 0; size_t nOtherResolveCalls = 0; @@ -278,8 +278,8 @@ EXPECT_NE(promise, otherPromise); GarbageCollectedScriptWrappable* value = new GarbageCollectedScriptWrappable("value"); - property()->resolve(value); - EXPECT_EQ(Property::Resolved, property()->getState()); + getProperty()->resolve(value); + EXPECT_EQ(Property::Resolved, getProperty()->getState()); v8::MicrotasksScope::PerformCheckpoint(isolate()); EXPECT_EQ(1u, nResolveCalls); @@ -291,8 +291,8 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, ResolveAndGetPromiseOnOtherWorld) { - ScriptPromise promise = property()->promise(DOMWrapperWorld::mainWorld()); - ScriptPromise otherPromise = property()->promise(otherWorld()); + ScriptPromise promise = getProperty()->promise(DOMWrapperWorld::mainWorld()); + ScriptPromise otherPromise = getProperty()->promise(otherWorld()); ScriptValue actual, otherActual; size_t nResolveCalls = 0; size_t nOtherResolveCalls = 0; @@ -304,8 +304,8 @@ EXPECT_NE(promise, otherPromise); GarbageCollectedScriptWrappable* value = new GarbageCollectedScriptWrappable("value"); - property()->resolve(value); - EXPECT_EQ(Property::Resolved, property()->getState()); + getProperty()->resolve(value); + EXPECT_EQ(Property::Resolved, getProperty()->getState()); v8::MicrotasksScope::PerformCheckpoint(isolate()); EXPECT_EQ(1u, nResolveCalls); @@ -327,20 +327,20 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, Reject_RejectsScriptPromise) { GarbageCollectedScriptWrappable* reason = new GarbageCollectedScriptWrappable("reason"); - property()->reject(reason); - EXPECT_EQ(Property::Rejected, property()->getState()); + getProperty()->reject(reason); + EXPECT_EQ(Property::Rejected, getProperty()->getState()); ScriptValue actual, otherActual; size_t nRejectCalls = 0; size_t nOtherRejectCalls = 0; { ScriptState::Scope scope(mainScriptState()); - property()->promise(DOMWrapperWorld::mainWorld()).then(notReached(currentScriptState()), stub(currentScriptState(), actual, nRejectCalls)); + getProperty()->promise(DOMWrapperWorld::mainWorld()).then(notReached(currentScriptState()), stub(currentScriptState(), actual, nRejectCalls)); } { ScriptState::Scope scope(otherScriptState()); - property()->promise(otherWorld()).then(notReached(currentScriptState()), stub(currentScriptState(), otherActual, nOtherRejectCalls)); + getProperty()->promise(otherWorld()).then(notReached(currentScriptState()), stub(currentScriptState(), otherActual, nOtherRejectCalls)); } v8::MicrotasksScope::PerformCheckpoint(isolate()); @@ -353,26 +353,26 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, Promise_DeadContext) { - property()->resolve(new GarbageCollectedScriptWrappable("value")); - EXPECT_EQ(Property::Resolved, property()->getState()); + getProperty()->resolve(new GarbageCollectedScriptWrappable("value")); + EXPECT_EQ(Property::Resolved, getProperty()->getState()); destroyContext(); - EXPECT_TRUE(property()->promise(DOMWrapperWorld::mainWorld()).isEmpty()); + EXPECT_TRUE(getProperty()->promise(DOMWrapperWorld::mainWorld()).isEmpty()); } TEST_F(ScriptPromisePropertyGarbageCollectedTest, Resolve_DeadContext) { { ScriptState::Scope scope(mainScriptState()); - property()->promise(DOMWrapperWorld::mainWorld()).then(notReached(currentScriptState()), notReached(currentScriptState())); + getProperty()->promise(DOMWrapperWorld::mainWorld()).then(notReached(currentScriptState()), notReached(currentScriptState())); } destroyContext(); - EXPECT_TRUE(!property()->executionContext() || property()->executionContext()->activeDOMObjectsAreStopped()); + EXPECT_TRUE(!getProperty()->getExecutionContext() || getProperty()->getExecutionContext()->activeDOMObjectsAreStopped()); - property()->resolve(new GarbageCollectedScriptWrappable("value")); - EXPECT_EQ(Property::Pending, property()->getState()); + getProperty()->resolve(new GarbageCollectedScriptWrappable("value")); + EXPECT_EQ(Property::Pending, getProperty()->getState()); v8::MicrotasksScope::PerformCheckpoint(v8::Isolate::GetCurrent()); } @@ -388,18 +388,18 @@ { ScriptState::Scope scope(mainScriptState()); - property()->resolve(oldValue); - oldPromise = property()->promise(mainWorld()); + getProperty()->resolve(oldValue); + oldPromise = getProperty()->promise(mainWorld()); oldPromise.then(stub(currentScriptState(), oldActual, nOldResolveCalls), notReached(currentScriptState())); } - property()->reset(); + getProperty()->reset(); { ScriptState::Scope scope(mainScriptState()); - newPromise = property()->promise(mainWorld()); + newPromise = getProperty()->promise(mainWorld()); newPromise.then(notReached(currentScriptState()), stub(currentScriptState(), newActual, nNewRejectCalls)); - property()->reject(newValue); + getProperty()->reject(newValue); } EXPECT_EQ(0u, nOldResolveCalls); @@ -425,7 +425,7 @@ } RefCountedHolder* holder() { return m_holder.get(); } - Property* property() { return m_holder->property(); } + Property* getProperty() { return m_holder->getProperty(); } private: RefPtr<RefCountedHolder> m_holder; @@ -438,12 +438,12 @@ { ScriptState::Scope scope(mainScriptState()); - property()->promise(DOMWrapperWorld::mainWorld()).then(stub(currentScriptState(), actual, nResolveCalls), notReached(currentScriptState())); + getProperty()->promise(DOMWrapperWorld::mainWorld()).then(stub(currentScriptState(), actual, nResolveCalls), notReached(currentScriptState())); } RefPtr<RefCountedScriptWrappable> value = RefCountedScriptWrappable::create("value"); - property()->resolve(value.get()); - EXPECT_EQ(Property::Resolved, property()->getState()); + getProperty()->resolve(value.get()); + EXPECT_EQ(Property::Resolved, getProperty()->getState()); v8::MicrotasksScope::PerformCheckpoint(isolate()); EXPECT_EQ(1u, nResolveCalls); @@ -457,12 +457,12 @@ { ScriptState::Scope scope(mainScriptState()); - property()->promise(DOMWrapperWorld::mainWorld()).then(notReached(currentScriptState()), stub(currentScriptState(), actual, nRejectCalls)); + getProperty()->promise(DOMWrapperWorld::mainWorld()).then(notReached(currentScriptState()), stub(currentScriptState(), actual, nRejectCalls)); } RefPtr<RefCountedScriptWrappable> reason = RefCountedScriptWrappable::create("reason"); - property()->reject(reason); - EXPECT_EQ(Property::Rejected, property()->getState()); + getProperty()->reject(reason); + EXPECT_EQ(Property::Rejected, getProperty()->getState()); v8::MicrotasksScope::PerformCheckpoint(isolate()); EXPECT_EQ(1u, nRejectCalls); @@ -475,11 +475,11 @@ { ScriptState::Scope scope(mainScriptState()); - property()->resolve(value); + getProperty()->resolve(value); } EXPECT_EQ(2, value->refCount()); - property()->reset(); + getProperty()->reset(); EXPECT_EQ(1, value->refCount()); } @@ -489,11 +489,11 @@ { ScriptState::Scope scope(mainScriptState()); - property()->reject(value.get()); + getProperty()->reject(value.get()); } EXPECT_EQ(2, value->refCount()); - property()->reset(); + getProperty()->reset(); EXPECT_EQ(1, value->refCount()); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolver.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolver.cpp index bc0ba8d..c673c46b 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolver.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolver.cpp
@@ -7,7 +7,7 @@ namespace blink { ScriptPromiseResolver::ScriptPromiseResolver(ScriptState* scriptState) - : ActiveDOMObject(scriptState->executionContext()) + : ActiveDOMObject(scriptState->getExecutionContext()) , m_state(Pending) , m_scriptState(scriptState) , m_timer(this, &ScriptPromiseResolver::onTimerFired) @@ -16,7 +16,7 @@ , m_isPromiseCalled(false) #endif { - if (executionContext()->activeDOMObjectsAreStopped()) { + if (getExecutionContext()->activeDOMObjectsAreStopped()) { m_state = Detached; m_resolver.clear(); } @@ -60,7 +60,7 @@ void ScriptPromiseResolver::onTimerFired(Timer<ScriptPromiseResolver>*) { ASSERT(m_state == Resolving || m_state == Rejecting); - if (!scriptState()->contextIsValid()) { + if (!getScriptState()->contextIsValid()) { detach(); return; } @@ -71,8 +71,8 @@ void ScriptPromiseResolver::resolveOrRejectImmediately() { - ASSERT(!executionContext()->activeDOMObjectsAreStopped()); - ASSERT(!executionContext()->activeDOMObjectsAreSuspended()); + ASSERT(!getExecutionContext()->activeDOMObjectsAreStopped()); + ASSERT(!getExecutionContext()->activeDOMObjectsAreSuspended()); { if (m_state == Resolving) { m_resolver.resolve(m_value.newLocal(m_scriptState->isolate()));
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolver.h b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolver.h index 11542e1..1a35e8361 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolver.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolver.h
@@ -38,7 +38,7 @@ } #if ENABLE(ASSERT) - // Eagerly finalized so as to ensure valid access to executionContext() + // Eagerly finalized so as to ensure valid access to getExecutionContext() // from the destructor's assert. EAGERLY_FINALIZE(); @@ -49,7 +49,7 @@ // - this resolver is destructed before it is resolved, rejected, // detached, the V8 isolate is terminated or the associated // ExecutionContext is stopped. - ASSERT(m_state == Detached || !m_isPromiseCalled || !scriptState()->contextIsValid() || !executionContext() || executionContext()->activeDOMObjectsAreStopped()); + ASSERT(m_state == Detached || !m_isPromiseCalled || !getScriptState()->contextIsValid() || !getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()); } #endif @@ -70,7 +70,7 @@ void resolve() { resolve(ToV8UndefinedGenerator()); } void reject() { reject(ToV8UndefinedGenerator()); } - ScriptState* scriptState() { return m_scriptState.get(); } + ScriptState* getScriptState() { return m_scriptState.get(); } // Note that an empty ScriptPromise will be returned after resolve or // reject is called. @@ -82,7 +82,7 @@ return m_resolver.promise(); } - ScriptState* scriptState() const { return m_scriptState.get(); } + ScriptState* getScriptState() const { return m_scriptState.get(); } // ActiveDOMObject implementation. void suspend() override; @@ -118,7 +118,7 @@ template<typename T> void resolveOrReject(T value, ResolutionState newState) { - if (m_state != Pending || !scriptState()->contextIsValid() || !executionContext() || executionContext()->activeDOMObjectsAreStopped()) + if (m_state != Pending || !getScriptState()->contextIsValid() || !getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) return; ASSERT(newState == Resolving || newState == Rejecting); m_state = newState; @@ -128,7 +128,7 @@ m_scriptState->isolate(), toV8(value, m_scriptState->context()->Global(), m_scriptState->isolate())); - if (executionContext()->activeDOMObjectsAreSuspended()) { + if (getExecutionContext()->activeDOMObjectsAreSuspended()) { // Retain this object until it is actually resolved or rejected. keepAliveWhilePending(); return;
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolverTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolverTest.cpp index 1c946d9..23f2b2a 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolverTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseResolverTest.cpp
@@ -38,7 +38,7 @@ ScriptValue call(ScriptValue value) override { ASSERT(!value.isEmpty()); - *m_value = toCoreString(value.v8Value()->ToString(scriptState()->context()).ToLocalChecked()); + *m_value = toCoreString(value.v8Value()->ToString(getScriptState()->context()).ToLocalChecked()); return value; } @@ -54,7 +54,7 @@ ~ScriptPromiseResolverTest() override { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); // FIXME: We put this statement here to clear an exception from the // isolate. createClosure(callback, v8::Undefined(isolate()), isolate()); @@ -64,16 +64,16 @@ } OwnPtr<DummyPageHolder> m_pageHolder; - ScriptState* scriptState() const { return ScriptState::forMainWorld(&m_pageHolder->frame()); } - ExecutionContext* executionContext() const { return &m_pageHolder->document(); } - v8::Isolate* isolate() const { return scriptState()->isolate(); } + ScriptState* getScriptState() const { return ScriptState::forMainWorld(&m_pageHolder->frame()); } + ExecutionContext* getExecutionContext() const { return &m_pageHolder->document(); } + v8::Isolate* isolate() const { return getScriptState()->isolate(); } }; TEST_F(ScriptPromiseResolverTest, construct) { - ASSERT_FALSE(executionContext()->activeDOMObjectsAreStopped()); - ScriptState::Scope scope(scriptState()); - ScriptPromiseResolver::create(scriptState()); + ASSERT_FALSE(getExecutionContext()->activeDOMObjectsAreStopped()); + ScriptState::Scope scope(getScriptState()); + ScriptPromiseResolver::create(getScriptState()); } TEST_F(ScriptPromiseResolverTest, resolve) @@ -81,16 +81,16 @@ ScriptPromiseResolver* resolver = nullptr; ScriptPromise promise; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolver::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolver::create(getScriptState()); promise = resolver->promise(); } String onFulfilled, onRejected; ASSERT_FALSE(promise.isEmpty()); { - ScriptState::Scope scope(scriptState()); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + ScriptState::Scope scope(getScriptState()); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); } EXPECT_EQ(String(), onFulfilled); @@ -104,7 +104,7 @@ resolver->resolve("hello"); { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); EXPECT_TRUE(resolver->promise().isEmpty()); } @@ -129,16 +129,16 @@ ScriptPromiseResolver* resolver = nullptr; ScriptPromise promise; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolver::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolver::create(getScriptState()); promise = resolver->promise(); } String onFulfilled, onRejected; ASSERT_FALSE(promise.isEmpty()); { - ScriptState::Scope scope(scriptState()); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + ScriptState::Scope scope(getScriptState()); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); } EXPECT_EQ(String(), onFulfilled); @@ -152,7 +152,7 @@ resolver->reject("hello"); { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); EXPECT_TRUE(resolver->promise().isEmpty()); } @@ -177,21 +177,21 @@ ScriptPromiseResolver* resolver = nullptr; ScriptPromise promise; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolver::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolver::create(getScriptState()); promise = resolver->promise(); } String onFulfilled, onRejected; ASSERT_FALSE(promise.isEmpty()); { - ScriptState::Scope scope(scriptState()); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + ScriptState::Scope scope(getScriptState()); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); } - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); EXPECT_TRUE(resolver->promise().isEmpty()); } @@ -235,8 +235,8 @@ ScriptPromiseResolverKeepAlive::reset(); ScriptPromiseResolver* resolver = nullptr; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolverKeepAlive::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolverKeepAlive::create(getScriptState()); } resolver->keepAliveWhilePending(); Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); @@ -252,8 +252,8 @@ ScriptPromiseResolverKeepAlive::reset(); ScriptPromiseResolver* resolver = nullptr; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolverKeepAlive::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolverKeepAlive::create(getScriptState()); } resolver->keepAliveWhilePending(); Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); @@ -269,14 +269,14 @@ ScriptPromiseResolverKeepAlive::reset(); ScriptPromiseResolver* resolver = nullptr; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolverKeepAlive::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolverKeepAlive::create(getScriptState()); } resolver->keepAliveWhilePending(); Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); EXPECT_TRUE(ScriptPromiseResolverKeepAlive::isAlive()); - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); EXPECT_FALSE(ScriptPromiseResolverKeepAlive::isAlive()); } @@ -286,19 +286,19 @@ ScriptPromiseResolverKeepAlive::reset(); ScriptPromiseResolver* resolver = nullptr; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolverKeepAlive::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolverKeepAlive::create(getScriptState()); } resolver->keepAliveWhilePending(); Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); ASSERT_TRUE(ScriptPromiseResolverKeepAlive::isAlive()); - executionContext()->suspendActiveDOMObjects(); + getExecutionContext()->suspendActiveDOMObjects(); resolver->resolve("hello"); Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); EXPECT_TRUE(ScriptPromiseResolverKeepAlive::isAlive()); - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); EXPECT_FALSE(ScriptPromiseResolverKeepAlive::isAlive()); } @@ -308,16 +308,16 @@ ScriptPromiseResolver* resolver = nullptr; ScriptPromise promise; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolver::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolver::create(getScriptState()); promise = resolver->promise(); } String onFulfilled, onRejected; ASSERT_FALSE(promise.isEmpty()); { - ScriptState::Scope scope(scriptState()); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + ScriptState::Scope scope(getScriptState()); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); } resolver->resolve(); @@ -332,16 +332,16 @@ ScriptPromiseResolver* resolver = nullptr; ScriptPromise promise; { - ScriptState::Scope scope(scriptState()); - resolver = ScriptPromiseResolver::create(scriptState()); + ScriptState::Scope scope(getScriptState()); + resolver = ScriptPromiseResolver::create(getScriptState()); promise = resolver->promise(); } String onFulfilled, onRejected; ASSERT_FALSE(promise.isEmpty()); { - ScriptState::Scope scope(scriptState()); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + ScriptState::Scope scope(getScriptState()); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); } resolver->reject();
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseTest.cpp index 01d144e..73b38ba 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromiseTest.cpp
@@ -88,16 +88,16 @@ String toString(const ScriptValue& value) { - return toCoreString(value.v8Value()->ToString(scriptState()->context()).ToLocalChecked()); + return toCoreString(value.v8Value()->ToString(getScriptState()->context()).ToLocalChecked()); } Vector<String> toStringArray(const ScriptValue& value) { NonThrowableExceptionState exceptionState; - return toImplArray<Vector<String>>(value.v8Value(), 0, scriptState()->isolate(), exceptionState); + return toImplArray<Vector<String>>(value.v8Value(), 0, getScriptState()->isolate(), exceptionState); } - ScriptState* scriptState() const { return m_scope.scriptState(); } + ScriptState* getScriptState() const { return m_scope.getScriptState(); } v8::Isolate* isolate() const { return m_scope.isolate(); } protected: @@ -108,17 +108,17 @@ TEST_F(ScriptPromiseTest, constructFromNonPromise) { v8::TryCatch trycatch(isolate()); - ScriptPromise promise(scriptState(), v8::Undefined(isolate())); + ScriptPromise promise(getScriptState(), v8::Undefined(isolate())); ASSERT_TRUE(trycatch.HasCaught()); ASSERT_TRUE(promise.isEmpty()); } TEST_F(ScriptPromiseTest, thenResolve) { - Resolver resolver(scriptState()); + Resolver resolver(getScriptState()); ScriptPromise promise = resolver.promise(); ScriptValue onFulfilled, onRejected; - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); ASSERT_FALSE(promise.isEmpty()); EXPECT_TRUE(onFulfilled.isEmpty()); @@ -138,11 +138,11 @@ TEST_F(ScriptPromiseTest, resolveThen) { - Resolver resolver(scriptState()); + Resolver resolver(getScriptState()); ScriptPromise promise = resolver.promise(); ScriptValue onFulfilled, onRejected; resolver.resolve(v8String(isolate(), "hello")); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); ASSERT_FALSE(promise.isEmpty()); EXPECT_TRUE(onFulfilled.isEmpty()); @@ -156,10 +156,10 @@ TEST_F(ScriptPromiseTest, thenReject) { - Resolver resolver(scriptState()); + Resolver resolver(getScriptState()); ScriptPromise promise = resolver.promise(); ScriptValue onFulfilled, onRejected; - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); ASSERT_FALSE(promise.isEmpty()); EXPECT_TRUE(onFulfilled.isEmpty()); @@ -179,11 +179,11 @@ TEST_F(ScriptPromiseTest, rejectThen) { - Resolver resolver(scriptState()); + Resolver resolver(getScriptState()); ScriptPromise promise = resolver.promise(); ScriptValue onFulfilled, onRejected; resolver.reject(v8String(isolate(), "hello")); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); ASSERT_FALSE(promise.isEmpty()); EXPECT_TRUE(onFulfilled.isEmpty()); @@ -197,8 +197,8 @@ TEST_F(ScriptPromiseTest, castPromise) { - ScriptPromise promise = Resolver(scriptState()).promise(); - ScriptPromise newPromise = ScriptPromise::cast(scriptState(), promise.v8Value()); + ScriptPromise promise = Resolver(getScriptState()).promise(); + ScriptPromise newPromise = ScriptPromise::cast(getScriptState(), promise.v8Value()); ASSERT_FALSE(promise.isEmpty()); EXPECT_EQ(promise.v8Value(), newPromise.v8Value()); @@ -208,11 +208,11 @@ { ScriptValue onFulfilled1, onFulfilled2, onRejected1, onRejected2; - ScriptValue value = ScriptValue(scriptState(), v8String(isolate(), "hello")); - ScriptPromise promise1 = ScriptPromise::cast(scriptState(), ScriptValue(value)); - ScriptPromise promise2 = ScriptPromise::cast(scriptState(), ScriptValue(value)); - promise1.then(Function::createFunction(scriptState(), &onFulfilled1), Function::createFunction(scriptState(), &onRejected1)); - promise2.then(Function::createFunction(scriptState(), &onFulfilled2), Function::createFunction(scriptState(), &onRejected2)); + ScriptValue value = ScriptValue(getScriptState(), v8String(isolate(), "hello")); + ScriptPromise promise1 = ScriptPromise::cast(getScriptState(), ScriptValue(value)); + ScriptPromise promise2 = ScriptPromise::cast(getScriptState(), ScriptValue(value)); + promise1.then(Function::createFunction(getScriptState(), &onFulfilled1), Function::createFunction(getScriptState(), &onRejected1)); + promise2.then(Function::createFunction(getScriptState(), &onFulfilled2), Function::createFunction(getScriptState(), &onRejected2)); ASSERT_FALSE(promise1.isEmpty()); ASSERT_FALSE(promise2.isEmpty()); @@ -238,9 +238,9 @@ { ScriptValue onFulfilled, onRejected; - ScriptValue value = ScriptValue(scriptState(), v8String(isolate(), "hello")); - ScriptPromise promise = ScriptPromise::reject(scriptState(), ScriptValue(value)); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + ScriptValue value = ScriptValue(getScriptState(), v8String(isolate(), "hello")); + ScriptPromise promise = ScriptPromise::reject(getScriptState(), ScriptValue(value)); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); ASSERT_FALSE(promise.isEmpty()); ASSERT_TRUE(promise.v8Value()->IsPromise()); @@ -257,8 +257,8 @@ TEST_F(ScriptPromiseTest, rejectWithExceptionState) { ScriptValue onFulfilled, onRejected; - ScriptPromise promise = ScriptPromise::rejectWithDOMException(scriptState(), DOMException::create(SyntaxError, "some syntax error")); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + ScriptPromise promise = ScriptPromise::rejectWithDOMException(getScriptState(), DOMException::create(SyntaxError, "some syntax error")); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); ASSERT_FALSE(promise.isEmpty()); EXPECT_TRUE(onFulfilled.isEmpty()); @@ -274,10 +274,10 @@ { ScriptValue onFulfilled, onRejected; - ScriptPromise promise = ScriptPromise::all(scriptState(), Vector<ScriptPromise>()); + ScriptPromise promise = ScriptPromise::all(getScriptState(), Vector<ScriptPromise>()); ASSERT_FALSE(promise.isEmpty()); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); EXPECT_TRUE(onFulfilled.isEmpty()); EXPECT_TRUE(onRejected.isEmpty()); @@ -294,12 +294,12 @@ ScriptValue onFulfilled, onRejected; Vector<ScriptPromise> promises; - promises.append(ScriptPromise::cast(scriptState(), v8String(isolate(), "hello"))); - promises.append(ScriptPromise::cast(scriptState(), v8String(isolate(), "world"))); + promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "hello"))); + promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "world"))); - ScriptPromise promise = ScriptPromise::all(scriptState(), promises); + ScriptPromise promise = ScriptPromise::all(getScriptState(), promises); ASSERT_FALSE(promise.isEmpty()); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); EXPECT_TRUE(onFulfilled.isEmpty()); EXPECT_TRUE(onRejected.isEmpty()); @@ -319,12 +319,12 @@ ScriptValue onFulfilled, onRejected; Vector<ScriptPromise> promises; - promises.append(ScriptPromise::cast(scriptState(), v8String(isolate(), "hello"))); - promises.append(ScriptPromise::reject(scriptState(), v8String(isolate(), "world"))); + promises.append(ScriptPromise::cast(getScriptState(), v8String(isolate(), "hello"))); + promises.append(ScriptPromise::reject(getScriptState(), v8String(isolate(), "world"))); - ScriptPromise promise = ScriptPromise::all(scriptState(), promises); + ScriptPromise promise = ScriptPromise::all(getScriptState(), promises); ASSERT_FALSE(promise.isEmpty()); - promise.then(Function::createFunction(scriptState(), &onFulfilled), Function::createFunction(scriptState(), &onRejected)); + promise.then(Function::createFunction(getScriptState(), &onFulfilled), Function::createFunction(getScriptState(), &onRejected)); EXPECT_TRUE(onFulfilled.isEmpty()); EXPECT_TRUE(onRejected.isEmpty());
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptState.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptState.cpp index c3fc68b2..aa1d36a7 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptState.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptState.cpp
@@ -96,7 +96,7 @@ return ScriptValue(this, v8Value); } -ExecutionContext* ScriptState::executionContext() const +ExecutionContext* ScriptState::getExecutionContext() const { v8::HandleScope scope(m_isolate); return toExecutionContext(context());
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptState.h b/third_party/WebKit/Source/bindings/core/v8/ScriptState.h index 5b5c5a0..e7fb0d6 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptState.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptState.h
@@ -87,7 +87,7 @@ v8::Isolate* isolate() const { return m_isolate; } DOMWrapperWorld& world() const { return *m_world; } LocalDOMWindow* domWindow() const; - virtual ExecutionContext* executionContext() const; + virtual ExecutionContext* getExecutionContext() const; virtual void setExecutionContext(ExecutionContext*); int contextIdInDebugger();
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp index 4aae6c26..8f91bcfe6 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
@@ -39,10 +39,10 @@ ScriptStreamer::setSmallScriptThresholdForTesting(0); } - ScriptState* scriptState() const { return m_scope.scriptState(); } + ScriptState* getScriptState() const { return m_scope.getScriptState(); } v8::Isolate* isolate() const { return m_scope.isolate(); } - PendingScript* pendingScript() const { return m_pendingScript.get(); } + PendingScript* getPendingScript() const { return m_pendingScript.get(); } protected: void appendData(const char* data) @@ -115,9 +115,9 @@ TEST_F(ScriptStreamingTest, MAYBE_CompilingStreamedScript) { // Test that we can successfully compile a streamed script. - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); appendData("function foo() {"); appendPadding(); @@ -132,7 +132,7 @@ processTasksUntilStreamingComplete(); EXPECT_TRUE(client.finished()); bool errorOccurred = false; - ScriptSourceCode sourceCode = pendingScript()->getSource(KURL(), errorOccurred); + ScriptSourceCode sourceCode = getPendingScript()->getSource(KURL(), errorOccurred); EXPECT_FALSE(errorOccurred); EXPECT_TRUE(sourceCode.streamer()); v8::TryCatch tryCatch(isolate()); @@ -146,9 +146,9 @@ // Test that scripts with parse errors are handled properly. In those cases, // the V8 side typically finished before loading finishes: make sure we // handle it gracefully. - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); appendData("function foo() {"); appendData("this is the part which will be a parse error"); // V8 won't realize the parse error until it actually starts parsing the @@ -165,7 +165,7 @@ EXPECT_TRUE(client.finished()); bool errorOccurred = false; - ScriptSourceCode sourceCode = pendingScript()->getSource(KURL(), errorOccurred); + ScriptSourceCode sourceCode = getPendingScript()->getSource(KURL(), errorOccurred); EXPECT_FALSE(errorOccurred); EXPECT_TRUE(sourceCode.streamer()); v8::TryCatch tryCatch(isolate()); @@ -178,9 +178,9 @@ { // Test that the upper layers (PendingScript and up) can be ramped down // while streaming is ongoing, and ScriptStreamer handles it gracefully. - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); appendData("function foo() {"); // In general, we cannot control what the background thread is doing @@ -190,8 +190,8 @@ // Simulate cancelling the network load (e.g., because the user navigated // away). EXPECT_FALSE(client.finished()); - pendingScript()->stopWatchingForLoad(); - pendingScript()->releaseElementAndClear(); + getPendingScript()->stopWatchingForLoad(); + getPendingScript()->releaseElementAndClear(); m_pendingScript = nullptr; // This will destroy m_resource. m_resource = nullptr; @@ -207,9 +207,9 @@ // is suppressed (V8 doesn't parse while the script is loading), and the // upper layer (ScriptResourceClient) should get a notification when the // script is loaded. - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); appendData("function foo() {"); appendPadding(); @@ -223,7 +223,7 @@ EXPECT_TRUE(client.finished()); bool errorOccurred = false; - ScriptSourceCode sourceCode = pendingScript()->getSource(KURL(), errorOccurred); + ScriptSourceCode sourceCode = getPendingScript()->getSource(KURL(), errorOccurred); EXPECT_FALSE(errorOccurred); // ScriptSourceCode doesn't refer to the streamer, since we have suppressed // the streaming and resumed the non-streaming code path for script @@ -236,9 +236,9 @@ // Empty scripts should also be streamed properly, that is, the upper layer // (ScriptResourceClient) should be notified when an empty script has been // loaded. - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); // Finish the script without sending any data. finish(); @@ -247,7 +247,7 @@ EXPECT_TRUE(client.finished()); bool errorOccurred = false; - ScriptSourceCode sourceCode = pendingScript()->getSource(KURL(), errorOccurred); + ScriptSourceCode sourceCode = getPendingScript()->getSource(KURL(), errorOccurred); EXPECT_FALSE(errorOccurred); EXPECT_FALSE(sourceCode.streamer()); } @@ -257,9 +257,9 @@ // Small scripts shouldn't be streamed. ScriptStreamer::setSmallScriptThresholdForTesting(100); - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); appendData("function foo() { }"); @@ -270,7 +270,7 @@ EXPECT_TRUE(client.finished()); bool errorOccurred = false; - ScriptSourceCode sourceCode = pendingScript()->getSource(KURL(), errorOccurred); + ScriptSourceCode sourceCode = getPendingScript()->getSource(KURL(), errorOccurred); EXPECT_FALSE(errorOccurred); EXPECT_FALSE(sourceCode.streamer()); } @@ -287,9 +287,9 @@ // chunk is small. ScriptStreamer::setSmallScriptThresholdForTesting(100); - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); // This is the first data chunk which is small. appendData("function foo() { }"); @@ -302,7 +302,7 @@ processTasksUntilStreamingComplete(); EXPECT_TRUE(client.finished()); bool errorOccurred = false; - ScriptSourceCode sourceCode = pendingScript()->getSource(KURL(), errorOccurred); + ScriptSourceCode sourceCode = getPendingScript()->getSource(KURL(), errorOccurred); EXPECT_FALSE(errorOccurred); EXPECT_TRUE(sourceCode.streamer()); v8::TryCatch tryCatch(isolate()); @@ -323,9 +323,9 @@ // loading it. m_resource->setEncoding("windows-1252"); - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); m_resource->setEncoding("UTF-8"); // \xec\x92\x81 are the raw bytes for \uc481. @@ -336,7 +336,7 @@ processTasksUntilStreamingComplete(); EXPECT_TRUE(client.finished()); bool errorOccurred = false; - ScriptSourceCode sourceCode = pendingScript()->getSource(KURL(), errorOccurred); + ScriptSourceCode sourceCode = getPendingScript()->getSource(KURL(), errorOccurred); EXPECT_FALSE(errorOccurred); EXPECT_TRUE(sourceCode.streamer()); v8::TryCatch tryCatch(isolate()); @@ -358,9 +358,9 @@ // will also affect encoding detection. m_resource->setEncoding("windows-1252"); // This encoding is wrong on purpose. - ScriptStreamer::startStreaming(pendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.scriptState(), m_loadingTaskRunner); + ScriptStreamer::startStreaming(getPendingScript(), ScriptStreamer::ParsingBlocking, m_settings.get(), m_scope.getScriptState(), m_loadingTaskRunner); TestScriptResourceClient client; - pendingScript()->watchForLoad(&client); + getPendingScript()->watchForLoad(&client); // \xef\xbb\xbf is the UTF-8 byte order mark. \xec\x92\x81 are the raw bytes // for \uc481. @@ -370,7 +370,7 @@ processTasksUntilStreamingComplete(); EXPECT_TRUE(client.finished()); bool errorOccurred = false; - ScriptSourceCode sourceCode = pendingScript()->getSource(KURL(), errorOccurred); + ScriptSourceCode sourceCode = getPendingScript()->getSource(KURL(), errorOccurred); EXPECT_FALSE(errorOccurred); EXPECT_TRUE(sourceCode.streamer()); v8::TryCatch tryCatch(isolate());
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptValue.h b/third_party/WebKit/Source/bindings/core/v8/ScriptValue.h index 06b5c25..209e50e 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptValue.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptValue.h
@@ -85,7 +85,7 @@ ASSERT(isEmpty() || m_scriptState); } - ScriptState* scriptState() const + ScriptState* getScriptState() const { return m_scriptState.get(); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp index e6a30e4..bb3c413 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
@@ -1792,7 +1792,7 @@ uint32_t flags; if (!doReadUint32(&flags)) return false; - if (!v8::RegExp::New(scriptState()->context(), pattern.As<v8::String>(), static_cast<v8::RegExp::Flags>(flags)).ToLocal(value)) + if (!v8::RegExp::New(getScriptState()->context(), pattern.As<v8::String>(), static_cast<v8::RegExp::Flags>(flags)).ToLocal(value)) return false; return true; } @@ -1966,7 +1966,7 @@ v8::Local<v8::Value> ScriptValueDeserializer::deserialize() { - v8::Isolate* isolate = m_reader.scriptState()->isolate(); + v8::Isolate* isolate = m_reader.getScriptState()->isolate(); if (!m_reader.readVersion(m_version) || m_version > SerializedScriptValue::wireFormatVersion) return v8::Null(isolate); m_reader.setVersion(m_version); @@ -1983,28 +1983,28 @@ bool ScriptValueDeserializer::newSparseArray(uint32_t) { - v8::Local<v8::Array> array = v8::Array::New(m_reader.scriptState()->isolate(), 0); + v8::Local<v8::Array> array = v8::Array::New(m_reader.getScriptState()->isolate(), 0); openComposite(array); return true; } bool ScriptValueDeserializer::newDenseArray(uint32_t length) { - v8::Local<v8::Array> array = v8::Array::New(m_reader.scriptState()->isolate(), length); + v8::Local<v8::Array> array = v8::Array::New(m_reader.getScriptState()->isolate(), length); openComposite(array); return true; } bool ScriptValueDeserializer::newMap() { - v8::Local<v8::Map> map = v8::Map::New(m_reader.scriptState()->isolate()); + v8::Local<v8::Map> map = v8::Map::New(m_reader.getScriptState()->isolate()); openComposite(map); return true; } bool ScriptValueDeserializer::newSet() { - v8::Local<v8::Set> set = v8::Set::New(m_reader.scriptState()->isolate()); + v8::Local<v8::Set> set = v8::Set::New(m_reader.getScriptState()->isolate()); openComposite(set); return true; } @@ -2020,7 +2020,7 @@ bool ScriptValueDeserializer::newObject() { - v8::Local<v8::Object> object = v8::Object::New(m_reader.scriptState()->isolate()); + v8::Local<v8::Object> object = v8::Object::New(m_reader.getScriptState()->isolate()); if (object.IsEmpty()) return false; openComposite(object); @@ -2036,7 +2036,7 @@ return false; object = composite.As<v8::Object>(); } else { - object = v8::Object::New(m_reader.scriptState()->isolate()); + object = v8::Object::New(m_reader.getScriptState()->isolate()); } if (object.IsEmpty()) return false; @@ -2052,7 +2052,7 @@ return false; array = composite.As<v8::Array>(); } else { - array = v8::Array::New(m_reader.scriptState()->isolate()); + array = v8::Array::New(m_reader.getScriptState()->isolate()); } if (array.IsEmpty()) return false; @@ -2074,7 +2074,7 @@ return false; if (length > stackDepth()) return false; - v8::Local<v8::Context> context = m_reader.scriptState()->context(); + v8::Local<v8::Context> context = m_reader.getScriptState()->context(); for (unsigned i = 0, stackPos = stackDepth() - length; i < length; i++, stackPos++) { v8::Local<v8::Value> elem = element(stackPos); if (!elem->IsUndefined()) { @@ -2095,7 +2095,7 @@ v8::Local<v8::Map> map = composite.As<v8::Map>(); if (map.IsEmpty()) return false; - v8::Local<v8::Context> context = m_reader.scriptState()->context(); + v8::Local<v8::Context> context = m_reader.getScriptState()->context(); ASSERT(length % 2 == 0); for (unsigned i = stackDepth() - length; i + 1 < stackDepth(); i += 2) { v8::Local<v8::Value> key = element(i); @@ -2117,7 +2117,7 @@ v8::Local<v8::Set> set = composite.As<v8::Set>(); if (set.IsEmpty()) return false; - v8::Local<v8::Context> context = m_reader.scriptState()->context(); + v8::Local<v8::Context> context = m_reader.getScriptState()->context(); for (unsigned i = stackDepth() - length; i < stackDepth(); i++) { v8::Local<v8::Value> key = element(i); if (set->Add(context, key).IsEmpty()) @@ -2139,8 +2139,8 @@ return false; if (index >= m_transferredMessagePorts->size()) return false; - v8::Local<v8::Object> creationContext = m_reader.scriptState()->context()->Global(); - *object = toV8(m_transferredMessagePorts->at(index).get(), creationContext, m_reader.scriptState()->isolate()); + v8::Local<v8::Object> creationContext = m_reader.getScriptState()->context()->Global(); + *object = toV8(m_transferredMessagePorts->at(index).get(), creationContext, m_reader.getScriptState()->isolate()); return !object->IsEmpty(); } @@ -2153,8 +2153,8 @@ v8::Local<v8::Value> result = m_arrayBuffers.at(index); if (result.IsEmpty()) { RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(m_arrayBufferContents->at(index)); - v8::Isolate* isolate = m_reader.scriptState()->isolate(); - v8::Local<v8::Object> creationContext = m_reader.scriptState()->context()->Global(); + v8::Isolate* isolate = m_reader.getScriptState()->isolate(); + v8::Local<v8::Object> creationContext = m_reader.getScriptState()->context()->Global(); result = toV8(buffer.get(), creationContext, isolate); if (result.IsEmpty()) return false; @@ -2173,8 +2173,8 @@ v8::Local<v8::Value> result = m_imageBitmaps.at(index); if (result.IsEmpty()) { RefPtrWillBeRawPtr<ImageBitmap> bitmap = ImageBitmap::create(m_imageBitmapContents->at(index)); - v8::Isolate* isolate = m_reader.scriptState()->isolate(); - v8::Local<v8::Object> creationContext = m_reader.scriptState()->context()->Global(); + v8::Isolate* isolate = m_reader.getScriptState()->isolate(); + v8::Local<v8::Object> creationContext = m_reader.getScriptState()->context()->Global(); result = toV8(bitmap.get(), creationContext, isolate); if (result.IsEmpty()) return false; @@ -2194,8 +2194,8 @@ v8::Local<v8::Value> result = m_arrayBuffers.at(index); if (result.IsEmpty()) { RefPtr<DOMSharedArrayBuffer> buffer = DOMSharedArrayBuffer::create(m_arrayBufferContents->at(index)); - v8::Isolate* isolate = m_reader.scriptState()->isolate(); - v8::Local<v8::Object> creationContext = m_reader.scriptState()->context()->Global(); + v8::Isolate* isolate = m_reader.getScriptState()->isolate(); + v8::Local<v8::Object> creationContext = m_reader.getScriptState()->context()->Global(); result = toV8(buffer.get(), creationContext, isolate); if (result.IsEmpty()) return false; @@ -2223,7 +2223,7 @@ unsigned length = 2 * numProperties; if (length > stackDepth()) return false; - v8::Local<v8::Context> context = m_reader.scriptState()->context(); + v8::Local<v8::Context> context = m_reader.getScriptState()->context(); for (unsigned i = stackDepth() - length; i < stackDepth(); i += 2) { v8::Local<v8::Value> propertyName = element(i); v8::Local<v8::Value> propertyValue = element(i + 1);
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.h b/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.h index 2669c30..f1eaabc 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.h
@@ -496,7 +496,7 @@ bool isEof() const { return m_position >= m_length; } - ScriptState* scriptState() const { return m_scriptState.get(); } + ScriptState* getScriptState() const { return m_scriptState.get(); } protected: v8::Isolate* isolate() const { return m_scriptState->isolate(); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValueTest.cpp b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValueTest.cpp index ab84251..4083290 100644 --- a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValueTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValueTest.cpp
@@ -23,7 +23,7 @@ } v8::Isolate* isolate() const { return m_scope.isolate(); } - v8::Local<v8::Object> creationContext() const { return m_scope.scriptState()->context()->Global(); } + v8::Local<v8::Object> creationContext() const { return m_scope.getScriptState()->context()->Global(); } protected: V8TestingScope m_scope;
diff --git a/third_party/WebKit/Source/bindings/core/v8/ToV8Test.cpp b/third_party/WebKit/Source/bindings/core/v8/ToV8Test.cpp index 9306a981..fc91bc5 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ToV8Test.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ToV8Test.cpp
@@ -26,7 +26,7 @@ template<typename T> void testToV8(const char* expected, T value, const char* path, int lineNumber) { - v8::Local<v8::Value> actual = toV8(value, m_scope.scriptState()->context()->Global(), m_scope.isolate()); + v8::Local<v8::Value> actual = toV8(value, m_scope.getScriptState()->context()->Global(), m_scope.isolate()); if (actual.IsEmpty()) { ADD_FAILURE_AT(path, lineNumber) << "toV8 returns an empty value."; return; @@ -161,7 +161,7 @@ TEST_F(ToV8Test, scriptValue) { - ScriptValue value(m_scope.scriptState(), v8::Number::New(m_scope.isolate(), 1234)); + ScriptValue value(m_scope.getScriptState(), v8::Number::New(m_scope.isolate(), 1234)); TEST_TOV8("1234", value); } @@ -233,7 +233,7 @@ dictionary.append(std::make_pair("one", 1)); dictionary.append(std::make_pair("two", 2)); TEST_TOV8("[object Object]", dictionary); - v8::Local<v8::Context> context = m_scope.scriptState()->context(); + v8::Local<v8::Context> context = m_scope.getScriptState()->context(); v8::Local<v8::Object> result = toV8(dictionary, context->Global(), m_scope.isolate())->ToObject(context).ToLocalChecked(); v8::Local<v8::Value> one = result->Get(context, v8String(m_scope.isolate(), "one")).ToLocalChecked(); EXPECT_EQ(1, one->NumberValue(context).FromJust()); @@ -305,9 +305,9 @@ TEST_F(ToV8Test, withScriptState) { - ScriptValue value(m_scope.scriptState(), v8::Number::New(m_scope.isolate(), 1234.0)); + ScriptValue value(m_scope.getScriptState(), v8::Number::New(m_scope.isolate(), 1234.0)); - v8::Local<v8::Value> actual = toV8(value, m_scope.scriptState()); + v8::Local<v8::Value> actual = toV8(value, m_scope.getScriptState()); EXPECT_FALSE(actual.IsEmpty()); double actualAsNumber = actual.As<v8::Number>()->Value();
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp b/third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp index e6cbbd5..4888c6db 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp
@@ -140,8 +140,8 @@ event->target()->uncaughtExceptionInEventHandler(); if (!tryCatch.CanContinue()) { // Result of TerminateExecution(). - if (scriptState->executionContext()->isWorkerGlobalScope()) - toWorkerGlobalScope(scriptState->executionContext())->scriptController()->forbidExecution(); + if (scriptState->getExecutionContext()->isWorkerGlobalScope()) + toWorkerGlobalScope(scriptState->getExecutionContext())->scriptController()->forbidExecution(); return; } tryCatch.Reset();
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp index 890547a..99119852 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp
@@ -711,10 +711,10 @@ v8::Local<v8::Object> global = context->Global(); v8::Local<v8::Object> windowWrapper = V8Window::findInstanceInPrototypeChain(global, context->GetIsolate()); if (!windowWrapper.IsEmpty()) - return V8Window::toImpl(windowWrapper)->executionContext(); + return V8Window::toImpl(windowWrapper)->getExecutionContext(); v8::Local<v8::Object> workerWrapper = V8WorkerGlobalScope::findInstanceInPrototypeChain(global, context->GetIsolate()); if (!workerWrapper.IsEmpty()) - return V8WorkerGlobalScope::toImpl(workerWrapper)->executionContext(); + return V8WorkerGlobalScope::toImpl(workerWrapper)->getExecutionContext(); ASSERT(s_toExecutionContextForModules); return (*s_toExecutionContextForModules)(context); } @@ -787,8 +787,8 @@ return toV8Context(frame, world); } else if (context->isWorkerGlobalScope()) { if (WorkerOrWorkletScriptController* script = toWorkerOrWorkletGlobalScope(context)->scriptController()) { - if (script->scriptState()->contextIsValid()) - return script->scriptState()->context(); + if (script->getScriptState()->contextIsValid()) + return script->getScriptState()->context(); } } return v8::Local<v8::Context>();
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Binding.h b/third_party/WebKit/Source/bindings/core/v8/V8Binding.h index 0b45e58..46bd284 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8Binding.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8Binding.h
@@ -170,7 +170,7 @@ v8SetReturnValueEmptyString(info); return; } - V8PerIsolateData::from(isolate)->stringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); + V8PerIsolateData::from(isolate)->getStringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); } template<typename CallbackInfo> @@ -180,7 +180,7 @@ v8SetReturnValueNull(info); return; } - V8PerIsolateData::from(isolate)->stringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); + V8PerIsolateData::from(isolate)->getStringCache()->setReturnValueFromString(info.GetReturnValue(), string.impl()); } template<typename CallbackInfo> @@ -420,14 +420,14 @@ { if (string.isNull()) return v8::String::Empty(isolate); - return V8PerIsolateData::from(isolate)->stringCache()->v8ExternalString(isolate, string.impl()); + return V8PerIsolateData::from(isolate)->getStringCache()->v8ExternalString(isolate, string.impl()); } inline v8::Local<v8::String> v8String(v8::Isolate* isolate, const CompressibleString& string) { if (string.isNull()) return v8::String::Empty(isolate); - return V8PerIsolateData::from(isolate)->stringCache()->v8ExternalString(isolate, string); + return V8PerIsolateData::from(isolate)->getStringCache()->v8ExternalString(isolate, string); } inline v8::Local<v8::String> v8AtomicString(v8::Isolate* isolate, const char* str, int length = -1)
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8BindingForTesting.cpp b/third_party/WebKit/Source/bindings/core/v8/V8BindingForTesting.cpp index 3708e99..c992e3c 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8BindingForTesting.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8BindingForTesting.cpp
@@ -23,7 +23,7 @@ { } -ExecutionContext* ScriptStateForTesting::executionContext() const +ExecutionContext* ScriptStateForTesting::getExecutionContext() const { return m_executionContext; } @@ -46,7 +46,7 @@ m_scriptState->disposePerContextData(); } -ScriptState* V8TestingScope::scriptState() const +ScriptState* V8TestingScope::getScriptState() const { return m_scriptState.get(); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8BindingForTesting.h b/third_party/WebKit/Source/bindings/core/v8/V8BindingForTesting.h index 6b7c973..4b6b7da 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8BindingForTesting.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8BindingForTesting.h
@@ -17,7 +17,7 @@ class ScriptStateForTesting : public ScriptState { public: static PassRefPtr<ScriptStateForTesting> create(v8::Local<v8::Context>, PassRefPtr<DOMWrapperWorld>); - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; void setExecutionContext(ExecutionContext*) override; private: ScriptStateForTesting(v8::Local<v8::Context>, PassRefPtr<DOMWrapperWorld>); @@ -28,7 +28,7 @@ DISALLOW_NEW(); public: explicit V8TestingScope(v8::Isolate*); - ScriptState* scriptState() const; + ScriptState* getScriptState() const; v8::Isolate* isolate() const; v8::Local<v8::Context> context() const; ~V8TestingScope();
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp b/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp index 677d96a..c272430 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp
@@ -20,7 +20,7 @@ template<typename T> v8::Local<v8::Value> toV8(T value) { - return blink::toV8(value, m_scope.scriptState()->context()->Global(), m_scope.isolate()); + return blink::toV8(value, m_scope.getScriptState()->context()->Global(), m_scope.isolate()); } V8TestingScope m_scope;
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8CustomElementLifecycleCallbacks.cpp b/third_party/WebKit/Source/bindings/core/v8/V8CustomElementLifecycleCallbacks.cpp index 2b32849..c028c9b 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8CustomElementLifecycleCallbacks.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8CustomElementLifecycleCallbacks.cpp
@@ -89,7 +89,7 @@ V8CustomElementLifecycleCallbacks::V8CustomElementLifecycleCallbacks(ScriptState* scriptState, v8::Local<v8::Object> prototype, v8::MaybeLocal<v8::Function> created, v8::MaybeLocal<v8::Function> attached, v8::MaybeLocal<v8::Function> detached, v8::MaybeLocal<v8::Function> attributeChanged) : CustomElementLifecycleCallbacks(flagSet(attached, detached, attributeChanged)) - , ContextLifecycleObserver(scriptState->executionContext()) + , ContextLifecycleObserver(scriptState->getExecutionContext()) , m_scriptState(scriptState) , m_prototype(scriptState->isolate(), prototype) , m_created(scriptState->isolate(), created) @@ -109,7 +109,7 @@ V8PerContextData* V8CustomElementLifecycleCallbacks::creationContextData() { - if (!executionContext()) + if (!getExecutionContext()) return 0; v8::Local<v8::Context> context = m_scriptState->context(); @@ -141,7 +141,7 @@ // FIXME: callbacks while paused should be queued up for execution to // continue then be delivered in order rather than delivered immediately. // Bug 329665 tracks similar behavior for other synchronous events. - if (!executionContext() || executionContext()->activeDOMObjectsAreStopped()) + if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) return; if (!m_scriptState->contextIsValid()) @@ -170,7 +170,7 @@ v8::TryCatch exceptionCatcher(isolate); exceptionCatcher.SetVerbose(true); - ScriptController::callFunction(executionContext(), callback, receiver, 0, 0, isolate); + ScriptController::callFunction(getExecutionContext(), callback, receiver, 0, 0, isolate); } void V8CustomElementLifecycleCallbacks::attached(Element* element) @@ -188,7 +188,7 @@ // FIXME: callbacks while paused should be queued up for execution to // continue then be delivered in order rather than delivered immediately. // Bug 329665 tracks similar behavior for other synchronous events. - if (!executionContext() || executionContext()->activeDOMObjectsAreStopped()) + if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) return; if (!m_scriptState->contextIsValid()) @@ -212,7 +212,7 @@ v8::TryCatch exceptionCatcher(isolate); exceptionCatcher.SetVerbose(true); - ScriptController::callFunction(executionContext(), callback, receiver, WTF_ARRAY_LENGTH(argv), argv, isolate); + ScriptController::callFunction(getExecutionContext(), callback, receiver, WTF_ARRAY_LENGTH(argv), argv, isolate); } void V8CustomElementLifecycleCallbacks::call(const ScopedPersistent<v8::Function>& weakCallback, Element* element) @@ -220,7 +220,7 @@ // FIXME: callbacks while paused should be queued up for execution to // continue then be delivered in order rather than delivered immediately. // Bug 329665 tracks similar behavior for other synchronous events. - if (!executionContext() || executionContext()->activeDOMObjectsAreStopped()) + if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) return; if (!m_scriptState->contextIsValid()) @@ -238,7 +238,7 @@ v8::TryCatch exceptionCatcher(isolate); exceptionCatcher.SetVerbose(true); - ScriptController::callFunction(executionContext(), callback, receiver, 0, 0, isolate); + ScriptController::callFunction(getExecutionContext(), callback, receiver, 0, 0, isolate); } DEFINE_TRACE(V8CustomElementLifecycleCallbacks)
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ErrorHandler.cpp b/third_party/WebKit/Source/bindings/core/v8/V8ErrorHandler.cpp index c03012f..7bea7df 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8ErrorHandler.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8ErrorHandler.cpp
@@ -56,7 +56,7 @@ if (errorEvent->world() && errorEvent->world() != &world()) return v8::Null(isolate()); - v8::Local<v8::Object> listener = getListenerObject(scriptState->executionContext()); + v8::Local<v8::Object> listener = getListenerObject(scriptState->getExecutionContext()); if (listener.IsEmpty() || !listener->IsFunction()) return v8::Null(isolate()); @@ -74,10 +74,10 @@ v8::TryCatch tryCatch(isolate()); tryCatch.SetVerbose(true); v8::MaybeLocal<v8::Value> result; - if (scriptState->executionContext()->isWorkerGlobalScope()) { - result = V8ScriptRunner::callFunction(callFunction, scriptState->executionContext(), thisValue, WTF_ARRAY_LENGTH(parameters), parameters, isolate()); + if (scriptState->getExecutionContext()->isWorkerGlobalScope()) { + result = V8ScriptRunner::callFunction(callFunction, scriptState->getExecutionContext(), thisValue, WTF_ARRAY_LENGTH(parameters), parameters, isolate()); } else { - result = ScriptController::callFunction(scriptState->executionContext(), callFunction, thisValue, WTF_ARRAY_LENGTH(parameters), parameters, isolate()); + result = ScriptController::callFunction(scriptState->getExecutionContext(), callFunction, thisValue, WTF_ARRAY_LENGTH(parameters), parameters, isolate()); } v8::Local<v8::Value> returnValue; if (!result.ToLocal(&returnValue))
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp b/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp index 4d68a93..95c22fbd 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp
@@ -44,7 +44,7 @@ v8::Local<v8::Function> V8EventListener::getListenerFunction(ScriptState* scriptState) { - v8::Local<v8::Object> listener = getListenerObject(scriptState->executionContext()); + v8::Local<v8::Object> listener = getListenerObject(scriptState->getExecutionContext()); // Has the listener been disposed? if (listener.IsEmpty()) @@ -79,10 +79,10 @@ if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); - if (!scriptState->executionContext()->isDocument()) + if (!scriptState->getExecutionContext()->isDocument()) return v8::Local<v8::Value>(); - LocalFrame* frame = toDocument(scriptState->executionContext())->frame(); + LocalFrame* frame = toDocument(scriptState->getExecutionContext())->frame(); if (!frame) return v8::Local<v8::Value>();
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp index 5a43538..3f5bc4b 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
@@ -280,7 +280,7 @@ if (!scriptState->contextIsValid()) return; - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); if (!executionContext) return; @@ -288,7 +288,7 @@ WorkerOrWorkletScriptController* scriptController = toWorkerGlobalScope(executionContext)->scriptController(); ASSERT(scriptController); - promiseRejectHandler(data, *scriptController->rejectedPromises(), String()); + promiseRejectHandler(data, *scriptController->getRejectedPromises(), String()); } static void failedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, v8::AccessType type, v8::Local<v8::Value> data) @@ -377,11 +377,16 @@ if (v8::HeapProfiler* profiler = isolate->GetHeapProfiler()) profiler->SetWrapperClassInfoProvider(WrapperTypeInfo::NodeClassId, &RetainedDOMInfo::createRetainedDOMInfo); + + ASSERT(ThreadState::current()); + ThreadState::current()->addInterruptor(adoptPtr(new V8IsolateInterruptor(isolate))); + ThreadState::current()->registerTraceDOMWrappers(isolate, V8GCController::traceDOMWrappers); } void V8Initializer::shutdownMainThread() { ASSERT(isMainThread()); + ThreadState::current()->unregisterTraceDOMWrappers(); v8::Isolate* isolate = V8PerIsolateData::mainThreadIsolate(); V8PerIsolateData::willBeDestroyed(isolate); V8PerIsolateData::destroy(isolate); @@ -405,7 +410,7 @@ ScriptState* scriptState = ScriptState::current(isolate); // During the frame teardown, there may not be a valid context. - if (ExecutionContext* context = scriptState->executionContext()) { + if (ExecutionContext* context = scriptState->getExecutionContext()) { String errorMessage = toCoreStringWithNullCheck(message->Get()); TOSTRING_VOID(V8StringResource<>, sourceURL, message->GetScriptOrigin().ResourceName()); int scriptId = 0;
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8IntersectionObserverCallback.cpp b/third_party/WebKit/Source/bindings/core/v8/V8IntersectionObserverCallback.cpp index 5abf33f35..37fd6d4 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8IntersectionObserverCallback.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8IntersectionObserverCallback.cpp
@@ -13,7 +13,7 @@ namespace blink { V8IntersectionObserverCallback::V8IntersectionObserverCallback(v8::Local<v8::Function> callback, v8::Local<v8::Object> owner, ScriptState* scriptState) - : ActiveDOMCallback(scriptState->executionContext()) + : ActiveDOMCallback(scriptState->getExecutionContext()) , m_callback(scriptState->isolate(), callback) , m_scriptState(scriptState) { @@ -55,7 +55,7 @@ v8::TryCatch exceptionCatcher(m_scriptState->isolate()); exceptionCatcher.SetVerbose(true); - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), thisObject, 2, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), thisObject, 2, argv, m_scriptState->isolate()); } void V8IntersectionObserverCallback::setWeakCallback(const v8::WeakCallbackInfo<V8IntersectionObserverCallback>& data)
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8IntersectionObserverCallback.h b/third_party/WebKit/Source/bindings/core/v8/V8IntersectionObserverCallback.h index bd119f74..18be3a8 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8IntersectionObserverCallback.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8IntersectionObserverCallback.h
@@ -22,7 +22,7 @@ DECLARE_VIRTUAL_TRACE(); void handleEvent(const HeapVector<Member<IntersectionObserverEntry>>&, IntersectionObserver&) override; - ExecutionContext* executionContext() const override { return ContextLifecycleObserver::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ContextLifecycleObserver::getExecutionContext(); } private: static void setWeakCallback(const v8::WeakCallbackInfo<V8IntersectionObserverCallback>&);
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8LazyEventListener.cpp b/third_party/WebKit/Source/bindings/core/v8/V8LazyEventListener.cpp index 43aa082..b078f017 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8LazyEventListener.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8LazyEventListener.cpp
@@ -76,7 +76,7 @@ v8::Local<v8::Value> V8LazyEventListener::callListenerFunction(ScriptState* scriptState, v8::Local<v8::Value> jsEvent, Event* event) { ASSERT(!jsEvent.IsEmpty()); - v8::Local<v8::Object> listenerObject = getListenerObject(scriptState->executionContext()); + v8::Local<v8::Object> listenerObject = getListenerObject(scriptState->getExecutionContext()); if (listenerObject.IsEmpty()) return v8::Local<v8::Value>(); @@ -85,10 +85,10 @@ if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); - if (!scriptState->executionContext()->isDocument()) + if (!scriptState->getExecutionContext()->isDocument()) return v8::Local<v8::Value>(); - LocalFrame* frame = toDocument(scriptState->executionContext())->frame(); + LocalFrame* frame = toDocument(scriptState->getExecutionContext())->frame(); if (!frame) return v8::Local<v8::Value>();
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8MutationCallback.cpp b/third_party/WebKit/Source/bindings/core/v8/V8MutationCallback.cpp index 89eadb5..61c92a4 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8MutationCallback.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8MutationCallback.cpp
@@ -36,7 +36,7 @@ namespace blink { V8MutationCallback::V8MutationCallback(v8::Local<v8::Function> callback, v8::Local<v8::Object> owner, ScriptState* scriptState) - : ActiveDOMCallback(scriptState->executionContext()) + : ActiveDOMCallback(scriptState->getExecutionContext()) , m_callback(scriptState->isolate(), callback) , m_scriptState(scriptState) { @@ -79,7 +79,7 @@ v8::TryCatch exceptionCatcher(isolate); exceptionCatcher.SetVerbose(true); - ScriptController::callFunction(executionContext(), m_callback.newLocal(isolate), thisObject, WTF_ARRAY_LENGTH(argv), argv, isolate); + ScriptController::callFunction(getExecutionContext(), m_callback.newLocal(isolate), thisObject, WTF_ARRAY_LENGTH(argv), argv, isolate); } void V8MutationCallback::setWeakCallback(const v8::WeakCallbackInfo<V8MutationCallback>& data)
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8MutationCallback.h b/third_party/WebKit/Source/bindings/core/v8/V8MutationCallback.h index b774495..1d2cca7b 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8MutationCallback.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8MutationCallback.h
@@ -49,7 +49,7 @@ ~V8MutationCallback() override; void call(const WillBeHeapVector<RefPtrWillBeMember<MutationRecord>>&, MutationObserver*) override; - ExecutionContext* executionContext() const override { return ContextLifecycleObserver::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ContextLifecycleObserver::getExecutionContext(); } DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.cpp b/third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.cpp index a0f0d442..4b7da585 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.cpp
@@ -101,7 +101,7 @@ } v8::Local<v8::Value> result; - if (!ScriptController::callFunction(m_scriptState->executionContext(), callback, receiver, 1, info.get(), isolate).ToLocal(&result)) { + if (!ScriptController::callFunction(m_scriptState->getExecutionContext(), callback, receiver, 1, info.get(), isolate).ToLocal(&result)) { exceptionState.rethrowV8Exception(exceptionCatcher.Exception()); return NodeFilter::FILTER_REJECT; }
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ObjectBuilder.h b/third_party/WebKit/Source/bindings/core/v8/V8ObjectBuilder.h index df75e7d8..652fca7d 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8ObjectBuilder.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8ObjectBuilder.h
@@ -21,7 +21,7 @@ public: explicit V8ObjectBuilder(ScriptState*); - ScriptState* scriptState() const { return m_scriptState.get(); } + ScriptState* getScriptState() const { return m_scriptState.get(); } V8ObjectBuilder& add(const String& name, const V8ObjectBuilder&);
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.h b/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.h index e2a7b0a..00d12d9 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8PerContextData.h
@@ -88,7 +88,7 @@ v8::Local<v8::Object> prototypeForType(const WrapperTypeInfo*); - V8NPObjectMap* v8NPObjectMap() { return &m_v8NPObjectMap; } + V8NPObjectMap* getV8NPObjectMap() { return &m_v8NPObjectMap; } void addCustomElementBinding(CustomElementDefinition*, PassOwnPtr<CustomElementBinding>);
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.h b/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.h index 33ed8dc8..2cda3f4 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.h
@@ -76,7 +76,7 @@ v8::Isolate* isolate() { return m_isolateHolder->isolate(); } - StringCache* stringCache() { return m_stringCache.get(); } + StringCache* getStringCache() { return m_stringCache.get(); } v8::Persistent<v8::Value>& ensureLiveRoot();
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerformanceObserverCallback.cpp b/third_party/WebKit/Source/bindings/core/v8/V8PerformanceObserverCallback.cpp index 72614664..8ef9ca9 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8PerformanceObserverCallback.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8PerformanceObserverCallback.cpp
@@ -16,7 +16,7 @@ namespace blink { V8PerformanceObserverCallback::V8PerformanceObserverCallback(v8::Local<v8::Function> callback, v8::Local<v8::Object> owner, ScriptState* scriptState) - : ActiveDOMCallback(scriptState->executionContext()) + : ActiveDOMCallback(scriptState->getExecutionContext()) , m_callback(scriptState->isolate(), callback) , m_scriptState(scriptState) { @@ -58,7 +58,7 @@ v8::TryCatch exceptionCatcher(m_scriptState->isolate()); exceptionCatcher.SetVerbose(true); - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), thisObject, 2, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), thisObject, 2, argv, m_scriptState->isolate()); } void V8PerformanceObserverCallback::setWeakCallback(const v8::WeakCallbackInfo<V8PerformanceObserverCallback>& data)
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerformanceObserverCallback.h b/third_party/WebKit/Source/bindings/core/v8/V8PerformanceObserverCallback.h index 2fb1b71..b75fbd69 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8PerformanceObserverCallback.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8PerformanceObserverCallback.h
@@ -26,7 +26,7 @@ DECLARE_VIRTUAL_TRACE(); void handleEvent(PerformanceObserverEntryList*, PerformanceObserver*) override; - ExecutionContext* executionContext() const override { return ContextLifecycleObserver::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ContextLifecycleObserver::getExecutionContext(); } private: CORE_EXPORT V8PerformanceObserverCallback(v8::Local<v8::Function>, v8::Local<v8::Object>, ScriptState*);
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h b/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h index 78575d2..fa715a5 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h +++ b/third_party/WebKit/Source/bindings/core/v8/V8StringResource.h
@@ -118,7 +118,7 @@ return m_atomicString; } - const CompressibleString& compressibleString() { return m_compressibleString; } + const CompressibleString& getCompressibleString() { return m_compressibleString; } protected: // A shallow copy of the string. Keeps the string buffer alive until the V8 engine garbage collects it.
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp b/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp index 0ff99ce..605dbed 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8ValueCache.cpp
@@ -34,32 +34,32 @@ StringCacheMapTraits::MapType* StringCacheMapTraits::MapFromWeakCallbackInfo( const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { - return &(V8PerIsolateData::from(data.GetIsolate())->stringCache()->m_stringCache); + return &(V8PerIsolateData::from(data.GetIsolate())->getStringCache()->m_stringCache); } void StringCacheMapTraits::Dispose( v8::Isolate* isolate, v8::Global<v8::String> value, StringImpl* key) { - V8PerIsolateData::from(isolate)->stringCache()->InvalidateLastString(); + V8PerIsolateData::from(isolate)->getStringCache()->InvalidateLastString(); key->deref(); } void StringCacheMapTraits::DisposeWeak(const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { - V8PerIsolateData::from(data.GetIsolate())->stringCache()->InvalidateLastString(); + V8PerIsolateData::from(data.GetIsolate())->getStringCache()->InvalidateLastString(); data.GetParameter()->deref(); } void StringCacheMapTraits::OnWeakCallback(const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { - V8PerIsolateData::from(data.GetIsolate())->stringCache()->InvalidateLastString(); + V8PerIsolateData::from(data.GetIsolate())->getStringCache()->InvalidateLastString(); } CompressibleStringCacheMapTraits::MapType* CompressibleStringCacheMapTraits::MapFromWeakCallbackInfo( const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { - return &(V8PerIsolateData::from(data.GetIsolate())->stringCache()->m_compressibleStringCache); + return &(V8PerIsolateData::from(data.GetIsolate())->getStringCache()->m_compressibleStringCache); } void CompressibleStringCacheMapTraits::Dispose(
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8WorkerGlobalScopeEventListener.cpp b/third_party/WebKit/Source/bindings/core/v8/V8WorkerGlobalScopeEventListener.cpp index 4955654..bed546f 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8WorkerGlobalScopeEventListener.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8WorkerGlobalScopeEventListener.cpp
@@ -54,7 +54,7 @@ // See issue 889829. RefPtrWillBeRawPtr<V8AbstractEventListener> protect(this); - WorkerOrWorkletScriptController* script = toWorkerGlobalScope(scriptState->executionContext())->scriptController(); + WorkerOrWorkletScriptController* script = toWorkerGlobalScope(scriptState->getExecutionContext())->scriptController(); if (!script) return; @@ -77,7 +77,7 @@ return v8::Local<v8::Value>(); v8::Local<v8::Value> parameters[1] = { jsEvent }; - v8::MaybeLocal<v8::Value> maybeResult = V8ScriptRunner::callFunction(handlerFunction, scriptState->executionContext(), receiver, WTF_ARRAY_LENGTH(parameters), parameters, isolate()); + v8::MaybeLocal<v8::Value> maybeResult = V8ScriptRunner::callFunction(handlerFunction, scriptState->getExecutionContext(), receiver, WTF_ARRAY_LENGTH(parameters), parameters, isolate()); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data()); @@ -91,7 +91,7 @@ // This is almost identical to V8AbstractEventListener::getReceiverObject(). v8::Local<v8::Object> V8WorkerGlobalScopeEventListener::getReceiverObject(ScriptState* scriptState, Event* event) { - v8::Local<v8::Object> listener = getListenerObject(scriptState->executionContext()); + v8::Local<v8::Object> listener = getListenerObject(scriptState->getExecutionContext()); if (!listener.IsEmpty() && !listener->IsFunction()) return listener;
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp index 60c4b8c2..19e6242 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp
@@ -257,7 +257,7 @@ if (m_world->isMainWorld()) { // ActivityLogger for main world is updated within updateDocument(). updateDocument(); - origin = m_frame->securityContext()->securityOrigin(); + origin = m_frame->securityContext()->getSecurityOrigin(); // FIXME: Can this be removed when CSP moves to browser? ContentSecurityPolicy* csp = m_frame->securityContext()->contentSecurityPolicy(); context->AllowCodeGenerationFromStrings(csp->allowEval(0, ContentSecurityPolicy::SuppressReport)); @@ -475,7 +475,7 @@ if (m_world->isPrivateScriptIsolatedWorld()) { token = "private-script://" + token; } else if (m_world->isIsolatedWorld()) { - SecurityOrigin* frameSecurityOrigin = m_frame->securityContext()->securityOrigin(); + SecurityOrigin* frameSecurityOrigin = m_frame->securityContext()->getSecurityOrigin(); String frameSecurityToken = frameSecurityOrigin->toString(); // We need to check the return value of domainWasSetInDOM() on the // frame's SecurityOrigin because, if that's the case, only @@ -504,7 +504,7 @@ return; updateActivityLogger(); updateDocumentProperty(); - updateSecurityOrigin(m_frame->securityContext()->securityOrigin()); + updateSecurityOrigin(m_frame->securityContext()->getSecurityOrigin()); } static v8::Local<v8::Value> getNamedProperty(HTMLDocument* htmlDocument, const AtomicString& key, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h index e5fab9f..64c2768 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h +++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h
@@ -59,7 +59,7 @@ DECLARE_TRACE(); v8::Local<v8::Context> contextIfInitialized() const { return m_scriptState ? m_scriptState->context() : v8::Local<v8::Context>(); } - ScriptState* scriptState() const { return m_scriptState.get(); } + ScriptState* getScriptState() const { return m_scriptState.get(); } // Update document object of the frame. void updateDocument();
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp b/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp index b523afb..db724b7b 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp
@@ -78,7 +78,7 @@ SecurityOrigin* origin = isolatedWorldWindowProxy->world().isolatedWorldSecurityOrigin(); if (!isolatedWorldWindowProxy->isContextInitialized()) continue; - result.append(std::make_pair(isolatedWorldWindowProxy->scriptState(), origin)); + result.append(std::make_pair(isolatedWorldWindowProxy->getScriptState(), origin)); } }
diff --git a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp index fbdbb4d..e0e0c229 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp
@@ -152,7 +152,7 @@ WorkerThreadDebugger::setContextDebugData(context); // Create a new JS object and use it as the prototype for the shadow global object. - const WrapperTypeInfo* wrapperTypeInfo = m_globalScope->scriptWrappable()->wrapperTypeInfo(); + const WrapperTypeInfo* wrapperTypeInfo = m_globalScope->getScriptWrappable()->wrapperTypeInfo(); v8::Local<v8::Function> globalScopeConstructor = m_scriptState->perContextData()->constructorForType(wrapperTypeInfo); if (globalScopeConstructor.IsEmpty()) @@ -164,7 +164,7 @@ return false; } - jsGlobalScope = V8DOMWrapper::associateObjectWithWrapper(m_isolate, m_globalScope->scriptWrappable(), wrapperTypeInfo, jsGlobalScope); + jsGlobalScope = V8DOMWrapper::associateObjectWithWrapper(m_isolate, m_globalScope->getScriptWrappable(), wrapperTypeInfo, jsGlobalScope); // Insert the object instance as the prototype of the shadow object. v8::Local<v8::Object> globalObject = v8::Local<v8::Object>::Cast(m_scriptState->context()->Global()->GetPrototype());
diff --git a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.h b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.h index 9ae090f..73176e5 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.h +++ b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.h
@@ -83,12 +83,12 @@ void disableEval(const String&); // Used by Inspector agents: - ScriptState* scriptState() { return m_scriptState.get(); } + ScriptState* getScriptState() { return m_scriptState.get(); } // Used by V8 bindings: v8::Local<v8::Context> context() { return m_scriptState ? m_scriptState->context() : v8::Local<v8::Context>(); } - RejectedPromises* rejectedPromises() const { return m_rejectedPromises.get(); } + RejectedPromises* getRejectedPromises() const { return m_rejectedPromises.get(); } DECLARE_TRACE();
diff --git a/third_party/WebKit/Source/bindings/modules/v8/ScriptValueSerializerForModules.cpp b/third_party/WebKit/Source/bindings/modules/v8/ScriptValueSerializerForModules.cpp index 7a984be5..4f0ce8a 100644 --- a/third_party/WebKit/Source/bindings/modules/v8/ScriptValueSerializerForModules.cpp +++ b/third_party/WebKit/Source/bindings/modules/v8/ScriptValueSerializerForModules.cpp
@@ -342,8 +342,8 @@ return false; if (!readWebCoreString(&url)) return false; - DOMFileSystem* fs = DOMFileSystem::create(scriptState()->executionContext(), name, static_cast<FileSystemType>(type), KURL(ParsedURLString, url)); - *value = toV8(fs, scriptState()->context()->Global(), isolate()); + DOMFileSystem* fs = DOMFileSystem::create(getScriptState()->getExecutionContext(), name, static_cast<FileSystemType>(type), KURL(ParsedURLString, url)); + *value = toV8(fs, getScriptState()->context()->Global(), isolate()); return !value->IsEmpty(); } @@ -400,7 +400,7 @@ return false; } - *value = toV8(CryptoKey::create(key), scriptState()->context()->Global(), isolate()); + *value = toV8(CryptoKey::create(key), getScriptState()->context()->Global(), isolate()); return !value->IsEmpty(); }
diff --git a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModulesTest.cpp b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModulesTest.cpp index a2dacf1..25d91f5a 100644 --- a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModulesTest.cpp +++ b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModulesTest.cpp
@@ -105,7 +105,7 @@ { } - ScriptState* scriptState() const { return m_scope.scriptState(); } + ScriptState* getScriptState() const { return m_scope.getScriptState(); } private: V8TestingScope m_scope; @@ -113,13 +113,13 @@ TEST_F(IDBKeyFromValueAndKeyPathTest, TopLevelPropertyStringValue) { - v8::Isolate* isolate = scriptState()->isolate(); + v8::Isolate* isolate = getScriptState()->isolate(); // object = { foo: "zoo" } v8::Local<v8::Object> object = v8::Object::New(isolate); - ASSERT_TRUE(v8CallBoolean(object->Set(scriptState()->context(), v8AtomicString(isolate, "foo"), v8AtomicString(isolate, "zoo")))); + ASSERT_TRUE(v8CallBoolean(object->Set(getScriptState()->context(), v8AtomicString(isolate, "foo"), v8AtomicString(isolate, "zoo")))); - ScriptValue scriptValue(scriptState(), object); + ScriptValue scriptValue(getScriptState(), object); checkKeyPathStringValue(isolate, scriptValue, "foo", "zoo"); checkKeyPathNullValue(isolate, scriptValue, "bar"); @@ -127,13 +127,13 @@ TEST_F(IDBKeyFromValueAndKeyPathTest, TopLevelPropertyNumberValue) { - v8::Isolate* isolate = scriptState()->isolate(); + v8::Isolate* isolate = getScriptState()->isolate(); // object = { foo: 456 } v8::Local<v8::Object> object = v8::Object::New(isolate); - ASSERT_TRUE(v8CallBoolean(object->Set(scriptState()->context(), v8AtomicString(isolate, "foo"), v8::Number::New(isolate, 456)))); + ASSERT_TRUE(v8CallBoolean(object->Set(getScriptState()->context(), v8AtomicString(isolate, "foo"), v8::Number::New(isolate, 456)))); - ScriptValue scriptValue(scriptState(), object); + ScriptValue scriptValue(getScriptState(), object); checkKeyPathNumberValue(isolate, scriptValue, "foo", 456); checkKeyPathNullValue(isolate, scriptValue, "bar"); @@ -141,15 +141,15 @@ TEST_F(IDBKeyFromValueAndKeyPathTest, SubProperty) { - v8::Isolate* isolate = scriptState()->isolate(); + v8::Isolate* isolate = getScriptState()->isolate(); // object = { foo: { bar: "zee" } } v8::Local<v8::Object> object = v8::Object::New(isolate); v8::Local<v8::Object> subProperty = v8::Object::New(isolate); - ASSERT_TRUE(v8CallBoolean(subProperty->Set(scriptState()->context(), v8AtomicString(isolate, "bar"), v8AtomicString(isolate, "zee")))); - ASSERT_TRUE(v8CallBoolean(object->Set(scriptState()->context(), v8AtomicString(isolate, "foo"), subProperty))); + ASSERT_TRUE(v8CallBoolean(subProperty->Set(getScriptState()->context(), v8AtomicString(isolate, "bar"), v8AtomicString(isolate, "zee")))); + ASSERT_TRUE(v8CallBoolean(object->Set(getScriptState()->context(), v8AtomicString(isolate, "foo"), subProperty))); - ScriptValue scriptValue(scriptState(), object); + ScriptValue scriptValue(getScriptState(), object); checkKeyPathStringValue(isolate, scriptValue, "foo.bar", "zee"); checkKeyPathNullValue(isolate, scriptValue, "bar"); @@ -160,54 +160,54 @@ TEST_F(InjectIDBKeyTest, ImplicitValues) { - v8::Isolate* isolate = scriptState()->isolate(); + v8::Isolate* isolate = getScriptState()->isolate(); { v8::Local<v8::String> string = v8String(isolate, "string"); - ScriptValue value = ScriptValue(scriptState(), string); - checkInjectionIgnored(scriptState(), IDBKey::createNumber(123), value, "length"); + ScriptValue value = ScriptValue(getScriptState(), string); + checkInjectionIgnored(getScriptState(), IDBKey::createNumber(123), value, "length"); } { v8::Local<v8::Array> array = v8::Array::New(isolate); - ScriptValue value = ScriptValue(scriptState(), array); - checkInjectionIgnored(scriptState(), IDBKey::createNumber(456), value, "length"); + ScriptValue value = ScriptValue(getScriptState(), array); + checkInjectionIgnored(getScriptState(), IDBKey::createNumber(456), value, "length"); } } TEST_F(InjectIDBKeyTest, TopLevelPropertyStringValue) { - v8::Isolate* isolate = scriptState()->isolate(); + v8::Isolate* isolate = getScriptState()->isolate(); // object = { foo: "zoo" } v8::Local<v8::Object> object = v8::Object::New(isolate); - ASSERT_TRUE(v8CallBoolean(object->Set(scriptState()->context(), v8AtomicString(isolate, "foo"), v8AtomicString(isolate, "zoo")))); + ASSERT_TRUE(v8CallBoolean(object->Set(getScriptState()->context(), v8AtomicString(isolate, "foo"), v8AtomicString(isolate, "zoo")))); - ScriptValue scriptObject(scriptState(), object); - checkInjection(scriptState(), IDBKey::createString("myNewKey"), scriptObject, "bar"); - checkInjection(scriptState(), IDBKey::createNumber(1234), scriptObject, "bar"); + ScriptValue scriptObject(getScriptState(), object); + checkInjection(getScriptState(), IDBKey::createString("myNewKey"), scriptObject, "bar"); + checkInjection(getScriptState(), IDBKey::createNumber(1234), scriptObject, "bar"); - checkInjectionDisallowed(scriptState(), scriptObject, "foo.bar"); + checkInjectionDisallowed(getScriptState(), scriptObject, "foo.bar"); } TEST_F(InjectIDBKeyTest, SubProperty) { - v8::Isolate* isolate = scriptState()->isolate(); + v8::Isolate* isolate = getScriptState()->isolate(); // object = { foo: { bar: "zee" } } v8::Local<v8::Object> object = v8::Object::New(isolate); v8::Local<v8::Object> subProperty = v8::Object::New(isolate); - ASSERT_TRUE(v8CallBoolean(subProperty->Set(scriptState()->context(), v8AtomicString(isolate, "bar"), v8AtomicString(isolate, "zee")))); - ASSERT_TRUE(v8CallBoolean(object->Set(scriptState()->context(), v8AtomicString(isolate, "foo"), subProperty))); + ASSERT_TRUE(v8CallBoolean(subProperty->Set(getScriptState()->context(), v8AtomicString(isolate, "bar"), v8AtomicString(isolate, "zee")))); + ASSERT_TRUE(v8CallBoolean(object->Set(getScriptState()->context(), v8AtomicString(isolate, "foo"), subProperty))); - ScriptValue scriptObject(scriptState(), object); - checkInjection(scriptState(), IDBKey::createString("myNewKey"), scriptObject, "foo.baz"); - checkInjection(scriptState(), IDBKey::createNumber(789), scriptObject, "foo.baz"); - checkInjection(scriptState(), IDBKey::createDate(4567), scriptObject, "foo.baz"); - checkInjection(scriptState(), IDBKey::createDate(4567), scriptObject, "bar"); - checkInjection(scriptState(), IDBKey::createArray(IDBKey::KeyArray()), scriptObject, "foo.baz"); - checkInjection(scriptState(), IDBKey::createArray(IDBKey::KeyArray()), scriptObject, "bar"); + ScriptValue scriptObject(getScriptState(), object); + checkInjection(getScriptState(), IDBKey::createString("myNewKey"), scriptObject, "foo.baz"); + checkInjection(getScriptState(), IDBKey::createNumber(789), scriptObject, "foo.baz"); + checkInjection(getScriptState(), IDBKey::createDate(4567), scriptObject, "foo.baz"); + checkInjection(getScriptState(), IDBKey::createDate(4567), scriptObject, "bar"); + checkInjection(getScriptState(), IDBKey::createArray(IDBKey::KeyArray()), scriptObject, "foo.baz"); + checkInjection(getScriptState(), IDBKey::createArray(IDBKey::KeyArray()), scriptObject, "bar"); - checkInjectionDisallowed(scriptState(), scriptObject, "foo.bar.baz"); - checkInjection(scriptState(), IDBKey::createString("zoo"), scriptObject, "foo.xyz.foo"); + checkInjectionDisallowed(getScriptState(), scriptObject, "foo.bar.baz"); + checkInjection(getScriptState(), IDBKey::createString("zoo"), scriptObject, "foo.xyz.foo"); } } // namespace
diff --git a/third_party/WebKit/Source/bindings/modules/v8/custom/V8CustomSQLStatementErrorCallback.cpp b/third_party/WebKit/Source/bindings/modules/v8/custom/V8CustomSQLStatementErrorCallback.cpp index f3bb73ec..20a6aef6 100644 --- a/third_party/WebKit/Source/bindings/modules/v8/custom/V8CustomSQLStatementErrorCallback.cpp +++ b/third_party/WebKit/Source/bindings/modules/v8/custom/V8CustomSQLStatementErrorCallback.cpp
@@ -74,7 +74,7 @@ // statement, if any, or onto the next overall step otherwise. Otherwise, // the error callback did not return false, or there was no error callback. // Jump to the last step in the overall steps. - if (!ScriptController::callFunction(executionContext(), m_callback.newLocal(isolate), m_scriptState->context()->Global(), WTF_ARRAY_LENGTH(argv), argv, isolate).ToLocal(&result)) + if (!ScriptController::callFunction(getExecutionContext(), m_callback.newLocal(isolate), m_scriptState->context()->Global(), WTF_ARRAY_LENGTH(argv), argv, isolate).ToLocal(&result)) return true; bool value;
diff --git a/third_party/WebKit/Source/bindings/scripts/v8_types.py b/third_party/WebKit/Source/bindings/scripts/v8_types.py index 5df76db..3c60c1f3 100644 --- a/third_party/WebKit/Source/bindings/scripts/v8_types.py +++ b/third_party/WebKit/Source/bindings/scripts/v8_types.py
@@ -886,7 +886,7 @@ 'StringOrNull': '{cpp_value}.isNull() ? v8::Local<v8::Value>(v8::Null({isolate})) : v8String({isolate}, {cpp_value})', # Special cases 'Dictionary': '{cpp_value}.v8Value()', - 'EventHandler': '{cpp_value} ? v8::Local<v8::Value>(V8AbstractEventListener::cast({cpp_value})->getListenerObject(impl->executionContext())) : v8::Local<v8::Value>(v8::Null({isolate}))', + 'EventHandler': '{cpp_value} ? v8::Local<v8::Value>(V8AbstractEventListener::cast({cpp_value})->getListenerObject(impl->getExecutionContext())) : v8::Local<v8::Value>(v8::Null({isolate}))', 'ScriptValue': '{cpp_value}.v8Value()', 'SerializedScriptValue': '{cpp_value} ? {cpp_value}->deserialize() : v8::Local<v8::Value>(v8::Null({isolate}))', # General
diff --git a/third_party/WebKit/Source/bindings/templates/callback_interface.cpp b/third_party/WebKit/Source/bindings/templates/callback_interface.cpp index 1e57223..22f1506c 100644 --- a/third_party/WebKit/Source/bindings/templates/callback_interface.cpp +++ b/third_party/WebKit/Source/bindings/templates/callback_interface.cpp
@@ -8,7 +8,7 @@ namespace blink { {{v8_class}}::{{v8_class}}(v8::Local<v8::Function> callback, ScriptState* scriptState) - : ActiveDOMCallback(scriptState->executionContext()) + : ActiveDOMCallback(scriptState->getExecutionContext()) , m_scriptState(scriptState) { m_callback.set(scriptState->isolate(), callback); @@ -63,10 +63,10 @@ {% if method.idl_type == 'boolean' %} v8::TryCatch exceptionCatcher(m_scriptState->isolate()); exceptionCatcher.SetVerbose(true); - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), {{this_handle_parameter}}{{method.arguments | length}}, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), {{this_handle_parameter}}{{method.arguments | length}}, argv, m_scriptState->isolate()); return !exceptionCatcher.HasCaught(); {% else %}{# void #} - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), {{this_handle_parameter}}{{method.arguments | length}}, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), {{this_handle_parameter}}{{method.arguments | length}}, argv, m_scriptState->isolate()); {% endif %} }
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackInterface.cpp index 6f9bdad..94735c0 100644 --- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackInterface.cpp +++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackInterface.cpp
@@ -18,7 +18,7 @@ namespace blink { V8TestCallbackInterface::V8TestCallbackInterface(v8::Local<v8::Function> callback, ScriptState* scriptState) - : ActiveDOMCallback(scriptState->executionContext()) + : ActiveDOMCallback(scriptState->getExecutionContext()) , m_scriptState(scriptState) { m_callback.set(scriptState->isolate(), callback); @@ -45,7 +45,7 @@ ScriptState::Scope scope(m_scriptState.get()); v8::Local<v8::Value> *argv = 0; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 0, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 0, argv, m_scriptState->isolate()); } bool V8TestCallbackInterface::booleanMethod() @@ -61,7 +61,7 @@ v8::TryCatch exceptionCatcher(m_scriptState->isolate()); exceptionCatcher.SetVerbose(true); - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 0, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 0, argv, m_scriptState->isolate()); return !exceptionCatcher.HasCaught(); } @@ -82,7 +82,7 @@ } v8::Local<v8::Value> argv[] = { boolArgHandle }; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); } void V8TestCallbackInterface::voidMethodSequenceArg(const Vector<RefPtr<TestInterfaceEmpty>>& sequenceArg) @@ -102,7 +102,7 @@ } v8::Local<v8::Value> argv[] = { sequenceArgHandle }; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); } void V8TestCallbackInterface::voidMethodFloatArg(float floatArg) @@ -122,7 +122,7 @@ } v8::Local<v8::Value> argv[] = { floatArgHandle }; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); } void V8TestCallbackInterface::voidMethodTestInterfaceEmptyArg(TestInterfaceEmpty* testInterfaceEmptyArg) @@ -142,7 +142,7 @@ } v8::Local<v8::Value> argv[] = { testInterfaceEmptyArgHandle }; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); } void V8TestCallbackInterface::voidMethodTestInterfaceEmptyStringArg(TestInterfaceEmpty* testInterfaceEmptyArg, const String& stringArg) @@ -168,7 +168,7 @@ } v8::Local<v8::Value> argv[] = { testInterfaceEmptyArgHandle, stringArgHandle }; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 2, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 2, argv, m_scriptState->isolate()); } void V8TestCallbackInterface::callbackWithThisValueVoidMethodStringArg(ScriptValue thisValue, const String& stringArg) @@ -194,7 +194,7 @@ } v8::Local<v8::Value> argv[] = { stringArgHandle }; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), thisHandle, 1, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), thisHandle, 1, argv, m_scriptState->isolate()); } void V8TestCallbackInterface::voidMethodWillBeGarbageCollectedSequenceArg(const WillBeHeapVector<RefPtrWillBeMember<TestInterfaceWillBeGarbageCollected>>& sequenceArg) @@ -214,7 +214,7 @@ } v8::Local<v8::Value> argv[] = { sequenceArgHandle }; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); } void V8TestCallbackInterface::voidMethodWillBeGarbageCollectedArrayArg(const WillBeHeapVector<RefPtrWillBeMember<TestInterfaceWillBeGarbageCollected>>& arrayArg) @@ -234,7 +234,7 @@ } v8::Local<v8::Value> argv[] = { arrayArgHandle }; - ScriptController::callFunction(m_scriptState->executionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); + ScriptController::callFunction(m_scriptState->getExecutionContext(), m_callback.newLocal(m_scriptState->isolate()), v8::Undefined(m_scriptState->isolate()), 1, argv, m_scriptState->isolate()); } } // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp index 810b29a..ae452ba 100644 --- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp +++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
@@ -1143,7 +1143,7 @@ v8::Local<v8::Object> holder = info.Holder(); TestInterfaceImplementation* impl = V8TestInterface::toImpl(holder); EventListener* cppValue(impl->implementsEventHandlerAttribute()); - v8SetReturnValue(info, cppValue ? v8::Local<v8::Value>(V8AbstractEventListener::cast(cppValue)->getListenerObject(impl->executionContext())) : v8::Local<v8::Value>(v8::Null(info.GetIsolate()))); + v8SetReturnValue(info, cppValue ? v8::Local<v8::Value>(V8AbstractEventListener::cast(cppValue)->getListenerObject(impl->getExecutionContext())) : v8::Local<v8::Value>(v8::Null(info.GetIsolate()))); } static void implementsEventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp index 330fc20c..e8fa04b 100644 --- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp +++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp
@@ -111,7 +111,7 @@ v8::Local<v8::Object> holder = info.Holder(); TestInterfaceNode* impl = V8TestInterfaceNode::toImpl(holder); EventListener* cppValue(impl->eventHandlerAttribute()); - v8SetReturnValue(info, cppValue ? v8::Local<v8::Value>(V8AbstractEventListener::cast(cppValue)->getListenerObject(impl->executionContext())) : v8::Local<v8::Value>(v8::Null(info.GetIsolate()))); + v8SetReturnValue(info, cppValue ? v8::Local<v8::Value>(V8AbstractEventListener::cast(cppValue)->getListenerObject(impl->getExecutionContext())) : v8::Local<v8::Value>(v8::Null(info.GetIsolate()))); } static void eventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp index 8e79a8e..8c0c6b37 100644 --- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp +++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
@@ -1819,7 +1819,7 @@ v8::Local<v8::Object> holder = info.Holder(); TestObject* impl = V8TestObject::toImpl(holder); EventListener* cppValue(impl->eventHandlerAttribute()); - v8SetReturnValue(info, cppValue ? v8::Local<v8::Value>(V8AbstractEventListener::cast(cppValue)->getListenerObject(impl->executionContext())) : v8::Local<v8::Value>(v8::Null(info.GetIsolate()))); + v8SetReturnValue(info, cppValue ? v8::Local<v8::Value>(V8AbstractEventListener::cast(cppValue)->getListenerObject(impl->getExecutionContext())) : v8::Local<v8::Value>(v8::Null(info.GetIsolate()))); } static void eventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
diff --git a/third_party/WebKit/Source/core/Init.cpp b/third_party/WebKit/Source/core/Init.cpp index 0561218..ccfa175 100644 --- a/third_party/WebKit/Source/core/Init.cpp +++ b/third_party/WebKit/Source/core/Init.cpp
@@ -145,6 +145,10 @@ void CoreInitializer::shutdown() { + // Shutdown V8-related background threads before V8 is ramped down. Note + // that this will wait the thread to stop its operations. + ScriptStreamerThread::shutdown(); + // Make sure we stop the HTMLParserThread before Platform::current() is // cleared. ASSERT(Platform::current());
diff --git a/third_party/WebKit/Source/core/animation/Animation.cpp b/third_party/WebKit/Source/core/animation/Animation.cpp index 38bb75c92..bd2be7e 100644 --- a/third_party/WebKit/Source/core/animation/Animation.cpp +++ b/third_party/WebKit/Source/core/animation/Animation.cpp
@@ -613,7 +613,7 @@ ScriptPromise Animation::finished(ScriptState* scriptState) { if (!m_finishedPromise) { - m_finishedPromise = new AnimationPromise(scriptState->executionContext(), this, AnimationPromise::Finished); + m_finishedPromise = new AnimationPromise(scriptState->getExecutionContext(), this, AnimationPromise::Finished); if (playStateInternal() == Finished) m_finishedPromise->resolve(this); } @@ -623,7 +623,7 @@ ScriptPromise Animation::ready(ScriptState* scriptState) { if (!m_readyPromise) { - m_readyPromise = new AnimationPromise(scriptState->executionContext(), this, AnimationPromise::Ready); + m_readyPromise = new AnimationPromise(scriptState->getExecutionContext(), this, AnimationPromise::Ready); if (playStateInternal() != Pending) m_readyPromise->resolve(this); } @@ -635,9 +635,9 @@ return EventTargetNames::AnimationPlayer; } -ExecutionContext* Animation::executionContext() const +ExecutionContext* Animation::getExecutionContext() const { - return ContextLifecycleObserver::executionContext(); + return ContextLifecycleObserver::getExecutionContext(); } bool Animation::hasPendingActivity() const @@ -831,7 +831,7 @@ if (reason == TimingUpdateForAnimationFrame && (idle || hasStartTime())) { if (idle) { const AtomicString& eventType = EventTypeNames::cancel; - if (executionContext() && hasEventListeners(eventType)) { + if (getExecutionContext() && hasEventListeners(eventType)) { double eventCurrentTime = nullValue(); m_pendingCancelledEvent = AnimationPlayerEvent::create(eventType, eventCurrentTime, timeline()->currentTime()); m_pendingCancelledEvent->setTarget(this); @@ -840,7 +840,7 @@ } } else { const AtomicString& eventType = EventTypeNames::finish; - if (executionContext() && hasEventListeners(eventType)) { + if (getExecutionContext() && hasEventListeners(eventType)) { double eventCurrentTime = currentTimeInternal() * 1000; m_pendingFinishedEvent = AnimationPlayerEvent::create(eventType, eventCurrentTime, timeline()->currentTime()); m_pendingFinishedEvent->setTarget(this); @@ -1052,7 +1052,7 @@ bool Animation::addEventListenerInternal(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, const EventListenerOptions& options) { if (eventType == EventTypeNames::finish) - UseCounter::count(executionContext(), UseCounter::AnimationFinishEvent); + UseCounter::count(getExecutionContext(), UseCounter::AnimationFinishEvent); return EventTargetWithInlineData::addEventListenerInternal(eventType, listener, options); }
diff --git a/third_party/WebKit/Source/core/animation/Animation.h b/third_party/WebKit/Source/core/animation/Animation.h index d01236d..fb009a505 100644 --- a/third_party/WebKit/Source/core/animation/Animation.h +++ b/third_party/WebKit/Source/core/animation/Animation.h
@@ -114,7 +114,7 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(cancel); const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; bool hasPendingActivity() const override; void contextDestroyed() override;
diff --git a/third_party/WebKit/Source/core/animation/AnimationStack.cpp b/third_party/WebKit/Source/core/animation/AnimationStack.cpp index 6c4de42..94e54f6 100644 --- a/third_party/WebKit/Source/core/animation/AnimationStack.cpp +++ b/third_party/WebKit/Source/core/animation/AnimationStack.cpp
@@ -45,7 +45,7 @@ void copyToActiveInterpolationsMap(const Vector<RefPtr<Interpolation>>& source, AnimationStack::PropertyHandleFilter propertyHandleFilter, ActiveInterpolationsMap& target) { for (const auto& interpolation : source) { - PropertyHandle property = interpolation->property(); + PropertyHandle property = interpolation->getProperty(); if (propertyHandleFilter && !propertyHandleFilter(property)) continue; ActiveInterpolationsMap::AddResult entry = target.add(property, ActiveInterpolations(1));
diff --git a/third_party/WebKit/Source/core/animation/CSSInterpolationType.h b/third_party/WebKit/Source/core/animation/CSSInterpolationType.h index e7fa4c7..0668807 100644 --- a/third_party/WebKit/Source/core/animation/CSSInterpolationType.h +++ b/third_party/WebKit/Source/core/animation/CSSInterpolationType.h
@@ -17,7 +17,7 @@ : InterpolationType(PropertyHandle(property)) { } - CSSPropertyID cssProperty() const { return property().cssProperty(); } + CSSPropertyID cssProperty() const { return getProperty().cssProperty(); } virtual InterpolationValue maybeConvertSingle(const PropertySpecificKeyframe&, const InterpolationEnvironment&, const InterpolationValue& underlying, ConversionCheckers&) const; virtual InterpolationValue maybeConvertNeutral(const InterpolationValue& underlying, ConversionCheckers&) const { ASSERT_NOT_REACHED(); return nullptr; }
diff --git a/third_party/WebKit/Source/core/animation/InterpolableValueTest.cpp b/third_party/WebKit/Source/core/animation/InterpolableValueTest.cpp index 40ab34a..dd15681d 100644 --- a/third_party/WebKit/Source/core/animation/InterpolableValueTest.cpp +++ b/third_party/WebKit/Source/core/animation/InterpolableValueTest.cpp
@@ -19,7 +19,7 @@ return adoptRef(new SampleInterpolation(std::move(start), std::move(end))); } - PropertyHandle property() const override + PropertyHandle getProperty() const override { return PropertyHandle(CSSPropertyBackgroundColor); }
diff --git a/third_party/WebKit/Source/core/animation/Interpolation.h b/third_party/WebKit/Source/core/animation/Interpolation.h index 2ca275b31..07f7ad7 100644 --- a/third_party/WebKit/Source/core/animation/Interpolation.h +++ b/third_party/WebKit/Source/core/animation/Interpolation.h
@@ -25,7 +25,7 @@ virtual bool isInvalidatableInterpolation() const { return false; } virtual bool isLegacyStyleInterpolation() const { return false; } - virtual PropertyHandle property() const = 0; + virtual PropertyHandle getProperty() const = 0; virtual bool dependsOnUnderlyingValue() const { return false; } protected:
diff --git a/third_party/WebKit/Source/core/animation/InterpolationEffectTest.cpp b/third_party/WebKit/Source/core/animation/InterpolationEffectTest.cpp index 971633e..488b2779 100644 --- a/third_party/WebKit/Source/core/animation/InterpolationEffectTest.cpp +++ b/third_party/WebKit/Source/core/animation/InterpolationEffectTest.cpp
@@ -17,7 +17,7 @@ return adoptRef(new SampleInterpolation(std::move(start), std::move(end))); } - PropertyHandle property() const override + PropertyHandle getProperty() const override { return PropertyHandle(CSSPropertyBackgroundColor); }
diff --git a/third_party/WebKit/Source/core/animation/InterpolationType.h b/third_party/WebKit/Source/core/animation/InterpolationType.h index c549e65..3da7182 100644 --- a/third_party/WebKit/Source/core/animation/InterpolationType.h +++ b/third_party/WebKit/Source/core/animation/InterpolationType.h
@@ -28,7 +28,7 @@ public: virtual ~InterpolationType() { ASSERT_NOT_REACHED(); } - PropertyHandle property() const { return m_property; } + PropertyHandle getProperty() const { return m_property; } // ConversionCheckers are returned from calls to maybeConvertPairwise() and maybeConvertSingle() to enable the caller to check // whether the result is still valid given changes in the InterpolationEnvironment and underlying InterpolationValue.
diff --git a/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp b/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp index 2875318c..0469838 100644 --- a/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp +++ b/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp
@@ -179,7 +179,7 @@ if (interpolations.size() == 1) { if (firstValue) { firstInterpolation.setFlagIfInheritUsed(environment); - firstValue->type().apply(firstValue->interpolableValue(), firstValue->nonInterpolableValue(), environment); + firstValue->type().apply(firstValue->interpolableValue(), firstValue->getNonInterpolableValue(), environment); } return; }
diff --git a/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.h b/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.h index e1a3b443..fd977dd 100644 --- a/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.h +++ b/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.h
@@ -26,7 +26,7 @@ return adoptRef(new InvalidatableInterpolation(property, interpolationTypes, startKeyframe, endKeyframe)); } - PropertyHandle property() const final { return m_property; } + PropertyHandle getProperty() const final { return m_property; } virtual void interpolate(int iteration, double fraction); bool dependsOnUnderlyingValue() const final; virtual void apply(InterpolationEnvironment&) const { ASSERT_NOT_REACHED(); }
diff --git a/third_party/WebKit/Source/core/animation/PrimitiveInterpolation.h b/third_party/WebKit/Source/core/animation/PrimitiveInterpolation.h index 6ded4b80..cc07984 100644 --- a/third_party/WebKit/Source/core/animation/PrimitiveInterpolation.h +++ b/third_party/WebKit/Source/core/animation/PrimitiveInterpolation.h
@@ -63,7 +63,7 @@ { ASSERT(result); ASSERT(&result->type() == &m_type); - ASSERT(result->nonInterpolableValue() == m_nonInterpolableValue.get()); + ASSERT(result->getNonInterpolableValue() == m_nonInterpolableValue.get()); m_start->interpolate(*m_end, fraction, *result->mutableValue().interpolableValue); }
diff --git a/third_party/WebKit/Source/core/animation/SVGInterpolationType.h b/third_party/WebKit/Source/core/animation/SVGInterpolationType.h index 59971a0a..4dea2dc 100644 --- a/third_party/WebKit/Source/core/animation/SVGInterpolationType.h +++ b/third_party/WebKit/Source/core/animation/SVGInterpolationType.h
@@ -17,7 +17,7 @@ : InterpolationType(PropertyHandle(attribute)) { } - const QualifiedName& attribute() const { return property().svgAttribute(); } + const QualifiedName& attribute() const { return getProperty().svgAttribute(); } virtual InterpolationValue maybeConvertNeutral(const InterpolationValue& underlying, ConversionCheckers&) const; virtual InterpolationValue maybeConvertSVGValue(const SVGPropertyBase&) const = 0;
diff --git a/third_party/WebKit/Source/core/animation/SampledEffect.cpp b/third_party/WebKit/Source/core/animation/SampledEffect.cpp index 9124135..f2477ee0 100644 --- a/third_party/WebKit/Source/core/animation/SampledEffect.cpp +++ b/third_party/WebKit/Source/core/animation/SampledEffect.cpp
@@ -28,7 +28,7 @@ { size_t newSize = 0; for (auto& interpolation : m_interpolations) { - if (!replacedProperties.contains(interpolation->property())) + if (!replacedProperties.contains(interpolation->getProperty())) m_interpolations[newSize++].swap(interpolation); } m_interpolations.shrink(newSize); @@ -38,7 +38,7 @@ { for (const auto& interpolation : m_interpolations) { if (!interpolation->dependsOnUnderlyingValue()) - replacedProperties.add(interpolation->property()); + replacedProperties.add(interpolation->getProperty()); } }
diff --git a/third_party/WebKit/Source/core/animation/StyleInterpolation.h b/third_party/WebKit/Source/core/animation/StyleInterpolation.h index e3b250f..74b67746 100644 --- a/third_party/WebKit/Source/core/animation/StyleInterpolation.h +++ b/third_party/WebKit/Source/core/animation/StyleInterpolation.h
@@ -39,7 +39,7 @@ CSSPropertyID id() const { return m_id; } - PropertyHandle property() const final + PropertyHandle getProperty() const final { return PropertyHandle(id()); }
diff --git a/third_party/WebKit/Source/core/animation/TypedInterpolationValue.h b/third_party/WebKit/Source/core/animation/TypedInterpolationValue.h index 88a5882..cf4391d2 100644 --- a/third_party/WebKit/Source/core/animation/TypedInterpolationValue.h +++ b/third_party/WebKit/Source/core/animation/TypedInterpolationValue.h
@@ -27,7 +27,7 @@ const InterpolationType& type() const { return m_type; } const InterpolableValue& interpolableValue() const { return *m_value.interpolableValue; } - const NonInterpolableValue* nonInterpolableValue() const { return m_value.nonInterpolableValue.get(); } + const NonInterpolableValue* getNonInterpolableValue() const { return m_value.nonInterpolableValue.get(); } const InterpolationValue& value() const { return m_value; } InterpolationValue& mutableValue() { return m_value; }
diff --git a/third_party/WebKit/Source/core/animation/animatable/AnimatableClipPathOperation.cpp b/third_party/WebKit/Source/core/animation/animatable/AnimatableClipPathOperation.cpp index c66f1443..386f193a 100644 --- a/third_party/WebKit/Source/core/animation/animatable/AnimatableClipPathOperation.cpp +++ b/third_party/WebKit/Source/core/animation/animatable/AnimatableClipPathOperation.cpp
@@ -39,8 +39,8 @@ if (m_operation->type() != ClipPathOperation::SHAPE || toOperation->m_operation->type() != ClipPathOperation::SHAPE) return true; - const BasicShape* fromShape = toShapeClipPathOperation(clipPathOperation())->basicShape(); - const BasicShape* toShape = toShapeClipPathOperation(toOperation->clipPathOperation())->basicShape(); + const BasicShape* fromShape = toShapeClipPathOperation(getClipPathOperation())->basicShape(); + const BasicShape* toShape = toShapeClipPathOperation(toOperation->getClipPathOperation())->basicShape(); return !fromShape->canBlend(toShape); } @@ -51,8 +51,8 @@ return defaultInterpolateTo(this, value, fraction); const AnimatableClipPathOperation* toOperation = toAnimatableClipPathOperation(value); - const BasicShape* fromShape = toShapeClipPathOperation(clipPathOperation())->basicShape(); - const BasicShape* toShape = toShapeClipPathOperation(toOperation->clipPathOperation())->basicShape(); + const BasicShape* fromShape = toShapeClipPathOperation(getClipPathOperation())->basicShape(); + const BasicShape* toShape = toShapeClipPathOperation(toOperation->getClipPathOperation())->basicShape(); return AnimatableClipPathOperation::create(ShapeClipPathOperation::create(toShape->blend(fromShape, fraction)).get()); }
diff --git a/third_party/WebKit/Source/core/animation/animatable/AnimatableClipPathOperation.h b/third_party/WebKit/Source/core/animation/animatable/AnimatableClipPathOperation.h index 915bbca..ba94c88 100644 --- a/third_party/WebKit/Source/core/animation/animatable/AnimatableClipPathOperation.h +++ b/third_party/WebKit/Source/core/animation/animatable/AnimatableClipPathOperation.h
@@ -44,7 +44,7 @@ { return adoptRef(new AnimatableClipPathOperation(operation)); } - ClipPathOperation* clipPathOperation() const { return m_operation.get(); } + ClipPathOperation* getClipPathOperation() const { return m_operation.get(); } protected: PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
diff --git a/third_party/WebKit/Source/core/animation/animatable/AnimatableShadow.h b/third_party/WebKit/Source/core/animation/animatable/AnimatableShadow.h index 15e05a4..aed8c727 100644 --- a/third_party/WebKit/Source/core/animation/animatable/AnimatableShadow.h +++ b/third_party/WebKit/Source/core/animation/animatable/AnimatableShadow.h
@@ -43,7 +43,7 @@ { return adoptRef(new AnimatableShadow(shadowList, currentColor)); } - ShadowList* shadowList() const { return m_shadowList.get(); } + ShadowList* getShadowList() const { return m_shadowList.get(); } protected: PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
diff --git a/third_party/WebKit/Source/core/animation/animatable/AnimatableShapeValue.h b/third_party/WebKit/Source/core/animation/animatable/AnimatableShapeValue.h index 8ee0832..a0af4dd 100644 --- a/third_party/WebKit/Source/core/animation/animatable/AnimatableShapeValue.h +++ b/third_party/WebKit/Source/core/animation/animatable/AnimatableShapeValue.h
@@ -44,7 +44,7 @@ { return adoptRef(new AnimatableShapeValue(shape)); } - ShapeValue* shapeValue() const { return m_shape.get(); } + ShapeValue* getShapeValue() const { return m_shape.get(); } protected: PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
diff --git a/third_party/WebKit/Source/core/clipboard/DataObject.cpp b/third_party/WebKit/Source/core/clipboard/DataObject.cpp index 88f2e9a..c651363 100644 --- a/third_party/WebKit/Source/core/clipboard/DataObject.cpp +++ b/third_party/WebKit/Source/core/clipboard/DataObject.cpp
@@ -37,23 +37,25 @@ #include "public/platform/Platform.h" #include "public/platform/WebClipboard.h" #include "public/platform/WebDragData.h" +#include "wtf/HashSet.h" namespace blink { DataObject* DataObject::createFromPasteboard(PasteMode pasteMode) { DataObject* dataObject = create(); +#if ENABLE(ASSERT) + HashSet<String> typesSeen; +#endif WebClipboard::Buffer buffer = Pasteboard::generalPasteboard()->buffer(); uint64_t sequenceNumber = Platform::current()->clipboard()->sequenceNumber(buffer); bool ignored; WebVector<WebString> webTypes = Platform::current()->clipboard()->readAvailableTypes(buffer, &ignored); - ListHashSet<String> types; - for (size_t i = 0; i < webTypes.size(); ++i) - types.add(webTypes[i]); - for (const String& type : types) { + for (const WebString& type : webTypes) { if (pasteMode == PlainTextOnly && type != mimeTypeTextPlain) continue; dataObject->m_itemList.append(DataObjectItem::createFromPasteboard(type, sequenceNumber)); + ASSERT(typesSeen.add(type).isNewEntry); } return dataObject; } @@ -120,22 +122,29 @@ } } -ListHashSet<String> DataObject::types() const +Vector<String> DataObject::types() const { - ListHashSet<String> results; + Vector<String> results; +#if ENABLE(ASSERT) + HashSet<String> typesSeen; +#endif bool containsFiles = false; - for (size_t i = 0; i < m_itemList.size(); ++i) { - switch (m_itemList[i]->kind()) { + for (const auto& item : m_itemList) { + switch (item->kind()) { case DataObjectItem::StringKind: - results.add(m_itemList[i]->type()); + // Per the spec, type must be unique among all items of kind 'string'. + results.append(item->type()); + ASSERT(typesSeen.add(item->type()).isNewEntry); break; case DataObjectItem::FileKind: containsFiles = true; break; } } - if (containsFiles) - results.add(mimeTypeFiles); + if (containsFiles) { + results.append(mimeTypeFiles); + ASSERT(typesSeen.add(mimeTypeFiles).isNewEntry); + } return results; }
diff --git a/third_party/WebKit/Source/core/clipboard/DataObject.h b/third_party/WebKit/Source/core/clipboard/DataObject.h index 05a4f58..19133ae 100644 --- a/third_party/WebKit/Source/core/clipboard/DataObject.h +++ b/third_party/WebKit/Source/core/clipboard/DataObject.h
@@ -36,7 +36,6 @@ #include "platform/PasteMode.h" #include "platform/Supplementable.h" #include "platform/heap/Handle.h" -#include "wtf/ListHashSet.h" #include "wtf/PassRefPtr.h" #include "wtf/Vector.h" #include "wtf/text/StringHash.h" @@ -73,7 +72,7 @@ // WebCore helpers. void clearData(const String& type); - ListHashSet<String> types() const; + Vector<String> types() const; String getData(const String& type) const; void setData(const String& type, const String& data);
diff --git a/third_party/WebKit/Source/core/clipboard/DataTransfer.cpp b/third_party/WebKit/Source/core/clipboard/DataTransfer.cpp index e070597e..995b892 100644 --- a/third_party/WebKit/Source/core/clipboard/DataTransfer.cpp +++ b/third_party/WebKit/Source/core/clipboard/DataTransfer.cpp
@@ -189,9 +189,7 @@ if (!canReadTypes()) return types; - ListHashSet<String> typesSet = m_dataObject->types(); - types.appendRange(typesSet.begin(), typesSet.end()); - return types; + return m_dataObject->types(); } FileList* DataTransfer::files() const
diff --git a/third_party/WebKit/Source/core/clipboard/DataTransferItem.h b/third_party/WebKit/Source/core/clipboard/DataTransferItem.h index 2e1da11a..624ad63 100644 --- a/third_party/WebKit/Source/core/clipboard/DataTransferItem.h +++ b/third_party/WebKit/Source/core/clipboard/DataTransferItem.h
@@ -58,8 +58,8 @@ void getAsString(ExecutionContext*, StringCallback*) const; Blob* getAsFile() const; - DataTransfer* dataTransfer() { return m_dataTransfer.get(); } - DataObjectItem* dataObjectItem() { return m_item.get(); } + DataTransfer* getDataTransfer() { return m_dataTransfer.get(); } + DataObjectItem* getDataObjectItem() { return m_item.get(); } DECLARE_TRACE();
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi index c0a8642e..241cca4 100644 --- a/third_party/WebKit/Source/core/core.gypi +++ b/third_party/WebKit/Source/core/core.gypi
@@ -512,10 +512,12 @@ 'layout/api/LayoutMenuListItem.h', 'layout/api/LayoutPartItem.h', 'layout/api/LayoutProgressItem.h', + 'layout/api/LayoutSliderItem.h', 'layout/api/LayoutTextControlItem.h', 'layout/api/LayoutTextFragmentItem.h', 'layout/api/LayoutTextItem.h', 'layout/api/LineLayoutAPIShim.h', + 'layout/api/LineLayoutBR.h', 'layout/api/LineLayoutBlockFlow.h', 'layout/api/LineLayoutBox.h', 'layout/api/LineLayoutBoxModel.h',
diff --git a/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp b/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp index 18b38a5..e037017 100644 --- a/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp +++ b/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp
@@ -90,7 +90,7 @@ if (!m_fetched) { FetchRequest request(ResourceRequest(m_absoluteResource), FetchInitiatorTypeNames::css); request.setContentSecurityCheck(m_shouldCheckContentSecurityPolicy); - SecurityOrigin* securityOrigin = document->securityOrigin(); + SecurityOrigin* securityOrigin = document->getSecurityOrigin(); setCrossOriginAccessControl(request, securityOrigin); request.mutableResourceRequest().setHTTPReferrer(SecurityPolicy::generateReferrer(m_referrer.referrerPolicy, request.url(), m_referrer.referrer)); RefPtrWillBeRawPtr<FontResource> resource = FontResource::fetch(request, document->fetcher());
diff --git a/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp b/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp index aaf2bb08..29560b0 100644 --- a/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp +++ b/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp
@@ -120,7 +120,7 @@ request.mutableResourceRequest().setHTTPReferrer(image.referrer); if (crossOrigin != CrossOriginAttributeNotSet) - request.setCrossOriginAccessControl(document->securityOrigin(), crossOrigin); + request.setCrossOriginAccessControl(document->getSecurityOrigin(), crossOrigin); if (RefPtrWillBeRawPtr<ImageResource> cachedImage = ImageResource::fetch(request, document->fetcher())) m_cachedImage = StyleFetchedImageSet::create(cachedImage.get(), image.scaleFactor, this, request.url());
diff --git a/third_party/WebKit/Source/core/css/CSSImageValue.cpp b/third_party/WebKit/Source/core/css/CSSImageValue.cpp index b4df55b..81bf0fe 100644 --- a/third_party/WebKit/Source/core/css/CSSImageValue.cpp +++ b/third_party/WebKit/Source/core/css/CSSImageValue.cpp
@@ -66,7 +66,7 @@ request.mutableResourceRequest().setHTTPReferrer(SecurityPolicy::generateReferrer(m_referrer.referrerPolicy, request.url(), m_referrer.referrer)); if (crossOrigin != CrossOriginAttributeNotSet) - request.setCrossOriginAccessControl(document->securityOrigin(), crossOrigin); + request.setCrossOriginAccessControl(document->getSecurityOrigin(), crossOrigin); if (RefPtrWillBeRawPtr<ImageResource> cachedImage = ImageResource::fetch(request, document->fetcher())) m_cachedImage = StyleFetchedImage::create(cachedImage.get(), document, request.url());
diff --git a/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp b/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp index d3dacc2..0317960 100644 --- a/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp +++ b/third_party/WebKit/Source/core/css/CSSStyleSheet.cpp
@@ -268,9 +268,9 @@ Document* document = ownerDocument(); if (!document) return true; - if (document->securityOrigin()->canRequestNoSuborigin(baseURL)) + if (document->getSecurityOrigin()->canRequestNoSuborigin(baseURL)) return true; - if (m_allowRuleAccessFromOrigin && document->securityOrigin()->canAccessCheckSuborigins(m_allowRuleAccessFromOrigin.get())) + if (m_allowRuleAccessFromOrigin && document->getSecurityOrigin()->canAccessCheckSuborigins(m_allowRuleAccessFromOrigin.get())) return true; return false; }
diff --git a/third_party/WebKit/Source/core/css/FontFace.cpp b/third_party/WebKit/Source/core/css/FontFace.cpp index 3c49e50..32f009aa 100644 --- a/third_party/WebKit/Source/core/css/FontFace.cpp +++ b/third_party/WebKit/Source/core/css/FontFace.cpp
@@ -361,7 +361,7 @@ ScriptPromise FontFace::fontStatusPromise(ScriptState* scriptState) { if (!m_loadedProperty) { - m_loadedProperty = new LoadedProperty(scriptState->executionContext(), this, LoadedProperty::Loaded); + m_loadedProperty = new LoadedProperty(scriptState->getExecutionContext(), this, LoadedProperty::Loaded); if (m_status == Loaded) m_loadedProperty->resolve(this); else if (m_status == Error) @@ -372,7 +372,7 @@ ScriptPromise FontFace::load(ScriptState* scriptState) { - loadInternal(scriptState->executionContext()); + loadInternal(scriptState->getExecutionContext()); return fontStatusPromise(scriptState); } @@ -646,7 +646,7 @@ bool FontFace::hasPendingActivity() const { - return m_status == Loading && executionContext() && !executionContext()->activeDOMObjectsAreStopped(); + return m_status == Loading && getExecutionContext() && !getExecutionContext()->activeDOMObjectsAreStopped(); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/FontFaceSet.cpp b/third_party/WebKit/Source/core/css/FontFaceSet.cpp index 06f1c46..2673d2860 100644 --- a/third_party/WebKit/Source/core/css/FontFaceSet.cpp +++ b/third_party/WebKit/Source/core/css/FontFaceSet.cpp
@@ -117,7 +117,7 @@ : ActiveDOMObject(&document) , m_shouldFireLoadingEvent(false) , m_isLoading(false) - , m_ready(new ReadyProperty(executionContext(), this, ReadyProperty::Ready)) + , m_ready(new ReadyProperty(getExecutionContext(), this, ReadyProperty::Ready)) , m_asyncRunner(AsyncMethodRunner<FontFaceSet>::create(this, &FontFaceSet::handlePendingEventsAndPromises)) { suspendIfNeeded(); @@ -132,12 +132,12 @@ Document* FontFaceSet::document() const { - return toDocument(executionContext()); + return toDocument(getExecutionContext()); } bool FontFaceSet::inActiveDocumentContext() const { - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); return context && toDocument(context)->isActive(); } @@ -152,9 +152,9 @@ return EventTargetNames::FontFaceSet; } -ExecutionContext* FontFaceSet::executionContext() const +ExecutionContext* FontFaceSet::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } AtomicString FontFaceSet::status() const @@ -393,7 +393,7 @@ RefPtrWillBeRawPtr<LoadFontPromiseResolver> resolver = LoadFontPromiseResolver::create(faces, scriptState); ScriptPromise promise = resolver->promise(); - resolver->loadFonts(executionContext()); // After this, resolver->promise() may return null. + resolver->loadFonts(getExecutionContext()); // After this, resolver->promise() may return null. return promise; }
diff --git a/third_party/WebKit/Source/core/css/FontFaceSet.h b/third_party/WebKit/Source/core/css/FontFaceSet.h index a4cba76..223864d 100644 --- a/third_party/WebKit/Source/core/css/FontFaceSet.h +++ b/third_party/WebKit/Source/core/css/FontFaceSet.h
@@ -89,7 +89,7 @@ size_t size() const; AtomicString status() const; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; const AtomicString& interfaceName() const override; Document* document() const;
diff --git a/third_party/WebKit/Source/core/css/MediaQueryList.cpp b/third_party/WebKit/Source/core/css/MediaQueryList.cpp index 74e0b779..c13cf2c 100644 --- a/third_party/WebKit/Source/core/css/MediaQueryList.cpp +++ b/third_party/WebKit/Source/core/css/MediaQueryList.cpp
@@ -144,9 +144,9 @@ return EventTargetNames::MediaQueryList; } -ExecutionContext* MediaQueryList::executionContext() const +ExecutionContext* MediaQueryList::getExecutionContext() const { - return ContextLifecycleObserver::executionContext(); + return ContextLifecycleObserver::getExecutionContext(); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/MediaQueryList.h b/third_party/WebKit/Source/core/css/MediaQueryList.h index 37d2352..b5fb6f8 100644 --- a/third_party/WebKit/Source/core/css/MediaQueryList.h +++ b/third_party/WebKit/Source/core/css/MediaQueryList.h
@@ -72,7 +72,7 @@ void contextDestroyed() override; const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; private: MediaQueryList(ExecutionContext*, PassRefPtrWillBeRawPtr<MediaQueryMatcher>, PassRefPtrWillBeRawPtr<MediaQuerySet>);
diff --git a/third_party/WebKit/Source/core/css/StyleRuleImport.cpp b/third_party/WebKit/Source/core/css/StyleRuleImport.cpp index 35a3723..46101355 100644 --- a/third_party/WebKit/Source/core/css/StyleRuleImport.cpp +++ b/third_party/WebKit/Source/core/css/StyleRuleImport.cpp
@@ -93,7 +93,7 @@ m_styleSheet = StyleSheetContents::create(this, href, context); - m_styleSheet->parseAuthorStyleSheet(cachedStyleSheet, document ? document->securityOrigin() : 0); + m_styleSheet->parseAuthorStyleSheet(cachedStyleSheet, document ? document->getSecurityOrigin() : 0); m_loading = false;
diff --git a/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp b/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp index 934ee14..9a7c4ca0 100644 --- a/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp +++ b/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp
@@ -369,7 +369,7 @@ style->setBottom(animatableValueToLength(value, state)); return; case CSSPropertyBoxShadow: - style->setBoxShadow(toAnimatableShadow(value)->shadowList()); + style->setBoxShadow(toAnimatableShadow(value)->getShadowList()); return; case CSSPropertyClip: style->setClip(animatableValueToLengthBox(value, state)); @@ -531,7 +531,7 @@ style->setTextIndent(animatableValueToLength(value, state)); return; case CSSPropertyTextShadow: - style->setTextShadow(toAnimatableShadow(value)->shadowList()); + style->setTextShadow(toAnimatableShadow(value)->getShadowList()); return; case CSSPropertyTop: style->setTop(animatableValueToLength(value, state)); @@ -543,7 +543,7 @@ style->setVerticalBorderSpacing(animatableValueClampTo<unsigned short>(value)); return; case CSSPropertyWebkitClipPath: - style->setClipPath(toAnimatableClipPathOperation(value)->clipPathOperation()); + style->setClipPath(toAnimatableClipPathOperation(value)->getClipPathOperation()); return; case CSSPropertyColumnCount: style->setColumnCount(clampTo<unsigned short>(round(toAnimatableDouble(value)->toDouble()), 1)); @@ -599,7 +599,7 @@ style->setPerspectiveOrigin(animatableValueToLengthPoint(value, state)); return; case CSSPropertyShapeOutside: - style->setShapeOutside(toAnimatableShapeValue(value)->shapeValue()); + style->setShapeOutside(toAnimatableShapeValue(value)->getShapeValue()); return; case CSSPropertyShapeMargin: style->setShapeMargin(animatableValueToLength(value, state, ValueRangeNonNegative));
diff --git a/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp index 67ae3a2..33cf98c2 100644 --- a/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp +++ b/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp
@@ -83,7 +83,7 @@ unsigned index = m_authorStyleSheets.size(); m_authorStyleSheets.append(&cssSheet); StyleSheetContents* sheet = cssSheet.contents(); - AddRuleFlags addRuleFlags = treeScope().document().securityOrigin()->canRequest(sheet->baseURL()) ? RuleHasDocumentSecurityOrigin : RuleHasNoSpecialState; + AddRuleFlags addRuleFlags = treeScope().document().getSecurityOrigin()->canRequest(sheet->baseURL()) ? RuleHasDocumentSecurityOrigin : RuleHasNoSpecialState; const RuleSet& ruleSet = sheet->ensureRuleSet(medium, addRuleFlags); addKeyframeRules(ruleSet);
diff --git a/third_party/WebKit/Source/core/dom/ActiveDOMObject.cpp b/third_party/WebKit/Source/core/dom/ActiveDOMObject.cpp index c37ee771..21e8468 100644 --- a/third_party/WebKit/Source/core/dom/ActiveDOMObject.cpp +++ b/third_party/WebKit/Source/core/dom/ActiveDOMObject.cpp
@@ -52,9 +52,9 @@ ASSERT(m_suspendIfNeededCalled); - // Oilpan: not valid to access executionContext() in the destructor. + // Oilpan: not valid to access getExecutionContext() in the destructor. #if !ENABLE(OILPAN) - ASSERT(!executionContext() || executionContext()->isContextThread()); + ASSERT(!getExecutionContext() || getExecutionContext()->isContextThread()); #endif } @@ -64,7 +64,7 @@ ASSERT(!m_suspendIfNeededCalled); m_suspendIfNeededCalled = true; #endif - if (ExecutionContext* context = executionContext()) + if (ExecutionContext* context = getExecutionContext()) context->suspendActiveDOMObjectIfNeeded(this); }
diff --git a/third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp b/third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp index bf8cbb4d..f4f0b9b 100644 --- a/third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp +++ b/third_party/WebKit/Source/core/dom/ContextLifecycleNotifier.cpp
@@ -48,7 +48,7 @@ if (observer->observerType() != ContextLifecycleObserver::ActiveDOMObjectType) continue; ActiveDOMObject* activeDOMObject = static_cast<ActiveDOMObject*>(observer); - ASSERT(activeDOMObject->executionContext() == context()); + ASSERT(activeDOMObject->getExecutionContext() == context()); ASSERT(activeDOMObject->suspendIfNeededCalled()); activeDOMObject->resume(); } @@ -67,7 +67,7 @@ if (observer->observerType() != ContextLifecycleObserver::ActiveDOMObjectType) continue; ActiveDOMObject* activeDOMObject = static_cast<ActiveDOMObject*>(observer); - ASSERT(activeDOMObject->executionContext() == context()); + ASSERT(activeDOMObject->getExecutionContext() == context()); ASSERT(activeDOMObject->suspendIfNeededCalled()); activeDOMObject->suspend(); } @@ -86,7 +86,7 @@ if (observer->observerType() != ContextLifecycleObserver::ActiveDOMObjectType) continue; ActiveDOMObject* activeDOMObject = static_cast<ActiveDOMObject*>(observer); - ASSERT(activeDOMObject->executionContext() == context()); + ASSERT(activeDOMObject->getExecutionContext() == context()); ASSERT(activeDOMObject->suspendIfNeededCalled()); activeDOMObject->stop(); }
diff --git a/third_party/WebKit/Source/core/dom/ContextLifecycleObserver.h b/third_party/WebKit/Source/core/dom/ContextLifecycleObserver.h index 939e9be4..37091e0 100644 --- a/third_party/WebKit/Source/core/dom/ContextLifecycleObserver.h +++ b/third_party/WebKit/Source/core/dom/ContextLifecycleObserver.h
@@ -37,7 +37,7 @@ class CORE_EXPORT ContextLifecycleObserver : public LifecycleObserver<ExecutionContext, ContextLifecycleObserver, ContextLifecycleNotifier> { public: - ExecutionContext* executionContext() const { return lifecycleContext(); } + ExecutionContext* getExecutionContext() const { return lifecycleContext(); } enum Type { GenericType,
diff --git a/third_party/WebKit/Source/core/dom/DOMImplementation.cpp b/third_party/WebKit/Source/core/dom/DOMImplementation.cpp index d7e98ed..16ed9f1 100644 --- a/third_party/WebKit/Source/core/dom/DOMImplementation.cpp +++ b/third_party/WebKit/Source/core/dom/DOMImplementation.cpp
@@ -88,7 +88,7 @@ doc = XMLDocument::create(init); } - doc->setSecurityOrigin(document().securityOrigin()->isolatedCopy()); + doc->setSecurityOrigin(document().getSecurityOrigin()->isolatedCopy()); doc->setContextFeatures(document().contextFeatures()); RefPtrWillBeRawPtr<Node> documentElement = nullptr; @@ -210,7 +210,7 @@ headElement->appendChild(titleElement); titleElement->appendChild(d->createTextNode(title), ASSERT_NO_EXCEPTION); } - d->setSecurityOrigin(document().securityOrigin()->isolatedCopy()); + d->setSecurityOrigin(document().getSecurityOrigin()->isolatedCopy()); d->setContextFeatures(document().contextFeatures()); return d.release(); }
diff --git a/third_party/WebKit/Source/core/dom/DOMURL.cpp b/third_party/WebKit/Source/core/dom/DOMURL.cpp index 95d938d..19be7c22 100644 --- a/third_party/WebKit/Source/core/dom/DOMURL.cpp +++ b/third_party/WebKit/Source/core/dom/DOMURL.cpp
@@ -75,11 +75,11 @@ String DOMURL::createPublicURL(ExecutionContext* executionContext, URLRegistrable* registrable, const String& uuid) { - KURL publicURL = BlobURL::createPublicURL(executionContext->securityOrigin()); + KURL publicURL = BlobURL::createPublicURL(executionContext->getSecurityOrigin()); if (publicURL.isEmpty()) return String(); - executionContext->publicURLManager().registerURL(executionContext->securityOrigin(), publicURL, registrable, uuid); + executionContext->publicURLManager().registerURL(executionContext->getSecurityOrigin(), publicURL, registrable, uuid); return publicURL.getString(); }
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp index a1cf59d..3e2e08c5 100644 --- a/third_party/WebKit/Source/core/dom/Document.cpp +++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -219,6 +219,7 @@ #include "platform/weborigin/SchemeRegistry.h" #include "platform/weborigin/SecurityOrigin.h" #include "public/platform/Platform.h" +#include "public/platform/WebAddressSpace.h" #include "public/platform/WebFrameScheduler.h" #include "public/platform/WebScheduler.h" #include "wtf/CurrentTime.h" @@ -2433,11 +2434,11 @@ } if (enteredDocument) { - if (!securityOrigin()->canAccess(enteredDocument->securityOrigin())) { + if (!getSecurityOrigin()->canAccess(enteredDocument->getSecurityOrigin())) { exceptionState.throwSecurityError("Can only call open() on same-origin documents."); return; } - setSecurityOrigin(enteredDocument->securityOrigin()); + setSecurityOrigin(enteredDocument->getSecurityOrigin()); setURL(enteredDocument->url()); m_cookieURL = enteredDocument->cookieURL(); } @@ -2863,7 +2864,7 @@ return; } - if (enteredDocument && !securityOrigin()->canAccess(enteredDocument->securityOrigin())) { + if (enteredDocument && !getSecurityOrigin()->canAccess(enteredDocument->getSecurityOrigin())) { exceptionState.throwSecurityError("Can only call write() on same-origin documents."); return; } @@ -3177,7 +3178,7 @@ String Document::outgoingReferrer() const { - if (securityOrigin()->isUnique()) { + if (getSecurityOrigin()->isUnique()) { // Return |no-referrer|. return String(); } @@ -3352,7 +3353,7 @@ setCompatibilityMode(other.getCompatibilityMode()); setEncodingData(other.m_encodingData); setContextFeatures(other.contextFeatures()); - setSecurityOrigin(other.securityOrigin()->isolatedCopy()); + setSecurityOrigin(other.getSecurityOrigin()->isolatedCopy()); setMimeType(other.contentType()); } @@ -3393,9 +3394,9 @@ if (SchemeRegistry::schemeShouldBypassSecureContextCheck(origin->protocol())) return true; } else { - if (!isOriginPotentiallyTrustworthy(securityOrigin(), errorMessage)) + if (!isOriginPotentiallyTrustworthy(getSecurityOrigin(), errorMessage)) return false; - if (SchemeRegistry::schemeShouldBypassSecureContextCheck(securityOrigin()->protocol())) + if (SchemeRegistry::schemeShouldBypassSecureContextCheck(getSecurityOrigin()->protocol())) return true; } @@ -3410,7 +3411,7 @@ if (!isOriginPotentiallyTrustworthy(origin.get(), errorMessage)) return false; } else { - if (!isOriginPotentiallyTrustworthy(context->securityOrigin(), errorMessage)) + if (!isOriginPotentiallyTrustworthy(context->getSecurityOrigin(), errorMessage)) return false; } } @@ -3951,11 +3952,11 @@ return domWindow->getAttributeEventListener(eventType); } -EventQueue* Document::eventQueue() const +EventQueue* Document::getEventQueue() const { if (!m_domWindow) return 0; - return m_domWindow->eventQueue(); + return m_domWindow->getEventQueue(); } void Document::enqueueAnimationFrameEvent(PassRefPtrWillBeRawPtr<Event> event) @@ -4096,7 +4097,7 @@ // InvalidStateError exception on getting if the Document has no // browsing context. - if (!securityOrigin()->canAccessCookies()) { + if (!getSecurityOrigin()->canAccessCookies()) { if (isSandboxed(SandboxOrigin)) exceptionState.throwSecurityError("The document is sandboxed and lacks the 'allow-same-origin' flag."); else if (url().protocolIs("data")) @@ -4122,7 +4123,7 @@ // InvalidStateError exception on setting if the Document has no // browsing context. - if (!securityOrigin()->canAccessCookies()) { + if (!getSecurityOrigin()->canAccessCookies()) { if (isSandboxed(SandboxOrigin)) exceptionState.throwSecurityError("The document is sandboxed and lacks the 'allow-same-origin' flag."); else if (url().protocolIs("data")) @@ -4148,7 +4149,7 @@ String Document::domain() const { - return securityOrigin()->domain(); + return getSecurityOrigin()->domain(); } void Document::setDomain(const String& newDomain, ExceptionState& exceptionState) @@ -4160,8 +4161,8 @@ return; } - if (SchemeRegistry::isDomainRelaxationForbiddenForURLScheme(securityOrigin()->protocol())) { - exceptionState.throwSecurityError("Assignment is forbidden for the '" + securityOrigin()->protocol() + "' scheme."); + if (SchemeRegistry::isDomainRelaxationForbiddenForURLScheme(getSecurityOrigin()->protocol())) { + exceptionState.throwSecurityError("Assignment is forbidden for the '" + getSecurityOrigin()->protocol() + "' scheme."); return; } @@ -4170,8 +4171,8 @@ return; } - OriginAccessEntry accessEntry(securityOrigin()->protocol(), newDomain, OriginAccessEntry::AllowSubdomains); - OriginAccessEntry::MatchResult result = accessEntry.matchesOrigin(*securityOrigin()); + OriginAccessEntry accessEntry(getSecurityOrigin()->protocol(), newDomain, OriginAccessEntry::AllowSubdomains); + OriginAccessEntry::MatchResult result = accessEntry.matchesOrigin(*getSecurityOrigin()); if (result == OriginAccessEntry::DoesNotMatchOrigin) { exceptionState.throwSecurityError("'" + newDomain + "' is not a suffix of '" + domain() + "'."); return; @@ -4182,9 +4183,9 @@ return; } - securityOrigin()->setDomainFromDOM(newDomain); + getSecurityOrigin()->setDomainFromDOM(newDomain); if (m_frame) - m_frame->script().updateSecurityOrigin(securityOrigin()); + m_frame->script().updateSecurityOrigin(getSecurityOrigin()); } // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-lastmodified @@ -4227,7 +4228,7 @@ // We use 'matchesDomain' here, as it turns out that some folks embed HTTPS login forms // into HTTP pages; we should allow this kind of upgrade. - if (accessEntry.matchesDomain(*currentDocument->securityOrigin()) == OriginAccessEntry::DoesNotMatchOrigin) + if (accessEntry.matchesDomain(*currentDocument->getSecurityOrigin()) == OriginAccessEntry::DoesNotMatchOrigin) return SecurityOrigin::urlWithUniqueSecurityOrigin(); currentDocument = currentDocument->parentDocument(); @@ -4915,7 +4916,7 @@ void Document::initSecurityContext(const DocumentInit& initializer) { - ASSERT(!securityOrigin()); + ASSERT(!getSecurityOrigin()); if (!initializer.hasSecurityContext()) { // No source for a security context. @@ -4945,13 +4946,13 @@ // but we're also sandboxed, the only thing we inherit is the ability // to load local resources. This lets about:blank iframes in file:// // URL documents load images and other resources from the file system. - if (initializer.owner() && initializer.owner()->securityOrigin()->canLoadLocalResources()) - securityOrigin()->grantLoadLocalResources(); + if (initializer.owner() && initializer.owner()->getSecurityOrigin()->canLoadLocalResources()) + getSecurityOrigin()->grantLoadLocalResources(); } else if (initializer.owner()) { m_cookieURL = initializer.owner()->cookieURL(); // We alias the SecurityOrigins to match Firefox, see Bug 15313 // https://bugs.webkit.org/show_bug.cgi?id=15313 - setSecurityOrigin(initializer.owner()->securityOrigin()); + setSecurityOrigin(initializer.owner()->getSecurityOrigin()); } else { m_cookieURL = m_url; setSecurityOrigin(SecurityOrigin::create(m_url)); @@ -4961,9 +4962,9 @@ // the former via the 'treat-as-public-address' directive (see // https://mikewest.github.io/cors-rfc1918/#csp). if (initializer.isHostedInReservedIPRange()) { - setAddressSpace(securityOrigin()->isLocalhost() ? WebURLRequest::AddressSpaceLocal : WebURLRequest::AddressSpacePrivate); + setAddressSpace(getSecurityOrigin()->isLocalhost() ? WebAddressSpaceLocal : WebAddressSpacePrivate); } else { - setAddressSpace(WebURLRequest::AddressSpacePublic); + setAddressSpace(WebAddressSpacePublic); } if (importsController()) { @@ -4976,21 +4977,21 @@ initContentSecurityPolicy(); } - if (securityOrigin()->hasSuborigin()) - enforceSuborigin(securityOrigin()->suboriginName()); + if (getSecurityOrigin()->hasSuborigin()) + enforceSuborigin(getSecurityOrigin()->suboriginName()); if (Settings* settings = initializer.settings()) { if (!settings->webSecurityEnabled()) { // Web security is turned off. We should let this document access every other document. This is used primary by testing // harnesses for web sites. - securityOrigin()->grantUniversalAccess(); - } else if (securityOrigin()->isLocal()) { + getSecurityOrigin()->grantUniversalAccess(); + } else if (getSecurityOrigin()->isLocal()) { if (settings->allowUniversalAccessFromFileURLs()) { // Some clients want local URLs to have universal access, but that setting is dangerous for other clients. - securityOrigin()->grantUniversalAccess(); + getSecurityOrigin()->grantUniversalAccess(); } else if (!settings->allowFileAccessFromFileURLs()) { // Some clients do not want local URLs to have access to other local URLs. - securityOrigin()->blockLocalAccessFromLocalOrigin(); + getSecurityOrigin()->blockLocalAccessFromLocalOrigin(); } } } @@ -5000,8 +5001,8 @@ setBaseURLOverride(initializer.parentBaseURL()); } - if (securityOrigin()->hasSuborigin()) - enforceSuborigin(securityOrigin()->suboriginName()); + if (getSecurityOrigin()->hasSuborigin()) + enforceSuborigin(getSecurityOrigin()->suboriginName()); } void Document::initContentSecurityPolicy(PassRefPtrWillBeRawPtr<ContentSecurityPolicy> csp) @@ -5023,7 +5024,7 @@ bool Document::isSecureTransitionTo(const KURL& url) const { RefPtr<SecurityOrigin> other = SecurityOrigin::create(url); - return securityOrigin()->canAccess(other.get()); + return getSecurityOrigin()->canAccess(other.get()); } bool Document::allowInlineEventHandlers(Node* node, EventListener* listener, const String& contextURL, const WTF::OrdinalNumber& contextLine) @@ -5072,7 +5073,7 @@ { if (!m_frame) return; - m_frame->updateSecurityOrigin(securityOrigin()); + m_frame->updateSecurityOrigin(getSecurityOrigin()); } bool Document::isContextThread() const @@ -5120,7 +5121,7 @@ Settings* settings = this->settings(); m_haveExplicitlyDisabledDNSPrefetch = false; - m_isDNSPrefetchEnabled = settings && settings->dnsPrefetchingEnabled() && securityOrigin()->protocol() == "http"; + m_isDNSPrefetchEnabled = settings && settings->dnsPrefetchingEnabled() && getSecurityOrigin()->protocol() == "http"; // Inherit DNS prefetch opt-out from parent frame if (Document* parent = parentDocument()) { @@ -5183,7 +5184,7 @@ if (!m_frame) return; - if (!consoleMessage->scriptState() && consoleMessage->url().isNull() && !consoleMessage->lineNumber()) { + if (!consoleMessage->getScriptState() && consoleMessage->url().isNull() && !consoleMessage->lineNumber()) { consoleMessage->setURL(url().getString()); if (!isInDocumentWrite() && scriptableDocumentParser()) { ScriptableDocumentParser* parser = scriptableDocumentParser();
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h index c13baa7..49e3bf2 100644 --- a/third_party/WebKit/Source/core/dom/Document.h +++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -230,7 +230,7 @@ using ContainerNode::ref; using ContainerNode::deref; #endif - using SecurityContext::securityOrigin; + using SecurityContext::getSecurityOrigin; using SecurityContext::contentSecurityPolicy; using TreeScope::getElementById; @@ -326,8 +326,8 @@ void setXMLStandalone(bool, ExceptionState&); void setHasXMLDeclaration(bool hasXMLDeclaration) { m_hasXMLDeclaration = hasXMLDeclaration ? 1 : 0; } - String origin() const { return securityOrigin()->toString(); } - String suborigin() const { return securityOrigin()->suboriginName(); } + String origin() const { return getSecurityOrigin()->toString(); } + String suborigin() const { return getSecurityOrigin()->suboriginName(); } String visibilityState() const; PageVisibilityState pageVisibilityState() const; @@ -1092,7 +1092,7 @@ ScriptedIdleTaskController& ensureScriptedIdleTaskController(); void initSecurityContext(const DocumentInit&); SecurityContext& securityContext() final { return *this; } - EventQueue* eventQueue() const final; + EventQueue* getEventQueue() const final; // FIXME: Rename the StyleRecalc state to LayoutTreeUpdate. bool hasPendingStyleRecalc() const { return m_lifecycle.state() == DocumentLifecycle::VisualUpdatePending; }
diff --git a/third_party/WebKit/Source/core/dom/ExecutionContext.cpp b/third_party/WebKit/Source/core/dom/ExecutionContext.cpp index bda769b..26e13a7 100644 --- a/third_party/WebKit/Source/core/dom/ExecutionContext.cpp +++ b/third_party/WebKit/Source/core/dom/ExecutionContext.cpp
@@ -144,7 +144,7 @@ { if (corsStatus == OpaqueResource) return true; - return !(securityOrigin()->canRequestNoSuborigin(completeURL(sourceURL)) || corsStatus == SharableCrossOrigin); + return !(getSecurityOrigin()->canRequestNoSuborigin(completeURL(sourceURL)) || corsStatus == SharableCrossOrigin); } void ExecutionContext::reportException(PassRefPtrWillBeRawPtr<ErrorEvent> event, int scriptId, PassRefPtr<ScriptCallStack> callStack, AccessControlStatus corsStatus) @@ -213,9 +213,9 @@ return *m_publicURLManager; } -SecurityOrigin* ExecutionContext::securityOrigin() +SecurityOrigin* ExecutionContext::getSecurityOrigin() { - return securityContext().securityOrigin(); + return securityContext().getSecurityOrigin(); } ContentSecurityPolicy* ExecutionContext::contentSecurityPolicy()
diff --git a/third_party/WebKit/Source/core/dom/ExecutionContext.h b/third_party/WebKit/Source/core/dom/ExecutionContext.h index e5e67bc..9932d1dc 100644 --- a/third_party/WebKit/Source/core/dom/ExecutionContext.h +++ b/third_party/WebKit/Source/core/dom/ExecutionContext.h
@@ -83,7 +83,7 @@ virtual bool isContextThread() const { return true; } - SecurityOrigin* securityOrigin(); + SecurityOrigin* getSecurityOrigin(); ContentSecurityPolicy* contentSecurityPolicy(); const KURL& url() const; KURL completeURL(const String& url) const; @@ -140,7 +140,7 @@ int circularSequentialID(); virtual EventTarget* errorEventTarget() = 0; - virtual EventQueue* eventQueue() const = 0; + virtual EventQueue* getEventQueue() const = 0; // Methods related to window interaction. It should be used to manage window // focusing and window creation permission for an ExecutionContext.
diff --git a/third_party/WebKit/Source/core/dom/Fullscreen.cpp b/third_party/WebKit/Source/core/dom/Fullscreen.cpp index eda47e5..b2977f4 100644 --- a/third_party/WebKit/Source/core/dom/Fullscreen.cpp +++ b/third_party/WebKit/Source/core/dom/Fullscreen.cpp
@@ -242,7 +242,7 @@ if (!UserGestureIndicator::processingUserGesture()) { String message = ExceptionMessages::failedToExecute("requestFullScreen", "Element", "API can only be initiated by a user gesture."); - document()->executionContext()->addConsoleMessage( + document()->getExecutionContext()->addConsoleMessage( ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message)); break; }
diff --git a/third_party/WebKit/Source/core/dom/IdleRequestCallback.h b/third_party/WebKit/Source/core/dom/IdleRequestCallback.h index a54f3d0..a30ba581 100644 --- a/third_party/WebKit/Source/core/dom/IdleRequestCallback.h +++ b/third_party/WebKit/Source/core/dom/IdleRequestCallback.h
@@ -20,6 +20,7 @@ virtual void handleEvent(IdleDeadline*) = 0; }; + } // namespace blink #endif // IdleRequestCallback_h
diff --git a/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp b/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp index d64ffc5b..385b1640 100644 --- a/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp +++ b/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp
@@ -86,7 +86,7 @@ RefPtrWillBeRawPtr<Node> root = observerInit.root(); if (!root) { // TODO(szager): Use Document instead of document element for implicit root. (crbug.com/570538) - ExecutionContext* context = callback.executionContext(); + ExecutionContext* context = callback.getExecutionContext(); ASSERT(context->isDocument()); Frame* mainFrame = toDocument(context)->frame()->tree().top(); if (mainFrame && mainFrame->isLocalFrame()) @@ -180,7 +180,7 @@ if (target->ensureIntersectionObserverData().getObservationFor(*this)) return; - bool shouldReportRootBounds = target->document().frame()->securityContext()->securityOrigin()->canAccess(rootNode()->document().frame()->securityContext()->securityOrigin()); + bool shouldReportRootBounds = target->document().frame()->securityContext()->getSecurityOrigin()->canAccess(rootNode()->document().frame()->securityContext()->getSecurityOrigin()); IntersectionObservation* observation = new IntersectionObservation(*this, *target, shouldReportRootBounds); target->ensureIntersectionObserverData().addObservation(*observation); m_observations.add(observation); @@ -199,7 +199,7 @@ { if (!m_root || !m_root->inDocument()) return; - Document* callbackDocument = toDocument(m_callback->executionContext()); + Document* callbackDocument = toDocument(m_callback->getExecutionContext()); if (!callbackDocument) return; LocalDOMWindow* callbackDOMWindow = callbackDocument->domWindow(); @@ -262,7 +262,7 @@ void IntersectionObserver::enqueueIntersectionObserverEntry(IntersectionObserverEntry& entry) { m_entries.append(&entry); - toDocument(m_callback->executionContext())->ensureIntersectionObserverController().scheduleIntersectionObserverForDelivery(*this); + toDocument(m_callback->getExecutionContext())->ensureIntersectionObserverController().scheduleIntersectionObserverForDelivery(*this); } static LayoutUnit computeMargin(const Length& length, LayoutUnit referenceLength)
diff --git a/third_party/WebKit/Source/core/dom/IntersectionObserverCallback.h b/third_party/WebKit/Source/core/dom/IntersectionObserverCallback.h index 277d3b0..ada2e2ba 100644 --- a/third_party/WebKit/Source/core/dom/IntersectionObserverCallback.h +++ b/third_party/WebKit/Source/core/dom/IntersectionObserverCallback.h
@@ -17,7 +17,7 @@ public: virtual ~IntersectionObserverCallback() {} virtual void handleEvent(const HeapVector<Member<IntersectionObserverEntry>>&, IntersectionObserver&) = 0; - virtual ExecutionContext* executionContext() const = 0; + virtual ExecutionContext* getExecutionContext() const = 0; DEFINE_INLINE_VIRTUAL_TRACE() { } };
diff --git a/third_party/WebKit/Source/core/dom/IntersectionObserverController.cpp b/third_party/WebKit/Source/core/dom/IntersectionObserverController.cpp index 15cfa0c5..5b71c685 100644 --- a/third_party/WebKit/Source/core/dom/IntersectionObserverController.cpp +++ b/third_party/WebKit/Source/core/dom/IntersectionObserverController.cpp
@@ -5,6 +5,7 @@ #include "core/dom/IntersectionObserverController.h" #include "core/dom/Document.h" +#include "core/dom/IdleRequestOptions.h" namespace blink { @@ -19,8 +20,8 @@ IntersectionObserverController::IntersectionObserverController(Document* document) : ActiveDOMObject(document) - , m_timer(this, &IntersectionObserverController::deliverIntersectionObservations) - , m_timerFiredWhileSuspended(false) + , m_callbackIsScheduled(false) + , m_callbackFiredWhileSuspended(false) { } @@ -28,28 +29,39 @@ void IntersectionObserverController::scheduleIntersectionObserverForDelivery(IntersectionObserver& observer) { - // TODO(szager): use idle callback with a timeout. Until we do that, there is no - // reliable way to write a test for takeRecords, because it's impossible to guarantee - // that javascript will get a chance to run before the timer fires. - if (!m_timer.isActive()) - m_timer.startOneShot(0, BLINK_FROM_HERE); m_pendingIntersectionObservers.add(&observer); + if (m_callbackIsScheduled) + return; + Document* document = toDocument(getExecutionContext()); + if (!document) + return; + m_callbackIsScheduled = true; + IdleRequestOptions options; + // The IntersectionObserver spec mandates that notifications be sent within 100ms. + options.setTimeout(100); + document->requestIdleCallback(this, options); } void IntersectionObserverController::resume() { - // If the timer fired while DOM objects were suspended, notifications might be late, so deliver - // them right away (rather than waiting for m_timer to fire again). - if (m_timerFiredWhileSuspended) { - m_timerFiredWhileSuspended = false; - deliverIntersectionObservations(nullptr); + // If the callback fired while DOM objects were suspended, notifications might be late, so deliver + // them right away (rather than waiting to fire again). + if (m_callbackFiredWhileSuspended) { + m_callbackFiredWhileSuspended = false; + deliverIntersectionObservations(); } } -void IntersectionObserverController::deliverIntersectionObservations(Timer<IntersectionObserverController>*) +void IntersectionObserverController::handleEvent(IdleDeadline*) { - if (executionContext()->activeDOMObjectsAreSuspended()) { - m_timerFiredWhileSuspended = true; + m_callbackIsScheduled = false; + deliverIntersectionObservations(); +} + +void IntersectionObserverController::deliverIntersectionObservations() +{ + if (getExecutionContext()->activeDOMObjectsAreSuspended()) { + m_callbackFiredWhileSuspended = true; return; } IntersectionObserverVector observers; @@ -88,6 +100,7 @@ visitor->trace(m_trackedIntersectionObservers); visitor->trace(m_pendingIntersectionObservers); ActiveDOMObject::trace(visitor); + IdleRequestCallback::trace(visitor); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/IntersectionObserverController.h b/third_party/WebKit/Source/core/dom/IntersectionObserverController.h index 554f574b..089f9fa 100644 --- a/third_party/WebKit/Source/core/dom/IntersectionObserverController.h +++ b/third_party/WebKit/Source/core/dom/IntersectionObserverController.h
@@ -7,8 +7,8 @@ #include "core/dom/ActiveDOMObject.h" #include "core/dom/Element.h" +#include "core/dom/IdleRequestCallback.h" #include "core/dom/IntersectionObserver.h" -#include "platform/Timer.h" #include "platform/heap/Handle.h" #include "wtf/HashSet.h" @@ -17,16 +17,17 @@ namespace blink { -class IntersectionObserverController : public GarbageCollectedFinalized<IntersectionObserverController>, public ActiveDOMObject { +class IntersectionObserverController : public IdleRequestCallback, public ActiveDOMObject { WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(IntersectionObserverController); public: static IntersectionObserverController* create(Document*); ~IntersectionObserverController(); void resume() override; + void handleEvent(IdleDeadline*) override; void scheduleIntersectionObserverForDelivery(IntersectionObserver&); - void deliverIntersectionObservations(Timer<IntersectionObserverController>*); + void deliverIntersectionObservations(); void computeTrackedIntersectionObservations(); void addTrackedObserver(IntersectionObserver&); void removeTrackedObserversForRoot(const Node&); @@ -37,13 +38,13 @@ explicit IntersectionObserverController(Document*); private: - Timer<IntersectionObserverController> m_timer; // IntersectionObservers for which this is the tracking document. HeapHashSet<WeakMember<IntersectionObserver>> m_trackedIntersectionObservers; // IntersectionObservers for which this is the execution context of the callback. HeapHashSet<Member<IntersectionObserver>> m_pendingIntersectionObservers; - bool m_timerFiredWhileSuspended; + bool m_callbackIsScheduled; + bool m_callbackFiredWhileSuspended; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/MessagePort.cpp b/third_party/WebKit/Source/core/dom/MessagePort.cpp index 4c57d77..7f856d1a 100644 --- a/third_party/WebKit/Source/core/dom/MessagePort.cpp +++ b/third_party/WebKit/Source/core/dom/MessagePort.cpp
@@ -67,7 +67,7 @@ { if (!isEntangled()) return; - ASSERT(executionContext()); + ASSERT(getExecutionContext()); ASSERT(m_entangledChannel); OwnPtr<MessagePortChannelArray> channels; @@ -86,7 +86,7 @@ } if (message->containsTransferableArrayBuffer()) - executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, "MessagePort cannot send an ArrayBuffer as a transferable object yet. See http://crbug.com/334408")); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, "MessagePort cannot send an ArrayBuffer as a transferable object yet. See http://crbug.com/334408")); WebString messageString = message->toWireString(); OwnPtr<WebMessagePortChannelArray> webChannels = toWebMessagePortChannelArray(channels.release()); @@ -129,8 +129,8 @@ // This code may be called from another thread, and so should not call any non-threadsafe APIs (i.e. should not call into the entangled channel or access mutable variables). void MessagePort::messageAvailable() { - ASSERT(executionContext()); - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&MessagePort::dispatchMessages, m_weakFactory.createWeakPtr())); + ASSERT(getExecutionContext()); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&MessagePort::dispatchMessages, m_weakFactory.createWeakPtr())); } void MessagePort::start() @@ -139,7 +139,7 @@ if (!isEntangled()) return; - ASSERT(executionContext()); + ASSERT(getExecutionContext()); if (m_started) return; @@ -158,7 +158,7 @@ { // Only invoked to set our initial entanglement. ASSERT(!m_entangledChannel); - ASSERT(executionContext()); + ASSERT(getExecutionContext()); m_entangledChannel = remote; m_entangledChannel->setClient(this); @@ -207,10 +207,10 @@ OwnPtr<MessagePortChannelArray> channels; while (tryGetMessage(message, channels)) { // close() in Worker onmessage handler should prevent next message from dispatching. - if (executionContext()->isWorkerGlobalScope() && toWorkerGlobalScope(executionContext())->isClosing()) + if (getExecutionContext()->isWorkerGlobalScope() && toWorkerGlobalScope(getExecutionContext())->isClosing()) return; - MessagePortArray* ports = MessagePort::entanglePorts(*executionContext(), channels.release()); + MessagePortArray* ports = MessagePort::entanglePorts(*getExecutionContext(), channels.release()); RefPtrWillBeRawPtr<Event> evt = MessageEvent::create(ports, message.release()); dispatchEvent(evt.release()); @@ -282,13 +282,13 @@ v8::Isolate* MessagePort::scriptIsolate() { - ASSERT(executionContext()); - return toIsolate(executionContext()); + ASSERT(getExecutionContext()); + return toIsolate(getExecutionContext()); } v8::Local<v8::Context> MessagePort::scriptContextForMessageConversion() { - ASSERT(executionContext()); + ASSERT(getExecutionContext()); if (!m_scriptStateForConversion) { v8::Isolate* isolate = scriptIsolate(); m_scriptStateForConversion = ScriptState::create(v8::Context::New(isolate), DOMWrapperWorld::create(isolate));
diff --git a/third_party/WebKit/Source/core/dom/MessagePort.h b/third_party/WebKit/Source/core/dom/MessagePort.h index 556ceeee..d3fa1e0 100644 --- a/third_party/WebKit/Source/core/dom/MessagePort.h +++ b/third_party/WebKit/Source/core/dom/MessagePort.h
@@ -86,7 +86,7 @@ bool started() const { return m_started; } const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override { return ContextLifecycleObserver::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ContextLifecycleObserver::getExecutionContext(); } MessagePort* toMessagePort() override { return this; } bool hasPendingActivity() const override;
diff --git a/third_party/WebKit/Source/core/dom/MutationCallback.h b/third_party/WebKit/Source/core/dom/MutationCallback.h index 0ed7cae1..0e737c7 100644 --- a/third_party/WebKit/Source/core/dom/MutationCallback.h +++ b/third_party/WebKit/Source/core/dom/MutationCallback.h
@@ -45,7 +45,7 @@ virtual ~MutationCallback() { } virtual void call(const WillBeHeapVector<RefPtrWillBeMember<MutationRecord>>&, MutationObserver*) = 0; - virtual ExecutionContext* executionContext() const = 0; + virtual ExecutionContext* getExecutionContext() const = 0; DEFINE_INLINE_VIRTUAL_TRACE() { } };
diff --git a/third_party/WebKit/Source/core/dom/MutationObserver.cpp b/third_party/WebKit/Source/core/dom/MutationObserver.cpp index c87e202b..17cfe913 100644 --- a/third_party/WebKit/Source/core/dom/MutationObserver.cpp +++ b/third_party/WebKit/Source/core/dom/MutationObserver.cpp
@@ -71,7 +71,7 @@ ASSERT(m_registrations.isEmpty()); #endif if (!m_records.isEmpty()) - InspectorInstrumentation::didClearAllMutationRecords(m_callback->executionContext(), this); + InspectorInstrumentation::didClearAllMutationRecords(m_callback->getExecutionContext(), this); } void MutationObserver::observe(Node* node, const MutationObserverInit& observerInit, ExceptionState& exceptionState) @@ -135,14 +135,14 @@ { MutationRecordVector records; records.swap(m_records); - InspectorInstrumentation::didClearAllMutationRecords(m_callback->executionContext(), this); + InspectorInstrumentation::didClearAllMutationRecords(m_callback->getExecutionContext(), this); return records; } void MutationObserver::disconnect() { m_records.clear(); - InspectorInstrumentation::didClearAllMutationRecords(m_callback->executionContext(), this); + InspectorInstrumentation::didClearAllMutationRecords(m_callback->getExecutionContext(), this); MutationObserverRegistrationSet registrations(m_registrations); for (auto& registration : registrations) { // The registration may be already unregistered while iteration. @@ -190,7 +190,7 @@ ASSERT(isMainThread()); m_records.append(mutation); activateObserver(this); - InspectorInstrumentation::didEnqueueMutationRecord(m_callback->executionContext(), this); + InspectorInstrumentation::didEnqueueMutationRecord(m_callback->getExecutionContext(), this); } void MutationObserver::setHasTransientRegistration() @@ -209,7 +209,7 @@ bool MutationObserver::shouldBeSuspended() const { - return m_callback->executionContext() && m_callback->executionContext()->activeDOMObjectsAreSuspended(); + return m_callback->getExecutionContext() && m_callback->getExecutionContext()->activeDOMObjectsAreSuspended(); } void MutationObserver::deliver() @@ -232,9 +232,9 @@ MutationRecordVector records; records.swap(m_records); - InspectorInstrumentation::willDeliverMutationRecords(m_callback->executionContext(), this); + InspectorInstrumentation::willDeliverMutationRecords(m_callback->getExecutionContext(), this); m_callback->call(records, this); - InspectorInstrumentation::didDeliverMutationRecords(m_callback->executionContext()); + InspectorInstrumentation::didDeliverMutationRecords(m_callback->getExecutionContext()); } void MutationObserver::resumeSuspendedObservers()
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp index 2169025..1e36ff9 100644 --- a/third_party/WebKit/Source/core/dom/Node.cpp +++ b/third_party/WebKit/Source/core/dom/Node.cpp
@@ -1782,7 +1782,7 @@ return EventTargetNames::Node; } -ExecutionContext* Node::executionContext() const +ExecutionContext* Node::getExecutionContext() const { return document().contextDocument().get(); }
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h index b94ed79e4..b3422f8 100644 --- a/third_party/WebKit/Source/core/dom/Node.h +++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -627,7 +627,7 @@ Node* toNode() final; const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const final; + ExecutionContext* getExecutionContext() const final; void removeAllEventListeners() override; void removeAllEventListenersRecursively();
diff --git a/third_party/WebKit/Source/core/dom/RemoteSecurityContext.cpp b/third_party/WebKit/Source/core/dom/RemoteSecurityContext.cpp index 669ea43..fd94703 100644 --- a/third_party/WebKit/Source/core/dom/RemoteSecurityContext.cpp +++ b/third_party/WebKit/Source/core/dom/RemoteSecurityContext.cpp
@@ -14,7 +14,7 @@ { // RemoteSecurityContext's origin is expected to stay uninitialized until // we set it using replicated origin data from the browser process. - ASSERT(!securityOrigin()); + ASSERT(!getSecurityOrigin()); // CSP will not be replicated for RemoteSecurityContexts, as it is moving // to the browser process. For now, initialize CSP to a default
diff --git a/third_party/WebKit/Source/core/dom/ScopedWindowFocusAllowedIndicator.h b/third_party/WebKit/Source/core/dom/ScopedWindowFocusAllowedIndicator.h index 3b22181..51c5367 100644 --- a/third_party/WebKit/Source/core/dom/ScopedWindowFocusAllowedIndicator.h +++ b/third_party/WebKit/Source/core/dom/ScopedWindowFocusAllowedIndicator.h
@@ -37,8 +37,8 @@ void dispose() { - if (executionContext()) - executionContext()->consumeWindowInteraction(); + if (getExecutionContext()) + getExecutionContext()->consumeWindowInteraction(); } DEFINE_INLINE_TRACE() @@ -50,7 +50,7 @@ // In Oilpan, destructors are not allowed to touch other on-heap objects. // The Observer indirection is needed to keep // ScopedWindowFocusAllowedIndicator off-heap and thus allows its destructor - // to call executionContext()->consumeWindowInteraction(). + // to call getExecutionContext()->consumeWindowInteraction(). OwnPtrWillBePersistent<Observer> m_observer; };
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp index a89f7df..b33f34f1 100644 --- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp +++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
@@ -293,7 +293,7 @@ CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(m_element->fastGetAttribute(HTMLNames::crossoriginAttr)); if (crossOrigin != CrossOriginAttributeNotSet) - request.setCrossOriginAccessControl(elementDocument->securityOrigin(), crossOrigin); + request.setCrossOriginAccessControl(elementDocument->getSecurityOrigin(), crossOrigin); request.setCharset(scriptCharset()); // Skip fetch-related CSP checks if the script element has a valid nonce, or if dynamically @@ -340,7 +340,7 @@ bool text = mimetype.lower().startsWith("text/"); bool application = mimetype.lower().startsWith("application/"); bool expectedJs = MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimetype) || (text && isLegacySupportedJavaScriptLanguage(mimetype.substring(5))); - bool sameOrigin = m_element->document().securityOrigin()->canRequest(m_resource->url()); + bool sameOrigin = m_element->document().getSecurityOrigin()->canRequest(m_resource->url()); if (expectedJs) { return; } @@ -405,7 +405,7 @@ accessControlStatus = OpaqueResource; else accessControlStatus = SharableCrossOrigin; - } else if (sourceCode.resource()->passesAccessControlCheck(m_element->document().securityOrigin())) { + } else if (sourceCode.resource()->passesAccessControlCheck(m_element->document().getSecurityOrigin())) { accessControlStatus = SharableCrossOrigin; } }
diff --git a/third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp b/third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp index 1df2916d..b0bdb09 100644 --- a/third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp +++ b/third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp
@@ -87,13 +87,13 @@ m_scheduler->postIdleTask(BLINK_FROM_HERE, WTF::bind<double>(&internal::IdleRequestCallbackWrapper::idleTaskFired, callbackWrapper)); if (timeoutMillis > 0) m_scheduler->timerTaskRunner()->postDelayedTask(BLINK_FROM_HERE, WTF::bind(&internal::IdleRequestCallbackWrapper::timeoutFired, callbackWrapper), timeoutMillis); - TRACE_EVENT_INSTANT1("devtools.timeline", "RequestIdleCallback", TRACE_EVENT_SCOPE_THREAD, "data", InspectorIdleCallbackRequestEvent::data(executionContext(), id, timeoutMillis)); + TRACE_EVENT_INSTANT1("devtools.timeline", "RequestIdleCallback", TRACE_EVENT_SCOPE_THREAD, "data", InspectorIdleCallbackRequestEvent::data(getExecutionContext(), id, timeoutMillis)); return id; } void ScriptedIdleTaskController::cancelCallback(CallbackId id) { - TRACE_EVENT_INSTANT1("devtools.timeline", "CancelIdleCallback", TRACE_EVENT_SCOPE_THREAD, "data", InspectorIdleCallbackCancelEvent::data(executionContext(), id)); + TRACE_EVENT_INSTANT1("devtools.timeline", "CancelIdleCallback", TRACE_EVENT_SCOPE_THREAD, "data", InspectorIdleCallbackCancelEvent::data(getExecutionContext(), id)); m_callbacks.remove(id); } @@ -127,7 +127,7 @@ idleCallbackDeadlineHistogram.count(allottedTimeMillis); TRACE_EVENT1("devtools.timeline", "FireIdleCallback", - "data", InspectorIdleCallbackFireEvent::data(executionContext(), id, allottedTimeMillis, callbackType == IdleDeadline::CallbackType::CalledByTimeout)); + "data", InspectorIdleCallbackFireEvent::data(getExecutionContext(), id, allottedTimeMillis, callbackType == IdleDeadline::CallbackType::CalledByTimeout)); callback->handleEvent(IdleDeadline::create(deadlineSeconds, callbackType)); double overrunMillis = std::max((monotonicallyIncreasingTime() - deadlineSeconds) * 1000, 0.0);
diff --git a/third_party/WebKit/Source/core/dom/SecurityContext.cpp b/third_party/WebKit/Source/core/dom/SecurityContext.cpp index 716acfb..f830e2db 100644 --- a/third_party/WebKit/Source/core/dom/SecurityContext.cpp +++ b/third_party/WebKit/Source/core/dom/SecurityContext.cpp
@@ -34,7 +34,7 @@ SecurityContext::SecurityContext() : m_sandboxFlags(SandboxNone) - , m_addressSpace(WebURLRequest::AddressSpacePublic) + , m_addressSpace(WebAddressSpacePublic) , m_insecureRequestsPolicy(InsecureRequestsDoNotUpgrade) , m_enforceStrictMixedContentChecking(false) { @@ -63,7 +63,7 @@ { m_sandboxFlags |= mask; - if (isSandboxed(SandboxOrigin) && securityOrigin() && !securityOrigin()->isUnique()) { + if (isSandboxed(SandboxOrigin) && getSecurityOrigin() && !getSecurityOrigin()->isUnique()) { setSecurityOrigin(SecurityOrigin::createUnique()); didUpdateSecurityOrigin(); } @@ -72,13 +72,13 @@ String SecurityContext::addressSpaceForBindings() const { switch (m_addressSpace) { - case WebURLRequest::AddressSpacePublic: + case WebAddressSpacePublic: return "public"; - case WebURLRequest::AddressSpacePrivate: + case WebAddressSpacePrivate: return "private"; - case WebURLRequest::AddressSpaceLocal: + case WebAddressSpaceLocal: return "local"; } ASSERT_NOT_REACHED();
diff --git a/third_party/WebKit/Source/core/dom/SecurityContext.h b/third_party/WebKit/Source/core/dom/SecurityContext.h index 7c7143c5..b420c26 100644 --- a/third_party/WebKit/Source/core/dom/SecurityContext.h +++ b/third_party/WebKit/Source/core/dom/SecurityContext.h
@@ -30,7 +30,7 @@ #include "core/CoreExport.h" #include "core/dom/SandboxFlags.h" #include "platform/heap/Handle.h" -#include "public/platform/WebURLRequest.h" +#include "public/platform/WebAddressSpace.h" #include "wtf/HashSet.h" #include "wtf/Noncopyable.h" #include "wtf/PassRefPtr.h" @@ -57,7 +57,7 @@ InsecureRequestsUpgrade }; - SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); } + SecurityOrigin* getSecurityOrigin() const { return m_securityOrigin.get(); } ContentSecurityPolicy* contentSecurityPolicy() const { return m_contentSecurityPolicy.get(); } // Explicitly override the security origin for this security context. @@ -70,8 +70,8 @@ bool isSandboxed(SandboxFlags mask) const { return m_sandboxFlags & mask; } void enforceSandboxFlags(SandboxFlags mask); - void setAddressSpace(WebURLRequest::AddressSpace space) { m_addressSpace = space; } - WebURLRequest::AddressSpace addressSpace() const { return m_addressSpace; } + void setAddressSpace(WebAddressSpace space) { m_addressSpace = space; } + WebAddressSpace addressSpace() const { return m_addressSpace; } String addressSpaceForBindings() const; void setInsecureRequestsPolicy(InsecureRequestsPolicy policy) { m_insecureRequestsPolicy = policy; } @@ -99,7 +99,7 @@ SandboxFlags m_sandboxFlags; - WebURLRequest::AddressSpace m_addressSpace; + WebAddressSpace m_addressSpace; InsecureRequestsPolicy m_insecureRequestsPolicy; InsecureNavigationsSet m_insecureNavigationsToUpgrade; bool m_enforceStrictMixedContentChecking;
diff --git a/third_party/WebKit/Source/core/dom/Text.cpp b/third_party/WebKit/Source/core/dom/Text.cpp index eb8ff3d..0a0b82e7 100644 --- a/third_party/WebKit/Source/core/dom/Text.cpp +++ b/third_party/WebKit/Source/core/dom/Text.cpp
@@ -239,7 +239,7 @@ return cloneWithData(data()); } -static inline bool canHaveWhitespaceChildren(const LayoutObject& parent, Text* text) +static inline bool canHaveWhitespaceChildren(const LayoutObject& parent) { // <button> should allow whitespace even though LayoutFlexibleBox doesn't. if (parent.isLayoutButton()) @@ -257,7 +257,7 @@ return true; } -bool Text::textLayoutObjectIsNeeded(const ComputedStyle& style, const LayoutObject& parent) +bool Text::textLayoutObjectIsNeeded(const ComputedStyle& style, const LayoutObject& parent) const { if (!parent.canHaveChildren()) return false; @@ -274,7 +274,7 @@ if (!containsOnlyWhitespace()) return true; - if (!canHaveWhitespaceChildren(parent, this)) + if (!canHaveWhitespaceChildren(parent)) return false; // pre-wrap in SVG never makes layoutObject. @@ -405,12 +405,12 @@ // Passing both |textNode| and its layout object because repeated calls to // |Node::layoutObject()| are discouraged. -static bool shouldUpdateLayoutByReattaching(Text* textNode, LayoutText* textLayoutObject) +static bool shouldUpdateLayoutByReattaching(const Text& textNode, LayoutText* textLayoutObject) { - ASSERT(textNode->layoutObject() == textLayoutObject); + ASSERT(textNode.layoutObject() == textLayoutObject); if (!textLayoutObject) return true; - if (!textNode->textLayoutObjectIsNeeded(*textLayoutObject->style(), *textLayoutObject->parent())) + if (!textNode.textLayoutObjectIsNeeded(*textLayoutObject->style(), *textLayoutObject->parent())) return true; if (textLayoutObject->isTextFragment()) { FirstLetterPseudoElement* pseudo = toLayoutTextFragment(textLayoutObject)->firstLetterPseudoElement(); @@ -425,7 +425,7 @@ if (!inActiveDocument()) return; LayoutText* textLayoutObject = layoutObject(); - if (shouldUpdateLayoutByReattaching(this, textLayoutObject)) { + if (shouldUpdateLayoutByReattaching(*this, textLayoutObject)) { lazyReattachIfAttached(); // FIXME: Editing should be updated so this is not neccesary. if (recalcStyleBehavior == DeprecatedRecalcStyleImmediatlelyForEditing)
diff --git a/third_party/WebKit/Source/core/dom/Text.h b/third_party/WebKit/Source/core/dom/Text.h index f0fb217..21176770 100644 --- a/third_party/WebKit/Source/core/dom/Text.h +++ b/third_party/WebKit/Source/core/dom/Text.h
@@ -52,7 +52,7 @@ PassRefPtrWillBeRawPtr<Text> replaceWholeText(const String&); void recalcTextStyle(StyleRecalcChange, Text* nextTextSibling); - bool textLayoutObjectIsNeeded(const ComputedStyle&, const LayoutObject& parent); + bool textLayoutObjectIsNeeded(const ComputedStyle&, const LayoutObject& parent) const; LayoutText* createTextLayoutObject(const ComputedStyle&); void updateTextLayoutObject(unsigned offsetOfReplacedData, unsigned lengthOfReplacedData, RecalcStyleBehavior = DoNotRecalcStyle);
diff --git a/third_party/WebKit/Source/core/events/DragEvent.cpp b/third_party/WebKit/Source/core/events/DragEvent.cpp index 9baa4b83f..987c48c 100644 --- a/third_party/WebKit/Source/core/events/DragEvent.cpp +++ b/third_party/WebKit/Source/core/events/DragEvent.cpp
@@ -54,7 +54,7 @@ DragEvent::DragEvent(const AtomicString& type, const DragEventInit& initializer) : MouseEvent(type, initializer) - , m_dataTransfer(initializer.dataTransfer()) + , m_dataTransfer(initializer.getDataTransfer()) { }
diff --git a/third_party/WebKit/Source/core/events/DragEvent.h b/third_party/WebKit/Source/core/events/DragEvent.h index 1e85a8e7..cb81af9 100644 --- a/third_party/WebKit/Source/core/events/DragEvent.h +++ b/third_party/WebKit/Source/core/events/DragEvent.h
@@ -40,7 +40,7 @@ return adoptRefWillBeNoop(new DragEvent(type, initializer)); } - DataTransfer* dataTransfer() const override { return isDragEvent() ? m_dataTransfer.get() : nullptr; } + DataTransfer* getDataTransfer() const override { return isDragEvent() ? m_dataTransfer.get() : nullptr; } bool isDragEvent() const override; bool isMouseEvent() const override;
diff --git a/third_party/WebKit/Source/core/events/DragEvent.idl b/third_party/WebKit/Source/core/events/DragEvent.idl index 04047e25..53205ec 100644 --- a/third_party/WebKit/Source/core/events/DragEvent.idl +++ b/third_party/WebKit/Source/core/events/DragEvent.idl
@@ -7,5 +7,5 @@ [ Constructor(DOMString type, optional DragEventInit eventInitDict), ] interface DragEvent : MouseEvent { - readonly attribute DataTransfer dataTransfer; + [ImplementedAs=getDataTransfer] readonly attribute DataTransfer dataTransfer; };
diff --git a/third_party/WebKit/Source/core/events/DragEventInit.idl b/third_party/WebKit/Source/core/events/DragEventInit.idl index 3b90386..ccf5837 100644 --- a/third_party/WebKit/Source/core/events/DragEventInit.idl +++ b/third_party/WebKit/Source/core/events/DragEventInit.idl
@@ -5,5 +5,5 @@ // https://html.spec.whatwg.org/multipage/interaction.html#drageventinit dictionary DragEventInit : MouseEventInit { - DataTransfer? dataTransfer; + [ImplementedAs=getDataTransfer] DataTransfer? dataTransfer; };
diff --git a/third_party/WebKit/Source/core/events/EventTarget.cpp b/third_party/WebKit/Source/core/events/EventTarget.cpp index 4bb9aaa..82e2d26 100644 --- a/third_party/WebKit/Source/core/events/EventTarget.cpp +++ b/third_party/WebKit/Source/core/events/EventTarget.cpp
@@ -113,7 +113,7 @@ inline LocalDOMWindow* EventTarget::executingWindow() { - if (ExecutionContext* context = executionContext()) + if (ExecutionContext* context = getExecutionContext()) return context->executingWindow(); return nullptr; } @@ -260,7 +260,7 @@ return false; } - if (!executionContext()) + if (!getExecutionContext()) return false; event->setTrusted(false); @@ -377,7 +377,7 @@ event->setType(unprefixedTypeName); } - Editor::countEvent(executionContext(), event); + Editor::countEvent(getExecutionContext(), event); countLegacyEvents(legacyTypeName, listenersVector, legacyListenersVector); return dispatchEventResult(*event); } @@ -435,7 +435,7 @@ if (event->immediatePropagationStopped()) break; - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); if (!context) break;
diff --git a/third_party/WebKit/Source/core/events/EventTarget.h b/third_party/WebKit/Source/core/events/EventTarget.h index 8c9e9e9..fa1cd9ff 100644 --- a/third_party/WebKit/Source/core/events/EventTarget.h +++ b/third_party/WebKit/Source/core/events/EventTarget.h
@@ -102,7 +102,7 @@ // very strange compiler errors. // - If you added an onfoo attribute, use DEFINE_ATTRIBUTE_EVENT_LISTENER(foo) // in your class declaration. -// - Override EventTarget::interfaceName() and executionContext(). The former +// - Override EventTarget::interfaceName() and getExecutionContext(). The former // will typically return EventTargetNames::YourClassName. The latter will // return ActiveDOMObject::executionContext (if you are an ActiveDOMObject) // or the document you're in. @@ -123,7 +123,7 @@ #endif virtual const AtomicString& interfaceName() const = 0; - virtual ExecutionContext* executionContext() const = 0; + virtual ExecutionContext* getExecutionContext() const = 0; virtual Node* toNode(); virtual const LocalDOMWindow* toDOMWindow() const;
diff --git a/third_party/WebKit/Source/core/events/MouseEvent.h b/third_party/WebKit/Source/core/events/MouseEvent.h index 52c12ae..0d287c2 100644 --- a/third_party/WebKit/Source/core/events/MouseEvent.h +++ b/third_party/WebKit/Source/core/events/MouseEvent.h
@@ -79,7 +79,7 @@ Node* toElement() const; Node* fromElement() const; - virtual DataTransfer* dataTransfer() const { return nullptr; } + virtual DataTransfer* getDataTransfer() const { return nullptr; } bool fromTouch() const { return m_syntheticEventType == PlatformMouseEvent::FromTouch; }
diff --git a/third_party/WebKit/Source/core/fetch/FetchContext.h b/third_party/WebKit/Source/core/fetch/FetchContext.h index 4c6cd7b6..d4259504 100644 --- a/third_party/WebKit/Source/core/fetch/FetchContext.h +++ b/third_party/WebKit/Source/core/fetch/FetchContext.h
@@ -102,7 +102,7 @@ virtual bool updateTimingInfoForIFrameNavigation(ResourceTimingInfo*) { return false; } virtual void sendImagePing(const KURL&); virtual void addConsoleMessage(const String&) const; - virtual SecurityOrigin* securityOrigin() const { return nullptr; } + virtual SecurityOrigin* getSecurityOrigin() const { return nullptr; } virtual void upgradeInsecureRequest(FetchRequest&); virtual void addClientHintsIfNecessary(FetchRequest&); virtual void addCSPHeaderIfNecessary(Resource::Type, FetchRequest&); @@ -112,7 +112,6 @@ virtual ResourceLoadPriority modifyPriorityForExperiments(ResourceLoadPriority priority, Resource::Type, const FetchRequest&, ResourcePriority::VisibilityStatus) { return priority; } virtual WebTaskRunner* loadingTaskRunner() const { return nullptr; } - virtual bool isInspectorAttached() const { return false; } protected: FetchContext() { }
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp index 99a4343..4235737 100644 --- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp +++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
@@ -239,12 +239,6 @@ return size; } -void ImageResource::computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio) -{ - if (m_image) - m_image->computeIntrinsicDimensions(intrinsicSize, intrinsicRatio); -} - void ImageResource::notifyObservers(const IntRect* changeRect) { ResourceClientWalker<ImageResourceClient> w(m_clients);
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.h b/third_party/WebKit/Source/core/fetch/ImageResource.h index afbd05f..d05ec2b 100644 --- a/third_party/WebKit/Source/core/fetch/ImageResource.h +++ b/third_party/WebKit/Source/core/fetch/ImageResource.h
@@ -83,7 +83,6 @@ }; // This method takes a zoom multiplier that can be used to increase the natural size of the image by the zoom. LayoutSize imageSize(RespectImageOrientationEnum shouldRespectImageOrientation, float multiplier, SizeType = IntrinsicSize); - void computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio); bool isAccessAllowed(SecurityOrigin*);
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp index e18a9c9..1834568f 100644 --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
@@ -93,25 +93,6 @@ DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, XSLStyleSheet) \ } -// TODO(yhirano): This function is for an experiment and should be removed -// shortly. See https://crbug.com/579496. -bool shouldBeAddedToMemoryCache(const FetchRequest& request, Resource* resource, const FetchContext& context) -{ - if (request.forPreload()) - return true; - if (context.isInspectorAttached()) - return true; - switch (resource->getType()) { - case Resource::Image: - case Resource::Script: - case Resource::CSSStyleSheet: - case Resource::Font: - return true; - default: - return false; - } -} - } // namespace static void RecordSriResourceIntegrityMismatchEvent(SriResourceIntegrityMismatchEvent event) @@ -255,7 +236,7 @@ return false; if (!sourceOrigin) - sourceOrigin = context().securityOrigin(); + sourceOrigin = context().getSecurityOrigin(); if (sourceOrigin->canRequestNoSuborigin(url)) return true; @@ -616,8 +597,7 @@ resource->setLinkPreload(request.isLinkPreload()); resource->setCacheIdentifier(cacheIdentifier); - if (shouldBeAddedToMemoryCache(request, resource.get(), context())) - memoryCache()->add(resource.get()); + memoryCache()->add(resource.get()); return resource; } @@ -1087,7 +1067,7 @@ if (options.corsEnabled == IsCORSEnabled) { SecurityOrigin* sourceOrigin = options.securityOrigin.get(); if (!sourceOrigin) - sourceOrigin = context().securityOrigin(); + sourceOrigin = context().getSecurityOrigin(); String errorMessage; StoredCredentials withCredentials = resource->lastResourceRequest().allowStoredCredentials() ? AllowStoredCredentials : DoNotAllowStoredCredentials;
diff --git a/third_party/WebKit/Source/core/fileapi/FileReader.cpp b/third_party/WebKit/Source/core/fileapi/FileReader.cpp index b654c90..8d12ba4 100644 --- a/third_party/WebKit/Source/core/fileapi/FileReader.cpp +++ b/third_party/WebKit/Source/core/fileapi/FileReader.cpp
@@ -226,7 +226,7 @@ return; if (hasPendingActivity()) - ThrottlingController::finishReader(executionContext(), this, ThrottlingController::removeReader(executionContext(), this)); + ThrottlingController::finishReader(getExecutionContext(), this, ThrottlingController::removeReader(getExecutionContext(), this)); terminate(); } @@ -286,7 +286,7 @@ return; } - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); if (!context) { exceptionState.throwDOMException(AbortError, "Reading from a detached FileReader is not supported."); return; @@ -319,7 +319,7 @@ m_loader = FileReaderLoader::create(m_readType, this); m_loader->setEncoding(m_encoding); m_loader->setDataType(m_blobType); - m_loader->start(executionContext(), m_blobDataHandle); + m_loader->start(getExecutionContext(), m_blobDataHandle); m_blobDataHandle = nullptr; } @@ -339,7 +339,7 @@ m_loadingState = LoadingStateAborted; // Schedule to have the abort done later since abort() might be called from the event handler and we do not want the resource loading code to be in the stack. - executionContext()->postTask( + getExecutionContext()->postTask( BLINK_FROM_HERE, createSameThreadTask(&delayedAbort, this)); } @@ -352,14 +352,14 @@ m_error = FileError::create(FileError::ABORT_ERR); // Unregister the reader. - ThrottlingController::FinishReaderType finalStep = ThrottlingController::removeReader(executionContext(), this); + ThrottlingController::FinishReaderType finalStep = ThrottlingController::removeReader(getExecutionContext(), this); fireEvent(EventTypeNames::error); fireEvent(EventTypeNames::abort); fireEvent(EventTypeNames::loadend); // All possible events have fired and we're done, no more pending activity. - ThrottlingController::finishReader(executionContext(), this, finalStep); + ThrottlingController::finishReader(getExecutionContext(), this, finalStep); } void FileReader::result(StringOrArrayBuffer& resultAttribute) const @@ -417,13 +417,13 @@ m_state = DONE; // Unregister the reader. - ThrottlingController::FinishReaderType finalStep = ThrottlingController::removeReader(executionContext(), this); + ThrottlingController::FinishReaderType finalStep = ThrottlingController::removeReader(getExecutionContext(), this); fireEvent(EventTypeNames::load); fireEvent(EventTypeNames::loadend); // All possible events have fired and we're done, no more pending activity. - ThrottlingController::finishReader(executionContext(), this, finalStep); + ThrottlingController::finishReader(getExecutionContext(), this, finalStep); } void FileReader::didFail(FileError::ErrorCode errorCode) @@ -439,18 +439,18 @@ m_error = FileError::create(static_cast<FileError::ErrorCode>(errorCode)); // Unregister the reader. - ThrottlingController::FinishReaderType finalStep = ThrottlingController::removeReader(executionContext(), this); + ThrottlingController::FinishReaderType finalStep = ThrottlingController::removeReader(getExecutionContext(), this); fireEvent(EventTypeNames::error); fireEvent(EventTypeNames::loadend); // All possible events have fired and we're done, no more pending activity. - ThrottlingController::finishReader(executionContext(), this, finalStep); + ThrottlingController::finishReader(getExecutionContext(), this, finalStep); } void FileReader::fireEvent(const AtomicString& type) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(getExecutionContext(), m_asyncOperationId); if (!m_loader) { dispatchEvent(ProgressEvent::create(type, false, 0, 0)); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie);
diff --git a/third_party/WebKit/Source/core/fileapi/FileReader.h b/third_party/WebKit/Source/core/fileapi/FileReader.h index 0f6b262..b467918e 100644 --- a/third_party/WebKit/Source/core/fileapi/FileReader.h +++ b/third_party/WebKit/Source/core/fileapi/FileReader.h
@@ -82,7 +82,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override { return ContextLifecycleObserver::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ContextLifecycleObserver::getExecutionContext(); } // FileReaderLoaderClient void didStartLoading() override;
diff --git a/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp b/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp index d09c8dba..19ec6a5a 100644 --- a/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp +++ b/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp
@@ -82,7 +82,7 @@ void FileReaderLoader::startInternal(ExecutionContext& executionContext, const Stream* stream, PassRefPtr<BlobDataHandle> blobData) { // The blob is read by routing through the request handling layer given a temporary public url. - m_urlForReading = BlobURL::createPublicURL(executionContext.securityOrigin()); + m_urlForReading = BlobURL::createPublicURL(executionContext.getSecurityOrigin()); if (m_urlForReading.isEmpty()) { failed(FileError::SECURITY_ERR); return; @@ -90,10 +90,10 @@ if (blobData) { ASSERT(!stream); - BlobRegistry::registerPublicBlobURL(executionContext.securityOrigin(), m_urlForReading, blobData); + BlobRegistry::registerPublicBlobURL(executionContext.getSecurityOrigin(), m_urlForReading, blobData); } else { ASSERT(stream); - BlobRegistry::registerStreamURL(executionContext.securityOrigin(), m_urlForReading, stream->url()); + BlobRegistry::registerStreamURL(executionContext.getSecurityOrigin(), m_urlForReading, stream->url()); } // Construct and load the request.
diff --git a/third_party/WebKit/Source/core/frame/DOMTimer.cpp b/third_party/WebKit/Source/core/frame/DOMTimer.cpp index 5914cd4..513d725 100644 --- a/third_party/WebKit/Source/core/frame/DOMTimer.cpp +++ b/third_party/WebKit/Source/core/frame/DOMTimer.cpp
@@ -98,7 +98,7 @@ void DOMTimer::fired() { - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); ASSERT(context); context->timers()->setTimerNestingLevel(m_nestingLevel); ASSERT(!context->activeDOMObjectsAreSuspended()); @@ -137,8 +137,8 @@ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data()); // ExecutionContext might be already gone when we executed action->execute(). - if (executionContext()) - executionContext()->timers()->setTimerNestingLevel(0); + if (getExecutionContext()) + getExecutionContext()->timers()->setTimerNestingLevel(0); } void DOMTimer::stop() @@ -152,7 +152,7 @@ WebTaskRunner* DOMTimer::timerTaskRunner() const { - return executionContext()->timers()->timerTaskRunner(); + return getExecutionContext()->timers()->timerTaskRunner(); } DEFINE_TRACE(DOMTimer)
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.cpp b/third_party/WebKit/Source/core/frame/DOMWindow.cpp index ebf7826..26aee8f 100644 --- a/third_party/WebKit/Source/core/frame/DOMWindow.cpp +++ b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
@@ -141,7 +141,7 @@ // FIXME: The name canAccess seems to be a roundabout way to ask "can execute script". // Can we name the SecurityOrigin function better to make this more clear? - if (callingWindow.document()->securityOrigin()->canAccessCheckSuborigins(frame()->securityContext()->securityOrigin())) + if (callingWindow.document()->getSecurityOrigin()->canAccessCheckSuborigins(frame()->securityContext()->getSecurityOrigin())) return false; } @@ -180,7 +180,7 @@ if (targetOrigin == "/") { if (!sourceDocument) return; - target = sourceDocument->securityOrigin(); + target = sourceDocument->getSecurityOrigin(); } else if (targetOrigin != "*") { target = SecurityOrigin::createFromString(targetOrigin); // It doesn't make sense target a postMessage at a unique origin @@ -191,7 +191,7 @@ } } - OwnPtr<MessagePortChannelArray> channels = MessagePort::disentanglePorts(executionContext(), ports, exceptionState); + OwnPtr<MessagePortChannelArray> channels = MessagePort::disentanglePorts(getExecutionContext(), ports, exceptionState); if (exceptionState.hadException()) return; @@ -199,13 +199,13 @@ // in order to capture the source of the message correctly. if (!sourceDocument) return; - String sourceOrigin = sourceDocument->securityOrigin()->toString(); - String sourceSuborigin = sourceDocument->securityOrigin()->suboriginName(); + String sourceOrigin = sourceDocument->getSecurityOrigin()->toString(); + String sourceSuborigin = sourceDocument->getSecurityOrigin()->suboriginName(); - KURL targetUrl = isLocalDOMWindow() ? document()->url() : KURL(KURL(), frame()->securityContext()->securityOrigin()->toString()); - if (MixedContentChecker::isMixedContent(sourceDocument->securityOrigin(), targetUrl)) + KURL targetUrl = isLocalDOMWindow() ? document()->url() : KURL(KURL(), frame()->securityContext()->getSecurityOrigin()->toString()); + if (MixedContentChecker::isMixedContent(sourceDocument->getSecurityOrigin(), targetUrl)) UseCounter::count(frame(), UseCounter::PostMessageFromSecureToInsecure); - else if (MixedContentChecker::isMixedContent(frame()->securityContext()->securityOrigin(), sourceDocument->url())) + else if (MixedContentChecker::isMixedContent(frame()->securityContext()->getSecurityOrigin(), sourceDocument->url())) UseCounter::count(frame(), UseCounter::PostMessageFromInsecureToSecure); RefPtrWillBeRawPtr<MessageEvent> event = MessageEvent::create(channels.release(), message, sourceOrigin, String(), source, sourceSuborigin); @@ -237,9 +237,9 @@ if (callingWindowURL.isNull()) return String(); - ASSERT(!callingWindow->document()->securityOrigin()->canAccessCheckSuborigins(frame()->securityContext()->securityOrigin())); + ASSERT(!callingWindow->document()->getSecurityOrigin()->canAccessCheckSuborigins(frame()->securityContext()->getSecurityOrigin())); - const SecurityOrigin* activeOrigin = callingWindow->document()->securityOrigin(); + const SecurityOrigin* activeOrigin = callingWindow->document()->getSecurityOrigin(); String message = "Blocked a frame with origin \"" + activeOrigin->toString() + "\" from accessing a cross-origin frame."; // FIXME: Evaluate which details from 'crossDomainAccessErrorMessage' may safely be reported to JavaScript. @@ -257,8 +257,8 @@ return String(); // FIXME: This message, and other console messages, have extra newlines. Should remove them. - const SecurityOrigin* activeOrigin = callingWindow->document()->securityOrigin(); - const SecurityOrigin* targetOrigin = frame()->securityContext()->securityOrigin(); + const SecurityOrigin* activeOrigin = callingWindow->document()->getSecurityOrigin(); + const SecurityOrigin* targetOrigin = frame()->securityContext()->getSecurityOrigin(); ASSERT(!activeOrigin->canAccessCheckSuborigins(targetOrigin)); String message = "Blocked a frame with origin \"" + activeOrigin->toString() + "\" from accessing a frame with origin \"" + targetOrigin->toString() + "\". ";
diff --git a/third_party/WebKit/Source/core/frame/DOMWindowTimers.cpp b/third_party/WebKit/Source/core/frame/DOMWindowTimers.cpp index cc713a8..d2c6c6e7 100644 --- a/third_party/WebKit/Source/core/frame/DOMWindowTimers.cpp +++ b/third_party/WebKit/Source/core/frame/DOMWindowTimers.cpp
@@ -67,7 +67,7 @@ int setTimeout(ScriptState* scriptState, EventTarget& eventTarget, const ScriptValue& handler, int timeout, const Vector<ScriptValue>& arguments) { - ExecutionContext* executionContext = eventTarget.executionContext(); + ExecutionContext* executionContext = eventTarget.getExecutionContext(); if (!isAllowed(scriptState, executionContext, false)) return 0; if (timeout >= 0 && executionContext->isDocument()) { @@ -81,7 +81,7 @@ int setTimeout(ScriptState* scriptState, EventTarget& eventTarget, const String& handler, int timeout, const Vector<ScriptValue>&) { - ExecutionContext* executionContext = eventTarget.executionContext(); + ExecutionContext* executionContext = eventTarget.getExecutionContext(); if (!isAllowed(scriptState, executionContext, true)) return 0; // Don't allow setting timeouts to run empty functions. Was historically a @@ -99,7 +99,7 @@ int setInterval(ScriptState* scriptState, EventTarget& eventTarget, const ScriptValue& handler, int timeout, const Vector<ScriptValue>& arguments) { - ExecutionContext* executionContext = eventTarget.executionContext(); + ExecutionContext* executionContext = eventTarget.getExecutionContext(); if (!isAllowed(scriptState, executionContext, false)) return 0; OwnPtrWillBeRawPtr<ScheduledAction> action = ScheduledAction::create(scriptState, handler, arguments); @@ -108,7 +108,7 @@ int setInterval(ScriptState* scriptState, EventTarget& eventTarget, const String& handler, int timeout, const Vector<ScriptValue>&) { - ExecutionContext* executionContext = eventTarget.executionContext(); + ExecutionContext* executionContext = eventTarget.getExecutionContext(); if (!isAllowed(scriptState, executionContext, true)) return 0; // Don't allow setting timeouts to run empty functions. Was historically a @@ -121,13 +121,13 @@ void clearTimeout(EventTarget& eventTarget, int timeoutID) { - if (ExecutionContext* context = eventTarget.executionContext()) + if (ExecutionContext* context = eventTarget.getExecutionContext()) DOMTimer::removeByID(context, timeoutID); } void clearInterval(EventTarget& eventTarget, int timeoutID) { - if (ExecutionContext* context = eventTarget.executionContext()) + if (ExecutionContext* context = eventTarget.getExecutionContext()) DOMTimer::removeByID(context, timeoutID); }
diff --git a/third_party/WebKit/Source/core/frame/Deprecation.cpp b/third_party/WebKit/Source/core/frame/Deprecation.cpp index 2dd44519..74f4e4d 100644 --- a/third_party/WebKit/Source/core/frame/Deprecation.cpp +++ b/third_party/WebKit/Source/core/frame/Deprecation.cpp
@@ -154,9 +154,9 @@ if (!frame) return; // Check to see if the frame can script into the top level document. - SecurityOrigin* securityOrigin = frame->securityContext()->securityOrigin(); + SecurityOrigin* securityOrigin = frame->securityContext()->getSecurityOrigin(); Frame* top = frame->tree().top(); - if (top && !securityOrigin->canAccess(top->securityContext()->securityOrigin())) + if (top && !securityOrigin->canAccess(top->securityContext()->getSecurityOrigin())) countDeprecation(frame, feature); }
diff --git a/third_party/WebKit/Source/core/frame/Frame.cpp b/third_party/WebKit/Source/core/frame/Frame.cpp index 95a0e419..e979f67 100644 --- a/third_party/WebKit/Source/core/frame/Frame.cpp +++ b/third_party/WebKit/Source/core/frame/Frame.cpp
@@ -183,7 +183,7 @@ const bool isLocalActiveOrigin = activeSecurityOrigin.isLocal(); for (const Frame* ancestorFrame = targetFrame; ancestorFrame; ancestorFrame = ancestorFrame->tree().parent()) { - const SecurityOrigin* ancestorSecurityOrigin = ancestorFrame->securityContext()->securityOrigin(); + const SecurityOrigin* ancestorSecurityOrigin = ancestorFrame->securityContext()->getSecurityOrigin(); if (activeSecurityOrigin.canAccess(ancestorSecurityOrigin)) return true; @@ -221,8 +221,8 @@ return false; } - ASSERT(securityContext()->securityOrigin()); - SecurityOrigin& origin = *securityContext()->securityOrigin(); + ASSERT(securityContext()->getSecurityOrigin()); + SecurityOrigin& origin = *securityContext()->getSecurityOrigin(); // This is the normal case. A document can navigate its decendant frames, // or, more generally, a document can navigate a frame if the document is @@ -262,7 +262,7 @@ Frame* ancestorFrame = tree().parent(); while (ancestorFrame) { - if (!ancestorFrame->securityContext()->securityOrigin()->canAccess(securityContext()->securityOrigin())) + if (!ancestorFrame->securityContext()->getSecurityOrigin()->canAccess(securityContext()->getSecurityOrigin())) return currentFrame; currentFrame = ancestorFrame; ancestorFrame = ancestorFrame->tree().parent();
diff --git a/third_party/WebKit/Source/core/frame/Frame.h b/third_party/WebKit/Source/core/frame/Frame.h index c15b094..e0e2238 100644 --- a/third_party/WebKit/Source/core/frame/Frame.h +++ b/third_party/WebKit/Source/core/frame/Frame.h
@@ -131,7 +131,7 @@ void setIsLoading(bool isLoading) { m_isLoading = isLoading; } bool isLoading() const { return m_isLoading; } - virtual WindowProxyManager* windowProxyManager() const = 0; + virtual WindowProxyManager* getWindowProxyManager() const = 0; protected: Frame(FrameClient*, FrameHost*, FrameOwner*);
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp index c3cc2a0..5973ff2 100644 --- a/third_party/WebKit/Source/core/frame/FrameView.cpp +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -284,6 +284,14 @@ if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) scrollingCoordinator->willDestroyScrollableArea(this); + // We need to clear the RootFrameViewport's animator since it gets called + // from non-GC'd objects and RootFrameViewport will still have a pointer to + // this class. + if (m_viewportScrollableArea) + m_viewportScrollableArea->clearScrollAnimators(); + + clearScrollAnimators(); + // Destroy |m_autoSizeInfo| as early as possible, to avoid dereferencing // partially destroyed |this| via |m_autoSizeInfo->m_frameView|. m_autoSizeInfo.clear(); @@ -3743,11 +3751,8 @@ { LayoutRect viewRect(visibleContentRect()); LayoutRect exposeRect = ScrollAlignment::getRectToExpose(viewRect, rectInContent, alignX, alignY); - - double xOffset = exposeRect.x(); - double yOffset = exposeRect.y(); - - setScrollPosition(DoublePoint(xOffset, yOffset), scrollType); + if (exposeRect != viewRect) + setScrollPosition(DoublePoint(exposeRect.x(), exposeRect.y()), scrollType); // Scrolling the FrameView cannot change the input rect's location relative to the document. return rectInContent; @@ -4081,9 +4086,9 @@ // // Check if we can access our parent's security origin. m_crossOriginForThrottling = false; - const SecurityOrigin* origin = frame().securityContext()->securityOrigin(); + const SecurityOrigin* origin = frame().securityContext()->getSecurityOrigin(); for (Frame* parentFrame = m_frame->tree().parent(); parentFrame; parentFrame = parentFrame->tree().parent()) { - const SecurityOrigin* parentOrigin = parentFrame->securityContext()->securityOrigin(); + const SecurityOrigin* parentOrigin = parentFrame->securityContext()->getSecurityOrigin(); if (!origin->canAccess(parentOrigin)) { m_crossOriginForThrottling = true; break;
diff --git a/third_party/WebKit/Source/core/frame/History.cpp b/third_party/WebKit/Source/core/frame/History.cpp index b9d17ff..ac218016f 100644 --- a/third_party/WebKit/Source/core/frame/History.cpp +++ b/third_party/WebKit/Source/core/frame/History.cpp
@@ -212,9 +212,9 @@ return; KURL fullURL = urlForState(urlString); - if (!canChangeToUrl(fullURL, m_frame->document()->securityOrigin(), m_frame->document()->url())) { + if (!canChangeToUrl(fullURL, m_frame->document()->getSecurityOrigin(), m_frame->document()->url())) { // We can safely expose the URL to JavaScript, as a) no redirection takes place: JavaScript already had this URL, b) JavaScript can only access a same-origin History object. - exceptionState.throwSecurityError("A history state object with URL '" + fullURL.elidedString() + "' cannot be created in a document with origin '" + m_frame->document()->securityOrigin()->toString() + "' and URL '" + m_frame->document()->url().elidedString() + "'."); + exceptionState.throwSecurityError("A history state object with URL '" + fullURL.elidedString() + "' cannot be created in a document with origin '" + m_frame->document()->getSecurityOrigin()->toString() + "' and URL '" + m_frame->document()->url().elidedString() + "'."); return; }
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp index a3a1d3e3..072f78b 100644 --- a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp +++ b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
@@ -168,7 +168,7 @@ m_image = cropImage(image->cachedImage()->image(), cropRect, flipY, m_isPremultiplied, PremultiplyAlpha); if (!m_image) return; - m_image->setOriginClean(!image->wouldTaintOrigin(document->securityOrigin())); + m_image->setOriginClean(!image->wouldTaintOrigin(document->getSecurityOrigin())); } ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect, Document* document, const ImageBitmapOptions& options) @@ -199,7 +199,7 @@ } else { m_image = StaticBitmapImage::create(buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown)); } - m_image->setOriginClean(!video->wouldTaintOrigin(document->securityOrigin())); + m_image->setOriginClean(!video->wouldTaintOrigin(document->getSecurityOrigin())); } ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas, const IntRect& cropRect, const ImageBitmapOptions& options)
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp index 42d770e..3b20c40d 100644 --- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp +++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -123,7 +123,7 @@ , m_userGestureToken(userGestureToken) , m_disposalAllowed(true) { - m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(executionContext(), "postMessage"); + m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(getExecutionContext(), "postMessage"); } PassRefPtrWillBeRawPtr<MessageEvent> event() const { return m_event.get(); } @@ -153,7 +153,7 @@ private: void fired() override { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(getExecutionContext(), m_asyncOperationId); m_disposalAllowed = false; m_window->postMessageTimerFired(this); dispose(); @@ -374,7 +374,7 @@ return m_document; } -EventQueue* LocalDOMWindow::eventQueue() const +EventQueue* LocalDOMWindow::getEventQueue() const { return m_eventQueue.get(); } @@ -478,7 +478,7 @@ removeAllEventListeners(); } -ExecutionContext* LocalDOMWindow::executionContext() const +ExecutionContext* LocalDOMWindow::getExecutionContext() const { return m_document.get(); } @@ -714,8 +714,8 @@ { if (intendedTargetOrigin) { // Check target origin now since the target document may have changed since the timer was scheduled. - if (!intendedTargetOrigin->isSameSchemeHostPortAndSuborigin(document()->securityOrigin())) { - String message = ExceptionMessages::failedToExecute("postMessage", "DOMWindow", "The target origin provided ('" + intendedTargetOrigin->toString() + "') does not match the recipient window's origin ('" + document()->securityOrigin()->toString() + "')."); + if (!intendedTargetOrigin->isSameSchemeHostPortAndSuborigin(document()->getSecurityOrigin())) { + String message = ExceptionMessages::failedToExecute("postMessage", "DOMWindow", "The target origin provided ('" + intendedTargetOrigin->toString() + "') does not match the recipient window's origin ('" + document()->getSecurityOrigin()->toString() + "')."); RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, message); consoleMessage->setCallStack(stackTrace); frameConsole()->addMessage(consoleMessage.release());
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h index 7145596..246acb9 100644 --- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h +++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
@@ -80,7 +80,7 @@ PassRefPtrWillBeRawPtr<Document> installNewDocument(const String& mimeType, const DocumentInit&, bool forceXHTML = false); // EventTarget overrides: - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; const LocalDOMWindow* toDOMWindow() const override; LocalDOMWindow* toDOMWindow() override; @@ -185,7 +185,7 @@ void willDetachDocumentFromFrame(); - EventQueue* eventQueue() const; + EventQueue* getEventQueue() const; void enqueueWindowEvent(PassRefPtrWillBeRawPtr<Event>); void enqueueDocumentEvent(PassRefPtrWillBeRawPtr<Event>); void enqueuePageshowEvent(PageshowEventPersistence);
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp index a669f98e0..a88b065f 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp +++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -377,15 +377,15 @@ { // URLs aren't available for RemoteFrames, so the error message uses their // origin instead. - String targetFrameDescription = targetFrame.isLocalFrame() ? "with URL '" + toLocalFrame(targetFrame).document()->url().getString() + "'" : "with origin '" + targetFrame.securityContext()->securityOrigin()->toString() + "'"; + String targetFrameDescription = targetFrame.isLocalFrame() ? "with URL '" + toLocalFrame(targetFrame).document()->url().getString() + "'" : "with origin '" + targetFrame.securityContext()->getSecurityOrigin()->toString() + "'"; String message = "Unsafe JavaScript attempt to initiate navigation for frame " + targetFrameDescription + " from frame with URL '" + document()->url().getString() + "'. " + reason + "\n"; localDOMWindow()->printErrorMessage(message); } -WindowProxyManager* LocalFrame::windowProxyManager() const +WindowProxyManager* LocalFrame::getWindowProxyManager() const { - return m_script->windowProxyManager(); + return m_script->getWindowProxyManager(); } void LocalFrame::disconnectOwnerElement()
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.h b/third_party/WebKit/Source/core/frame/LocalFrame.h index ba26f84b..f2680cf8 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.h +++ b/third_party/WebKit/Source/core/frame/LocalFrame.h
@@ -196,7 +196,7 @@ bool shouldScrollTopControls(const FloatSize& delta) const; // Internal Frame helper overrides: - WindowProxyManager* windowProxyManager() const override; + WindowProxyManager* getWindowProxyManager() const override; String localLayerTreeAsText(unsigned flags) const;
diff --git a/third_party/WebKit/Source/core/frame/Location.cpp b/third_party/WebKit/Source/core/frame/Location.cpp index 41184f7..5a4b03d 100644 --- a/third_party/WebKit/Source/core/frame/Location.cpp +++ b/third_party/WebKit/Source/core/frame/Location.cpp
@@ -123,7 +123,7 @@ if (!m_frame) return origins.release(); for (Frame* frame = m_frame->tree().parent(); frame; frame = frame->tree().parent()) - origins->append(frame->securityContext()->securityOrigin()->toString()); + origins->append(frame->securityContext()->getSecurityOrigin()->toString()); return origins.release(); }
diff --git a/third_party/WebKit/Source/core/frame/OriginsUsingFeatures.cpp b/third_party/WebKit/Source/core/frame/OriginsUsingFeatures.cpp index 696e8df..8f4cbb4 100644 --- a/third_party/WebKit/Source/core/frame/OriginsUsingFeatures.cpp +++ b/third_party/WebKit/Source/core/frame/OriginsUsingFeatures.cpp
@@ -35,7 +35,7 @@ static Document* documentFromEventTarget(EventTarget& target) { - ExecutionContext* executionContext = target.executionContext(); + ExecutionContext* executionContext = target.getExecutionContext(); if (!executionContext) return nullptr; if (executionContext->isDocument())
diff --git a/third_party/WebKit/Source/core/frame/RemoteDOMWindow.cpp b/third_party/WebKit/Source/core/frame/RemoteDOMWindow.cpp index 9a11eb9..a85da55 100644 --- a/third_party/WebKit/Source/core/frame/RemoteDOMWindow.cpp +++ b/third_party/WebKit/Source/core/frame/RemoteDOMWindow.cpp
@@ -11,7 +11,7 @@ namespace blink { -ExecutionContext* RemoteDOMWindow::executionContext() const +ExecutionContext* RemoteDOMWindow::getExecutionContext() const { return nullptr; }
diff --git a/third_party/WebKit/Source/core/frame/RemoteDOMWindow.h b/third_party/WebKit/Source/core/frame/RemoteDOMWindow.h index e269f3e0..73e91131 100644 --- a/third_party/WebKit/Source/core/frame/RemoteDOMWindow.h +++ b/third_party/WebKit/Source/core/frame/RemoteDOMWindow.h
@@ -18,7 +18,7 @@ } // EventTarget overrides: - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // DOMWindow overrides: DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrame.h b/third_party/WebKit/Source/core/frame/RemoteFrame.h index c909026..d24a3ba 100644 --- a/third_party/WebKit/Source/core/frame/RemoteFrame.h +++ b/third_party/WebKit/Source/core/frame/RemoteFrame.h
@@ -65,7 +65,7 @@ RemoteFrame(RemoteFrameClient*, FrameHost*, FrameOwner*); // Internal Frame helper overrides: - WindowProxyManager* windowProxyManager() const override { return m_windowProxyManager.get(); } + WindowProxyManager* getWindowProxyManager() const override { return m_windowProxyManager.get(); } RemoteFrameClient* remoteFrameClient() const;
diff --git a/third_party/WebKit/Source/core/frame/RootFrameViewport.cpp b/third_party/WebKit/Source/core/frame/RootFrameViewport.cpp index 48e18c4..b718b509 100644 --- a/third_party/WebKit/Source/core/frame/RootFrameViewport.cpp +++ b/third_party/WebKit/Source/core/frame/RootFrameViewport.cpp
@@ -109,9 +109,8 @@ LayoutRect viewRectInContent = intersection(visualRectInContent, frameRectInContent); LayoutRect targetViewport = ScrollAlignment::getRectToExpose(viewRectInContent, rectInContent, alignX, alignY); - DoublePoint targetOffset(targetViewport.x(), targetViewport.y()); - - setScrollPosition(targetOffset, scrollType, ScrollBehaviorInstant); + if (targetViewport != viewRectInContent) + setScrollPosition(DoublePoint(targetViewport.x(), targetViewport.y()), scrollType); // RootFrameViewport only changes the viewport relative to the document so we can't change the input // rect's location relative to the document origin. @@ -335,6 +334,13 @@ return visualViewport().widget(); } +void RootFrameViewport::clearScrollAnimators() +{ + ScrollableArea::clearScrollAnimators(); + layoutViewport().clearScrollAnimators(); + visualViewport().clearScrollAnimators(); +} + DEFINE_TRACE(RootFrameViewport) { visitor->trace(m_visualViewport);
diff --git a/third_party/WebKit/Source/core/frame/RootFrameViewport.h b/third_party/WebKit/Source/core/frame/RootFrameViewport.h index 3bb9aea..4640615 100644 --- a/third_party/WebKit/Source/core/frame/RootFrameViewport.h +++ b/third_party/WebKit/Source/core/frame/RootFrameViewport.h
@@ -70,6 +70,7 @@ void cancelProgrammaticScrollAnimation() override; ScrollBehavior scrollBehaviorStyle() const override; Widget* widget() override; + void clearScrollAnimators() override; private: RootFrameViewport(ScrollableArea& visualViewport, ScrollableArea& layoutViewport);
diff --git a/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp b/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp index 8626d53c..4f9f3cd9 100644 --- a/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp +++ b/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp
@@ -121,7 +121,7 @@ { Document& document = element.document(); - if (!resource.isEligibleForIntegrityCheck(document.securityOrigin())) { + if (!resource.isEligibleForIntegrityCheck(document.getSecurityOrigin())) { UseCounter::count(document, UseCounter::SRIElementIntegrityAttributeButIneligible); logErrorToConsole("Subresource Integrity: The resource '" + resourceUrl.elidedString() + "' has an integrity attribute, but the resource requires the request to be CORS enabled to check the integrity, and it is not. The resource has been blocked because the integrity cannot be enforced.", document); return false;
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.cpp b/third_party/WebKit/Source/core/frame/UseCounter.cpp index 7815f13..7ab2b2d 100644 --- a/third_party/WebKit/Source/core/frame/UseCounter.cpp +++ b/third_party/WebKit/Source/core/frame/UseCounter.cpp
@@ -741,9 +741,9 @@ if (!frame) return; // Check to see if the frame can script into the top level document. - SecurityOrigin* securityOrigin = frame->securityContext()->securityOrigin(); + SecurityOrigin* securityOrigin = frame->securityContext()->getSecurityOrigin(); Frame* top = frame->tree().top(); - if (top && !securityOrigin->canAccess(top->securityContext()->securityOrigin())) + if (top && !securityOrigin->canAccess(top->securityContext()->getSecurityOrigin())) count(frame, feature); }
diff --git a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp index 3b59427..306f3a89 100644 --- a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp +++ b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp
@@ -156,7 +156,7 @@ // // TODO(mkwst): Move this check up into the browser process. See // https://crbug.com/555418. - KURL url(KURL(), current->securityContext()->securityOrigin()->toString()); + KURL url(KURL(), current->securityContext()->getSecurityOrigin()->toString()); if (!directive->allows(url, ContentSecurityPolicy::DidNotRedirect)) return false; }
diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp index 6827097..f1c88b8 100644 --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
@@ -56,6 +56,7 @@ #include "platform/weborigin/SchemeRegistry.h" #include "platform/weborigin/SecurityOrigin.h" #include "public/platform/Platform.h" +#include "public/platform/WebAddressSpace.h" #include "public/platform/WebURLRequest.h" #include "wtf/StringHasher.h" #include "wtf/text/StringBuilder.h" @@ -159,10 +160,10 @@ void ContentSecurityPolicy::applyPolicySideEffectsToExecutionContext() { ASSERT(m_executionContext); - ASSERT(securityOrigin()); + ASSERT(getSecurityOrigin()); // Ensure that 'self' processes correctly. - m_selfProtocol = securityOrigin()->protocol(); - m_selfSource = adoptPtr(new CSPSource(this, m_selfProtocol, securityOrigin()->host(), securityOrigin()->port(), String(), CSPSource::NoWildcard, CSPSource::NoWildcard)); + m_selfProtocol = getSecurityOrigin()->protocol(); + m_selfSource = adoptPtr(new CSPSource(this, m_selfProtocol, getSecurityOrigin()->host(), getSecurityOrigin()->port(), String(), CSPSource::NoWildcard, CSPSource::NoWildcard)); if (didSetReferrerPolicy()) m_executionContext->setReferrerPolicy(m_referrerPolicy); @@ -177,12 +178,12 @@ if (m_enforceStrictMixedContentChecking) document->enforceStrictMixedContentChecking(); if (m_treatAsPublicAddress) - document->setAddressSpace(WebURLRequest::AddressSpacePublic); + document->setAddressSpace(WebAddressSpacePublic); if (m_insecureRequestsPolicy == SecurityContext::InsecureRequestsUpgrade) { UseCounter::count(document, UseCounter::UpgradeInsecureRequestsEnabled); document->setInsecureRequestsPolicy(m_insecureRequestsPolicy); - if (!securityOrigin()->host().isNull()) - document->addInsecureNavigationUpgrade(securityOrigin()->host().impl()->hash()); + if (!getSecurityOrigin()->host().isNull()) + document->addInsecureNavigationUpgrade(getSecurityOrigin()->host().impl()->hash()); } for (const auto& consoleMessage : m_consoleMessages) @@ -702,9 +703,9 @@ return false; } -SecurityOrigin* ContentSecurityPolicy::securityOrigin() const +SecurityOrigin* ContentSecurityPolicy::getSecurityOrigin() const { - return m_executionContext->securityContext().securityOrigin(); + return m_executionContext->securityContext().getSecurityOrigin(); } const KURL ContentSecurityPolicy::url() const @@ -746,7 +747,7 @@ return String(); if (!url.isHierarchical() || url.protocolIs("file")) return url.protocol(); - return document->securityOrigin()->canRequest(url) ? url.strippedForUseAsReferrer() : SecurityOrigin::create(url)->toString(); + return document->getSecurityOrigin()->canRequest(url) ? url.strippedForUseAsReferrer() : SecurityOrigin::create(url)->toString(); } static void gatherSecurityPolicyViolationEventData(SecurityPolicyViolationEventInit& init, Document* document, const String& directiveText, const String& effectiveDirective, const KURL& blockedURL, const String& header) @@ -1036,7 +1037,7 @@ // if we're in a context that bypasses Content Security Policy in the main world. // // TODO(mkwst): Revisit this once embedders have an opportunity to update their extension models. - return m_executionContext && SchemeRegistry::schemeShouldBypassContentSecurityPolicy(m_executionContext->securityOrigin()->protocol()); + return m_executionContext && SchemeRegistry::schemeShouldBypassContentSecurityPolicy(m_executionContext->getSecurityOrigin()->protocol()); } bool ContentSecurityPolicy::shouldBypassMainWorld(const ExecutionContext* context)
diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.h b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.h index bc32fa2..32d16af 100644 --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.h +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.h
@@ -277,7 +277,7 @@ void applyPolicySideEffectsToExecutionContext(); - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; KURL completeURL(const String&) const; void logToConsole(const String& message, MessageLevel = ErrorMessageLevel);
diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicyTest.cpp b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicyTest.cpp index 60b2495..b3f5d81d9 100644 --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicyTest.cpp +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicyTest.cpp
@@ -11,7 +11,7 @@ #include "platform/network/ResourceRequest.h" #include "platform/weborigin/KURL.h" #include "platform/weborigin/SecurityOrigin.h" -#include "public/platform/WebURLRequest.h" +#include "public/platform/WebAddressSpace.h" #include "testing/gtest/include/gtest/gtest.h" namespace blink { @@ -61,23 +61,23 @@ TEST_F(ContentSecurityPolicyTest, ParseEnforceTreatAsPublicAddressDisabled) { RuntimeEnabledFeatures::setCorsRFC1918Enabled(false); - document->setAddressSpace(WebURLRequest::AddressSpacePrivate); - EXPECT_EQ(WebURLRequest::AddressSpacePrivate, document->addressSpace()); + document->setAddressSpace(WebAddressSpacePrivate); + EXPECT_EQ(WebAddressSpacePrivate, document->addressSpace()); csp->didReceiveHeader("treat-as-public-address", ContentSecurityPolicyHeaderTypeEnforce, ContentSecurityPolicyHeaderSourceHTTP); csp->bindToExecutionContext(document.get()); - EXPECT_EQ(WebURLRequest::AddressSpacePrivate, document->addressSpace()); + EXPECT_EQ(WebAddressSpacePrivate, document->addressSpace()); } TEST_F(ContentSecurityPolicyTest, ParseEnforceTreatAsPublicAddressEnabled) { RuntimeEnabledFeatures::setCorsRFC1918Enabled(true); - document->setAddressSpace(WebURLRequest::AddressSpacePrivate); - EXPECT_EQ(WebURLRequest::AddressSpacePrivate, document->addressSpace()); + document->setAddressSpace(WebAddressSpacePrivate); + EXPECT_EQ(WebAddressSpacePrivate, document->addressSpace()); csp->didReceiveHeader("treat-as-public-address", ContentSecurityPolicyHeaderTypeEnforce, ContentSecurityPolicyHeaderSourceHTTP); csp->bindToExecutionContext(document.get()); - EXPECT_EQ(WebURLRequest::AddressSpacePublic, document->addressSpace()); + EXPECT_EQ(WebAddressSpacePublic, document->addressSpace()); } TEST_F(ContentSecurityPolicyTest, CopyStateFrom)
diff --git a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp index 76936724..f858f4ff 100644 --- a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
@@ -343,7 +343,7 @@ if (hasAttribute(downloadAttr)) { request.setRequestContext(WebURLRequest::RequestContextDownload); - bool isSameOrigin = completedURL.protocolIsData() || document().securityOrigin()->canRequest(completedURL); + bool isSameOrigin = completedURL.protocolIsData() || document().getSecurityOrigin()->canRequest(completedURL); const AtomicString& suggestedName = (isSameOrigin ? fastGetAttribute(downloadAttr) : nullAtom); frame->loader().client()->loadURLExternally(request, NavigationPolicyDownload, suggestedName, false);
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp index 282719c7..9206c3f 100644 --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
@@ -635,9 +635,9 @@ m_listeners.remove(listener); } -SecurityOrigin* HTMLCanvasElement::securityOrigin() const +SecurityOrigin* HTMLCanvasElement::getSecurityOrigin() const { - return document().securityOrigin(); + return document().getSecurityOrigin(); } bool HTMLCanvasElement::originClean() const
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.h b/third_party/WebKit/Source/core/html/HTMLCanvasElement.h index e9ee1b4..21f6e93 100644 --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.h +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.h
@@ -125,7 +125,7 @@ PassRefPtr<Image> copiedImage(SourceDrawingBuffer, AccelerationHint) const; void clearCopiedImage(); - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; bool originClean() const; void setOriginTainted() { m_originClean = false; }
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp index 45cf6917..42ebd73 100644 --- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
@@ -283,7 +283,7 @@ return true; } - if (!document().securityOrigin()->canDisplay(url)) { + if (!document().getSecurityOrigin()->canDisplay(url)) { FrameLoader::reportLocalLoadFailed(parentFrame.get(), url.getString()); return false; }
diff --git a/third_party/WebKit/Source/core/html/HTMLKeygenElement.cpp b/third_party/WebKit/Source/core/html/HTMLKeygenElement.cpp index 90b3c40..97a5741 100644 --- a/third_party/WebKit/Source/core/html/HTMLKeygenElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLKeygenElement.cpp
@@ -105,7 +105,7 @@ const AtomicString& keyType = fastGetAttribute(keytypeAttr); if (!keyType.isNull() && !equalIgnoringCase(keyType, "rsa")) return; - SecurityOrigin* topOrigin = document().frame()->tree().top()->securityContext()->securityOrigin(); + SecurityOrigin* topOrigin = document().frame()->tree().top()->securityContext()->getSecurityOrigin(); String value = Platform::current()->signedPublicKeyAndChallengeString( shadowSelect()->selectedIndex(), fastGetAttribute(challengeAttr), document().baseURL(), KURL(KURL(), topOrigin->toString()));
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp index f6d32a7a5..6bc0897a 100644 --- a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
@@ -570,7 +570,7 @@ m_sheet->setTitle(m_owner->title()); setCrossOriginStylesheetStatus(m_sheet.get()); - styleSheet->parseAuthorStyleSheet(cachedStyleSheet, m_owner->document().securityOrigin()); + styleSheet->parseAuthorStyleSheet(cachedStyleSheet, m_owner->document().getSecurityOrigin()); m_loading = false; styleSheet->notifyLoadedSheet(cachedStyleSheet); @@ -692,7 +692,7 @@ if (m_fetchFollowingCORS && resource() && !resource()->errorOccurred()) { // Record the security origin the CORS access check succeeded at, if cross origin. // Only origins that are script accessible to it may access the stylesheet's rules. - sheet->setAllowRuleAccessFromOrigin(m_owner->document().securityOrigin()); + sheet->setAllowRuleAccessFromOrigin(m_owner->document().getSecurityOrigin()); } m_fetchFollowingCORS = false; } @@ -707,7 +707,7 @@ if (m_owner->relAttribute().getIconType() != InvalidIcon && builder.url().isValid() && !builder.url().isEmpty()) { if (!m_owner->shouldLoadLink()) return; - if (!document().securityOrigin()->canDisplay(builder.url())) + if (!document().getSecurityOrigin()->canDisplay(builder.url())) return; if (!document().contentSecurityPolicy()->allowImageFromSource(builder.url())) return; @@ -750,7 +750,7 @@ FetchRequest request = builder.build(lowPriority); CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(m_owner->fastGetAttribute(HTMLNames::crossoriginAttr)); if (crossOrigin != CrossOriginAttributeNotSet) { - request.setCrossOriginAccessControl(document().securityOrigin(), crossOrigin); + request.setCrossOriginAccessControl(document().getSecurityOrigin(), crossOrigin); setFetchFollowingCORS(); } setResource(CSSStyleSheetResource::fetch(request, document().fetcher()));
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp index 854d842..843fe17 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -422,7 +422,7 @@ // to update the delayed load count. But if the Document hasn't // been detached cleanly from any frame or it isn't dying in the // same GC, we do update the delayed load count from the prefinalizer. - if (ActiveDOMObject::executionContext()) + if (ActiveDOMObject::getExecutionContext()) setShouldDelayLoadEvent(false); // If the MediaSource object survived, notify that the media element @@ -1034,7 +1034,7 @@ if (layoutObject()) layoutObject()->setShouldDoFullPaintInvalidation(); // Make sure if we create/re-create the WebMediaPlayer that we update our wrapper. - m_audioSourceProvider.wrap(m_webMediaPlayer->audioSourceProvider()); + m_audioSourceProvider.wrap(m_webMediaPlayer->getAudioSourceProvider()); m_webMediaPlayer->setVolume(effectiveMediaVolume()); m_webMediaPlayer->setPoster(posterImageURL()); @@ -1190,7 +1190,7 @@ } LocalFrame* frame = document().frame(); - if (!frame || !document().securityOrigin()->canDisplay(url)) { + if (!frame || !document().getSecurityOrigin()->canDisplay(url)) { if (actionIfInvalid == Complain) FrameLoader::reportLocalLoadFailed(frame, url.elidedString()); WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> FALSE rejected by SecurityOrigin", this, urlForLoggingMedia(url).utf8().data()); @@ -3069,7 +3069,7 @@ void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLocking() { - audioSourceProvider().setClient(nullptr); + getAudioSourceProvider().setClient(nullptr); if (m_webMediaPlayer) { m_audioSourceProvider.wrap(nullptr); m_webMediaPlayer.clear(); @@ -3502,7 +3502,7 @@ m_playingRemotely = false; if (m_audioSourceNode) - audioSourceProvider().setClient(m_audioSourceNode); + getAudioSourceProvider().setClient(m_audioSourceNode); } void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) @@ -3511,7 +3511,7 @@ m_audioSourceNode = sourceNode; AudioSourceProviderClientLockScope scope(*this); - audioSourceProvider().setClient(m_audioSourceNode); + getAudioSourceProvider().setClient(m_audioSourceNode); } void HTMLMediaElement::setAllowHiddenVolumeControls(bool allow) @@ -3727,7 +3727,7 @@ void HTMLMediaElement::clearWeakMembers(Visitor* visitor) { if (!Heap::isHeapObjectAlive(m_audioSourceNode)) - audioSourceProvider().setClient(nullptr); + getAudioSourceProvider().setClient(nullptr); } void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* provider)
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.h b/third_party/WebKit/Source/core/html/HTMLMediaElement.h index 5f22ef0..a388248 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.h +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.h
@@ -203,7 +203,7 @@ // causes an ambiguity error at compile time. This class's constructor // ensures that both implementations return document, so return the result // of one of them here. - using HTMLElement::executionContext; + using HTMLElement::getExecutionContext; bool hasSingleSecurityOrigin() const { return webMediaPlayer() && webMediaPlayer()->hasSingleSecurityOrigin(); } @@ -236,7 +236,7 @@ AudioSourceProviderClient* audioSourceNode() { return m_audioSourceNode; } void setAudioSourceNode(AudioSourceProviderClient*); - AudioSourceProvider& audioSourceProvider() { return m_audioSourceProvider; } + AudioSourceProvider& getAudioSourceProvider() { return m_audioSourceProvider; } enum InvalidURLAction { DoNothing, Complain }; bool isSafeToLoadURL(const KURL&, InvalidURLAction);
diff --git a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp index 088e801..921c864 100644 --- a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp
@@ -453,7 +453,7 @@ { KURL completeURL = document().completeURL(url); if (contentFrame() && protocolIsJavaScript(completeURL) - && !document().securityOrigin()->canAccess(contentFrame()->securityContext()->securityOrigin())) + && !document().getSecurityOrigin()->canAccess(contentFrame()->securityContext()->getSecurityOrigin())) return false; return document().frame()->isURLAllowed(completeURL); } @@ -583,7 +583,7 @@ if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) return false; - if (!document().securityOrigin()->canDisplay(url)) { + if (!document().getSecurityOrigin()->canDisplay(url)) { FrameLoader::reportLocalLoadFailed(frame, url.getString()); return false; }
diff --git a/third_party/WebKit/Source/core/html/HTMLTextFormControlElement.cpp b/third_party/WebKit/Source/core/html/HTMLTextFormControlElement.cpp index 35b4b14..9d23449 100644 --- a/third_party/WebKit/Source/core/html/HTMLTextFormControlElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLTextFormControlElement.cpp
@@ -38,6 +38,7 @@ #include "core/editing/FrameSelection.h" #include "core/editing/iterators/CharacterIterator.h" #include "core/editing/iterators/TextIterator.h" +#include "core/editing/serializers/Serialization.h" #include "core/events/Event.h" #include "core/frame/LocalFrame.h" #include "core/frame/UseCounter.h" @@ -635,7 +636,11 @@ if (isHTMLBRElement(innerEditor->lastChild())) innerEditor->removeChild(innerEditor->lastChild(), ASSERT_NO_EXCEPTION); - innerEditor->setInnerText(value, ASSERT_NO_EXCEPTION); + // We don't use setTextContent. It triggers unnecessary paint. + if (value.isEmpty()) + innerEditor->removeChildren(); + else + replaceChildrenWithText(innerEditor, value, ASSERT_NO_EXCEPTION); if (value.endsWith('\n') || value.endsWith('\r')) innerEditor->appendChild(HTMLBRElement::create(document()));
diff --git a/third_party/WebKit/Source/core/html/PublicURLManager.cpp b/third_party/WebKit/Source/core/html/PublicURLManager.cpp index bf44c55..92bf4a7 100644 --- a/third_party/WebKit/Source/core/html/PublicURLManager.cpp +++ b/third_party/WebKit/Source/core/html/PublicURLManager.cpp
@@ -76,7 +76,7 @@ for (auto& registeredUrl : registeredURLs) { if (uuid == registeredUrl.value) { KURL url(ParsedURLString, registeredUrl.key); - executionContext()->removeURLFromMemoryCache(url); + getExecutionContext()->removeURLFromMemoryCache(url); registry->unregisterURL(url); urlsToRemove.append(registeredUrl.key); }
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp index 696fccc..e58ca02 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp +++ b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
@@ -71,7 +71,7 @@ return true; } - bool taintOrigin = imageSource->wouldTaintOrigin(canvas()->securityOrigin()); + bool taintOrigin = imageSource->wouldTaintOrigin(canvas()->getSecurityOrigin()); if (hasURL) { if (taintOrigin)
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp b/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp index ade5d0e..f73104b9 100644 --- a/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp +++ b/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp
@@ -124,7 +124,7 @@ return child; } - request.setCrossOriginAccessControl(master()->securityOrigin(), CrossOriginAttributeAnonymous); + request.setCrossOriginAccessControl(master()->getSecurityOrigin(), CrossOriginAttributeAnonymous); RefPtrWillBeRawPtr<RawResource> resource = RawResource::fetchImport(request, parent->document()->fetcher()); if (!resource) return nullptr;
diff --git a/third_party/WebKit/Source/core/html/parser/PreloadRequest.cpp b/third_party/WebKit/Source/core/html/parser/PreloadRequest.cpp index dbbdd2d..8093323 100644 --- a/third_party/WebKit/Source/core/html/parser/PreloadRequest.cpp +++ b/third_party/WebKit/Source/core/html/parser/PreloadRequest.cpp
@@ -38,11 +38,11 @@ FetchRequest request(resourceRequest, initiatorInfo); if (m_resourceType == Resource::ImportResource) { - SecurityOrigin* securityOrigin = document->contextDocument()->securityOrigin(); + SecurityOrigin* securityOrigin = document->contextDocument()->getSecurityOrigin(); request.setCrossOriginAccessControl(securityOrigin, CrossOriginAttributeAnonymous); } if (m_crossOrigin != CrossOriginAttributeNotSet) - request.setCrossOriginAccessControl(document->securityOrigin(), m_crossOrigin); + request.setCrossOriginAccessControl(document->getSecurityOrigin(), m_crossOrigin); request.setDefer(m_defer); request.setResourceWidth(m_resourceWidth); request.clientHintsPreferences().updateFrom(m_clientHintsPreferences);
diff --git a/third_party/WebKit/Source/core/html/parser/XSSAuditor.cpp b/third_party/WebKit/Source/core/html/parser/XSSAuditor.cpp index 069bba1..54b8cff2 100644 --- a/third_party/WebKit/Source/core/html/parser/XSSAuditor.cpp +++ b/third_party/WebKit/Source/core/html/parser/XSSAuditor.cpp
@@ -344,7 +344,7 @@ m_didSendValidXSSProtectionHeader = xssProtectionHeader != ReflectedXSSUnset && xssProtectionHeader != ReflectedXSSInvalid; if ((xssProtectionHeader == FilterReflectedXSS || xssProtectionHeader == BlockReflectedXSS) && !reportURL.isEmpty()) { xssProtectionReportURL = document->completeURL(reportURL); - if (MixedContentChecker::isMixedContent(document->securityOrigin(), xssProtectionReportURL)) { + if (MixedContentChecker::isMixedContent(document->getSecurityOrigin(), xssProtectionReportURL)) { errorDetails = "insecure reporting URL for secure page"; xssProtectionHeader = ReflectedXSSInvalid; xssProtectionReportURL = KURL();
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp index 5b76bf6..36ef451 100644 --- a/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp +++ b/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp
@@ -39,9 +39,9 @@ #include "core/html/TimeRanges.h" #include "core/html/shadow/MediaControls.h" #include "core/input/EventHandler.h" -#include "core/layout/LayoutSlider.h" #include "core/layout/LayoutTheme.h" #include "core/layout/LayoutVideo.h" +#include "core/layout/api/LayoutSliderItem.h" #include "platform/Histogram.h" #include "platform/RuntimeEnabledFeatures.h" @@ -74,8 +74,8 @@ return true; // Some events are only captured during a slider drag. - LayoutSlider* slider = toLayoutSlider(layoutObject); - if (slider && !slider->inDragMode()) + LayoutSliderItem slider = LayoutSliderItem(toLayoutSlider(layoutObject)); + if (!slider.isNull() && !slider.inDragMode()) return false; const AtomicString& type = event->type(); @@ -412,8 +412,8 @@ mediaElement().setCurrentTime(time); } - LayoutSlider* slider = toLayoutSlider(layoutObject()); - if (slider && slider->inDragMode()) + LayoutSliderItem slider = LayoutSliderItem(toLayoutSlider(layoutObject())); + if (!slider.isNull() && slider.inDragMode()) mediaControls().updateCurrentTimeDisplay(); }
diff --git a/third_party/WebKit/Source/core/html/track/TextTrack.cpp b/third_party/WebKit/Source/core/html/track/TextTrack.cpp index 2f122e2..9cdcaf2 100644 --- a/third_party/WebKit/Source/core/html/track/TextTrack.cpp +++ b/third_party/WebKit/Source/core/html/track/TextTrack.cpp
@@ -448,10 +448,10 @@ return EventTargetNames::TextTrack; } -ExecutionContext* TextTrack::executionContext() const +ExecutionContext* TextTrack::getExecutionContext() const { HTMLMediaElement* owner = mediaElement(); - return owner ? owner->executionContext() : 0; + return owner ? owner->getExecutionContext() : 0; } HTMLMediaElement* TextTrack::mediaElement() const
diff --git a/third_party/WebKit/Source/core/html/track/TextTrack.h b/third_party/WebKit/Source/core/html/track/TextTrack.h index cf93726..5b072a5 100644 --- a/third_party/WebKit/Source/core/html/track/TextTrack.h +++ b/third_party/WebKit/Source/core/html/track/TextTrack.h
@@ -115,7 +115,7 @@ // EventTarget methods const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/html/track/TextTrackList.cpp b/third_party/WebKit/Source/core/html/track/TextTrackList.cpp index e6169d8..82aed0d5 100644 --- a/third_party/WebKit/Source/core/html/track/TextTrackList.cpp +++ b/third_party/WebKit/Source/core/html/track/TextTrackList.cpp
@@ -257,9 +257,9 @@ return EventTargetNames::TextTrackList; } -ExecutionContext* TextTrackList::executionContext() const +ExecutionContext* TextTrackList::getExecutionContext() const { - return m_owner ? m_owner->executionContext() : 0; + return m_owner ? m_owner->getExecutionContext() : 0; } #if !ENABLE(OILPAN)
diff --git a/third_party/WebKit/Source/core/html/track/TextTrackList.h b/third_party/WebKit/Source/core/html/track/TextTrackList.h index 9fc73e2..e2057f5e 100644 --- a/third_party/WebKit/Source/core/html/track/TextTrackList.h +++ b/third_party/WebKit/Source/core/html/track/TextTrackList.h
@@ -62,7 +62,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; DEFINE_ATTRIBUTE_EVENT_LISTENER(addtrack); DEFINE_ATTRIBUTE_EVENT_LISTENER(change);
diff --git a/third_party/WebKit/Source/core/html/track/TrackListBase.h b/third_party/WebKit/Source/core/html/track/TrackListBase.h index 522e428..f044b60 100644 --- a/third_party/WebKit/Source/core/html/track/TrackListBase.h +++ b/third_party/WebKit/Source/core/html/track/TrackListBase.h
@@ -53,10 +53,10 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(removetrack); // EventTarget interface - ExecutionContext* executionContext() const override + ExecutionContext* getExecutionContext() const override { if (m_mediaElement) - return m_mediaElement->executionContext(); + return m_mediaElement->getExecutionContext(); return nullptr; }
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp index eb462a3..7a7a2da 100644 --- a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp +++ b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp
@@ -1127,10 +1127,10 @@ CSSPropertyFontSize, settings->textTrackTextSize()); } -ExecutionContext* VTTCue::executionContext() const +ExecutionContext* VTTCue::getExecutionContext() const { ASSERT(m_cueBackgroundBox); - return m_cueBackgroundBox->executionContext(); + return m_cueBackgroundBox->getExecutionContext(); } Document& VTTCue::document() const
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h index 0fde730..0b495c2 100644 --- a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h +++ b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h
@@ -141,7 +141,7 @@ }; CueAlignment getCueAlignment() const { return m_cueAlignment; } - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; #ifndef NDEBUG String toString() const override;
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp index 22d2cd21..65f1577 100644 --- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp +++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp
@@ -74,7 +74,7 @@ ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, const ImageBitmapSourceUnion& bitmapSource, ExceptionState& exceptionState) { UseCounter::Feature feature = UseCounter::CreateImageBitmap; - UseCounter::count(scriptState->executionContext(), feature); + UseCounter::count(scriptState->getExecutionContext(), feature); ImageBitmapOptions options; return createImageBitmap(scriptState, eventTarget, bitmapSource, options, exceptionState); } @@ -87,7 +87,7 @@ ImageBitmapLoader* loader = ImageBitmapFactories::ImageBitmapLoader::create(from(eventTarget), IntRect(), options, scriptState); ScriptPromise promise = loader->promise(); from(eventTarget).addLoader(loader); - loader->loadBlobAsync(eventTarget.executionContext(), blob); + loader->loadBlobAsync(eventTarget.getExecutionContext(), blob); return promise; } IntSize srcSize = bitmapSourceInternal->bitmapSourceSize(); @@ -97,7 +97,7 @@ ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, const ImageBitmapSourceUnion& bitmapSource, int sx, int sy, int sw, int sh, ExceptionState& exceptionState) { UseCounter::Feature feature = UseCounter::CreateImageBitmap; - UseCounter::count(scriptState->executionContext(), feature); + UseCounter::count(scriptState->getExecutionContext(), feature); ImageBitmapOptions options; return createImageBitmap(scriptState, eventTarget, bitmapSource, sx, sy, sw, sh, options, exceptionState); } @@ -119,7 +119,7 @@ ImageBitmapLoader* loader = ImageBitmapFactories::ImageBitmapLoader::create(from(eventTarget), IntRect(sx, sy, sw, sh), options, scriptState); ScriptPromise promise = loader->promise(); from(eventTarget).addLoader(loader); - loader->loadBlobAsync(eventTarget.executionContext(), blob); + loader->loadBlobAsync(eventTarget.getExecutionContext(), blob); return promise; } @@ -136,8 +136,8 @@ if (LocalDOMWindow* window = eventTarget.toDOMWindow()) return fromInternal(*window); - ASSERT(eventTarget.executionContext()->isWorkerGlobalScope()); - return ImageBitmapFactories::fromInternal(*toWorkerGlobalScope(eventTarget.executionContext())); + ASSERT(eventTarget.getExecutionContext()->isWorkerGlobalScope()); + return ImageBitmapFactories::fromInternal(*toWorkerGlobalScope(eventTarget.getExecutionContext())); } template<class GlobalObject> @@ -185,7 +185,7 @@ void ImageBitmapFactories::ImageBitmapLoader::rejectPromise() { - m_resolver->reject(ScriptValue(m_resolver->scriptState(), v8::Null(m_resolver->scriptState()->isolate()))); + m_resolver->reject(ScriptValue(m_resolver->getScriptState(), v8::Null(m_resolver->getScriptState()->isolate()))); m_factory->didFinishLoading(this); }
diff --git a/third_party/WebKit/Source/core/inspector/AsyncCallTracker.cpp b/third_party/WebKit/Source/core/inspector/AsyncCallTracker.cpp index ed82b46..9abb8d8 100644 --- a/third_party/WebKit/Source/core/inspector/AsyncCallTracker.cpp +++ b/third_party/WebKit/Source/core/inspector/AsyncCallTracker.cpp
@@ -73,8 +73,8 @@ void contextDestroyed() override { - ASSERT(executionContext()); - OwnPtrWillBeRawPtr<ExecutionContextData> self = m_tracker->m_executionContextDataMap.take(executionContext()); + ASSERT(getExecutionContext()); + OwnPtrWillBeRawPtr<ExecutionContextData> self = m_tracker->m_executionContextDataMap.take(getExecutionContext()); ASSERT_UNUSED(self, self == this); ContextLifecycleObserver::contextDestroyed(); disposeCallChains(); @@ -232,30 +232,30 @@ void AsyncCallTracker::didEnqueueEvent(EventTarget* eventTarget, Event* event) { - ASSERT(eventTarget->executionContext()); + ASSERT(eventTarget->getExecutionContext()); ASSERT(m_debuggerAgent->trackingAsyncCalls()); ScriptForbiddenScope::AllowUserAgentScript allowScripting; int operationId = m_debuggerAgent->traceAsyncOperationStarting(event->type()); - ExecutionContextData* data = createContextDataIfNeeded(eventTarget->executionContext()); + ExecutionContextData* data = createContextDataIfNeeded(eventTarget->getExecutionContext()); data->m_eventCallChains.set(event, operationId); } void AsyncCallTracker::didRemoveEvent(EventTarget* eventTarget, Event* event) { - ASSERT(eventTarget->executionContext()); + ASSERT(eventTarget->getExecutionContext()); ASSERT(m_debuggerAgent->trackingAsyncCalls()); - if (ExecutionContextData* data = m_executionContextDataMap.get(eventTarget->executionContext())) + if (ExecutionContextData* data = m_executionContextDataMap.get(eventTarget->getExecutionContext())) data->m_eventCallChains.remove(event); } void AsyncCallTracker::willHandleEvent(EventTarget* eventTarget, Event* event, EventListener* listener, bool useCapture) { - ASSERT(eventTarget->executionContext()); + ASSERT(eventTarget->getExecutionContext()); ASSERT(m_debuggerAgent->trackingAsyncCalls()); if (XMLHttpRequest* xhr = toXmlHttpRequest(eventTarget)) { willHandleXHREvent(xhr, event); } else { - ExecutionContext* context = eventTarget->executionContext(); + ExecutionContext* context = eventTarget->getExecutionContext(); if (ExecutionContextData* data = m_executionContextDataMap.get(context)) willFireAsyncCall(data->m_eventCallChains.get(event)); else @@ -265,26 +265,26 @@ void AsyncCallTracker::willLoadXHR(XMLHttpRequest* xhr, ThreadableLoaderClient*, const AtomicString&, const KURL&, bool async, PassRefPtr<EncodedFormData>, const HTTPHeaderMap&, bool) { - ASSERT(xhr->executionContext()); + ASSERT(xhr->getExecutionContext()); ASSERT(m_debuggerAgent->trackingAsyncCalls()); if (!async) return; int operationId = m_debuggerAgent->traceAsyncOperationStarting(xhrSendName); - ExecutionContextData* data = createContextDataIfNeeded(xhr->executionContext()); + ExecutionContextData* data = createContextDataIfNeeded(xhr->getExecutionContext()); data->m_xhrCallChains.set(xhr, operationId); } void AsyncCallTracker::didDispatchXHRLoadendEvent(XMLHttpRequest* xhr) { - ASSERT(xhr->executionContext()); + ASSERT(xhr->getExecutionContext()); ASSERT(m_debuggerAgent->trackingAsyncCalls()); - if (ExecutionContextData* data = m_executionContextDataMap.get(xhr->executionContext())) + if (ExecutionContextData* data = m_executionContextDataMap.get(xhr->getExecutionContext())) data->m_xhrCallChains.remove(xhr); } void AsyncCallTracker::willHandleXHREvent(XMLHttpRequest* xhr, Event* event) { - ExecutionContext* context = xhr->executionContext(); + ExecutionContext* context = xhr->getExecutionContext(); ASSERT(context); ASSERT(m_debuggerAgent->trackingAsyncCalls()); if (ExecutionContextData* data = m_executionContextDataMap.get(context))
diff --git a/third_party/WebKit/Source/core/inspector/ConsoleMessage.cpp b/third_party/WebKit/Source/core/inspector/ConsoleMessage.cpp index ae175e61..c3ac028 100644 --- a/third_party/WebKit/Source/core/inspector/ConsoleMessage.cpp +++ b/third_party/WebKit/Source/core/inspector/ConsoleMessage.cpp
@@ -104,7 +104,7 @@ } } -ScriptState* ConsoleMessage::scriptState() const +ScriptState* ConsoleMessage::getScriptState() const { if (m_scriptState) return m_scriptState->get(); @@ -181,12 +181,12 @@ void ConsoleMessage::frameWindowDiscarded(LocalDOMWindow* window) { - if (scriptState() && scriptState()->domWindow() == window) + if (getScriptState() && getScriptState()->domWindow() == window) setScriptState(nullptr); if (!m_scriptArguments) return; - if (m_scriptArguments->scriptState()->domWindow() != window) + if (m_scriptArguments->getScriptState()->domWindow() != window) return; if (!m_message) m_message = "<message collected>";
diff --git a/third_party/WebKit/Source/core/inspector/ConsoleMessage.h b/third_party/WebKit/Source/core/inspector/ConsoleMessage.h index 73ab452..7f8213e 100644 --- a/third_party/WebKit/Source/core/inspector/ConsoleMessage.h +++ b/third_party/WebKit/Source/core/inspector/ConsoleMessage.h
@@ -40,7 +40,7 @@ void setLineNumber(unsigned); PassRefPtr<ScriptCallStack> callStack() const; void setCallStack(PassRefPtr<ScriptCallStack>); - ScriptState* scriptState() const; + ScriptState* getScriptState() const; void setScriptState(ScriptState*); PassRefPtrWillBeRawPtr<ScriptArguments> scriptArguments() const; void setScriptArguments(PassRefPtrWillBeRawPtr<ScriptArguments>);
diff --git a/third_party/WebKit/Source/core/inspector/InspectedFrames.cpp b/third_party/WebKit/Source/core/inspector/InspectedFrames.cpp index 8d2b396..dbf9886 100644 --- a/third_party/WebKit/Source/core/inspector/InspectedFrames.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectedFrames.cpp
@@ -32,7 +32,7 @@ LocalFrame* InspectedFrames::frameWithSecurityOrigin(const String& originRawString) { for (LocalFrame* frame : *this) { - if (frame->document()->securityOrigin()->toRawString() == originRawString) + if (frame->document()->getSecurityOrigin()->toRawString() == originRawString) return frame; } return nullptr;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp index 4cf502f3..7d2a924d 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp
@@ -189,15 +189,15 @@ if (consoleMessage->scriptId()) jsonObj->setScriptId(String::number(consoleMessage->scriptId())); jsonObj->setUrl(consoleMessage->url()); - ScriptState* scriptState = consoleMessage->scriptState(); + ScriptState* scriptState = consoleMessage->getScriptState(); if (scriptState) jsonObj->setExecutionContextId(scriptState->contextIdInDebugger()); if (consoleMessage->source() == NetworkMessageSource && consoleMessage->requestIdentifier()) jsonObj->setNetworkRequestId(IdentifiersFactory::requestId(consoleMessage->requestIdentifier())); RefPtrWillBeRawPtr<ScriptArguments> arguments = consoleMessage->scriptArguments(); if (arguments && arguments->argumentCount()) { - ScriptState::Scope scope(arguments->scriptState()); - v8::Local<v8::Context> context = arguments->scriptState()->context(); + ScriptState::Scope scope(arguments->getScriptState()); + v8::Local<v8::Context> context = arguments->getScriptState()->context(); OwnPtr<protocol::Array<protocol::Runtime::RemoteObject>> jsonArgs = protocol::Array<protocol::Runtime::RemoteObject>::create(); if (consoleMessage->type() == TableMessageType && generatePreview) { v8::Local<v8::Value> table = arguments->argumentAt(0).v8Value();
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp index 4b6756f..84867dc 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
@@ -95,10 +95,10 @@ // We need to handle LocalDOMWindow specially, because LocalDOMWindow wrapper exists on prototype chain. if (!target) target = toDOMWindow(isolate, value); - if (!target || !target->executionContext()) + if (!target || !target->getExecutionContext()) return; - ExecutionContext* executionContext = target->executionContext(); + ExecutionContext* executionContext = target->getExecutionContext(); // Nodes and their Listeners for the concerned event types (order is top to bottom) Vector<AtomicString> eventTypes = target->eventTypes();
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp index 4dae7c69..4621ec2c 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp
@@ -248,13 +248,6 @@ m_v8DebuggerAgent->setVariableValue(errorString, inScopeNumber, inVariableName, inNewValue, inCallFrameId, inFunctionObjectId); } -void InspectorDebuggerAgent::getStepInPositions(ErrorString* errorString, - const String16& inCallFrameId, - Maybe<Array<protocol::Debugger::Location>>* optOutStepInPositions) -{ - m_v8DebuggerAgent->getStepInPositions(errorString, inCallFrameId, optOutStepInPositions); -} - void InspectorDebuggerAgent::getBacktrace(ErrorString* errorString, OwnPtr<Array<protocol::Debugger::CallFrame>>* outCallFrames, Maybe<protocol::Runtime::StackTrace>* optOutAsyncStackTrace)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.h b/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.h index 93d04f3..34017c2 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.h
@@ -71,7 +71,6 @@ void setPauseOnExceptions(ErrorString*, const String16& state) override; void evaluateOnCallFrame(ErrorString*, const String16& callFrameId, const String16& expression, const Maybe<String16>& objectGroup, const Maybe<bool>& includeCommandLineAPI, const Maybe<bool>& doNotPauseOnExceptionsAndMuteConsole, const Maybe<bool>& returnByValue, const Maybe<bool>& generatePreview, OwnPtr<protocol::Runtime::RemoteObject>* result, Maybe<bool>* wasThrown, Maybe<protocol::Runtime::ExceptionDetails>*) override; void setVariableValue(ErrorString*, int scopeNumber, const String16& variableName, PassOwnPtr<protocol::Runtime::CallArgument> newValue, const Maybe<String16>& callFrameId, const Maybe<String16>& functionObjectId) override; - void getStepInPositions(ErrorString*, const String16& callFrameId, Maybe<protocol::Array<protocol::Debugger::Location>>* stepInPositions) override; void getBacktrace(ErrorString*, OwnPtr<protocol::Array<protocol::Debugger::CallFrame>>* callFrames, Maybe<protocol::Runtime::StackTrace>* asyncStackTrace) override; void setAsyncCallStackDepth(ErrorString*, int maxDepth) override; void enablePromiseTracker(ErrorString*, const Maybe<bool>& captureStacks) override;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInputAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorInputAgent.cpp index 0b52975a..88315cc 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorInputAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorInputAgent.cpp
@@ -69,6 +69,22 @@ return platformModifiers; } +// Convert given protocol timestamp which is in seconds since unix epoch to a +// platform event timestamp which is ticks since platform start. This conversion +// is an estimate because these two clocks respond differently to user setting +// time and NTP adjustments. If timestamp is empty then returns current +// monotonic timestamp. +double GetEventTimeStamp(const blink::protocol::Maybe<double>& timestamp) +{ + // Take a snapshot of difference between two clocks on first run and use it + // for the duration of the application. + static double epochToMonotonicTimeDelta = currentTime() - monotonicallyIncreasingTime(); + if (timestamp.isJust()) + return timestamp.fromJust() - epochToMonotonicTimeDelta; + + return monotonicallyIncreasingTime(); +} + class SyntheticInspectorTouchPoint : public blink::PlatformTouchPoint { public: SyntheticInspectorTouchPoint(int id, TouchState state, const blink::IntPoint& screenPos, const blink::IntPoint& pos, int radiusX, int radiusY, double rotationAngle, double force) @@ -134,7 +150,7 @@ unsigned convertedModifiers = GetEventModifiers(modifiers.fromMaybe(0)); - SyntheticInspectorTouchEvent event(convertedType, convertedModifiers, timestamp.fromMaybe(currentTime())); + SyntheticInspectorTouchEvent event(convertedType, convertedModifiers, GetEventTimeStamp(timestamp)); int autoId = 0; for (size_t i = 0; i < touchPoints->length(); ++i) {
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp index 77d6c37..de8806f 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
@@ -154,7 +154,7 @@ { if (!eventTarget) return 0; - return instrumentingAgentsFor(eventTarget->executionContext()); + return instrumentingAgentsFor(eventTarget->getExecutionContext()); } InstrumentingAgents* instrumentingAgentsFor(LayoutObject* layoutObject)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp index 21429a3..cbe1efe 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
@@ -705,7 +705,7 @@ .setLoaderId(IdentifiersFactory::loaderId(frame->loader().documentLoader())) .setUrl(urlWithoutFragment(frame->document()->url()).getString()) .setMimeType(frame->loader().documentLoader()->responseMIMEType()) - .setSecurityOrigin(frame->document()->securityOrigin()->toRawString()).build(); + .setSecurityOrigin(frame->document()->getSecurityOrigin()->toRawString()).build(); // FIXME: This doesn't work for OOPI. Frame* parentFrame = frame->tree().parent(); if (parentFrame && parentFrame->isLocalFrame())
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp index 3ebbcf45..e8cfe18 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
@@ -649,7 +649,7 @@ ASSERT(!m_pendingRequest); m_pendingRequest = client; m_pendingRequestType = InspectorPageAgent::XHRResource; - m_pendingXHRReplayData = XHRReplayData::create(xhr->executionContext(), method, urlWithoutFragment(url), async, formData.get(), includeCredentials); + m_pendingXHRReplayData = XHRReplayData::create(xhr->getExecutionContext(), method, urlWithoutFragment(url), async, formData.get(), includeCredentials); for (const auto& header : headers) m_pendingXHRReplayData->addHeader(header.key, header.value); } @@ -999,7 +999,7 @@ if (!xhrReplayData) return; - ExecutionContext* executionContext = xhrReplayData->executionContext(); + ExecutionContext* executionContext = xhrReplayData->getExecutionContext(); if (!executionContext) { m_resourcesData->setXHRReplayData(requestId, 0); return;
diff --git a/third_party/WebKit/Source/core/inspector/ScriptArguments.h b/third_party/WebKit/Source/core/inspector/ScriptArguments.h index 9c72f7b..861b1b2 100644 --- a/third_party/WebKit/Source/core/inspector/ScriptArguments.h +++ b/third_party/WebKit/Source/core/inspector/ScriptArguments.h
@@ -51,7 +51,7 @@ const ScriptValue& argumentAt(size_t) const; size_t argumentCount() const { return m_arguments.size(); } - ScriptState* scriptState() const { return m_scriptState.get(); } + ScriptState* getScriptState() const { return m_scriptState.get(); } bool getFirstArgumentAsString(String&) const;
diff --git a/third_party/WebKit/Source/core/inspector/WorkerRuntimeAgent.cpp b/third_party/WebKit/Source/core/inspector/WorkerRuntimeAgent.cpp index 747bcff9..d5540d2 100644 --- a/third_party/WebKit/Source/core/inspector/WorkerRuntimeAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/WorkerRuntimeAgent.cpp
@@ -57,13 +57,13 @@ return; InspectorRuntimeAgent::enable(errorString); - ScriptState* scriptState = m_workerGlobalScope->scriptController()->scriptState(); + ScriptState* scriptState = m_workerGlobalScope->scriptController()->getScriptState(); reportExecutionContextCreated(scriptState, "", m_workerGlobalScope->url().getString(), "", ""); } ScriptState* WorkerRuntimeAgent::defaultScriptState() { - return m_workerGlobalScope->scriptController()->scriptState(); + return m_workerGlobalScope->scriptController()->getScriptState(); } void WorkerRuntimeAgent::muteConsole()
diff --git a/third_party/WebKit/Source/core/layout/HitTestLocation.h b/third_party/WebKit/Source/core/layout/HitTestLocation.h index a89241b..6fef9bd 100644 --- a/third_party/WebKit/Source/core/layout/HitTestLocation.h +++ b/third_party/WebKit/Source/core/layout/HitTestLocation.h
@@ -62,10 +62,6 @@ IntRect boundingBox() const { return m_boundingBox; } static IntRect rectForPoint(const LayoutPoint&, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding); - int topPadding() const { return roundedPoint().y() - m_boundingBox.y(); } - int rightPadding() const { return m_boundingBox.maxX() - roundedPoint().x() - 1; } - int bottomPadding() const { return m_boundingBox.maxY() - roundedPoint().y() - 1; } - int leftPadding() const { return roundedPoint().x() - m_boundingBox.x(); } bool intersects(const LayoutRect&) const; bool intersects(const FloatRect&) const;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp index 22ac50c..150aa15 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -902,19 +902,21 @@ // may have shifted to avoid floats, and any objects whose floats cannot interact with objects // outside it (i.e. objects that create a new block formatting context). LayoutBlockFlow* parentBlockFlow = toLayoutBlockFlow(parent()); - bool parentHasFloats = false; + bool siblingFloatMayIntrude = false; LayoutObject* prev = previousSibling(); while (prev && (!prev->isBox() || !prev->isLayoutBlock() || toLayoutBlock(prev)->avoidsFloats() || toLayoutBlock(prev)->createsNewFormattingContext())) { if (prev->isFloating()) - parentHasFloats = true; + siblingFloatMayIntrude = true; prev = prev->previousSibling(); } // First add in floats from the parent. Self-collapsing blocks let their parent track any floats that intrude into - // them (as opposed to floats they contain themselves) so check for those here too. + // them (as opposed to floats they contain themselves) so check for those here too. If margin collapsing has moved + // us up past the top a previous sibling then we need to check for floats from the parent too. LayoutUnit logicalTopOffset = logicalTop(); - bool parentHasIntrudingFloats = !parentHasFloats && (!prev || toLayoutBlockFlow(prev)->isSelfCollapsingBlock()) && parentBlockFlow->lowestFloatLogicalBottom() > logicalTopOffset; - if (parentHasFloats || parentHasIntrudingFloats) + bool parentFloatsMayIntrude = !siblingFloatMayIntrude && (!prev || toLayoutBlockFlow(prev)->isSelfCollapsingBlock() || toLayoutBlock(prev)->logicalTop() > logicalTopOffset) + && parentBlockFlow->lowestFloatLogicalBottom() > logicalTopOffset; + if (siblingFloatMayIntrude || parentFloatsMayIntrude) addIntrudingFloats(parentBlockFlow, parentBlockFlow->logicalLeftOffsetForContent(), logicalTopOffset); // Add overhanging floats from the previous LayoutBlockFlow, but only if it has a float that intrudes into our space.
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp index 9ccca19..313e2ef 100644 --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -1884,13 +1884,13 @@ return GridAxisStart; } -static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distribution, const Vector<LayoutUnit>& trackPositions, const LayoutUnit& childBreadth) +static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distribution, const Vector<GridTrack>& trackSizes, const Vector<LayoutUnit>& trackPositions, LayoutUnit trackGap) { - return (distribution == ContentDistributionStretch || ContentDistributionStretch == ContentDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPositions[0] - childBreadth; - + // FIXME: Perhaps a good idea to cache the result of this operation, since the ContentDistribution offset between tracks is always the same, + return (distribution == ContentDistributionStretch || distribution == ContentDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPositions[0] - trackSizes[0].baseSize() - trackGap; } -LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const +LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child, GridSizingData& sizingData) const { const GridSpan& rowsSpan = cachedGridSpan(child, ForRows); size_t childStartLine = rowsSpan.resolvedInitialPosition(); @@ -1908,11 +1908,15 @@ LayoutUnit endOfRow = m_rowPositions[childEndLine]; // m_rowPositions include gutters so we need to subtract them to get the actual end position for a given // row (this does not have to be done for the last track as there are no more m_rowPositions after it) + LayoutUnit trackGap = guttersSize(ForRows, 2); if (childEndLine < m_rowPositions.size() - 1) - endOfRow -= guttersSize(ForRows, 2); + endOfRow -= trackGap; LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHeight(); + // The track's start and end lines may be not adjacent because of content alignment, so we assume the stored + // lines are all start plus a content-alignment distribution offset. + // We must subtract last line's offset because is not part of the track the items belongs to. if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.size() - 1) - endOfRow -= offsetBetweenTracks(styleRef().resolvedAlignContentDistribution(normalValueBehavior()), m_rowPositions, childBreadth); + endOfRow -= offsetBetweenTracks(styleRef().resolvedAlignContentDistribution(normalValueBehavior()), sizingData.rowTracks, m_rowPositions, trackGap); OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef(), ItemPositionStretch).overflow(); LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(overflow, endOfRow - startOfRow, childBreadth); return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2); @@ -1923,7 +1927,7 @@ return LayoutUnit(); } -LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const +LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child, GridSizingData& sizingData) const { const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns); size_t childStartLine = columnsSpan.resolvedInitialPosition(); @@ -1941,11 +1945,15 @@ LayoutUnit endOfColumn = m_columnPositions[childEndLine]; // m_columnPositions include gutters so we need to subtract them to get the actual end position for a given // column (this does not have to be done for the last track as there are no more m_columnPositions after it) + LayoutUnit trackGap = guttersSize(ForColumns, 2); if (childEndLine < m_columnPositions.size() - 1) - endOfColumn -= guttersSize(ForRows, 2); + endOfColumn -= trackGap; LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidth(); + // The track's start and end lines may be not adjacent because of content alignment, so we assume the stored + // lines are all start plus a content-alignment distribution offset. + // We must subtract last line's offset because is not part of the track the items belongs to. if (childEndLine - childStartLine > 1 && childEndLine < m_columnPositions.size() - 1) - endOfColumn -= offsetBetweenTracks(styleRef().resolvedJustifyContentDistribution(normalValueBehavior()), m_columnPositions, childBreadth); + endOfColumn -= offsetBetweenTracks(styleRef().resolvedJustifyContentDistribution(normalValueBehavior()), sizingData.columnTracks, m_columnPositions, trackGap); LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(child.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childBreadth); return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2); } @@ -2058,7 +2066,7 @@ LayoutPoint LayoutGrid::findChildLogicalPosition(const LayoutBox& child, GridSizingData& sizingData) const { - LayoutUnit rowAxisOffset = rowAxisOffsetForChild(child); + LayoutUnit rowAxisOffset = rowAxisOffsetForChild(child, sizingData); // We stored m_columnPosition s's data ignoring the direction, hence we might need now // to translate positions from RTL to LTR, as it's more convenient for painting. if (!style()->isLeftToRightDirection()) { @@ -2067,7 +2075,7 @@ rowAxisOffset = rightGridEdgePosition - (rowAxisOffset + child.logicalWidth()); } - return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); + return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child, sizingData)); } void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) const
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.h b/third_party/WebKit/Source/core/layout/LayoutGrid.h index 2b8a16c..a62fd6cf 100644 --- a/third_party/WebKit/Source/core/layout/LayoutGrid.h +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.h
@@ -154,8 +154,8 @@ LayoutUnit maxContentForChild(LayoutBox&, GridTrackSizingDirection, Vector<GridTrack>& columnTracks); GridAxisPosition columnAxisPositionForChild(const LayoutBox&) const; GridAxisPosition rowAxisPositionForChild(const LayoutBox&) const; - LayoutUnit rowAxisOffsetForChild(const LayoutBox&) const; - LayoutUnit columnAxisOffsetForChild(const LayoutBox&) const; + LayoutUnit rowAxisOffsetForChild(const LayoutBox&, GridSizingData&) const; + LayoutUnit columnAxisOffsetForChild(const LayoutBox&, GridSizingData&) const; ContentAlignmentData computeContentPositionAndDistributionOffset(GridTrackSizingDirection, const LayoutUnit& availableFreeSpace, unsigned numberOfGridTracks) const; LayoutPoint findChildLogicalPosition(const LayoutBox&, GridSizingData&) const; GridArea cachedGridArea(const LayoutBox&) const;
diff --git a/third_party/WebKit/Source/core/layout/api/LayoutItem.h b/third_party/WebKit/Source/core/layout/api/LayoutItem.h index d13f79c7..c40a4496 100644 --- a/third_party/WebKit/Source/core/layout/api/LayoutItem.h +++ b/third_party/WebKit/Source/core/layout/api/LayoutItem.h
@@ -109,6 +109,11 @@ return m_layoutObject->isProgress(); } + bool isSlider() const + { + return m_layoutObject->isSlider(); + } + bool needsLayout() { return m_layoutObject->needsLayout();
diff --git a/third_party/WebKit/Source/core/layout/api/LayoutSliderItem.h b/third_party/WebKit/Source/core/layout/api/LayoutSliderItem.h new file mode 100644 index 0000000..75db0854 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/api/LayoutSliderItem.h
@@ -0,0 +1,43 @@ + +// 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 LayoutSliderItem_h +#define LayoutSliderItem_h + +#include "core/layout/LayoutSlider.h" +#include "core/layout/api/LayoutBlockItem.h" + +namespace blink { + +class LayoutSliderItem : public LayoutBlockItem { +public: + explicit LayoutSliderItem(LayoutSlider* layoutSlider) + : LayoutBlockItem(layoutSlider) + { + } + + explicit LayoutSliderItem(const LayoutBlockItem& item) + : LayoutBlockItem(item) + { + ASSERT(!item || item.isSlider()); + } + + explicit LayoutSliderItem(std::nullptr_t) : LayoutBlockItem(nullptr) { } + + LayoutSliderItem() { } + + bool inDragMode() const + { + return toSlider()->inDragMode(); + } + +private: + LayoutSlider* toSlider() { return toLayoutSlider(layoutObject()); } + const LayoutSlider* toSlider() const { return toLayoutSlider(layoutObject()); } +}; + +} // namespace blink + +#endif // LayoutSliderItem_h
diff --git a/third_party/WebKit/Source/core/layout/api/LineLayoutBR.h b/third_party/WebKit/Source/core/layout/api/LineLayoutBR.h new file mode 100644 index 0000000..dba5547 --- /dev/null +++ b/third_party/WebKit/Source/core/layout/api/LineLayoutBR.h
@@ -0,0 +1,49 @@ +// 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 LineLayoutBR_h +#define LineLayoutBR_h + +#include "core/layout/LayoutBR.h" +#include "core/layout/api/LineLayoutText.h" + +namespace blink { + +class LineLayoutBR : public LineLayoutText { +public: + explicit LineLayoutBR(LayoutBR* layoutBR) + : LineLayoutText(layoutBR) + { + } + + explicit LineLayoutBR(const LineLayoutItem& item) + : LineLayoutText(item) + { + ASSERT(!item || item.isBR()); + } + + explicit LineLayoutBR(std::nullptr_t) : LineLayoutText(nullptr) { } + + LineLayoutBR() { } + + int lineHeight(bool firstLine) const + { + return toBR()->lineHeight(firstLine); + } + +private: + LayoutBR* toBR() + { + return toLayoutBR(layoutObject()); + } + + const LayoutBR* toBR() const + { + return toLayoutBR(layoutObject()); + } +}; + +} // namespace blink + +#endif // LineLayoutBR_h
diff --git a/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp index dd04fbb..41cd392 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp
@@ -23,8 +23,8 @@ #include "core/layout/line/InlineTextBox.h" #include "core/layout/HitTestResult.h" -#include "core/layout/LayoutBR.h" #include "core/layout/LayoutRubyText.h" +#include "core/layout/api/LineLayoutBR.h" #include "core/layout/api/LineLayoutBox.h" #include "core/layout/api/LineLayoutRubyRun.h" #include "core/layout/line/AbstractInlineTextBox.h" @@ -122,7 +122,7 @@ if (!isText() || !getLineLayoutItem().parent()) return LayoutUnit(); if (getLineLayoutItem().isBR()) - return LayoutUnit(toLayoutBR(getLineLayoutItem())->lineHeight(isFirstLineStyle())); + return LayoutUnit(LineLayoutBR(getLineLayoutItem()).lineHeight(isFirstLineStyle())); if (parent()->getLineLayoutItem() == getLineLayoutItem().parent()) return parent()->lineHeight(); return LineLayoutBoxModel(getLineLayoutItem().parent()).lineHeight(isFirstLineStyle(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine);
diff --git a/third_party/WebKit/Source/core/layout/line/LineBoxList.cpp b/third_party/WebKit/Source/core/layout/line/LineBoxList.cpp index c798d810..045661e6 100644 --- a/third_party/WebKit/Source/core/layout/line/LineBoxList.cpp +++ b/third_party/WebKit/Source/core/layout/line/LineBoxList.cpp
@@ -202,10 +202,11 @@ return false; LayoutPoint point = locationInContainer.point(); + IntRect hitSearchBoundingBox = locationInContainer.boundingBox(); CullRect cullRect(firstLineBox()->isHorizontal() ? - IntRect(point.x(), point.y() - locationInContainer.topPadding(), 1, locationInContainer.topPadding() + locationInContainer.bottomPadding() + 1) : - IntRect(point.x() - locationInContainer.leftPadding(), point.y(), locationInContainer.rightPadding() + locationInContainer.leftPadding() + 1, 1)); + IntRect(point.x(), hitSearchBoundingBox.y(), 1, hitSearchBoundingBox.height()) : + IntRect(hitSearchBoundingBox.x(), point.y(), hitSearchBoundingBox.width(), 1)); if (!anyLineIntersectsRect(layoutObject, cullRect, accumulatedOffset)) return false;
diff --git a/third_party/WebKit/Source/core/layout/shapes/ShapeOutsideInfo.cpp b/third_party/WebKit/Source/core/layout/shapes/ShapeOutsideInfo.cpp index 9aafdd4..6df9027 100644 --- a/third_party/WebKit/Source/core/layout/shapes/ShapeOutsideInfo.cpp +++ b/third_party/WebKit/Source/core/layout/shapes/ShapeOutsideInfo.cpp
@@ -90,7 +90,7 @@ ASSERT(styleImage.cachedImage()); ImageResource& imageResource = *(styleImage.cachedImage()); - if (imageResource.isAccessAllowed(document.securityOrigin())) + if (imageResource.isAccessAllowed(document.getSecurityOrigin())) return true; const KURL& url = imageResource.url();
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.cpp index 57708596..7c9a97c2 100644 --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.cpp +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.cpp
@@ -137,7 +137,7 @@ return false; // FOs establish a stacking context, so we need to hit-test all layers. - HitTestLocation hitTestLocation(roundedLayoutPoint(localPoint)); + HitTestLocation hitTestLocation(localPoint); return LayoutBlock::nodeAtPoint(result, hitTestLocation, LayoutPoint(), HitTestForeground) || LayoutBlock::nodeAtPoint(result, hitTestLocation, LayoutPoint(), HitTestFloat) || LayoutBlock::nodeAtPoint(result, hitTestLocation, LayoutPoint(), HitTestChildBlockBackgrounds);
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp index 1a0da09..e1faa502 100644 --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
@@ -420,7 +420,7 @@ if (hitRules.canHitBoundingBox && !objectBoundingBox().contains(localPoint)) return false; - HitTestLocation hitTestLocation(LayoutPoint(flooredIntPoint(localPoint))); + HitTestLocation hitTestLocation(localPoint); return LayoutBlock::nodeAtPoint(result, hitTestLocation, LayoutPoint(), hitTestAction); } }
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp index 865eaac..a65a7db00 100644 --- a/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp +++ b/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp
@@ -256,6 +256,32 @@ return data.textLength; } +const SVGTextMetrics& findMetricsForCharacter(const Vector<SVGTextMetrics>& textMetricsValues, const SVGTextFragment& fragment, unsigned startInFragment) +{ + // Find the text metrics cell that starts at or contains the character at |startInFragment|. + unsigned textMetricsOffset = fragment.metricsListOffset; + unsigned fragmentOffset = 0; + while (fragmentOffset < fragment.length) { + const SVGTextMetrics& metrics = textMetricsValues[textMetricsOffset++]; + unsigned glyphEnd = fragmentOffset + metrics.length(); + if (startInFragment < glyphEnd) + break; + fragmentOffset = glyphEnd; + } + return textMetricsValues[textMetricsOffset - 1]; +} + +static float calculateGlyphRange(const QueryData* queryData, const SVGTextFragment& fragment, unsigned start, unsigned end) +{ + float glyphRange = 0; + const Vector<SVGTextMetrics>& textMetricsValues = queryData->textLineLayout.layoutAttributes()->textMetricsValues(); + for (unsigned character = start; character < end; character++) { + const SVGTextMetrics& metrics = findMetricsForCharacter(textMetricsValues, fragment, character); + glyphRange += queryData->isVerticalText ? metrics.height() : metrics.width(); + } + return glyphRange; +} + // subStringLength() implementation struct SubStringLengthData : QueryData { SubStringLengthData(unsigned queryStartPosition, unsigned queryLength) @@ -280,8 +306,7 @@ if (!mapStartEndPositionsIntoFragmentCoordinates(queryData, fragment, startPosition, endPosition)) return false; - SVGTextMetrics metrics = SVGTextMetrics::measureCharacterRange(queryData->textLineLayout, fragment.characterOffset + startPosition, endPosition - startPosition, queryData->textBox->direction()); - data->subStringLength += queryData->isVerticalText ? metrics.height() : metrics.width(); + data->subStringLength += calculateGlyphRange(queryData, fragment, startPosition, endPosition); return false; } @@ -305,14 +330,7 @@ static FloatPoint calculateGlyphPositionWithoutTransform(const QueryData* queryData, const SVGTextFragment& fragment, int offsetInFragment) { - float glyphOffsetInDirection = 0; - if (offsetInFragment) { - SVGTextMetrics metrics = SVGTextMetrics::measureCharacterRange(queryData->textLineLayout, fragment.characterOffset, offsetInFragment, queryData->textBox->direction()); - if (queryData->isVerticalText) - glyphOffsetInDirection = metrics.height(); - else - glyphOffsetInDirection = metrics.width(); - } + float glyphOffsetInDirection = calculateGlyphRange(queryData, fragment, 0, offsetInFragment); if (!queryData->textBox->isLeftToRightDirection()) { float fragmentExtent = queryData->isVerticalText ? fragment.height : fragment.width; @@ -441,21 +459,6 @@ FloatRect extent; }; -const SVGTextMetrics& findMetricsForCharacter(const Vector<SVGTextMetrics>& textMetricsValues, const SVGTextFragment& fragment, unsigned startInFragment) -{ - // Find the text metrics cell that start at or contain the character at |startInFragment|. - unsigned textMetricsOffset = fragment.metricsListOffset; - unsigned fragmentOffset = 0; - while (fragmentOffset < fragment.length) { - const SVGTextMetrics& metrics = textMetricsValues[textMetricsOffset++]; - unsigned glyphEnd = fragmentOffset + metrics.length(); - if (startInFragment < glyphEnd) - break; - fragmentOffset = glyphEnd; - } - return textMetricsValues[textMetricsOffset - 1]; -} - static inline void calculateGlyphBoundaries(const QueryData* queryData, const SVGTextFragment& fragment, int startPosition, FloatRect& extent) { float scalingFactor = queryData->textLineLayout.scalingFactor();
diff --git a/third_party/WebKit/Source/core/loader/BeaconLoader.cpp b/third_party/WebKit/Source/core/loader/BeaconLoader.cpp index 5d4bf31b..75ff002 100644 --- a/third_party/WebKit/Source/core/loader/BeaconLoader.cpp +++ b/third_party/WebKit/Source/core/loader/BeaconLoader.cpp
@@ -130,7 +130,7 @@ BeaconLoader::BeaconLoader(LocalFrame* frame, ResourceRequest& request, const FetchInitiatorInfo& initiatorInfo, StoredCredentials credentialsAllowed) : PingLoader(frame, request, initiatorInfo, credentialsAllowed) - , m_beaconOrigin(frame->document()->securityOrigin()) + , m_beaconOrigin(frame->document()->getSecurityOrigin()) { }
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp index c9ccdf98..7a42c3e3 100644 --- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp +++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -141,7 +141,7 @@ // Setting an outgoing referer is only supported in the async code path. ASSERT(m_async || request.httpReferrer().isEmpty()); - m_sameOriginRequest = securityOrigin()->canRequestNoSuborigin(request.url()); + m_sameOriginRequest = getSecurityOrigin()->canRequestNoSuborigin(request.url()); m_requestContext = request.requestContext(); m_redirectMode = request.fetchRedirectMode(); @@ -272,7 +272,7 @@ if ((m_options.preflightPolicy == ConsiderPreflight && FetchUtils::isSimpleOrForbiddenRequest(request.httpMethod(), request.httpHeaderFields())) || m_options.preflightPolicy == PreventPreflight) { ResourceRequest crossOriginRequest(request); ResourceLoaderOptions crossOriginOptions(m_resourceLoaderOptions); - updateRequestForAccessControl(crossOriginRequest, securityOrigin(), effectiveAllowCredentials()); + updateRequestForAccessControl(crossOriginRequest, getSecurityOrigin(), effectiveAllowCredentials()); // We update the credentials mode according to effectiveAllowCredentials() here for backward compatibility. But this is not correct. // FIXME: We should set it in the caller of DocumentThreadableLoader. crossOriginRequest.setFetchCredentialsMode(effectiveAllowCredentials() == AllowStoredCredentials ? WebURLRequest::FetchCredentialsModeInclude : WebURLRequest::FetchCredentialsModeOmit); @@ -292,12 +292,12 @@ m_actualOptions = crossOriginOptions; bool shouldForcePreflight = InspectorInstrumentation::shouldForceCORSPreflight(m_document); - bool canSkipPreflight = CrossOriginPreflightResultCache::shared().canSkipPreflight(securityOrigin()->toString(), m_actualRequest.url(), effectiveAllowCredentials(), m_actualRequest.httpMethod(), m_actualRequest.httpHeaderFields()); + bool canSkipPreflight = CrossOriginPreflightResultCache::shared().canSkipPreflight(getSecurityOrigin()->toString(), m_actualRequest.url(), effectiveAllowCredentials(), m_actualRequest.httpMethod(), m_actualRequest.httpHeaderFields()); if (canSkipPreflight && !shouldForcePreflight) { loadActualRequest(); // |this| may be dead here in async mode. } else { - ResourceRequest preflightRequest = createAccessControlPreflightRequest(m_actualRequest, securityOrigin()); + ResourceRequest preflightRequest = createAccessControlPreflightRequest(m_actualRequest, getSecurityOrigin()); // Create a ResourceLoaderOptions for preflight. ResourceLoaderOptions preflightOptions = m_actualOptions; preflightOptions.allowCredentials = DoNotAllowStoredCredentials; @@ -475,7 +475,7 @@ // The redirect response must pass the access control check if the // original request was not same-origin. allowRedirect = CrossOriginAccessControl::isLegalRedirectLocation(request.url(), accessControlErrorDescription) - && (m_sameOriginRequest || passesAccessControlCheck(redirectResponse, effectiveAllowCredentials(), securityOrigin(), accessControlErrorDescription, m_requestContext)); + && (m_sameOriginRequest || passesAccessControlCheck(redirectResponse, effectiveAllowCredentials(), getSecurityOrigin(), accessControlErrorDescription, m_requestContext)); } if (allowRedirect) { @@ -571,7 +571,7 @@ { String accessControlErrorDescription; - if (!passesAccessControlCheck(response, effectiveAllowCredentials(), securityOrigin(), accessControlErrorDescription, m_requestContext)) { + if (!passesAccessControlCheck(response, effectiveAllowCredentials(), getSecurityOrigin(), accessControlErrorDescription, m_requestContext)) { handlePreflightFailure(response.url().getString(), "Response to preflight request doesn't pass access control check: " + accessControlErrorDescription); // |this| may be dead here in async mode. return; @@ -592,7 +592,7 @@ return; } - CrossOriginPreflightResultCache::shared().appendEntry(securityOrigin()->toString(), m_actualRequest.url(), preflightResult.release()); + CrossOriginPreflightResultCache::shared().appendEntry(getSecurityOrigin()->toString(), m_actualRequest.url(), preflightResult.release()); } void DocumentThreadableLoader::reportResponseReceived(unsigned long identifier, const ResourceResponse& response) @@ -646,12 +646,12 @@ // loadFallbackRequestForServiceWorker(). // FIXME: We should use |m_sameOriginRequest| when we will support // Suborigins (crbug.com/336894) for Service Worker. - ASSERT(m_fallbackRequestForServiceWorker.isNull() || securityOrigin()->canRequest(m_fallbackRequestForServiceWorker.url())); + ASSERT(m_fallbackRequestForServiceWorker.isNull() || getSecurityOrigin()->canRequest(m_fallbackRequestForServiceWorker.url())); m_fallbackRequestForServiceWorker = ResourceRequest(); if (!m_sameOriginRequest && m_options.crossOriginRequestPolicy == UseAccessControl) { String accessControlErrorDescription; - if (!passesAccessControlCheck(response, effectiveAllowCredentials(), securityOrigin(), accessControlErrorDescription, m_requestContext)) { + if (!passesAccessControlCheck(response, effectiveAllowCredentials(), getSecurityOrigin(), accessControlErrorDescription, m_requestContext)) { reportResponseReceived(identifier, response); ThreadableLoaderClient* client = m_client; @@ -772,7 +772,7 @@ m_actualRequest = ResourceRequest(); m_actualOptions = ResourceLoaderOptions(); - actualRequest.setHTTPOrigin(securityOrigin()); + actualRequest.setHTTPOrigin(getSecurityOrigin()); clearResource(); @@ -908,7 +908,7 @@ if (m_options.crossOriginRequestPolicy == AllowCrossOriginRequests) return true; - return m_sameOriginRequest && securityOrigin()->canRequest(url); + return m_sameOriginRequest && getSecurityOrigin()->canRequest(url); } bool DocumentThreadableLoader::isAllowedByContentSecurityPolicy(const KURL& url, ContentSecurityPolicy::RedirectStatus redirectStatus) const @@ -926,9 +926,9 @@ return m_resourceLoaderOptions.allowCredentials; } -SecurityOrigin* DocumentThreadableLoader::securityOrigin() const +SecurityOrigin* DocumentThreadableLoader::getSecurityOrigin() const { - return m_securityOrigin ? m_securityOrigin.get() : document().securityOrigin(); + return m_securityOrigin ? m_securityOrigin.get() : document().getSecurityOrigin(); } Document& DocumentThreadableLoader::document() const
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h index a5596613..f4552e5b 100644 --- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h +++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
@@ -178,7 +178,7 @@ RefPtrWillBePersistent<RawResource> m_resource; // End of ResourceOwner re-implementation, see above. - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; Document& document() const; ThreadableLoaderClient* m_client; @@ -195,7 +195,7 @@ // True while the initial URL and all the URLs of the redirects // this object has followed, if any, are same-origin to - // securityOrigin(). + // getSecurityOrigin(). bool m_sameOriginRequest; // Set to true if the current request is cross-origin and not simple. bool m_crossOriginNonSimpleRequest;
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp index 1df10fbf..5bdfcb10 100644 --- a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp +++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
@@ -102,7 +102,7 @@ RefPtr<SecurityOrigin> outgoingOrigin; if (!request.didSetHTTPReferrer()) { ASSERT(m_document); - outgoingOrigin = m_document->securityOrigin(); + outgoingOrigin = m_document->getSecurityOrigin(); request.setHTTPReferrer(SecurityPolicy::generateReferrer(m_document->getReferrerPolicy(), request.url(), m_document->outgoingReferrer())); } else { RELEASE_ASSERT(SecurityPolicy::generateReferrer(request.getReferrerPolicy(), request.url(), request.httpReferrer()).referrer == request.httpReferrer()); @@ -411,7 +411,7 @@ SecurityOrigin* securityOrigin = options.securityOrigin.get(); if (!securityOrigin && m_document) - securityOrigin = m_document->securityOrigin(); + securityOrigin = m_document->getSecurityOrigin(); if (originRestriction != FetchRequest::NoOriginRestriction && securityOrigin && !securityOrigin->canDisplay(url)) { if (!forPreload) @@ -547,7 +547,7 @@ // block them at some point in the future. if (resourceRequest.frameType() != WebURLRequest::FrameTypeTopLevel) { ASSERT(frame()->document()); - if (SchemeRegistry::shouldTreatURLSchemeAsLegacy(url.protocol()) && !SchemeRegistry::shouldTreatURLSchemeAsLegacy(frame()->document()->securityOrigin()->protocol())) + if (SchemeRegistry::shouldTreatURLSchemeAsLegacy(url.protocol()) && !SchemeRegistry::shouldTreatURLSchemeAsLegacy(frame()->document()->getSecurityOrigin()->protocol())) UseCounter::count(frame()->document(), UseCounter::LegacyProtocolEmbeddedAsSubresource); if (!url.user().isEmpty() || !url.pass().isEmpty()) UseCounter::count(frame()->document(), UseCounter::RequestedSubresourceWithEmbeddedCredentials); @@ -640,9 +640,9 @@ frame()->document()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); } -SecurityOrigin* FrameFetchContext::securityOrigin() const +SecurityOrigin* FrameFetchContext::getSecurityOrigin() const { - return m_document ? m_document->securityOrigin() : nullptr; + return m_document ? m_document->getSecurityOrigin() : nullptr; } void FrameFetchContext::upgradeInsecureRequest(FetchRequest& fetchRequest) @@ -761,14 +761,14 @@ // though the cumulative result will depend on the interaction between them. // Background doc: https://docs.google.com/document/d/1bCDuq9H1ih9iNjgzyAL0gpwNFiEP4TZS-YLRp_RuMlc/edit?usp=sharing - // Increases the priorities for CSS, Scripts, Fonts and Images all by one level + // Increases the priorities for CSS, Scripts, XHR, Fonts and Images all by one level // and parser-blocking scripts and visible images by 2. // This is used in conjunction with logic on the Chrome side to raise the threshold // of "layout-blocking" resources and provide a boost to resources that are needed // as soon as possible for something currently on the screen. int modifiedPriority = static_cast<int>(priority); if (frame()->settings()->fetchIncreasePriorities()) { - if (type == Resource::CSSStyleSheet || type == Resource::Script || type == Resource::Font || type == Resource::Image) + if (type == Resource::CSSStyleSheet || type == Resource::Script || type == Resource::Font || type == Resource::Image || type == Resource::Raw) modifiedPriority++; } @@ -801,11 +801,6 @@ return frame()->frameScheduler()->loadingTaskRunner(); } -bool FrameFetchContext::isInspectorAttached() const -{ - return InspectorInstrumentation::instrumentingAgentsFor(frame()->document()); -} - DEFINE_TRACE(FrameFetchContext) { visitor->trace(m_document);
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.h b/third_party/WebKit/Source/core/loader/FrameFetchContext.h index c379549e..abce8e5d 100644 --- a/third_party/WebKit/Source/core/loader/FrameFetchContext.h +++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.h
@@ -99,7 +99,7 @@ bool updateTimingInfoForIFrameNavigation(ResourceTimingInfo*) override; void sendImagePing(const KURL&) override; void addConsoleMessage(const String&) const override; - SecurityOrigin* securityOrigin() const override; + SecurityOrigin* getSecurityOrigin() const override; void upgradeInsecureRequest(FetchRequest&) override; void addClientHintsIfNecessary(FetchRequest&) override; void addCSPHeaderIfNecessary(Resource::Type, FetchRequest&) override; @@ -113,7 +113,6 @@ void countClientHintsViewportWidth() override; WebTaskRunner* loadingTaskRunner() const override; - bool isInspectorAttached() const override; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp index b1da3cd..c000b80 100644 --- a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp +++ b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
@@ -42,6 +42,7 @@ #include "core/testing/DummyPageHolder.h" #include "platform/network/ResourceRequest.h" #include "platform/weborigin/KURL.h" +#include "public/platform/WebAddressSpace.h" #include "testing/gmock/include/gmock/gmock-generated-function-mockers.h" #include "testing/gtest/include/gtest/gtest.h" @@ -476,6 +477,9 @@ // Base case, no priority change. Note that this triggers m_imageFetched, which will matter for setFetchDeferLateScripts() case below. EXPECT_EQ(ResourceLoadPriorityVeryLow, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityVeryLow, Resource::Image, request, ResourcePriority::NotVisible)); + // RAW (XHR/Fetch) should default to Medium with no experiments running + EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Raw, request, ResourcePriority::NotVisible)); + // Image visibility should increase priority EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityVeryLow, Resource::Image, request, ResourcePriority::Visible)); @@ -504,6 +508,9 @@ EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityVeryLow, Resource::Image, request, ResourcePriority::NotVisible)); EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityVeryLow, Resource::Image, request, ResourcePriority::Visible)); + // Re-test RAW (XHR/Fetch) with increased priorities + EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Raw, request, ResourcePriority::NotVisible)); + // Re-test font priority with increased prioriries settings->setFEtchIncreaseFontPriority(false); EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Font, request, ResourcePriority::NotVisible)); @@ -582,7 +589,7 @@ TEST_F(FrameFetchContextTest, SetIsExternalRequestForPublicDocument) { - EXPECT_EQ(WebURLRequest::AddressSpacePublic, document->addressSpace()); + EXPECT_EQ(WebAddressSpacePublic, document->addressSpace()); struct TestCase { const char* url; @@ -629,8 +636,8 @@ TEST_F(FrameFetchContextTest, SetIsExternalRequestForPrivateDocument) { - document->setAddressSpace(WebURLRequest::AddressSpacePrivate); - EXPECT_EQ(WebURLRequest::AddressSpacePrivate, document->addressSpace()); + document->setAddressSpace(WebAddressSpacePrivate); + EXPECT_EQ(WebAddressSpacePrivate, document->addressSpace()); struct TestCase { const char* url; @@ -677,8 +684,8 @@ TEST_F(FrameFetchContextTest, SetIsExternalRequestForLocalDocument) { - document->setAddressSpace(WebURLRequest::AddressSpaceLocal); - EXPECT_EQ(WebURLRequest::AddressSpaceLocal, document->addressSpace()); + document->setAddressSpace(WebAddressSpaceLocal); + EXPECT_EQ(WebAddressSpaceLocal, document->addressSpace()); struct TestCase { const char* url;
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp index 89cbfe37..aafb689 100644 --- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp +++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -421,7 +421,7 @@ HistoryCommitType historyCommitType = loadTypeToCommitType(m_loadType); if (historyCommitType == StandardCommit && (m_documentLoader->urlForHistory().isEmpty() || (opener() && !m_currentItem && m_documentLoader->originalRequest().url().isEmpty()))) historyCommitType = HistoryInertCommit; - else if (historyCommitType == InitialCommitInChildFrame && MixedContentChecker::isMixedContent(m_frame->tree().top()->securityContext()->securityOrigin(), m_documentLoader->url())) + else if (historyCommitType == InitialCommitInChildFrame && MixedContentChecker::isMixedContent(m_frame->tree().top()->securityContext()->getSecurityOrigin(), m_documentLoader->url())) historyCommitType = HistoryInertCommit; setHistoryItemStateForCommit(historyCommitType, HistoryNavigationType::DifferentDocument); @@ -797,7 +797,7 @@ if (m_frame->script().executeScriptIfJavaScriptURL(url)) return false; - if (!request.originDocument()->securityOrigin()->canDisplay(url)) { + if (!request.originDocument()->getSecurityOrigin()->canDisplay(url)) { reportLocalLoadFailed(m_frame, url.elidedString()); return false; } @@ -1449,10 +1449,10 @@ UseCounter::count(m_frame->domWindow()->document(), UseCounter::XFrameOptionsSameOrigin); RefPtr<SecurityOrigin> origin = SecurityOrigin::create(url); // Out-of-process ancestors are always a different origin. - if (!topFrame->isLocalFrame() || !origin->isSameSchemeHostPort(toLocalFrame(topFrame)->document()->securityOrigin())) + if (!topFrame->isLocalFrame() || !origin->isSameSchemeHostPort(toLocalFrame(topFrame)->document()->getSecurityOrigin())) return true; for (Frame* frame = m_frame->tree().parent(); frame; frame = frame->tree().parent()) { - if (!frame->isLocalFrame() || !origin->isSameSchemeHostPort(toLocalFrame(frame)->document()->securityOrigin())) { + if (!frame->isLocalFrame() || !origin->isSameSchemeHostPort(toLocalFrame(frame)->document()->getSecurityOrigin())) { UseCounter::count(m_frame->domWindow()->document(), UseCounter::XFrameOptionsSameOriginWithBadAncestorChain); break; }
diff --git a/third_party/WebKit/Source/core/loader/ImageLoader.cpp b/third_party/WebKit/Source/core/loader/ImageLoader.cpp index 59c5c6ab..f13a418e 100644 --- a/third_party/WebKit/Source/core/loader/ImageLoader.cpp +++ b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
@@ -242,7 +242,7 @@ CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(element.fastGetAttribute(HTMLNames::crossoriginAttr)); if (crossOrigin != CrossOriginAttributeNotSet) - request.setCrossOriginAccessControl(element.document().securityOrigin(), crossOrigin); + request.setCrossOriginAccessControl(element.document().getSecurityOrigin(), crossOrigin); if (clientHintsPreferences.shouldSendResourceWidth() && isHTMLImageElement(element)) request.setResourceWidth(toHTMLImageElement(element).getResourceWidth());
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.cpp b/third_party/WebKit/Source/core/loader/LinkLoader.cpp index 9f0beda2..024c817 100644 --- a/third_party/WebKit/Source/core/loader/LinkLoader.cpp +++ b/third_party/WebKit/Source/core/loader/LinkLoader.cpp
@@ -277,7 +277,7 @@ linkRequest.setPriority(document.fetcher()->loadPriority(resourceType, linkRequest)); if (crossOrigin != CrossOriginAttributeNotSet) - linkRequest.setCrossOriginAccessControl(document.securityOrigin(), crossOrigin); + linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), crossOrigin); Settings* settings = document.settings(); if (settings && settings->logPreload()) document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource, DebugMessageLevel, String("Preload triggered for " + href.host() + href.path()))); @@ -341,7 +341,7 @@ FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), FetchInitiatorTypeNames::link); if (crossOrigin != CrossOriginAttributeNotSet) - linkRequest.setCrossOriginAccessControl(document.securityOrigin(), crossOrigin); + linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), crossOrigin); setResource(LinkFetchResource::fetch(Resource::LinkPrefetch, linkRequest, document.fetcher())); }
diff --git a/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp b/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp index 5f11c90..a3a27f4 100644 --- a/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp +++ b/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp
@@ -41,6 +41,7 @@ #include "platform/weborigin/SchemeRegistry.h" #include "platform/weborigin/SecurityOrigin.h" #include "public/platform/Platform.h" +#include "public/platform/WebAddressSpace.h" #include "wtf/text/StringBuilder.h" namespace blink { @@ -54,7 +55,7 @@ KURL mainResourceUrlForFrame(Frame* frame) { if (frame->isRemoteFrame()) - return KURL(KURL(), frame->securityContext()->securityOrigin()->toString()); + return KURL(KURL(), frame->securityContext()->getSecurityOrigin()->toString()); return toLocalFrame(frame)->document()->url(); } @@ -66,7 +67,7 @@ // What about other "secure" contexts the SchemeRegistry knows about? We'll // use this method to measure the occurance of non-webby mixed content to // make sure we're not breaking the world without realizing it. - SecurityOrigin* origin = frame->securityContext()->securityOrigin(); + SecurityOrigin* origin = frame->securityContext()->getSecurityOrigin(); if (MixedContentChecker::isMixedContent(origin, url)) { if (origin->protocol() != "https") UseCounter::count(frame, UseCounter::MixedContentInNonHTTPSFrameThatRestrictsMixedContent); @@ -100,12 +101,12 @@ // Check the top frame first. if (Frame* top = frame->tree().top()) { measureStricterVersionOfIsMixedContent(top, url); - if (isMixedContent(top->securityContext()->securityOrigin(), url)) + if (isMixedContent(top->securityContext()->getSecurityOrigin(), url)) return top; } measureStricterVersionOfIsMixedContent(frame, url); - if (isMixedContent(frame->securityContext()->securityOrigin(), url)) + if (isMixedContent(frame->securityContext()->getSecurityOrigin(), url)) return frame; // No mixed content, no problem. @@ -320,7 +321,7 @@ // distinguish mixed content signals from different frames on the // same page. FrameLoaderClient* client = frame->loader().client(); - SecurityOrigin* securityOrigin = mixedFrame->securityContext()->securityOrigin(); + SecurityOrigin* securityOrigin = mixedFrame->securityContext()->getSecurityOrigin(); bool allowed = false; // If we're in strict mode, we'll automagically fail everything, and intentionally skip @@ -354,7 +355,7 @@ // allowing an insecure script to run on https://a.com and not // realizing that they are in fact allowing an insecure script on // https://b.com. - if (!settings->allowRunningOfInsecureContent() && requestIsSubframeSubresource(effectiveFrame, frameType) && isMixedContent(frame->securityContext()->securityOrigin(), url)) { + if (!settings->allowRunningOfInsecureContent() && requestIsSubframeSubresource(effectiveFrame, frameType) && isMixedContent(frame->securityContext()->getSecurityOrigin(), url)) { UseCounter::count(mixedFrame, UseCounter::BlockableMixedContentInSubframeBlocked); allowed = false; break; @@ -410,7 +411,7 @@ // distinguish mixed content signals from different frames on the // same page. FrameLoaderClient* client = frame->loader().client(); - SecurityOrigin* securityOrigin = mixedFrame->securityContext()->securityOrigin(); + SecurityOrigin* securityOrigin = mixedFrame->securityContext()->getSecurityOrigin(); bool allowed = false; // If we're in strict mode, we'll automagically fail everything, and intentionally skip @@ -464,7 +465,7 @@ return; // Just count these for the moment, don't block them. - if (Platform::current()->isReservedIPAddress(resourceIPAddress) && frame->document()->addressSpace() == WebURLRequest::AddressSpacePublic) + if (Platform::current()->isReservedIPAddress(resourceIPAddress) && frame->document()->addressSpace() == WebAddressSpacePublic) UseCounter::count(frame->document(), UseCounter::MixedContentPrivateHostnameInPublicHostname); }
diff --git a/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp b/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp index 16ce767..a5f2726 100644 --- a/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp +++ b/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp
@@ -328,7 +328,7 @@ // fragment part, we don't need to schedule the location change. We'll skip this // optimization for cross-origin navigations to minimize the navigator's ability to // execute timing attacks. - if (originDocument->securityOrigin()->canAccess(m_frame->document()->securityOrigin())) { + if (originDocument->getSecurityOrigin()->canAccess(m_frame->document()->getSecurityOrigin())) { KURL parsedURL(ParsedURLString, url); if (parsedURL.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier(m_frame->document()->url(), parsedURL)) { FrameLoadRequest request(originDocument, m_frame->document()->completeURL(url), "_self");
diff --git a/third_party/WebKit/Source/core/loader/PingLoader.cpp b/third_party/WebKit/Source/core/loader/PingLoader.cpp index 22ab060..bea5c41 100644 --- a/third_party/WebKit/Source/core/loader/PingLoader.cpp +++ b/third_party/WebKit/Source/core/loader/PingLoader.cpp
@@ -67,7 +67,7 @@ void PingLoader::loadImage(LocalFrame* frame, const KURL& url) { - if (!frame->document()->securityOrigin()->canDisplay(url)) { + if (!frame->document()->getSecurityOrigin()->canDisplay(url)) { FrameLoader::reportLocalLoadFailed(frame, url.getString()); return; } @@ -117,7 +117,7 @@ FetchInitiatorInfo initiatorInfo; initiatorInfo.name = FetchInitiatorTypeNames::violationreport; - PingLoader::start(frame, request, initiatorInfo, SecurityOrigin::create(reportURL)->isSameSchemeHostPort(frame->document()->securityOrigin()) ? AllowStoredCredentials : DoNotAllowStoredCredentials); + PingLoader::start(frame, request, initiatorInfo, SecurityOrigin::create(reportURL)->isSameSchemeHostPort(frame->document()->getSecurityOrigin()) ? AllowStoredCredentials : DoNotAllowStoredCredentials); } void PingLoader::start(LocalFrame* frame, ResourceRequest& request, const FetchInitiatorInfo& initiatorInfo, StoredCredentials credentialsAllowed)
diff --git a/third_party/WebKit/Source/core/loader/TextResourceDecoderBuilder.cpp b/third_party/WebKit/Source/core/loader/TextResourceDecoderBuilder.cpp index 077ad6d0..3f458a24 100644 --- a/third_party/WebKit/Source/core/loader/TextResourceDecoderBuilder.cpp +++ b/third_party/WebKit/Source/core/loader/TextResourceDecoderBuilder.cpp
@@ -39,7 +39,7 @@ static inline bool canReferToParentFrameEncoding(const LocalFrame* frame, const LocalFrame* parentFrame) { - return parentFrame && parentFrame->document()->securityOrigin()->canAccess(frame->document()->securityOrigin()); + return parentFrame && parentFrame->document()->getSecurityOrigin()->canAccess(frame->document()->getSecurityOrigin()); }
diff --git a/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp b/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp index 958e886..c7461a1 100644 --- a/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp +++ b/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp
@@ -110,10 +110,10 @@ FetchRequest cueRequest(ResourceRequest(document().completeURL(url)), FetchInitiatorTypeNames::texttrack); if (crossOrigin != CrossOriginAttributeNotSet) { - cueRequest.setCrossOriginAccessControl(document().securityOrigin(), crossOrigin); - } else if (!document().securityOrigin()->canRequestNoSuborigin(url)) { + cueRequest.setCrossOriginAccessControl(document().getSecurityOrigin(), crossOrigin); + } else if (!document().getSecurityOrigin()->canRequestNoSuborigin(url)) { // Text track elements without 'crossorigin' set on the parent are "No CORS"; report error if not same-origin. - corsPolicyPreventedLoad(document().securityOrigin(), url); + corsPolicyPreventedLoad(document().getSecurityOrigin(), url); return false; }
diff --git a/third_party/WebKit/Source/core/loader/appcache/ApplicationCache.cpp b/third_party/WebKit/Source/core/loader/appcache/ApplicationCache.cpp index 050aa2f..62cd2ff 100644 --- a/third_party/WebKit/Source/core/loader/appcache/ApplicationCache.cpp +++ b/third_party/WebKit/Source/core/loader/appcache/ApplicationCache.cpp
@@ -103,7 +103,7 @@ return EventTargetNames::ApplicationCache; } -ExecutionContext* ApplicationCache::executionContext() const +ExecutionContext* ApplicationCache::getExecutionContext() const { if (m_frame) return m_frame->document();
diff --git a/third_party/WebKit/Source/core/loader/appcache/ApplicationCache.h b/third_party/WebKit/Source/core/loader/appcache/ApplicationCache.h index 032800b..ec4438e 100644 --- a/third_party/WebKit/Source/core/loader/appcache/ApplicationCache.h +++ b/third_party/WebKit/Source/core/loader/appcache/ApplicationCache.h
@@ -74,7 +74,7 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(obsolete); const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; static const AtomicString& toEventType(ApplicationCacheHost::EventID);
diff --git a/third_party/WebKit/Source/core/loader/appcache/ApplicationCacheHost.cpp b/third_party/WebKit/Source/core/loader/appcache/ApplicationCacheHost.cpp index bc444ac..2c571c5 100644 --- a/third_party/WebKit/Source/core/loader/appcache/ApplicationCacheHost.cpp +++ b/third_party/WebKit/Source/core/loader/appcache/ApplicationCacheHost.cpp
@@ -242,7 +242,7 @@ return; const AtomicString& eventType = ApplicationCache::toEventType(id); - if (eventType.isEmpty() || !m_domApplicationCache->executionContext()) + if (eventType.isEmpty() || !m_domApplicationCache->getExecutionContext()) return; RefPtrWillBeRawPtr<Event> event = nullptr; if (id == PROGRESS_EVENT)
diff --git a/third_party/WebKit/Source/core/origin_trials/DocumentOriginTrialContext.h b/third_party/WebKit/Source/core/origin_trials/DocumentOriginTrialContext.h index 01231c9..d407ae8 100644 --- a/third_party/WebKit/Source/core/origin_trials/DocumentOriginTrialContext.h +++ b/third_party/WebKit/Source/core/origin_trials/DocumentOriginTrialContext.h
@@ -24,7 +24,7 @@ explicit DocumentOriginTrialContext(Document*); ~DocumentOriginTrialContext() override = default; - ExecutionContext* executionContext() override { return m_parent; } + ExecutionContext* getExecutionContext() override { return m_parent; } Vector<String> getTokens() override; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.cpp b/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.cpp index 6d9cc0f2..ae76e45 100644 --- a/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.cpp +++ b/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.cpp
@@ -19,7 +19,7 @@ String getCurrentOrigin(ExecutionContext* executionContext) { - return executionContext->securityOrigin()->toString(); + return executionContext->getSecurityOrigin()->toString(); } String getDisabledMessage(const String& featureName) @@ -49,8 +49,8 @@ // Feature trials are only enabled for secure origins bool isSecure = errorMessage - ? executionContext()->isSecureContext(*errorMessage) - : executionContext()->isSecureContext(); + ? getExecutionContext()->isSecureContext(*errorMessage) + : getExecutionContext()->isSecureContext(); if (!isSecure) { // The execution context should always set a message here, if a valid // pointer was passed in. If it does not, then we should find out why @@ -74,7 +74,7 @@ bool OriginTrialContext::hasValidToken(Vector<String> tokens, const String& featureName, String* errorMessage, WebTrialTokenValidator* validator) { - String origin = getCurrentOrigin(executionContext()); + String origin = getCurrentOrigin(getExecutionContext()); for (const String& token : tokens) { // Check with the validator service to verify the signature.
diff --git a/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.h b/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.h index 044a7d88..6b9f0d7 100644 --- a/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.h +++ b/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.h
@@ -39,7 +39,7 @@ static const char kTrialHeaderName[]; virtual ~OriginTrialContext() = default; - virtual ExecutionContext* executionContext() = 0; + virtual ExecutionContext* getExecutionContext() = 0; virtual Vector<String> getTokens() = 0; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp b/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp index a033346..cad84e14 100644 --- a/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp +++ b/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp
@@ -79,7 +79,7 @@ ~TestOriginTrialContext() override = default; - ExecutionContext* executionContext() override { return m_parent.get(); } + ExecutionContext* getExecutionContext() override { return m_parent.get(); } void addToken(const String& token) {
diff --git a/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.cpp b/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.cpp index f2b361f..dea7235 100644 --- a/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.cpp +++ b/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.cpp
@@ -14,7 +14,7 @@ bool InternalsFrobulate::frobulate(ScriptState* scriptState, Internals& internals, ExceptionState& exceptionState) { String errorMessage; - if (!OriginTrials::experimentalFrameworkSampleAPIEnabled(scriptState->executionContext(), errorMessage)) { + if (!OriginTrials::experimentalFrameworkSampleAPIEnabled(scriptState->getExecutionContext(), errorMessage)) { exceptionState.throwDOMException(NotSupportedError, errorMessage); return false; }
diff --git a/third_party/WebKit/Source/core/page/DragController.cpp b/third_party/WebKit/Source/core/page/DragController.cpp index 5288d40..0abda3e 100644 --- a/third_party/WebKit/Source/core/page/DragController.cpp +++ b/third_party/WebKit/Source/core/page/DragController.cpp
@@ -215,7 +215,7 @@ RefPtrWillBeRawPtr<FrameView> frameView(mainFrame->view()); if (frameView) { - DataTransferAccessPolicy policy = (!m_documentUnderMouse || m_documentUnderMouse->securityOrigin()->isLocal()) ? DataTransferReadable : DataTransferTypesReadable; + DataTransferAccessPolicy policy = (!m_documentUnderMouse || m_documentUnderMouse->getSecurityOrigin()->isLocal()) ? DataTransferReadable : DataTransferTypesReadable; DataTransfer* dataTransfer = createDraggingDataTransfer(policy, dragData); dataTransfer->setSourceOperation(dragData->draggingSourceOperationMask()); mainFrame->eventHandler().cancelDragAndDrop(createMouseEvent(dragData), dataTransfer); @@ -331,7 +331,7 @@ if (!m_documentUnderMouse) return false; - if (m_dragInitiator && !m_documentUnderMouse->securityOrigin()->canAccess(m_dragInitiator->securityOrigin())) + if (m_dragInitiator && !m_documentUnderMouse->getSecurityOrigin()->canAccess(m_dragInitiator->getSecurityOrigin())) return false; bool isHandlingDrag = false; @@ -589,7 +589,7 @@ return false; RefPtrWillBeRawPtr<FrameView> viewProtector(mainFrame->view()); - DataTransferAccessPolicy policy = m_documentUnderMouse->securityOrigin()->isLocal() ? DataTransferReadable : DataTransferTypesReadable; + DataTransferAccessPolicy policy = m_documentUnderMouse->getSecurityOrigin()->isLocal() ? DataTransferReadable : DataTransferTypesReadable; DataTransfer* dataTransfer = createDraggingDataTransfer(policy, dragData); DragOperation srcOpMask = dragData->draggingSourceOperationMask(); dataTransfer->setSourceOperation(srcOpMask);
diff --git a/third_party/WebKit/Source/core/page/EventSource.cpp b/third_party/WebKit/Source/core/page/EventSource.cpp index 90a5c5d..f194725 100644 --- a/third_party/WebKit/Source/core/page/EventSource.cpp +++ b/third_party/WebKit/Source/core/page/EventSource.cpp
@@ -113,9 +113,9 @@ { ASSERT(m_state == CONNECTING); ASSERT(!m_loader); - ASSERT(executionContext()); + ASSERT(getExecutionContext()); - ExecutionContext& executionContext = *this->executionContext(); + ExecutionContext& executionContext = *this->getExecutionContext(); ResourceRequest request(m_url); request.setHTTPMethod(HTTPNames::GET); request.setHTTPHeaderField(HTTPNames::Accept, "text/event-stream"); @@ -129,7 +129,7 @@ request.setHTTPHeaderField(HTTPNames::Last_Event_ID, AtomicString(reinterpret_cast<const LChar*>(lastEventIdUtf8.data()), lastEventIdUtf8.length())); } - SecurityOrigin* origin = executionContext.securityOrigin(); + SecurityOrigin* origin = executionContext.getSecurityOrigin(); ThreadableLoaderOptions options; options.preflightPolicy = PreventPreflight; @@ -150,7 +150,7 @@ void EventSource::networkRequestEnded() { - InspectorInstrumentation::didFinishEventSourceRequest(executionContext(), this); + InspectorInstrumentation::didFinishEventSourceRequest(getExecutionContext(), this); m_loader = nullptr; @@ -213,9 +213,9 @@ return EventTargetNames::EventSource; } -ExecutionContext* EventSource::executionContext() const +ExecutionContext* EventSource::getExecutionContext() const { - return ContextLifecycleObserver::executionContext(); + return ContextLifecycleObserver::getExecutionContext(); } void EventSource::didReceiveResponse(unsigned long, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle) @@ -238,7 +238,7 @@ message.append(charset); message.appendLiteral("\") that is not UTF-8. Aborting the connection."); // FIXME: We are missing the source line. - executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message.toString())); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message.toString())); } } else { // To keep the signal-to-noise ratio low, we only log 200-response with an invalid MIME type. @@ -248,7 +248,7 @@ message.append(response.mimeType()); message.appendLiteral("\") that is not \"text/event-stream\". Aborting the connection."); // FIXME: We are missing the source line. - executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message.toString())); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message.toString())); } } @@ -299,7 +299,7 @@ ASSERT(m_loader); String message = "EventSource cannot load " + error.failingURL() + ". " + error.localizedDescription(); - executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); abortConnectionAttempt(); } @@ -316,7 +316,7 @@ RefPtrWillBeRawPtr<MessageEvent> e = MessageEvent::create(); e->initMessageEvent(eventType, false, false, SerializedScriptValueFactory::instance().create(data), m_eventStreamOrigin, lastEventId, 0, nullptr); - InspectorInstrumentation::willDispatchEventSourceEvent(executionContext(), this, eventType, lastEventId, data); + InspectorInstrumentation::willDispatchEventSourceEvent(getExecutionContext(), this, eventType, lastEventId, data); dispatchEvent(e); }
diff --git a/third_party/WebKit/Source/core/page/EventSource.h b/third_party/WebKit/Source/core/page/EventSource.h index 73ef19c..08cb7e13 100644 --- a/third_party/WebKit/Source/core/page/EventSource.h +++ b/third_party/WebKit/Source/core/page/EventSource.h
@@ -77,7 +77,7 @@ void close(); const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // Note: We don't need to override suspend() because it is noop since // ScopedPageLoadDeferrer calls Page::setDefersLoading() and it defers
diff --git a/third_party/WebKit/Source/core/page/NetworkStateNotifierTest.cpp b/third_party/WebKit/Source/core/page/NetworkStateNotifierTest.cpp index 143dbd0..a9779230 100644 --- a/third_party/WebKit/Source/core/page/NetworkStateNotifierTest.cpp +++ b/third_party/WebKit/Source/core/page/NetworkStateNotifierTest.cpp
@@ -100,7 +100,7 @@ { } - ExecutionContext* executionContext() + ExecutionContext* getExecutionContext() { return m_document.get(); } @@ -119,12 +119,12 @@ void addObserverOnNotification(StateObserver* observer, StateObserver* observerToAdd) { - observer->setNotificationCallback(bind(&NetworkStateNotifier::addObserver, &m_notifier, observerToAdd, executionContext())); + observer->setNotificationCallback(bind(&NetworkStateNotifier::addObserver, &m_notifier, observerToAdd, getExecutionContext())); } void removeObserverOnNotification(StateObserver* observer, StateObserver* observerToRemove) { - observer->setNotificationCallback(bind(&NetworkStateNotifier::removeObserver, &m_notifier, observerToRemove, executionContext())); + observer->setNotificationCallback(bind(&NetworkStateNotifier::removeObserver, &m_notifier, observerToRemove, getExecutionContext())); } bool verifyObservations(const StateObserver& observer, WebConnectionType type, double maxBandwidthMbps) @@ -142,7 +142,7 @@ TEST_F(NetworkStateNotifierTest, AddObserver) { StateObserver observer; - m_notifier.addObserver(&observer, executionContext()); + m_notifier.addObserver(&observer, getExecutionContext()); EXPECT_TRUE(verifyObservations(observer, WebConnectionTypeNone, kNoneMaxBandwidthMbps)); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); @@ -153,9 +153,9 @@ TEST_F(NetworkStateNotifierTest, RemoveObserver) { StateObserver observer1, observer2; - m_notifier.addObserver(&observer1, executionContext()); - m_notifier.removeObserver(&observer1, executionContext()); - m_notifier.addObserver(&observer2, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); + m_notifier.removeObserver(&observer1, getExecutionContext()); + m_notifier.addObserver(&observer2, getExecutionContext()); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); EXPECT_TRUE(verifyObservations(observer1, WebConnectionTypeNone, kNoneMaxBandwidthMbps)); @@ -165,8 +165,8 @@ TEST_F(NetworkStateNotifierTest, RemoveSoleObserver) { StateObserver observer1; - m_notifier.addObserver(&observer1, executionContext()); - m_notifier.removeObserver(&observer1, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); + m_notifier.removeObserver(&observer1, getExecutionContext()); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); EXPECT_TRUE(verifyObservations(observer1, WebConnectionTypeNone, kNoneMaxBandwidthMbps)); @@ -175,7 +175,7 @@ TEST_F(NetworkStateNotifierTest, AddObserverWhileNotifying) { StateObserver observer1, observer2; - m_notifier.addObserver(&observer1, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); addObserverOnNotification(&observer1, &observer2); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); @@ -186,7 +186,7 @@ TEST_F(NetworkStateNotifierTest, RemoveSoleObserverWhileNotifying) { StateObserver observer1; - m_notifier.addObserver(&observer1, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); removeObserverOnNotification(&observer1, &observer1); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); @@ -199,8 +199,8 @@ TEST_F(NetworkStateNotifierTest, RemoveCurrentObserverWhileNotifying) { StateObserver observer1, observer2; - m_notifier.addObserver(&observer1, executionContext()); - m_notifier.addObserver(&observer2, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); + m_notifier.addObserver(&observer2, getExecutionContext()); removeObserverOnNotification(&observer1, &observer1); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); @@ -215,8 +215,8 @@ TEST_F(NetworkStateNotifierTest, RemovePastObserverWhileNotifying) { StateObserver observer1, observer2; - m_notifier.addObserver(&observer1, executionContext()); - m_notifier.addObserver(&observer2, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); + m_notifier.addObserver(&observer2, getExecutionContext()); removeObserverOnNotification(&observer2, &observer1); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); @@ -231,9 +231,9 @@ TEST_F(NetworkStateNotifierTest, RemoveFutureObserverWhileNotifying) { StateObserver observer1, observer2, observer3; - m_notifier.addObserver(&observer1, executionContext()); - m_notifier.addObserver(&observer2, executionContext()); - m_notifier.addObserver(&observer3, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); + m_notifier.addObserver(&observer2, getExecutionContext()); + m_notifier.addObserver(&observer3, getExecutionContext()); removeObserverOnNotification(&observer1, &observer2); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); @@ -245,7 +245,7 @@ TEST_F(NetworkStateNotifierTest, MultipleContextsAddObserver) { StateObserver observer1, observer2; - m_notifier.addObserver(&observer1, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); m_notifier.addObserver(&observer2, executionContext2()); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps); @@ -256,7 +256,7 @@ TEST_F(NetworkStateNotifierTest, RemoveContext) { StateObserver observer1, observer2; - m_notifier.addObserver(&observer1, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); m_notifier.addObserver(&observer2, executionContext2()); m_notifier.removeObserver(&observer2, executionContext2()); @@ -268,9 +268,9 @@ TEST_F(NetworkStateNotifierTest, RemoveAllContexts) { StateObserver observer1, observer2; - m_notifier.addObserver(&observer1, executionContext()); + m_notifier.addObserver(&observer1, getExecutionContext()); m_notifier.addObserver(&observer2, executionContext2()); - m_notifier.removeObserver(&observer1, executionContext()); + m_notifier.removeObserver(&observer1, getExecutionContext()); m_notifier.removeObserver(&observer2, executionContext2()); setConnection(WebConnectionTypeBluetooth, kBluetoothMaxBandwidthMbps);
diff --git a/third_party/WebKit/Source/core/paint/SVGImagePainter.cpp b/third_party/WebKit/Source/core/paint/SVGImagePainter.cpp index 65e121c..885451b2 100644 --- a/third_party/WebKit/Source/core/paint/SVGImagePainter.cpp +++ b/third_party/WebKit/Source/core/paint/SVGImagePainter.cpp
@@ -14,6 +14,7 @@ #include "core/paint/SVGPaintContext.h" #include "core/paint/TransformRecorder.h" #include "core/svg/SVGImageElement.h" +#include "core/svg/graphics/SVGImage.h" #include "platform/graphics/GraphicsContext.h" #include "third_party/skia/include/core/SkPicture.h" @@ -80,14 +81,20 @@ ImageResource* cachedImage = m_layoutSVGImage.imageResource()->cachedImage(); - // Images with preserveAspectRatio=none should force non-uniform - // scaling. This can be achieved by setting the image's container size to - // its viewport size (i.e. if a viewBox is available - use that - else use intrinsic size.) - // See: http://www.w3.org/TR/SVG/single-page.html, 7.8 The 'preserveAspectRatio' attribute. - FloatSize intrinsicSize; - FloatSize intrinsicRatio; - cachedImage->computeIntrinsicDimensions(intrinsicSize, intrinsicRatio); - return intrinsicRatio; + // Images with preserveAspectRatio=none should force non-uniform scaling. This can be achieved + // by setting the image's container size to its viewport size (i.e. concrete object size + // returned by the default sizing algorithm.) See + // https://www.w3.org/TR/SVG/single-page.html#coords-PreserveAspectRatioAttribute and + // https://drafts.csswg.org/css-images-3/#default-sizing. + + // Avoid returning the size of the broken image. + if (cachedImage->errorOccurred()) + return FloatSize(); + + if (cachedImage->image()->isSVGImage()) + return toSVGImage(cachedImage->image())->concreteObjectSize(m_layoutSVGImage.objectBoundingBox().size()); + + return FloatSize(cachedImage->image()->size()); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/streams/ReadableStream.cpp b/third_party/WebKit/Source/core/streams/ReadableStream.cpp index 3525d3d..77ff8d7 100644 --- a/third_party/WebKit/Source/core/streams/ReadableStream.cpp +++ b/third_party/WebKit/Source/core/streams/ReadableStream.cpp
@@ -28,7 +28,7 @@ explicit ConstUndefined(ScriptState* scriptState) : ScriptFunction(scriptState) { } ScriptValue call(ScriptValue value) override { - return ScriptValue(scriptState(), v8::Undefined(scriptState()->isolate())); + return ScriptValue(getScriptState(), v8::Undefined(getScriptState()->isolate())); } };
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamController.h b/third_party/WebKit/Source/core/streams/ReadableStreamController.h index 435db846..adc54f02 100644 --- a/third_party/WebKit/Source/core/streams/ReadableStreamController.h +++ b/third_party/WebKit/Source/core/streams/ReadableStreamController.h
@@ -21,7 +21,7 @@ DEFINE_INLINE_TRACE() {} explicit ReadableStreamController(ScriptValue stream) - : m_scriptState(stream.scriptState()) + : m_scriptState(stream.getScriptState()) , m_stream(stream.isolate(), stream.v8Value()) { m_stream.setWeak(&m_stream, ReadableStreamController::streamWeakCallback);
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamImpl.h b/third_party/WebKit/Source/core/streams/ReadableStreamImpl.h index 9704911..aeb47f6 100644 --- a/third_party/WebKit/Source/core/streams/ReadableStreamImpl.h +++ b/third_party/WebKit/Source/core/streams/ReadableStreamImpl.h
@@ -139,7 +139,7 @@ void resolveAllPendingReadsAsDone() override { for (auto& resolver : m_pendingReads) { - ScriptState* scriptState = resolver->scriptState(); + ScriptState* scriptState = resolver->getScriptState(); if (!scriptState->contextIsValid()) continue; ScriptState::Scope scope(scriptState); @@ -181,7 +181,7 @@ } ScriptPromiseResolver* resolver = m_pendingReads.takeFirst(); - ScriptState* scriptState = resolver->scriptState(); + ScriptState* scriptState = resolver->getScriptState(); if (!scriptState->contextIsValid()) return false; ScriptState::Scope scope(scriptState);
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamReaderTest.cpp b/third_party/WebKit/Source/core/streams/ReadableStreamReaderTest.cpp index 352a30f..af7b78e 100644 --- a/third_party/WebKit/Source/core/streams/ReadableStreamReaderTest.cpp +++ b/third_party/WebKit/Source/core/streams/ReadableStreamReaderTest.cpp
@@ -49,7 +49,7 @@ ScriptValue call(ScriptValue value) override { ASSERT(!value.isEmpty()); - *m_value = toCoreString(value.v8Value()->ToString(scriptState()->context()).ToLocalChecked()); + *m_value = toCoreString(value.v8Value()->ToString(getScriptState()->context()).ToLocalChecked()); return value; } @@ -74,14 +74,14 @@ ScriptValue call(ScriptValue result) override { ASSERT(!result.isEmpty()); - v8::Isolate* isolate = scriptState()->isolate(); + v8::Isolate* isolate = getScriptState()->isolate(); if (!result.isObject()) { return result; } v8::Local<v8::Object> object = result.v8Value().As<v8::Object>(); v8::Local<v8::String> doneString = v8String(isolate, "done"); v8::Local<v8::String> valueString = v8String(isolate, "value"); - v8::Local<v8::Context> context = scriptState()->context(); + v8::Local<v8::Context> context = getScriptState()->context(); v8::Maybe<bool> hasDone = object->Has(context, doneString); v8::Maybe<bool> hasValue = object->Has(context, valueString); @@ -98,7 +98,7 @@ m_result->isSet = true; m_result->isDone = done.As<v8::Boolean>()->Value(); - m_result->valueString = toCoreString(value->ToString(scriptState()->context()).ToLocalChecked()); + m_result->valueString = toCoreString(value->ToString(getScriptState()->context()).ToLocalChecked()); return result; } @@ -136,18 +136,18 @@ m_stream->error(DOMException::create(AbortError, "done")); } - ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } - v8::Isolate* isolate() { return scriptState()->isolate(); } - ExecutionContext* executionContext() { return scriptState()->executionContext(); } + ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } + v8::Isolate* isolate() { return getScriptState()->isolate(); } + ExecutionContext* getExecutionContext() { return getScriptState()->getExecutionContext(); } v8::Local<v8::Function> createCaptor(String* value) { - return StringCapturingFunction::createFunction(scriptState(), value); + return StringCapturingFunction::createFunction(getScriptState(), value); } v8::Local<v8::Function> createResultCaptor(ReadResult* value) { - return ReadResultCapturingFunction::createFunction(scriptState(), value); + return ReadResultCapturingFunction::createFunction(getScriptState(), value); } OwnPtr<DummyPageHolder> m_page; @@ -156,22 +156,22 @@ TEST_F(ReadableStreamReaderTest, Construct) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_TRUE(reader->isActive()); EXPECT_FALSE(exceptionState.hadException()); } TEST_F(ReadableStreamReaderTest, Release) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); String onFulfilled, onRejected; - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_TRUE(reader->isActive()); - reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); + reader->closed(getScriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); reader->releaseLock(exceptionState); EXPECT_FALSE(reader->isActive()); EXPECT_FALSE(exceptionState.hadException()); @@ -183,7 +183,7 @@ EXPECT_TRUE(onFulfilled.isNull()); EXPECT_EQ("AbortError: the reader is already released", onRejected); - ReadableStreamReader* another = new ReadableStreamReader(executionContext(), m_stream); + ReadableStreamReader* another = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_TRUE(another->isActive()); EXPECT_FALSE(reader->isActive()); reader->releaseLock(exceptionState); @@ -194,9 +194,9 @@ TEST_F(ReadableStreamReaderTest, ReadAfterRelease) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_TRUE(reader->isActive()); reader->releaseLock(exceptionState); EXPECT_FALSE(exceptionState.hadException()); @@ -204,7 +204,7 @@ ReadResult result; String onRejected; - reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); + reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); EXPECT_FALSE(result.isSet); EXPECT_TRUE(onRejected.isNull()); @@ -217,11 +217,11 @@ TEST_F(ReadableStreamReaderTest, ReleaseShouldFailWhenCalledWhileReading) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_TRUE(reader->isActive()); - reader->read(scriptState()); + reader->read(getScriptState()); reader->releaseLock(exceptionState); EXPECT_TRUE(reader->isActive()); @@ -236,16 +236,16 @@ TEST_F(ReadableStreamReaderTest, EnqueueThenRead) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); m_stream->enqueue("hello"); m_stream->enqueue("world"); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); ReadResult result; String onRejected; - reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); + reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); EXPECT_FALSE(result.isSet); EXPECT_TRUE(onRejected.isNull()); @@ -259,7 +259,7 @@ ReadResult result2; String onRejected2; - reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2)); + reader->read(getScriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2)); EXPECT_FALSE(result2.isSet); EXPECT_TRUE(onRejected2.isNull()); @@ -275,15 +275,15 @@ TEST_F(ReadableStreamReaderTest, ReadThenEnqueue) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); ReadResult result, result2; String onRejected, onRejected2; - reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); - reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2)); + reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); + reader->read(getScriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2)); EXPECT_FALSE(result.isSet); EXPECT_TRUE(onRejected.isNull()); @@ -319,9 +319,9 @@ TEST_F(ReadableStreamReaderTest, ClosedReader) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); m_stream->close(); @@ -331,8 +331,8 @@ ReadResult result; String onReadRejected; v8::MicrotasksScope::PerformCheckpoint(isolate()); - reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); - reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&onReadRejected)); + reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); + reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onReadRejected)); EXPECT_TRUE(onClosedFulfilled.isNull()); EXPECT_TRUE(onClosedRejected.isNull()); EXPECT_FALSE(result.isSet); @@ -350,9 +350,9 @@ TEST_F(ReadableStreamReaderTest, ErroredReader) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); m_stream->error(DOMException::create(SyntaxError, "some error")); @@ -362,8 +362,8 @@ String onClosedFulfilled, onClosedRejected; String onReadFulfilled, onReadRejected; v8::MicrotasksScope::PerformCheckpoint(isolate()); - reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); - reader->read(scriptState()).then(createCaptor(&onReadFulfilled), createCaptor(&onReadRejected)); + reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); + reader->read(getScriptState()).then(createCaptor(&onReadFulfilled), createCaptor(&onReadRejected)); EXPECT_TRUE(onClosedFulfilled.isNull()); EXPECT_TRUE(onClosedRejected.isNull()); EXPECT_TRUE(onReadFulfilled.isNull()); @@ -379,15 +379,15 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenClosed) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); ReadResult result, result2; String onRejected, onRejected2; - reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); - reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2)); + reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); + reader->read(getScriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2)); v8::MicrotasksScope::PerformCheckpoint(isolate()); EXPECT_FALSE(result.isSet); @@ -417,15 +417,15 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeRejectedWhenErrored) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); String onFulfilled, onFulfilled2; String onRejected, onRejected2; - reader->read(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); - reader->read(scriptState()).then(createCaptor(&onFulfilled2), createCaptor(&onRejected2)); + reader->read(getScriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); + reader->read(getScriptState()).then(createCaptor(&onFulfilled2), createCaptor(&onRejected2)); v8::MicrotasksScope::PerformCheckpoint(isolate()); EXPECT_TRUE(onFulfilled.isNull()); @@ -450,15 +450,15 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenCanceled) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); ReadResult result, result2; String onRejected, onRejected2; - reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); - reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2)); + reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected)); + reader->read(getScriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2)); v8::MicrotasksScope::PerformCheckpoint(isolate()); EXPECT_FALSE(result.isSet); @@ -466,7 +466,7 @@ EXPECT_FALSE(result2.isSet); EXPECT_TRUE(onRejected2.isNull()); - reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isolate()))); + reader->cancel(getScriptState(), ScriptValue(getScriptState(), v8::Undefined(isolate()))); EXPECT_TRUE(reader->isActive()); EXPECT_FALSE(result.isSet); EXPECT_TRUE(onRejected.isNull()); @@ -489,14 +489,14 @@ TEST_F(ReadableStreamReaderTest, CancelShouldNotWorkWhenNotActive) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); reader->releaseLock(exceptionState); EXPECT_FALSE(reader->isActive()); String onFulfilled, onRejected; - reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isolate()))).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); + reader->cancel(getScriptState(), ScriptValue(getScriptState(), v8::Undefined(isolate()))).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); EXPECT_TRUE(onFulfilled.isNull()); @@ -512,15 +512,15 @@ TEST_F(ReadableStreamReaderTest, Cancel) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); String onClosedFulfilled, onClosedRejected; String onCancelFulfilled, onCancelRejected; - reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); - reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isolate()))).then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRejected)); + reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); + reader->cancel(getScriptState(), ScriptValue(getScriptState(), v8::Undefined(isolate()))).then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRejected)); EXPECT_EQ(ReadableStream::Closed, m_stream->stateInternal()); EXPECT_TRUE(onClosedFulfilled.isNull()); @@ -538,13 +538,13 @@ TEST_F(ReadableStreamReaderTest, Close) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); String onFulfilled, onRejected; - reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); + reader->closed(getScriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); m_stream->close(); @@ -560,13 +560,13 @@ TEST_F(ReadableStreamReaderTest, Error) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); - ReadableStreamReader* reader = new ReadableStreamReader(executionContext(), m_stream); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); + ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext(), m_stream); EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); String onFulfilled, onRejected; - reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); + reader->closed(getScriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); m_stream->error(DOMException::create(SyntaxError, "some error"));
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamTest.cpp b/third_party/WebKit/Source/core/streams/ReadableStreamTest.cpp index 031ecdd..8ee42c8 100644 --- a/third_party/WebKit/Source/core/streams/ReadableStreamTest.cpp +++ b/third_party/WebKit/Source/core/streams/ReadableStreamTest.cpp
@@ -51,7 +51,7 @@ ScriptValue call(ScriptValue value) override { ASSERT(!value.isEmpty()); - *m_value = toCoreString(value.v8Value()->ToString(scriptState()->context()).ToLocalChecked()); + *m_value = toCoreString(value.v8Value()->ToString(getScriptState()->context()).ToLocalChecked()); return value; } @@ -114,12 +114,12 @@ { } - ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } - v8::Isolate* isolate() { return scriptState()->isolate(); } + ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } + v8::Isolate* isolate() { return getScriptState()->isolate(); } v8::Local<v8::Function> createCaptor(String* value) { - return StringCapturingFunction::createFunction(scriptState(), value); + return StringCapturingFunction::createFunction(getScriptState(), value); } StringStream* construct(MockStrategy* strategy) @@ -159,8 +159,8 @@ TEST_F(ReadableStreamTest, Start) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); Checkpoint checkpoint; { InSequence s; @@ -193,8 +193,8 @@ TEST_F(ReadableStreamTest, StartFail) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = new StringStream(m_underlyingSource); EXPECT_FALSE(exceptionState.hadException()); EXPECT_FALSE(stream->isStarted()); @@ -212,8 +212,8 @@ TEST_F(ReadableStreamTest, ErrorAndEnqueue) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); stream->error(DOMException::create(NotFoundError, "error")); @@ -226,8 +226,8 @@ TEST_F(ReadableStreamTest, CloseAndEnqueue) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); stream->close(); @@ -240,8 +240,8 @@ TEST_F(ReadableStreamTest, CloseWhenErrored) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); @@ -253,8 +253,8 @@ TEST_F(ReadableStreamTest, ReadQueue) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); Checkpoint checkpoint; @@ -289,8 +289,8 @@ TEST_F(ReadableStreamTest, CloseWhenReadable) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); EXPECT_TRUE(stream->enqueue("hello")); @@ -302,7 +302,7 @@ EXPECT_FALSE(stream->isPulling()); EXPECT_TRUE(stream->isDraining()); - stream->read(scriptState()); + stream->read(getScriptState()); v8::MicrotasksScope::PerformCheckpoint(isolate()); @@ -310,7 +310,7 @@ EXPECT_FALSE(stream->isPulling()); EXPECT_TRUE(stream->isDraining()); - stream->read(scriptState()); + stream->read(getScriptState()); EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); EXPECT_FALSE(stream->isPulling()); @@ -319,15 +319,15 @@ TEST_F(ReadableStreamTest, CancelWhenClosed) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); String onFulfilled, onRejected; stream->close(); EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); EXPECT_FALSE(stream->isDisturbed()); - ScriptPromise promise = stream->cancel(scriptState(), ScriptValue()); + ScriptPromise promise = stream->cancel(getScriptState(), ScriptValue()); EXPECT_TRUE(stream->isDisturbed()); EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); @@ -342,15 +342,15 @@ TEST_F(ReadableStreamTest, CancelWhenErrored) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); String onFulfilled, onRejected; stream->error(DOMException::create(NotFoundError, "error")); EXPECT_EQ(ReadableStream::Errored, stream->stateInternal()); EXPECT_FALSE(stream->isDisturbed()); - ScriptPromise promise = stream->cancel(scriptState(), ScriptValue()); + ScriptPromise promise = stream->cancel(getScriptState(), ScriptValue()); EXPECT_TRUE(stream->isDisturbed()); EXPECT_EQ(ReadableStream::Errored, stream->stateInternal()); @@ -365,24 +365,24 @@ TEST_F(ReadableStreamTest, CancelWhenReadable) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); String onFulfilled, onRejected; String onCancelFulfilled, onCancelRejected; - ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason")); - ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptState()->isolate(), "hello")); + ScriptValue reason(getScriptState(), v8String(getScriptState()->isolate(), "reason")); + ScriptPromise promise = ScriptPromise::cast(getScriptState(), v8String(getScriptState()->isolate(), "hello")); { InSequence s; - EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).WillOnce(ReturnPointee(&promise)); + EXPECT_CALL(*m_underlyingSource, cancelSource(getScriptState(), reason)).WillOnce(ReturnPointee(&promise)); } stream->enqueue("hello"); EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); EXPECT_FALSE(stream->isDisturbed()); - ScriptPromise cancelResult = stream->cancel(scriptState(), reason); + ScriptPromise cancelResult = stream->cancel(getScriptState(), reason); EXPECT_TRUE(stream->isDisturbed()); cancelResult.then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRejected)); @@ -399,18 +399,18 @@ TEST_F(ReadableStreamTest, CancelWhenLocked) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); String onFulfilled, onRejected; StringStream* stream = construct(); - ReadableStreamReader* reader = stream->getReader(scriptState()->executionContext(), exceptionState); + ReadableStreamReader* reader = stream->getReader(getScriptState()->getExecutionContext(), exceptionState); EXPECT_TRUE(reader->isActive()); EXPECT_FALSE(exceptionState.hadException()); EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); EXPECT_FALSE(stream->isDisturbed()); - stream->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isolate()))).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); + stream->cancel(getScriptState(), ScriptValue(getScriptState(), v8::Undefined(isolate()))).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); EXPECT_FALSE(stream->isDisturbed()); EXPECT_TRUE(onFulfilled.isNull()); @@ -426,8 +426,8 @@ TEST_F(ReadableStreamTest, ReadableArrayBufferStreamCompileTest) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); // This test tests if ReadableStreamImpl<DOMArrayBuffer> can be // instantiated. new ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBuffer>>(m_underlyingSource); @@ -435,8 +435,8 @@ TEST_F(ReadableStreamTest, ReadableArrayBufferViewStreamCompileTest) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); // This test tests if ReadableStreamImpl<DOMArrayBufferVIew> can be // instantiated. new ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBufferView>>(m_underlyingSource); @@ -444,8 +444,8 @@ TEST_F(ReadableStreamTest, BackpressureOnEnqueueing) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); auto strategy = MockStrategy::create(); Checkpoint checkpoint; @@ -478,8 +478,8 @@ TEST_F(ReadableStreamTest, BackpressureOnReading) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); auto strategy = MockStrategy::create(); Checkpoint checkpoint; @@ -512,14 +512,14 @@ stream->enqueue("world"); checkpoint.Call(0); - stream->read(scriptState()); + stream->read(getScriptState()); checkpoint.Call(1); - stream->read(scriptState()); + stream->read(getScriptState()); checkpoint.Call(2); stream->enqueue("foo"); stream->enqueue("bar"); checkpoint.Call(3); - stream->read(scriptState()); + stream->read(getScriptState()); checkpoint.Call(4); stream->error(DOMException::create(AbortError, "done")); @@ -528,17 +528,17 @@ // Note: Detailed tests are on ReadableStreamReaderTest. TEST_F(ReadableStreamTest, ReadableStreamReader) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); - ReadableStreamReader* reader = stream->getReader(scriptState()->executionContext(), exceptionState); + ReadableStreamReader* reader = stream->getReader(getScriptState()->getExecutionContext(), exceptionState); ASSERT_TRUE(reader); EXPECT_FALSE(exceptionState.hadException()); EXPECT_TRUE(reader->isActive()); EXPECT_TRUE(stream->isLockedTo(reader)); - ReadableStreamReader* another = stream->getReader(scriptState()->executionContext(), exceptionState); + ReadableStreamReader* another = stream->getReader(getScriptState()->getExecutionContext(), exceptionState); ASSERT_EQ(nullptr, another); EXPECT_TRUE(exceptionState.hadException()); EXPECT_TRUE(reader->isActive()); @@ -547,17 +547,17 @@ TEST_F(ReadableStreamTest, GetClosedReader) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); stream->close(); - ReadableStreamReader* reader = stream->getReader(scriptState()->executionContext(), exceptionState); + ReadableStreamReader* reader = stream->getReader(getScriptState()->getExecutionContext(), exceptionState); ASSERT_TRUE(reader); EXPECT_FALSE(exceptionState.hadException()); String onFulfilled, onRejected; - reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); + reader->closed(getScriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); EXPECT_TRUE(reader->isActive()); EXPECT_TRUE(onFulfilled.isNull()); @@ -570,17 +570,17 @@ TEST_F(ReadableStreamTest, GetErroredReader) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); StringStream* stream = construct(); stream->error(DOMException::create(SyntaxError, "some error")); - ReadableStreamReader* reader = stream->getReader(scriptState()->executionContext(), exceptionState); + ReadableStreamReader* reader = stream->getReader(getScriptState()->getExecutionContext(), exceptionState); ASSERT_TRUE(reader); EXPECT_FALSE(exceptionState.hadException()); String onFulfilled, onRejected; - reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); + reader->closed(getScriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); EXPECT_TRUE(reader->isActive()); EXPECT_TRUE(onFulfilled.isNull()); @@ -593,8 +593,8 @@ TEST_F(ReadableStreamTest, StrictStrategy) { - ScriptState::Scope scope(scriptState()); - ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()); + ScriptState::Scope scope(getScriptState()); + ExceptionState exceptionState(ExceptionState::ConstructionContext, "property", "interface", getScriptState()->context()->Global(), isolate()); Checkpoint checkpoint; { InSequence s; @@ -613,23 +613,23 @@ EXPECT_CALL(*m_underlyingSource, pullSource()); } StringStream* stream = new StringStream(m_underlyingSource, new StringStream::StrictStrategy); - ReadableStreamReader* reader = stream->getReader(scriptState()->executionContext(), exceptionState); + ReadableStreamReader* reader = stream->getReader(getScriptState()->getExecutionContext(), exceptionState); checkpoint.Call(0); stream->didSourceStart(); checkpoint.Call(1); EXPECT_FALSE(stream->isPulling()); - reader->read(scriptState()); + reader->read(getScriptState()); EXPECT_TRUE(stream->isPulling()); checkpoint.Call(2); stream->enqueue("hello"); EXPECT_FALSE(stream->isPulling()); checkpoint.Call(3); - reader->read(scriptState()); + reader->read(getScriptState()); EXPECT_TRUE(stream->isPulling()); checkpoint.Call(4); - reader->read(scriptState()); + reader->read(getScriptState()); EXPECT_TRUE(stream->isPulling()); checkpoint.Call(5); stream->enqueue("hello"); @@ -641,10 +641,10 @@ stream->enqueue("hello"); EXPECT_FALSE(stream->isPulling()); checkpoint.Call(8); - reader->read(scriptState()); + reader->read(getScriptState()); EXPECT_FALSE(stream->isPulling()); checkpoint.Call(9); - reader->read(scriptState()); + reader->read(getScriptState()); EXPECT_TRUE(stream->isPulling()); stream->error(DOMException::create(AbortError, "done"));
diff --git a/third_party/WebKit/Source/core/streams/UnderlyingSourceBase.h b/third_party/WebKit/Source/core/streams/UnderlyingSourceBase.h index 8105024..c0ad8ad 100644 --- a/third_party/WebKit/Source/core/streams/UnderlyingSourceBase.h +++ b/third_party/WebKit/Source/core/streams/UnderlyingSourceBase.h
@@ -39,7 +39,7 @@ protected: explicit UnderlyingSourceBase(ScriptState* scriptState) - : ContextLifecycleObserver(scriptState->executionContext()) + : ContextLifecycleObserver(scriptState->getExecutionContext()) { }
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp b/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp index 94a3d82..efd30cf 100644 --- a/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp +++ b/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp
@@ -109,11 +109,6 @@ return m_image->imageHasRelativeSize(); } -void StyleFetchedImage::computeIntrinsicDimensions(const LayoutObject*, FloatSize& intrinsicSize, FloatSize& intrinsicRatio) -{ - m_image->computeIntrinsicDimensions(intrinsicSize, intrinsicRatio); -} - bool StyleFetchedImage::usesImageContainerSize() const { return m_image->usesImageContainerSize();
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImage.h b/third_party/WebKit/Source/core/style/StyleFetchedImage.h index 863852d..6ada1f8a 100644 --- a/third_party/WebKit/Source/core/style/StyleFetchedImage.h +++ b/third_party/WebKit/Source/core/style/StyleFetchedImage.h
@@ -52,7 +52,6 @@ bool errorOccurred() const override; LayoutSize imageSize(const LayoutObject*, float multiplier, const LayoutSize& defaultObjectSize) const override; bool imageHasRelativeSize() const override; - void computeIntrinsicDimensions(const LayoutObject*, FloatSize& intrinsicSize, FloatSize& intrinsicRatio) override; bool usesImageContainerSize() const override; void addClient(LayoutObject*) override; void removeClient(LayoutObject*) override;
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp index f3c10499..3b11cf7 100644 --- a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp +++ b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp
@@ -113,11 +113,6 @@ return m_bestFitImage->imageHasRelativeSize(); } -void StyleFetchedImageSet::computeIntrinsicDimensions(const LayoutObject*, FloatSize& intrinsicSize, FloatSize& intrinsicRatio) -{ - m_bestFitImage->computeIntrinsicDimensions(intrinsicSize, intrinsicRatio); -} - bool StyleFetchedImageSet::usesImageContainerSize() const { return m_bestFitImage->usesImageContainerSize();
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h index 1703d2f..066c574 100644 --- a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h +++ b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
@@ -64,7 +64,6 @@ bool errorOccurred() const override; LayoutSize imageSize(const LayoutObject*, float multiplier, const LayoutSize& defaultObjectSize) const override; bool imageHasRelativeSize() const override; - void computeIntrinsicDimensions(const LayoutObject*, FloatSize& intrinsicSize, FloatSize& intrinsicRatio) override; bool usesImageContainerSize() const override; void addClient(LayoutObject*) override; void removeClient(LayoutObject*) override;
diff --git a/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp b/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp index 435b937..80374c8 100644 --- a/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp +++ b/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp
@@ -57,14 +57,6 @@ return defaultObjectSize; } -void StyleGeneratedImage::computeIntrinsicDimensions(const LayoutObject* layoutObject, FloatSize& intrinsicSize, FloatSize& intrinsicRatio) -{ - // At a zoom level of 1 the image is guaranteed to have an integer size. - LayoutSize size = imageSize(layoutObject, 1, LayoutSize()); - ASSERT(size.fraction().isZero()); - intrinsicSize = intrinsicRatio = FloatSize(size); -} - void StyleGeneratedImage::addClient(LayoutObject* layoutObject) { m_imageGeneratorValue->addClient(layoutObject, IntSize());
diff --git a/third_party/WebKit/Source/core/style/StyleGeneratedImage.h b/third_party/WebKit/Source/core/style/StyleGeneratedImage.h index 2b94f78..437c7a7 100644 --- a/third_party/WebKit/Source/core/style/StyleGeneratedImage.h +++ b/third_party/WebKit/Source/core/style/StyleGeneratedImage.h
@@ -46,7 +46,6 @@ LayoutSize imageSize(const LayoutObject*, float multiplier, const LayoutSize& defaultObjectSize) const override; bool imageHasRelativeSize() const override { return !m_fixedSize; } - void computeIntrinsicDimensions(const LayoutObject*, FloatSize& intrinsicSize, FloatSize& intrinsicRatio) override; bool usesImageContainerSize() const override { return !m_fixedSize; } void addClient(LayoutObject*) override; void removeClient(LayoutObject*) override;
diff --git a/third_party/WebKit/Source/core/style/StyleImage.h b/third_party/WebKit/Source/core/style/StyleImage.h index 4caa2c42..90c4e5e7 100644 --- a/third_party/WebKit/Source/core/style/StyleImage.h +++ b/third_party/WebKit/Source/core/style/StyleImage.h
@@ -58,7 +58,6 @@ virtual bool isLoaded() const { return true; } virtual bool errorOccurred() const { return false; } virtual LayoutSize imageSize(const LayoutObject*, float multiplier, const LayoutSize& defaultObjectSize) const = 0; - virtual void computeIntrinsicDimensions(const LayoutObject*, FloatSize& intrinsicSize, FloatSize& intrinsicRatio) = 0; virtual bool imageHasRelativeSize() const = 0; virtual bool usesImageContainerSize() const = 0; virtual void addClient(LayoutObject*) = 0;
diff --git a/third_party/WebKit/Source/core/style/StyleInvalidImage.h b/third_party/WebKit/Source/core/style/StyleInvalidImage.h index 79e78993..2b60fa3 100644 --- a/third_party/WebKit/Source/core/style/StyleInvalidImage.h +++ b/third_party/WebKit/Source/core/style/StyleInvalidImage.h
@@ -25,7 +25,6 @@ LayoutSize imageSize(const LayoutObject*, float /*multiplier*/, const LayoutSize& /*defaultObjectSize*/) const override { return LayoutSize(); } bool imageHasRelativeSize() const override { return false; } - void computeIntrinsicDimensions(const LayoutObject*, FloatSize& /* intrinsicSize */, FloatSize& /* intrinsicRatio */) override { } bool usesImageContainerSize() const override { return false; } void addClient(LayoutObject*) override { } void removeClient(LayoutObject*) override { }
diff --git a/third_party/WebKit/Source/core/style/StylePendingImage.h b/third_party/WebKit/Source/core/style/StylePendingImage.h index ee165802..03d6059 100644 --- a/third_party/WebKit/Source/core/style/StylePendingImage.h +++ b/third_party/WebKit/Source/core/style/StylePendingImage.h
@@ -63,7 +63,6 @@ LayoutSize imageSize(const LayoutObject*, float /*multiplier*/, const LayoutSize& /*defaultObjectSize*/) const override { return LayoutSize(); } bool imageHasRelativeSize() const override { return false; } - void computeIntrinsicDimensions(const LayoutObject*, FloatSize& /* intrinsicSize */, FloatSize& /* intrinsicRatio */) override { } bool usesImageContainerSize() const override { return false; } void addClient(LayoutObject*) override { } void removeClient(LayoutObject*) override { }
diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp b/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp index f566ad8..1bd519d 100644 --- a/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp +++ b/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp
@@ -401,21 +401,6 @@ return toLocalFrame(m_page->mainFrame())->view(); } -void SVGImage::computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio) -{ - SVGSVGElement* rootElement = svgRootElement(m_page.get()); - if (!rootElement) - return; - - intrinsicSize = FloatSize(rootElement->intrinsicWidth(), rootElement->intrinsicHeight()); - if (rootElement->preserveAspectRatio()->currentValue()->align() == SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_NONE) - return; - - intrinsicRatio = rootElement->viewBox()->currentValue()->value().size(); - if (intrinsicRatio.isEmpty()) - intrinsicRatio = intrinsicSize; -} - // FIXME: support CatchUpAnimation = CatchUp. void SVGImage::startAnimation(CatchUpAnimation) {
diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImage.h b/third_party/WebKit/Source/core/svg/graphics/SVGImage.h index 04e8e5eca..f6c234f3 100644 --- a/third_party/WebKit/Source/core/svg/graphics/SVGImage.h +++ b/third_party/WebKit/Source/core/svg/graphics/SVGImage.h
@@ -94,7 +94,6 @@ IntSize containerSize() const; bool usesContainerSize() const override { return true; } - void computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio) override; bool dataChanged(bool allDataReceived) override;
diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImageForContainer.h b/third_party/WebKit/Source/core/svg/graphics/SVGImageForContainer.h index 3f8cd37..05ea96c 100644 --- a/third_party/WebKit/Source/core/svg/graphics/SVGImageForContainer.h +++ b/third_party/WebKit/Source/core/svg/graphics/SVGImageForContainer.h
@@ -49,10 +49,6 @@ bool usesContainerSize() const override { return m_image->usesContainerSize(); } bool hasRelativeSize() const override { return m_image->hasRelativeSize(); } - void computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio) override - { - m_image->computeIntrinsicDimensions(intrinsicSize, intrinsicRatio); - } void draw(SkCanvas*, const SkPaint&, const FloatRect&, const FloatRect&, RespectImageOrientationEnum, ImageClampingMode) override;
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp index 12f24bf..be3f7e03 100644 --- a/third_party/WebKit/Source/core/testing/Internals.cpp +++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -244,14 +244,14 @@ } Internals::Internals(ScriptState* scriptState) - : ContextLifecycleObserver(scriptState->executionContext()) + : ContextLifecycleObserver(scriptState->getExecutionContext()) , m_runtimeFlags(InternalRuntimeFlags::create()) { } Document* Internals::contextDocument() const { - return toDocument(executionContext()); + return toDocument(getExecutionContext()); } LocalFrame* Internals::frame() const @@ -2283,7 +2283,7 @@ v8::Local<v8::Value> v8Value = value.v8Value(); ASSERT(v8Value->IsNumber()); int intValue = v8Value.As<v8::Integer>()->Value(); - return ScriptValue(scriptState(), v8::Integer::New(scriptState()->isolate(), intValue + 1)); + return ScriptValue(getScriptState(), v8::Integer::New(getScriptState()->isolate(), intValue + 1)); } };
diff --git a/third_party/WebKit/Source/core/testing/NullExecutionContext.h b/third_party/WebKit/Source/core/testing/NullExecutionContext.h index 9f88e8c..70f72d2 100644 --- a/third_party/WebKit/Source/core/testing/NullExecutionContext.h +++ b/third_party/WebKit/Source/core/testing/NullExecutionContext.h
@@ -27,7 +27,7 @@ void postTask(const WebTraceLocation&, PassOwnPtr<ExecutionContextTask>) override; EventTarget* errorEventTarget() override { return nullptr; } - EventQueue* eventQueue() const override { return m_queue.get(); } + EventQueue* getEventQueue() const override { return m_queue.get(); } bool tasksNeedSuspension() override { return m_tasksNeedSuspension; } void setTasksNeedSuspension(bool flag) { m_tasksNeedSuspension = flag; }
diff --git a/third_party/WebKit/Source/core/testing/v8/WebCoreTestSupport.cpp b/third_party/WebKit/Source/core/testing/v8/WebCoreTestSupport.cpp index 31c5437..7b225b9 100644 --- a/third_party/WebKit/Source/core/testing/v8/WebCoreTestSupport.cpp +++ b/third_party/WebKit/Source/core/testing/v8/WebCoreTestSupport.cpp
@@ -40,7 +40,7 @@ { ScriptState* scriptState = ScriptState::from(context); v8::Local<v8::Object> global = scriptState->context()->Global(); - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); if (executionContext->isDocument()) return toV8(Internals::create(scriptState), global, scriptState->isolate()); return v8::Local<v8::Value>(); @@ -65,7 +65,7 @@ ScriptState* scriptState = ScriptState::from(context); ScriptState::Scope scope(scriptState); - Document* document = toDocument(scriptState->executionContext()); + Document* document = toDocument(scriptState->getExecutionContext()); ASSERT(document); LocalFrame* frame = document->frame(); // Should the document have been detached, the page is assumed being destroyed (=> no reset required.)
diff --git a/third_party/WebKit/Source/core/timing/Performance.cpp b/third_party/WebKit/Source/core/timing/Performance.cpp index 683c9c7..8b236f6 100644 --- a/third_party/WebKit/Source/core/timing/Performance.cpp +++ b/third_party/WebKit/Source/core/timing/Performance.cpp
@@ -64,7 +64,7 @@ { } -ExecutionContext* Performance::executionContext() const +ExecutionContext* Performance::getExecutionContext() const { if (!frame()) return nullptr;
diff --git a/third_party/WebKit/Source/core/timing/Performance.h b/third_party/WebKit/Source/core/timing/Performance.h index 92c9ca1..42681246 100644 --- a/third_party/WebKit/Source/core/timing/Performance.h +++ b/third_party/WebKit/Source/core/timing/Performance.h
@@ -51,7 +51,7 @@ } ~Performance() override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; MemoryInfo* memory(); PerformanceNavigation* navigation() const;
diff --git a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp index 9923bc07..2028b932 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp +++ b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
@@ -227,8 +227,8 @@ if (isResourceTimingBufferFull() && !hasObserverFor(PerformanceEntry::Resource)) return; SecurityOrigin* securityOrigin = nullptr; - if (ExecutionContext* context = executionContext()) - securityOrigin = context->securityOrigin(); + if (ExecutionContext* context = getExecutionContext()) + securityOrigin = context->getSecurityOrigin(); if (!securityOrigin) return;
diff --git a/third_party/WebKit/Source/core/timing/PerformanceObserver.cpp b/third_party/WebKit/Source/core/timing/PerformanceObserver.cpp index bd5e7b3..e7b8e1e 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceObserver.cpp +++ b/third_party/WebKit/Source/core/timing/PerformanceObserver.cpp
@@ -79,7 +79,7 @@ bool PerformanceObserver::shouldBeSuspended() const { - return m_callback->executionContext() && m_callback->executionContext()->activeDOMObjectsAreSuspended(); + return m_callback->getExecutionContext() && m_callback->getExecutionContext()->activeDOMObjectsAreSuspended(); } void PerformanceObserver::deliver()
diff --git a/third_party/WebKit/Source/core/timing/PerformanceObserverCallback.h b/third_party/WebKit/Source/core/timing/PerformanceObserverCallback.h index 7f44590c..02190b6 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceObserverCallback.h +++ b/third_party/WebKit/Source/core/timing/PerformanceObserverCallback.h
@@ -19,7 +19,7 @@ virtual ~PerformanceObserverCallback() { } virtual void handleEvent(PerformanceObserverEntryList*, PerformanceObserver*) = 0; - virtual ExecutionContext* executionContext() const = 0; + virtual ExecutionContext* getExecutionContext() const = 0; DEFINE_INLINE_VIRTUAL_TRACE() { } };
diff --git a/third_party/WebKit/Source/core/timing/PerformanceResourceTiming.idl b/third_party/WebKit/Source/core/timing/PerformanceResourceTiming.idl index d9a7cceb..2369022 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceResourceTiming.idl +++ b/third_party/WebKit/Source/core/timing/PerformanceResourceTiming.idl
@@ -34,7 +34,7 @@ interface PerformanceResourceTiming : PerformanceEntry { readonly attribute DOMString initiatorType; // TODO(philipj): readonly attribute DOMString nextHopProtocol; - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] readonly attribute DOMHighResTimeStamp workerStart; + readonly attribute DOMHighResTimeStamp workerStart; readonly attribute DOMHighResTimeStamp redirectStart; readonly attribute DOMHighResTimeStamp redirectEnd; readonly attribute DOMHighResTimeStamp fetchStart;
diff --git a/third_party/WebKit/Source/core/timing/WorkerPerformance.cpp b/third_party/WebKit/Source/core/timing/WorkerPerformance.cpp index 54ae42ae..a546eb0e 100644 --- a/third_party/WebKit/Source/core/timing/WorkerPerformance.cpp +++ b/third_party/WebKit/Source/core/timing/WorkerPerformance.cpp
@@ -43,9 +43,9 @@ { } -ExecutionContext* WorkerPerformance::executionContext() const +ExecutionContext* WorkerPerformance::getExecutionContext() const { - return ContextLifecycleObserver::executionContext(); + return ContextLifecycleObserver::getExecutionContext(); } DEFINE_TRACE(WorkerPerformance)
diff --git a/third_party/WebKit/Source/core/timing/WorkerPerformance.h b/third_party/WebKit/Source/core/timing/WorkerPerformance.h index b041078..c62e55b5 100644 --- a/third_party/WebKit/Source/core/timing/WorkerPerformance.h +++ b/third_party/WebKit/Source/core/timing/WorkerPerformance.h
@@ -52,7 +52,7 @@ return new WorkerPerformance(context); } - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; MemoryInfo* memory();
diff --git a/third_party/WebKit/Source/core/timing/WorkerPerformance.idl b/third_party/WebKit/Source/core/timing/WorkerPerformance.idl index b3ac8ac..8894e34d 100644 --- a/third_party/WebKit/Source/core/timing/WorkerPerformance.idl +++ b/third_party/WebKit/Source/core/timing/WorkerPerformance.idl
@@ -42,23 +42,23 @@ // Performance Timeline // https://w3c.github.io/performance-timeline/#the-performance-interface // TODO(philipj): getEntries() should take an optional FilterOptions argument. - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] PerformanceEntryList getEntries(); - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] PerformanceEntryList getEntriesByType(DOMString entryType); - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] PerformanceEntryList getEntriesByName(DOMString name, optional DOMString entryType = null); + PerformanceEntryList getEntries(); + PerformanceEntryList getEntriesByType(DOMString entryType); + PerformanceEntryList getEntriesByName(DOMString name, optional DOMString entryType = null); // Resource Timing // https://w3c.github.io/resource-timing/#extensions-performance-interface - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] void clearResourceTimings(); - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] void setResourceTimingBufferSize(unsigned long maxSize); - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] attribute EventHandler onresourcetimingbufferfull; + void clearResourceTimings(); + void setResourceTimingBufferSize(unsigned long maxSize); + attribute EventHandler onresourcetimingbufferfull; // User Timing // https://w3c.github.io/user-timing/#extensions-performance-interface - [RuntimeEnabled=ServiceWorkerPerformanceTimeline, RaisesException] void mark(DOMString markName); - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] void clearMarks(optional DOMString markName = null); + [RaisesException] void mark(DOMString markName); + void clearMarks(optional DOMString markName = null); - [RuntimeEnabled=ServiceWorkerPerformanceTimeline, RaisesException] void measure(DOMString measureName, optional DOMString startMark = null, optional DOMString endMark = null); - [RuntimeEnabled=ServiceWorkerPerformanceTimeline] void clearMeasures(optional DOMString measureName = null); + [RaisesException] void measure(DOMString measureName, optional DOMString startMark = null, optional DOMString endMark = null); + void clearMeasures(optional DOMString measureName = null); // TODO(philipj): There is no spec for the Memory Info API, see blink-dev: // https://groups.google.com/a/chromium.org/d/msg/blink-dev/g5YRCGpC9vs/b4OJz71NmPwJ
diff --git a/third_party/WebKit/Source/core/workers/AbstractWorker.cpp b/third_party/WebKit/Source/core/workers/AbstractWorker.cpp index f60bda9..fc94b8195 100644 --- a/third_party/WebKit/Source/core/workers/AbstractWorker.cpp +++ b/third_party/WebKit/Source/core/workers/AbstractWorker.cpp
@@ -50,19 +50,19 @@ KURL AbstractWorker::resolveURL(const String& url, ExceptionState& exceptionState) { // FIXME: This should use the dynamic global scope (bug #27887) - KURL scriptURL = executionContext()->completeURL(url); + KURL scriptURL = getExecutionContext()->completeURL(url); if (!scriptURL.isValid()) { exceptionState.throwDOMException(SyntaxError, "'" + url + "' is not a valid URL."); return KURL(); } // We can safely expose the URL in the following exceptions, as these checks happen synchronously before redirection. JavaScript receives no new information. - if (!executionContext()->securityOrigin()->canRequestNoSuborigin(scriptURL)) { - exceptionState.throwSecurityError("Script at '" + scriptURL.elidedString() + "' cannot be accessed from origin '" + executionContext()->securityOrigin()->toString() + "'."); + if (!getExecutionContext()->getSecurityOrigin()->canRequestNoSuborigin(scriptURL)) { + exceptionState.throwSecurityError("Script at '" + scriptURL.elidedString() + "' cannot be accessed from origin '" + getExecutionContext()->getSecurityOrigin()->toString() + "'."); return KURL(); } - if (executionContext()->contentSecurityPolicy() && !executionContext()->contentSecurityPolicy()->allowWorkerContextFromSource(scriptURL)) { + if (getExecutionContext()->contentSecurityPolicy() && !getExecutionContext()->contentSecurityPolicy()->allowWorkerContextFromSource(scriptURL)) { exceptionState.throwSecurityError("Access to the script at '" + scriptURL.elidedString() + "' is denied by the document's Content Security Policy."); return KURL(); }
diff --git a/third_party/WebKit/Source/core/workers/AbstractWorker.h b/third_party/WebKit/Source/core/workers/AbstractWorker.h index d092c94..a90cb60 100644 --- a/third_party/WebKit/Source/core/workers/AbstractWorker.h +++ b/third_party/WebKit/Source/core/workers/AbstractWorker.h
@@ -50,7 +50,7 @@ WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(AbstractWorker); public: // EventTarget APIs - ExecutionContext* executionContext() const final { return ActiveDOMObject::executionContext(); } + ExecutionContext* getExecutionContext() const final { return ActiveDOMObject::getExecutionContext(); } DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(error);
diff --git a/third_party/WebKit/Source/core/workers/InProcessWorkerBase.cpp b/third_party/WebKit/Source/core/workers/InProcessWorkerBase.cpp index 349029c..0c46c5e 100644 --- a/third_party/WebKit/Source/core/workers/InProcessWorkerBase.cpp +++ b/third_party/WebKit/Source/core/workers/InProcessWorkerBase.cpp
@@ -55,6 +55,7 @@ *context, scriptURL, DenyCrossOriginRequests, + context->securityContext().addressSpace(), bind(&InProcessWorkerBase::onResponse, this), bind(&InProcessWorkerBase::onFinished, this)); @@ -89,7 +90,7 @@ void InProcessWorkerBase::onResponse() { - InspectorInstrumentation::didReceiveScriptResponse(executionContext(), m_scriptLoader->identifier()); + InspectorInstrumentation::didReceiveScriptResponse(getExecutionContext(), m_scriptLoader->identifier()); } void InProcessWorkerBase::onFinished() @@ -98,8 +99,8 @@ dispatchEvent(Event::createCancelable(EventTypeNames::error)); } else { ASSERT(m_contextProxy); - m_contextProxy->startWorkerGlobalScope(m_scriptLoader->url(), executionContext()->userAgent(), m_scriptLoader->script()); - InspectorInstrumentation::scriptImported(executionContext(), m_scriptLoader->identifier(), m_scriptLoader->script()); + m_contextProxy->startWorkerGlobalScope(m_scriptLoader->url(), getExecutionContext()->userAgent(), m_scriptLoader->script()); + InspectorInstrumentation::scriptImported(getExecutionContext(), m_scriptLoader->identifier(), m_scriptLoader->script()); } m_contentSecurityPolicy = m_scriptLoader->releaseContentSecurityPolicy(); m_scriptLoader = nullptr;
diff --git a/third_party/WebKit/Source/core/workers/SharedWorker.cpp b/third_party/WebKit/Source/core/workers/SharedWorker.cpp index 3f089e8..12da7b9b 100644 --- a/third_party/WebKit/Source/core/workers/SharedWorker.cpp +++ b/third_party/WebKit/Source/core/workers/SharedWorker.cpp
@@ -71,8 +71,8 @@ // We don't currently support nested workers, so workers can only be created from documents. Document* document = toDocument(context); - if (!document->securityOrigin()->canAccessSharedWorkers()) { - exceptionState.throwSecurityError("Access to shared workers is denied to origin '" + document->securityOrigin()->toString() + "'."); + if (!document->getSecurityOrigin()->canAccessSharedWorkers()) { + exceptionState.throwSecurityError("Access to shared workers is denied to origin '" + document->getSecurityOrigin()->toString() + "'."); return nullptr; }
diff --git a/third_party/WebKit/Source/core/workers/WorkerConsole.cpp b/third_party/WebKit/Source/core/workers/WorkerConsole.cpp index 00f2f11..33f96f7 100644 --- a/third_party/WebKit/Source/core/workers/WorkerConsole.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerConsole.cpp
@@ -55,7 +55,7 @@ { if (!m_scope) return nullptr; - return m_scope->executionContext(); + return m_scope->getExecutionContext(); } DEFINE_TRACE(WorkerConsole)
diff --git a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp index e4968cb..2c5aa68 100644 --- a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
@@ -88,7 +88,7 @@ { setSecurityOrigin(SecurityOrigin::create(url)); if (starterOriginPrivilageData) - securityOrigin()->transferPrivilegesFrom(starterOriginPrivilageData); + getSecurityOrigin()->transferPrivilegesFrom(starterOriginPrivilageData); if (m_workerClients) m_workerClients->reattachThread(); @@ -108,10 +108,10 @@ } for (const auto& policyAndType : headers) contentSecurityPolicy()->didReceiveHeader(policyAndType.first, policyAndType.second, ContentSecurityPolicyHeaderSourceHTTP); - contentSecurityPolicy()->bindToExecutionContext(executionContext()); + contentSecurityPolicy()->bindToExecutionContext(getExecutionContext()); } -ExecutionContext* WorkerGlobalScope::executionContext() const +ExecutionContext* WorkerGlobalScope::getExecutionContext() const { return const_cast<WorkerGlobalScope*>(this); } @@ -233,9 +233,9 @@ void WorkerGlobalScope::importScripts(const Vector<String>& urls, ExceptionState& exceptionState) { ASSERT(contentSecurityPolicy()); - ASSERT(executionContext()); + ASSERT(getExecutionContext()); - ExecutionContext& executionContext = *this->executionContext(); + ExecutionContext& executionContext = *this->getExecutionContext(); Vector<KURL> completedURLs; for (const String& urlString : urls) { @@ -254,7 +254,7 @@ for (const KURL& completeURL : completedURLs) { RefPtr<WorkerScriptLoader> scriptLoader(WorkerScriptLoader::create()); scriptLoader->setRequestContext(WebURLRequest::RequestContextScript); - scriptLoader->loadSynchronously(executionContext, completeURL, AllowCrossOriginRequests); + scriptLoader->loadSynchronously(executionContext, completeURL, AllowCrossOriginRequests, executionContext.securityContext().addressSpace()); // If the fetching attempt failed, throw a NetworkError exception and abort all these steps. if (scriptLoader->failed()) { @@ -320,7 +320,7 @@ return m_scriptController->isExecutionForbidden(); } -WorkerEventQueue* WorkerGlobalScope::eventQueue() const +WorkerEventQueue* WorkerGlobalScope::getEventQueue() const { return m_eventQueue.get(); } @@ -353,8 +353,8 @@ if (!m_deprecationWarningBits.hasRecordedMeasurement(feature)) { m_deprecationWarningBits.recordMeasurement(feature); ASSERT(!Deprecation::deprecationMessage(feature).isEmpty()); - ASSERT(executionContext()); - executionContext()->addConsoleMessage(ConsoleMessage::create(DeprecationMessageSource, WarningMessageLevel, Deprecation::deprecationMessage(feature))); + ASSERT(getExecutionContext()); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(DeprecationMessageSource, WarningMessageLevel, Deprecation::deprecationMessage(feature))); } } @@ -378,9 +378,9 @@ // |isSecureContext| check here, we can check the responsible // document for a privileged context at worker creation time, pass // it in via WorkerThreadStartupData, and check it here. - if (securityOrigin()->isPotentiallyTrustworthy()) + if (getSecurityOrigin()->isPotentiallyTrustworthy()) return true; - errorMessage = securityOrigin()->isPotentiallyTrustworthyErrorMessage(); + errorMessage = getSecurityOrigin()->isPotentiallyTrustworthyErrorMessage(); return false; }
diff --git a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.h b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.h index e5a2dba..5816921 100644 --- a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.h +++ b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.h
@@ -73,8 +73,8 @@ bool isWorkerGlobalScope() const final { return true; } - ExecutionContext* executionContext() const final; - ScriptWrappable* scriptWrappable() const final + ExecutionContext* getExecutionContext() const final; + ScriptWrappable* getScriptWrappable() const final { return const_cast<WorkerGlobalScope*>(this); } @@ -119,7 +119,7 @@ v8::Local<v8::Object> associateWithWrapper(v8::Isolate*, const WrapperTypeInfo*, v8::Local<v8::Object> wrapper) final; // ExecutionContext - WorkerEventQueue* eventQueue() const final; + WorkerEventQueue* getEventQueue() const final; SecurityContext& securityContext() final { return *this; } bool isContextThread() const final; @@ -135,7 +135,7 @@ WorkerClients* clients() { return m_workerClients.get(); } - using SecurityContext::securityOrigin; + using SecurityContext::getSecurityOrigin; using SecurityContext::contentSecurityPolicy; void addConsoleMessage(PassRefPtrWillBeRawPtr<ConsoleMessage>) final;
diff --git a/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp b/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp index 21d5c66..a246e1b 100644 --- a/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp
@@ -73,7 +73,7 @@ } // namespace WorkerMessagingProxy::WorkerMessagingProxy(InProcessWorkerBase* workerObject, PassOwnPtrWillBeRawPtr<WorkerClients> workerClients) - : m_executionContext(workerObject->executionContext()) + : m_executionContext(workerObject->getExecutionContext()) , m_workerObjectProxy(WorkerObjectProxy::create(this)) , m_workerObject(workerObject) , m_mayBeDestroyed(false) @@ -108,7 +108,7 @@ return; } Document* document = toDocument(m_executionContext.get()); - SecurityOrigin* starterOrigin = document->securityOrigin(); + SecurityOrigin* starterOrigin = document->getSecurityOrigin(); ContentSecurityPolicy* csp = m_workerObject->contentSecurityPolicy() ? m_workerObject->contentSecurityPolicy() : document->contentSecurityPolicy(); ASSERT(csp);
diff --git a/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h b/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h index aac6138..6367fc2 100644 --- a/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h +++ b/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h
@@ -74,7 +74,7 @@ void workerThreadTerminated(); void workerThreadCreated(); - ExecutionContext* executionContext() const { return m_executionContext.get(); } + ExecutionContext* getExecutionContext() const { return m_executionContext.get(); } protected: WorkerMessagingProxy(InProcessWorkerBase*, PassOwnPtrWillBeRawPtr<WorkerClients>);
diff --git a/third_party/WebKit/Source/core/workers/WorkerObjectProxy.cpp b/third_party/WebKit/Source/core/workers/WorkerObjectProxy.cpp index 7fb674d6..0bd3b33 100644 --- a/third_party/WebKit/Source/core/workers/WorkerObjectProxy.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerObjectProxy.cpp
@@ -49,57 +49,57 @@ void WorkerObjectProxy::postMessageToWorkerObject(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels) { - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::postMessageToWorkerObject, m_messagingProxy, message, channels)); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::postMessageToWorkerObject, m_messagingProxy, message, channels)); } void WorkerObjectProxy::postTaskToMainExecutionContext(PassOwnPtr<ExecutionContextTask> task) { - executionContext()->postTask(BLINK_FROM_HERE, task); + getExecutionContext()->postTask(BLINK_FROM_HERE, task); } void WorkerObjectProxy::confirmMessageFromWorkerObject(bool hasPendingActivity) { - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::confirmMessageFromWorkerObject, m_messagingProxy, hasPendingActivity)); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::confirmMessageFromWorkerObject, m_messagingProxy, hasPendingActivity)); } void WorkerObjectProxy::reportPendingActivity(bool hasPendingActivity) { - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::reportPendingActivity, m_messagingProxy, hasPendingActivity)); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::reportPendingActivity, m_messagingProxy, hasPendingActivity)); } void WorkerObjectProxy::reportException(const String& errorMessage, int lineNumber, int columnNumber, const String& sourceURL, int exceptionId) { - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::reportException, m_messagingProxy, errorMessage, lineNumber, columnNumber, sourceURL, exceptionId)); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::reportException, m_messagingProxy, errorMessage, lineNumber, columnNumber, sourceURL, exceptionId)); } void WorkerObjectProxy::reportConsoleMessage(PassRefPtrWillBeRawPtr<ConsoleMessage> consoleMessage) { - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::reportConsoleMessage, m_messagingProxy, consoleMessage->source(), consoleMessage->level(), consoleMessage->message(), consoleMessage->lineNumber(), consoleMessage->url())); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::reportConsoleMessage, m_messagingProxy, consoleMessage->source(), consoleMessage->level(), consoleMessage->message(), consoleMessage->lineNumber(), consoleMessage->url())); } void WorkerObjectProxy::postMessageToPageInspector(const String& message) { - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); if (context->isDocument()) toDocument(context)->postInspectorTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::postMessageToPageInspector, m_messagingProxy, message)); } void WorkerObjectProxy::postWorkerConsoleAgentEnabled() { - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); if (context->isDocument()) toDocument(context)->postInspectorTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::postWorkerConsoleAgentEnabled, m_messagingProxy)); } void WorkerObjectProxy::workerGlobalScopeClosed() { - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::terminateWorkerGlobalScope, m_messagingProxy)); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::terminateWorkerGlobalScope, m_messagingProxy)); } void WorkerObjectProxy::workerThreadTerminated() { // This will terminate the MessagingProxy. - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::workerThreadTerminated, m_messagingProxy)); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerMessagingProxy::workerThreadTerminated, m_messagingProxy)); } WorkerObjectProxy::WorkerObjectProxy(WorkerMessagingProxy* messagingProxy) @@ -107,10 +107,10 @@ { } -ExecutionContext* WorkerObjectProxy::executionContext() +ExecutionContext* WorkerObjectProxy::getExecutionContext() { ASSERT(m_messagingProxy); - return m_messagingProxy->executionContext(); + return m_messagingProxy->getExecutionContext(); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h b/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h index aac3d97e3..c1a60c7 100644 --- a/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h +++ b/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h
@@ -76,7 +76,7 @@ protected: WorkerObjectProxy(WorkerMessagingProxy*); - virtual ExecutionContext* executionContext(); + virtual ExecutionContext* getExecutionContext(); private: // This object always outlives this proxy.
diff --git a/third_party/WebKit/Source/core/workers/WorkerOrWorkletGlobalScope.h b/third_party/WebKit/Source/core/workers/WorkerOrWorkletGlobalScope.h index 3c369eb..86cbdb1 100644 --- a/third_party/WebKit/Source/core/workers/WorkerOrWorkletGlobalScope.h +++ b/third_party/WebKit/Source/core/workers/WorkerOrWorkletGlobalScope.h
@@ -15,7 +15,7 @@ class CORE_EXPORT WorkerOrWorkletGlobalScope : public ExecutionContext { public: - virtual ScriptWrappable* scriptWrappable() const = 0; + virtual ScriptWrappable* getScriptWrappable() const = 0; virtual WorkerOrWorkletScriptController* scriptController() = 0; };
diff --git a/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp b/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp index 2bf55411d..12c1b85 100644 --- a/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp
@@ -36,6 +36,7 @@ #include "platform/network/ResourceResponse.h" #include "platform/weborigin/SecurityOrigin.h" #include "public/platform/Platform.h" +#include "public/platform/WebAddressSpace.h" #include "public/platform/WebURLRequest.h" #include "wtf/OwnPtr.h" #include "wtf/RefPtr.h" @@ -50,7 +51,7 @@ , m_identifier(0) , m_appCacheID(0) , m_requestContext(WebURLRequest::RequestContextWorker) - , m_responseAddressSpace(WebURLRequest::AddressSpacePublic) + , m_responseAddressSpace(WebAddressSpacePublic) { } @@ -64,11 +65,11 @@ cancel(); } -void WorkerScriptLoader::loadSynchronously(ExecutionContext& executionContext, const KURL& url, CrossOriginRequestPolicy crossOriginRequestPolicy) +void WorkerScriptLoader::loadSynchronously(ExecutionContext& executionContext, const KURL& url, CrossOriginRequestPolicy crossOriginRequestPolicy, WebAddressSpace creationAddressSpace) { m_url = url; - ResourceRequest request(createResourceRequest(executionContext)); + ResourceRequest request(createResourceRequest(creationAddressSpace)); ASSERT_WITH_SECURITY_IMPLICATION(executionContext.isWorkerGlobalScope()); ThreadableLoaderOptions options; @@ -82,14 +83,14 @@ WorkerThreadableLoader::loadResourceSynchronously(toWorkerGlobalScope(executionContext), request, *this, options, resourceLoaderOptions); } -void WorkerScriptLoader::loadAsynchronously(ExecutionContext& executionContext, const KURL& url, CrossOriginRequestPolicy crossOriginRequestPolicy, PassOwnPtr<SameThreadClosure> responseCallback, PassOwnPtr<SameThreadClosure> finishedCallback) +void WorkerScriptLoader::loadAsynchronously(ExecutionContext& executionContext, const KURL& url, CrossOriginRequestPolicy crossOriginRequestPolicy, WebAddressSpace creationAddressSpace, PassOwnPtr<SameThreadClosure> responseCallback, PassOwnPtr<SameThreadClosure> finishedCallback) { ASSERT(responseCallback || finishedCallback); m_responseCallback = responseCallback; m_finishedCallback = finishedCallback; m_url = url; - ResourceRequest request(createResourceRequest(executionContext)); + ResourceRequest request(createResourceRequest(creationAddressSpace)); ThreadableLoaderOptions options; options.crossOriginRequestPolicy = crossOriginRequestPolicy; @@ -114,12 +115,12 @@ return m_responseURL; } -ResourceRequest WorkerScriptLoader::createResourceRequest(ExecutionContext& executionContext) +ResourceRequest WorkerScriptLoader::createResourceRequest(WebAddressSpace creationAddressSpace) { ResourceRequest request(m_url); request.setHTTPMethod(HTTPNames::GET); request.setRequestContext(m_requestContext); - request.setExternalRequestStateFromRequestorAddressSpace(executionContext.securityContext().addressSpace()); + request.setExternalRequestStateFromRequestorAddressSpace(creationAddressSpace); return request; } @@ -138,8 +139,8 @@ if (Platform::current()->isReservedIPAddress(response.remoteIPAddress())) { m_responseAddressSpace = SecurityOrigin::create(m_responseURL)->isLocalhost() - ? WebURLRequest::AddressSpaceLocal - : WebURLRequest::AddressSpacePrivate; + ? WebAddressSpaceLocal + : WebAddressSpacePrivate; } if (m_responseCallback)
diff --git a/third_party/WebKit/Source/core/workers/WorkerScriptLoader.h b/third_party/WebKit/Source/core/workers/WorkerScriptLoader.h index 67c44a3..cd2283a 100644 --- a/third_party/WebKit/Source/core/workers/WorkerScriptLoader.h +++ b/third_party/WebKit/Source/core/workers/WorkerScriptLoader.h
@@ -33,6 +33,7 @@ #include "core/loader/ThreadableLoaderClient.h" #include "platform/network/ResourceRequest.h" #include "platform/weborigin/KURL.h" +#include "public/platform/WebAddressSpace.h" #include "public/platform/WebURLRequest.h" #include "wtf/Allocator.h" #include "wtf/Functional.h" @@ -56,12 +57,12 @@ return adoptRef(new WorkerScriptLoader()); } - void loadSynchronously(ExecutionContext&, const KURL&, CrossOriginRequestPolicy); + void loadSynchronously(ExecutionContext&, const KURL&, CrossOriginRequestPolicy, WebAddressSpace); // TODO: |finishedCallback| is not currently guaranteed to be invoked if // used from worker context and the worker shuts down in the middle of an // operation. This will cause leaks when we support nested workers. // Note that callbacks could be invoked before loadAsynchronously() returns. - void loadAsynchronously(ExecutionContext&, const KURL&, CrossOriginRequestPolicy, PassOwnPtr<SameThreadClosure> responseCallback, PassOwnPtr<SameThreadClosure> finishedCallback); + void loadAsynchronously(ExecutionContext&, const KURL&, CrossOriginRequestPolicy, WebAddressSpace, PassOwnPtr<SameThreadClosure> responseCallback, PassOwnPtr<SameThreadClosure> finishedCallback); // This will immediately invoke |finishedCallback| if loadAsynchronously() // is in progress. @@ -80,7 +81,7 @@ ContentSecurityPolicy* contentSecurityPolicy() { return m_contentSecurityPolicy.get(); } PassRefPtrWillBeRawPtr<ContentSecurityPolicy> releaseContentSecurityPolicy() { return m_contentSecurityPolicy.release(); } - WebURLRequest::AddressSpace responseAddressSpace() const { return m_responseAddressSpace; } + WebAddressSpace responseAddressSpace() const { return m_responseAddressSpace; } // ThreadableLoaderClient void didReceiveResponse(unsigned long /*identifier*/, const ResourceResponse&, PassOwnPtr<WebDataConsumerHandle>) override; @@ -98,7 +99,7 @@ WorkerScriptLoader(); ~WorkerScriptLoader() override; - ResourceRequest createResourceRequest(ExecutionContext&); + ResourceRequest createResourceRequest(WebAddressSpace); void notifyError(); void notifyFinished(); @@ -121,7 +122,7 @@ OwnPtr<Vector<char>> m_cachedMetadata; WebURLRequest::RequestContext m_requestContext; RefPtrWillBePersistent<ContentSecurityPolicy> m_contentSecurityPolicy; - WebURLRequest::AddressSpace m_responseAddressSpace; + WebAddressSpace m_responseAddressSpace; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/workers/WorkerThread.cpp b/third_party/WebKit/Source/core/workers/WorkerThread.cpp index 6e8997d..b566aea 100644 --- a/third_party/WebKit/Source/core/workers/WorkerThread.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerThread.cpp
@@ -72,7 +72,7 @@ Microtask::performCheckpoint(m_workerThread->isolate()); if (WorkerGlobalScope* globalScope = m_workerThread->workerGlobalScope()) { if (WorkerOrWorkletScriptController* scriptController = globalScope->scriptController()) - scriptController->rejectedPromises()->processQueue(); + scriptController->getRejectedPromises()->processQueue(); if (globalScope->isClosing()) { m_workerThread->workerReportingProxy().workerGlobalScopeClosed(); m_workerThread->shutdown();
diff --git a/third_party/WebKit/Source/core/workers/WorkerThreadStartupData.cpp b/third_party/WebKit/Source/core/workers/WorkerThreadStartupData.cpp index 552e90e..9891853 100644 --- a/third_party/WebKit/Source/core/workers/WorkerThreadStartupData.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerThreadStartupData.cpp
@@ -34,7 +34,7 @@ namespace blink { -WorkerThreadStartupData::WorkerThreadStartupData(const KURL& scriptURL, const String& userAgent, const String& sourceCode, PassOwnPtr<Vector<char>> cachedMetaData, WorkerThreadStartMode startMode, const PassOwnPtr<Vector<CSPHeaderAndType>> contentSecurityPolicyHeaders, const SecurityOrigin* starterOrigin, PassOwnPtrWillBeRawPtr<WorkerClients> workerClients, WebURLRequest::AddressSpace addressSpace, V8CacheOptions v8CacheOptions) +WorkerThreadStartupData::WorkerThreadStartupData(const KURL& scriptURL, const String& userAgent, const String& sourceCode, PassOwnPtr<Vector<char>> cachedMetaData, WorkerThreadStartMode startMode, const PassOwnPtr<Vector<CSPHeaderAndType>> contentSecurityPolicyHeaders, const SecurityOrigin* starterOrigin, PassOwnPtrWillBeRawPtr<WorkerClients> workerClients, WebAddressSpace addressSpace, V8CacheOptions v8CacheOptions) : m_scriptURL(scriptURL.copy()) , m_userAgent(userAgent.isolatedCopy()) , m_sourceCode(sourceCode.isolatedCopy())
diff --git a/third_party/WebKit/Source/core/workers/WorkerThreadStartupData.h b/third_party/WebKit/Source/core/workers/WorkerThreadStartupData.h index 56a3ba0..1cdaffb8 100644 --- a/third_party/WebKit/Source/core/workers/WorkerThreadStartupData.h +++ b/third_party/WebKit/Source/core/workers/WorkerThreadStartupData.h
@@ -38,7 +38,7 @@ #include "core/workers/WorkerThread.h" #include "platform/network/ContentSecurityPolicyParsers.h" #include "platform/weborigin/KURL.h" -#include "public/platform/WebURLRequest.h" +#include "public/platform/WebAddressSpace.h" #include "wtf/Forward.h" #include "wtf/Noncopyable.h" @@ -50,7 +50,7 @@ WTF_MAKE_NONCOPYABLE(WorkerThreadStartupData); USING_FAST_MALLOC(WorkerThreadStartupData); public: - static PassOwnPtr<WorkerThreadStartupData> create(const KURL& scriptURL, const String& userAgent, const String& sourceCode, PassOwnPtr<Vector<char>> cachedMetaData, WorkerThreadStartMode startMode, const PassOwnPtr<Vector<CSPHeaderAndType>> contentSecurityPolicyHeaders, const SecurityOrigin* starterOrigin, PassOwnPtrWillBeRawPtr<WorkerClients> workerClients, WebURLRequest::AddressSpace addressSpace, V8CacheOptions v8CacheOptions = V8CacheOptionsDefault) + static PassOwnPtr<WorkerThreadStartupData> create(const KURL& scriptURL, const String& userAgent, const String& sourceCode, PassOwnPtr<Vector<char>> cachedMetaData, WorkerThreadStartMode startMode, const PassOwnPtr<Vector<CSPHeaderAndType>> contentSecurityPolicyHeaders, const SecurityOrigin* starterOrigin, PassOwnPtrWillBeRawPtr<WorkerClients> workerClients, WebAddressSpace addressSpace, V8CacheOptions v8CacheOptions = V8CacheOptionsDefault) { return adoptPtr(new WorkerThreadStartupData(scriptURL, userAgent, sourceCode, cachedMetaData, startMode, contentSecurityPolicyHeaders, starterOrigin, workerClients, addressSpace, v8CacheOptions)); } @@ -86,12 +86,12 @@ // supplies no extra 'clients', m_workerClients can be left as empty/null. OwnPtrWillBeCrossThreadPersistent<WorkerClients> m_workerClients; - WebURLRequest::AddressSpace m_addressSpace; + WebAddressSpace m_addressSpace; V8CacheOptions m_v8CacheOptions; private: - WorkerThreadStartupData(const KURL& scriptURL, const String& userAgent, const String& sourceCode, PassOwnPtr<Vector<char>> cachedMetaData, WorkerThreadStartMode, const PassOwnPtr<Vector<CSPHeaderAndType>> contentSecurityPolicyHeaders, const SecurityOrigin*, PassOwnPtrWillBeRawPtr<WorkerClients>, WebURLRequest::AddressSpace, V8CacheOptions); + WorkerThreadStartupData(const KURL& scriptURL, const String& userAgent, const String& sourceCode, PassOwnPtr<Vector<char>> cachedMetaData, WorkerThreadStartMode, const PassOwnPtr<Vector<CSPHeaderAndType>> contentSecurityPolicyHeaders, const SecurityOrigin*, PassOwnPtrWillBeRawPtr<WorkerClients>, WebAddressSpace, V8CacheOptions); }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/workers/WorkerThreadTest.cpp b/third_party/WebKit/Source/core/workers/WorkerThreadTest.cpp index df1bfdb6..b6533b7c 100644 --- a/third_party/WebKit/Source/core/workers/WorkerThreadTest.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerThreadTest.cpp
@@ -13,6 +13,7 @@ #include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/WaitableEvent.h" +#include "public/platform/WebAddressSpace.h" #include "public/platform/WebScheduler.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -185,7 +186,7 @@ headers.release(), m_securityOrigin.get(), clients.release(), - WebURLRequest::AddressSpaceLocal, + WebAddressSpaceLocal, V8CacheOptionsDefault)); }
diff --git a/third_party/WebKit/Source/core/xml/DocumentXSLT.cpp b/third_party/WebKit/Source/core/xml/DocumentXSLT.cpp index d5d6ee6..54d5c60 100644 --- a/third_party/WebKit/Source/core/xml/DocumentXSLT.cpp +++ b/third_party/WebKit/Source/core/xml/DocumentXSLT.cpp
@@ -44,7 +44,7 @@ ASSERT(event->type() == "DOMContentLoaded"); ScriptState::Scope scope(scriptState); - Document& document = *toDocument(scriptState->executionContext()); + Document& document = *toDocument(scriptState->getExecutionContext()); ASSERT(!document.parsing()); // Processing instruction (XML documents only).
diff --git a/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp b/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp index 436c690..774add4 100644 --- a/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp +++ b/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp
@@ -88,7 +88,7 @@ if (oldDocument) { DocumentXSLT::from(*result).setTransformSourceDocument(oldDocument.get()); - result->updateSecurityOrigin(oldDocument->securityOrigin()); + result->updateSecurityOrigin(oldDocument->getSecurityOrigin()); result->setCookieURL(oldDocument->cookieURL()); RefPtrWillBeRawPtr<ContentSecurityPolicy> csp = ContentSecurityPolicy::create();
diff --git a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp index 40ef1fc..9f79b05e 100644 --- a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp +++ b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
@@ -646,7 +646,7 @@ // content. If we had more context, we could potentially allow the parser to // load a DTD. As things stand, we take the conservative route and allow // same-origin requests only. - if (!XMLDocumentParserScope::currentDocument->securityOrigin()->canRequest(url)) { + if (!XMLDocumentParserScope::currentDocument->getSecurityOrigin()->canRequest(url)) { // FIXME: This is copy/pasted. We should probably build console logging into canRequest(). if (!url.isNull()) { String message = "Unsafe attempt to load URL " + url.elidedString() +
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp index 518397a..b70d02b4 100644 --- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp +++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
@@ -175,7 +175,7 @@ : m_xhr(xhr) , m_loader(FileReaderLoader::ReadByClient, this) { - m_loader.start(m_xhr->executionContext(), handle); + m_loader.start(m_xhr->getExecutionContext(), handle); } Member<XMLHttpRequest> m_xhr; @@ -184,7 +184,7 @@ XMLHttpRequest* XMLHttpRequest::create(ScriptState* scriptState) { - ExecutionContext* context = scriptState->executionContext(); + ExecutionContext* context = scriptState->getExecutionContext(); DOMWrapperWorld& world = scriptState->world(); RefPtr<SecurityOrigin> isolatedWorldSecurityOrigin = world.isIsolatedWorld() ? world.isolatedWorldSecurityOrigin() : nullptr; XMLHttpRequest* xmlHttpRequest = new XMLHttpRequest(context, isolatedWorldSecurityOrigin); @@ -235,13 +235,13 @@ Document* XMLHttpRequest::document() const { - ASSERT(executionContext()->isDocument()); - return toDocument(executionContext()); + ASSERT(getExecutionContext()->isDocument()); + return toDocument(getExecutionContext()); } -SecurityOrigin* XMLHttpRequest::securityOrigin() const +SecurityOrigin* XMLHttpRequest::getSecurityOrigin() const { - return m_isolatedWorldSecurityOrigin ? m_isolatedWorldSecurityOrigin.get() : executionContext()->securityOrigin(); + return m_isolatedWorldSecurityOrigin ? m_isolatedWorldSecurityOrigin.get() : getExecutionContext()->getSecurityOrigin(); } XMLHttpRequest::State XMLHttpRequest::readyState() const @@ -276,7 +276,7 @@ bool isHTML = responseIsHTML(); if ((m_response.isHTTP() && !responseIsXML() && !isHTML) || (isHTML && m_responseTypeCode == ResponseTypeDefault) - || executionContext()->isWorkerGlobalScope()) { + || getExecutionContext()->isWorkerGlobalScope()) { m_responseDocument = nullptr; return; } @@ -288,7 +288,7 @@ m_responseDocument = XMLDocument::create(init); // FIXME: Set Last-Modified. - m_responseDocument->setSecurityOrigin(securityOrigin()); + m_responseDocument->setSecurityOrigin(getSecurityOrigin()); m_responseDocument->setContextFeatures(document()->contextFeatures()); m_responseDocument->setMimeType(finalResponseMIMETypeWithFallback()); } @@ -391,7 +391,7 @@ { // FIXME: Need to trigger or update the timeout Timer here, if needed. http://webkit.org/b/98156 // XHR2 spec, 4.7.3. "This implies that the timeout attribute can be set while fetching is in progress. If that occurs it will still be measured relative to the start of fetching." - if (executionContext()->isDocument() && !m_async) { + if (getExecutionContext()->isDocument() && !m_async) { exceptionState.throwDOMException(InvalidAccessError, "Timeouts cannot be set for synchronous requests made from a document."); return; } @@ -416,7 +416,7 @@ // Newer functionality is not available to synchronous requests in window contexts, as a spec-mandated // attempt to discourage synchronous XHR use. responseType is one such piece of functionality. - if (!m_async && executionContext()->isDocument()) { + if (!m_async && getExecutionContext()->isDocument()) { exceptionState.throwDOMException(InvalidAccessError, "The response type cannot be changed for synchronous requests made from a document."); return; } @@ -500,12 +500,12 @@ void XMLHttpRequest::dispatchReadyStateChangeEvent() { - if (!executionContext()) + if (!getExecutionContext()) return; ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); if (m_async || (m_state <= OPENED || m_state == DONE)) { - TRACE_EVENT1("devtools.timeline", "XHRReadyStateChange", "data", InspectorXhrReadyStateChangeEvent::data(executionContext(), this)); + TRACE_EVENT1("devtools.timeline", "XHRReadyStateChange", "data", InspectorXhrReadyStateChangeEvent::data(getExecutionContext(), this)); XMLHttpRequestProgressEventThrottle::DeferredEventAction action = XMLHttpRequestProgressEventThrottle::Ignore; if (m_state == DONE) { if (m_error) @@ -518,7 +518,7 @@ } if (m_state == DONE && !m_error) { - TRACE_EVENT1("devtools.timeline", "XHRLoad", "data", InspectorXhrLoadEvent::data(executionContext(), this)); + TRACE_EVENT1("devtools.timeline", "XHRLoad", "data", InspectorXhrLoadEvent::data(getExecutionContext(), this)); dispatchProgressEventFromSnapshot(EventTypeNames::load); dispatchProgressEventFromSnapshot(EventTypeNames::loadend); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data()); @@ -535,19 +535,19 @@ // FIXME: According to XMLHttpRequest Level 2 we should throw InvalidAccessError exception here. // However for time being only print warning message to warn web developers. if (!m_async) - Deprecation::countDeprecation(executionContext(), UseCounter::SyncXHRWithCredentials); + Deprecation::countDeprecation(getExecutionContext(), UseCounter::SyncXHRWithCredentials); m_includeCredentials = value; } void XMLHttpRequest::open(const AtomicString& method, const String& urlString, ExceptionState& exceptionState) { - open(method, executionContext()->completeURL(urlString), true, exceptionState); + open(method, getExecutionContext()->completeURL(urlString), true, exceptionState); } void XMLHttpRequest::open(const AtomicString& method, const String& urlString, bool async, const String& username, const String& password, ExceptionState& exceptionState) { - KURL url(executionContext()->completeURL(urlString)); + KURL url(getExecutionContext()->completeURL(urlString)); if (!username.isNull()) url.setUser(username); if (!password.isNull()) @@ -578,13 +578,13 @@ return; } - if (!ContentSecurityPolicy::shouldBypassMainWorld(executionContext()) && !executionContext()->contentSecurityPolicy()->allowConnectToSource(url)) { + if (!ContentSecurityPolicy::shouldBypassMainWorld(getExecutionContext()) && !getExecutionContext()->contentSecurityPolicy()->allowConnectToSource(url)) { // We can safely expose the URL to JavaScript, as these checks happen synchronously before redirection. JavaScript receives no new information. exceptionState.throwSecurityError("Refused to connect to '" + url.elidedString() + "' because it violates the document's Content Security Policy."); return; } - if (!async && executionContext()->isDocument()) { + if (!async && getExecutionContext()->isDocument()) { if (document()->settings() && !document()->settings()->syncXHRInDocumentsEnabled()) { exceptionState.throwDOMException(InvalidAccessError, "Synchronous requests are disabled for this page."); return; @@ -608,7 +608,7 @@ // Refer : https://xhr.spec.whatwg.org/#sync-warning // Use count for XHR synchronous requests on main thread only. if (!document()->processingBeforeUnload()) - Deprecation::countDeprecation(executionContext(), UseCounter::XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload); + Deprecation::countDeprecation(getExecutionContext(), UseCounter::XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload); } m_method = FetchUtils::normalizeMethod(method); @@ -629,7 +629,7 @@ bool XMLHttpRequest::initSend(ExceptionState& exceptionState) { - if (!executionContext()) + if (!getExecutionContext()) return false; if (m_state != OPENED || m_loader) { @@ -643,7 +643,7 @@ void XMLHttpRequest::send(const ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormData& body, ExceptionState& exceptionState) { - InspectorInstrumentation::willSendXMLHttpRequest(executionContext(), url()); + InspectorInstrumentation::willSendXMLHttpRequest(getExecutionContext(), url()); if (body.isNull()) { send(String(), exceptionState); @@ -867,14 +867,14 @@ } } - m_sameOriginRequest = securityOrigin()->canRequestNoSuborigin(m_url); + m_sameOriginRequest = getSecurityOrigin()->canRequestNoSuborigin(m_url); // We also remember whether upload events should be allowed for this request in case the upload listeners are // added after the request is started. m_uploadEventsAllowed = m_sameOriginRequest || uploadEvents || !FetchUtils::isSimpleRequest(m_method, m_requestHeaders); - ASSERT(executionContext()); - ExecutionContext& executionContext = *this->executionContext(); + ASSERT(getExecutionContext()); + ExecutionContext& executionContext = *this->getExecutionContext(); ResourceRequest request(m_url); request.setHTTPMethod(m_method); @@ -904,7 +904,7 @@ ResourceLoaderOptions resourceLoaderOptions; resourceLoaderOptions.allowCredentials = (m_sameOriginRequest || m_includeCredentials) ? AllowStoredCredentials : DoNotAllowStoredCredentials; resourceLoaderOptions.credentialsRequested = m_includeCredentials ? ClientRequestedCredentials : ClientDidNotRequestCredentials; - resourceLoaderOptions.securityOrigin = securityOrigin(); + resourceLoaderOptions.securityOrigin = getSecurityOrigin(); // When responseType is set to "blob", we redirect the downloaded data to a // file-handle directly. @@ -1072,7 +1072,7 @@ m_progressEventThrottle->dispatchProgressEvent(type, lengthComputable, loaded, total); if (type == EventTypeNames::loadend) - InspectorInstrumentation::didDispatchXHRLoadendEvent(executionContext(), this); + InspectorInstrumentation::didDispatchXHRLoadendEvent(getExecutionContext(), this); } void XMLHttpRequest::dispatchProgressEventFromSnapshot(const AtomicString& type) @@ -1112,7 +1112,7 @@ { WTF_LOG(Network, "XMLHttpRequest %p handleRequestError()", this); - InspectorInstrumentation::didFailXHRLoading(executionContext(), this, this, m_method, m_url); + InspectorInstrumentation::didFailXHRLoading(getExecutionContext(), this, this, m_method, m_url); if (!m_async) { ASSERT(exceptionCode); @@ -1171,7 +1171,7 @@ // No script (privileged or not) can set unsafe headers. if (FetchUtils::isForbiddenHeaderName(name)) { - logConsoleError(executionContext(), "Refused to set unsafe header \"" + name + "\""); + logConsoleError(getExecutionContext(), "Refused to set unsafe header \"" + name + "\""); return; } @@ -1229,7 +1229,7 @@ // // TODO: Consider removing canLoadLocalResources() call. // crbug.com/567527 - if (FetchUtils::isForbiddenResponseHeaderName(it->key) && !securityOrigin()->canLoadLocalResources()) + if (FetchUtils::isForbiddenResponseHeaderName(it->key) && !getSecurityOrigin()->canLoadLocalResources()) continue; if (!m_sameOriginRequest && !isOnAccessControlResponseHeaderWhitelist(it->key) && !accessControlExposeHeaderSet.contains(it->key)) @@ -1252,8 +1252,8 @@ return nullAtom; // See comment in getAllResponseHeaders above. - if (FetchUtils::isForbiddenResponseHeaderName(name) && !securityOrigin()->canLoadLocalResources()) { - logConsoleError(executionContext(), "Refused to get unsafe header \"" + name + "\""); + if (FetchUtils::isForbiddenResponseHeaderName(name) && !getSecurityOrigin()->canLoadLocalResources()) { + logConsoleError(getExecutionContext(), "Refused to get unsafe header \"" + name + "\""); return nullAtom; } @@ -1261,7 +1261,7 @@ parseAccessControlExposeHeadersAllowList(m_response.httpHeaderField(HTTPNames::Access_Control_Expose_Headers), accessControlExposeHeaderSet); if (!m_sameOriginRequest && !isOnAccessControlResponseHeaderWhitelist(name) && !accessControlExposeHeaderSet.contains(name)) { - logConsoleError(executionContext(), "Refused to get unsafe header \"" + name + "\""); + logConsoleError(getExecutionContext(), "Refused to get unsafe header \"" + name + "\""); return nullAtom; } return m_response.httpHeaderField(name); @@ -1345,7 +1345,7 @@ // Network failures are already reported to Web Inspector by ResourceLoader. if (error.domain() == errorDomainBlinkInternal) - logConsoleError(executionContext(), "XMLHttpRequest cannot load " + error.failingURL() + ". " + error.localizedDescription()); + logConsoleError(getExecutionContext(), "XMLHttpRequest cannot load " + error.failingURL() + ". " + error.localizedDescription()); handleNetworkError(); // Now the XMLHttpRequest instance may be dead. @@ -1470,14 +1470,14 @@ void XMLHttpRequest::endLoading() { - InspectorInstrumentation::didFinishXHRLoading(executionContext(), this, this, m_method, m_url); + InspectorInstrumentation::didFinishXHRLoading(getExecutionContext(), this, this, m_method, m_url); if (m_loader) m_loader = nullptr; changeState(DONE); - if (!executionContext()->isDocument() || !document() || !document()->frame() || !document()->frame()->page()) + if (!getExecutionContext()->isDocument() || !document() || !document()->frame() || !document()->frame()->page()) return; if (status() >= 200 && status() < 300) { @@ -1598,7 +1598,7 @@ m_binaryResponseBuilder->append(data, len); } else if (m_responseTypeCode == ResponseTypeLegacyStream) { if (!m_responseLegacyStream) - m_responseLegacyStream = Stream::create(executionContext(), responseType()); + m_responseLegacyStream = Stream::create(getExecutionContext(), responseType()); m_responseLegacyStream->addData(data, len); } @@ -1660,7 +1660,7 @@ void XMLHttpRequest::stop() { - InspectorInstrumentation::didFailXHRLoading(executionContext(), this, this, m_method, m_url); + InspectorInstrumentation::didFailXHRLoading(getExecutionContext(), this, this, m_method, m_url); m_progressEventThrottle->stop(); internalAbort(); } @@ -1689,9 +1689,9 @@ return EventTargetNames::XMLHttpRequest; } -ExecutionContext* XMLHttpRequest::executionContext() const +ExecutionContext* XMLHttpRequest::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } DEFINE_TRACE(XMLHttpRequest)
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.h b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.h index 38c7f46..c592a29 100644 --- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.h +++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.h
@@ -95,7 +95,7 @@ // ActiveDOMObject void contextDestroyed() override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; bool hasPendingActivity() const override; void suspend() override; void resume() override; @@ -153,7 +153,7 @@ XMLHttpRequest(ExecutionContext*, PassRefPtr<SecurityOrigin>); Document* document() const; - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override; void didReceiveResponse(unsigned long identifier, const ResourceResponse&, PassOwnPtr<WebDataConsumerHandle>) override;
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestProgressEventThrottle.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestProgressEventThrottle.cpp index 44dc4fa..ff5a02eb 100644 --- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestProgressEventThrottle.cpp +++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestProgressEventThrottle.cpp
@@ -127,7 +127,7 @@ { XMLHttpRequest::State state = m_target->readyState(); if (m_target->readyState() == XMLHttpRequest::LOADING && m_hasDispatchedProgressProgressEvent) { - TRACE_EVENT1("devtools.timeline", "XHRReadyStateChange", "data", InspectorXhrReadyStateChangeEvent::data(m_target->executionContext(), m_target)); + TRACE_EVENT1("devtools.timeline", "XHRReadyStateChange", "data", InspectorXhrReadyStateChangeEvent::data(m_target->getExecutionContext(), m_target)); m_target->dispatchEvent(Event::create(EventTypeNames::readystatechange)); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data()); }
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestUpload.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestUpload.cpp index 1d04877..07cd817 100644 --- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestUpload.cpp +++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestUpload.cpp
@@ -44,9 +44,9 @@ return EventTargetNames::XMLHttpRequestUpload; } -ExecutionContext* XMLHttpRequestUpload::executionContext() const +ExecutionContext* XMLHttpRequestUpload::getExecutionContext() const { - return m_xmlHttpRequest->executionContext(); + return m_xmlHttpRequest->getExecutionContext(); } void XMLHttpRequestUpload::dispatchProgressEvent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestUpload.h b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestUpload.h index 2d0adb5..3d30862 100644 --- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestUpload.h +++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestUpload.h
@@ -50,7 +50,7 @@ XMLHttpRequest* xmlHttpRequest() const { return m_xmlHttpRequest; } const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; void dispatchEventAndLoadEnd(const AtomicString&, bool, unsigned long long, unsigned long long); void dispatchProgressEvent(unsigned long long, unsigned long long);
diff --git a/third_party/WebKit/Source/devtools/front_end/components/ObjectPropertiesSection.js b/third_party/WebKit/Source/devtools/front_end/components/ObjectPropertiesSection.js index c5e9f30..9592a28 100644 --- a/third_party/WebKit/Source/devtools/front_end/components/ObjectPropertiesSection.js +++ b/third_party/WebKit/Source/devtools/front_end/components/ObjectPropertiesSection.js
@@ -1055,13 +1055,14 @@ */ WebInspector.ObjectPropertiesSection.valueTextForFunctionDescription = function(description) { - var matches = /function\s([^)]*)/.exec(description); + var text = description.replace(/^function [gs]et /, "function "); + var matches = /function\s([^)]*)/.exec(text); if (!matches) { // process shorthand methods - matches = /[^(]*(\([^)]*)/.exec(description); + matches = /[^(]*(\([^)]*)/.exec(text); } var match = matches ? matches[1] : null; - return match ? match.replace(/\n/g, " ") + ")" : (description || ""); + return match ? match.replace(/\n/g, " ") + ")" : (text || ""); } /** @@ -1335,4 +1336,4 @@ treeElement[WebInspector.ObjectPropertiesSectionExpandController._cachedPathSymbol] = result; return result; } -} \ No newline at end of file +}
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js index 0aac659..cc8cf67 100644 --- a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js +++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
@@ -430,6 +430,8 @@ this._applyUserAgent(mobile ? WebInspector.DeviceModeModel._defaultMobileUserAgent : ""); this._applyTouch(this._uaSetting.get() === WebInspector.DeviceModeModel.UA.DesktopTouch || this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile, this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile); } + if (this._target) + this._target.renderingAgent().setShowViewportSizeOnResize(this._type === WebInspector.DeviceModeModel.Type.None); this._updateCallback.call(null); },
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js index 956d14ea..8bf0c24 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/Main.js +++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -1115,6 +1115,7 @@ { target.pageAgent().setAutoAttachToCreatedPages(this._autoAttachSetting.get()); target.emulationAgent().setScriptExecutionDisabled(this._disableJavascriptSetting.get()); + target.renderingAgent().setShowViewportSizeOnResize(true); }, /**
diff --git a/third_party/WebKit/Source/devtools/front_end/main/RenderingOptions.js b/third_party/WebKit/Source/devtools/front_end/main/RenderingOptions.js index 60ac91c..571d51a4 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/RenderingOptions.js +++ b/third_party/WebKit/Source/devtools/front_end/main/RenderingOptions.js
@@ -46,7 +46,6 @@ this._appendCheckbox(WebInspector.UIString("Show FPS meter"), "setShowFPSCounter"); var scrollingTitle = WebInspector.UIString("Shows areas of the page that slow down scrolling:\nTouch and mousewheel event listeners can delay scrolling.\nSome areas need to repaint their content when scrolled."); this._appendCheckbox(WebInspector.UIString("Show scrolling perf issues"), "setShowScrollBottleneckRects", scrollingTitle); - this._appendCheckbox(WebInspector.UIString("Show page size on resize"), "setShowViewportSizeOnResize"); // CSS media. var mediaRow = this.contentElement.createChild("div", "media-row");
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/serviceWorkersView.css b/third_party/WebKit/Source/devtools/front_end/resources/serviceWorkersView.css index 07b77be..c7fa7e58 100644 --- a/third_party/WebKit/Source/devtools/front_end/resources/serviceWorkersView.css +++ b/third_party/WebKit/Source/devtools/front_end/resources/serviceWorkersView.css
@@ -19,6 +19,7 @@ .service-workers-root { margin: 0; padding: 5px; + -webkit-user-select: text; } .service-workers-root ol {
diff --git a/third_party/WebKit/Source/devtools/front_end/source_frame/CodeMirrorTextEditor.js b/third_party/WebKit/Source/devtools/front_end/source_frame/CodeMirrorTextEditor.js index 8b67302..3373f6d 100644 --- a/third_party/WebKit/Source/devtools/front_end/source_frame/CodeMirrorTextEditor.js +++ b/third_party/WebKit/Source/devtools/front_end/source_frame/CodeMirrorTextEditor.js
@@ -39,6 +39,8 @@ WebInspector.VBox.call(this); this._delegate = delegate; this._url = url; + /** @type {!Map<string, !Set<number>>}} */ + this._decoratedGutterLines = new Map(); this.registerRequiredCSS("cm/codemirror.css"); this.registerRequiredCSS("source_frame/cmdevtools.css"); @@ -1118,6 +1120,42 @@ /** * @param {number} lineNumber + * @param {string} type + * @param {!Element} element + */ + setGutterDecoration: function(lineNumber, type, element) + { + var lines = this._decoratedGutterLines.get(type); + if (!lines) { + lines = new Set(); + this._decoratedGutterLines.set(type, lines); + var gutters = this._codeMirror.getOption("gutters"); + var gutterType = "CodeMirror-gutter-" + type; + if (gutters.indexOf(gutterType) === -1) { + gutters = gutters.concat([gutterType]); + this._codeMirror.setOption("gutters", gutters); + this._codeMirror.refresh(); + } + } + lines.add(lineNumber); + this._codeMirror.setGutterMarker(lineNumber, "CodeMirror-gutter-" + type, element); + }, + + /** + * @param {string} type + */ + resetGutterDecorations: function(type) + { + this._decoratedGutterLines.delete(type); + var gutters = this._codeMirror.getOption("gutters").slice(); + if (!gutters.remove("CodeMirror-gutter-" + type)) + return; + this._codeMirror.setOption("gutters", gutters); + this._codeMirror.refresh(); + }, + + /** + * @param {number} lineNumber * @param {number} columnNumber */ setExecutionLocation: function(lineNumber, columnNumber)
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/UISourceCodeFrame.js b/third_party/WebKit/Source/devtools/front_end/sources/UISourceCodeFrame.js index df56d748..648c5ab 100644 --- a/third_party/WebKit/Source/devtools/front_end/sources/UISourceCodeFrame.js +++ b/third_party/WebKit/Source/devtools/front_end/sources/UISourceCodeFrame.js
@@ -37,10 +37,14 @@ WebInspector.SourceFrame.call(this, this._uiSourceCode); this.textEditor.setAutocompleteDelegate(new WebInspector.SimpleAutocompleteDelegate()); this._rowMessageBuckets = {}; + /** @type {!Set<string>} */ + this._typeDecorationsPending = new Set(); this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyChanged, this); this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyCommitted, this); this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.MessageAdded, this._onMessageAdded, this); this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.MessageRemoved, this._onMessageRemoved, this); + this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.LineDecorationAdded, this._onLineDecorationAdded, this); + this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.LineDecorationRemoved, this._onLineDecorationRemoved, this); this._updateStyle(); this._errorPopoverHelper = new WebInspector.PopoverHelper(this.element, this._getErrorAnchor.bind(this), this._showErrorPopover.bind(this)); @@ -118,6 +122,7 @@ WebInspector.SourceFrame.prototype.onTextEditorContentLoaded.call(this); for (var message of this._uiSourceCode.messages()) this._addMessageToSource(message); + this._decorateAllTypes(); }, /** @@ -330,6 +335,44 @@ } }, + /** + * @param {!WebInspector.Event} event + */ + _onLineDecorationAdded: function(event) + { + var marker = /** @type {!WebInspector.UISourceCode.LineMarker} */ (event.data); + this._decorateTypeThrottled(marker.type()); + }, + + /** + * @param {!WebInspector.Event} event + */ + _onLineDecorationRemoved: function(event) + { + var marker = /** @type {!WebInspector.UISourceCode.LineMarker} */ (event.data); + this._decorateTypeThrottled(marker.type()); + }, + + /** + * @param {string} type + */ + _decorateTypeThrottled: function(type) + { + if (this._typeDecorationsPending.has(type)) + return; + this._typeDecorationsPending.add(type); + self.runtime.extensions(WebInspector.UISourceCodeFrame.LineDecorator).find(extension => extension.descriptor()["decoratorType"] === type).instancePromise().then(decorator => { + this._typeDecorationsPending.delete(type); + decorator.decorate(this.uiSourceCode(), this._textEditor); + }); + }, + + _decorateAllTypes: function() + { + var extensions = self.runtime.extensions(WebInspector.UISourceCodeFrame.LineDecorator); + extensions.forEach(extension => this._decorateTypeThrottled(extension.descriptor()["decoratorType"])); + }, + __proto__: WebInspector.SourceFrame.prototype } @@ -342,6 +385,19 @@ WebInspector.UISourceCodeFrame._lineClassPerLevel[WebInspector.UISourceCode.Message.Level.Warning] = "text-editor-line-with-warning"; /** + * @interface + */ +WebInspector.UISourceCodeFrame.LineDecorator = function() { } + +WebInspector.UISourceCodeFrame.LineDecorator.prototype = { + /** + * @param {!WebInspector.UISourceCode} uiSourceCode + * @param {!WebInspector.CodeMirrorTextEditor} textEditor + */ + decorate: function(uiSourceCode, textEditor) { } +} + +/** * @constructor * @param {!WebInspector.UISourceCode.Message} message */
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineProfileTree.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineProfileTree.js index f759fc04..de512711 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineProfileTree.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineProfileTree.js
@@ -14,10 +14,6 @@ /** @type {number} */ this.selfTime; /** @type {string} */ - this.name; - /** @type {string} */ - this.color; - /** @type {string} */ this.id; /** @type {!WebInspector.TracingModel.Event} */ this.event; @@ -25,6 +21,17 @@ this.children; /** @type {?WebInspector.TimelineProfileTree.Node} */ this.parent; + this._isGroupNode = false; +} + +WebInspector.TimelineProfileTree.Node.prototype = { + /** + * @return {boolean} + */ + isGroupNode: function() + { + return this._isGroupNode; + } } /** @@ -42,7 +49,6 @@ var root = new WebInspector.TimelineProfileTree.Node(); root.totalTime = initialTime; root.selfTime = initialTime; - root.name = WebInspector.UIString("Top-Down Chart"); root.children = /** @type {!Map<string, !WebInspector.TimelineProfileTree.Node>} */ (new Map()); var parent = root; @@ -106,7 +112,6 @@ var buRoot = new WebInspector.TimelineProfileTree.Node(); buRoot.selfTime = 0; buRoot.totalTime = 0; - buRoot.name = WebInspector.UIString("Bottom-Up Chart"); /** @type {!Map<string, !WebInspector.TimelineProfileTree.Node>} */ buRoot.children = new Map(); var nodesOnStack = /** @type {!Set<string>} */ (new Set()); @@ -153,7 +158,6 @@ buNode = new WebInspector.TimelineProfileTree.Node(); buNode.selfTime = selfTime; buNode.totalTime = totalTime; - buNode.name = tdNode.name; buNode.event = tdNode.event; buNode.id = id; buNode.parent = buParent; @@ -176,5 +180,181 @@ } return buRoot; +} +/** + * @param {!WebInspector.TracingModel.Event} event + * @return {?string} + */ +WebInspector.TimelineProfileTree.eventURL = function(event) +{ + var data = event.args["data"] || event.args["beginData"]; + if (data && data["url"]) + return data["url"]; + var frame = WebInspector.TimelineTreeView.eventStackFrame(event); + while (frame) { + var url = frame["url"]; + if (url) + return url; + frame = frame.parent; + } + return null; +} + +/** + * @constructor + * @param {function(!WebInspector.TracingModel.Event):string} categoryMapper + */ +WebInspector.TimelineAggregator = function(categoryMapper) +{ + this._categoryMapper = categoryMapper; + /** @type {!Map<string, !WebInspector.TimelineProfileTree.Node>} */ + this._groupNodes = new Map(); +} + +/** + * @enum {string} + */ +WebInspector.TimelineAggregator.GroupBy = { + None: "None", + Category: "Category", + Domain: "Domain", + Subdomain: "Subdomain", + URL: "URL" +} + +/** + * @param {!WebInspector.TracingModel.Event} event + * @return {string} + */ +WebInspector.TimelineAggregator.eventId = function(event) +{ + if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) { + var data = event.args["data"]; + return "f:" + data["functionName"] + "@" + (data["scriptId"] || data["url"] || ""); + } + return event.name + ":@" + WebInspector.TimelineProfileTree.eventURL(event); +} + +WebInspector.TimelineAggregator._extensionInternalPrefix = "extensions::"; +WebInspector.TimelineAggregator._groupNodeFlag = Symbol("groupNode"); + +/** + * @param {string} url + * @return {boolean} + */ +WebInspector.TimelineAggregator.isExtensionInternalURL = function(url) +{ + return url.startsWith(WebInspector.TimelineAggregator._extensionInternalPrefix); +} + +WebInspector.TimelineAggregator.prototype = { + /** + * @param {!WebInspector.TimelineAggregator.GroupBy} groupBy + * @return {?function(!WebInspector.TimelineProfileTree.Node):!WebInspector.TimelineProfileTree.Node} + */ + groupFunction: function(groupBy) + { + var idMapper = this._nodeToGroupIdFunction(groupBy); + return idMapper && this._nodeToGroupNode.bind(this, idMapper); + }, + + /** + * @param {!WebInspector.TimelineProfileTree.Node} root + * @param {!WebInspector.TimelineAggregator.GroupBy} groupBy + * @return {!WebInspector.TimelineProfileTree.Node} + */ + performGrouping: function(root, groupBy) + { + var nodeMapper = this.groupFunction(groupBy); + if (!nodeMapper) + return root; + for (var node of root.children.values()) { + var groupNode = nodeMapper(node); + groupNode.parent = root; + groupNode.selfTime += node.selfTime; + groupNode.totalTime += node.totalTime; + groupNode.children.set(node.id, node); + node.parent = root; + } + root.children = this._groupNodes; + return root; + }, + + /** + * @param {!WebInspector.TimelineAggregator.GroupBy} groupBy + * @return {?function(!WebInspector.TimelineProfileTree.Node):string} + */ + _nodeToGroupIdFunction: function(groupBy) + { + /** + * @param {!WebInspector.TimelineProfileTree.Node} node + * @return {string} + */ + function groupByURL(node) + { + return WebInspector.TimelineProfileTree.eventURL(node.event) || ""; + } + + /** + * @param {boolean} groupSubdomains + * @param {!WebInspector.TimelineProfileTree.Node} node + * @return {string} + */ + function groupByDomain(groupSubdomains, node) + { + var url = WebInspector.TimelineProfileTree.eventURL(node.event) || ""; + if (WebInspector.TimelineAggregator.isExtensionInternalURL(url)) + return WebInspector.TimelineAggregator._extensionInternalPrefix; + var parsedURL = url.asParsedURL(); + if (!parsedURL) + return ""; + if (parsedURL.scheme === "chrome-extension") + return parsedURL.scheme + "://" + parsedURL.host; + if (!groupSubdomains) + return parsedURL.host; + if (/^[.0-9]+$/.test(parsedURL.host)) + return parsedURL.host; + var domainMatch = /([^.]*\.)?[^.]*$/.exec(parsedURL.host); + return domainMatch && domainMatch[0] || ""; + } + + switch (groupBy) { + case WebInspector.TimelineAggregator.GroupBy.None: return null; + case WebInspector.TimelineAggregator.GroupBy.Category: return node => node.event ? this._categoryMapper(node.event) : ""; + case WebInspector.TimelineAggregator.GroupBy.Subdomain: return groupByDomain.bind(null, false); + case WebInspector.TimelineAggregator.GroupBy.Domain: return groupByDomain.bind(null, true); + case WebInspector.TimelineAggregator.GroupBy.URL: return groupByURL; + default: return null; + } + }, + + /** + * @param {string} id + * @param {!WebInspector.TracingModel.Event} event + * @return {!WebInspector.TimelineProfileTree.Node} + */ + _buildGroupNode: function(id, event) + { + var groupNode = new WebInspector.TimelineProfileTree.Node(); + groupNode.id = id; + groupNode.selfTime = 0; + groupNode.totalTime = 0; + groupNode.children = new Map(); + groupNode.event = event; + groupNode._isGroupNode = true; + this._groupNodes.set(id, groupNode); + return groupNode; + }, + + /** + * @param {function(!WebInspector.TimelineProfileTree.Node):string} nodeToGroupId + * @param {!WebInspector.TimelineProfileTree.Node} node + * @return {!WebInspector.TimelineProfileTree.Node} + */ + _nodeToGroupNode: function(nodeToGroupId, node) + { + var id = nodeToGroupId(node); + return this._groupNodes.get(id) || this._buildGroupNode(id, node.event); + }, }
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineTreeView.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineTreeView.js index 59b3d12..7114da07 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineTreeView.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineTreeView.js
@@ -281,23 +281,13 @@ * @param {!WebInspector.TracingModel.Event} event * @return {string} */ -WebInspector.TimelineTreeView.eventId = function(event) -{ - var prefix = event.name === WebInspector.TimelineModel.RecordType.JSFrame ? "f:" : ""; - return prefix + WebInspector.TimelineTreeView.eventNameForSorting(event); -} - -/** - * @param {!WebInspector.TracingModel.Event} event - * @return {string} - */ WebInspector.TimelineTreeView.eventNameForSorting = function(event) { if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) { var data = event.args["data"]; return data["functionName"] + "@" + (data["scriptId"] || data["url"] || ""); } - return event.name + ":@" + WebInspector.TimelineTreeView.eventURL(event); + return event.name + ":@" + WebInspector.TimelineProfileTree.eventURL(event); } /** @@ -316,25 +306,6 @@ } /** - * @param {!WebInspector.TracingModel.Event} event - * @return {?string} - */ -WebInspector.TimelineTreeView.eventURL = function(event) -{ - var data = event.args["data"] || event.args["beginData"]; - if (data && data["url"]) - return data["url"]; - var frame = WebInspector.TimelineTreeView.eventStackFrame(event); - while (frame) { - var url = frame["url"]; - if (url) - return url; - frame = frame.parent; - } - return null; -} - -/** * @constructor * @extends {WebInspector.SortableDataGridNode} * @param {!WebInspector.TimelineProfileTree.Node} profileNode @@ -378,7 +349,12 @@ var icon = container.createChild("div", "activity-icon"); var name = container.createChild("div", "activity-name"); var event = this._profileNode.event; - if (event) { + if (this._profileNode.isGroupNode()) { + var treeView = /** @type {!WebInspector.AggregatedTimelineTreeView} */ (this._treeView); + var info = treeView._displayInfoForGroupNode(this._profileNode); + name.textContent = info.name; + icon.style.backgroundColor = info.color; + } else if (event) { var data = event.args["data"]; var deoptReason = data && data["deoptReason"]; if (deoptReason && deoptReason !== "no reason") @@ -392,9 +368,6 @@ container.createChild("div", "activity-link").appendChild(this._treeView.linkifyLocation(callFrame)); } icon.style.backgroundColor = WebInspector.TimelineUIUtils.eventColor(event); - } else { - name.textContent = this._profileNode.name; - icon.style.backgroundColor = this._profileNode.color; } return cell; }, @@ -491,7 +464,7 @@ */ WebInspector.AggregatedTimelineTreeView = function(model) { - this._groupBySetting = WebInspector.settings.createSetting("timelineTreeGroupBy", WebInspector.AggregatedTimelineTreeView.GroupBy.Category); + this._groupBySetting = WebInspector.settings.createSetting("timelineTreeGroupBy", WebInspector.TimelineAggregator.GroupBy.Category); WebInspector.TimelineTreeView.call(this, model); var nonessentialEvents = [ WebInspector.TimelineModel.RecordType.EventDispatch, @@ -503,30 +476,6 @@ this._stackView.addEventListener(WebInspector.TimelineStackView.Events.SelectionChanged, this._onStackViewSelectionChanged, this); } -/** - * @enum {string} - */ -WebInspector.AggregatedTimelineTreeView.GroupBy = { - None: "None", - Category: "Category", - Domain: "Domain", - Subdomain: "Subdomain", - URL: "URL" -} - -/** - * @param {!WebInspector.TracingModel.Event} event - * @return {string} - */ -WebInspector.AggregatedTimelineTreeView.eventId = function(event) -{ - if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) { - var data = event.args["data"]; - return "f:" + data["functionName"] + "@" + (data["scriptId"] || data["url"] || ""); - } - return event.name + ":@" + WebInspector.TimelineTreeView.eventURL(event); -} - WebInspector.AggregatedTimelineTreeView.prototype = { /** * @override @@ -534,12 +483,58 @@ */ updateContents: function(selection) { + this._updateExtensionResolver(); WebInspector.TimelineTreeView.prototype.updateContents.call(this, selection); var rootNode = this._dataGrid.rootNode(); if (rootNode.children.length) rootNode.children[0].revealAndSelect(); }, + _updateExtensionResolver: function() + { + this._executionContextNamesByOrigin = new Map(); + for (var target of WebInspector.targetManager.targets()) { + for (var context of target.runtimeModel.executionContexts()) + this._executionContextNamesByOrigin.set(context.origin, context.name); + } + }, + + /** + * @param {!WebInspector.TimelineProfileTree.Node} node + * @return {!{name: string, color: string}} + */ + _displayInfoForGroupNode: function(node) + { + var categories = WebInspector.TimelineUIUtils.categories(); + switch (this._groupBySetting.get()) { + case WebInspector.TimelineAggregator.GroupBy.Category: + var category = categories[node.id] || categories["other"]; + return {name: category.title, color: category.color}; + + case WebInspector.TimelineAggregator.GroupBy.Domain: + case WebInspector.TimelineAggregator.GroupBy.Subdomain: + var name = node.id; + if (WebInspector.TimelineAggregator.isExtensionInternalURL(name)) + name = WebInspector.UIString("[Chrome extensions overhead]"); + else if (name.startsWith("chrome-extension")) + name = this._executionContextNamesByOrigin.get(name) || name; + return { + name: name || WebInspector.UIString("unattributed"), + color: node.id ? WebInspector.TimelineUIUtils.eventColor(node.event) : categories["other"].color + } + + case WebInspector.TimelineAggregator.GroupBy.URL: + break; + + default: + console.assert(false, "Unexpected aggregation type"); + } + return { + name: node.id || WebInspector.UIString("unattributed"), + color: node.id ? WebInspector.TimelineUIUtils.eventColor(node.event) : categories["other"].color + } + }, + /** * @override * @param {!Element} parent @@ -560,11 +555,11 @@ if (id === this._groupBySetting.get()) this._groupByCombobox.select(option); } - addGroupingOption.call(this, WebInspector.UIString("No Grouping"), WebInspector.AggregatedTimelineTreeView.GroupBy.None); - addGroupingOption.call(this, WebInspector.UIString("Group by Category"), WebInspector.AggregatedTimelineTreeView.GroupBy.Category); - addGroupingOption.call(this, WebInspector.UIString("Group by Domain"), WebInspector.AggregatedTimelineTreeView.GroupBy.Domain); - addGroupingOption.call(this, WebInspector.UIString("Group by Subdomain"), WebInspector.AggregatedTimelineTreeView.GroupBy.Subdomain); - addGroupingOption.call(this, WebInspector.UIString("Group by URL"), WebInspector.AggregatedTimelineTreeView.GroupBy.URL); + addGroupingOption.call(this, WebInspector.UIString("No Grouping"), WebInspector.TimelineAggregator.GroupBy.None); + addGroupingOption.call(this, WebInspector.UIString("Group by Category"), WebInspector.TimelineAggregator.GroupBy.Category); + addGroupingOption.call(this, WebInspector.UIString("Group by Domain"), WebInspector.TimelineAggregator.GroupBy.Domain); + addGroupingOption.call(this, WebInspector.UIString("Group by Subdomain"), WebInspector.TimelineAggregator.GroupBy.Subdomain); + addGroupingOption.call(this, WebInspector.UIString("Group by URL"), WebInspector.TimelineAggregator.GroupBy.URL); panelToolbar.appendToolbarItem(this._groupByCombobox); }, @@ -611,111 +606,6 @@ }, /** - * @param {function(!WebInspector.TimelineProfileTree.Node):string} nodeToGroupId - * @param {!WebInspector.TimelineProfileTree.Node} node - * @return {!WebInspector.TimelineProfileTree.Node} - */ - _nodeToGroupNode: function(nodeToGroupId, node) - { - var id = nodeToGroupId(node); - return this._groupNodes.get(id) || this._buildGroupNode(id, node.event); - }, - - /** - * @param {string} id - * @param {!WebInspector.TracingModel.Event} event - * @return {!WebInspector.TimelineProfileTree.Node} - */ - _buildGroupNode: function(id, event) - { - var groupNode = new WebInspector.TimelineProfileTree.Node(); - groupNode.id = id; - groupNode.selfTime = 0; - groupNode.totalTime = 0; - groupNode.children = new Map(); - this._groupNodes.set(id, groupNode); - var categories = WebInspector.TimelineUIUtils.categories(); - switch (this._groupBySetting.get()) { - case WebInspector.AggregatedTimelineTreeView.GroupBy.Category: - var category = categories[id] || categories["other"]; - groupNode.name = category.title; - groupNode.color = category.color; - break; - case WebInspector.AggregatedTimelineTreeView.GroupBy.Domain: - case WebInspector.AggregatedTimelineTreeView.GroupBy.Subdomain: - case WebInspector.AggregatedTimelineTreeView.GroupBy.URL: - groupNode.name = id || WebInspector.UIString("unattributed"); - groupNode.color = id ? WebInspector.TimelineUIUtils.eventColor(event) : categories["other"].color; - break; - } - return groupNode; - }, - - /** - * @return {?function(!WebInspector.TimelineProfileTree.Node):string} - */ - _nodeToGroupIdFunction: function() - { - /** - * @param {!WebInspector.TimelineProfileTree.Node} node - * @return {string} - */ - function groupByCategory(node) - { - return node.event ? WebInspector.TimelineUIUtils.eventStyle(node.event).category.name : ""; - } - - /** - * @param {!WebInspector.TimelineProfileTree.Node} node - * @return {string} - */ - function groupByURL(node) - { - return WebInspector.TimelineTreeView.eventURL(node.event) || ""; - } - - /** - * @param {boolean} groupSubdomains - * @param {!WebInspector.TimelineProfileTree.Node} node - * @return {string} - */ - function groupByDomain(groupSubdomains, node) - { - var url = WebInspector.TimelineTreeView.eventURL(node.event) || ""; - if (url.startsWith("extensions::")) - return WebInspector.UIString("[Chrome extensions overhead]"); - var parsedURL = url.asParsedURL(); - if (!parsedURL) - return ""; - if (parsedURL.scheme === "chrome-extension") { - url = parsedURL.scheme + "://" + parsedURL.host; - var displayName = executionContextNamesByOrigin.get(url); - return displayName ? WebInspector.UIString("[Chrome extension] %s", displayName) : url; - } - if (!groupSubdomains) - return parsedURL.host; - if (/^[.0-9]+$/.test(parsedURL.host)) - return parsedURL.host; - var domainMatch = /([^.]*\.)?[^.]*$/.exec(parsedURL.host); - return domainMatch && domainMatch[0] || ""; - } - - var executionContextNamesByOrigin = new Map(); - for (var target of WebInspector.targetManager.targets()) { - for (var context of target.runtimeModel.executionContexts()) - executionContextNamesByOrigin.set(context.origin, context.name); - } - var groupByMap = /** @type {!Map<!WebInspector.AggregatedTimelineTreeView.GroupBy,?function(!WebInspector.TimelineProfileTree.Node):string>} */ (new Map([ - [WebInspector.AggregatedTimelineTreeView.GroupBy.None, null], - [WebInspector.AggregatedTimelineTreeView.GroupBy.Category, groupByCategory], - [WebInspector.AggregatedTimelineTreeView.GroupBy.Subdomain, groupByDomain.bind(null, false)], - [WebInspector.AggregatedTimelineTreeView.GroupBy.Domain, groupByDomain.bind(null, true)], - [WebInspector.AggregatedTimelineTreeView.GroupBy.URL, groupByURL] - ])); - return groupByMap.get(this._groupBySetting.get()) || null; - }, - - /** * @override * @param {!WebInspector.TimelineProfileTree.Node} node * @return {boolean} @@ -749,31 +639,9 @@ */ _buildTree: function() { - var topDown = this._buildTopDownTree(WebInspector.AggregatedTimelineTreeView.eventId); - return this._performTopDownTreeGrouping(topDown); - }, - - /** - * @param {!WebInspector.TimelineProfileTree.Node} topDownTree - * @return {!WebInspector.TimelineProfileTree.Node} - */ - _performTopDownTreeGrouping: function(topDownTree) - { - var nodeToGroupId = this._nodeToGroupIdFunction(); - if (nodeToGroupId) { - this._groupNodes = new Map(); - for (var node of topDownTree.children.values()) { - var groupNode = this._nodeToGroupNode(nodeToGroupId, node); - groupNode.parent = topDownTree; - groupNode.selfTime += node.selfTime; - groupNode.totalTime += node.totalTime; - groupNode.children.set(node.id, node); - node.parent = groupNode; - } - topDownTree.children = this._groupNodes; - this._groupNodes = null; - } - return topDownTree; + var topDown = this._buildTopDownTree(WebInspector.TimelineAggregator.eventId); + var aggregator = new WebInspector.TimelineAggregator(event => WebInspector.TimelineUIUtils.eventStyle(event).category.name); + return aggregator.performGrouping(topDown, this._groupBySetting.get()); }, __proto__: WebInspector.AggregatedTimelineTreeView.prototype, @@ -797,11 +665,9 @@ */ _buildTree: function() { - var topDown = this._buildTopDownTree(WebInspector.AggregatedTimelineTreeView.eventId); - this._groupNodes = new Map(); - var nodeToGroupId = this._nodeToGroupIdFunction(); - var nodeToGroupNode = nodeToGroupId ? this._nodeToGroupNode.bind(this, nodeToGroupId) : null; - return WebInspector.TimelineProfileTree.buildBottomUp(topDown, nodeToGroupNode); + var topDown = this._buildTopDownTree(WebInspector.TimelineAggregator.eventId); + var aggregator = new WebInspector.TimelineAggregator(event => WebInspector.TimelineUIUtils.eventStyle(event).category.name); + return WebInspector.TimelineProfileTree.buildBottomUp(topDown, aggregator.groupFunction(this._groupBySetting.get())); }, __proto__: WebInspector.AggregatedTimelineTreeView.prototype
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js index c1208bc..f699c73a 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js +++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js
@@ -122,7 +122,7 @@ } /** - * @typedef {!{name: string, startLevel: number, expanded: boolean, style: !WebInspector.FlameChart.GroupStyle}} + * @typedef {!{name: string, startLevel: number, expanded: (boolean|undefined), style: !WebInspector.FlameChart.GroupStyle}} */ WebInspector.FlameChart.Group; @@ -1401,7 +1401,7 @@ context.beginPath(); forEachGroup((offset, index, group) => { if (group.style.collapsible) - drawExpansionArrow(expansionArrowX, offset + textBaseHeight - arrowSide / 2, group.expanded) + drawExpansionArrow(expansionArrowX, offset + textBaseHeight - arrowSide / 2, !!group.expanded) }); context.fill();
diff --git a/third_party/WebKit/Source/devtools/front_end/workspace/UISourceCode.js b/third_party/WebKit/Source/devtools/front_end/workspace/UISourceCode.js index e535581..5e78d0a 100644 --- a/third_party/WebKit/Source/devtools/front_end/workspace/UISourceCode.js +++ b/third_party/WebKit/Source/devtools/front_end/workspace/UISourceCode.js
@@ -52,6 +52,8 @@ this._requestContentCallback = null; /** @type {?Promise<?string>} */ this._requestContentPromise = null; + /** @type {!Map<string, !Array<!WebInspector.UISourceCode.LineMarker>>} */ + this._lineDecorations = new Map(); /** @type {!Array.<!WebInspector.Revision>} */ this.history = []; @@ -71,6 +73,8 @@ SourceMappingChanged: "SourceMappingChanged", MessageAdded: "MessageAdded", MessageRemoved: "MessageRemoved", + LineDecorationAdded: "LineDecorationAdded", + LineDecorationRemoved: "LineDecorationRemoved" } WebInspector.UISourceCode.prototype = { @@ -644,6 +648,42 @@ this.dispatchEventToListeners(WebInspector.UISourceCode.Events.MessageRemoved, message); }, + /** + * @param {number} lineNumber + * @param {string} type + * @param {?} data + */ + addLineDecoration: function(lineNumber, type, data) + { + var markers = this._lineDecorations.get(type); + if (!markers) { + markers = []; + this._lineDecorations.set(type, markers); + } + var marker = new WebInspector.UISourceCode.LineMarker(lineNumber, type, data); + markers.push(marker); + this.dispatchEventToListeners(WebInspector.UISourceCode.Events.LineDecorationAdded, marker); + }, + + /** + * @param {string} type + */ + removeAllLineDecorations: function(type) + { + var markers = this._lineDecorations.get(type) || []; + markers.forEach(this.dispatchEventToListeners.bind(this, WebInspector.UISourceCode.Events.LineDecorationRemoved)); + this._lineDecorations.delete(type); + }, + + /** + * @param {string} type + * @return {?Array<!WebInspector.UISourceCode.LineMarker>} + */ + lineDecorations: function(type) + { + return this._lineDecorations.get(type) || null; + }, + __proto__: WebInspector.Object.prototype } @@ -837,7 +877,8 @@ /** * @return {!WebInspector.TextRange} */ - range: function() { + range: function() + { return this._range; }, @@ -871,3 +912,42 @@ this._uiSourceCode.removeMessage(this); } } + +/** + * @constructor + * @param {number} line + * @param {string} type + * @param {?} data + */ +WebInspector.UISourceCode.LineMarker = function(line, type, data) +{ + this._line = line; + this._type = type; + this._data = data; +} + +WebInspector.UISourceCode.LineMarker.prototype = { + /** + * @return {number} + */ + line: function() + { + return this._line; + }, + + /** + * @return {string} + */ + type: function() + { + return this._type; + }, + + /** + * @return {*} + */ + data: function() + { + return this._data; + } +}
diff --git a/third_party/WebKit/Source/devtools/protocol.json b/third_party/WebKit/Source/devtools/protocol.json index e42585d..916dff85 100644 --- a/third_party/WebKit/Source/devtools/protocol.json +++ b/third_party/WebKit/Source/devtools/protocol.json
@@ -3710,17 +3710,6 @@ "description": "Changes value of variable in a callframe or a closure. Either callframe or function must be specified. Object-based scopes are not supported and must be mutated manually." }, { - "name": "getStepInPositions", - "parameters": [ - { "name": "callFrameId", "$ref": "CallFrameId", "description": "Id of a call frame where the current statement should be analized" } - ], - "returns": [ - { "name": "stepInPositions", "type": "array", "items": { "$ref": "Location" }, "optional": true, "description": "experimental" } - ], - "hidden": true, - "description": "Lists all positions where step-in is possible for a current statement in a specified call frame" - }, - { "name": "getBacktrace", "returns": [ { "name": "callFrames", "type": "array", "items": { "$ref": "CallFrame" }, "description": "Call stack the virtual machine stopped on." },
diff --git a/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.cpp b/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.cpp index daee556..0a9ceba6 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.cpp
@@ -91,7 +91,7 @@ Element* AXImageMapLink::anchorElement() const { - return node() ? toElement(node()) : nullptr; + return getNode() ? toElement(getNode()) : nullptr; } KURL AXImageMapLink::url() const @@ -111,7 +111,7 @@ LayoutObject* layoutObject; if (m_parent && m_parent->isAXLayoutObject()) - layoutObject = toAXLayoutObject(m_parent)->layoutObject(); + layoutObject = toAXLayoutObject(m_parent)->getLayoutObject(); else layoutObject = map->layoutObject();
diff --git a/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.h b/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.h index b4c0f7b..95e1ffa 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.h +++ b/third_party/WebKit/Source/modules/accessibility/AXImageMapLink.h
@@ -47,7 +47,7 @@ ~AXImageMapLink() override; DECLARE_VIRTUAL_TRACE(); - HTMLAreaElement* areaElement() const { return toHTMLAreaElement(node()); } + HTMLAreaElement* areaElement() const { return toHTMLAreaElement(getNode()); } HTMLMapElement* mapElement() const;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp index 699c13c..37efbf4 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
@@ -218,7 +218,7 @@ return m_cachedElementRect; } -LayoutBoxModelObject* AXLayoutObject::layoutBoxModelObject() const +LayoutBoxModelObject* AXLayoutObject::getLayoutBoxModelObject() const { if (!m_layoutObject || !m_layoutObject->isBoxModelObject()) return 0; @@ -264,7 +264,7 @@ AccessibilityRole AXLayoutObject::nativeAccessibilityRoleIgnoringAria() const { Node* node = m_layoutObject->node(); - LayoutBoxModelObject* cssBox = layoutBoxModelObject(); + LayoutBoxModelObject* cssBox = getLayoutBoxModelObject(); if ((cssBox && cssBox->isListItem()) || isHTMLLIElement(node)) return ListItemRole; @@ -351,26 +351,26 @@ static bool isLinkable(const AXObject& object) { - if (!object.layoutObject()) + if (!object.getLayoutObject()) return false; // See https://wiki.mozilla.org/Accessibility/AT-Windows-API for the elements // Mozilla considers linkable. - return object.isLink() || object.isImage() || object.layoutObject()->isText(); + return object.isLink() || object.isImage() || object.getLayoutObject()->isText(); } // Requires layoutObject to be present because it relies on style // user-modify. Don't move this logic to AXNodeObject. bool AXLayoutObject::isEditable() const { - if (layoutObject() && layoutObject()->isTextControl()) + if (getLayoutObject() && getLayoutObject()->isTextControl()) return true; - if (node() && node()->isContentEditable()) + if (getNode() && getNode()->isContentEditable()) return true; if (isWebArea()) { - Document& document = layoutObject()->document(); + Document& document = getLayoutObject()->document(); HTMLElement* body = document.body(); if (body && body->isContentEditable()) return true; @@ -388,7 +388,7 @@ if (isARIATextControl()) return false; - if (node() && node()->isContentRichlyEditable()) + if (getNode() && getNode()->isContentRichlyEditable()) return true; if (isWebArea()) { @@ -581,7 +581,7 @@ if (controlObject && controlObject->isCheckboxOrRadio() && controlObject->nameFromLabelElement()) { if (ignoredReasons) { HTMLLabelElement* label = labelElementContainer(); - if (label && label != node()) { + if (label && label != getNode()) { AXObject* labelAXObject = axObjectCache().getOrCreate(label); ignoredReasons->append(IgnoredReason(AXLabelContainer, labelAXObject)); } @@ -987,7 +987,7 @@ void AXLayoutObject::loadInlineTextBoxes() { - if (!layoutObject() || !layoutObject()->isText()) + if (!getLayoutObject() || !getLayoutObject()->isText()) return; clearChildren(); @@ -1086,7 +1086,7 @@ if (!m_layoutObject) return String(); - LayoutBoxModelObject* cssBox = layoutBoxModelObject(); + LayoutBoxModelObject* cssBox = getLayoutBoxModelObject(); if (cssBox && cssBox->isMenuList()) { // LayoutMenuList will go straight to the text() of its selected item. @@ -1119,8 +1119,8 @@ // Handle other HTML input elements that aren't text controls, like date and time // controls, by returning the string value, with the exception of checkboxes // and radio buttons (which would return "on"). - if (node() && isHTMLInputElement(node())) { - HTMLInputElement* input = toHTMLInputElement(node()); + if (getNode() && isHTMLInputElement(getNode())) { + HTMLInputElement* input = toHTMLInputElement(getNode()); if (input->type() != InputTypeNames::checkbox && input->type() != InputTypeNames::radio) return input->value(); } @@ -1726,12 +1726,12 @@ // DOM and layout tree access. // -Node* AXLayoutObject::node() const +Node* AXLayoutObject::getNode() const { return m_layoutObject ? m_layoutObject->node() : 0; } -Document* AXLayoutObject::document() const +Document* AXLayoutObject::getDocument() const { if (!m_layoutObject) return 0; @@ -1789,10 +1789,10 @@ if (textSelection.isValid()) return textSelection; - if (!layoutObject() || !layoutObject()->frame()) + if (!getLayoutObject() || !getLayoutObject()->frame()) return AXRange(); - VisibleSelection selection = layoutObject()->frame()->selection().selection(); + VisibleSelection selection = getLayoutObject()->frame()->selection().selection(); if (selection.isNone()) return AXRange(); @@ -1855,13 +1855,13 @@ if (textSelection.isValid()) return textSelection; - if (!node() || !layoutObject()->frame()) + if (!getNode() || !getLayoutObject()->frame()) return AXRange(); - VisibleSelection selection = layoutObject()->frame()->selection().selection(); + VisibleSelection selection = getLayoutObject()->frame()->selection().selection(); RefPtrWillBeRawPtr<Range> selectionRange = firstRangeOf(selection); - ContainerNode* parentNode = node()->parentNode(); - int nodeIndex = node()->nodeIndex(); + ContainerNode* parentNode = getNode()->parentNode(); + int nodeIndex = getNode()->nodeIndex(); if (!selectionRange // Selection is contained in node. || !(parentNode @@ -1880,14 +1880,14 @@ AXObject::AXRange AXLayoutObject::textControlSelection() const { - if (!layoutObject()) + if (!getLayoutObject()) return AXRange(); LayoutObject* layout = nullptr; - if (layoutObject()->isTextControl()) { - layout = layoutObject(); + if (getLayoutObject()->isTextControl()) { + layout = getLayoutObject(); } else { - Element* focusedElement = document()->focusedElement(); + Element* focusedElement = getDocument()->focusedElement(); if (focusedElement && focusedElement->layoutObject() && focusedElement->layoutObject()->isTextControl()) layout = focusedElement->layoutObject(); @@ -1910,21 +1910,21 @@ int AXLayoutObject::indexForVisiblePosition(const VisiblePosition& position) const { - if (layoutObject() && layoutObject()->isTextControl()) { + if (getLayoutObject() && getLayoutObject()->isTextControl()) { HTMLTextFormControlElement* textControl = toLayoutTextControl( - layoutObject())->textFormControlElement(); + getLayoutObject())->textFormControlElement(); return textControl->indexForVisiblePosition(position); } - if (!node()) + if (!getNode()) return 0; Position indexPosition = position.deepEquivalent(); if (indexPosition.isNull()) return 0; - RefPtrWillBeRawPtr<Range> range = Range::create(*document()); - range->setStart(node(), 0, IGNORE_EXCEPTION); + RefPtrWillBeRawPtr<Range> range = Range::create(*getDocument()); + range->setStart(getNode(), 0, IGNORE_EXCEPTION); range->setEnd(indexPosition, IGNORE_EXCEPTION); return TextIterator::rangeLength(range->startPosition(), range->endPosition()); @@ -1952,7 +1952,7 @@ void AXLayoutObject::setSelection(const AXRange& selection) { - if (!layoutObject() || !selection.isValid()) + if (!getLayoutObject() || !selection.isValid()) return; AXObject* anchorObject = selection.anchorObject ? @@ -1966,9 +1966,9 @@ } if (anchorObject == focusObject - && anchorObject->layoutObject()->isTextControl()) { + && anchorObject->getLayoutObject()->isTextControl()) { HTMLTextFormControlElement* textControl = toLayoutTextControl( - anchorObject->layoutObject())->textFormControlElement(); + anchorObject->getLayoutObject())->textFormControlElement(); if (selection.anchorOffset <= selection.focusOffset) { textControl->setSelectionRange( selection.anchorOffset, selection.focusOffset, @@ -1983,20 +1983,20 @@ Node* anchorNode = nullptr; while (anchorObject && !anchorNode) { - anchorNode = anchorObject->node(); + anchorNode = anchorObject->getNode(); anchorObject = anchorObject->parentObject(); } Node* focusNode = nullptr; while (focusObject && !focusNode) { - focusNode = focusObject->node(); + focusNode = focusObject->getNode(); focusObject = focusObject->parentObject(); } if (!anchorNode || !focusNode) return; - LocalFrame* frame = layoutObject()->frame(); + LocalFrame* frame = getLayoutObject()->frame(); if (!frame) return; @@ -2007,24 +2007,24 @@ bool AXLayoutObject::isValidSelectionBound(const AXObject* boundObject) const { - return layoutObject() && boundObject && !boundObject->isDetached() - && boundObject->isAXLayoutObject() && boundObject->layoutObject() - && boundObject->layoutObject()->frame() == layoutObject()->frame() + return getLayoutObject() && boundObject && !boundObject->isDetached() + && boundObject->isAXLayoutObject() && boundObject->getLayoutObject() + && boundObject->getLayoutObject()->frame() == getLayoutObject()->frame() && &boundObject->axObjectCache() == &axObjectCache(); } void AXLayoutObject::setValue(const String& string) { - if (!node() || !node()->isElementNode()) + if (!getNode() || !getNode()->isElementNode()) return; if (!m_layoutObject || !m_layoutObject->isBoxModelObject()) return; LayoutBoxModelObject* layoutObject = toLayoutBoxModelObject(m_layoutObject); - if (layoutObject->isTextField() && isHTMLInputElement(*node())) - toHTMLInputElement(*node()).setValue(string, DispatchInputAndChangeEvent); - else if (layoutObject->isTextArea() && isHTMLTextAreaElement(*node())) - toHTMLTextAreaElement(*node()).setValue(string, DispatchInputAndChangeEvent); + if (layoutObject->isTextField() && isHTMLInputElement(*getNode())) + toHTMLInputElement(*getNode()).setValue(string, DispatchInputAndChangeEvent); + else if (layoutObject->isTextArea() && isHTMLTextAreaElement(*getNode())) + toHTMLTextAreaElement(*getNode()).setValue(string, DispatchInputAndChangeEvent); } // @@ -2033,10 +2033,10 @@ void AXLayoutObject::handleActiveDescendantChanged() { - Element* element = toElement(layoutObject()->node()); + Element* element = toElement(getLayoutObject()->node()); if (!element) return; - Document& doc = layoutObject()->document(); + Document& doc = getLayoutObject()->document(); if (!doc.frame()->selection().isFocusedAndActive() || doc.focusedElement() != element) return; AXLayoutObject* activedescendant = toAXLayoutObject(activeDescendant()); @@ -2092,7 +2092,7 @@ if (!m_layoutObject) return; - Settings* settings = document()->settings(); + Settings* settings = getDocument()->settings(); if (settings && settings->inlineTextBoxAccessibilityEnabled() && roleValue() == StaticTextRole) childrenChanged(); @@ -2144,21 +2144,21 @@ void AXLayoutObject::addInlineTextBoxChildren(bool force) { - Settings* settings = document()->settings(); + Settings* settings = getDocument()->settings(); if (!force && (!settings || !settings->inlineTextBoxAccessibilityEnabled())) return; - if (!layoutObject() || !layoutObject()->isText()) + if (!getLayoutObject() || !getLayoutObject()->isText()) return; - if (layoutObject()->needsLayout()) { + if (getLayoutObject()->needsLayout()) { // If a LayoutText needs layout, its inline text boxes are either // nonexistent or invalid, so defer until the layout happens and // the layoutObject calls AXObjectCacheImpl::inlineTextBoxesUpdated. return; } - LayoutText* layoutText = toLayoutText(layoutObject()); + LayoutText* layoutText = toLayoutText(getLayoutObject()); for (RefPtr<AbstractInlineTextBox> box = layoutText->firstAbstractInlineTextBox(); box.get(); box = box->nextInlineTextBox()) { AXObject* axObject = axObjectCache().getOrCreate(box.get()); if (!axObject->accessibilityIsIgnored()) @@ -2355,7 +2355,7 @@ // meaning that they should be exposed to the AX hierarchy. void AXLayoutObject::addHiddenChildren() { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return; @@ -2403,7 +2403,7 @@ void AXLayoutObject::addTextFieldChildren() { - Node* node = this->node(); + Node* node = this->getNode(); if (!isHTMLInputElement(node)) return; @@ -2420,7 +2420,7 @@ void AXLayoutObject::addImageMapChildren() { - LayoutBoxModelObject* cssBox = layoutBoxModelObject(); + LayoutBoxModelObject* cssBox = getLayoutBoxModelObject(); if (!cssBox || !cssBox->isLayoutImage()) return; @@ -2445,7 +2445,7 @@ void AXLayoutObject::addCanvasChildren() { - if (!isHTMLCanvasElement(node())) + if (!isHTMLCanvasElement(getNode())) return; // If it's a canvas, it won't have laid out children, but it might have accessible fallback content. @@ -2475,9 +2475,9 @@ void AXLayoutObject::addPopupChildren() { - if (!isHTMLInputElement(node())) + if (!isHTMLInputElement(getNode())) return; - if (AXObject* axPopup = toHTMLInputElement(node())->popupRootAXObject()) + if (AXObject* axPopup = toHTMLInputElement(getNode())->popupRootAXObject()) m_children.append(axPopup); } @@ -2530,7 +2530,7 @@ result = LayoutRect(obj->absoluteElementBoundingBoxRect()); } - Document* document = this->document(); + Document* document = this->getDocument(); if (document && document->isSVGDocument()) offsetBoundingBoxForRemoteSVGElement(result); if (document && document->frame() && document->frame()->pagePopupOwner()) {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h index 79acacc..0610bac 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h +++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.h
@@ -54,9 +54,9 @@ ~AXLayoutObject() override; // Public, overridden from AXObject. - LayoutObject* layoutObject() const final { return m_layoutObject; } + LayoutObject* getLayoutObject() const final { return m_layoutObject; } LayoutRect elementRect() const override; - LayoutBoxModelObject* layoutBoxModelObject() const; + LayoutBoxModelObject* getLayoutBoxModelObject() const; bool shouldNotifyActiveDescendant() const; ScrollableArea* getScrollableAreaIfScrollable() const final; AccessibilityRole determineAccessibilityRole() override; @@ -176,8 +176,8 @@ double estimatedLoadingProgress() const override; // DOM and layout tree access. - Node* node() const override; - Document* document() const override; + Node* getNode() const override; + Document* getDocument() const override; FrameView* documentFrameView() const override; Element* anchorElement() const override;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXListBox.cpp b/third_party/WebKit/Source/modules/accessibility/AXListBox.cpp index d025d1be..0d04e157 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXListBox.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXListBox.cpp
@@ -64,10 +64,10 @@ AXObject* AXListBox::activeDescendant() const { - if (!isHTMLSelectElement(node())) + if (!isHTMLSelectElement(getNode())) return nullptr; - HTMLSelectElement* select = toHTMLSelectElement(node()); + HTMLSelectElement* select = toHTMLSelectElement(getNode()); int activeIndex = select->activeSelectionEndListIndex(); if (activeIndex >= 0 && activeIndex < static_cast<int>(select->length())) { HTMLOptionElement* option = select->item(m_activeIndex); @@ -79,10 +79,10 @@ void AXListBox::activeIndexChanged() { - if (!isHTMLSelectElement(node())) + if (!isHTMLSelectElement(getNode())) return; - HTMLSelectElement* select = toHTMLSelectElement(node()); + HTMLSelectElement* select = toHTMLSelectElement(getNode()); int activeIndex = select->activeSelectionEndListIndex(); if (activeIndex == m_activeIndex) return;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp index 2f45e76..58b655b0 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXListBoxOption.cpp
@@ -73,7 +73,7 @@ if (!parent) return false; - LayoutObject* layoutObject = parent->layoutObject(); + LayoutObject* layoutObject = parent->getLayoutObject(); if (!layoutObject) return false; @@ -85,13 +85,13 @@ bool AXListBoxOption::isEnabled() const { - if (!node()) + if (!getNode()) return false; if (equalIgnoringCase(getAttribute(aria_disabledAttr), "true")) return false; - if (toElement(node())->hasAttribute(disabledAttr)) + if (toElement(getNode())->hasAttribute(disabledAttr)) return false; return true; @@ -99,7 +99,7 @@ bool AXListBoxOption::isSelected() const { - return isHTMLOptionElement(node()) && toHTMLOptionElement(node())->selected(); + return isHTMLOptionElement(getNode()) && toHTMLOptionElement(getNode())->selected(); } bool AXListBoxOption::isSelectedOptionActive() const @@ -113,7 +113,7 @@ bool AXListBoxOption::computeAccessibilityIsIgnored(IgnoredReasons* ignoredReasons) const { - if (!node()) + if (!getNode()) return true; if (accessibilityIsIgnoredByDefault(ignoredReasons)) @@ -124,10 +124,10 @@ bool AXListBoxOption::canSetSelectedAttribute() const { - if (!isHTMLOptionElement(node())) + if (!isHTMLOptionElement(getNode())) return false; - if (toHTMLOptionElement(node())->isDisabledFormControl()) + if (toHTMLOptionElement(getNode())->isDisabledFormControl()) return false; HTMLSelectElement* selectElement = listBoxOptionParentNode(); @@ -143,7 +143,7 @@ if (nameSources) ASSERT(relatedObjects); - if (!node()) + if (!getNode()) return String(); bool foundTextAlternative = false; @@ -152,7 +152,7 @@ return textAlternative; nameFrom = AXNameFromContents; - textAlternative = toHTMLOptionElement(node())->displayLabel(); + textAlternative = toHTMLOptionElement(getNode())->displayLabel(); if (nameSources) { nameSources->append(NameSource(foundTextAlternative)); nameSources->last().type = nameFrom; @@ -183,11 +183,11 @@ HTMLSelectElement* AXListBoxOption::listBoxOptionParentNode() const { - if (!node()) + if (!getNode()) return 0; - if (isHTMLOptionElement(node())) - return toHTMLOptionElement(node())->ownerSelectElement(); + if (isHTMLOptionElement(getNode())) + return toHTMLOptionElement(getNode())->ownerSelectElement(); return 0; } @@ -201,7 +201,7 @@ const WillBeHeapVector<RawPtrWillBeMember<HTMLElement>>& listItems = selectElement->listItems(); unsigned length = listItems.size(); for (unsigned i = 0; i < length; i++) { - if (listItems[i] == node()) + if (listItems[i] == getNode()) return i; }
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp index a80c49c8..309e230 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp
@@ -69,10 +69,10 @@ MediaControlElementType AccessibilityMediaControl::controlType() const { - if (!layoutObject() || !layoutObject()->node()) + if (!getLayoutObject() || !getLayoutObject()->node()) return MediaTimelineContainer; // Timeline container is not accessible. - return mediaControlElementType(layoutObject()->node()); + return mediaControlElementType(getLayoutObject()->node()); } String AccessibilityMediaControl::textAlternative(bool recursive, bool inAriaLabelledByTraversal, AXObjectSet& visited, AXNameFrom& nameFrom, AXRelatedObjectVector* relatedObjects, NameSources* nameSources) const
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuList.cpp b/third_party/WebKit/Source/modules/accessibility/AXMenuList.cpp index ee2682d..19277207 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXMenuList.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXMenuList.cpp
@@ -123,10 +123,10 @@ bool AXMenuList::canSetFocusAttribute() const { - if (!node()) + if (!getNode()) return false; - return !toElement(node())->isDisabledFormControl(); + return !toElement(getNode())->isDisabledFormControl(); } void AXMenuList::didUpdateActiveOption(int optionIndex) @@ -162,7 +162,7 @@ AXMenuListPopup* popup = toAXMenuListPopup(children()[0].get()); popup->didHide(); - if (node() && node()->focused()) + if (getNode() && getNode()->focused()) axObjectCache().postNotification(this, AXObjectCacheImpl::AXFocusedUIElementChanged); }
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp index f8b18a7..d2b1eec 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.cpp
@@ -136,7 +136,7 @@ if (nameSources) ASSERT(relatedObjects); - if (!node()) + if (!getNode()) return String(); bool foundTextAlternative = false;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h index 2ca40f3c..466cfff 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h +++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListOption.h
@@ -44,7 +44,7 @@ bool isMenuListOption() const override { return true; } - Node* node() const override { return m_element; } + Node* getNode() const override { return m_element; } void detach() override; bool isDetached() const override { return !m_element; } AccessibilityRole roleValue() const override;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.cpp b/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.cpp index 2bda5d37..5ba4242 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXMenuListPopup.cpp
@@ -82,7 +82,7 @@ if (!m_parent) return -1; - Node* parentNode = m_parent->node(); + Node* parentNode = m_parent->getNode(); if (!isHTMLSelectElement(parentNode)) return -1; @@ -105,7 +105,7 @@ if (!m_parent) return; - Node* parentNode = m_parent->node(); + Node* parentNode = m_parent->getNode(); if (!isHTMLSelectElement(parentNode)) return;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp index 5fa5f18..1716a57 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
@@ -140,7 +140,7 @@ value += increase ? step : -step; setValue(String::number(value)); - axObjectCache().postNotification(node(), AXObjectCacheImpl::AXValueChanged); + axObjectCache().postNotification(getNode(), AXObjectCacheImpl::AXValueChanged); } String AXNodeObject::ariaAccessibilityDescription() const @@ -176,7 +176,7 @@ if (controlObject && controlObject->isCheckboxOrRadio() && controlObject->nameFromLabelElement()) { if (ignoredReasons) { HTMLLabelElement* label = labelElementContainer(); - if (label && label != node()) { + if (label && label != getNode()) { AXObject* labelAXObject = axObjectCache().getOrCreate(label); ignoredReasons->append(IgnoredReason(AXLabelContainer, labelAXObject)); } @@ -186,8 +186,8 @@ return true; } - Element* element = node()->isElementNode() ? toElement(node()) : node()->parentElement(); - if (!layoutObject() + Element* element = getNode()->isElementNode() ? toElement(getNode()) : getNode()->parentElement(); + if (!getLayoutObject() && (!element || !element->isInCanvasSubtree()) && !equalIgnoringCase(getAttribute(aria_hiddenAttr), "false")) { if (ignoredReasons) @@ -213,7 +213,7 @@ if (!currentElement) return false; - Node* parentNode = parent->node(); + Node* parentNode = parent->getNode(); if (!parentNode || !parentNode->isHTMLElement()) return false; @@ -230,7 +230,7 @@ if (isHTMLTableRowElement(*currentElement) && isHTMLTableSectionElement(toHTMLElement(*parentNode))) { // Because TableSections have ignored role, presentation should be checked with its parent node AXObject* tableObject = parent->parentObject(); - Node* tableNode = tableObject ? tableObject->node() : 0; + Node* tableNode = tableObject ? tableObject->getNode() : 0; return isHTMLTableElement(tableNode) && tableObject->hasInheritedPresentationalRole(); } return false; @@ -238,7 +238,7 @@ static bool isRequiredOwnedElement(AXObject* parent, AccessibilityRole currentRole, HTMLElement* currentElement) { - Node* parentNode = parent->node(); + Node* parentNode = parent->getNode(); if (!parentNode || !parentNode->isHTMLElement()) return false; @@ -283,13 +283,13 @@ return 0; HTMLElement* element = nullptr; - if (node() && node()->isHTMLElement()) - element = toHTMLElement(node()); + if (getNode() && getNode()->isHTMLElement()) + element = toHTMLElement(getNode()); if (!parent->hasInheritedPresentationalRole()) { - if (!layoutObject() || !layoutObject()->isBoxModelObject()) + if (!getLayoutObject() || !getLayoutObject()->isBoxModelObject()) return 0; - LayoutBoxModelObject* cssBox = toLayoutBoxModelObject(layoutObject()); + LayoutBoxModelObject* cssBox = toLayoutBoxModelObject(getLayoutObject()); if (!cssBox->isTableCell() && !cssBox->isTableRow()) return 0; @@ -305,10 +305,10 @@ bool AXNodeObject::isDescendantOfElementType(const HTMLQualifiedName& tagName) const { - if (!node()) + if (!getNode()) return false; - for (Element* parent = node()->parentElement(); parent; parent = parent->parentElement()) { + for (Element* parent = getNode()->parentElement(); parent; parent = parent->parentElement()) { if (parent->hasTagName(tagName)) return true; } @@ -317,39 +317,39 @@ AccessibilityRole AXNodeObject::nativeAccessibilityRoleIgnoringAria() const { - if (!node()) + if (!getNode()) return UnknownRole; // HTMLAnchorElement sets isLink only when it has hrefAttr. // We assume that it is also LinkRole if it has event listners even though it doesn't have hrefAttr. - if (node()->isLink() || (isHTMLAnchorElement(*node()) && isClickable())) + if (getNode()->isLink() || (isHTMLAnchorElement(*getNode()) && isClickable())) return LinkRole; - if (isHTMLButtonElement(*node())) + if (isHTMLButtonElement(*getNode())) return buttonRoleType(); - if (isHTMLDetailsElement(*node())) + if (isHTMLDetailsElement(*getNode())) return DetailsRole; - if (isHTMLSummaryElement(*node())) { - ContainerNode* parent = FlatTreeTraversal::parent(*node()); + if (isHTMLSummaryElement(*getNode())) { + ContainerNode* parent = FlatTreeTraversal::parent(*getNode()); if (parent && isHTMLDetailsElement(parent)) return DisclosureTriangleRole; return UnknownRole; } - if (isHTMLInputElement(*node())) { - HTMLInputElement& input = toHTMLInputElement(*node()); + if (isHTMLInputElement(*getNode())) { + HTMLInputElement& input = toHTMLInputElement(*getNode()); const AtomicString& type = input.type(); if (input.dataList()) return ComboBoxRole; if (type == InputTypeNames::button) { - if ((node()->parentNode() && isHTMLMenuElement(node()->parentNode())) || (parentObject() && parentObject()->roleValue() == MenuRole)) + if ((getNode()->parentNode() && isHTMLMenuElement(getNode()->parentNode())) || (parentObject() && parentObject()->roleValue() == MenuRole)) return MenuItemRole; return buttonRoleType(); } if (type == InputTypeNames::checkbox) { - if ((node()->parentNode() && isHTMLMenuElement(node()->parentNode())) || (parentObject() && parentObject()->roleValue() == MenuRole)) + if ((getNode()->parentNode() && isHTMLMenuElement(getNode()->parentNode())) || (parentObject() && parentObject()->roleValue() == MenuRole)) return MenuItemCheckBoxRole; return CheckBoxRole; } @@ -363,7 +363,7 @@ if (type == InputTypeNames::file) return ButtonRole; if (type == InputTypeNames::radio) { - if ((node()->parentNode() && isHTMLMenuElement(node()->parentNode())) || (parentObject() && parentObject()->roleValue() == MenuRole)) + if ((getNode()->parentNode() && isHTMLMenuElement(getNode()->parentNode())) || (parentObject() && parentObject()->roleValue() == MenuRole)) return MenuItemRadioRole; return RadioButtonRole; } @@ -380,91 +380,91 @@ return TextFieldRole; } - if (isHTMLSelectElement(*node())) { - HTMLSelectElement& selectElement = toHTMLSelectElement(*node()); + if (isHTMLSelectElement(*getNode())) { + HTMLSelectElement& selectElement = toHTMLSelectElement(*getNode()); return selectElement.multiple() ? ListBoxRole : PopUpButtonRole; } - if (isHTMLTextAreaElement(*node())) + if (isHTMLTextAreaElement(*getNode())) return TextFieldRole; if (headingLevel()) return HeadingRole; - if (isHTMLDivElement(*node())) + if (isHTMLDivElement(*getNode())) return DivRole; - if (isHTMLMeterElement(*node())) + if (isHTMLMeterElement(*getNode())) return MeterRole; - if (isHTMLOutputElement(*node())) + if (isHTMLOutputElement(*getNode())) return StatusRole; - if (isHTMLParagraphElement(*node())) + if (isHTMLParagraphElement(*getNode())) return ParagraphRole; - if (isHTMLLabelElement(*node())) + if (isHTMLLabelElement(*getNode())) return LabelRole; - if (isHTMLLegendElement(*node())) + if (isHTMLLegendElement(*getNode())) return LegendRole; - if (isHTMLRubyElement(*node())) + if (isHTMLRubyElement(*getNode())) return RubyRole; - if (isHTMLDListElement(*node())) + if (isHTMLDListElement(*getNode())) return DescriptionListRole; - if (node()->hasTagName(ddTag)) + if (getNode()->hasTagName(ddTag)) return DescriptionListDetailRole; - if (node()->hasTagName(dtTag)) + if (getNode()->hasTagName(dtTag)) return DescriptionListTermRole; - if (node()->nodeName() == "math") + if (getNode()->nodeName() == "math") return MathRole; - if (node()->hasTagName(rpTag) || node()->hasTagName(rtTag)) + if (getNode()->hasTagName(rpTag) || getNode()->hasTagName(rtTag)) return AnnotationRole; - if (isHTMLFormElement(*node())) + if (isHTMLFormElement(*getNode())) return FormRole; - if (node()->hasTagName(abbrTag)) + if (getNode()->hasTagName(abbrTag)) return AbbrRole; - if (node()->hasTagName(articleTag)) + if (getNode()->hasTagName(articleTag)) return ArticleRole; - if (node()->hasTagName(mainTag)) + if (getNode()->hasTagName(mainTag)) return MainRole; - if (node()->hasTagName(markTag)) + if (getNode()->hasTagName(markTag)) return MarkRole; - if (node()->hasTagName(navTag)) + if (getNode()->hasTagName(navTag)) return NavigationRole; - if (node()->hasTagName(asideTag)) + if (getNode()->hasTagName(asideTag)) return ComplementaryRole; - if (node()->hasTagName(preTag)) + if (getNode()->hasTagName(preTag)) return PreRole; - if (node()->hasTagName(sectionTag)) + if (getNode()->hasTagName(sectionTag)) return RegionRole; - if (node()->hasTagName(addressTag)) + if (getNode()->hasTagName(addressTag)) return ContentInfoRole; - if (isHTMLDialogElement(*node())) + if (isHTMLDialogElement(*getNode())) return DialogRole; // The HTML element should not be exposed as an element. That's what the LayoutView element does. - if (isHTMLHtmlElement(*node())) + if (isHTMLHtmlElement(*getNode())) return IgnoredRole; - if (isHTMLIFrameElement(*node())) { + if (isHTMLIFrameElement(*getNode())) { const AtomicString& ariaRole = getAttribute(roleAttr); if (ariaRole == "none" || ariaRole == "presentation") return IframePresentationalRole; @@ -473,31 +473,31 @@ // There should only be one banner/contentInfo per page. If header/footer are being used within an article or section // then it should not be exposed as whole page's banner/contentInfo - if (node()->hasTagName(headerTag) && !isDescendantOfElementType(articleTag) && !isDescendantOfElementType(sectionTag)) + if (getNode()->hasTagName(headerTag) && !isDescendantOfElementType(articleTag) && !isDescendantOfElementType(sectionTag)) return BannerRole; - if (node()->hasTagName(footerTag) && !isDescendantOfElementType(articleTag) && !isDescendantOfElementType(sectionTag)) + if (getNode()->hasTagName(footerTag) && !isDescendantOfElementType(articleTag) && !isDescendantOfElementType(sectionTag)) return FooterRole; - if (node()->hasTagName(blockquoteTag)) + if (getNode()->hasTagName(blockquoteTag)) return BlockquoteRole; - if (node()->hasTagName(captionTag)) + if (getNode()->hasTagName(captionTag)) return CaptionRole; - if (node()->hasTagName(figcaptionTag)) + if (getNode()->hasTagName(figcaptionTag)) return FigcaptionRole; - if (node()->hasTagName(figureTag)) + if (getNode()->hasTagName(figureTag)) return FigureRole; - if (node()->nodeName() == "TIME") + if (getNode()->nodeName() == "TIME") return TimeRole; if (isEmbeddedObject()) return EmbeddedObjectRole; - if (isHTMLHRElement(*node())) + if (isHTMLHRElement(*getNode())) return SplitterRole; return UnknownRole; @@ -505,21 +505,21 @@ AccessibilityRole AXNodeObject::determineAccessibilityRole() { - if (!node()) + if (!getNode()) return UnknownRole; if ((m_ariaRole = determineAriaRoleAttribute()) != UnknownRole) return m_ariaRole; - if (node()->isTextNode()) + if (getNode()->isTextNode()) return StaticTextRole; AccessibilityRole role = nativeAccessibilityRoleIgnoringAria(); if (role != UnknownRole) return role; - if (node()->isElementNode()) { - Element* element = toElement(node()); + if (getNode()->isElementNode()) { + Element* element = toElement(getNode()); if (element->isInCanvasSubtree()) { - document()->updateLayoutTreeForNode(element); + getDocument()->updateLayoutTreeForNode(element); if (element->isFocusable()) return GroupRole; } @@ -614,7 +614,7 @@ // cases already, so we don't need to include them here. if (roleValue() == WebAreaRole) return false; - if (isHTMLBodyElement(node())) + if (isHTMLBodyElement(getNode())) return false; // An SVG root is focusable by default, but it's probably not interactive, so don't @@ -676,12 +676,12 @@ if (ariaRoleAttribute() != MenuRole) return 0; - return siblingWithAriaRole("menuitem", node()); + return siblingWithAriaRole("menuitem", getNode()); } Element* AXNodeObject::mouseButtonListener() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return 0; @@ -751,7 +751,7 @@ bool AXNodeObject::isControl() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; @@ -761,7 +761,7 @@ bool AXNodeObject::isControllingVideoElement() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return true; @@ -770,12 +770,12 @@ bool AXNodeObject::isEmbeddedObject() const { - return isHTMLPlugInElement(node()); + return isHTMLPlugInElement(getNode()); } bool AXNodeObject::isFieldset() const { - return isHTMLFieldSetElement(node()); + return isHTMLFieldSetElement(getNode()); } bool AXNodeObject::isHeading() const @@ -785,7 +785,7 @@ bool AXNodeObject::isHovered() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; @@ -804,7 +804,7 @@ bool AXNodeObject::isInputImage() const { - Node* node = this->node(); + Node* node = this->getNode(); if (roleValue() == ButtonRole && isHTMLInputElement(node)) return toHTMLInputElement(*node).type() == InputTypeNames::image; @@ -839,12 +839,12 @@ if (equalIgnoringCase(ariaMultiSelectable, "false")) return false; - return isHTMLSelectElement(node()) && toHTMLSelectElement(*node()).multiple(); + return isHTMLSelectElement(getNode()) && toHTMLSelectElement(*getNode()).multiple(); } bool AXNodeObject::isNativeCheckboxOrRadio() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!isHTMLInputElement(node)) return false; @@ -854,7 +854,7 @@ bool AXNodeObject::isNativeImage() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; @@ -872,7 +872,7 @@ bool AXNodeObject::isNativeTextControl() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; @@ -901,7 +901,7 @@ bool AXNodeObject::isPasswordField() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!isHTMLInputElement(node)) return false; @@ -929,7 +929,7 @@ bool AXNodeObject::isNativeSlider() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; @@ -941,7 +941,7 @@ bool AXNodeObject::isChecked() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; @@ -970,12 +970,12 @@ bool AXNodeObject::isClickable() const { - if (node()) { - if (node()->isElementNode() && toElement(node())->isDisabledFormControl()) + if (getNode()) { + if (getNode()->isElementNode() && toElement(getNode())->isDisabledFormControl()) return false; - // Note: we can't call node()->willRespondToMouseClickEvents() because that triggers a style recalc and can delete this. - if (node()->hasEventListeners(EventTypeNames::mouseup) || node()->hasEventListeners(EventTypeNames::mousedown) || node()->hasEventListeners(EventTypeNames::click) || node()->hasEventListeners(EventTypeNames::DOMActivate)) + // Note: we can't call getNode()->willRespondToMouseClickEvents() because that triggers a style recalc and can delete this. + if (getNode()->hasEventListeners(EventTypeNames::mouseup) || getNode()->hasEventListeners(EventTypeNames::mousedown) || getNode()->hasEventListeners(EventTypeNames::click) || getNode()->hasEventListeners(EventTypeNames::DOMActivate)) return true; } @@ -987,7 +987,7 @@ if (isDescendantOfDisabledNode()) return false; - Node* node = this->node(); + Node* node = this->getNode(); if (!node || !node->isElementNode()) return true; @@ -996,9 +996,9 @@ AccessibilityExpanded AXNodeObject::isExpanded() const { - if (node() && isHTMLSummaryElement(*node())) { - if (node()->parentNode() && isHTMLDetailsElement(node()->parentNode())) - return toElement(node()->parentNode())->hasAttribute(openAttr) ? ExpandedExpanded : ExpandedCollapsed; + if (getNode() && isHTMLSummaryElement(*getNode())) { + if (getNode()->parentNode() && isHTMLDetailsElement(getNode()->parentNode())) + return toElement(getNode()->parentNode())->hasAttribute(openAttr) ? ExpandedExpanded : ExpandedCollapsed; } const AtomicString& expanded = getAttribute(aria_expandedAttr); @@ -1015,11 +1015,11 @@ if (!isButton()) return false; - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; - // ARIA button with aria-pressed not undefined, then check for aria-pressed attribute rather than node()->active() + // ARIA button with aria-pressed not undefined, then check for aria-pressed attribute rather than getNode()->active() if (ariaRoleAttribute() == ToggleButtonRole) { if (equalIgnoringCase(getAttribute(aria_pressedAttr), "true") || equalIgnoringCase(getAttribute(aria_pressedAttr), "mixed")) @@ -1032,7 +1032,7 @@ bool AXNodeObject::isReadOnly() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return true; @@ -1050,7 +1050,7 @@ bool AXNodeObject::isRequired() const { - Node* n = this->node(); + Node* n = this->getNode(); if (n && (n->isElementNode() && toElement(n)->isFormControlElement()) && hasAttribute(requiredAttr)) return toHTMLFormControlElement(n)->isRequired(); @@ -1062,7 +1062,7 @@ bool AXNodeObject::canSetFocusAttribute() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; @@ -1099,7 +1099,7 @@ bool AXNodeObject::canvasHasFallbackContent() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!isHTMLCanvasElement(node)) return false; @@ -1112,7 +1112,7 @@ int AXNodeObject::headingLevel() const { // headings can be in block flow and non-block flow - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return 0; @@ -1149,7 +1149,7 @@ unsigned AXNodeObject::hierarchicalLevel() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node || !node->isElementNode()) return 0; Element* element = toElement(node); @@ -1236,7 +1236,7 @@ if (!isTextControl()) return String(); - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return String(); @@ -1262,10 +1262,10 @@ RGBA32 AXNodeObject::colorValue() const { - if (!isHTMLInputElement(node()) || !isColorWell()) + if (!isHTMLInputElement(getNode()) || !isColorWell()) return AXObject::colorValue(); - HTMLInputElement* input = toHTMLInputElement(node()); + HTMLInputElement* input = toHTMLInputElement(getNode()); const AtomicString& type = input->getAttribute(typeAttr); if (!equalIgnoringCase(type, "color")) return AXObject::colorValue(); @@ -1294,9 +1294,9 @@ return InvalidStateOther; } - if (node() && node()->isElementNode() - && toElement(node())->isFormControlElement()) { - HTMLFormControlElement* element = toHTMLFormControlElement(node()); + if (getNode() && getNode()->isElementNode() + && toElement(getNode())->isFormControlElement()) { + HTMLFormControlElement* element = toHTMLFormControlElement(getNode()); WillBeHeapVector<RefPtrWillBeMember<HTMLFormControlElement>> invalidControls; bool isInvalid = !element->checkValidity( @@ -1355,10 +1355,10 @@ return getAttribute(aria_valuenowAttr).toFloat(); if (isNativeSlider()) - return toHTMLInputElement(*node()).valueAsNumber(); + return toHTMLInputElement(*getNode()).valueAsNumber(); - if (isHTMLMeterElement(node())) - return toHTMLMeterElement(*node()).value(); + if (isHTMLMeterElement(getNode())) + return toHTMLMeterElement(*getNode()).value(); return 0.0; } @@ -1369,10 +1369,10 @@ return getAttribute(aria_valuemaxAttr).toFloat(); if (isNativeSlider()) - return toHTMLInputElement(*node()).maximum(); + return toHTMLInputElement(*getNode()).maximum(); - if (isHTMLMeterElement(node())) - return toHTMLMeterElement(*node()).max(); + if (isHTMLMeterElement(getNode())) + return toHTMLMeterElement(*getNode()).max(); return 0.0; } @@ -1383,10 +1383,10 @@ return getAttribute(aria_valueminAttr).toFloat(); if (isNativeSlider()) - return toHTMLInputElement(*node()).minimum(); + return toHTMLInputElement(*getNode()).minimum(); - if (isHTMLMeterElement(node())) - return toHTMLMeterElement(*node()).min(); + if (isHTMLMeterElement(getNode())) + return toHTMLMeterElement(*getNode()).min(); return 0.0; } @@ -1396,13 +1396,13 @@ if (!isNativeSlider()) return 0.0; - Decimal step = toHTMLInputElement(*node()).createStepRange(RejectAny).step(); + Decimal step = toHTMLInputElement(*getNode()).createStepRange(RejectAny).step(); return step.toString().toFloat(); } String AXNodeObject::stringValue() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return String(); @@ -1509,7 +1509,7 @@ bool foundTextAlternative = false; - if (!node() && !layoutObject()) + if (!getNode() && !getLayoutObject()) return String(); String textAlternative = ariaTextAlternative(recursive, inAriaLabelledByTraversal, visited, nameFrom, relatedObjects, nameSources, &foundTextAlternative); @@ -1545,7 +1545,7 @@ nameSources->last().type = nameFrom; } - Node* node = this->node(); + Node* node = this->getNode(); if (node && node->isTextNode()) textAlternative = toText(node)->wholeText(); else if (isHTMLBRElement(node)) @@ -1627,7 +1627,7 @@ // so we should return "HelloWorld", but given <div>Hello</div><div>World</div> the // strings are in separate boxes so we should return "Hello World". if (previous && accumulatedText.length() && !isHTMLSpace(accumulatedText[accumulatedText.length() - 1])) { - if (!isInSameNonInlineBlockFlow(child->layoutObject(), previous->layoutObject())) + if (!isInSameNonInlineBlockFlow(child->getLayoutObject(), previous->getLayoutObject())) accumulatedText.append(' '); } @@ -1649,7 +1649,7 @@ // but it's necessary because nameFromLabelElement needs to be called from // computeAccessibilityIsIgnored, which isn't allowed to call axObjectCache->getOrCreate. - if (!node() && !layoutObject()) + if (!getNode() && !getLayoutObject()) return false; // Step 2A from: http://www.w3.org/TR/accname-aam-1.1 @@ -1670,8 +1670,8 @@ // Based on http://rawgit.com/w3c/aria/master/html-aam/html-aam.html#accessible-name-and-description-calculation // 5.1/5.5 Text inputs, Other labelable Elements HTMLElement* htmlElement = nullptr; - if (node()->isHTMLElement()) - htmlElement = toHTMLElement(node()); + if (getNode()->isHTMLElement()) + htmlElement = toHTMLElement(getNode()); if (htmlElement && htmlElement->isLabelable()) { HTMLLabelElement* label = labelForElement(htmlElement); if (label) @@ -1689,10 +1689,10 @@ // FIXME: If there are a lot of elements in the canvas, it will be inefficient. // We can avoid the inefficient calculations by using AXComputedObjectAttributeCache. - if (node()->parentElement()->isInCanvasSubtree()) { + if (getNode()->parentElement()->isInCanvasSubtree()) { LayoutRect rect; - for (Node& child : NodeTraversal::childrenOf(*node())) { + for (Node& child : NodeTraversal::childrenOf(*getNode())) { if (child.isHTMLElement()) { if (AXObject* obj = axObjectCache().get(&child)) { if (rect.isEmpty()) @@ -1745,7 +1745,7 @@ AXObject* AXNodeObject::computeParent() const { ASSERT(!isDetached()); - if (Node* parentNode = getParentNodeForComputeParent(node())) + if (Node* parentNode = getParentNodeForComputeParent(getNode())) return axObjectCache().getOrCreate(parentNode); return nullptr; @@ -1753,7 +1753,7 @@ AXObject* AXNodeObject::computeParentIfExists() const { - if (Node* parentNode = getParentNodeForComputeParent(node())) + if (Node* parentNode = getParentNodeForComputeParent(getNode())) return axObjectCache().get(parentNode); return nullptr; @@ -1761,10 +1761,10 @@ AXObject* AXNodeObject::rawFirstChild() const { - if (!node()) + if (!getNode()) return 0; - Node* firstChild = node()->firstChild(); + Node* firstChild = getNode()->firstChild(); if (!firstChild) return 0; @@ -1774,10 +1774,10 @@ AXObject* AXNodeObject::rawNextSibling() const { - if (!node()) + if (!getNode()) return 0; - Node* nextSibling = node()->nextSibling(); + Node* nextSibling = getNode()->nextSibling(); if (!nextSibling) return 0; @@ -1797,7 +1797,7 @@ m_haveChildren = true; // The only time we add children from the DOM tree to a node with a layoutObject is when it's a canvas. - if (layoutObject() && !isHTMLCanvasElement(*m_node)) + if (getLayoutObject() && !isHTMLCanvasElement(*m_node)) return; HeapVector<Member<AXObject>> ownedChildren; @@ -1847,10 +1847,10 @@ // If this is an AXLayoutObject, then it's okay if this object // doesn't have a node - there are some layoutObjects that don't have associated // nodes, like scroll areas and css-generated text. - if (!node() && !isAXLayoutObject()) + if (!getNode() && !isAXLayoutObject()) return false; - if (node() && isHTMLMapElement(node())) + if (getNode() && isHTMLMapElement(getNode())) return false; AccessibilityRole role = roleValue(); @@ -1883,7 +1883,7 @@ Element* AXNodeObject::actionElement() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return 0; @@ -1926,7 +1926,7 @@ Element* AXNodeObject::anchorElement() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return 0; @@ -1942,11 +1942,11 @@ return 0; } -Document* AXNodeObject::document() const +Document* AXNodeObject::getDocument() const { - if (!node()) + if (!getNode()) return 0; - return &node()->document(); + return &getNode()->document(); } void AXNodeObject::setNode(Node* node) @@ -1974,7 +1974,7 @@ HTMLLabelElement* AXNodeObject::labelElementContainer() const { - if (!node()) + if (!getNode()) return 0; // the control element should not be considered part of the label @@ -1986,7 +1986,7 @@ return 0; // find if this has a ancestor that is a label - return Traversal<HTMLLabelElement>::firstAncestorOrSelf(*node()); + return Traversal<HTMLLabelElement>::firstAncestorOrSelf(*getNode()); } void AXNodeObject::setFocused(bool on) @@ -1994,11 +1994,11 @@ if (!canSetFocusAttribute()) return; - Document* document = this->document(); + Document* document = this->getDocument(); if (!on) { document->clearFocusedElement(); } else { - Node* node = this->node(); + Node* node = this->getNode(); if (node && node->isElementNode()) { // If this node is already the currently focused node, then calling focus() won't do anything. // That is a problem when focus is removed from the webpage to chrome, and then returns. @@ -2028,7 +2028,7 @@ void AXNodeObject::childrenChanged() { // This method is meant as a quick way of marking a portion of the accessibility tree dirty. - if (!node() && !layoutObject()) + if (!getNode() && !getLayoutObject()) return; // If this is not part of the accessibility tree because an ancestor @@ -2069,8 +2069,8 @@ // or the web area if the selection is just in the document somewhere. if (isFocused() || isWebArea()) { axObjectCache().postNotification(this, AXObjectCacheImpl::AXSelectedTextChanged); - if (document()) { - AXObject* documentObject = axObjectCache().getOrCreate(document()); + if (getDocument()) { + AXObject* documentObject = axObjectCache().getOrCreate(getDocument()); axObjectCache().postNotification(documentObject, AXObjectCacheImpl::AXDocumentSelectionChanged); } } else { @@ -2083,7 +2083,7 @@ // If this element supports ARIA live regions, or is part of a region with an ARIA editable role, // then notify the AT of changes. AXObjectCacheImpl& cache = axObjectCache(); - for (Node* parentNode = node(); parentNode; parentNode = parentNode->parentNode()) { + for (Node* parentNode = getNode(); parentNode; parentNode = parentNode->parentNode()) { AXObject* parent = cache.get(parentNode); if (!parent) continue; @@ -2122,7 +2122,7 @@ // Based on http://rawgit.com/w3c/aria/master/html-aam/html-aam.html#accessible-name-and-description-calculation String AXNodeObject::nativeTextAlternative(AXObjectSet& visited, AXNameFrom& nameFrom, AXRelatedObjectVector* relatedObjects, NameSources* nameSources, bool* foundTextAlternative) const { - if (!node()) + if (!getNode()) return String(); // If nameSources is non-null, relatedObjects is used in filling it in, so it must be non-null as well. @@ -2133,14 +2133,14 @@ AXRelatedObjectVector localRelatedObjects; const HTMLInputElement* inputElement = nullptr; - if (isHTMLInputElement(node())) - inputElement = toHTMLInputElement(node()); + if (isHTMLInputElement(getNode())) + inputElement = toHTMLInputElement(getNode()); // 5.1/5.5 Text inputs, Other labelable Elements // If you change this logic, update AXNodeObject::nameFromLabelElement, too. HTMLElement* htmlElement = nullptr; - if (node()->isHTMLElement()) - htmlElement = toHTMLElement(node()); + if (getNode()->isHTMLElement()) + htmlElement = toHTMLElement(getNode()); if (htmlElement && htmlElement->isLabelable()) { // label nameFrom = AXNameFromRelatedElement; @@ -2263,7 +2263,7 @@ NameSource& source = nameSources->last(); source.type = nameFrom; } - HTMLElement* element = toHTMLElement(node()); + HTMLElement* element = toHTMLElement(getNode()); const AtomicString& placeholder = element->fastGetAttribute(placeholderAttr); if (!placeholder.isEmpty()) { textAlternative = placeholder; @@ -2279,7 +2279,7 @@ } // 5.7 figure and figcaption Elements - if (node()->hasTagName(figureTag)) { + if (getNode()->hasTagName(figureTag)) { // figcaption nameFrom = AXNameFromRelatedElement; if (nameSources) { @@ -2288,7 +2288,7 @@ nameSources->last().nativeSource = AXTextFromNativeHTMLFigcaption; } Element* figcaption = nullptr; - for (Element& element : ElementTraversal::descendantsOf(*(node()))) { + for (Element& element : ElementTraversal::descendantsOf(*(getNode()))) { if (element.hasTagName(figcaptionTag)) { figcaption = &element; break; @@ -2319,7 +2319,7 @@ } // 5.8 img or area Element - if (isHTMLImageElement(node()) || isHTMLAreaElement(node()) || (layoutObject() && layoutObject()->isSVGImage())) { + if (isHTMLImageElement(getNode()) || isHTMLAreaElement(getNode()) || (getLayoutObject() && getLayoutObject()->isSVGImage())) { // alt nameFrom = AXNameFromAttribute; if (nameSources) { @@ -2342,8 +2342,8 @@ } // 5.9 table Element - if (isHTMLTableElement(node())) { - HTMLTableElement* tableElement = toHTMLTableElement(node()); + if (isHTMLTableElement(getNode())) { + HTMLTableElement* tableElement = toHTMLTableElement(getNode()); // caption nameFrom = AXNameFromCaption; @@ -2397,16 +2397,16 @@ } // Per SVG AAM 1.0's modifications to 2D of this algorithm. - if (node()->isSVGElement()) { + if (getNode()->isSVGElement()) { nameFrom = AXNameFromRelatedElement; if (nameSources) { nameSources->append(NameSource(*foundTextAlternative)); nameSources->last().type = nameFrom; nameSources->last().nativeSource = AXTextFromNativeHTMLTitleElement; } - ASSERT(node()->isContainerNode()); + ASSERT(getNode()->isContainerNode()); Element* title = ElementTraversal::firstChild( - toContainerNode(*(node())), + toContainerNode(*(getNode())), HasTagName(SVGNames::titleTag)); if (title) { @@ -2432,14 +2432,14 @@ } // Fieldset / legend. - if (isHTMLFieldSetElement(node())) { + if (isHTMLFieldSetElement(getNode())) { nameFrom = AXNameFromRelatedElement; if (nameSources) { nameSources->append(NameSource(*foundTextAlternative)); nameSources->last().type = nameFrom; nameSources->last().nativeSource = AXTextFromNativeHTMLLegend; } - HTMLElement* legend = toHTMLFieldSetElement(node())->legend(); + HTMLElement* legend = toHTMLFieldSetElement(getNode())->legend(); if (legend) { AXObject* legendAXObject = axObjectCache().getOrCreate(legend); // Avoid an infinite loop @@ -2466,7 +2466,7 @@ // Document. if (isWebArea()) { - Document* document = this->document(); + Document* document = this->getDocument(); if (document) { nameFrom = AXNameFromAttribute; if (nameSources) { @@ -2542,7 +2542,7 @@ if (descriptionSources) ASSERT(relatedObjects); - if (!node()) + if (!getNode()) return String(); String description; @@ -2578,8 +2578,8 @@ } HTMLElement* htmlElement = nullptr; - if (node()->isHTMLElement()) - htmlElement = toHTMLElement(node()); + if (getNode()->isHTMLElement()) + htmlElement = toHTMLElement(getNode()); // placeholder, 5.1.2 from: http://rawgit.com/w3c/aria/master/html-aam/html-aam.html if (nameFrom != AXNameFromPlaceholder && htmlElement && htmlElement->isTextFormControl()) { @@ -2589,7 +2589,7 @@ DescriptionSource& source = descriptionSources->last(); source.type = descriptionFrom; } - HTMLElement* element = toHTMLElement(node()); + HTMLElement* element = toHTMLElement(getNode()); const AtomicString& placeholder = element->fastGetAttribute(placeholderAttr); if (!placeholder.isEmpty()) { description = placeholder; @@ -2605,8 +2605,8 @@ } const HTMLInputElement* inputElement = nullptr; - if (isHTMLInputElement(node())) - inputElement = toHTMLInputElement(node()); + if (isHTMLInputElement(getNode())) + inputElement = toHTMLInputElement(getNode()); // value, 5.2.2 from: http://rawgit.com/w3c/aria/master/html-aam/html-aam.html if (nameFrom != AXNameFromValue && inputElement && inputElement->isTextButton()) { @@ -2629,8 +2629,8 @@ } // table caption, 5.9.2 from: http://rawgit.com/w3c/aria/master/html-aam/html-aam.html - if (nameFrom != AXNameFromCaption && isHTMLTableElement(node())) { - HTMLTableElement* tableElement = toHTMLTableElement(node()); + if (nameFrom != AXNameFromCaption && isHTMLTableElement(getNode())) { + HTMLTableElement* tableElement = toHTMLTableElement(getNode()); descriptionFrom = AXDescriptionFromRelatedElement; if (descriptionSources) { @@ -2660,7 +2660,7 @@ } // summary, 5.6.2 from: http://rawgit.com/w3c/aria/master/html-aam/html-aam.html - if (nameFrom != AXNameFromContents && isHTMLSummaryElement(node())) { + if (nameFrom != AXNameFromContents && isHTMLSummaryElement(getNode())) { descriptionFrom = AXDescriptionFromContents; if (descriptionSources) { descriptionSources->append(DescriptionSource(foundDescription)); @@ -2742,15 +2742,15 @@ if (descriptionFrom == AXDescriptionFromPlaceholder) return String(); - if (!node()) + if (!getNode()) return String(); String placeholder; - if (isHTMLInputElement(*node())) { - HTMLInputElement* inputElement = toHTMLInputElement(node()); + if (isHTMLInputElement(*getNode())) { + HTMLInputElement* inputElement = toHTMLInputElement(getNode()); placeholder = inputElement->strippedPlaceholder(); - } else if (isHTMLTextAreaElement(*node())) { - HTMLTextAreaElement* textAreaElement = toHTMLTextAreaElement(node()); + } else if (isHTMLTextAreaElement(*getNode())) { + HTMLTextAreaElement* textAreaElement = toHTMLTextAreaElement(getNode()); placeholder = textAreaElement->strippedPlaceholder(); } return placeholder;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h index f135a89..40a4d970 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h +++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.h
@@ -180,8 +180,8 @@ // DOM and Render tree access. Element* actionElement() const override; Element* anchorElement() const override; - Document* document() const override; - Node* node() const override { return m_node; } + Document* getDocument() const override; + Node* getNode() const override { return m_node; } // Modify or take an action on an object. void setFocused(bool) final;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXObject.cpp index 5a2abc3..38005770 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXObject.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
@@ -465,7 +465,7 @@ bool AXObject::isPasswordFieldAndShouldHideValue() const { - Settings* settings = document()->settings(); + Settings* settings = getDocument()->settings(); if (!settings || settings->accessibilityPasswordValuesEnabled()) return false; @@ -563,10 +563,10 @@ bool AXObject::computeIsInertOrAriaHidden(IgnoredReasons* ignoredReasons) const { - if (node()) { - if (node()->isInert()) { + if (getNode()) { + if (getNode()->isInert()) { if (ignoredReasons) { - HTMLDialogElement* dialog = getActiveDialogElement(node()); + HTMLDialogElement* dialog = getActiveDialogElement(getNode()); if (dialog) { AXObject* dialogObject = axObjectCache().getOrCreate(dialog); if (dialogObject) @@ -703,7 +703,7 @@ String text = textAlternative(false, false, visited, nameFrom, &relatedObjects, nullptr); AccessibilityRole role = roleValue(); - if (!node() || (!isHTMLBRElement(node()) && role != StaticTextRole && role != InlineTextBoxRole)) + if (!getNode() || (!isHTMLBRElement(getNode()) && role != StaticTextRole && role != InlineTextBoxRole)) text = collapseWhitespace(text); if (nameObjects) { @@ -736,17 +736,17 @@ if (equalIgnoringCase(getAttribute(aria_hiddenAttr), "false")) return false; - if (layoutObject()) - return layoutObject()->style()->visibility() != VISIBLE; + if (getLayoutObject()) + return getLayoutObject()->style()->visibility() != VISIBLE; // This is an obscure corner case: if a node has no LayoutObject, that means it's not rendered, // but we still may be exploring it as part of a text alternative calculation, for example if it // was explicitly referenced by aria-labelledby. So we need to explicitly call the style resolver // to check whether it's invisible or display:none, rather than relying on the style cached in the // LayoutObject. - Document* doc = document(); - if (doc && doc->frame() && node() && node()->isElementNode()) { - RefPtr<ComputedStyle> style = doc->ensureStyleResolver().styleForElement(toElement(node())); + Document* doc = getDocument(); + if (doc && doc->frame() && getNode() && getNode()->isElementNode()) { + RefPtr<ComputedStyle> style = doc->ensureStyleResolver().styleForElement(toElement(getNode())); return style->display() == NONE || style->visibility() != VISIBLE; } @@ -854,7 +854,7 @@ void AXObject::tokenVectorFromAttribute(Vector<String>& tokens, const QualifiedName& attribute) const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node || !node->isElementNode()) return; @@ -873,7 +873,7 @@ if (ids.isEmpty()) return; - TreeScope& scope = node()->treeScope(); + TreeScope& scope = getNode()->treeScope(); for (const auto& id : ids) { if (Element* idElement = scope.getElementById(AtomicString(id))) elements.append(idElement); @@ -961,7 +961,7 @@ bool AXObject::isMultiline() const { - Node* node = this->node(); + Node* node = this->getNode(); if (!node) return false; @@ -1182,7 +1182,7 @@ m_haveChildren = false; } -Document* AXObject::document() const +Document* AXObject::getDocument() const { FrameView* frameView = documentFrameView(); if (!frameView) @@ -1213,7 +1213,7 @@ // as a last resort, fall back to the content language specified in the meta tag if (!parent) { - Document* doc = document(); + Document* doc = getDocument(); if (doc) return doc->contentLanguage(); return nullAtom; @@ -1224,7 +1224,7 @@ bool AXObject::hasAttribute(const QualifiedName& attribute) const { - Node* elementNode = node(); + Node* elementNode = getNode(); if (!elementNode) return false; @@ -1237,7 +1237,7 @@ const AtomicString& AXObject::getAttribute(const QualifiedName& attribute) const { - Node* elementNode = node(); + Node* elementNode = getNode(); if (!elementNode) return nullAtom; @@ -1531,12 +1531,12 @@ int AXObject::lineForPosition(const VisiblePosition& position) const { - if (position.isNull() || !node()) + if (position.isNull() || !getNode()) return -1; // If the position is not in the same editable region as this AX object, return -1. Node* containerNode = position.deepEquivalent().computeContainerNode(); - if (!containerNode->containsIncludingShadowDOM(node()) && !node()->containsIncludingShadowDOM(containerNode)) + if (!containerNode->containsIncludingShadowDOM(getNode()) && !getNode()->containsIncludingShadowDOM(containerNode)) return -1; int lineCount = -1;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.h b/third_party/WebKit/Source/modules/accessibility/AXObject.h index 243fa2f..049580036f 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXObject.h +++ b/third_party/WebKit/Source/modules/accessibility/AXObject.h
@@ -824,9 +824,9 @@ virtual double estimatedLoadingProgress() const { return 0; } // DOM and layout tree access. - virtual Node* node() const { return 0; } - virtual LayoutObject* layoutObject() const { return 0; } - virtual Document* document() const; + virtual Node* getNode() const { return 0; } + virtual LayoutObject* getLayoutObject() const { return 0; } + virtual Document* getDocument() const; virtual FrameView* documentFrameView() const; virtual Element* anchorElement() const { return 0; } virtual Element* actionElement() const { return 0; }
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp index 17a69f0..0a764099 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
@@ -178,7 +178,7 @@ Element* adjustedFocusedElement = focusedDocument->adjustedFocusedElement(); if (isHTMLInputElement(adjustedFocusedElement)) { if (AXObject* axPopup = toHTMLInputElement(adjustedFocusedElement)->popupRootAXObject()) { - if (Element* focusedElementInPopup = axPopup->document()->focusedElement()) + if (Element* focusedElementInPopup = axPopup->getDocument()->focusedElement()) focusedNode = focusedElementInPopup; } @@ -681,7 +681,7 @@ // Notifications should only be sent after the layoutObject has finished if (obj->isAXLayoutObject()) { AXLayoutObject* layoutObj = toAXLayoutObject(obj); - LayoutObject* layoutObject = layoutObj->layoutObject(); + LayoutObject* layoutObject = layoutObj->getLayoutObject(); if (layoutObject && layoutObject->view()) ASSERT(!layoutObject->view()->layoutState()); } @@ -779,7 +779,7 @@ // // Figure out the children that are owned by this object and are in the tree. - TreeScope& scope = owner->node()->treeScope(); + TreeScope& scope = owner->getNode()->treeScope(); Vector<AXID> newChildAXIDs; for (const String& idName : idVector) { Element* element = scope.getElementById(AtomicString(idName)); @@ -1145,17 +1145,17 @@ void AXObjectCacheImpl::postPlatformNotification(AXObject* obj, AXNotification notification) { - if (!obj || !obj->document() || !obj->documentFrameView() || !obj->documentFrameView()->frame().page()) + if (!obj || !obj->getDocument() || !obj->documentFrameView() || !obj->documentFrameView()->frame().page()) return; - ChromeClient& client = obj->document()->axObjectCacheOwner().page()->chromeClient(); + ChromeClient& client = obj->getDocument()->axObjectCacheOwner().page()->chromeClient(); if (notification == AXActiveDescendantChanged - && obj->document()->focusedElement() - && obj->node() == obj->document()->focusedElement()) { + && obj->getDocument()->focusedElement() + && obj->getNode() == obj->getDocument()->focusedElement()) { // Calling handleFocusedUIElementChanged will focus the new active // descendant and send the AXFocusedUIElementChanged notification. - handleFocusedUIElementChanged(0, obj->document()->focusedElement()); + handleFocusedUIElementChanged(0, obj->getDocument()->focusedElement()); } client.postAccessibilityNotification(obj, notification);
diff --git a/third_party/WebKit/Source/modules/accessibility/AXSlider.cpp b/third_party/WebKit/Source/modules/accessibility/AXSlider.cpp index fab9cdb1..dbe20eb 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXSlider.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXSlider.cpp
@@ -148,7 +148,7 @@ if (!m_parent) return LayoutRect(); - LayoutObject* sliderLayoutObject = m_parent->layoutObject(); + LayoutObject* sliderLayoutObject = m_parent->getLayoutObject(); if (!sliderLayoutObject || !sliderLayoutObject->isSlider()) return LayoutRect(); return toElement(sliderLayoutObject->node())->userAgentShadowRoot()->getElementById(ShadowElementNames::sliderThumb())->boundingBox();
diff --git a/third_party/WebKit/Source/modules/accessibility/AXTable.cpp b/third_party/WebKit/Source/modules/accessibility/AXTable.cpp index ce598f4..79b6ea7a3 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXTable.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXTable.cpp
@@ -100,7 +100,7 @@ bool AXTable::isDataTable() const { - if (!m_layoutObject || !node()) + if (!m_layoutObject || !getNode()) return false; // Do not consider it a data table if it has an ARIA role. @@ -110,7 +110,7 @@ // When a section of the document is contentEditable, all tables should be // treated as data tables, otherwise users may not be able to work with rich // text editors that allow creating and editing tables. - if (node() && node()->hasEditableStyle()) + if (getNode() && getNode()->hasEditableStyle()) return true; // This employs a heuristic to determine if this table should appear.
diff --git a/third_party/WebKit/Source/modules/accessibility/AXTableCell.cpp b/third_party/WebKit/Source/modules/accessibility/AXTableCell.cpp index 7835080..ee2d673 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXTableCell.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXTableCell.cpp
@@ -52,7 +52,7 @@ bool AXTableCell::isTableHeaderCell() const { - return node() && node()->hasTagName(thTag); + return getNode() && getNode()->hasTagName(thTag); } bool AXTableCell::isRowHeaderCell() const
diff --git a/third_party/WebKit/Source/modules/accessibility/AXTableColumn.cpp b/third_party/WebKit/Source/modules/accessibility/AXTableColumn.cpp index e7a6c3cd..15d4bb1 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXTableColumn.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXTableColumn.cpp
@@ -70,7 +70,7 @@ if (!m_parent) return; - LayoutObject* layoutObject = m_parent->layoutObject(); + LayoutObject* layoutObject = m_parent->getLayoutObject(); if (!layoutObject) return;
diff --git a/third_party/WebKit/Source/modules/accessibility/InspectorTypeBuilderHelper.cpp b/third_party/WebKit/Source/modules/accessibility/InspectorTypeBuilderHelper.cpp index 11fbef54..b0886b77 100644 --- a/third_party/WebKit/Source/modules/accessibility/InspectorTypeBuilderHelper.cpp +++ b/third_party/WebKit/Source/modules/accessibility/InspectorTypeBuilderHelper.cpp
@@ -90,7 +90,7 @@ PassOwnPtr<AXRelatedNode> relatedNodeForAXObject(const AXObject* axObject, String* name = nullptr) { - Node* node = axObject->node(); + Node* node = axObject->getNode(); if (!node) return PassOwnPtr<AXRelatedNode>(); int backendNodeId = DOMNodeIds::idForNode(node);
diff --git a/third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp b/third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp index f0554b4..d09afbb 100644 --- a/third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp +++ b/third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp
@@ -56,13 +56,13 @@ void SetSinkIdResolver::timerFired(Timer<SetSinkIdResolver>* timer) { - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); ASSERT(context && context->isDocument()); OwnPtr<SetSinkIdCallbacks> callbacks = adoptPtr(new SetSinkIdCallbacks(this, *m_element, m_sinkId)); WebMediaPlayer* webMediaPlayer = m_element->webMediaPlayer(); if (webMediaPlayer) { // Using leakPtr() to transfer ownership because |webMediaPlayer| is a platform object that takes raw pointers - webMediaPlayer->setSinkId(m_sinkId, WebSecurityOrigin(context->securityOrigin()), callbacks.leakPtr()); + webMediaPlayer->setSinkId(m_sinkId, WebSecurityOrigin(context->getSecurityOrigin()), callbacks.leakPtr()); } else { if (AudioOutputDeviceClient* client = AudioOutputDeviceClient::from(context)) { client->checkIfAudioSinkExistsAndIsAuthorized(context, m_sinkId, callbacks.release());
diff --git a/third_party/WebKit/Source/modules/audio_output_devices/SetSinkIdCallbacks.cpp b/third_party/WebKit/Source/modules/audio_output_devices/SetSinkIdCallbacks.cpp index 1c24924..07b3a8ed 100644 --- a/third_party/WebKit/Source/modules/audio_output_devices/SetSinkIdCallbacks.cpp +++ b/third_party/WebKit/Source/modules/audio_output_devices/SetSinkIdCallbacks.cpp
@@ -44,7 +44,7 @@ void SetSinkIdCallbacks::onSuccess() { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; HTMLMediaElementAudioOutputDevice& aodElement = HTMLMediaElementAudioOutputDevice::from(*m_element); @@ -54,7 +54,7 @@ void SetSinkIdCallbacks::onError(WebSetSinkIdError error) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(ToException(error));
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp index a8b1fac..9e2af89 100644 --- a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp +++ b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp
@@ -26,13 +26,13 @@ void SyncRegistrationCallbacks::onSuccess(WebPassOwnPtr<WebSyncRegistration> webSyncRegistration) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) { return; } OwnPtr<WebSyncRegistration> registration = webSyncRegistration.release(); if (!registration) { - m_resolver->resolve(v8::Null(m_resolver->scriptState()->isolate())); + m_resolver->resolve(v8::Null(m_resolver->getScriptState()->isolate())); return; } m_resolver->resolve(); @@ -40,7 +40,7 @@ void SyncRegistrationCallbacks::onError(const WebSyncError& error) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) { return; } m_resolver->reject(SyncError::take(m_resolver.get(), error)); @@ -60,7 +60,7 @@ void SyncGetRegistrationsCallbacks::onSuccess(const WebVector<WebSyncRegistration*>& webSyncRegistrations) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) { return; } Vector<String> tags; @@ -72,7 +72,7 @@ void SyncGetRegistrationsCallbacks::onError(const WebSyncError& error) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) { return; } m_resolver->reject(SyncError::take(m_resolver.get(), error));
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncManager.cpp b/third_party/WebKit/Source/modules/background_sync/SyncManager.cpp index f58803e..a70b1be 100644 --- a/third_party/WebKit/Source/modules/background_sync/SyncManager.cpp +++ b/third_party/WebKit/Source/modules/background_sync/SyncManager.cpp
@@ -44,8 +44,8 @@ if (!m_registration->active()) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Registration failed - no active Service Worker")); - if (scriptState->executionContext()->isDocument()) { - Document* document = toDocument(scriptState->executionContext()); + if (scriptState->getExecutionContext()->isDocument()) { + Document* document = toDocument(scriptState->getExecutionContext()); if (!document->domWindow() || !document->frame()) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "Document is detached from window.")); if (!document->frame()->isMainFrame())
diff --git a/third_party/WebKit/Source/modules/battery/BatteryManager.cpp b/third_party/WebKit/Source/modules/battery/BatteryManager.cpp index e2a281ff..5304ce5 100644 --- a/third_party/WebKit/Source/modules/battery/BatteryManager.cpp +++ b/third_party/WebKit/Source/modules/battery/BatteryManager.cpp
@@ -33,10 +33,10 @@ ScriptPromise BatteryManager::startRequest(ScriptState* scriptState) { if (!m_batteryProperty) { - m_batteryProperty = new BatteryProperty(scriptState->executionContext(), this, BatteryProperty::Ready); + m_batteryProperty = new BatteryProperty(scriptState->getExecutionContext(), this, BatteryProperty::Ready); // If the context is in a stopped state already, do not start updating. - if (!executionContext() || executionContext()->activeDOMObjectsAreStopped()) { + if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) { m_batteryProperty->resolve(this); } else { m_hasEventListener = true; @@ -79,7 +79,7 @@ return; } - Document* document = toDocument(executionContext()); + Document* document = toDocument(getExecutionContext()); ASSERT(document); if (document->activeDOMObjectsAreSuspended() || document->activeDOMObjectsAreStopped()) return;
diff --git a/third_party/WebKit/Source/modules/battery/BatteryManager.h b/third_party/WebKit/Source/modules/battery/BatteryManager.h index 114273c7..52f2657 100644 --- a/third_party/WebKit/Source/modules/battery/BatteryManager.h +++ b/third_party/WebKit/Source/modules/battery/BatteryManager.h
@@ -29,7 +29,7 @@ // EventTarget implementation. const WTF::AtomicString& interfaceName() const override { return EventTargetNames::BatteryManager; } - ExecutionContext* executionContext() const override { return ContextLifecycleObserver::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ContextLifecycleObserver::getExecutionContext(); } bool charging(); double chargingTime();
diff --git a/third_party/WebKit/Source/modules/battery/NavigatorBattery.cpp b/third_party/WebKit/Source/modules/battery/NavigatorBattery.cpp index 38816d7..d38a7adf 100644 --- a/third_party/WebKit/Source/modules/battery/NavigatorBattery.cpp +++ b/third_party/WebKit/Source/modules/battery/NavigatorBattery.cpp
@@ -21,7 +21,7 @@ ScriptPromise NavigatorBattery::getBattery(ScriptState* scriptState) { if (!m_batteryManager) - m_batteryManager = BatteryManager::create(scriptState->executionContext()); + m_batteryManager = BatteryManager::create(scriptState->getExecutionContext()); return m_batteryManager->startRequest(scriptState); }
diff --git a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp index c881c4d9..c2b6821 100644 --- a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp
@@ -145,7 +145,7 @@ // 1. If the incumbent settings object is not a secure context, reject promise with a SecurityError and abort these steps. String errorMessage; - if (!scriptState->executionContext()->isSecureContext(errorMessage)) { + if (!scriptState->getExecutionContext()->isSecureContext(errorMessage)) { return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, errorMessage)); }
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp index b763a3b6..57585d5 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp
@@ -34,7 +34,7 @@ BluetoothDevice* BluetoothDevice::take(ScriptPromiseResolver* resolver, PassOwnPtr<WebBluetoothDevice> webDevice) { ASSERT(webDevice); - BluetoothDevice* device = new BluetoothDevice(resolver->executionContext(), webDevice); + BluetoothDevice* device = new BluetoothDevice(resolver->getExecutionContext(), webDevice); device->suspendIfNeeded(); return device; } @@ -60,7 +60,7 @@ { if (m_gatt->connected()) { m_gatt->setConnected(false); - BluetoothSupplement::fromExecutionContext(executionContext())->disconnect(id()); + BluetoothSupplement::fromExecutionContext(getExecutionContext())->disconnect(id()); return true; } return false; @@ -71,9 +71,9 @@ return EventTargetNames::BluetoothDevice; } -ExecutionContext* BluetoothDevice::executionContext() const +ExecutionContext* BluetoothDevice::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } DEFINE_TRACE(BluetoothDevice)
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h index bd38f71..f4a8072b 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h
@@ -76,7 +76,7 @@ // EventTarget methods: const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // Interface required by Garbage Collection: DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp index d4577022..0214f948 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
@@ -46,7 +46,7 @@ if (!webCharacteristic) { return nullptr; } - BluetoothRemoteGATTCharacteristic* characteristic = new BluetoothRemoteGATTCharacteristic(resolver->executionContext(), webCharacteristic); + BluetoothRemoteGATTCharacteristic* characteristic = new BluetoothRemoteGATTCharacteristic(resolver->getExecutionContext(), webCharacteristic); // See note in ActiveDOMObject about suspendIfNeeded. characteristic->suspendIfNeeded(); return characteristic; @@ -80,7 +80,7 @@ { if (!m_stopped) { m_stopped = true; - WebBluetooth* webbluetooth = BluetoothSupplement::fromExecutionContext(ActiveDOMObject::executionContext()); + WebBluetooth* webbluetooth = BluetoothSupplement::fromExecutionContext(ActiveDOMObject::getExecutionContext()); webbluetooth->characteristicObjectRemoved(m_webCharacteristic->characteristicInstanceID, this); } } @@ -90,9 +90,9 @@ return EventTargetNames::BluetoothRemoteGATTCharacteristic; } -ExecutionContext* BluetoothRemoteGATTCharacteristic::executionContext() const +ExecutionContext* BluetoothRemoteGATTCharacteristic::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } bool BluetoothRemoteGATTCharacteristic::addEventListenerInternal(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, const EventListenerOptions& options) @@ -100,7 +100,7 @@ // We will also need to unregister a characteristic once all the event // listeners have been removed. See http://crbug.com/541390 if (eventType == EventTypeNames::characteristicvaluechanged) { - WebBluetooth* webbluetooth = BluetoothSupplement::fromExecutionContext(executionContext()); + WebBluetooth* webbluetooth = BluetoothSupplement::fromExecutionContext(getExecutionContext()); webbluetooth->registerCharacteristicObject(m_webCharacteristic->characteristicInstanceID, this); } return EventTarget::addEventListenerInternal(eventType, listener, options); @@ -112,7 +112,7 @@ void onSuccess(const WebVector<uint8_t>& value) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; RefPtr<DOMDataView> domDataView = ConvertWebVectorToDataView(value); @@ -124,7 +124,7 @@ void onError(const WebBluetoothError& e) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(BluetoothError::take(m_resolver, e)); } @@ -151,7 +151,7 @@ void onSuccess(const WebVector<uint8_t>& value) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (m_webCharacteristic) { @@ -162,7 +162,7 @@ void onError(const WebBluetoothError& e) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(BluetoothError::take(m_resolver, e)); }
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h index 3d7d20b..b48d85f45 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h
@@ -67,7 +67,7 @@ // EventTarget methods: const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const; + ExecutionContext* getExecutionContext() const; // Interface required by garbage collection. DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp index 9ca7aad1..cb2509f5d 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp
@@ -49,7 +49,7 @@ void onSuccess() override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_device->gatt()->setConnected(true); if (!m_device->page()->isPageVisible()) { @@ -66,7 +66,7 @@ void onError(const WebBluetoothError& e) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(BluetoothError::take(m_resolver, e)); } @@ -81,7 +81,7 @@ // This is a short term solution instead of implementing a tab indicator // for bluetooth connections. // https://crbug.com/579746 - if (!toDocument(scriptState->executionContext())->page()->isPageVisible()) { + if (!toDocument(scriptState->getExecutionContext())->page()->isPageVisible()) { return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, kPageHiddenError)); }
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothSupplement.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothSupplement.cpp index e77a7ed2..14169ac79 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothSupplement.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothSupplement.cpp
@@ -36,7 +36,7 @@ WebBluetooth* BluetoothSupplement::fromScriptState(ScriptState* scriptState) { - return fromExecutionContext(scriptState->executionContext()); + return fromExecutionContext(scriptState->getExecutionContext()); } WebBluetooth* BluetoothSupplement::fromExecutionContext(ExecutionContext* executionContext)
diff --git a/third_party/WebKit/Source/modules/cachestorage/Cache.cpp b/third_party/WebKit/Source/modules/cachestorage/Cache.cpp index 01ec160..e6962b1 100644 --- a/third_party/WebKit/Source/modules/cachestorage/Cache.cpp +++ b/third_party/WebKit/Source/modules/cachestorage/Cache.cpp
@@ -49,15 +49,15 @@ void onSuccess(const WebServiceWorkerResponse& webResponse) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; - m_resolver->resolve(Response::create(m_resolver->scriptState()->executionContext(), webResponse)); + m_resolver->resolve(Response::create(m_resolver->getScriptState()->getExecutionContext(), webResponse)); m_resolver.clear(); } void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (reason == WebServiceWorkerCacheErrorNotFound) m_resolver->resolve(); @@ -79,18 +79,18 @@ void onSuccess(const WebVector<WebServiceWorkerResponse>& webResponses) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; HeapVector<Member<Response>> responses; for (size_t i = 0; i < webResponses.size(); ++i) - responses.append(Response::create(m_resolver->scriptState()->executionContext(), webResponses[i])); + responses.append(Response::create(m_resolver->getScriptState()->getExecutionContext(), webResponses[i])); m_resolver->resolve(responses); m_resolver.clear(); } void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(CacheStorageError::createException(reason)); m_resolver.clear(); @@ -109,7 +109,7 @@ void onSuccess() override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(true); m_resolver.clear(); @@ -117,7 +117,7 @@ void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (reason == WebServiceWorkerCacheErrorNotFound) m_resolver->resolve(false); @@ -139,18 +139,18 @@ void onSuccess(const WebVector<WebServiceWorkerRequest>& webRequests) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; HeapVector<Member<Request>> requests; for (size_t i = 0; i < webRequests.size(); ++i) - requests.append(Request::create(m_resolver->scriptState()->executionContext(), webRequests[i])); + requests.append(Request::create(m_resolver->getScriptState()->getExecutionContext(), webRequests[i])); m_resolver->resolve(requests); m_resolver.clear(); } void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(CacheStorageError::createException(reason)); m_resolver.clear(); @@ -230,24 +230,24 @@ ScriptValue call(ScriptValue value) override { NonThrowableExceptionState exceptionState; - HeapVector<Member<Response>> responses = toMemberNativeArray<Response, V8Response>(value.v8Value(), m_requests.size(), scriptState()->isolate(), exceptionState); + HeapVector<Member<Response>> responses = toMemberNativeArray<Response, V8Response>(value.v8Value(), m_requests.size(), getScriptState()->isolate(), exceptionState); for (const auto& response : responses) { if (!response->ok()) { - ScriptPromise rejection = ScriptPromise::reject(scriptState(), V8ThrowException::createTypeError(scriptState()->isolate(), "Request failed")); - return ScriptValue(scriptState(), rejection.v8Value()); + ScriptPromise rejection = ScriptPromise::reject(getScriptState(), V8ThrowException::createTypeError(getScriptState()->isolate(), "Request failed")); + return ScriptValue(getScriptState(), rejection.v8Value()); } if (varyHeaderContainsAsterisk(response)) { - ScriptPromise rejection = ScriptPromise::reject(scriptState(), V8ThrowException::createTypeError(scriptState()->isolate(), "Vary header contains *")); - return ScriptValue(scriptState(), rejection.v8Value()); + ScriptPromise rejection = ScriptPromise::reject(getScriptState(), V8ThrowException::createTypeError(getScriptState()->isolate(), "Vary header contains *")); + return ScriptValue(getScriptState(), rejection.v8Value()); } } for (const auto& response : responses) RecordResponseTypeForAdd(response); - ScriptPromise putPromise = m_cache->putImpl(scriptState(), m_requests, responses); - return ScriptValue(scriptState(), putPromise.v8Value()); + ScriptPromise putPromise = m_cache->putImpl(getScriptState(), m_requests, responses); + return ScriptValue(getScriptState(), putPromise.v8Value()); } DEFINE_INLINE_VIRTUAL_TRACE() @@ -285,7 +285,7 @@ ASSERT(index < m_batchOperations.size()); if (m_completed) return; - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_batchOperations[index] = batchOperation; if (--m_numberOfRemainingOperations != 0) @@ -298,9 +298,9 @@ if (m_completed) return; m_completed = true; - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; - ScriptState* state = m_resolver->scriptState(); + ScriptState* state = m_resolver->getScriptState(); ScriptState::Scope scope(state); m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), errorMessage)); } @@ -487,7 +487,7 @@ { WebServiceWorkerRequest webRequest; request->populateWebServiceWorkerRequest(webRequest); - checkCacheQueryOptions(options, scriptState->executionContext()); + checkCacheQueryOptions(options, scriptState->getExecutionContext()); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); const ScriptPromise promise = resolver->promise(); @@ -507,7 +507,7 @@ { WebServiceWorkerRequest webRequest; request->populateWebServiceWorkerRequest(webRequest); - checkCacheQueryOptions(options, scriptState->executionContext()); + checkCacheQueryOptions(options, scriptState->getExecutionContext()); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); const ScriptPromise promise = resolver->promise(); @@ -542,7 +542,7 @@ WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeDelete; request->populateWebServiceWorkerRequest(batchOperations[0].request); - checkCacheQueryOptions(options, scriptState->executionContext()); + checkCacheQueryOptions(options, scriptState->getExecutionContext()); batchOperations[0].matchParams = toWebQueryParams(options); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); @@ -584,7 +584,7 @@ // If the response has body, read the all data and create // the blob handle and dispatch the put batch asynchronously. FetchDataLoader* loader = FetchDataLoader::createLoaderAsBlobHandle(responses[i]->internalMIMEType()); - buffer->startLoading(scriptState->executionContext(), loader, new BlobHandleCallbackForPut(i, barrierCallback, requests[i], responses[i])); + buffer->startLoading(scriptState->getExecutionContext(), loader, new BlobHandleCallbackForPut(i, barrierCallback, requests[i], responses[i])); continue; } @@ -610,7 +610,7 @@ { WebServiceWorkerRequest webRequest; request->populateWebServiceWorkerRequest(webRequest); - checkCacheQueryOptions(options, scriptState->executionContext()); + checkCacheQueryOptions(options, scriptState->getExecutionContext()); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); const ScriptPromise promise = resolver->promise();
diff --git a/third_party/WebKit/Source/modules/cachestorage/CacheStorage.cpp b/third_party/WebKit/Source/modules/cachestorage/CacheStorage.cpp index dadae07..c339ad16e 100644 --- a/third_party/WebKit/Source/modules/cachestorage/CacheStorage.cpp +++ b/third_party/WebKit/Source/modules/cachestorage/CacheStorage.cpp
@@ -27,7 +27,7 @@ bool commonChecks(ScriptState* scriptState, ExceptionState& exceptionState) { - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); // FIXME: May be null due to worker termination: http://crbug.com/413518. if (!executionContext) return false; @@ -62,7 +62,7 @@ void onSuccess() override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(true); m_resolver.clear(); @@ -70,7 +70,7 @@ void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (reason == WebServiceWorkerCacheErrorNotFound) m_resolver->resolve(false); @@ -93,7 +93,7 @@ void onSuccess(WebPassOwnPtr<WebServiceWorkerCache> webCache) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; Cache* cache = Cache::create(m_cacheStorage->m_scopedFetcher, webCache.release()); m_cacheStorage->m_nameToCacheMap.set(m_cacheName, cache); @@ -103,7 +103,7 @@ void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (reason == WebServiceWorkerCacheErrorNotFound) m_resolver->resolve(); @@ -127,15 +127,15 @@ void onSuccess(const WebServiceWorkerResponse& webResponse) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; - m_resolver->resolve(Response::create(m_resolver->scriptState()->executionContext(), webResponse)); + m_resolver->resolve(Response::create(m_resolver->getScriptState()->getExecutionContext(), webResponse)); m_resolver.clear(); } void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (reason == WebServiceWorkerCacheErrorNotFound) m_resolver->resolve(); @@ -160,7 +160,7 @@ void onSuccess() override { m_cacheStorage->m_nameToCacheMap.remove(m_cacheName); - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(true); m_resolver.clear(); @@ -168,7 +168,7 @@ void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (reason == WebServiceWorkerCacheErrorNotFound) m_resolver->resolve(false); @@ -193,7 +193,7 @@ void onSuccess(const WebVector<WebString>& keys) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; Vector<String> wtfKeys; for (size_t i = 0; i < keys.size(); ++i) @@ -204,7 +204,7 @@ void onError(WebServiceWorkerCacheError reason) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(CacheStorageError::createException(reason)); m_resolver.clear(); @@ -312,7 +312,7 @@ { WebServiceWorkerRequest webRequest; request->populateWebServiceWorkerRequest(webRequest); - checkCacheQueryOptions(options, scriptState->executionContext()); + checkCacheQueryOptions(options, scriptState->getExecutionContext()); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); const ScriptPromise promise = resolver->promise();
diff --git a/third_party/WebKit/Source/modules/cachestorage/CacheTest.cpp b/third_party/WebKit/Source/modules/cachestorage/CacheTest.cpp index 1c4030cb..fcd57501 100644 --- a/third_party/WebKit/Source/modules/cachestorage/CacheTest.cpp +++ b/third_party/WebKit/Source/modules/cachestorage/CacheTest.cpp
@@ -231,15 +231,15 @@ return Cache::create(fetcher->weakPtr(), adoptPtr(webCache)); } - ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } - ExecutionContext* executionContext() { return scriptState()->executionContext(); } - v8::Isolate* isolate() { return scriptState()->isolate(); } - v8::Local<v8::Context> context() { return scriptState()->context(); } + ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } + ExecutionContext* getExecutionContext() { return getScriptState()->getExecutionContext(); } + v8::Isolate* isolate() { return getScriptState()->isolate(); } + v8::Local<v8::Context> context() { return getScriptState()->context(); } Request* newRequestFromUrl(const String& url) { TrackExceptionState exceptionState; - Request* request = Request::create(scriptState(), url, exceptionState); + Request* request = Request::create(getScriptState(), url, exceptionState); EXPECT_FALSE(exceptionState.hadException()); return exceptionState.hadException() ? 0 : request; } @@ -248,7 +248,7 @@ ScriptValue getRejectValue(ScriptPromise& promise) { ScriptValue onReject; - promise.then(UnreachableFunction::create(scriptState()), TestFunction::create(scriptState(), &onReject)); + promise.then(UnreachableFunction::create(getScriptState()), TestFunction::create(getScriptState(), &onReject)); v8::MicrotasksScope::PerformCheckpoint(isolate()); return onReject; } @@ -262,7 +262,7 @@ ScriptValue getResolveValue(ScriptPromise& promise) { ScriptValue onResolve; - promise.then(TestFunction::create(scriptState(), &onResolve), UnreachableFunction::create(scriptState())); + promise.then(TestFunction::create(getScriptState(), &onResolve), UnreachableFunction::create(getScriptState())); v8::MicrotasksScope::PerformCheckpoint(isolate()); return onResolve; } @@ -342,7 +342,7 @@ TEST_F(CacheStorageTest, Basics) { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); OwnPtrWillBeRawPtr<ScopedFetcherForTests> fetcher = ScopedFetcherForTests::create(); ErrorWebCacheForTests* testCache; Cache* cache = createCache(fetcher.get(), testCache = new NotImplementedErrorCache()); @@ -351,16 +351,16 @@ const String url = "http://www.cachetest.org/"; CacheQueryOptions options; - ScriptPromise matchPromise = cache->match(scriptState(), stringToRequestInfo(url), options, exceptionState()); + ScriptPromise matchPromise = cache->match(getScriptState(), stringToRequestInfo(url), options, exceptionState()); EXPECT_EQ(kNotImplementedString, getRejectString(matchPromise)); cache = createCache(fetcher.get(), testCache = new ErrorWebCacheForTests(WebServiceWorkerCacheErrorNotFound)); - matchPromise = cache->match(scriptState(), stringToRequestInfo(url), options, exceptionState()); + matchPromise = cache->match(getScriptState(), stringToRequestInfo(url), options, exceptionState()); ScriptValue scriptValue = getResolveValue(matchPromise); EXPECT_TRUE(scriptValue.isUndefined()); cache = createCache(fetcher.get(), testCache = new ErrorWebCacheForTests(WebServiceWorkerCacheErrorExists)); - matchPromise = cache->match(scriptState(), stringToRequestInfo(url), options, exceptionState()); + matchPromise = cache->match(getScriptState(), stringToRequestInfo(url), options, exceptionState()); EXPECT_EQ("InvalidAccessError: Entry already exists.", getRejectString(matchPromise)); } @@ -368,7 +368,7 @@ // which are tested later. TEST_F(CacheStorageTest, BasicArguments) { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); OwnPtrWillBeRawPtr<ScopedFetcherForTests> fetcher = ScopedFetcherForTests::create(); ErrorWebCacheForTests* testCache; Cache* cache = createCache(fetcher.get(), testCache = new NotImplementedErrorCache()); @@ -388,35 +388,35 @@ Request* request = newRequestFromUrl(url); ASSERT(request); - ScriptPromise matchResult = cache->match(scriptState(), requestToRequestInfo(request), options, exceptionState()); + ScriptPromise matchResult = cache->match(getScriptState(), requestToRequestInfo(request), options, exceptionState()); EXPECT_EQ("dispatchMatch", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(matchResult)); - ScriptPromise stringMatchResult = cache->match(scriptState(), stringToRequestInfo(url), options, exceptionState()); + ScriptPromise stringMatchResult = cache->match(getScriptState(), stringToRequestInfo(url), options, exceptionState()); EXPECT_EQ("dispatchMatch", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(stringMatchResult)); request = newRequestFromUrl(url); ASSERT(request); - ScriptPromise matchAllResult = cache->matchAll(scriptState(), requestToRequestInfo(request), options, exceptionState()); + ScriptPromise matchAllResult = cache->matchAll(getScriptState(), requestToRequestInfo(request), options, exceptionState()); EXPECT_EQ("dispatchMatchAll", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(matchAllResult)); - ScriptPromise stringMatchAllResult = cache->matchAll(scriptState(), stringToRequestInfo(url), options, exceptionState()); + ScriptPromise stringMatchAllResult = cache->matchAll(getScriptState(), stringToRequestInfo(url), options, exceptionState()); EXPECT_EQ("dispatchMatchAll", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(stringMatchAllResult)); - ScriptPromise keysResult1 = cache->keys(scriptState(), exceptionState()); + ScriptPromise keysResult1 = cache->keys(getScriptState(), exceptionState()); EXPECT_EQ("dispatchKeys", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(keysResult1)); request = newRequestFromUrl(url); ASSERT(request); - ScriptPromise keysResult2 = cache->keys(scriptState(), requestToRequestInfo(request), options, exceptionState()); + ScriptPromise keysResult2 = cache->keys(getScriptState(), requestToRequestInfo(request), options, exceptionState()); EXPECT_EQ("dispatchKeys", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(keysResult2)); - ScriptPromise stringKeysResult2 = cache->keys(scriptState(), stringToRequestInfo(url), options, exceptionState()); + ScriptPromise stringKeysResult2 = cache->keys(getScriptState(), stringToRequestInfo(url), options, exceptionState()); EXPECT_EQ("dispatchKeys", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(stringKeysResult2)); } @@ -424,7 +424,7 @@ // Tests that arguments are faithfully passed to API calls that degrade to batch operations. TEST_F(CacheStorageTest, BatchOperationArguments) { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); OwnPtrWillBeRawPtr<ScopedFetcherForTests> fetcher = ScopedFetcherForTests::create(); ErrorWebCacheForTests* testCache; Cache* cache = createCache(fetcher.get(), testCache = new NotImplementedErrorCache()); @@ -443,7 +443,7 @@ WebServiceWorkerResponse webResponse; webResponse.setURL(KURL(ParsedURLString, url)); - Response* response = Response::create(executionContext(), webResponse); + Response* response = Response::create(getExecutionContext(), webResponse); WebVector<WebServiceWorkerCache::BatchOperation> expectedDeleteOperations(size_t(1)); { @@ -455,11 +455,11 @@ } testCache->setExpectedBatchOperations(&expectedDeleteOperations); - ScriptPromise deleteResult = cache->deleteFunction(scriptState(), requestToRequestInfo(request), options, exceptionState()); + ScriptPromise deleteResult = cache->deleteFunction(getScriptState(), requestToRequestInfo(request), options, exceptionState()); EXPECT_EQ("dispatchBatch", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(deleteResult)); - ScriptPromise stringDeleteResult = cache->deleteFunction(scriptState(), stringToRequestInfo(url), options, exceptionState()); + ScriptPromise stringDeleteResult = cache->deleteFunction(getScriptState(), stringToRequestInfo(url), options, exceptionState()); EXPECT_EQ("dispatchBatch", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(stringDeleteResult)); @@ -475,11 +475,11 @@ request = newRequestFromUrl(url); ASSERT(request); - ScriptPromise putResult = cache->put(scriptState(), requestToRequestInfo(request), response->clone(exceptionState()), exceptionState()); + ScriptPromise putResult = cache->put(getScriptState(), requestToRequestInfo(request), response->clone(exceptionState()), exceptionState()); EXPECT_EQ("dispatchBatch", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(putResult)); - ScriptPromise stringPutResult = cache->put(scriptState(), stringToRequestInfo(url), response, exceptionState()); + ScriptPromise stringPutResult = cache->put(getScriptState(), stringToRequestInfo(url), response, exceptionState()); EXPECT_EQ("dispatchBatch", testCache->getAndClearLastErrorWebCacheMethodCalled()); EXPECT_EQ(kNotImplementedString, getRejectString(stringPutResult)); @@ -504,7 +504,7 @@ TEST_F(CacheStorageTest, MatchResponseTest) { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); OwnPtrWillBeRawPtr<ScopedFetcherForTests> fetcher = ScopedFetcherForTests::create(); const String requestUrl = "http://request.url/"; const String responseUrl = "http://match.response.test/"; @@ -516,7 +516,7 @@ Cache* cache = createCache(fetcher.get(), new MatchTestCache(webResponse)); CacheQueryOptions options; - ScriptPromise result = cache->match(scriptState(), stringToRequestInfo(requestUrl), options, exceptionState()); + ScriptPromise result = cache->match(getScriptState(), stringToRequestInfo(requestUrl), options, exceptionState()); ScriptValue scriptValue = getResolveValue(result); Response* response = V8Response::toImplWithTypeCheck(isolate(), scriptValue.v8Value()); ASSERT_TRUE(response); @@ -540,7 +540,7 @@ TEST_F(CacheStorageTest, KeysResponseTest) { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); OwnPtrWillBeRawPtr<ScopedFetcherForTests> fetcher = ScopedFetcherForTests::create(); const String url1 = "http://first.request/"; const String url2 = "http://second.request/"; @@ -555,7 +555,7 @@ Cache* cache = createCache(fetcher.get(), new KeysTestCache(webRequests)); - ScriptPromise result = cache->keys(scriptState(), exceptionState()); + ScriptPromise result = cache->keys(getScriptState(), exceptionState()); ScriptValue scriptValue = getResolveValue(result); Vector<v8::Local<v8::Value>> requests = toImplArray<Vector<v8::Local<v8::Value>>>(scriptValue.v8Value(), 0, isolate(), exceptionState()); @@ -591,7 +591,7 @@ TEST_F(CacheStorageTest, MatchAllAndBatchResponseTest) { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); OwnPtrWillBeRawPtr<ScopedFetcherForTests> fetcher = ScopedFetcherForTests::create(); const String url1 = "http://first.response/"; const String url2 = "http://second.response/"; @@ -609,7 +609,7 @@ Cache* cache = createCache(fetcher.get(), new MatchAllAndBatchTestCache(webResponses)); CacheQueryOptions options; - ScriptPromise result = cache->matchAll(scriptState(), stringToRequestInfo("http://some.url/"), options, exceptionState()); + ScriptPromise result = cache->matchAll(getScriptState(), stringToRequestInfo("http://some.url/"), options, exceptionState()); ScriptValue scriptValue = getResolveValue(result); Vector<v8::Local<v8::Value>> responses = toImplArray<Vector<v8::Local<v8::Value>>>(scriptValue.v8Value(), 0, isolate(), exceptionState()); @@ -621,7 +621,7 @@ EXPECT_EQ(expectedUrls[i], response->url()); } - result = cache->deleteFunction(scriptState(), stringToRequestInfo("http://some.url/"), options, exceptionState()); + result = cache->deleteFunction(getScriptState(), stringToRequestInfo("http://some.url/"), options, exceptionState()); scriptValue = getResolveValue(result); EXPECT_TRUE(scriptValue.v8Value()->IsBoolean()); EXPECT_EQ(true, scriptValue.v8Value().As<v8::Boolean>()->Value()); @@ -629,7 +629,7 @@ TEST_F(CacheStorageTest, Add) { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); OwnPtrWillBeRawPtr<ScopedFetcherForTests> fetcher = ScopedFetcherForTests::create(); const String url = "http://www.cacheadd.test/"; const String contentType = "text/plain"; @@ -641,7 +641,7 @@ fetcher->setExpectedFetchUrl(&url); Request* request = newRequestFromUrl(url); - Response* response = Response::create(executionContext(), FetchFormDataConsumerHandle::create(content), contentType, ResponseInit(), exceptionState()); + Response* response = Response::create(getExecutionContext(), FetchFormDataConsumerHandle::create(content), contentType, ResponseInit(), exceptionState()); fetcher->setResponse(response); WebVector<WebServiceWorkerCache::BatchOperation> expectedPutOperations(size_t(1)); @@ -654,7 +654,7 @@ } testCache->setExpectedBatchOperations(&expectedPutOperations); - ScriptPromise addResult = cache->add(scriptState(), requestToRequestInfo(request), exceptionState()); + ScriptPromise addResult = cache->add(getScriptState(), requestToRequestInfo(request), exceptionState()); EXPECT_EQ(kNotImplementedString, getRejectString(addResult)); EXPECT_EQ(1, fetcher->fetchCount());
diff --git a/third_party/WebKit/Source/modules/cachestorage/GlobalCacheStorage.cpp b/third_party/WebKit/Source/modules/cachestorage/GlobalCacheStorage.cpp index deb839b..91b1779b 100644 --- a/third_party/WebKit/Source/modules/cachestorage/GlobalCacheStorage.cpp +++ b/third_party/WebKit/Source/modules/cachestorage/GlobalCacheStorage.cpp
@@ -40,8 +40,8 @@ CacheStorage* caches(T& fetchingScope, ExceptionState& exceptionState) { - ExecutionContext* context = fetchingScope.executionContext(); - if (!context->securityOrigin()->canAccessCacheStorage()) { + ExecutionContext* context = fetchingScope.getExecutionContext(); + if (!context->getSecurityOrigin()->canAccessCacheStorage()) { if (context->securityContext().isSandboxed(SandboxOrigin)) exceptionState.throwSecurityError("Cache storage is disabled because the context is sandboxed and lacks the 'allow-same-origin' flag."); else if (context->url().protocolIs("data")) @@ -52,7 +52,7 @@ } if (!m_caches) { - m_caches = CacheStorage::create(GlobalFetch::ScopedFetcher::from(fetchingScope), Platform::current()->cacheStorage(WebSecurityOrigin(context->securityOrigin()))); + m_caches = CacheStorage::create(GlobalFetch::ScopedFetcher::from(fetchingScope), Platform::current()->cacheStorage(WebSecurityOrigin(context->getSecurityOrigin()))); } return m_caches; } @@ -79,12 +79,12 @@ CacheStorage* GlobalCacheStorage::caches(DOMWindow& window, ExceptionState& exceptionState) { - return GlobalCacheStorageImpl<LocalDOMWindow>::from(toLocalDOMWindow(window), window.executionContext()).caches(toLocalDOMWindow(window), exceptionState); + return GlobalCacheStorageImpl<LocalDOMWindow>::from(toLocalDOMWindow(window), window.getExecutionContext()).caches(toLocalDOMWindow(window), exceptionState); } CacheStorage* GlobalCacheStorage::caches(WorkerGlobalScope& worker, ExceptionState& exceptionState) { - return GlobalCacheStorageImpl<WorkerGlobalScope>::from(worker, worker.executionContext()).caches(worker, exceptionState); + return GlobalCacheStorageImpl<WorkerGlobalScope>::from(worker, worker.getExecutionContext()).caches(worker, exceptionState); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp index dd9b9ed..65da616 100644 --- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp +++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
@@ -94,11 +94,11 @@ static inline void convertCanvasStyleToUnionType(CanvasStyle* style, StringOrCanvasGradientOrCanvasPattern& returnValue) { - if (CanvasGradient* gradient = style->canvasGradient()) { + if (CanvasGradient* gradient = style->getCanvasGradient()) { returnValue.setCanvasGradient(gradient); return; } - if (CanvasPattern* pattern = style->canvasPattern()) { + if (CanvasPattern* pattern = style->getCanvasPattern()) { returnValue.setCanvasPattern(pattern); return; } @@ -176,7 +176,7 @@ if (originClean() && !canvasPattern->originClean()) setOriginTainted(); - if (canvasPattern->pattern()->isTextureBacked()) + if (canvasPattern->getPattern()->isTextureBacked()) disableDeferral(DisableDeferralReasonUsingTextureBackedPattern); canvasStyle = CanvasStyle::createFromPattern(canvasPattern); }
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h index e9e0b78..bca2270 100644 --- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h +++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h
@@ -215,8 +215,8 @@ // If gradient size is zero, then paint nothing. CanvasStyle* style = state().style(paintType); if (style) { - CanvasGradient* gradient = style->canvasGradient(); - if (gradient && gradient->gradient()->isZeroSize()) + CanvasGradient* gradient = style->getCanvasGradient(); + if (gradient && gradient->getGradient()->isZeroSize()) return false; }
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasGradient.h b/third_party/WebKit/Source/modules/canvas2d/CanvasGradient.h index de6503c..be7dbdd 100644 --- a/third_party/WebKit/Source/modules/canvas2d/CanvasGradient.h +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasGradient.h
@@ -51,7 +51,7 @@ return new CanvasGradient(p0, r0, p1, r1); } - Gradient* gradient() const { return m_gradient.get(); } + Gradient* getGradient() const { return m_gradient.get(); } void addColorStop(float value, const String& color, ExceptionState&);
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasPattern.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasPattern.cpp index 273d4e6..58ce084 100644 --- a/third_party/WebKit/Source/modules/canvas2d/CanvasPattern.cpp +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasPattern.cpp
@@ -58,7 +58,7 @@ void CanvasPattern::setTransform(SVGMatrixTearOff* transform) { - pattern()->setPatternSpaceTransform(transform ? transform->value() : AffineTransform(1, 0, 0, 1, 0, 0)); + getPattern()->setPatternSpaceTransform(transform ? transform->value() : AffineTransform(1, 0, 0, 1, 0, 0)); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasPattern.h b/third_party/WebKit/Source/modules/canvas2d/CanvasPattern.h index ce7dc5bfa..b782f58 100644 --- a/third_party/WebKit/Source/modules/canvas2d/CanvasPattern.h +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasPattern.h
@@ -48,7 +48,7 @@ return new CanvasPattern(image, repeat, originClean); } - Pattern* pattern() const { return m_pattern.get(); } + Pattern* getPattern() const { return m_pattern.get(); } bool originClean() const { return m_originClean; }
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasStyle.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasStyle.cpp index 5b75d750..ac378f17 100644 --- a/third_party/WebKit/Source/modules/canvas2d/CanvasStyle.cpp +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasStyle.cpp
@@ -116,10 +116,10 @@ paint.setShader(nullptr); break; case Gradient: - canvasGradient()->gradient()->applyToPaint(paint); + getCanvasGradient()->getGradient()->applyToPaint(paint); break; case ImagePattern: - canvasPattern()->pattern()->applyToPaint(paint); + getCanvasPattern()->getPattern()->applyToPaint(paint); break; default: ASSERT_NOT_REACHED();
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasStyle.h b/third_party/WebKit/Source/modules/canvas2d/CanvasStyle.h index 742e2706..02923de 100644 --- a/third_party/WebKit/Source/modules/canvas2d/CanvasStyle.h +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasStyle.h
@@ -49,8 +49,8 @@ static CanvasStyle* createFromPattern(CanvasPattern*); String color() const { ASSERT(m_type == ColorRGBA); return Color(m_rgba).serialized(); } - CanvasGradient* canvasGradient() const { return m_gradient.get(); } - CanvasPattern* canvasPattern() const { return m_pattern; } + CanvasGradient* getCanvasGradient() const { return m_gradient.get(); } + CanvasPattern* getCanvasPattern() const { return m_pattern; } void applyToPaint(SkPaint&) const; RGBA32 paintColor() const;
diff --git a/third_party/WebKit/Source/modules/compositorworker/CompositorWorker.cpp b/third_party/WebKit/Source/modules/compositorworker/CompositorWorker.cpp index a348c19..8a358fd 100644 --- a/third_party/WebKit/Source/modules/compositorworker/CompositorWorker.cpp +++ b/third_party/WebKit/Source/modules/compositorworker/CompositorWorker.cpp
@@ -45,7 +45,7 @@ WorkerGlobalScopeProxy* CompositorWorker::createWorkerGlobalScopeProxy(ExecutionContext* worker) { - ASSERT(executionContext()->isDocument()); + ASSERT(getExecutionContext()->isDocument()); return new CompositorWorkerMessagingProxy(this); }
diff --git a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp index 52ee62d..e3b27ed3 100644 --- a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp +++ b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp
@@ -18,6 +18,7 @@ #include "platform/testing/TestingPlatformSupport.h" #include "platform/testing/UnitTestHelpers.h" #include "public/platform/Platform.h" +#include "public/platform/WebAddressSpace.h" #include "testing/gtest/include/gtest/gtest.h" namespace blink { @@ -85,7 +86,7 @@ void workerThreadTerminated() override {} void willDestroyWorkerGlobalScope() override {} - ExecutionContext* executionContext() override { return m_executionContext.get(); } + ExecutionContext* getExecutionContext() override { return m_executionContext.get(); } private: TestCompositorWorkerObjectProxy(ExecutionContext* context) @@ -147,7 +148,7 @@ adoptPtr(new Vector<CSPHeaderAndType>()), m_securityOrigin.get(), clients.release(), - WebURLRequest::AddressSpaceLocal, + WebAddressSpaceLocal, V8CacheOptionsDefault)); return adoptPtr(workerThread); }
diff --git a/third_party/WebKit/Source/modules/credentialmanager/Credential.h b/third_party/WebKit/Source/modules/credentialmanager/Credential.h index 71fa55d..1baa1d1 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/Credential.h +++ b/third_party/WebKit/Source/modules/credentialmanager/Credential.h
@@ -27,7 +27,7 @@ DECLARE_VIRTUAL_TRACE(); - PlatformCredential* platformCredential() const { return m_platformCredential; } + PlatformCredential* getPlatformCredential() const { return m_platformCredential; } protected: Credential(PlatformCredential*);
diff --git a/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp b/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp index bf0330af..b5f8511 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp +++ b/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp
@@ -102,14 +102,14 @@ static bool checkBoilerplate(ScriptPromiseResolver* resolver) { - CredentialManagerClient* client = CredentialManagerClient::from(resolver->scriptState()->executionContext()); + CredentialManagerClient* client = CredentialManagerClient::from(resolver->getScriptState()->getExecutionContext()); if (!client) { resolver->reject(DOMException::create(InvalidStateError, "Could not establish connection to the credential manager.")); return false; } String errorMessage; - if (!resolver->scriptState()->executionContext()->isSecureContext(errorMessage)) { + if (!resolver->getScriptState()->getExecutionContext()->isSecureContext(errorMessage)) { resolver->reject(DOMException::create(SecurityError, errorMessage)); return false; } @@ -139,9 +139,9 @@ } } - UseCounter::count(scriptState->executionContext(), options.unmediated() ? UseCounter::CredentialManagerGetWithoutUI : UseCounter::CredentialManagerGetWithUI); + UseCounter::count(scriptState->getExecutionContext(), options.unmediated() ? UseCounter::CredentialManagerGetWithoutUI : UseCounter::CredentialManagerGetWithUI); - CredentialManagerClient::from(scriptState->executionContext())->dispatchGet(options.unmediated(), options.password(), providers, new RequestCallbacks(resolver)); + CredentialManagerClient::from(scriptState->getExecutionContext())->dispatchGet(options.unmediated(), options.password(), providers, new RequestCallbacks(resolver)); return promise; } @@ -152,7 +152,7 @@ if (!checkBoilerplate(resolver)) return promise; - CredentialManagerClient::from(scriptState->executionContext())->dispatchStore(WebCredential::create(credential->platformCredential()), new NotificationCallbacks(resolver)); + CredentialManagerClient::from(scriptState->getExecutionContext())->dispatchStore(WebCredential::create(credential->getPlatformCredential()), new NotificationCallbacks(resolver)); return promise; } @@ -163,7 +163,7 @@ if (!checkBoilerplate(resolver)) return promise; - CredentialManagerClient::from(scriptState->executionContext())->dispatchRequireUserMediation(new NotificationCallbacks(resolver)); + CredentialManagerClient::from(scriptState->getExecutionContext())->dispatchRequireUserMediation(new NotificationCallbacks(resolver)); return promise; }
diff --git a/third_party/WebKit/Source/modules/credentialmanager/FederatedCredential.cpp b/third_party/WebKit/Source/modules/credentialmanager/FederatedCredential.cpp index 0e14546..50347a1 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/FederatedCredential.cpp +++ b/third_party/WebKit/Source/modules/credentialmanager/FederatedCredential.cpp
@@ -36,7 +36,7 @@ } FederatedCredential::FederatedCredential(WebFederatedCredential* webFederatedCredential) - : Credential(webFederatedCredential->platformCredential()) + : Credential(webFederatedCredential->getPlatformCredential()) { }
diff --git a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.cpp b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.cpp index e174b504..101706d 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.cpp +++ b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.cpp
@@ -42,7 +42,7 @@ } PasswordCredential::PasswordCredential(WebPasswordCredential* webPasswordCredential) - : Credential(webPasswordCredential->platformCredential()) + : Credential(webPasswordCredential->getPlatformCredential()) , m_idName("username") , m_passwordName("password") {
diff --git a/third_party/WebKit/Source/modules/crypto/CryptoKey.cpp b/third_party/WebKit/Source/modules/crypto/CryptoKey.cpp index 1455c5c1..83d07c2 100644 --- a/third_party/WebKit/Source/modules/crypto/CryptoKey.cpp +++ b/third_party/WebKit/Source/modules/crypto/CryptoKey.cpp
@@ -119,7 +119,7 @@ { ASSERT(algorithm.paramsType() == WebCryptoAlgorithmParamsTypeNone); - V8ObjectBuilder algorithmValue(m_builder.scriptState()); + V8ObjectBuilder algorithmValue(m_builder.getScriptState()); algorithmValue.addString("name", WebCryptoAlgorithm::lookupAlgorithmInfo(algorithm.id())->name); m_builder.add(propertyName, algorithmValue); }
diff --git a/third_party/WebKit/Source/modules/crypto/CryptoResultImpl.cpp b/third_party/WebKit/Source/modules/crypto/CryptoResultImpl.cpp index 87f1e938..ff04f11b 100644 --- a/third_party/WebKit/Source/modules/crypto/CryptoResultImpl.cpp +++ b/third_party/WebKit/Source/modules/crypto/CryptoResultImpl.cpp
@@ -53,11 +53,11 @@ static void rejectWithTypeError(const String& errorDetails, ScriptPromiseResolver* resolver) { // Duplicate some of the checks done by ScriptPromiseResolver. - if (!resolver->executionContext() || resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!resolver->getExecutionContext() || resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; - ScriptState::Scope scope(resolver->scriptState()); - v8::Isolate* isolate = resolver->scriptState()->isolate(); + ScriptState::Scope scope(resolver->getScriptState()); + v8::Isolate* isolate = resolver->getScriptState()->isolate(); resolver->reject(v8::Exception::TypeError(v8String(isolate, errorDetails))); } @@ -134,7 +134,7 @@ , m_cancel(ResultCancel::create()) { // Sync cancellation state. - if (scriptState->executionContext()->activeDOMObjectsAreStopped()) + if (scriptState->getExecutionContext()->activeDOMObjectsAreStopped()) m_cancel->cancel(); } @@ -189,7 +189,7 @@ if (!m_resolver) return; - ScriptState* scriptState = m_resolver->scriptState(); + ScriptState* scriptState = m_resolver->getScriptState(); ScriptState::Scope scope(scriptState); v8::Local<v8::String> jsonString = v8AtomicString(scriptState->isolate(), utf8Data, length); @@ -226,7 +226,7 @@ if (!m_resolver) return; - ScriptState* scriptState = m_resolver->scriptState(); + ScriptState* scriptState = m_resolver->getScriptState(); ScriptState::Scope scope(scriptState); V8ObjectBuilder keyPair(scriptState);
diff --git a/third_party/WebKit/Source/modules/crypto/SubtleCrypto.cpp b/third_party/WebKit/Source/modules/crypto/SubtleCrypto.cpp index 86185b5a..33daf93 100644 --- a/third_party/WebKit/Source/modules/crypto/SubtleCrypto.cpp +++ b/third_party/WebKit/Source/modules/crypto/SubtleCrypto.cpp
@@ -55,7 +55,7 @@ static bool canAccessWebCrypto(ScriptState* scriptState, CryptoResult* result) { String errorMessage; - if (!scriptState->executionContext()->isSecureContext(errorMessage, ExecutionContext::WebCryptoSecureContextCheck)) { + if (!scriptState->getExecutionContext()->isSecureContext(errorMessage, ExecutionContext::WebCryptoSecureContextCheck)) { result->completeWithError(WebCryptoErrorTypeNotSupported, errorMessage); return false; } @@ -133,7 +133,7 @@ if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageEncrypt, result)) return promise; - histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->key()); + histogramAlgorithmAndKey(scriptState->getExecutionContext(), algorithm, key->key()); Platform::current()->crypto()->encrypt(algorithm, key->key(), data.bytes(), data.byteLength(), result->result()); return promise; } @@ -153,7 +153,7 @@ if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageDecrypt, result)) return promise; - histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->key()); + histogramAlgorithmAndKey(scriptState->getExecutionContext(), algorithm, key->key()); Platform::current()->crypto()->decrypt(algorithm, key->key(), data.bytes(), data.byteLength(), result->result()); return promise; } @@ -173,7 +173,7 @@ if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageSign, result)) return promise; - histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->key()); + histogramAlgorithmAndKey(scriptState->getExecutionContext(), algorithm, key->key()); Platform::current()->crypto()->sign(algorithm, key->key(), data.bytes(), data.byteLength(), result->result()); return promise; } @@ -193,7 +193,7 @@ if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageVerify, result)) return promise; - histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->key()); + histogramAlgorithmAndKey(scriptState->getExecutionContext(), algorithm, key->key()); Platform::current()->crypto()->verifySignature(algorithm, key->key(), signature.bytes(), signature.byteLength(), data.bytes(), data.byteLength(), result->result()); return promise; } @@ -210,7 +210,7 @@ if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDigest, algorithm, result)) return promise; - histogramAlgorithm(scriptState->executionContext(), algorithm); + histogramAlgorithm(scriptState->getExecutionContext(), algorithm); Platform::current()->crypto()->digest(algorithm, data.bytes(), data.byteLength(), result->result()); return promise; } @@ -231,7 +231,7 @@ if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationGenerateKey, algorithm, result)) return promise; - histogramAlgorithm(scriptState->executionContext(), algorithm); + histogramAlgorithm(scriptState->getExecutionContext(), algorithm); Platform::current()->crypto()->generateKey(algorithm, extractable, keyUsages, result->result()); return promise; } @@ -282,7 +282,7 @@ ptr = reinterpret_cast<const unsigned char*>(jsonUtf8.data()); len = jsonUtf8.length(); } - histogramAlgorithm(scriptState->executionContext(), algorithm); + histogramAlgorithm(scriptState->getExecutionContext(), algorithm); Platform::current()->crypto()->importKey(format, ptr, len, algorithm, extractable, keyUsages, result->result()); return promise; } @@ -304,7 +304,7 @@ return promise; } - histogramKey(scriptState->executionContext(), key->key()); + histogramKey(scriptState->getExecutionContext(), key->key()); Platform::current()->crypto()->exportKey(format, key->key(), result->result()); return promise; } @@ -333,8 +333,8 @@ if (!wrappingKey->canBeUsedForAlgorithm(wrapAlgorithm, WebCryptoKeyUsageWrapKey, result)) return promise; - histogramAlgorithmAndKey(scriptState->executionContext(), wrapAlgorithm, wrappingKey->key()); - histogramKey(scriptState->executionContext(), key->key()); + histogramAlgorithmAndKey(scriptState->getExecutionContext(), wrapAlgorithm, wrappingKey->key()); + histogramKey(scriptState->getExecutionContext(), key->key()); Platform::current()->crypto()->wrapKey(format, key->key(), wrappingKey->key(), wrapAlgorithm, result->result()); return promise; } @@ -366,8 +366,8 @@ if (!unwrappingKey->canBeUsedForAlgorithm(unwrapAlgorithm, WebCryptoKeyUsageUnwrapKey, result)) return promise; - histogramAlgorithmAndKey(scriptState->executionContext(), unwrapAlgorithm, unwrappingKey->key()); - histogramAlgorithm(scriptState->executionContext(), unwrappedKeyAlgorithm); + histogramAlgorithmAndKey(scriptState->getExecutionContext(), unwrapAlgorithm, unwrappingKey->key()); + histogramAlgorithm(scriptState->getExecutionContext(), unwrappedKeyAlgorithm); Platform::current()->crypto()->unwrapKey(format, wrappedKey.bytes(), wrappedKey.byteLength(), unwrappingKey->key(), unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages, result->result()); return promise; } @@ -387,7 +387,7 @@ if (!baseKey->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageDeriveBits, result)) return promise; - histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, baseKey->key()); + histogramAlgorithmAndKey(scriptState->getExecutionContext(), algorithm, baseKey->key()); Platform::current()->crypto()->deriveBits(algorithm, baseKey->key(), lengthBits, result->result()); return promise; } @@ -419,8 +419,8 @@ if (!parseAlgorithm(rawDerivedKeyType, WebCryptoOperationGetKeyLength, keyLengthAlgorithm, result)) return promise; - histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, baseKey->key()); - histogramAlgorithm(scriptState->executionContext(), importAlgorithm); + histogramAlgorithmAndKey(scriptState->getExecutionContext(), algorithm, baseKey->key()); + histogramAlgorithm(scriptState->getExecutionContext(), importAlgorithm); Platform::current()->crypto()->deriveKey(algorithm, baseKey->key(), importAlgorithm, keyLengthAlgorithm, extractable, keyUsages, result->result()); return promise; }
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp index e4a79b63..ae0b3ae 100644 --- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp +++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp
@@ -90,7 +90,7 @@ bool DeviceMotionController::isNullEvent(Event* event) const { DeviceMotionEvent* motionEvent = toDeviceMotionEvent(event); - return !motionEvent->deviceMotionData()->canProvideEventData(); + return !motionEvent->getDeviceMotionData()->canProvideEventData(); } const AtomicString& DeviceMotionController::eventTypeName() const
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.h b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.h index 2055cb9..86d686e 100644 --- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.h +++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.h
@@ -95,9 +95,9 @@ static DeviceMotionData* create(const WebDeviceMotionData&); DECLARE_TRACE(); - Acceleration* acceleration() const { return m_acceleration.get(); } - Acceleration* accelerationIncludingGravity() const { return m_accelerationIncludingGravity.get(); } - RotationRate* rotationRate() const { return m_rotationRate.get(); } + Acceleration* getAcceleration() const { return m_acceleration.get(); } + Acceleration* getAccelerationIncludingGravity() const { return m_accelerationIncludingGravity.get(); } + RotationRate* getRotationRate() const { return m_rotationRate.get(); } bool canProvideInterval() const { return m_canProvideInterval; } double interval() const { return m_interval; }
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.cpp b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.cpp index 3c5a7c3..1c2112d 100644 --- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.cpp +++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.cpp
@@ -61,33 +61,33 @@ DeviceAcceleration* DeviceMotionEvent::acceleration() { - if (!m_deviceMotionData->acceleration()) + if (!m_deviceMotionData->getAcceleration()) return nullptr; if (!m_acceleration) - m_acceleration = DeviceAcceleration::create(m_deviceMotionData->acceleration()); + m_acceleration = DeviceAcceleration::create(m_deviceMotionData->getAcceleration()); return m_acceleration.get(); } DeviceAcceleration* DeviceMotionEvent::accelerationIncludingGravity() { - if (!m_deviceMotionData->accelerationIncludingGravity()) + if (!m_deviceMotionData->getAccelerationIncludingGravity()) return nullptr; if (!m_accelerationIncludingGravity) - m_accelerationIncludingGravity = DeviceAcceleration::create(m_deviceMotionData->accelerationIncludingGravity()); + m_accelerationIncludingGravity = DeviceAcceleration::create(m_deviceMotionData->getAccelerationIncludingGravity()); return m_accelerationIncludingGravity.get(); } DeviceRotationRate* DeviceMotionEvent::rotationRate() { - if (!m_deviceMotionData->rotationRate()) + if (!m_deviceMotionData->getRotationRate()) return nullptr; if (!m_rotationRate) - m_rotationRate = DeviceRotationRate::create(m_deviceMotionData->rotationRate()); + m_rotationRate = DeviceRotationRate::create(m_deviceMotionData->getRotationRate()); return m_rotationRate.get(); }
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.h b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.h index 7e06710..a613c60 100644 --- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.h +++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionEvent.h
@@ -50,7 +50,7 @@ void initDeviceMotionEvent(const AtomicString& type, bool bubbles, bool cancelable, DeviceMotionData*); - DeviceMotionData* deviceMotionData() const { return m_deviceMotionData.get(); } + DeviceMotionData* getDeviceMotionData() const { return m_deviceMotionData.get(); } DeviceAcceleration* acceleration(); DeviceAcceleration* accelerationIncludingGravity();
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp b/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp index 2bdab5a..931af86f 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp +++ b/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp
@@ -89,9 +89,9 @@ m_resolver.clear(); } -ExecutionContext* ContentDecryptionModuleResultPromise::executionContext() const +ExecutionContext* ContentDecryptionModuleResultPromise::getExecutionContext() const { - return m_resolver->executionContext(); + return m_resolver->getExecutionContext(); } DEFINE_TRACE(ContentDecryptionModuleResultPromise)
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.h b/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.h index 0ae6889f..62d995d 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.h +++ b/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.h
@@ -48,7 +48,7 @@ // Rejects the promise with a DOMException. void reject(ExceptionCode, const String& errorMessage); - ExecutionContext* executionContext() const; + ExecutionContext* getExecutionContext() const; private: Member<ScriptPromiseResolver> m_resolver;
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp b/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp index fc54817..8b00cf79b 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp +++ b/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp
@@ -357,7 +357,7 @@ WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); RefPtrWillBeRawPtr<Event> event; - if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionContext()->securityOrigin())) { + if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->getExecutionContext()->getSecurityOrigin())) { event = createEncryptedEvent(initDataType, initData, initDataLength); } else { // Current page is not allowed to see content from the media file,
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp index f58d99d..1b69010 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp +++ b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp
@@ -308,7 +308,7 @@ } MediaKeySession::MediaKeySession(ScriptState* scriptState, MediaKeys* mediaKeys, WebEncryptedMediaSessionType sessionType) - : ActiveDOMObject(scriptState->executionContext()) + : ActiveDOMObject(scriptState->getExecutionContext()) , m_asyncEventQueue(GenericEventQueue::create(this)) , m_mediaKeys(mediaKeys) , m_sessionType(sessionType) @@ -317,7 +317,7 @@ , m_isUninitialized(true) , m_isCallable(false) , m_isClosed(false) - , m_closedPromise(new ClosedPromise(scriptState->executionContext(), this, ClosedPromise::Closed)) + , m_closedPromise(new ClosedPromise(scriptState->getExecutionContext(), this, ClosedPromise::Closed)) , m_actionTimer(this, &MediaKeySession::actionTimerFired) { WTF_LOG(Media, "MediaKeySession(%p)::MediaKeySession", this); @@ -489,7 +489,7 @@ // FIXME: Implement this (http://crbug.com/448922). // 6. Let origin be the origin of this object's Document. - // (Available as executionContext()->securityOrigin() anytime.) + // (Available as getExecutionContext()->getSecurityOrigin() anytime.) // 7. Let promise be a new promise. LoadSessionResultPromise* result = new LoadSessionResultPromise(scriptState, this); @@ -885,9 +885,9 @@ return EventTargetNames::MediaKeySession; } -ExecutionContext* MediaKeySession::executionContext() const +ExecutionContext* MediaKeySession::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } bool MediaKeySession::hasPendingActivity() const
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.h b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.h index be4a635d..61e5e921 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.h +++ b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.h
@@ -83,7 +83,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject bool hasPendingActivity() const override;
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySystemAccess.cpp b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySystemAccess.cpp index 1803cc0..e319ba3 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySystemAccess.cpp +++ b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySystemAccess.cpp
@@ -49,7 +49,7 @@ { // NOTE: Continued from step 2.8 of createMediaKeys(). // 2.9. Let media keys be a new MediaKeys object. - MediaKeys* mediaKeys = MediaKeys::create(executionContext(), m_supportedSessionTypes, adoptPtr(cdm)); + MediaKeys* mediaKeys = MediaKeys::create(getExecutionContext(), m_supportedSessionTypes, adoptPtr(cdm)); // 2.10. Resolve promise with media keys. resolve(mediaKeys);
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/NavigatorRequestMediaKeySystemAccess.cpp b/third_party/WebKit/Source/modules/encryptedmedia/NavigatorRequestMediaKeySystemAccess.cpp index a18e0255..fbeffbb 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/NavigatorRequestMediaKeySystemAccess.cpp +++ b/third_party/WebKit/Source/modules/encryptedmedia/NavigatorRequestMediaKeySystemAccess.cpp
@@ -91,7 +91,7 @@ // EncryptedMediaRequest implementation. WebString keySystem() const override { return m_keySystem; } const WebVector<WebMediaKeySystemConfiguration>& supportedConfigurations() const override { return m_supportedConfigurations; } - SecurityOrigin* securityOrigin() const override { return m_resolver->executionContext()->securityOrigin(); } + SecurityOrigin* getSecurityOrigin() const override { return m_resolver->getExecutionContext()->getSecurityOrigin(); } void requestSucceeded(WebContentDecryptionModuleAccess*) override; void requestNotSupported(const WebString& errorMessage) override; @@ -196,7 +196,7 @@ } if (hasEmptyRobustness) { - m_resolver->executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, + m_resolver->getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, "It is recommended that a robustness level be specified. Not specifying the robustness level could " "result in unexpected behavior in the future, potentially including failure to play.")); } @@ -230,7 +230,7 @@ } // 3-4. 'May Document use powerful features?' check. - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); String errorMessage; if (executionContext->isSecureContext(errorMessage)) { UseCounter::count(executionContext, UseCounter::EncryptedMediaSecureOrigin);
diff --git a/third_party/WebKit/Source/modules/fetch/Body.cpp b/third_party/WebKit/Source/modules/fetch/Body.cpp index c2e070e..10b74dfc 100644 --- a/third_party/WebKit/Source/modules/fetch/Body.cpp +++ b/third_party/WebKit/Source/modules/fetch/Body.cpp
@@ -31,8 +31,8 @@ ScriptPromiseResolver* resolver() { return m_resolver; } void didFetchDataLoadFailed() override { - ScriptState::Scope scope(resolver()->scriptState()); - m_resolver->reject(V8ThrowException::createTypeError(resolver()->scriptState()->isolate(), "Failed to fetch")); + ScriptState::Scope scope(resolver()->getScriptState()); + m_resolver->reject(V8ThrowException::createTypeError(resolver()->getScriptState()->isolate(), "Failed to fetch")); } DEFINE_INLINE_TRACE() @@ -85,10 +85,10 @@ void didFetchDataLoadedString(const String& string) override { - if (!resolver()->executionContext() || resolver()->executionContext()->activeDOMObjectsAreStopped()) + if (!resolver()->getExecutionContext() || resolver()->getExecutionContext()->activeDOMObjectsAreStopped()) return; - ScriptState::Scope scope(resolver()->scriptState()); - v8::Isolate* isolate = resolver()->scriptState()->isolate(); + ScriptState::Scope scope(resolver()->getScriptState()); + v8::Isolate* isolate = resolver()->getScriptState()->isolate(); v8::Local<v8::String> inputString = v8String(isolate, string); v8::TryCatch trycatch(isolate); v8::Local<v8::Value> parsed; @@ -113,13 +113,13 @@ // first check the ExecutionContext and return immediately if it's already // gone (which means that the V8::TerminateExecution() signal has been sent // to this worker thread). - if (!scriptState->executionContext()) + if (!scriptState->getExecutionContext()) return ScriptPromise(); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); promise = resolver->promise(); if (bodyBuffer()) { - bodyBuffer()->startLoading(scriptState->executionContext(), FetchDataLoader::createLoaderAsArrayBuffer(), new BodyArrayBufferConsumer(resolver)); + bodyBuffer()->startLoading(scriptState->getExecutionContext(), FetchDataLoader::createLoaderAsArrayBuffer(), new BodyArrayBufferConsumer(resolver)); } else { resolver->resolve(DOMArrayBuffer::create(0u, 1)); } @@ -133,13 +133,13 @@ return promise; // See above comment. - if (!scriptState->executionContext()) + if (!scriptState->getExecutionContext()) return ScriptPromise(); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); promise = resolver->promise(); if (bodyBuffer()) { - bodyBuffer()->startLoading(scriptState->executionContext(), FetchDataLoader::createLoaderAsBlobHandle(mimeType()), new BodyBlobConsumer(resolver)); + bodyBuffer()->startLoading(scriptState->getExecutionContext(), FetchDataLoader::createLoaderAsBlobHandle(mimeType()), new BodyBlobConsumer(resolver)); } else { OwnPtr<BlobData> blobData = BlobData::create(); blobData->setContentType(mimeType()); @@ -156,13 +156,13 @@ return promise; // See above comment. - if (!scriptState->executionContext()) + if (!scriptState->getExecutionContext()) return ScriptPromise(); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); promise = resolver->promise(); if (bodyBuffer()) { - bodyBuffer()->startLoading(scriptState->executionContext(), FetchDataLoader::createLoaderAsString(), new BodyJsonConsumer(resolver)); + bodyBuffer()->startLoading(scriptState->getExecutionContext(), FetchDataLoader::createLoaderAsString(), new BodyJsonConsumer(resolver)); } else { resolver->reject(V8ThrowException::createSyntaxError(scriptState->isolate(), "Unexpected end of input")); } @@ -176,13 +176,13 @@ return promise; // See above comment. - if (!scriptState->executionContext()) + if (!scriptState->getExecutionContext()) return ScriptPromise(); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); promise = resolver->promise(); if (bodyBuffer()) { - bodyBuffer()->startLoading(scriptState->executionContext(), FetchDataLoader::createLoaderAsString(), new BodyTextConsumer(resolver)); + bodyBuffer()->startLoading(scriptState->getExecutionContext(), FetchDataLoader::createLoaderAsString(), new BodyTextConsumer(resolver)); } else { resolver->resolve(String()); } @@ -196,7 +196,7 @@ ReadableByteStream* Body::bodyWithUseCounter() { - UseCounter::count(executionContext(), UseCounter::FetchBodyStream); + UseCounter::count(getExecutionContext(), UseCounter::FetchBodyStream); return body(); } @@ -212,7 +212,7 @@ bool Body::hasPendingActivity() const { - if (executionContext()->activeDOMObjectsAreStopped()) + if (getExecutionContext()->activeDOMObjectsAreStopped()) return false; if (!bodyBuffer()) return false;
diff --git a/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp b/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp index d50a7c44..c46d7b1 100644 --- a/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp +++ b/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp
@@ -32,8 +32,8 @@ ~BodyStreamBufferTest() override {} protected: - ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } - ExecutionContext* executionContext() { return &m_page->document(); } + ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } + ExecutionContext* getExecutionContext() { return &m_page->document(); } OwnPtr<DummyPageHolder> m_page; }; @@ -49,7 +49,7 @@ EXPECT_FALSE(buffer->stream()->isDisturbed()); EXPECT_EQ(ReadableStream::Readable, buffer->stream()->stateInternal()); - OwnPtr<FetchDataConsumerHandle> handle2 = buffer->releaseHandle(executionContext()); + OwnPtr<FetchDataConsumerHandle> handle2 = buffer->releaseHandle(getExecutionContext()); ASSERT_EQ(rawHandle, handle2.get()); EXPECT_TRUE(buffer->stream()->isLocked()); @@ -72,7 +72,7 @@ handle->add(Command(Command::Data, "hello")); handle->add(Command(Command::Done)); BodyStreamBuffer* buffer = new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(handle.release())); - buffer->startLoading(executionContext(), FetchDataLoader::createLoaderAsArrayBuffer(), client); + buffer->startLoading(getExecutionContext(), FetchDataLoader::createLoaderAsArrayBuffer(), client); EXPECT_TRUE(buffer->stream()->isLocked()); EXPECT_TRUE(buffer->stream()->isDisturbed()); @@ -104,7 +104,7 @@ handle->add(Command(Command::Data, "hello")); handle->add(Command(Command::Done)); BodyStreamBuffer* buffer = new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(handle.release())); - buffer->startLoading(executionContext(), FetchDataLoader::createLoaderAsBlobHandle("text/plain"), client); + buffer->startLoading(getExecutionContext(), FetchDataLoader::createLoaderAsBlobHandle("text/plain"), client); EXPECT_TRUE(buffer->stream()->isLocked()); EXPECT_TRUE(buffer->stream()->isDisturbed()); @@ -134,7 +134,7 @@ handle->add(Command(Command::Data, "hello")); handle->add(Command(Command::Done)); BodyStreamBuffer* buffer = new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(handle.release())); - buffer->startLoading(executionContext(), FetchDataLoader::createLoaderAsString(), client); + buffer->startLoading(getExecutionContext(), FetchDataLoader::createLoaderAsString(), client); EXPECT_TRUE(buffer->stream()->isLocked()); EXPECT_TRUE(buffer->stream()->isDisturbed()); @@ -160,7 +160,7 @@ EXPECT_FALSE(buffer->stream()->isLocked()); EXPECT_FALSE(buffer->stream()->isDisturbed()); EXPECT_FALSE(buffer->hasPendingActivity()); - OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle(executionContext()); + OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle(getExecutionContext()); EXPECT_TRUE(handle); EXPECT_TRUE(buffer->stream()->isLocked()); @@ -188,7 +188,7 @@ EXPECT_FALSE(buffer->stream()->isDisturbed()); EXPECT_FALSE(buffer->hasPendingActivity()); - buffer->startLoading(executionContext(), FetchDataLoader::createLoaderAsString(), client); + buffer->startLoading(getExecutionContext(), FetchDataLoader::createLoaderAsString(), client); EXPECT_TRUE(buffer->stream()->isLocked()); EXPECT_TRUE(buffer->stream()->isDisturbed()); EXPECT_TRUE(buffer->hasPendingActivity()); @@ -213,7 +213,7 @@ EXPECT_FALSE(buffer->stream()->isLocked()); EXPECT_FALSE(buffer->stream()->isDisturbed()); EXPECT_FALSE(buffer->hasPendingActivity()); - OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle(executionContext()); + OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle(getExecutionContext()); EXPECT_TRUE(handle); EXPECT_TRUE(buffer->stream()->isLocked()); EXPECT_TRUE(buffer->stream()->isDisturbed()); @@ -239,7 +239,7 @@ EXPECT_FALSE(buffer->stream()->isLocked()); EXPECT_FALSE(buffer->stream()->isDisturbed()); EXPECT_FALSE(buffer->hasPendingActivity()); - buffer->startLoading(executionContext(), FetchDataLoader::createLoaderAsString(), client); + buffer->startLoading(getExecutionContext(), FetchDataLoader::createLoaderAsString(), client); EXPECT_TRUE(buffer->stream()->isLocked()); EXPECT_TRUE(buffer->stream()->isDisturbed()); EXPECT_TRUE(buffer->hasPendingActivity()); @@ -267,7 +267,7 @@ handle->add(Command(Command::Data, "hello")); handle->add(Command(Command::Done)); Persistent<BodyStreamBuffer> buffer = new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(handle.release())); - buffer->startLoading(executionContext(), FetchDataLoader::createLoaderAsString(), client); + buffer->startLoading(getExecutionContext(), FetchDataLoader::createLoaderAsString(), client); Heap::collectAllGarbage(); checkpoint.Call(1); @@ -290,7 +290,7 @@ TEST_F(BodyStreamBufferTest, SourceHandleAndReaderShouldBeDestructedWhenCanceled) { - ScriptState::Scope scope(scriptState()); + ScriptState::Scope scope(getScriptState()); using MockHandle = MockFetchDataConsumerHandleWithMockDestructor; using MockReader = DataConsumerHandleTestUtil::MockFetchDataConsumerReader; OwnPtr<MockHandle> handle = MockHandle::create(); @@ -310,8 +310,8 @@ BodyStreamBuffer* buffer = new BodyStreamBuffer(handle.release()); checkpoint.Call(1); - ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason")); - buffer->cancelSource(scriptState(), reason); + ScriptValue reason(getScriptState(), v8String(getScriptState()->isolate(), "reason")); + buffer->cancelSource(getScriptState(), reason); checkpoint.Call(2); }
diff --git a/third_party/WebKit/Source/modules/fetch/CrossThreadHolder.h b/third_party/WebKit/Source/modules/fetch/CrossThreadHolder.h index 125a959..ef7fe14 100644 --- a/third_party/WebKit/Source/modules/fetch/CrossThreadHolder.h +++ b/third_party/WebKit/Source/modules/fetch/CrossThreadHolder.h
@@ -53,7 +53,7 @@ // The bridge has already disappeared. return; } - m_bridge->executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&Bridge::runTask, m_bridge.get(), task)); + m_bridge->getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&Bridge::runTask, m_bridge.get(), task)); } ~CrossThreadHolder() @@ -121,16 +121,16 @@ void runTask(PassOwnPtr<WTF::Function<void(T*, ExecutionContext*), WTF::CrossThreadAffinity>> task) { - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); if (m_obj) - (*task)(m_obj.get(), executionContext()); + (*task)(m_obj.get(), getExecutionContext()); } private: // ActiveDOMObject void stop() override { - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); { MutexLocker locker(m_mutex->mutex()); if (m_holder)
diff --git a/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.h b/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.h index cbfaafe..745fba0 100644 --- a/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.h +++ b/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.h
@@ -61,8 +61,8 @@ ~Thread(); WebThreadSupportingGC* thread() { return m_thread.get(); } - ExecutionContext* executionContext() { return m_executionContext.get(); } - ScriptState* scriptState() { return m_scriptState.get(); } + ExecutionContext* getExecutionContext() { return m_executionContext.get(); } + ScriptState* getScriptState() { return m_scriptState.get(); } v8::Isolate* isolate() { return m_isolateHolder->isolate(); } private: @@ -428,7 +428,7 @@ OwnPtr<WaitableEvent> m_detached; }; - Context* context() { return m_context.get(); } + Context* getContext() { return m_context.get(); } private: class ReaderImpl;
diff --git a/third_party/WebKit/Source/modules/fetch/DataConsumerTeeTest.cpp b/third_party/WebKit/Source/modules/fetch/DataConsumerTeeTest.cpp index e80ffd7c..f60c4a575 100644 --- a/third_party/WebKit/Source/modules/fetch/DataConsumerTeeTest.cpp +++ b/third_party/WebKit/Source/modules/fetch/DataConsumerTeeTest.cpp
@@ -61,12 +61,12 @@ m_waitableEvent->wait(); } - Thread* thread() { return m_thread.get(); } + Thread* getThread() { return m_thread.get(); } private: void runInternal(PassOwnPtr<Handle> src, OwnPtr<Handle>* dest1, OwnPtr<Handle>* dest2) { - DataConsumerTee::create(m_thread->executionContext(), src, dest1, dest2); + DataConsumerTee::create(m_thread->getExecutionContext(), src, dest1, dest2); m_waitableEvent->signal(); } @@ -190,7 +190,7 @@ void postStop(Thread* thread) { - thread->executionContext()->stopActiveDOMObjects(); + thread->getExecutionContext()->stopActiveDOMObjects(); } TEST(DataConsumerTeeTest, StopSource) @@ -212,7 +212,7 @@ // We can pass a raw pointer because the subsequent |wait| calls ensure // t->thread() is alive. - t->thread()->thread()->postTask(BLINK_FROM_HERE, threadSafeBind(postStop, AllowCrossThreadAccess(t->thread()))); + t->getThread()->thread()->postTask(BLINK_FROM_HERE, threadSafeBind(postStop, AllowCrossThreadAccess(t->getThread()))); OwnPtr<HandleReadResult> res1 = r1.wait(); OwnPtr<HandleReadResult> res2 = r2.wait(); @@ -304,7 +304,7 @@ TEST(DataConsumerTeeTest, DetachBothDestinationsShouldStopSourceReader) { OwnPtr<Handle> src(Handle::create()); - RefPtr<Handle::Context> context(src->context()); + RefPtr<Handle::Context> context(src->getContext()); OwnPtr<WebDataConsumerHandle> dest1, dest2; src->add(Command(Command::Data, "hello, "));
diff --git a/third_party/WebKit/Source/modules/fetch/FetchBlobDataConsumerHandle.cpp b/third_party/WebKit/Source/modules/fetch/FetchBlobDataConsumerHandle.cpp index 156ebe3..e1eac62 100644 --- a/third_party/WebKit/Source/modules/fetch/FetchBlobDataConsumerHandle.cpp +++ b/third_party/WebKit/Source/modules/fetch/FetchBlobDataConsumerHandle.cpp
@@ -83,12 +83,12 @@ ASSERT(executionContext->isContextThread()); ASSERT(!m_loader); - KURL url = BlobURL::createPublicURL(executionContext->securityOrigin()); + KURL url = BlobURL::createPublicURL(executionContext->getSecurityOrigin()); if (url.isEmpty()) { m_updater->update(createUnexpectedErrorDataConsumerHandle()); return; } - BlobRegistry::registerPublicBlobURL(executionContext->securityOrigin(), url, m_blobDataHandle); + BlobRegistry::registerPublicBlobURL(executionContext->getSecurityOrigin(), url, m_blobDataHandle); m_loader = createLoader(executionContext, this); ASSERT(m_loader);
diff --git a/third_party/WebKit/Source/modules/fetch/FetchFormDataConsumerHandleTest.cpp b/third_party/WebKit/Source/modules/fetch/FetchFormDataConsumerHandleTest.cpp index b1e595a..208d70f4 100644 --- a/third_party/WebKit/Source/modules/fetch/FetchFormDataConsumerHandleTest.cpp +++ b/third_party/WebKit/Source/modules/fetch/FetchFormDataConsumerHandleTest.cpp
@@ -77,7 +77,7 @@ FetchFormDataConsumerHandleTest() : m_page(DummyPageHolder::create(IntSize(1, 1))) {} protected: - Document* document() { return &m_page->document(); } + Document* getDocument() { return &m_page->document(); } OwnPtr<DummyPageHolder> m_page; }; @@ -190,7 +190,7 @@ data->appendData("foo", 3); data->appendData("hoge", 4); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(document(), data); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(getDocument(), data); HandleReaderRunner<HandleReader> runner(handle.release()); testing::runPendingTasks(); OwnPtr<HandleReadResult> r = runner.wait(); @@ -204,7 +204,7 @@ OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); src->add(Command(Command::Data, "bar")); src->add(Command(Command::Done)); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(document(), data, new LoaderFactory(src.release())); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(getDocument(), data, new LoaderFactory(src.release())); char c; size_t readSize; EXPECT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(&c, 1, kNone, &readSize)); @@ -222,7 +222,7 @@ OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); src->add(Command(Command::Data, "bar")); src->add(Command(Command::Done)); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(document(), data, new LoaderFactory(src.release())); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(getDocument(), data, new LoaderFactory(src.release())); char c; size_t readSize; EXPECT_EQ(kShouldWait, handle->obtainReader(nullptr)->read(&c, 1, kNone, &readSize)); @@ -271,7 +271,7 @@ data->append("name2", "value2"); RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData(); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(document(), inputFormData); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(getDocument(), inputFormData); OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr); RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle(); ASSERT_TRUE(blobDataHandle); @@ -288,7 +288,7 @@ { RefPtr<EncodedFormData> inputFormData = complexFormData(); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(document(), inputFormData); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(getDocument(), inputFormData); OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr); RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle(); ASSERT_TRUE(blobDataHandle); @@ -331,7 +331,7 @@ data->append("name2", "value2"); RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData(); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(document(), inputFormData); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(getDocument(), inputFormData); OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr); RefPtr<EncodedFormData> outputFormData = reader->drainAsFormData(); ASSERT_TRUE(outputFormData); @@ -344,7 +344,7 @@ { RefPtr<EncodedFormData> inputFormData = complexFormData(); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(document(), inputFormData); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::create(getDocument(), inputFormData); OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr); RefPtr<EncodedFormData> outputFormData = reader->drainAsFormData(); ASSERT_TRUE(outputFormData); @@ -396,7 +396,7 @@ OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); src->add(Command(Command::Data, "bar")); src->add(Command(Command::Done)); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(document(), complexFormData(), new LoaderFactory(src.release())); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(getDocument(), complexFormData(), new LoaderFactory(src.release())); OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr); size_t readSize; EXPECT_EQ(kShouldWait, reader->read(nullptr, 0, kNone, &readSize)); @@ -413,7 +413,7 @@ OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); src->add(Command(Command::Data, "bar")); src->add(Command(Command::Done)); - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(document(), complexFormData(), new LoaderFactory(src.release())); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(getDocument(), complexFormData(), new LoaderFactory(src.release())); OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr); char c; size_t readSize; @@ -431,7 +431,7 @@ src->add(Command(Command::Data, "bar")); src->add(Command(Command::Done)); const void* buffer = nullptr; - OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(document(), complexFormData(), new LoaderFactory(src.release())); + OwnPtr<FetchDataConsumerHandle> handle = FetchFormDataConsumerHandle::createForTest(getDocument(), complexFormData(), new LoaderFactory(src.release())); OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr); size_t available; EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
diff --git a/third_party/WebKit/Source/modules/fetch/FetchManager.cpp b/third_party/WebKit/Source/modules/fetch/FetchManager.cpp index 6983e91..b7a7331 100644 --- a/third_party/WebKit/Source/modules/fetch/FetchManager.cpp +++ b/third_party/WebKit/Source/modules/fetch/FetchManager.cpp
@@ -339,7 +339,7 @@ } } - Response* r = Response::create(m_resolver->executionContext(), taintedResponse); + Response* r = Response::create(m_resolver->getExecutionContext(), taintedResponse); if (response.url().protocolIsData()) { // An "Access-Control-Allow-Origin" header is added for data: URLs // but no headers except for "Content-Type" should exist, @@ -689,9 +689,9 @@ if (!message.isEmpty()) m_executionContext->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); if (m_resolver) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; - ScriptState* state = m_resolver->scriptState(); + ScriptState* state = m_resolver->getScriptState(); ScriptState::Scope scope(state); m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), "Failed to fetch")); } @@ -727,7 +727,7 @@ request->setContext(WebURLRequest::RequestContextFetch); - Loader* loader = Loader::create(executionContext(), this, resolver, request, scriptState->world().isIsolatedWorld()); + Loader* loader = Loader::create(getExecutionContext(), this, resolver, request, scriptState->world().isIsolatedWorld()); m_loaders.add(loader); loader->start(); return promise;
diff --git a/third_party/WebKit/Source/modules/fetch/GlobalFetch.cpp b/third_party/WebKit/Source/modules/fetch/GlobalFetch.cpp index 2b988fd..323b05d 100644 --- a/third_party/WebKit/Source/modules/fetch/GlobalFetch.cpp +++ b/third_party/WebKit/Source/modules/fetch/GlobalFetch.cpp
@@ -82,12 +82,12 @@ WeakPtrWillBeRawPtr<GlobalFetch::ScopedFetcher> GlobalFetch::ScopedFetcher::from(DOMWindow& window) { - return GlobalFetchImpl<LocalDOMWindow>::from(toLocalDOMWindow(window), window.executionContext()); + return GlobalFetchImpl<LocalDOMWindow>::from(toLocalDOMWindow(window), window.getExecutionContext()); } WeakPtrWillBeRawPtr<GlobalFetch::ScopedFetcher> GlobalFetch::ScopedFetcher::from(WorkerGlobalScope& worker) { - return GlobalFetchImpl<WorkerGlobalScope>::from(worker, worker.executionContext()); + return GlobalFetchImpl<WorkerGlobalScope>::from(worker, worker.getExecutionContext()); } DEFINE_TRACE(GlobalFetch::ScopedFetcher) @@ -96,14 +96,14 @@ ScriptPromise GlobalFetch::fetch(ScriptState* scriptState, DOMWindow& window, const RequestInfo& input, const Dictionary& init, ExceptionState& exceptionState) { - UseCounter::count(window.executionContext(), UseCounter::Fetch); + UseCounter::count(window.getExecutionContext(), UseCounter::Fetch); return ScopedFetcher::from(window)->fetch(scriptState, input, init, exceptionState); } ScriptPromise GlobalFetch::fetch(ScriptState* scriptState, WorkerGlobalScope& worker, const RequestInfo& input, const Dictionary& init, ExceptionState& exceptionState) { // Note that UseCounter doesn't work with SharedWorker or ServiceWorker. - UseCounter::count(worker.executionContext(), UseCounter::Fetch); + UseCounter::count(worker.getExecutionContext(), UseCounter::Fetch); return ScopedFetcher::from(worker)->fetch(scriptState, input, init, exceptionState); }
diff --git a/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandle.cpp b/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandle.cpp index a8da59e..f15d54a 100644 --- a/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandle.cpp +++ b/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandle.cpp
@@ -50,7 +50,7 @@ bool done; v8::Local<v8::Value> item = v.v8Value(); ASSERT(item->IsObject()); - v8::Local<v8::Value> value = v8CallOrCrash(v8UnpackIteratorResult(v.scriptState(), item.As<v8::Object>(), &done)); + v8::Local<v8::Value> value = v8CallOrCrash(v8UnpackIteratorResult(v.getScriptState(), item.As<v8::Object>(), &done)); if (done) { readingContext->onReadDone(); return v;
diff --git a/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp b/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp index fba225c..00c3fa65 100644 --- a/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp +++ b/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp
@@ -53,8 +53,8 @@ { } - ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } - v8::Isolate* isolate() { return scriptState()->isolate(); } + ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } + v8::Isolate* isolate() { return getScriptState()->isolate(); } v8::MaybeLocal<v8::Value> eval(const char* s) { @@ -65,11 +65,11 @@ ADD_FAILURE(); return v8::MaybeLocal<v8::Value>(); } - if (!v8Call(v8::Script::Compile(scriptState()->context(), source), script)) { + if (!v8Call(v8::Script::Compile(getScriptState()->context(), source), script)) { ADD_FAILURE() << "Compilation fails"; return v8::MaybeLocal<v8::Value>(); } - return script->Run(scriptState()->context()); + return script->Run(getScriptState()->context()); } v8::MaybeLocal<v8::Value> evalWithPrintingError(const char* s) { @@ -85,10 +85,10 @@ PassOwnPtr<ReadableStreamDataConsumerHandle> createHandle(ScriptValue stream) { NonThrowableExceptionState es; - ScriptValue reader = ReadableStreamOperations::getReader(scriptState(), stream, es); + ScriptValue reader = ReadableStreamOperations::getReader(getScriptState(), stream, es); ASSERT(!reader.isEmpty()); ASSERT(reader.v8Value()->IsObject()); - return ReadableStreamDataConsumerHandle::create(scriptState(), reader); + return ReadableStreamDataConsumerHandle::create(getScriptState(), reader); } void gc() { V8GCController::collectAllGarbageForTesting(isolate()); } @@ -99,8 +99,8 @@ TEST_F(ReadableStreamDataConsumerHandleTest, Create) { - ScriptState::Scope scope(scriptState()); - ScriptValue stream(scriptState(), evalWithPrintingError("new ReadableStream")); + ScriptState::Scope scope(getScriptState()); + ScriptValue stream(getScriptState(), evalWithPrintingError("new ReadableStream")); ASSERT_FALSE(stream.isEmpty()); OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream); ASSERT_TRUE(handle); @@ -121,8 +121,8 @@ TEST_F(ReadableStreamDataConsumerHandleTest, EmptyStream) { - ScriptState::Scope scope(scriptState()); - ScriptValue stream(scriptState(), evalWithPrintingError( + ScriptState::Scope scope(getScriptState()); + ScriptValue stream(getScriptState(), evalWithPrintingError( "new ReadableStream({start: c => c.close()})")); ASSERT_FALSE(stream.isEmpty()); OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream); @@ -152,8 +152,8 @@ TEST_F(ReadableStreamDataConsumerHandleTest, ErroredStream) { - ScriptState::Scope scope(scriptState()); - ScriptValue stream(scriptState(), evalWithPrintingError( + ScriptState::Scope scope(getScriptState()); + ScriptValue stream(getScriptState(), evalWithPrintingError( "new ReadableStream({start: c => c.error()})")); ASSERT_FALSE(stream.isEmpty()); OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream); @@ -183,8 +183,8 @@ TEST_F(ReadableStreamDataConsumerHandleTest, Read) { - ScriptState::Scope scope(scriptState()); - ScriptValue stream(scriptState(), evalWithPrintingError( + ScriptState::Scope scope(getScriptState()); + ScriptValue stream(getScriptState(), evalWithPrintingError( "var controller;" "var stream = new ReadableStream({start: c => controller = c});" "controller.enqueue(new Uint8Array());" @@ -251,8 +251,8 @@ TEST_F(ReadableStreamDataConsumerHandleTest, TwoPhaseRead) { - ScriptState::Scope scope(scriptState()); - ScriptValue stream(scriptState(), evalWithPrintingError( + ScriptState::Scope scope(getScriptState()); + ScriptValue stream(getScriptState(), evalWithPrintingError( "var controller;" "var stream = new ReadableStream({start: c => controller = c});" "controller.enqueue(new Uint8Array());" @@ -330,8 +330,8 @@ TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueUndefined) { - ScriptState::Scope scope(scriptState()); - ScriptValue stream(scriptState(), evalWithPrintingError( + ScriptState::Scope scope(getScriptState()); + ScriptValue stream(getScriptState(), evalWithPrintingError( "var controller;" "var stream = new ReadableStream({start: c => controller = c});" "controller.enqueue(undefined);" @@ -365,8 +365,8 @@ TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueNull) { - ScriptState::Scope scope(scriptState()); - ScriptValue stream(scriptState(), evalWithPrintingError( + ScriptState::Scope scope(getScriptState()); + ScriptValue stream(getScriptState(), evalWithPrintingError( "var controller;" "var stream = new ReadableStream({start: c => controller = c});" "controller.enqueue(null);" @@ -400,8 +400,8 @@ TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueString) { - ScriptState::Scope scope(scriptState()); - ScriptValue stream(scriptState(), evalWithPrintingError( + ScriptState::Scope scope(getScriptState()); + ScriptValue stream(getScriptState(), evalWithPrintingError( "var controller;" "var stream = new ReadableStream({start: c => controller = c});" "controller.enqueue('hello');" @@ -450,8 +450,8 @@ { // We need this scope to collect local handles. - ScriptState::Scope scope(scriptState()); - stream = ScriptValue(scriptState(), evalWithPrintingError("new ReadableStream()")); + ScriptState::Scope scope(getScriptState()); + stream = ScriptValue(getScriptState(), evalWithPrintingError("new ReadableStream()")); ASSERT_FALSE(stream.isEmpty()); OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream); ASSERT_TRUE(handle); @@ -492,8 +492,8 @@ { // We need this scope to collect local handles. - ScriptState::Scope scope(scriptState()); - stream = ScriptValue(scriptState(), evalWithPrintingError("new ReadableStream()")); + ScriptState::Scope scope(getScriptState()); + stream = ScriptValue(getScriptState(), evalWithPrintingError("new ReadableStream()")); ASSERT_FALSE(stream.isEmpty()); OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream); ASSERT_TRUE(handle);
diff --git a/third_party/WebKit/Source/modules/fetch/Request.cpp b/third_party/WebKit/Source/modules/fetch/Request.cpp index a10f71db..1bbbb2c5 100644 --- a/third_party/WebKit/Source/modules/fetch/Request.cpp +++ b/third_party/WebKit/Source/modules/fetch/Request.cpp
@@ -36,7 +36,7 @@ if (world.isIsolatedWorld()) request->setOrigin(world.isolatedWorldSecurityOrigin()); else - request->setOrigin(scriptState->executionContext()->securityOrigin()); + request->setOrigin(scriptState->getExecutionContext()->getSecurityOrigin()); // FIXME: Set ForceOriginHeaderFlag. request->setSameOriginDataURLFlag(true); request->setReferrer(original->referrer()); @@ -64,7 +64,7 @@ // "Let |request| be |input|'s request, if |input| is a Request object, // and a new request otherwise." - RefPtr<SecurityOrigin> origin = scriptState->executionContext()->securityOrigin(); + RefPtr<SecurityOrigin> origin = scriptState->getExecutionContext()->getSecurityOrigin(); // TODO(yhirano): Implement the following steps: // - "Let |window| be client." @@ -95,7 +95,7 @@ // "If |input| is a string, run these substeps:" if (!inputRequest) { // "Let |parsedURL| be the result of parsing |input| with |baseURL|." - KURL parsedURL = scriptState->executionContext()->completeURL(inputString); + KURL parsedURL = scriptState->getExecutionContext()->completeURL(inputString); // "If |parsedURL| is failure, throw a TypeError." if (!parsedURL.isValid()) { exceptionState.throwTypeError("Failed to parse URL from " + inputString); @@ -159,7 +159,7 @@ } else { // "Let |parsedReferrer| be the result of parsing |referrer| with // |baseURL|." - KURL parsedReferrer = scriptState->executionContext()->completeURL(init.referrer.referrer); + KURL parsedReferrer = scriptState->getExecutionContext()->completeURL(init.referrer.referrer); if (!parsedReferrer.isValid()) { // "If |parsedReferrer| is failure, throw a TypeError." exceptionState.throwTypeError("Referrer '" + init.referrer.referrer + "' is not a valid URL."); @@ -259,7 +259,7 @@ } // "Let |r| be a new Request object associated with |request| and a new // Headers object whose guard is "request"." - Request* r = Request::create(scriptState->executionContext(), request); + Request* r = Request::create(scriptState->getExecutionContext(), request); // Perform the following steps: // - "Let |headers| be a copy of |r|'s Headers object." // - "If |init|'s headers member is present, set |headers| to |init|'s @@ -269,7 +269,7 @@ // is present. Headers* headers = nullptr; if (!init.headers && init.headersDictionary.isUndefinedOrNull()) { - headers = r->headers()->clone(); + headers = r->getHeaders()->clone(); } // "Empty |r|'s request's header list." r->m_request->headerList()->clearList(); @@ -288,17 +288,17 @@ return nullptr; } // "Set |r|'s Headers object's guard to "request-no-cors"." - r->headers()->setGuard(Headers::RequestNoCORSGuard); + r->getHeaders()->setGuard(Headers::RequestNoCORSGuard); } // "Fill |r|'s Headers object with |headers|. Rethrow any exceptions." if (init.headers) { ASSERT(init.headersDictionary.isUndefinedOrNull()); - r->headers()->fillWith(init.headers.get(), exceptionState); + r->getHeaders()->fillWith(init.headers.get(), exceptionState); } else if (!init.headersDictionary.isUndefinedOrNull()) { - r->headers()->fillWith(init.headersDictionary, exceptionState); + r->getHeaders()->fillWith(init.headersDictionary, exceptionState); } else { ASSERT(headers); - r->headers()->fillWith(headers, exceptionState); + r->getHeaders()->fillWith(headers, exceptionState); } if (exceptionState.hadException()) return nullptr; @@ -323,8 +323,8 @@ // `Content-Type`/|Content-Type| to |r|'s Headers object. Rethrow any // exception." temporaryBody = new BodyStreamBuffer(init.body.release()); - if (!init.contentType.isEmpty() && !r->headers()->has(HTTPNames::Content_Type, exceptionState)) { - r->headers()->append(HTTPNames::Content_Type, init.contentType, exceptionState); + if (!init.contentType.isEmpty() && !r->getHeaders()->has(HTTPNames::Content_Type, exceptionState)) { + r->getHeaders()->append(HTTPNames::Content_Type, init.contentType, exceptionState); } if (exceptionState.hadException()) return nullptr; @@ -382,7 +382,7 @@ Request* Request::create(ScriptState* scriptState, const String& input, const Dictionary& init, ExceptionState& exceptionState) { - RequestInit requestInit(scriptState->executionContext(), init, exceptionState); + RequestInit requestInit(scriptState->getExecutionContext(), init, exceptionState); return createRequestWithRequestOrString(scriptState, nullptr, input, requestInit, exceptionState); } @@ -393,7 +393,7 @@ Request* Request::create(ScriptState* scriptState, Request* input, const Dictionary& init, ExceptionState& exceptionState) { - RequestInit requestInit(scriptState->executionContext(), init, exceptionState); + RequestInit requestInit(scriptState->getExecutionContext(), init, exceptionState); return createRequestWithRequestOrString(scriptState, input, String(), requestInit, exceptionState); } @@ -592,16 +592,16 @@ return nullptr; } - FetchRequestData* request = m_request->clone(executionContext()); + FetchRequestData* request = m_request->clone(getExecutionContext()); Headers* headers = Headers::create(request->headerList()); headers->setGuard(m_headers->getGuard()); - return new Request(executionContext(), request, headers); + return new Request(getExecutionContext(), request, headers); } FetchRequestData* Request::passRequestData() { ASSERT(!bodyUsed()); - return m_request->pass(executionContext()); + return m_request->pass(getExecutionContext()); } bool Request::hasBody() const
diff --git a/third_party/WebKit/Source/modules/fetch/Request.h b/third_party/WebKit/Source/modules/fetch/Request.h index d04d30d9..847b3e3d 100644 --- a/third_party/WebKit/Source/modules/fetch/Request.h +++ b/third_party/WebKit/Source/modules/fetch/Request.h
@@ -44,7 +44,7 @@ // From Request.idl: String method() const; KURL url() const; - Headers* headers() const { return m_headers; } + Headers* getHeaders() const { return m_headers; } String context() const; String referrer() const; String mode() const;
diff --git a/third_party/WebKit/Source/modules/fetch/Request.idl b/third_party/WebKit/Source/modules/fetch/Request.idl index 7fe8fed..6bc29fd 100644 --- a/third_party/WebKit/Source/modules/fetch/Request.idl +++ b/third_party/WebKit/Source/modules/fetch/Request.idl
@@ -27,7 +27,7 @@ ] interface Request { readonly attribute ByteString method; readonly attribute USVString url; - readonly attribute Headers headers; + [ImplementedAs=getHeaders] readonly attribute Headers headers; readonly attribute DOMString referrer; readonly attribute RequestMode mode; readonly attribute RequestCredentials credentials;
diff --git a/third_party/WebKit/Source/modules/fetch/RequestTest.cpp b/third_party/WebKit/Source/modules/fetch/RequestTest.cpp index 58cfab7..cd1d5789 100644 --- a/third_party/WebKit/Source/modules/fetch/RequestTest.cpp +++ b/third_party/WebKit/Source/modules/fetch/RequestTest.cpp
@@ -23,8 +23,8 @@ ServiceWorkerRequestTest() : m_page(DummyPageHolder::create(IntSize(1, 1))) { } - ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } - ExecutionContext* executionContext() { return scriptState()->executionContext(); } + ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } + ExecutionContext* getExecutionContext() { return getScriptState()->getExecutionContext(); } private: OwnPtr<DummyPageHolder> m_page; @@ -35,7 +35,7 @@ TrackExceptionState exceptionState; KURL url(ParsedURLString, "http://www.example.com/"); - Request* request = Request::create(scriptState(), url, exceptionState); + Request* request = Request::create(getScriptState(), url, exceptionState); ASSERT_FALSE(exceptionState.hadException()); ASSERT(request); EXPECT_EQ(url, request->url()); @@ -46,10 +46,10 @@ TrackExceptionState exceptionState; KURL url(ParsedURLString, "http://www.example.com/"); - Request* request1 = Request::create(scriptState(), url, exceptionState); + Request* request1 = Request::create(getScriptState(), url, exceptionState); ASSERT(request1); - Request* request2 = Request::create(scriptState(), request1, exceptionState); + Request* request2 = Request::create(getScriptState(), request1, exceptionState); ASSERT_FALSE(exceptionState.hadException()); ASSERT(request2); EXPECT_EQ(url, request2->url()); @@ -78,7 +78,7 @@ webRequest.setHeader(WebString::fromUTF8(headers[i].key), WebString::fromUTF8(headers[i].value)); webRequest.setReferrer(referrer, referrerPolicy); - Request* request = Request::create(executionContext(), webRequest); + Request* request = Request::create(getExecutionContext(), webRequest); ASSERT(request); EXPECT_EQ(url, request->url()); EXPECT_EQ(method, request->method()); @@ -86,7 +86,7 @@ EXPECT_EQ(referrer, request->referrer()); EXPECT_EQ("navigate", request->mode()); - Headers* requestHeaders = request->headers(); + Headers* requestHeaders = request->getHeaders(); WTF::HashMap<String, String> headersMap; for (int i = 0; headers[i].key; ++i) @@ -114,7 +114,7 @@ TrackExceptionState exceptionState; String urlWithoutFragment = "http://www.example.com/"; String url = urlWithoutFragment + "#fragment"; - Request* request = Request::create(scriptState(), url, exceptionState); + Request* request = Request::create(getScriptState(), url, exceptionState); ASSERT(request); WebServiceWorkerRequest webRequest;
diff --git a/third_party/WebKit/Source/modules/fetch/Response.cpp b/third_party/WebKit/Source/modules/fetch/Response.cpp index 60220e0..75a12345 100644 --- a/third_party/WebKit/Source/modules/fetch/Response.cpp +++ b/third_party/WebKit/Source/modules/fetch/Response.cpp
@@ -108,7 +108,7 @@ Response* Response::create(ScriptState* scriptState, ExceptionState& exceptionState) { - return create(scriptState->executionContext(), nullptr, String(), ResponseInit(), exceptionState); + return create(scriptState->getExecutionContext(), nullptr, String(), ResponseInit(), exceptionState); } Response* Response::create(ScriptState* scriptState, ScriptValue bodyValue, const Dictionary& init, ExceptionState& exceptionState) @@ -116,7 +116,7 @@ v8::Local<v8::Value> body = bodyValue.v8Value(); ScriptValue reader; v8::Isolate* isolate = scriptState->isolate(); - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); OwnPtr<FetchDataConsumerHandle> bodyHandle; String contentType; @@ -353,15 +353,15 @@ return nullptr; } - FetchResponseData* response = m_response->clone(executionContext()); + FetchResponseData* response = m_response->clone(getExecutionContext()); Headers* headers = Headers::create(response->headerList()); headers->setGuard(m_headers->getGuard()); - return new Response(executionContext(), response, headers); + return new Response(getExecutionContext(), response, headers); } bool Response::hasPendingActivity() const { - if (!executionContext() || executionContext()->activeDOMObjectsAreStopped()) + if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) return false; if (!internalBodyBuffer()) return false;
diff --git a/third_party/WebKit/Source/modules/fetch/ResponseTest.cpp b/third_party/WebKit/Source/modules/fetch/ResponseTest.cpp index 37cdd7c67..d8ee7eff 100644 --- a/third_party/WebKit/Source/modules/fetch/ResponseTest.cpp +++ b/third_party/WebKit/Source/modules/fetch/ResponseTest.cpp
@@ -47,8 +47,8 @@ ServiceWorkerResponseTest() : m_page(DummyPageHolder::create(IntSize(1, 1))) { } - ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } - ExecutionContext* executionContext() { return scriptState()->executionContext(); } + ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } + ExecutionContext* getExecutionContext() { return getScriptState()->getExecutionContext(); } private: OwnPtr<DummyPageHolder> m_page; @@ -62,7 +62,7 @@ FetchResponseData* fetchResponseData = FetchResponseData::create(); fetchResponseData->setURL(url); - Response* response = Response::create(executionContext(), fetchResponseData); + Response* response = Response::create(getExecutionContext(), fetchResponseData); ASSERT(response); EXPECT_EQ(url, response->url()); } @@ -70,7 +70,7 @@ TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponse) { OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerResponse(); - Response* response = Response::create(executionContext(), *webResponse); + Response* response = Response::create(getExecutionContext(), *webResponse); ASSERT(response); EXPECT_EQ(webResponse->url(), response->url()); EXPECT_EQ(webResponse->status(), response->status()); @@ -92,7 +92,7 @@ { OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerResponse(); webResponse->setResponseType(WebServiceWorkerResponseTypeDefault); - Response* response = Response::create(executionContext(), *webResponse); + Response* response = Response::create(getExecutionContext(), *webResponse); Headers* responseHeaders = response->headers(); TrackExceptionState exceptionState; @@ -106,7 +106,7 @@ { OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerResponse(); webResponse->setResponseType(WebServiceWorkerResponseTypeBasic); - Response* response = Response::create(executionContext(), *webResponse); + Response* response = Response::create(getExecutionContext(), *webResponse); Headers* responseHeaders = response->headers(); TrackExceptionState exceptionState; @@ -120,7 +120,7 @@ { OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerResponse(); webResponse->setResponseType(WebServiceWorkerResponseTypeCORS); - Response* response = Response::create(executionContext(), *webResponse); + Response* response = Response::create(getExecutionContext(), *webResponse); Headers* responseHeaders = response->headers(); TrackExceptionState exceptionState; @@ -134,7 +134,7 @@ { OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerResponse(); webResponse->setResponseType(WebServiceWorkerResponseTypeOpaque); - Response* response = Response::create(executionContext(), *webResponse); + Response* response = Response::create(getExecutionContext(), *webResponse); Headers* responseHeaders = response->headers(); TrackExceptionState exceptionState; @@ -180,8 +180,8 @@ EXPECT_CALL(*client1, didFetchDataLoadedString(String("Hello, world"))); EXPECT_CALL(*client2, didFetchDataLoadedString(String("Hello, world"))); - response->internalBodyBuffer()->startLoading(response->executionContext(), FetchDataLoader::createLoaderAsString(), client1); - clonedResponse->internalBodyBuffer()->startLoading(response->executionContext(), FetchDataLoader::createLoaderAsString(), client2); + response->internalBodyBuffer()->startLoading(response->getExecutionContext(), FetchDataLoader::createLoaderAsString(), client1); + clonedResponse->internalBodyBuffer()->startLoading(response->getExecutionContext(), FetchDataLoader::createLoaderAsString(), client2); blink::testing::runPendingTasks(); } @@ -200,7 +200,7 @@ BodyStreamBuffer* buffer = createHelloWorldBuffer(); FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(buffer); fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); - Response* response = Response::create(executionContext(), fetchResponseData); + Response* response = Response::create(getExecutionContext(), fetchResponseData); EXPECT_EQ(response->internalBodyBuffer(), buffer); checkResponseStream(response, true); } @@ -211,7 +211,7 @@ FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(buffer); fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); fetchResponseData = fetchResponseData->createBasicFilteredResponse(); - Response* response = Response::create(executionContext(), fetchResponseData); + Response* response = Response::create(getExecutionContext(), fetchResponseData); EXPECT_EQ(response->internalBodyBuffer(), buffer); checkResponseStream(response, true); } @@ -222,7 +222,7 @@ FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(buffer); fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); fetchResponseData = fetchResponseData->createCORSFilteredResponse(); - Response* response = Response::create(executionContext(), fetchResponseData); + Response* response = Response::create(getExecutionContext(), fetchResponseData); EXPECT_EQ(response->internalBodyBuffer(), buffer); checkResponseStream(response, true); } @@ -233,7 +233,7 @@ FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(buffer); fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); fetchResponseData = fetchResponseData->createOpaqueFilteredResponse(); - Response* response = Response::create(executionContext(), fetchResponseData); + Response* response = Response::create(getExecutionContext(), fetchResponseData); EXPECT_EQ(response->internalBodyBuffer(), buffer); checkResponseStream(response, false); } @@ -243,7 +243,7 @@ BodyStreamBuffer* buffer = new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle())); FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(buffer); fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); - Response* response = Response::create(executionContext(), fetchResponseData); + Response* response = Response::create(getExecutionContext(), fetchResponseData); TrackExceptionState exceptionState; Response* clonedResponse = response->clone(exceptionState); EXPECT_FALSE(exceptionState.hadException()); @@ -253,8 +253,8 @@ EXPECT_CALL(*client1, didFetchDataLoadFailed()); EXPECT_CALL(*client2, didFetchDataLoadFailed()); - response->internalBodyBuffer()->startLoading(response->executionContext(), FetchDataLoader::createLoaderAsString(), client1); - clonedResponse->internalBodyBuffer()->startLoading(response->executionContext(), FetchDataLoader::createLoaderAsString(), client2); + response->internalBodyBuffer()->startLoading(response->getExecutionContext(), FetchDataLoader::createLoaderAsString(), client1); + clonedResponse->internalBodyBuffer()->startLoading(response->getExecutionContext(), FetchDataLoader::createLoaderAsString(), client2); blink::testing::runPendingTasks(); }
diff --git a/third_party/WebKit/Source/modules/filesystem/DOMFileSystem.cpp b/third_party/WebKit/Source/modules/filesystem/DOMFileSystem.cpp index ac7affd..30b45265 100644 --- a/third_party/WebKit/Source/modules/filesystem/DOMFileSystem.cpp +++ b/third_party/WebKit/Source/modules/filesystem/DOMFileSystem.cpp
@@ -65,7 +65,7 @@ return 0; StringBuilder filesystemName; - filesystemName.append(createDatabaseIdentifierFromSecurityOrigin(context->securityOrigin())); + filesystemName.append(createDatabaseIdentifierFromSecurityOrigin(context->getSecurityOrigin())); filesystemName.appendLiteral(":Isolated_"); filesystemName.append(filesystemId); @@ -73,7 +73,7 @@ // is to be validated each time the request is being handled. StringBuilder rootURL; rootURL.appendLiteral("filesystem:"); - rootURL.append(context->securityOrigin()->toString()); + rootURL.append(context->getSecurityOrigin()->toString()); rootURL.append('/'); rootURL.append(isolatedPathPrefix); rootURL.append('/'); @@ -156,7 +156,7 @@ return; } - FileWriter* fileWriter = FileWriter::create(executionContext()); + FileWriter* fileWriter = FileWriter::create(getExecutionContext()); FileWriterBaseCallback* conversionCallback = ConvertToFileWriterCallback::create(successCallback); OwnPtr<AsyncFileSystemCallbacks> callbacks = FileWriterBaseCallbacks::create(fileWriter, conversionCallback, errorCallback, m_context); fileSystem()->createFileWriter(createFileSystemURL(fileEntry), fileWriter, callbacks.release());
diff --git a/third_party/WebKit/Source/modules/filesystem/DOMFileSystem.h b/third_party/WebKit/Source/modules/filesystem/DOMFileSystem.h index c7bee31..fe3072f9 100644 --- a/third_party/WebKit/Source/modules/filesystem/DOMFileSystem.h +++ b/third_party/WebKit/Source/modules/filesystem/DOMFileSystem.h
@@ -90,13 +90,13 @@ template <typename CB, typename CBArg> void scheduleCallback(CB* callback, CBArg* callbackArg) { - scheduleCallback(executionContext(), callback, callbackArg); + scheduleCallback(getExecutionContext(), callback, callbackArg); } template <typename CB, typename CBArg> void scheduleCallback(CB* callback, const CBArg& callbackArg) { - scheduleCallback(executionContext(), callback, callbackArg); + scheduleCallback(getExecutionContext(), callback, callbackArg); } DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp b/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp index 495e1a97..e6dcaa4 100644 --- a/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp +++ b/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp
@@ -85,9 +85,9 @@ return platform->fileSystem(); } -SecurityOrigin* DOMFileSystemBase::securityOrigin() const +SecurityOrigin* DOMFileSystemBase::getSecurityOrigin() const { - return m_context->securityOrigin(); + return m_context->getSecurityOrigin(); } bool DOMFileSystemBase::isValidType(FileSystemType type) @@ -146,7 +146,7 @@ // For external filesystem originString could be different from what we have in m_filesystemRootURL. StringBuilder result; result.appendLiteral("filesystem:"); - result.append(securityOrigin()->toString()); + result.append(getSecurityOrigin()->toString()); result.append('/'); result.append(externalPathPrefix); result.append(m_filesystemRootURL.path());
diff --git a/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.h b/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.h index 8eadb00..5fa5680 100644 --- a/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.h +++ b/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.h
@@ -87,7 +87,7 @@ FileSystemType type() const { return m_type; } KURL rootURL() const { return m_filesystemRootURL; } WebFileSystem* fileSystem() const; - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; // The clonable flag is used in the structured clone algorithm to test // whether the FileSystem API object is permitted to be cloned. It defaults
diff --git a/third_party/WebKit/Source/modules/filesystem/DOMWindowFileSystem.cpp b/third_party/WebKit/Source/modules/filesystem/DOMWindowFileSystem.cpp index 37fabb2..3a49a41 100644 --- a/third_party/WebKit/Source/modules/filesystem/DOMWindowFileSystem.cpp +++ b/third_party/WebKit/Source/modules/filesystem/DOMWindowFileSystem.cpp
@@ -51,10 +51,10 @@ if (!document) return; - if (SchemeRegistry::schemeShouldBypassContentSecurityPolicy(document->securityOrigin()->protocol())) + if (SchemeRegistry::schemeShouldBypassContentSecurityPolicy(document->getSecurityOrigin()->protocol())) UseCounter::count(document, UseCounter::RequestFileSystemNonWebbyOrigin); - if (!document->securityOrigin()->canAccessFileSystem()) { + if (!document->getSecurityOrigin()->canAccessFileSystem()) { DOMFileSystem::scheduleCallback(document, errorCallback, FileError::create(FileError::SECURITY_ERR)); return; } @@ -78,7 +78,7 @@ if (!document) return; - SecurityOrigin* securityOrigin = document->securityOrigin(); + SecurityOrigin* securityOrigin = document->getSecurityOrigin(); KURL completedURL = document->completeURL(url); if (!securityOrigin->canAccessFileSystem() || !securityOrigin->canRequest(completedURL)) { DOMFileSystem::scheduleCallback(document, errorCallback, FileError::create(FileError::SECURITY_ERR));
diff --git a/third_party/WebKit/Source/modules/filesystem/DataTransferItemFileSystem.cpp b/third_party/WebKit/Source/modules/filesystem/DataTransferItemFileSystem.cpp index 36d285b8..08f1f969 100644 --- a/third_party/WebKit/Source/modules/filesystem/DataTransferItemFileSystem.cpp +++ b/third_party/WebKit/Source/modules/filesystem/DataTransferItemFileSystem.cpp
@@ -49,7 +49,7 @@ // static Entry* DataTransferItemFileSystem::webkitGetAsEntry(ExecutionContext* executionContext, DataTransferItem& item) { - if (!item.dataObjectItem()->isFilename()) + if (!item.getDataObjectItem()->isFilename()) return 0; // For dragged files getAsFile must be pretty lightweight. @@ -59,7 +59,7 @@ return 0; ASSERT(file->isFile()); - DOMFileSystem* domFileSystem = DraggedIsolatedFileSystemImpl::getDOMFileSystem(item.dataTransfer()->dataObject(), executionContext); + DOMFileSystem* domFileSystem = DraggedIsolatedFileSystemImpl::getDOMFileSystem(item.getDataTransfer()->dataObject(), executionContext); if (!domFileSystem) { // IsolatedFileSystem may not be enabled. return 0;
diff --git a/third_party/WebKit/Source/modules/filesystem/DirectoryEntrySync.cpp b/third_party/WebKit/Source/modules/filesystem/DirectoryEntrySync.cpp index fd291be4..0662d63 100644 --- a/third_party/WebKit/Source/modules/filesystem/DirectoryEntrySync.cpp +++ b/third_party/WebKit/Source/modules/filesystem/DirectoryEntrySync.cpp
@@ -53,21 +53,21 @@ FileEntrySync* DirectoryEntrySync::getFile(const String& path, const FileSystemFlags& options, ExceptionState& exceptionState) { EntrySyncCallbackHelper* helper = EntrySyncCallbackHelper::create(); - m_fileSystem->getFile(this, path, options, helper->successCallback(), helper->errorCallback(), DOMFileSystemBase::Synchronous); + m_fileSystem->getFile(this, path, options, helper->getSuccessCallback(), helper->getErrorCallback(), DOMFileSystemBase::Synchronous); return static_cast<FileEntrySync*>(helper->getResult(exceptionState)); } DirectoryEntrySync* DirectoryEntrySync::getDirectory(const String& path, const FileSystemFlags& options, ExceptionState& exceptionState) { EntrySyncCallbackHelper* helper = EntrySyncCallbackHelper::create(); - m_fileSystem->getDirectory(this, path, options, helper->successCallback(), helper->errorCallback(), DOMFileSystemBase::Synchronous); + m_fileSystem->getDirectory(this, path, options, helper->getSuccessCallback(), helper->getErrorCallback(), DOMFileSystemBase::Synchronous); return static_cast<DirectoryEntrySync*>(helper->getResult(exceptionState)); } void DirectoryEntrySync::removeRecursively(ExceptionState& exceptionState) { VoidSyncCallbackHelper* helper = VoidSyncCallbackHelper::create(); - m_fileSystem->removeRecursively(this, helper->successCallback(), helper->errorCallback(), DOMFileSystemBase::Synchronous); + m_fileSystem->removeRecursively(this, helper->getSuccessCallback(), helper->getErrorCallback(), DOMFileSystemBase::Synchronous); helper->getResult(exceptionState); }
diff --git a/third_party/WebKit/Source/modules/filesystem/EntrySync.cpp b/third_party/WebKit/Source/modules/filesystem/EntrySync.cpp index 674ac3d..edbddc52 100644 --- a/third_party/WebKit/Source/modules/filesystem/EntrySync.cpp +++ b/third_party/WebKit/Source/modules/filesystem/EntrySync.cpp
@@ -52,28 +52,28 @@ Metadata* EntrySync::getMetadata(ExceptionState& exceptionState) { MetadataSyncCallbackHelper* helper = MetadataSyncCallbackHelper::create(); - m_fileSystem->getMetadata(this, helper->successCallback(), helper->errorCallback(), DOMFileSystemBase::Synchronous); + m_fileSystem->getMetadata(this, helper->getSuccessCallback(), helper->getErrorCallback(), DOMFileSystemBase::Synchronous); return helper->getResult(exceptionState); } EntrySync* EntrySync::moveTo(DirectoryEntrySync* parent, const String& name, ExceptionState& exceptionState) const { EntrySyncCallbackHelper* helper = EntrySyncCallbackHelper::create(); - m_fileSystem->move(this, parent, name, helper->successCallback(), helper->errorCallback(), DOMFileSystemBase::Synchronous); + m_fileSystem->move(this, parent, name, helper->getSuccessCallback(), helper->getErrorCallback(), DOMFileSystemBase::Synchronous); return helper->getResult(exceptionState); } EntrySync* EntrySync::copyTo(DirectoryEntrySync* parent, const String& name, ExceptionState& exceptionState) const { EntrySyncCallbackHelper* helper = EntrySyncCallbackHelper::create(); - m_fileSystem->copy(this, parent, name, helper->successCallback(), helper->errorCallback(), DOMFileSystemBase::Synchronous); + m_fileSystem->copy(this, parent, name, helper->getSuccessCallback(), helper->getErrorCallback(), DOMFileSystemBase::Synchronous); return helper->getResult(exceptionState); } void EntrySync::remove(ExceptionState& exceptionState) const { VoidSyncCallbackHelper* helper = VoidSyncCallbackHelper::create(); - m_fileSystem->remove(this, helper->successCallback(), helper->errorCallback(), DOMFileSystemBase::Synchronous); + m_fileSystem->remove(this, helper->getSuccessCallback(), helper->getErrorCallback(), DOMFileSystemBase::Synchronous); helper->getResult(exceptionState); }
diff --git a/third_party/WebKit/Source/modules/filesystem/FileWriter.cpp b/third_party/WebKit/Source/modules/filesystem/FileWriter.cpp index e8be4a3..7b96f2c 100644 --- a/third_party/WebKit/Source/modules/filesystem/FileWriter.cpp +++ b/third_party/WebKit/Source/modules/filesystem/FileWriter.cpp
@@ -249,7 +249,7 @@ void FileWriter::doOperation(Operation operation) { - m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(executionContext(), "FileWriter", m_asyncOperationId); + m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(getExecutionContext(), "FileWriter", m_asyncOperationId); switch (operation) { case OperationWrite: ASSERT(m_operationInProgress == OperationNone); @@ -298,13 +298,13 @@ fireEvent(EventTypeNames::write); fireEvent(EventTypeNames::writeend); - InspectorInstrumentation::traceAsyncOperationCompleted(executionContext(), m_asyncOperationId); + InspectorInstrumentation::traceAsyncOperationCompleted(getExecutionContext(), m_asyncOperationId); m_asyncOperationId = 0; } void FileWriter::fireEvent(const AtomicString& type) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(getExecutionContext(), m_asyncOperationId); ++m_recursionDepth; dispatchEvent(ProgressEvent::create(type, true, m_bytesWritten, m_bytesToWrite)); --m_recursionDepth;
diff --git a/third_party/WebKit/Source/modules/filesystem/FileWriter.h b/third_party/WebKit/Source/modules/filesystem/FileWriter.h index f59e2f6..a2653a1 100644 --- a/third_party/WebKit/Source/modules/filesystem/FileWriter.h +++ b/third_party/WebKit/Source/modules/filesystem/FileWriter.h
@@ -86,7 +86,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override { return ActiveDOMObject::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ActiveDOMObject::getExecutionContext(); } DEFINE_ATTRIBUTE_EVENT_LISTENER(writestart); DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
diff --git a/third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp b/third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp index 6e4cb88..3a5a7b73 100644 --- a/third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp +++ b/third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp
@@ -162,7 +162,7 @@ return; } - KURL storagePartition = KURL(KURL(), context->securityOrigin()->toString()); + KURL storagePartition = KURL(KURL(), context->getSecurityOrigin()->toString()); fileSystem()->openFileSystem(storagePartition, static_cast<WebFileSystemType>(type), callbacks->release()); } @@ -187,7 +187,7 @@ fileSystemNotAvailable(context, callbacks); return; } - KURL storagePartition = KURL(KURL(), context->securityOrigin()->toString()); + KURL storagePartition = KURL(KURL(), context->getSecurityOrigin()->toString()); fileSystem()->deleteFileSystem(storagePartition, static_cast<WebFileSystemType>(type), callbacks->release()); }
diff --git a/third_party/WebKit/Source/modules/filesystem/SyncCallbackHelper.h b/third_party/WebKit/Source/modules/filesystem/SyncCallbackHelper.h index a954d2a..4d8ec6d 100644 --- a/third_party/WebKit/Source/modules/filesystem/SyncCallbackHelper.h +++ b/third_party/WebKit/Source/modules/filesystem/SyncCallbackHelper.h
@@ -82,8 +82,8 @@ return m_result; } - SuccessCallback* successCallback() { return SuccessCallbackImpl::create(this); } - ErrorCallback* errorCallback() { return ErrorCallbackImpl::create(this); } + SuccessCallback* getSuccessCallback() { return SuccessCallbackImpl::create(this); } + ErrorCallback* getErrorCallback() { return ErrorCallbackImpl::create(this); } DEFINE_INLINE_TRACE() {
diff --git a/third_party/WebKit/Source/modules/filesystem/WorkerGlobalScopeFileSystem.cpp b/third_party/WebKit/Source/modules/filesystem/WorkerGlobalScopeFileSystem.cpp index caa7b4c..50fcd54 100644 --- a/third_party/WebKit/Source/modules/filesystem/WorkerGlobalScopeFileSystem.cpp +++ b/third_party/WebKit/Source/modules/filesystem/WorkerGlobalScopeFileSystem.cpp
@@ -46,8 +46,8 @@ void WorkerGlobalScopeFileSystem::webkitRequestFileSystem(WorkerGlobalScope& worker, int type, long long size, FileSystemCallback* successCallback, ErrorCallback* errorCallback) { - ExecutionContext* secureContext = worker.executionContext(); - if (!secureContext->securityOrigin()->canAccessFileSystem()) { + ExecutionContext* secureContext = worker.getExecutionContext(); + if (!secureContext->getSecurityOrigin()->canAccessFileSystem()) { DOMFileSystem::scheduleCallback(&worker, errorCallback, FileError::create(FileError::SECURITY_ERR)); return; } @@ -63,8 +63,8 @@ DOMFileSystemSync* WorkerGlobalScopeFileSystem::webkitRequestFileSystemSync(WorkerGlobalScope& worker, int type, long long size, ExceptionState& exceptionState) { - ExecutionContext* secureContext = worker.executionContext(); - if (!secureContext->securityOrigin()->canAccessFileSystem()) { + ExecutionContext* secureContext = worker.getExecutionContext(); + if (!secureContext->getSecurityOrigin()->canAccessFileSystem()) { exceptionState.throwSecurityError(FileError::securityErrorMessage); return 0; } @@ -76,7 +76,7 @@ } FileSystemSyncCallbackHelper* helper = FileSystemSyncCallbackHelper::create(); - OwnPtr<AsyncFileSystemCallbacks> callbacks = FileSystemCallbacks::create(helper->successCallback(), helper->errorCallback(), &worker, fileSystemType); + OwnPtr<AsyncFileSystemCallbacks> callbacks = FileSystemCallbacks::create(helper->getSuccessCallback(), helper->getErrorCallback(), &worker, fileSystemType); callbacks->setShouldBlockUntilCompletion(true); LocalFileSystem::from(worker)->requestFileSystem(&worker, fileSystemType, size, callbacks.release()); @@ -86,8 +86,8 @@ void WorkerGlobalScopeFileSystem::webkitResolveLocalFileSystemURL(WorkerGlobalScope& worker, const String& url, EntryCallback* successCallback, ErrorCallback* errorCallback) { KURL completedURL = worker.completeURL(url); - ExecutionContext* secureContext = worker.executionContext(); - if (!secureContext->securityOrigin()->canAccessFileSystem() || !secureContext->securityOrigin()->canRequest(completedURL)) { + ExecutionContext* secureContext = worker.getExecutionContext(); + if (!secureContext->getSecurityOrigin()->canAccessFileSystem() || !secureContext->getSecurityOrigin()->canRequest(completedURL)) { DOMFileSystem::scheduleCallback(&worker, errorCallback, FileError::create(FileError::SECURITY_ERR)); return; } @@ -103,8 +103,8 @@ EntrySync* WorkerGlobalScopeFileSystem::webkitResolveLocalFileSystemSyncURL(WorkerGlobalScope& worker, const String& url, ExceptionState& exceptionState) { KURL completedURL = worker.completeURL(url); - ExecutionContext* secureContext = worker.executionContext(); - if (!secureContext->securityOrigin()->canAccessFileSystem() || !secureContext->securityOrigin()->canRequest(completedURL)) { + ExecutionContext* secureContext = worker.getExecutionContext(); + if (!secureContext->getSecurityOrigin()->canAccessFileSystem() || !secureContext->getSecurityOrigin()->canRequest(completedURL)) { exceptionState.throwSecurityError(FileError::securityErrorMessage); return 0; } @@ -115,7 +115,7 @@ } EntrySyncCallbackHelper* resolveURLHelper = EntrySyncCallbackHelper::create(); - OwnPtr<AsyncFileSystemCallbacks> callbacks = ResolveURICallbacks::create(resolveURLHelper->successCallback(), resolveURLHelper->errorCallback(), &worker); + OwnPtr<AsyncFileSystemCallbacks> callbacks = ResolveURICallbacks::create(resolveURLHelper->getSuccessCallback(), resolveURLHelper->getErrorCallback(), &worker); callbacks->setShouldBlockUntilCompletion(true); LocalFileSystem::from(worker)->resolveURL(&worker, completedURL, callbacks.release());
diff --git a/third_party/WebKit/Source/modules/gamepad/GamepadEvent.h b/third_party/WebKit/Source/modules/gamepad/GamepadEvent.h index b1a1a5d..b12e555 100644 --- a/third_party/WebKit/Source/modules/gamepad/GamepadEvent.h +++ b/third_party/WebKit/Source/modules/gamepad/GamepadEvent.h
@@ -28,7 +28,7 @@ } ~GamepadEvent() override; - Gamepad* gamepad() const { return m_gamepad.get(); } + Gamepad* getGamepad() const { return m_gamepad.get(); } const AtomicString& interfaceName() const override;
diff --git a/third_party/WebKit/Source/modules/gamepad/GamepadEvent.idl b/third_party/WebKit/Source/modules/gamepad/GamepadEvent.idl index 86c0b2a..0f5f9103 100644 --- a/third_party/WebKit/Source/modules/gamepad/GamepadEvent.idl +++ b/third_party/WebKit/Source/modules/gamepad/GamepadEvent.idl
@@ -7,5 +7,5 @@ [ Constructor(DOMString type, optional GamepadEventInit eventInitDict), ] interface GamepadEvent : Event { - readonly attribute Gamepad gamepad; + [ImplementedAs=getGamepad] readonly attribute Gamepad gamepad; };
diff --git a/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp b/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp index 634e8783..19d50a7c 100644 --- a/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp +++ b/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp
@@ -112,7 +112,7 @@ Document* Geolocation::document() const { - return toDocument(executionContext()); + return toDocument(getExecutionContext()); } LocalFrame* Geolocation::frame() const @@ -187,7 +187,7 @@ int watchID; // Keep asking for the next id until we're given one that we don't already have. do { - watchID = executionContext()->circularSequentialID(); + watchID = getExecutionContext()->circularSequentialID(); } while (!m_watchers.add(watchID, notifier)); return watchID; } @@ -196,7 +196,7 @@ { recordOriginTypeAccess(); String errorMessage; - if (!frame()->settings()->allowGeolocationOnInsecureOrigins() && !executionContext()->isSecureContext(errorMessage)) { + if (!frame()->settings()->allowGeolocationOnInsecureOrigins() && !getExecutionContext()->isSecureContext(errorMessage)) { notifier->setFatalError(PositionError::create(PositionError::PERMISSION_DENIED, errorMessage)); return; }
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp index cdac175..4dba150 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp
@@ -345,10 +345,10 @@ m_backend.clear(); } - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return; - EventQueue* eventQueue = executionContext()->eventQueue(); + EventQueue* eventQueue = getExecutionContext()->getEventQueue(); // Remove any pending versionchange events scheduled to fire on this // connection. They would have been scheduled by the backend when another // connection attempted an upgrade, but the frontend connection is being @@ -362,7 +362,7 @@ void IDBDatabase::onVersionChange(int64_t oldVersion, int64_t newVersion) { IDB_TRACE("IDBDatabase::onVersionChange"); - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return; if (m_closePending) { @@ -380,8 +380,8 @@ void IDBDatabase::enqueueEvent(PassRefPtrWillBeRawPtr<Event> event) { ASSERT(!m_contextStopped); - ASSERT(executionContext()); - EventQueue* eventQueue = executionContext()->eventQueue(); + ASSERT(getExecutionContext()); + EventQueue* eventQueue = getExecutionContext()->getEventQueue(); event->setTarget(this); eventQueue->enqueueEvent(event.get()); m_enqueuedEvents.append(event); @@ -390,7 +390,7 @@ DispatchEventResult IDBDatabase::dispatchEventInternal(PassRefPtrWillBeRawPtr<Event> event) { IDB_TRACE("IDBDatabase::dispatchEvent"); - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return DispatchEventResult::CanceledBeforeDispatch; ASSERT(event->type() == EventTypeNames::versionchange || event->type() == EventTypeNames::close); for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { @@ -440,9 +440,9 @@ return EventTargetNames::IDBDatabase; } -ExecutionContext* IDBDatabase::executionContext() const +ExecutionContext* IDBDatabase::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } void IDBDatabase::recordApiCallsHistogram(IndexedDatabaseMethods method)
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.h b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.h index 68ea08d..2f81278 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.h +++ b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.h
@@ -96,7 +96,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; bool isClosePending() const { return m_closePending; } void forceClose();
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBFactory.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBFactory.cpp index 7707991..75e0235 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBFactory.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBFactory.cpp
@@ -73,21 +73,21 @@ IDBRequest* IDBFactory::getDatabaseNames(ScriptState* scriptState, ExceptionState& exceptionState) { IDB_TRACE("IDBFactory::getDatabaseNames"); - if (!isContextValid(scriptState->executionContext())) + if (!isContextValid(scriptState->getExecutionContext())) return nullptr; - if (!scriptState->executionContext()->securityOrigin()->canAccessDatabase()) { + if (!scriptState->getExecutionContext()->getSecurityOrigin()->canAccessDatabase()) { exceptionState.throwSecurityError("access to the Indexed Database API is denied in this context."); return nullptr; } IDBRequest* request = IDBRequest::create(scriptState, IDBAny::createNull(), nullptr); - if (!m_permissionClient->allowIndexedDB(scriptState->executionContext(), "Database Listing")) { + if (!m_permissionClient->allowIndexedDB(scriptState->getExecutionContext(), "Database Listing")) { request->onError(DOMException::create(UnknownError, permissionDeniedErrorMessage)); return request; } - Platform::current()->idbFactory()->getDatabaseNames(WebIDBCallbacksImpl::create(request).leakPtr(), WebSecurityOrigin(scriptState->executionContext()->securityOrigin())); + Platform::current()->idbFactory()->getDatabaseNames(WebIDBCallbacksImpl::create(request).leakPtr(), WebSecurityOrigin(scriptState->getExecutionContext()->getSecurityOrigin())); return request; } @@ -105,9 +105,9 @@ { IDBDatabase::recordApiCallsHistogram(IDBOpenCall); ASSERT(version >= 1 || version == IDBDatabaseMetadata::NoVersion); - if (!isContextValid(scriptState->executionContext())) + if (!isContextValid(scriptState->getExecutionContext())) return nullptr; - if (!scriptState->executionContext()->securityOrigin()->canAccessDatabase()) { + if (!scriptState->getExecutionContext()->getSecurityOrigin()->canAccessDatabase()) { exceptionState.throwSecurityError("access to the Indexed Database API is denied in this context."); return nullptr; } @@ -116,12 +116,12 @@ int64_t transactionId = IDBDatabase::nextTransactionId(); IDBOpenDBRequest* request = IDBOpenDBRequest::create(scriptState, databaseCallbacks, transactionId, version); - if (!m_permissionClient->allowIndexedDB(scriptState->executionContext(), name)) { + if (!m_permissionClient->allowIndexedDB(scriptState->getExecutionContext(), name)) { request->onError(DOMException::create(UnknownError, permissionDeniedErrorMessage)); return request; } - Platform::current()->idbFactory()->open(name, version, transactionId, WebIDBCallbacksImpl::create(request).leakPtr(), WebIDBDatabaseCallbacksImpl::create(databaseCallbacks).leakPtr(), WebSecurityOrigin(scriptState->executionContext()->securityOrigin())); + Platform::current()->idbFactory()->open(name, version, transactionId, WebIDBCallbacksImpl::create(request).leakPtr(), WebIDBDatabaseCallbacksImpl::create(databaseCallbacks).leakPtr(), WebSecurityOrigin(scriptState->getExecutionContext()->getSecurityOrigin())); return request; } @@ -135,21 +135,21 @@ { IDB_TRACE("IDBFactory::deleteDatabase"); IDBDatabase::recordApiCallsHistogram(IDBDeleteDatabaseCall); - if (!isContextValid(scriptState->executionContext())) + if (!isContextValid(scriptState->getExecutionContext())) return nullptr; - if (!scriptState->executionContext()->securityOrigin()->canAccessDatabase()) { + if (!scriptState->getExecutionContext()->getSecurityOrigin()->canAccessDatabase()) { exceptionState.throwSecurityError("access to the Indexed Database API is denied in this context."); return nullptr; } IDBOpenDBRequest* request = IDBOpenDBRequest::create(scriptState, nullptr, 0, IDBDatabaseMetadata::DefaultVersion); - if (!m_permissionClient->allowIndexedDB(scriptState->executionContext(), name)) { + if (!m_permissionClient->allowIndexedDB(scriptState->getExecutionContext(), name)) { request->onError(DOMException::create(UnknownError, permissionDeniedErrorMessage)); return request; } - Platform::current()->idbFactory()->deleteDatabase(name, WebIDBCallbacksImpl::create(request).leakPtr(), WebSecurityOrigin(scriptState->executionContext()->securityOrigin())); + Platform::current()->idbFactory()->deleteDatabase(name, WebIDBCallbacksImpl::create(request).leakPtr(), WebSecurityOrigin(scriptState->getExecutionContext()->getSecurityOrigin())); return request; }
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp index 0170a98c..b7340d4 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp
@@ -85,7 +85,7 @@ return nullptr; } WebIDBCursorDirection direction = IDBCursor::stringToDirection(directionString); - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), range, exceptionState); if (exceptionState.hadException()) return nullptr; @@ -121,7 +121,7 @@ return nullptr; } - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), range, exceptionState); if (exceptionState.hadException()) return nullptr; @@ -151,7 +151,7 @@ return nullptr; } WebIDBCursorDirection direction = IDBCursor::stringToDirection(directionString); - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), range, exceptionState); if (exceptionState.hadException()) return nullptr; if (!backendDB()) { @@ -214,7 +214,7 @@ return nullptr; } - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), key, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), key, exceptionState); if (exceptionState.hadException()) return nullptr; if (!keyRange) { @@ -249,7 +249,7 @@ return nullptr; } - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), range, exceptionState); if (exceptionState.hadException()) return nullptr; if (!backendDB()) {
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp index a367c5b..175b888 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp
@@ -99,7 +99,7 @@ exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); return nullptr; } - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), key, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), key, exceptionState); if (exceptionState.hadException()) return nullptr; if (!keyRange) { @@ -139,7 +139,7 @@ exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); return nullptr; } - IDBKeyRange* range = IDBKeyRange::fromScriptValue(scriptState->executionContext(), keyRange, exceptionState); + IDBKeyRange* range = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), keyRange, exceptionState); if (exceptionState.hadException()) return nullptr; if (!backendDB()) { @@ -175,7 +175,7 @@ exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); return nullptr; } - IDBKeyRange* range = IDBKeyRange::fromScriptValue(scriptState->executionContext(), keyRange, exceptionState); + IDBKeyRange* range = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), keyRange, exceptionState); if (exceptionState.hadException()) return nullptr; if (!backendDB()) { @@ -361,7 +361,7 @@ return nullptr; } - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), key, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), key, exceptionState); if (exceptionState.hadException()) return nullptr; if (!keyRange) { @@ -444,7 +444,7 @@ void handleEvent(ExecutionContext* executionContext, Event* event) override { - ASSERT(m_scriptState->executionContext() == executionContext); + ASSERT(m_scriptState->getExecutionContext() == executionContext); ASSERT(event->type() == EventTypeNames::success); EventTarget* target = event->target(); IDBRequest* request = static_cast<IDBRequest*>(target); @@ -644,7 +644,7 @@ } WebIDBCursorDirection direction = IDBCursor::stringToDirection(directionString); - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), range, exceptionState); if (exceptionState.hadException()) return nullptr; @@ -682,7 +682,7 @@ } WebIDBCursorDirection direction = IDBCursor::stringToDirection(directionString); - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), range, exceptionState); if (exceptionState.hadException()) return nullptr; @@ -714,7 +714,7 @@ return nullptr; } - IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->getExecutionContext(), range, exceptionState); if (exceptionState.hadException()) return nullptr;
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBOpenDBRequest.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBOpenDBRequest.cpp index a0e58696..d7569ae0 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBOpenDBRequest.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBOpenDBRequest.cpp
@@ -81,7 +81,7 @@ void IDBOpenDBRequest::onUpgradeNeeded(int64_t oldVersion, PassOwnPtr<WebIDBDatabase> backend, const IDBDatabaseMetadata& metadata, WebIDBDataLoss dataLoss, String dataLossMessage) { IDB_TRACE("IDBOpenDBRequest::onUpgradeNeeded()"); - if (m_contextStopped || !executionContext()) { + if (m_contextStopped || !getExecutionContext()) { OwnPtr<WebIDBDatabase> db = backend; db->abort(m_transactionId); db->close(); @@ -92,7 +92,7 @@ ASSERT(m_databaseCallbacks); - IDBDatabase* idbDatabase = IDBDatabase::create(executionContext(), backend, m_databaseCallbacks.release()); + IDBDatabase* idbDatabase = IDBDatabase::create(getExecutionContext(), backend, m_databaseCallbacks.release()); idbDatabase->setMetadata(metadata); if (oldVersion == IDBDatabaseMetadata::NoVersion) { @@ -102,7 +102,7 @@ IDBDatabaseMetadata oldMetadata(metadata); oldMetadata.version = oldVersion; - m_transaction = IDBTransaction::create(scriptState(), m_transactionId, idbDatabase, this, oldMetadata); + m_transaction = IDBTransaction::create(getScriptState(), m_transactionId, idbDatabase, this, oldMetadata); setResult(IDBAny::create(idbDatabase)); if (m_version == IDBDatabaseMetadata::NoVersion) @@ -113,7 +113,7 @@ void IDBOpenDBRequest::onSuccess(PassOwnPtr<WebIDBDatabase> backend, const IDBDatabaseMetadata& metadata) { IDB_TRACE("IDBOpenDBRequest::onSuccess()"); - if (m_contextStopped || !executionContext()) { + if (m_contextStopped || !getExecutionContext()) { OwnPtr<WebIDBDatabase> db = backend; if (db) db->close(); @@ -132,7 +132,7 @@ } else { ASSERT(backend.get()); ASSERT(m_databaseCallbacks); - idbDatabase = IDBDatabase::create(executionContext(), backend, m_databaseCallbacks.release()); + idbDatabase = IDBDatabase::create(getExecutionContext(), backend, m_databaseCallbacks.release()); setResult(IDBAny::create(idbDatabase)); } idbDatabase->setMetadata(metadata); @@ -154,7 +154,7 @@ bool IDBOpenDBRequest::shouldEnqueueEvent() const { - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return false; ASSERT(m_readyState == PENDING || m_readyState == DONE); if (m_requestAborted)
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp index 94116b6d..fbf20c9 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp
@@ -60,7 +60,7 @@ } IDBRequest::IDBRequest(ScriptState* scriptState, IDBAny* source, IDBTransaction* transaction) - : ActiveDOMObject(scriptState->executionContext()) + : ActiveDOMObject(scriptState->getExecutionContext()) , m_transaction(transaction) , m_scriptState(scriptState) , m_source(source) @@ -69,7 +69,7 @@ IDBRequest::~IDBRequest() { - ASSERT(m_readyState == DONE || m_readyState == EarlyDeath || !executionContext()); + ASSERT(m_readyState == DONE || m_readyState == EarlyDeath || !getExecutionContext()); } DEFINE_TRACE(IDBRequest) @@ -92,7 +92,7 @@ exceptionState.throwDOMException(InvalidStateError, IDBDatabase::requestNotFinishedErrorMessage); return ScriptValue(); } - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return ScriptValue(); m_resultDirty = false; ScriptValue value = ScriptValue::from(m_scriptState.get(), m_result); @@ -110,7 +110,7 @@ ScriptValue IDBRequest::source() const { - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return ScriptValue(); return ScriptValue::from(m_scriptState.get(), m_source); @@ -129,13 +129,13 @@ void IDBRequest::abort() { ASSERT(!m_requestAborted); - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return; ASSERT(m_readyState == PENDING || m_readyState == DONE); if (m_readyState == DONE) return; - EventQueue* eventQueue = executionContext()->eventQueue(); + EventQueue* eventQueue = getExecutionContext()->getEventQueue(); for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { bool removed = eventQueue->cancelEvent(m_enqueuedEvents[i].get()); ASSERT_UNUSED(removed, removed); @@ -159,7 +159,7 @@ void IDBRequest::setPendingCursor(IDBCursor* cursor) { ASSERT(m_readyState == DONE); - ASSERT(executionContext()); + ASSERT(getExecutionContext()); ASSERT(m_transaction); ASSERT(!m_pendingCursor); ASSERT(cursor == getResultCursor()); @@ -211,7 +211,7 @@ bool IDBRequest::shouldEnqueueEvent() const { - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return false; ASSERT(m_readyState == PENDING || m_readyState == DONE); if (m_requestAborted) @@ -405,15 +405,15 @@ return EventTargetNames::IDBRequest; } -ExecutionContext* IDBRequest::executionContext() const +ExecutionContext* IDBRequest::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } DispatchEventResult IDBRequest::dispatchEventInternal(PassRefPtrWillBeRawPtr<Event> event) { IDB_TRACE("IDBRequest::dispatchEvent"); - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return DispatchEventResult::CanceledBeforeDispatch; ASSERT(m_readyState == PENDING); ASSERT(m_hasPendingActivity); @@ -500,7 +500,7 @@ ASSERT(m_transaction->isVersionChange()); ASSERT(m_didFireUpgradeNeededEvent); ASSERT(m_readyState == DONE); - ASSERT(executionContext()); + ASSERT(getExecutionContext()); m_transaction.clear(); if (m_contextStopped) @@ -513,12 +513,12 @@ { ASSERT(m_readyState == PENDING || m_readyState == DONE); - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return; ASSERT_WITH_MESSAGE(m_readyState == PENDING || m_didFireUpgradeNeededEvent, "When queueing event %s, m_readyState was %d", event->type().utf8().data(), m_readyState); - EventQueue* eventQueue = executionContext()->eventQueue(); + EventQueue* eventQueue = getExecutionContext()->getEventQueue(); event->setTarget(this); // Keep track of enqueued events in case we need to abort prior to dispatch,
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.h b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.h index c294a669..d5b31347 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.h +++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.h
@@ -65,7 +65,7 @@ ~IDBRequest() override; DECLARE_VIRTUAL_TRACE(); - ScriptState* scriptState() { return m_scriptState.get(); } + ScriptState* getScriptState() { return m_scriptState.get(); } ScriptValue result(ExceptionState&); DOMException* error(ExceptionState&) const; ScriptValue source() const; @@ -115,7 +115,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const final; + ExecutionContext* getExecutionContext() const final; void uncaughtExceptionInEventHandler() final; // Called by a version change transaction that has finished to set this
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBRequestTest.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBRequestTest.cpp index 66ab399..97f8da18 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBRequestTest.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequestTest.cpp
@@ -59,18 +59,18 @@ void SetUp() override { m_executionContext = adoptRefWillBeNoop(new NullExecutionContext()); - m_scope.scriptState()->setExecutionContext(m_executionContext.get()); + m_scope.getScriptState()->setExecutionContext(m_executionContext.get()); } void TearDown() override { m_executionContext->notifyContextDestroyed(); - m_scope.scriptState()->setExecutionContext(nullptr); + m_scope.getScriptState()->setExecutionContext(nullptr); } v8::Isolate* isolate() const { return m_scope.isolate(); } - ScriptState* scriptState() const { return m_scope.scriptState(); } - ExecutionContext* executionContext() const { return m_scope.scriptState()->executionContext(); } + ScriptState* getScriptState() const { return m_scope.getScriptState(); } + ExecutionContext* getExecutionContext() const { return m_scope.getScriptState()->getExecutionContext(); } private: V8TestingScope m_scope; @@ -80,9 +80,9 @@ TEST_F(IDBRequestTest, EventsAfterStopping) { IDBTransaction* transaction = nullptr; - IDBRequest* request = IDBRequest::create(scriptState(), IDBAny::createUndefined(), transaction); + IDBRequest* request = IDBRequest::create(getScriptState(), IDBAny::createUndefined(), transaction); EXPECT_EQ(request->readyState(), "pending"); - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); // Ensure none of the following raise assertions in stopped state: request->onError(DOMException::create(AbortError, "Description goes here.")); @@ -98,7 +98,7 @@ TEST_F(IDBRequestTest, AbortErrorAfterAbort) { IDBTransaction* transaction = nullptr; - IDBRequest* request = IDBRequest::create(scriptState(), IDBAny::createUndefined(), transaction); + IDBRequest* request = IDBRequest::create(getScriptState(), IDBAny::createUndefined(), transaction); EXPECT_EQ(request->readyState(), "pending"); // Simulate the IDBTransaction having received onAbort from back end and aborting the request: @@ -110,7 +110,7 @@ // Stop the request lest it be GCed and its destructor // finds the object in a pending state (and asserts.) - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); } TEST_F(IDBRequestTest, ConnectionsAfterStopping) @@ -127,10 +127,10 @@ .Times(1); EXPECT_CALL(*backend, close()) .Times(1); - IDBOpenDBRequest* request = IDBOpenDBRequest::create(scriptState(), callbacks, transactionId, version); + IDBOpenDBRequest* request = IDBOpenDBRequest::create(getScriptState(), callbacks, transactionId, version); EXPECT_EQ(request->readyState(), "pending"); - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); request->onUpgradeNeeded(oldVersion, backend.release(), metadata, WebIDBDataLossNone, String()); } @@ -138,10 +138,10 @@ OwnPtr<MockWebIDBDatabase> backend = MockWebIDBDatabase::create(); EXPECT_CALL(*backend, close()) .Times(1); - IDBOpenDBRequest* request = IDBOpenDBRequest::create(scriptState(), callbacks, transactionId, version); + IDBOpenDBRequest* request = IDBOpenDBRequest::create(getScriptState(), callbacks, transactionId, version); EXPECT_EQ(request->readyState(), "pending"); - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); request->onSuccess(backend.release(), metadata); } }
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp index c9d648a..85babfb 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp
@@ -84,7 +84,7 @@ } // namespace IDBTransaction::IDBTransaction(ScriptState* scriptState, int64_t id, const HashSet<String>& objectStoreNames, WebIDBTransactionMode mode, IDBDatabase* db, IDBOpenDBRequest* openDBRequest, const IDBDatabaseMetadata& previousMetadata) - : ActiveDOMObject(scriptState->executionContext()) + : ActiveDOMObject(scriptState->getExecutionContext()) , m_id(id) , m_database(db) , m_objectStoreNames(objectStoreNames) @@ -339,21 +339,21 @@ return EventTargetNames::IDBTransaction; } -ExecutionContext* IDBTransaction::executionContext() const +ExecutionContext* IDBTransaction::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } DispatchEventResult IDBTransaction::dispatchEventInternal(PassRefPtrWillBeRawPtr<Event> event) { IDB_TRACE("IDBTransaction::dispatchEvent"); - if (m_contextStopped || !executionContext()) { + if (m_contextStopped || !getExecutionContext()) { m_state = Finished; return DispatchEventResult::CanceledBeforeDispatch; } ASSERT(m_state != Finished); ASSERT(m_hasPendingActivity); - ASSERT(executionContext()); + ASSERT(getExecutionContext()); ASSERT(event->target() == this); m_state = Finished; @@ -395,10 +395,10 @@ void IDBTransaction::enqueueEvent(PassRefPtrWillBeRawPtr<Event> event) { ASSERT_WITH_MESSAGE(m_state != Finished, "A finished transaction tried to enqueue an event of type %s.", event->type().utf8().data()); - if (m_contextStopped || !executionContext()) + if (m_contextStopped || !getExecutionContext()) return; - EventQueue* eventQueue = executionContext()->eventQueue(); + EventQueue* eventQueue = getExecutionContext()->getEventQueue(); event->setTarget(this); eventQueue->enqueueEvent(event); }
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.h b/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.h index d733d22..5a0cda5 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.h +++ b/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.h
@@ -96,7 +96,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject bool hasPendingActivity() const override;
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBTransactionTest.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBTransactionTest.cpp index fa4850f..4bafd6a 100644 --- a/third_party/WebKit/Source/modules/indexeddb/IDBTransactionTest.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/IDBTransactionTest.cpp
@@ -54,18 +54,18 @@ void SetUp() override { m_executionContext = Document::create(); - m_scope.scriptState()->setExecutionContext(m_executionContext.get()); + m_scope.getScriptState()->setExecutionContext(m_executionContext.get()); } void TearDown() override { m_executionContext->notifyContextDestroyed(); - m_scope.scriptState()->setExecutionContext(nullptr); + m_scope.getScriptState()->setExecutionContext(nullptr); } v8::Isolate* isolate() const { return m_scope.isolate(); } - ScriptState* scriptState() const { return m_scope.scriptState(); } - ExecutionContext* executionContext() { return m_scope.scriptState()->executionContext(); } + ScriptState* getScriptState() const { return m_scope.getScriptState(); } + ExecutionContext* getExecutionContext() { return m_scope.getScriptState()->getExecutionContext(); } void deactivateNewTransactions() { @@ -93,18 +93,18 @@ OwnPtr<MockWebIDBDatabase> backend = MockWebIDBDatabase::create(); EXPECT_CALL(*backend, close()) .Times(1); - Persistent<IDBDatabase> db = IDBDatabase::create(executionContext(), backend.release(), FakeIDBDatabaseCallbacks::create()); + Persistent<IDBDatabase> db = IDBDatabase::create(getExecutionContext(), backend.release(), FakeIDBDatabaseCallbacks::create()); const int64_t transactionId = 1234; const HashSet<String> transactionScope = HashSet<String>(); - Persistent<IDBTransaction> transaction = IDBTransaction::create(scriptState(), transactionId, transactionScope, WebIDBTransactionModeReadOnly, db.get()); + Persistent<IDBTransaction> transaction = IDBTransaction::create(getScriptState(), transactionId, transactionScope, WebIDBTransactionModeReadOnly, db.get()); PersistentHeapHashSet<WeakMember<IDBTransaction>> set; set.add(transaction); Heap::collectAllGarbage(); EXPECT_EQ(1u, set.size()); - Persistent<IDBRequest> request = IDBRequest::create(scriptState(), IDBAny::createUndefined(), transaction.get()); + Persistent<IDBRequest> request = IDBRequest::create(getScriptState(), IDBAny::createUndefined(), transaction.get()); deactivateNewTransactions(); Heap::collectAllGarbage(); @@ -112,7 +112,7 @@ // This will generate an abort() call to the back end which is dropped by the fake proxy, // so an explicit onAbort call is made. - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); transaction->onAbort(DOMException::create(AbortError, "Aborted")); transaction.clear(); @@ -129,10 +129,10 @@ .Times(1); EXPECT_CALL(*backend, close()) .Times(1); - Persistent<IDBDatabase> db = IDBDatabase::create(executionContext(), backend.release(), FakeIDBDatabaseCallbacks::create()); + Persistent<IDBDatabase> db = IDBDatabase::create(getExecutionContext(), backend.release(), FakeIDBDatabaseCallbacks::create()); const HashSet<String> transactionScope = HashSet<String>(); - Persistent<IDBTransaction> transaction = IDBTransaction::create(scriptState(), transactionId, transactionScope, WebIDBTransactionModeReadOnly, db.get()); + Persistent<IDBTransaction> transaction = IDBTransaction::create(getScriptState(), transactionId, transactionScope, WebIDBTransactionModeReadOnly, db.get()); PersistentHeapHashSet<WeakMember<IDBTransaction>> set; set.add(transaction); @@ -150,7 +150,7 @@ EXPECT_EQ(1u, set.size()); // Stop the context, so events don't get queued (which would keep the transaction alive). - executionContext()->stopActiveDOMObjects(); + getExecutionContext()->stopActiveDOMObjects(); // Fire an abort to make sure this doesn't free the transaction during use. The test // will not fail if it is, but ASAN would notice the error.
diff --git a/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp b/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp index 3ef92985..77a0354 100644 --- a/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp
@@ -142,9 +142,9 @@ virtual ~ExecutableWithDatabase() { } void start(IDBFactory*, SecurityOrigin*, const String& databaseName); virtual void execute(IDBDatabase*) = 0; - virtual RequestCallback* requestCallback() = 0; - ExecutionContext* context() const { return m_scriptState->executionContext(); } - ScriptState* scriptState() const { return m_scriptState.get(); } + virtual RequestCallback* getRequestCallback() = 0; + ExecutionContext* context() const { return m_scriptState->getExecutionContext(); } + ScriptState* getScriptState() const { return m_scriptState.get(); } private: RefPtr<ScriptState> m_scriptState; }; @@ -166,20 +166,20 @@ void handleEvent(ExecutionContext* context, Event* event) override { if (event->type() != EventTypeNames::success) { - m_executableWithDatabase->requestCallback()->sendFailure("Unexpected event type."); + m_executableWithDatabase->getRequestCallback()->sendFailure("Unexpected event type."); return; } IDBOpenDBRequest* idbOpenDBRequest = static_cast<IDBOpenDBRequest*>(event->target()); IDBAny* requestResult = idbOpenDBRequest->resultAsAny(); if (requestResult->getType() != IDBAny::IDBDatabaseType) { - m_executableWithDatabase->requestCallback()->sendFailure("Unexpected result type."); + m_executableWithDatabase->getRequestCallback()->sendFailure("Unexpected result type."); return; } IDBDatabase* idbDatabase = requestResult->idbDatabase(); m_executableWithDatabase->execute(idbDatabase); - V8PerIsolateData::from(m_executableWithDatabase->scriptState()->isolate())->runEndOfScopeTasks(); + V8PerIsolateData::from(m_executableWithDatabase->getScriptState()->isolate())->runEndOfScopeTasks(); idbDatabase->close(); } @@ -207,7 +207,7 @@ void handleEvent(ExecutionContext* context, Event* event) override { if (event->type() != EventTypeNames::upgradeneeded) { - m_executableWithDatabase->requestCallback()->sendFailure("Unexpected event type."); + m_executableWithDatabase->getRequestCallback()->sendFailure("Unexpected event type."); return; } @@ -217,7 +217,7 @@ IDBOpenDBRequest* idbOpenDBRequest = static_cast<IDBOpenDBRequest*>(event->target()); NonThrowableExceptionState exceptionState; idbOpenDBRequest->transaction()->abort(exceptionState); - m_executableWithDatabase->requestCallback()->sendFailure("Aborted upgrade."); + m_executableWithDatabase->getRequestCallback()->sendFailure("Aborted upgrade."); } private: @@ -232,9 +232,9 @@ RefPtrWillBeRawPtr<OpenDatabaseCallback> openCallback = OpenDatabaseCallback::create(this); RefPtrWillBeRawPtr<UpgradeDatabaseCallback> upgradeCallback = UpgradeDatabaseCallback::create(this); TrackExceptionState exceptionState; - IDBOpenDBRequest* idbOpenDBRequest = idbFactory->open(scriptState(), databaseName, exceptionState); + IDBOpenDBRequest* idbOpenDBRequest = idbFactory->open(getScriptState(), databaseName, exceptionState); if (exceptionState.hadException()) { - requestCallback()->sendFailure("Could not open database."); + getRequestCallback()->sendFailure("Could not open database."); return; } idbOpenDBRequest->addEventListener(EventTypeNames::upgradeneeded, upgradeCallback, false); @@ -342,7 +342,7 @@ m_requestCallback->sendSuccess(result.release()); } - RequestCallback* requestCallback() override { return m_requestCallback.get(); } + RequestCallback* getRequestCallback() override { return m_requestCallback.get(); } private: DatabaseLoader(ScriptState* scriptState, PassOwnPtr<RequestDatabaseCallback> requestCallback) : ExecutableWithDatabase(scriptState) @@ -461,7 +461,7 @@ return; } - Document* document = toDocument(m_scriptState->executionContext()); + Document* document = toDocument(m_scriptState->getExecutionContext()); if (!document) return; // FIXME: There are no tests for this error showing when a recursive @@ -521,7 +521,7 @@ void execute(IDBDatabase* idbDatabase) override { - IDBTransaction* idbTransaction = transactionForDatabase(scriptState(), idbDatabase, m_objectStoreName); + IDBTransaction* idbTransaction = transactionForDatabase(getScriptState(), idbDatabase, m_objectStoreName); if (!idbTransaction) { m_requestCallback->sendFailure("Could not get transaction"); return; @@ -540,15 +540,15 @@ return; } - idbRequest = idbIndex->openCursor(scriptState(), m_idbKeyRange.get(), WebIDBCursorDirectionNext); + idbRequest = idbIndex->openCursor(getScriptState(), m_idbKeyRange.get(), WebIDBCursorDirectionNext); } else { - idbRequest = idbObjectStore->openCursor(scriptState(), m_idbKeyRange.get(), WebIDBCursorDirectionNext); + idbRequest = idbObjectStore->openCursor(getScriptState(), m_idbKeyRange.get(), WebIDBCursorDirectionNext); } - RefPtrWillBeRawPtr<OpenCursorCallback> openCursorCallback = OpenCursorCallback::create(scriptState(), m_requestCallback.release(), m_skipCount, m_pageSize); + RefPtrWillBeRawPtr<OpenCursorCallback> openCursorCallback = OpenCursorCallback::create(getScriptState(), m_requestCallback.release(), m_skipCount, m_pageSize); idbRequest->addEventListener(EventTypeNames::success, openCursorCallback, false); } - RequestCallback* requestCallback() override { return m_requestCallback.get(); } + RequestCallback* getRequestCallback() override { return m_requestCallback.get(); } DataLoader(ScriptState* scriptState, PassOwnPtr<RequestDataCallback> requestCallback, const String& objectStoreName, const String& indexName, IDBKeyRange* idbKeyRange, int skipCount, unsigned pageSize) : ExecutableWithDatabase(scriptState) , m_requestCallback(requestCallback) @@ -649,7 +649,7 @@ requestCallback->sendFailure("Could not obtain database names."); return; } - idbRequest->addEventListener(EventTypeNames::success, GetDatabaseNamesCallback::create(requestCallback, document->securityOrigin()->toRawString()), false); + idbRequest->addEventListener(EventTypeNames::success, GetDatabaseNamesCallback::create(requestCallback, document->getSecurityOrigin()->toRawString()), false); } void InspectorIndexedDBAgent::requestDatabase(ErrorString* errorString, const String& securityOrigin, const String& databaseName, PassOwnPtr<RequestDatabaseCallback> requestCallback) @@ -667,7 +667,7 @@ return; ScriptState::Scope scope(scriptState); RefPtr<DatabaseLoader> databaseLoader = DatabaseLoader::create(scriptState, requestCallback); - databaseLoader->start(idbFactory, document->securityOrigin(), databaseName); + databaseLoader->start(idbFactory, document->getSecurityOrigin(), databaseName); } void InspectorIndexedDBAgent::requestData(ErrorString* errorString, @@ -699,7 +699,7 @@ return; ScriptState::Scope scope(scriptState); RefPtr<DataLoader> dataLoader = DataLoader::create(scriptState, requestCallback, objectStoreName, indexName, idbKeyRange, skipCount, pageSize); - dataLoader->start(idbFactory, document->securityOrigin(), databaseName); + dataLoader->start(idbFactory, document->getSecurityOrigin(), databaseName); } class ClearObjectStoreListener final : public EventListener { @@ -759,7 +759,7 @@ void execute(IDBDatabase* idbDatabase) override { - IDBTransaction* idbTransaction = transactionForDatabase(scriptState(), idbDatabase, m_objectStoreName, IndexedDBNames::readwrite); + IDBTransaction* idbTransaction = transactionForDatabase(getScriptState(), idbDatabase, m_objectStoreName, IndexedDBNames::readwrite); if (!idbTransaction) { m_requestCallback->sendFailure("Could not get transaction"); return; @@ -771,7 +771,7 @@ } TrackExceptionState exceptionState; - idbObjectStore->clear(scriptState(), exceptionState); + idbObjectStore->clear(getScriptState(), exceptionState); ASSERT(!exceptionState.hadException()); if (exceptionState.hadException()) { ExceptionCode ec = exceptionState.code(); @@ -781,7 +781,7 @@ idbTransaction->addEventListener(EventTypeNames::complete, ClearObjectStoreListener::create(m_requestCallback.release()), false); } - RequestCallback* requestCallback() override { return m_requestCallback.get(); } + RequestCallback* getRequestCallback() override { return m_requestCallback.get(); } private: const String m_objectStoreName; OwnPtr<ClearObjectStoreCallback> m_requestCallback; @@ -802,7 +802,7 @@ return; ScriptState::Scope scope(scriptState); RefPtr<ClearObjectStore> clearObjectStore = ClearObjectStore::create(scriptState, objectStoreName, requestCallback); - clearObjectStore->start(idbFactory, document->securityOrigin(), databaseName); + clearObjectStore->start(idbFactory, document->getSecurityOrigin(), databaseName); } DEFINE_TRACE(InspectorIndexedDBAgent)
diff --git a/third_party/WebKit/Source/modules/indexeddb/WebIDBCallbacksImpl.cpp b/third_party/WebKit/Source/modules/indexeddb/WebIDBCallbacksImpl.cpp index 3d81c64..a7aeccf 100644 --- a/third_party/WebKit/Source/modules/indexeddb/WebIDBCallbacksImpl.cpp +++ b/third_party/WebKit/Source/modules/indexeddb/WebIDBCallbacksImpl.cpp
@@ -60,17 +60,17 @@ WebIDBCallbacksImpl::WebIDBCallbacksImpl(IDBRequest* request) : m_request(request) { - m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(m_request->executionContext(), "IndexedDB"); + m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(m_request->getExecutionContext(), "IndexedDB"); } WebIDBCallbacksImpl::~WebIDBCallbacksImpl() { - InspectorInstrumentation::traceAsyncOperationCompleted(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentation::traceAsyncOperationCompleted(m_request->getExecutionContext(), m_asyncOperationId); } void WebIDBCallbacksImpl::onError(const WebIDBDatabaseError& error) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onError(DOMException::create(error.code(), error.message())); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } @@ -80,42 +80,42 @@ Vector<String> stringList; for (size_t i = 0; i < webStringList.size(); ++i) stringList.append(webStringList[i]); - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onSuccess(stringList); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onSuccess(WebIDBCursor* cursor, const WebIDBKey& key, const WebIDBKey& primaryKey, const WebIDBValue& value) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onSuccess(adoptPtr(cursor), key, primaryKey, IDBValue::create(value)); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onSuccess(WebIDBDatabase* backend, const WebIDBMetadata& metadata) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onSuccess(adoptPtr(backend), IDBDatabaseMetadata(metadata)); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onSuccess(const WebIDBKey& key) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onSuccess(key); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onSuccess(const WebIDBValue& value) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onSuccess(IDBValue::create(value)); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onSuccess(const WebVector<WebIDBValue>& values) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); Vector<RefPtr<IDBValue>> idbValues(values.size()); for (size_t i = 0; i < values.size(); ++i) idbValues[i] = IDBValue::create(values[i]); @@ -125,35 +125,35 @@ void WebIDBCallbacksImpl::onSuccess(long long value) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onSuccess(value); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onSuccess() { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onSuccess(); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onSuccess(const WebIDBKey& key, const WebIDBKey& primaryKey, const WebIDBValue& value) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onSuccess(key, primaryKey, IDBValue::create(value)); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onBlocked(long long oldVersion) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onBlocked(oldVersion); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); } void WebIDBCallbacksImpl::onUpgradeNeeded(long long oldVersion, WebIDBDatabase* database, const WebIDBMetadata& metadata, unsigned short dataLoss, WebString dataLossMessage) { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_request->getExecutionContext(), m_asyncOperationId); m_request->onUpgradeNeeded(oldVersion, adoptPtr(database), IDBDatabaseMetadata(metadata), static_cast<WebIDBDataLoss>(dataLoss), dataLossMessage); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); }
diff --git a/third_party/WebKit/Source/modules/installedapp/NavigatorInstalledApp.cpp b/third_party/WebKit/Source/modules/installedapp/NavigatorInstalledApp.cpp index 06b88f5..af1db4a 100644 --- a/third_party/WebKit/Source/modules/installedapp/NavigatorInstalledApp.cpp +++ b/third_party/WebKit/Source/modules/installedapp/NavigatorInstalledApp.cpp
@@ -79,7 +79,7 @@ } controller()->getInstalledApps( - WebSecurityOrigin(scriptState->executionContext()->securityOrigin()), + WebSecurityOrigin(scriptState->getExecutionContext()->getSecurityOrigin()), adoptWebPtr(new CallbackPromiseAdapter<RelatedAppArray, void>(resolver))); return promise; }
diff --git a/third_party/WebKit/Source/modules/mediacapturefromelement/CanvasCaptureMediaStreamTrack.cpp b/third_party/WebKit/Source/modules/mediacapturefromelement/CanvasCaptureMediaStreamTrack.cpp index 90b852d..d36b2c2 100644 --- a/third_party/WebKit/Source/modules/mediacapturefromelement/CanvasCaptureMediaStreamTrack.cpp +++ b/third_party/WebKit/Source/modules/mediacapturefromelement/CanvasCaptureMediaStreamTrack.cpp
@@ -49,7 +49,7 @@ } CanvasCaptureMediaStreamTrack::CanvasCaptureMediaStreamTrack(const CanvasCaptureMediaStreamTrack& track, MediaStreamComponent* component) - :MediaStreamTrack(track.m_canvasElement->executionContext(), component) + :MediaStreamTrack(track.m_canvasElement->getExecutionContext(), component) , m_canvasElement(track.m_canvasElement) , m_drawListener(track.m_drawListener) { @@ -58,7 +58,7 @@ } CanvasCaptureMediaStreamTrack::CanvasCaptureMediaStreamTrack(MediaStreamComponent* component, PassRefPtrWillBeRawPtr<HTMLCanvasElement> element, const PassOwnPtr<WebCanvasCaptureHandler> handler) - : MediaStreamTrack(element->executionContext(), component) + : MediaStreamTrack(element->getExecutionContext(), component) , m_canvasElement(element) { suspendIfNeeded(); @@ -67,7 +67,7 @@ } CanvasCaptureMediaStreamTrack::CanvasCaptureMediaStreamTrack(MediaStreamComponent* component, PassRefPtrWillBeRawPtr<HTMLCanvasElement> element, const PassOwnPtr<WebCanvasCaptureHandler> handler, double frameRate) - : MediaStreamTrack(element->executionContext(), component) + : MediaStreamTrack(element->getExecutionContext(), component) , m_canvasElement(element) { suspendIfNeeded();
diff --git a/third_party/WebKit/Source/modules/mediacapturefromelement/HTMLCanvasElementCapture.cpp b/third_party/WebKit/Source/modules/mediacapturefromelement/HTMLCanvasElementCapture.cpp index 9bd941b..18550f32 100644 --- a/third_party/WebKit/Source/modules/mediacapturefromelement/HTMLCanvasElementCapture.cpp +++ b/third_party/WebKit/Source/modules/mediacapturefromelement/HTMLCanvasElementCapture.cpp
@@ -64,7 +64,7 @@ MediaStreamTrackVector tracks; tracks.append(canvasTrack); - return MediaStream::create(element.executionContext(), tracks); + return MediaStream::create(element.getExecutionContext(), tracks); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/mediacapturefromelement/HTMLMediaElementCapture.cpp b/third_party/WebKit/Source/modules/mediacapturefromelement/HTMLMediaElementCapture.cpp index 872c28a..5dcc08f 100644 --- a/third_party/WebKit/Source/modules/mediacapturefromelement/HTMLMediaElementCapture.cpp +++ b/third_party/WebKit/Source/modules/mediacapturefromelement/HTMLMediaElementCapture.cpp
@@ -35,7 +35,7 @@ // If |element| is actually playing a MediaStream, just clone it. if (HTMLMediaElement::isMediaStreamURL(element.currentSrc().getString())) { - return MediaStream::create(element.executionContext(), MediaStreamRegistry::registry().lookupMediaStreamDescriptor(element.currentSrc().getString())); + return MediaStream::create(element.getExecutionContext(), MediaStreamRegistry::registry().lookupMediaStreamDescriptor(element.currentSrc().getString())); } // TODO(mcasas): Only <video> tags are supported at the moment. @@ -49,7 +49,7 @@ MediaStreamCenter::instance().didCreateMediaStream(webStream); Platform::current()->createHTMLVideoElementCapturer(&webStream, element.webMediaPlayer()); - return MediaStream::create(element.executionContext(), webStream); + return MediaStream::create(element.getExecutionContext(), webStream); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.cpp b/third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.cpp index cf0cf97..c35c3a4d 100644 --- a/third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.cpp +++ b/third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.cpp
@@ -258,9 +258,9 @@ return EventTargetNames::MediaRecorder; } -ExecutionContext* MediaRecorder::executionContext() const +ExecutionContext* MediaRecorder::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } void MediaRecorder::suspend()
diff --git a/third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.h b/third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.h index c05c3cfe..ce1e316 100644 --- a/third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.h +++ b/third_party/WebKit/Source/modules/mediarecorder/MediaRecorder.h
@@ -66,7 +66,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject void suspend() override;
diff --git a/third_party/WebKit/Source/modules/mediasession/MediaSession.h b/third_party/WebKit/Source/modules/mediasession/MediaSession.h index 1ec2837..8501a3bd4 100644 --- a/third_party/WebKit/Source/modules/mediasession/MediaSession.h +++ b/third_party/WebKit/Source/modules/mediasession/MediaSession.h
@@ -24,7 +24,7 @@ public: static MediaSession* create(ExecutionContext*, ExceptionState&); - WebMediaSession* webMediaSession() { return m_webMediaSession.get(); } + WebMediaSession* getWebMediaSession() { return m_webMediaSession.get(); } ScriptPromise activate(ScriptState*); ScriptPromise deactivate(ScriptState*);
diff --git a/third_party/WebKit/Source/modules/mediasource/MediaSource.cpp b/third_party/WebKit/Source/modules/mediasource/MediaSource.cpp index 6db9457..95e0a34 100644 --- a/third_party/WebKit/Source/modules/mediasource/MediaSource.cpp +++ b/third_party/WebKit/Source/modules/mediasource/MediaSource.cpp
@@ -97,8 +97,8 @@ , m_readyState(closedKeyword()) , m_asyncEventQueue(GenericEventQueue::create(this)) , m_attachedElement(nullptr) - , m_sourceBuffers(SourceBufferList::create(executionContext(), m_asyncEventQueue.get())) - , m_activeSourceBuffers(SourceBufferList::create(executionContext(), m_asyncEventQueue.get())) + , m_sourceBuffers(SourceBufferList::create(getExecutionContext(), m_asyncEventQueue.get())) + , m_activeSourceBuffers(SourceBufferList::create(getExecutionContext(), m_asyncEventQueue.get())) , m_isAddedToRegistry(false) { WTF_LOG(Media, "MediaSource::MediaSource %p", this); @@ -270,9 +270,9 @@ return EventTargetNames::MediaSource; } -ExecutionContext* MediaSource::executionContext() const +ExecutionContext* MediaSource::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } DEFINE_TRACE(MediaSource)
diff --git a/third_party/WebKit/Source/modules/mediasource/MediaSource.h b/third_party/WebKit/Source/modules/mediasource/MediaSource.h index 57484e8d..5f06eca 100644 --- a/third_party/WebKit/Source/modules/mediasource/MediaSource.h +++ b/third_party/WebKit/Source/modules/mediasource/MediaSource.h
@@ -90,7 +90,7 @@ // EventTarget interface const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject interface bool hasPendingActivity() const override;
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp index 9e48afb..6825504 100644 --- a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp +++ b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp
@@ -99,7 +99,7 @@ } SourceBuffer::SourceBuffer(PassOwnPtr<WebSourceBuffer> webSourceBuffer, MediaSource* source, GenericEventQueue* asyncEventQueue) - : ActiveDOMObject(source->executionContext()) + : ActiveDOMObject(source->getExecutionContext()) , m_webSourceBuffer(webSourceBuffer) , m_source(source) , m_trackDefaults(TrackDefaultList::create()) @@ -520,9 +520,9 @@ m_appendStreamAsyncPartRunner->stop(); } -ExecutionContext* SourceBuffer::executionContext() const +ExecutionContext* SourceBuffer::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } const AtomicString& SourceBuffer::interfaceName() const @@ -758,7 +758,7 @@ // Steps 3-11 are handled by m_loader. // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the data in the stream). - m_loader->start(executionContext(), *m_stream, m_streamMaxSizeValid ? m_streamMaxSize : 0); + m_loader->start(getExecutionContext(), *m_stream, m_streamMaxSizeValid ? m_streamMaxSize : 0); } void SourceBuffer::appendStreamDone(bool success)
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.h b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.h index 6bc95ea..ba9512fd 100644 --- a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.h +++ b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.h
@@ -98,7 +98,7 @@ void stop() override; // EventTarget interface - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; const AtomicString& interfaceName() const override; // WebSourceBufferClient interface
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBufferList.cpp b/third_party/WebKit/Source/modules/mediasource/SourceBufferList.cpp index 7dccfbb8..345f043 100644 --- a/third_party/WebKit/Source/modules/mediasource/SourceBufferList.cpp +++ b/third_party/WebKit/Source/modules/mediasource/SourceBufferList.cpp
@@ -92,7 +92,7 @@ return EventTargetNames::SourceBufferList; } -ExecutionContext* SourceBufferList::executionContext() const +ExecutionContext* SourceBufferList::getExecutionContext() const { return m_executionContext; }
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBufferList.h b/third_party/WebKit/Source/modules/mediasource/SourceBufferList.h index 44685e3d..a761ae6 100644 --- a/third_party/WebKit/Source/modules/mediasource/SourceBufferList.h +++ b/third_party/WebKit/Source/modules/mediasource/SourceBufferList.h
@@ -61,7 +61,7 @@ // EventTarget interface const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaDevices.cpp b/third_party/WebKit/Source/modules/mediastream/MediaDevices.cpp index 20320d3..556ec89 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaDevices.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaDevices.cpp
@@ -22,7 +22,7 @@ ScriptPromise MediaDevices::enumerateDevices(ScriptState* scriptState) { - Document* document = toDocument(scriptState->executionContext()); + Document* document = toDocument(scriptState->getExecutionContext()); UserMediaController* userMedia = UserMediaController::from(document->frame()); if (!userMedia) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError, "No media device controller available; is this a detached window?")); @@ -94,7 +94,7 @@ NavigatorUserMediaSuccessCallback* successCallback = new PromiseSuccessCallback(resolver); NavigatorUserMediaErrorCallback* errorCallback = new PromiseErrorCallback(resolver); - Document* document = toDocument(scriptState->executionContext()); + Document* document = toDocument(scriptState->getExecutionContext()); UserMediaController* userMedia = UserMediaController::from(document->frame()); if (!userMedia) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError, "No media device controller available; is this a detached window?"));
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaDevicesRequest.cpp b/third_party/WebKit/Source/modules/mediastream/MediaDevicesRequest.cpp index 112d4938..20b61f0d 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaDevicesRequest.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaDevicesRequest.cpp
@@ -42,7 +42,7 @@ } MediaDevicesRequest::MediaDevicesRequest(ScriptState* state, UserMediaController* controller) - : ActiveDOMObject(state->executionContext()) + : ActiveDOMObject(state->getExecutionContext()) , m_controller(controller) , m_resolver(ScriptPromiseResolver::create(state)) { @@ -54,7 +54,7 @@ Document* MediaDevicesRequest::ownerDocument() { - if (ExecutionContext* context = executionContext()) { + if (ExecutionContext* context = getExecutionContext()) { return toDocument(context); } @@ -71,7 +71,7 @@ void MediaDevicesRequest::succeed(const MediaDeviceInfoVector& mediaDevices) { - if (!executionContext() || !m_resolver) + if (!getExecutionContext() || !m_resolver) return; m_resolver->resolve(mediaDevices);
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp index c5cafe3..4ba6007 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp
@@ -312,9 +312,9 @@ return EventTargetNames::MediaStream; } -ExecutionContext* MediaStream::executionContext() const +ExecutionContext* MediaStream::getExecutionContext() const { - return ContextLifecycleObserver::executionContext(); + return ContextLifecycleObserver::getExecutionContext(); } void MediaStream::addRemoteTrack(MediaStreamComponent* component) @@ -323,7 +323,7 @@ if (m_stopped) return; - MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), component); + MediaStreamTrack* track = MediaStreamTrack::create(getExecutionContext(), component); switch (component->source()->type()) { case MediaStreamSource::TypeAudio: m_audioTracks.append(track);
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStream.h b/third_party/WebKit/Source/modules/mediastream/MediaStream.h index 3cd33db..8891156 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStream.h +++ b/third_party/WebKit/Source/modules/mediastream/MediaStream.h
@@ -81,7 +81,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // URLRegistrable URLRegistry& registry() const override;
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp index 24c33c5b..6367a92 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp
@@ -252,9 +252,9 @@ return EventTargetNames::MediaStreamTrack; } -ExecutionContext* MediaStreamTrack::executionContext() const +ExecutionContext* MediaStreamTrack::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } DEFINE_TRACE(MediaStreamTrack)
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.h b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.h index 90fec99a..27f98e87 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.h +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.h
@@ -81,7 +81,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject bool hasPendingActivity() const override;
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp index 9778d55a..da496985 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp
@@ -53,7 +53,7 @@ String MediaStreamTrackSourcesRequestImpl::origin() { - return m_executionContext->securityOrigin()->toString(); + return m_executionContext->getSecurityOrigin()->toString(); } void MediaStreamTrackSourcesRequestImpl::requestSucceeded(const WebVector<WebSourceInfo>& webSourceInfos)
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDTMFSender.cpp b/third_party/WebKit/Source/modules/mediastream/RTCDTMFSender.cpp index a45f886..62375b7 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDTMFSender.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCDTMFSender.cpp
@@ -131,9 +131,9 @@ return EventTargetNames::RTCDTMFSender; } -ExecutionContext* RTCDTMFSender::executionContext() const +ExecutionContext* RTCDTMFSender::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } void RTCDTMFSender::stop()
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDTMFSender.h b/third_party/WebKit/Source/modules/mediastream/RTCDTMFSender.h index d47014a..9e5f5b9 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDTMFSender.h +++ b/third_party/WebKit/Source/modules/mediastream/RTCDTMFSender.h
@@ -63,7 +63,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject void stop() override;
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp index ad474ad..59bf416 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp
@@ -289,7 +289,7 @@ return EventTargetNames::RTCDataChannel; } -ExecutionContext* RTCDataChannel::executionContext() const +ExecutionContext* RTCDataChannel::getExecutionContext() const { return m_executionContext; }
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.h b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.h index d17bcf5..dcc9f04 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.h +++ b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.h
@@ -91,7 +91,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // Oilpan: need to eagerly finalize m_handler EAGERLY_FINALIZE();
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp index 8ddc31d..7091872e 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
@@ -402,7 +402,7 @@ , m_stopped(false) , m_closed(false) { - Document* document = toDocument(executionContext()); + Document* document = toDocument(getExecutionContext()); // If we fail, set |m_closed| and |m_stopped| to true, to avoid hitting the assert in the destructor. @@ -454,7 +454,7 @@ if (exceptionState.hadException()) return; - RTCSessionDescriptionRequest* request = RTCSessionDescriptionRequestImpl::create(executionContext(), this, successCallback, errorCallback); + RTCSessionDescriptionRequest* request = RTCSessionDescriptionRequestImpl::create(getExecutionContext(), this, successCallback, errorCallback); if (offerOptions) { if (offerOptions->offerToReceiveAudio() != -1 || offerOptions->offerToReceiveVideo() != -1) @@ -504,7 +504,7 @@ return; } - RTCSessionDescriptionRequest* request = RTCSessionDescriptionRequestImpl::create(executionContext(), this, successCallback, errorCallback); + RTCSessionDescriptionRequest* request = RTCSessionDescriptionRequestImpl::create(getExecutionContext(), this, successCallback, errorCallback); m_peerHandler->createAnswer(request, constraints); } @@ -522,7 +522,7 @@ ScriptPromise RTCPeerConnection::setLocalDescription(ScriptState* scriptState, RTCSessionDescription* sessionDescription, VoidCallback* successCallback, RTCPeerConnectionErrorCallback* errorCallback) { - ExecutionContext* context = scriptState->executionContext(); + ExecutionContext* context = scriptState->getExecutionContext(); if (successCallback && errorCallback) { UseCounter::count(context, UseCounter::RTCPeerConnectionSetLocalDescriptionLegacyCompliant); } else { @@ -537,7 +537,7 @@ ASSERT(sessionDescription); - RTCVoidRequest* request = RTCVoidRequestImpl::create(executionContext(), this, successCallback, errorCallback); + RTCVoidRequest* request = RTCVoidRequestImpl::create(getExecutionContext(), this, successCallback, errorCallback); m_peerHandler->setLocalDescription(request, sessionDescription->webSessionDescription()); return ScriptPromise::cast(scriptState, v8::Undefined(scriptState->isolate())); } @@ -565,7 +565,7 @@ ScriptPromise RTCPeerConnection::setRemoteDescription(ScriptState* scriptState, RTCSessionDescription* sessionDescription, VoidCallback* successCallback, RTCPeerConnectionErrorCallback* errorCallback) { - ExecutionContext* context = scriptState->executionContext(); + ExecutionContext* context = scriptState->getExecutionContext(); if (successCallback && errorCallback) { UseCounter::count(context, UseCounter::RTCPeerConnectionSetRemoteDescriptionLegacyCompliant); } else { @@ -580,7 +580,7 @@ ASSERT(sessionDescription); - RTCVoidRequest* request = RTCVoidRequestImpl::create(executionContext(), this, successCallback, errorCallback); + RTCVoidRequest* request = RTCVoidRequestImpl::create(getExecutionContext(), this, successCallback, errorCallback); m_peerHandler->setRemoteDescription(request, sessionDescription->webSessionDescription()); return ScriptPromise::cast(scriptState, v8::Undefined(scriptState->isolate())); } @@ -677,8 +677,8 @@ // The observer will manage its own destruction as well as the resolver's destruction. certificateGenerator->generateCertificate( keyParams.get(), - toDocument(scriptState->executionContext())->url(), - toDocument(scriptState->executionContext())->firstPartyForCookies(), + toDocument(scriptState->getExecutionContext())->url(), + toDocument(scriptState->getExecutionContext())->firstPartyForCookies(), certificateObserver); return promise; @@ -712,7 +712,7 @@ if (callErrorCallbackIfSignalingStateClosed(m_signalingState, errorCallback)) return ScriptPromise::cast(scriptState, v8::Undefined(scriptState->isolate())); - RTCVoidRequest* request = RTCVoidRequestImpl::create(executionContext(), this, successCallback, errorCallback); + RTCVoidRequest* request = RTCVoidRequestImpl::create(getExecutionContext(), this, successCallback, errorCallback); bool implemented = m_peerHandler->addICECandidate(request, iceCandidate->webCandidate()); if (!implemented) asyncCallErrorCallback(errorCallback, DOMException::create(OperationError, "This operation could not be completed.")); @@ -853,7 +853,7 @@ void RTCPeerConnection::getStats(ExecutionContext* context, RTCStatsCallback* successCallback, MediaStreamTrack* selector) { UseCounter::count(context, UseCounter::RTCPeerConnectionGetStatsLegacyNonCompliant); - RTCStatsRequest* statsRequest = RTCStatsRequestImpl::create(executionContext(), this, successCallback, selector); + RTCStatsRequest* statsRequest = RTCStatsRequestImpl::create(getExecutionContext(), this, successCallback, selector); // FIXME: Add passing selector as part of the statsRequest. m_peerHandler->getStats(statsRequest); } @@ -879,7 +879,7 @@ DictionaryHelper::get(options, "protocol", protocolString); init.protocol = protocolString; - RTCDataChannel* channel = RTCDataChannel::create(executionContext(), m_peerHandler.get(), label, init, exceptionState); + RTCDataChannel* channel = RTCDataChannel::create(getExecutionContext(), m_peerHandler.get(), label, init, exceptionState); if (exceptionState.hadException()) return nullptr; RTCDataChannel::ReadyState handlerState = channel->getHandlerState(); @@ -911,7 +911,7 @@ return nullptr; } - RTCDTMFSender* dtmfSender = RTCDTMFSender::create(executionContext(), m_peerHandler.get(), track, exceptionState); + RTCDTMFSender* dtmfSender = RTCDTMFSender::create(getExecutionContext(), m_peerHandler.get(), track, exceptionState); if (exceptionState.hadException()) return nullptr; return dtmfSender; @@ -934,7 +934,7 @@ void RTCPeerConnection::didGenerateICECandidate(const WebRTCICECandidate& webCandidate) { ASSERT(!m_closed); - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); if (webCandidate.isNull()) scheduleDispatchEvent(RTCIceCandidateEvent::create(false, false, nullptr)); else { @@ -946,33 +946,33 @@ void RTCPeerConnection::didChangeSignalingState(SignalingState newState) { ASSERT(!m_closed); - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); changeSignalingState(newState); } void RTCPeerConnection::didChangeICEGatheringState(ICEGatheringState newState) { ASSERT(!m_closed); - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); changeIceGatheringState(newState); } void RTCPeerConnection::didChangeICEConnectionState(ICEConnectionState newState) { ASSERT(!m_closed); - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); changeIceConnectionState(newState); } void RTCPeerConnection::didAddRemoteStream(const WebMediaStream& remoteStream) { ASSERT(!m_closed); - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); if (m_signalingState == SignalingStateClosed) return; - MediaStream* stream = MediaStream::create(executionContext(), remoteStream); + MediaStream* stream = MediaStream::create(getExecutionContext(), remoteStream); m_remoteStreams.append(stream); scheduleDispatchEvent(MediaStreamEvent::create(EventTypeNames::addstream, false, false, stream)); @@ -981,7 +981,7 @@ void RTCPeerConnection::didRemoveRemoteStream(const WebMediaStream& remoteStream) { ASSERT(!m_closed); - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); MediaStreamDescriptor* streamDescriptor = remoteStream; ASSERT(streamDescriptor->client()); @@ -1002,12 +1002,12 @@ void RTCPeerConnection::didAddRemoteDataChannel(WebRTCDataChannelHandler* handler) { ASSERT(!m_closed); - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); if (m_signalingState == SignalingStateClosed) return; - RTCDataChannel* channel = RTCDataChannel::create(executionContext(), adoptPtr(handler)); + RTCDataChannel* channel = RTCDataChannel::create(getExecutionContext(), adoptPtr(handler)); scheduleDispatchEvent(RTCDataChannelEvent::create(EventTypeNames::datachannel, false, false, channel)); } @@ -1027,9 +1027,9 @@ return EventTargetNames::RTCPeerConnection; } -ExecutionContext* RTCPeerConnection::executionContext() const +ExecutionContext* RTCPeerConnection::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } void RTCPeerConnection::suspend()
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.h b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.h index 4845b6d..4e3e164 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.h +++ b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.h
@@ -141,7 +141,7 @@ // EventTarget const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject void suspend() override;
diff --git a/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp b/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp index c8172ef7..947757e 100644 --- a/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp +++ b/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp
@@ -140,7 +140,7 @@ Document* UserMediaRequest::ownerDocument() { - if (ExecutionContext* context = executionContext()) { + if (ExecutionContext* context = getExecutionContext()) { return toDocument(context); } @@ -155,10 +155,10 @@ void UserMediaRequest::succeed(MediaStreamDescriptor* streamDescriptor) { - if (!executionContext()) + if (!getExecutionContext()) return; - RefPtrWillBeRawPtr<MediaStream> stream = MediaStream::create(executionContext(), streamDescriptor); + RefPtrWillBeRawPtr<MediaStream> stream = MediaStream::create(getExecutionContext(), streamDescriptor); MediaStreamTrackVector audioTracks = stream->getAudioTracks(); for (MediaStreamTrackVector::iterator iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) { @@ -175,7 +175,7 @@ void UserMediaRequest::failPermissionDenied(const String& message) { - if (!executionContext()) + if (!getExecutionContext()) return; m_errorCallback->handleEvent(NavigatorUserMediaError::create(NavigatorUserMediaError::NamePermissionDenied, message, String())); } @@ -183,7 +183,7 @@ void UserMediaRequest::failConstraint(const String& constraintName, const String& message) { ASSERT(!constraintName.isEmpty()); - if (!executionContext()) + if (!getExecutionContext()) return; m_errorCallback->handleEvent(NavigatorUserMediaError::create(NavigatorUserMediaError::NameConstraintNotSatisfied, message, constraintName)); } @@ -191,7 +191,7 @@ void UserMediaRequest::failUASpecific(const String& name, const String& message, const String& constraintName) { ASSERT(!name.isEmpty()); - if (!executionContext()) + if (!getExecutionContext()) return; m_errorCallback->handleEvent(NavigatorUserMediaError::create(name, message, constraintName)); }
diff --git a/third_party/WebKit/Source/modules/navigatorconnect/AcceptConnectionObserver.cpp b/third_party/WebKit/Source/modules/navigatorconnect/AcceptConnectionObserver.cpp index 0a39eb0a..f0b4d01 100644 --- a/third_party/WebKit/Source/modules/navigatorconnect/AcceptConnectionObserver.cpp +++ b/third_party/WebKit/Source/modules/navigatorconnect/AcceptConnectionObserver.cpp
@@ -76,7 +76,7 @@ void AcceptConnectionObserver::didDispatchEvent() { - ASSERT(executionContext()); + ASSERT(getExecutionContext()); if (m_state != Initial) return; responseWasRejected(); @@ -99,7 +99,7 @@ void AcceptConnectionObserver::responseWasRejected() { - ASSERT(executionContext()); + ASSERT(getExecutionContext()); if (m_resolver) m_resolver->reject(DOMException::create(AbortError)); m_callbacks->onError(); @@ -108,9 +108,9 @@ void AcceptConnectionObserver::responseWasResolved(const ScriptValue& value) { - ASSERT(executionContext()); + ASSERT(getExecutionContext()); - ScriptState* scriptState = m_resolver->scriptState(); + ScriptState* scriptState = m_resolver->getScriptState(); ExceptionState exceptionState(ExceptionState::UnknownContext, nullptr, nullptr, scriptState->context()->Global(), scriptState->isolate()); ServicePortConnectResponse response = ScriptValue::to<ServicePortConnectResponse>(scriptState->isolate(), value, exceptionState); if (exceptionState.hadException()) { @@ -145,7 +145,7 @@ } AcceptConnectionObserver::AcceptConnectionObserver(ServicePortCollection* collection, PassOwnPtr<WebServicePortConnectEventCallbacks> callbacks, WebServicePortID portID, const KURL& targetURL) - : ContextLifecycleObserver(collection->executionContext()) + : ContextLifecycleObserver(collection->getExecutionContext()) , m_callbacks(callbacks) , m_collection(collection) , m_portID(portID)
diff --git a/third_party/WebKit/Source/modules/navigatorconnect/ServicePortCollection.cpp b/third_party/WebKit/Source/modules/navigatorconnect/ServicePortCollection.cpp index 5f459455d..6b80be9 100644 --- a/third_party/WebKit/Source/modules/navigatorconnect/ServicePortCollection.cpp +++ b/third_party/WebKit/Source/modules/navigatorconnect/ServicePortCollection.cpp
@@ -35,7 +35,7 @@ void onSuccess(WebServicePortID portId) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) { return; } WebServicePort webPort; @@ -51,7 +51,7 @@ void onError() override { // TODO(mek): Pass actual error code back. - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) { return; } m_resolver->reject(DOMException::create(AbortError)); @@ -103,10 +103,10 @@ } ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - KURL targetUrl = scriptState->executionContext()->completeURL(url); + KURL targetUrl = scriptState->getExecutionContext()->completeURL(url); m_provider->connect( targetUrl, - scriptState->executionContext()->securityOrigin()->toString(), + scriptState->getExecutionContext()->getSecurityOrigin()->toString(), new ConnectCallbacks(resolver, this, targetUrl, options.name(), portData ? portData->toWireString() : String())); return promise; } @@ -126,9 +126,9 @@ return EventTargetNames::ServicePortCollection; } -ExecutionContext* ServicePortCollection::executionContext() const +ExecutionContext* ServicePortCollection::getExecutionContext() const { - return ContextLifecycleObserver::executionContext(); + return ContextLifecycleObserver::getExecutionContext(); } void ServicePortCollection::postMessage(WebServicePortID portId, const WebString& messageString, const WebMessagePortChannelArray& webChannels) @@ -141,7 +141,7 @@ } RefPtr<SerializedScriptValue> message = SerializedScriptValueFactory::instance().createFromWire(messageString); - MessagePortArray* ports = MessagePort::entanglePorts(*executionContext(), channels.release()); + MessagePortArray* ports = MessagePort::entanglePorts(*getExecutionContext(), channels.release()); RefPtrWillBeRawPtr<Event> evt = MessageEvent::create(ports, message.release()); // TODO(mek): Lookup ServicePort and set events source attribute. dispatchEvent(evt.release());
diff --git a/third_party/WebKit/Source/modules/navigatorconnect/ServicePortCollection.h b/third_party/WebKit/Source/modules/navigatorconnect/ServicePortCollection.h index e8aa5c7..5107bec55 100644 --- a/third_party/WebKit/Source/modules/navigatorconnect/ServicePortCollection.h +++ b/third_party/WebKit/Source/modules/navigatorconnect/ServicePortCollection.h
@@ -53,7 +53,7 @@ // EventTarget overrides. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // WebServicePortProviderClient overrides. void postMessage(WebServicePortID, const WebString&, const WebMessagePortChannelArray&) override;
diff --git a/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp b/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp index 6befb67..c18aade 100644 --- a/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp +++ b/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp
@@ -92,7 +92,7 @@ // The specification says that the API throws SecurityError exception if the // URL's origin differs from the document's origin. - if (!document.securityOrigin()->canRequest(kurl)) { + if (!document.getSecurityOrigin()->canRequest(kurl)) { exceptionState.throwSecurityError("Can only register custom handler in the document's origin."); return false; }
diff --git a/third_party/WebKit/Source/modules/netinfo/NavigatorNetworkInformation.cpp b/third_party/WebKit/Source/modules/netinfo/NavigatorNetworkInformation.cpp index add4dbd..f3505aff 100644 --- a/third_party/WebKit/Source/modules/netinfo/NavigatorNetworkInformation.cpp +++ b/third_party/WebKit/Source/modules/netinfo/NavigatorNetworkInformation.cpp
@@ -49,7 +49,7 @@ { if (!m_connection && frame()) { ASSERT(frame()->domWindow()); - m_connection = NetworkInformation::create(frame()->domWindow()->executionContext()); + m_connection = NetworkInformation::create(frame()->domWindow()->getExecutionContext()); } return m_connection.get(); }
diff --git a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.cpp b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.cpp index 1fc9a0d2..0e661db4 100644 --- a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.cpp +++ b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.cpp
@@ -78,7 +78,7 @@ void NetworkInformation::connectionChange(WebConnectionType type, double downlinkMaxMbps) { - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); // This can happen if the observer removes and then adds itself again // during notification. @@ -98,9 +98,9 @@ return EventTargetNames::NetworkInformation; } -ExecutionContext* NetworkInformation::executionContext() const +ExecutionContext* NetworkInformation::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } bool NetworkInformation::addEventListenerInternal(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, const EventListenerOptions& options) @@ -145,7 +145,7 @@ { if (!m_observing && !m_contextStopped) { m_type = networkStateNotifier().connectionType(); - networkStateNotifier().addObserver(this, executionContext()); + networkStateNotifier().addObserver(this, getExecutionContext()); m_observing = true; } } @@ -153,7 +153,7 @@ void NetworkInformation::stopObserving() { if (m_observing) { - networkStateNotifier().removeObserver(this, executionContext()); + networkStateNotifier().removeObserver(this, getExecutionContext()); m_observing = false; } }
diff --git a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.h b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.h index d453153..0090c5e 100644 --- a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.h +++ b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.h
@@ -33,7 +33,7 @@ // EventTarget overrides. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; void removeAllEventListeners() override; // ActiveDOMObject overrides.
diff --git a/third_party/WebKit/Source/modules/notifications/Notification.cpp b/third_party/WebKit/Source/modules/notifications/Notification.cpp index 40a8d9ba..d03052b 100644 --- a/third_party/WebKit/Source/modules/notifications/Notification.cpp +++ b/third_party/WebKit/Source/modules/notifications/Notification.cpp
@@ -140,12 +140,12 @@ void Notification::show() { ASSERT(m_state == NotificationStateIdle); - if (Notification::checkPermission(executionContext()) != WebNotificationPermissionAllowed) { + if (Notification::checkPermission(getExecutionContext()) != WebNotificationPermissionAllowed) { dispatchErrorEvent(); return; } - SecurityOrigin* origin = executionContext()->securityOrigin(); + SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); ASSERT(origin); notificationManager()->show(WebSecurityOrigin(origin), m_data, this); @@ -160,14 +160,14 @@ if (m_persistentId == kInvalidPersistentId) { // Fire the close event asynchronously. - executionContext()->postTask(BLINK_FROM_HERE, createSameThreadTask(&Notification::dispatchCloseEvent, this)); + getExecutionContext()->postTask(BLINK_FROM_HERE, createSameThreadTask(&Notification::dispatchCloseEvent, this)); m_state = NotificationStateClosing; notificationManager()->close(this); } else { m_state = NotificationStateClosed; - SecurityOrigin* origin = executionContext()->securityOrigin(); + SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); ASSERT(origin); notificationManager()->closePersistent(WebSecurityOrigin(origin), m_persistentId); @@ -182,7 +182,7 @@ void Notification::dispatchClickEvent() { UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); - ScopedWindowFocusAllowedIndicator windowFocusAllowed(executionContext()); + ScopedWindowFocusAllowedIndicator windowFocusAllowed(getExecutionContext()); dispatchEvent(Event::create(EventTypeNames::click)); } @@ -326,7 +326,7 @@ WebNotificationPermission Notification::checkPermission(ExecutionContext* context) { - SecurityOrigin* origin = context->securityOrigin(); + SecurityOrigin* origin = context->getSecurityOrigin(); ASSERT(origin); return notificationManager()->checkPermission(WebSecurityOrigin(origin)); @@ -334,7 +334,7 @@ ScriptPromise Notification::requestPermission(ScriptState* scriptState, NotificationPermissionCallback* deprecatedCallback) { - ExecutionContext* context = scriptState->executionContext(); + ExecutionContext* context = scriptState->getExecutionContext(); if (NotificationPermissionClient* permissionClient = NotificationPermissionClient::from(context)) return permissionClient->requestPermission(scriptState, deprecatedCallback); @@ -354,7 +354,7 @@ DispatchEventResult Notification::dispatchEventInternal(PassRefPtrWillBeRawPtr<Event> event) { - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); return EventTarget::dispatchEventInternal(event); }
diff --git a/third_party/WebKit/Source/modules/notifications/Notification.h b/third_party/WebKit/Source/modules/notifications/Notification.h index ee7db54..065e3b9e 100644 --- a/third_party/WebKit/Source/modules/notifications/Notification.h +++ b/third_party/WebKit/Source/modules/notifications/Notification.h
@@ -107,7 +107,7 @@ static size_t maxActions(); // EventTarget interface. - ExecutionContext* executionContext() const final { return ActiveDOMObject::executionContext(); } + ExecutionContext* getExecutionContext() const final { return ActiveDOMObject::getExecutionContext(); } const AtomicString& interfaceName() const override; // ActiveDOMObject interface.
diff --git a/third_party/WebKit/Source/modules/notifications/NotificationDataTest.cpp b/third_party/WebKit/Source/modules/notifications/NotificationDataTest.cpp index ac3ca7c..d091b7e 100644 --- a/third_party/WebKit/Source/modules/notifications/NotificationDataTest.cpp +++ b/third_party/WebKit/Source/modules/notifications/NotificationDataTest.cpp
@@ -46,7 +46,7 @@ m_executionContext = adoptRefWillBeNoop(new NullExecutionContext()); } - ExecutionContext* executionContext() { return m_executionContext.get(); } + ExecutionContext* getExecutionContext() { return m_executionContext.get(); } private: RefPtrWillBePersistent<ExecutionContext> m_executionContext; @@ -87,7 +87,7 @@ // TODO(peter): Test |options.data| and |notificationData.data|. TrackExceptionState exceptionState; - WebNotificationData notificationData = createWebNotificationData(executionContext(), kNotificationTitle, options, exceptionState); + WebNotificationData notificationData = createWebNotificationData(getExecutionContext(), kNotificationTitle, options, exceptionState); ASSERT_FALSE(exceptionState.hadException()); EXPECT_EQ(kNotificationTitle, notificationData.title); @@ -128,7 +128,7 @@ options.setSilent(true); TrackExceptionState exceptionState; - WebNotificationData notificationData = createWebNotificationData(executionContext(), kNotificationTitle, options, exceptionState); + WebNotificationData notificationData = createWebNotificationData(getExecutionContext(), kNotificationTitle, options, exceptionState); ASSERT_TRUE(exceptionState.hadException()); EXPECT_EQ("Silent notifications must not specify vibration patterns.", exceptionState.message()); @@ -141,7 +141,7 @@ options.setRenotify(true); TrackExceptionState exceptionState; - WebNotificationData notificationData = createWebNotificationData(executionContext(), kNotificationTitle, options, exceptionState); + WebNotificationData notificationData = createWebNotificationData(getExecutionContext(), kNotificationTitle, options, exceptionState); ASSERT_TRUE(exceptionState.hadException()); EXPECT_EQ("Notifications which set the renotify flag must specify a non-empty tag.", exceptionState.message()); @@ -163,7 +163,7 @@ options.setActions(actions); TrackExceptionState exceptionState; - WebNotificationData notificationData = createWebNotificationData(executionContext(), kNotificationTitle, options, exceptionState); + WebNotificationData notificationData = createWebNotificationData(getExecutionContext(), kNotificationTitle, options, exceptionState); ASSERT_FALSE(exceptionState.hadException()); EXPECT_TRUE(notificationData.icon.isEmpty()); @@ -184,7 +184,7 @@ options.setVibrate(vibrationSequence); TrackExceptionState exceptionState; - WebNotificationData notificationData = createWebNotificationData(executionContext(), kNotificationTitle, options, exceptionState); + WebNotificationData notificationData = createWebNotificationData(getExecutionContext(), kNotificationTitle, options, exceptionState); EXPECT_FALSE(exceptionState.hadException()); Vector<int> normalizedPattern; @@ -201,7 +201,7 @@ NotificationOptions options; TrackExceptionState exceptionState; - WebNotificationData notificationData = createWebNotificationData(executionContext(), kNotificationTitle, options, exceptionState); + WebNotificationData notificationData = createWebNotificationData(getExecutionContext(), kNotificationTitle, options, exceptionState); EXPECT_FALSE(exceptionState.hadException()); // The timestamp should be set to the current time since the epoch if it wasn't supplied by the developer. @@ -224,7 +224,7 @@ options.setDir(direction); TrackExceptionState exceptionState; - WebNotificationData notificationData = createWebNotificationData(executionContext(), kNotificationTitle, options, exceptionState); + WebNotificationData notificationData = createWebNotificationData(getExecutionContext(), kNotificationTitle, options, exceptionState); ASSERT_FALSE(exceptionState.hadException()); EXPECT_EQ(mappings.get(direction), notificationData.direction); @@ -246,7 +246,7 @@ options.setActions(actions); TrackExceptionState exceptionState; - WebNotificationData notificationData = createWebNotificationData(executionContext(), kNotificationTitle, options, exceptionState); + WebNotificationData notificationData = createWebNotificationData(getExecutionContext(), kNotificationTitle, options, exceptionState); ASSERT_FALSE(exceptionState.hadException()); // The stored actions will be capped to |maxActions| entries.
diff --git a/third_party/WebKit/Source/modules/notifications/NotificationEvent.h b/third_party/WebKit/Source/modules/notifications/NotificationEvent.h index dfa1cf82..e2cfb7b 100644 --- a/third_party/WebKit/Source/modules/notifications/NotificationEvent.h +++ b/third_party/WebKit/Source/modules/notifications/NotificationEvent.h
@@ -33,7 +33,7 @@ ~NotificationEvent() override; - Notification* notification() const { return m_notification.get(); } + Notification* getNotification() const { return m_notification.get(); } String action() const { return m_action; } const AtomicString& interfaceName() const override;
diff --git a/third_party/WebKit/Source/modules/notifications/NotificationEvent.idl b/third_party/WebKit/Source/modules/notifications/NotificationEvent.idl index 42617777..1e102df 100644 --- a/third_party/WebKit/Source/modules/notifications/NotificationEvent.idl +++ b/third_party/WebKit/Source/modules/notifications/NotificationEvent.idl
@@ -9,6 +9,6 @@ Exposed=ServiceWorker, RuntimeEnabled=Notifications, ] interface NotificationEvent : ExtendableEvent { - readonly attribute Notification notification; + [ImplementedAs=getNotification] readonly attribute Notification notification; readonly attribute DOMString action; };
diff --git a/third_party/WebKit/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp b/third_party/WebKit/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp index a00f19d..db1353d 100644 --- a/third_party/WebKit/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp +++ b/third_party/WebKit/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp
@@ -32,7 +32,7 @@ { HeapVector<Member<Notification>> notifications; for (const WebPersistentNotificationInfo& notificationInfo : notificationInfos) - notifications.append(Notification::create(resolver->executionContext(), notificationInfo.persistentId, notificationInfo.data, true /* showing */)); + notifications.append(Notification::create(resolver->getExecutionContext(), notificationInfo.persistentId, notificationInfo.data, true /* showing */)); return notifications; } @@ -45,7 +45,7 @@ ScriptPromise ServiceWorkerRegistrationNotifications::showNotification(ScriptState* scriptState, ServiceWorkerRegistration& serviceWorkerRegistration, const String& title, const NotificationOptions& options, ExceptionState& exceptionState) { - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); // If context object's active worker is null, reject promise with a TypeError exception. if (!serviceWorkerRegistration.active()) @@ -69,7 +69,7 @@ WebNotificationShowCallbacks* callbacks = new CallbackPromiseAdapter<void, void>(resolver); - SecurityOrigin* origin = executionContext->securityOrigin(); + SecurityOrigin* origin = executionContext->getSecurityOrigin(); WebNotificationManager* notificationManager = Platform::current()->notificationManager(); ASSERT(notificationManager);
diff --git a/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvas.cpp b/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvas.cpp index 1a00c5b..df103939 100644 --- a/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvas.cpp +++ b/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvas.cpp
@@ -45,7 +45,7 @@ return nullptr; if (m_context) { - if (m_context->contextType() != contextType) { + if (m_context->getContextType() != contextType) { factory->onError(this, "OffscreenCanvas has an existing context of a different type"); return nullptr; } @@ -81,7 +81,7 @@ void OffscreenCanvas::registerRenderingContextFactory(PassOwnPtr<OffscreenCanvasRenderingContextFactory> renderingContextFactory) { - OffscreenCanvasRenderingContext::ContextType type = renderingContextFactory->contextType(); + OffscreenCanvasRenderingContext::ContextType type = renderingContextFactory->getContextType(); ASSERT(type < OffscreenCanvasRenderingContext::ContextTypeCount); ASSERT(!renderingContextFactories()[type]); renderingContextFactories()[type] = renderingContextFactory;
diff --git a/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasRenderingContext.h b/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasRenderingContext.h index b47aa08..341baa7 100644 --- a/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasRenderingContext.h +++ b/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasRenderingContext.h
@@ -22,8 +22,8 @@ }; static ContextType contextTypeFromId(const String& id); - OffscreenCanvas* offscreenCanvas() const { return m_offscreenCanvas; } - virtual ContextType contextType() const = 0; + OffscreenCanvas* getOffscreenCanvas() const { return m_offscreenCanvas; } + virtual ContextType getContextType() const = 0; virtual bool is2d() const { return false; }
diff --git a/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasRenderingContextFactory.h b/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasRenderingContextFactory.h index 9892cc7..3dd3498 100644 --- a/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasRenderingContextFactory.h +++ b/third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasRenderingContextFactory.h
@@ -22,7 +22,7 @@ virtual ~OffscreenCanvasRenderingContextFactory() { } virtual OffscreenCanvasRenderingContext* create(OffscreenCanvas*, const CanvasContextCreationAttributes&) = 0; - virtual OffscreenCanvasRenderingContext::ContextType contextType() const = 0; + virtual OffscreenCanvasRenderingContext::ContextType getContextType() const = 0; virtual void onError(OffscreenCanvas*, const String& error) = 0; };
diff --git a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp index 3349165..769e0a2 100644 --- a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp +++ b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp
@@ -48,12 +48,12 @@ int OffscreenCanvasRenderingContext2D::width() const { - return offscreenCanvas()->height(); + return getOffscreenCanvas()->height(); } int OffscreenCanvasRenderingContext2D::height() const { - return offscreenCanvas()->width(); + return getOffscreenCanvas()->width(); } bool OffscreenCanvasRenderingContext2D::hasImageBuffer() const
diff --git a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h index 1401fbc..defa199 100644 --- a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h +++ b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h
@@ -26,7 +26,7 @@ return new OffscreenCanvasRenderingContext2D(canvas, attrs); } - OffscreenCanvasRenderingContext::ContextType contextType() const override + OffscreenCanvasRenderingContext::ContextType getContextType() const override { return OffscreenCanvasRenderingContext::Context2d; } @@ -36,7 +36,7 @@ // OffscreenCanvasRenderingContext implementation ~OffscreenCanvasRenderingContext2D() override; - ContextType contextType() const override { return Context2d; } + ContextType getContextType() const override { return Context2d; } bool is2d() const override { return true; } // BaseRenderingContext2D implementation
diff --git a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.idl b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.idl index 5c33a57..88cee005 100644 --- a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.idl +++ b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.idl
@@ -10,7 +10,7 @@ RuntimeEnabled=ExperimentalCanvasFeatures, ] interface OffscreenCanvasRenderingContext2D { // back-reference to the canvas - readonly attribute OffscreenCanvas offscreenCanvas; + [ImplementedAs=getOffscreenCanvas] readonly attribute OffscreenCanvas offscreenCanvas; }; OffscreenCanvasRenderingContext2D implements CanvasPathMethods;
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp index d4a1c5f..fe3ab46 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
@@ -50,9 +50,9 @@ return EventTargetNames::PaymentRequest; } -ExecutionContext* PaymentRequest::executionContext() const +ExecutionContext* PaymentRequest::getExecutionContext() const { - return m_scriptState->executionContext(); + return m_scriptState->getExecutionContext(); } DEFINE_TRACE(PaymentRequest)
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.h b/third_party/WebKit/Source/modules/payments/PaymentRequest.h index 8f92cca..2e07114 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequest.h +++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.h
@@ -38,7 +38,7 @@ ScriptPromise show(ScriptState*); void abort(); - ShippingAddress* shippingAddress() const { return m_shippingAddress.get(); } + ShippingAddress* getShippingAddress() const { return m_shippingAddress.get(); } const String& shippingOption() const { return m_shippingOption; } DEFINE_ATTRIBUTE_EVENT_LISTENER(shippingaddresschange); @@ -46,7 +46,7 @@ // EventTargetWithInlineData: const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; DECLARE_TRACE();
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.idl b/third_party/WebKit/Source/modules/payments/PaymentRequest.idl index e586791e..6c324147 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequest.idl +++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.idl
@@ -15,7 +15,7 @@ [CallWith=ScriptState] Promise<PaymentResponse> show(); void abort(); - readonly attribute ShippingAddress? shippingAddress; + [ImplementedAs=getShippingAddress] readonly attribute ShippingAddress? shippingAddress; readonly attribute DOMString? shippingOption; attribute EventHandler onshippingaddresschange;
diff --git a/third_party/WebKit/Source/modules/permissions/PermissionCallback.cpp b/third_party/WebKit/Source/modules/permissions/PermissionCallback.cpp index 97ee496..0ea00dd 100644 --- a/third_party/WebKit/Source/modules/permissions/PermissionCallback.cpp +++ b/third_party/WebKit/Source/modules/permissions/PermissionCallback.cpp
@@ -22,7 +22,7 @@ void PermissionCallback::onSuccess(WebPermissionStatus permissionStatus) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) { return; } m_resolver->resolve(PermissionStatus::take(m_resolver.get(), permissionStatus, m_permissionType)); @@ -30,7 +30,7 @@ void PermissionCallback::onError() { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) { return; } m_resolver->reject();
diff --git a/third_party/WebKit/Source/modules/permissions/PermissionStatus.cpp b/third_party/WebKit/Source/modules/permissions/PermissionStatus.cpp index b2b14b63..fcc5159 100644 --- a/third_party/WebKit/Source/modules/permissions/PermissionStatus.cpp +++ b/third_party/WebKit/Source/modules/permissions/PermissionStatus.cpp
@@ -18,7 +18,7 @@ // static PermissionStatus* PermissionStatus::take(ScriptPromiseResolver* resolver, WebPermissionStatus status, WebPermissionType type) { - return PermissionStatus::createAndListen(resolver->executionContext(), status, type); + return PermissionStatus::createAndListen(resolver->getExecutionContext(), status, type); } PermissionStatus* PermissionStatus::createAndListen(ExecutionContext* executionContext, WebPermissionStatus status, WebPermissionType type) @@ -47,9 +47,9 @@ return EventTargetNames::PermissionStatus; } -ExecutionContext* PermissionStatus::executionContext() const +ExecutionContext* PermissionStatus::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } void PermissionStatus::permissionChanged(WebPermissionType type, WebPermissionStatus status) @@ -86,11 +86,11 @@ { ASSERT(!m_listening); - WebPermissionClient* client = Permissions::getClient(executionContext()); + WebPermissionClient* client = Permissions::getClient(getExecutionContext()); if (!client) return; m_listening = true; - client->startListening(m_type, KURL(KURL(), executionContext()->securityOrigin()->toString()), this); + client->startListening(m_type, KURL(KURL(), getExecutionContext()->getSecurityOrigin()->toString()), this); } void PermissionStatus::stopListening() @@ -98,10 +98,10 @@ if (!m_listening) return; - ASSERT(executionContext()); + ASSERT(getExecutionContext()); m_listening = false; - WebPermissionClient* client = Permissions::getClient(executionContext()); + WebPermissionClient* client = Permissions::getClient(getExecutionContext()); if (!client) return; client->stopListening(this);
diff --git a/third_party/WebKit/Source/modules/permissions/PermissionStatus.h b/third_party/WebKit/Source/modules/permissions/PermissionStatus.h index 0b1051c9..ba88e2f 100644 --- a/third_party/WebKit/Source/modules/permissions/PermissionStatus.h +++ b/third_party/WebKit/Source/modules/permissions/PermissionStatus.h
@@ -36,7 +36,7 @@ // EventTarget implementation. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // WebPermissionObserver implementation. void permissionChanged(WebPermissionType, WebPermissionStatus) override;
diff --git a/third_party/WebKit/Source/modules/permissions/Permissions.cpp b/third_party/WebKit/Source/modules/permissions/Permissions.cpp index d46439c4..24a27aca 100644 --- a/third_party/WebKit/Source/modules/permissions/Permissions.cpp +++ b/third_party/WebKit/Source/modules/permissions/Permissions.cpp
@@ -102,7 +102,7 @@ ScriptPromise Permissions::query(ScriptState* scriptState, const Dictionary& rawPermission) { - WebPermissionClient* client = getClient(scriptState->executionContext()); + WebPermissionClient* client = getClient(scriptState->getExecutionContext()); if (!client) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't query permissions.")); @@ -118,13 +118,13 @@ // meaningful value because most APIs are broken on file scheme and no // permission prompt will be shown even if the returned permission will most // likely be "prompt". - client->queryPermission(type.get(), KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new PermissionCallback(resolver, type.get())); + client->queryPermission(type.get(), KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new PermissionCallback(resolver, type.get())); return promise; } ScriptPromise Permissions::request(ScriptState* scriptState, const Dictionary& rawPermission) { - WebPermissionClient* client = getClient(scriptState->executionContext()); + WebPermissionClient* client = getClient(scriptState->getExecutionContext()); if (!client) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't request permissions.")); @@ -136,13 +136,13 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - client->requestPermission(type.get(), KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new PermissionCallback(resolver, type.get())); + client->requestPermission(type.get(), KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new PermissionCallback(resolver, type.get())); return promise; } ScriptPromise Permissions::revoke(ScriptState* scriptState, const Dictionary& rawPermission) { - WebPermissionClient* client = getClient(scriptState->executionContext()); + WebPermissionClient* client = getClient(scriptState->getExecutionContext()); if (!client) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't revoke permissions.")); @@ -154,13 +154,13 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - client->revokePermission(type.get(), KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new PermissionCallback(resolver, type.get())); + client->revokePermission(type.get(), KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new PermissionCallback(resolver, type.get())); return promise; } ScriptPromise Permissions::requestAll(ScriptState* scriptState, const Vector<Dictionary>& rawPermissions) { - WebPermissionClient* client = getClient(scriptState->executionContext()); + WebPermissionClient* client = getClient(scriptState->getExecutionContext()); if (!client) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't request permissions.")); @@ -191,7 +191,7 @@ ScriptPromise promise = resolver->promise(); WebVector<WebPermissionType> internalWebPermissions = *internalPermissions; - client->requestPermissions(internalWebPermissions, KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), + client->requestPermissions(internalWebPermissions, KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new PermissionsCallback(resolver, internalPermissions.release(), callerIndexToInternalIndex.release())); return promise; }
diff --git a/third_party/WebKit/Source/modules/permissions/PermissionsCallback.cpp b/third_party/WebKit/Source/modules/permissions/PermissionsCallback.cpp index 847f4e2..7d967ab 100644 --- a/third_party/WebKit/Source/modules/permissions/PermissionsCallback.cpp +++ b/third_party/WebKit/Source/modules/permissions/PermissionsCallback.cpp
@@ -19,7 +19,7 @@ void PermissionsCallback::onSuccess(WebPassOwnPtr<WebVector<WebPermissionStatus>> permissionStatus) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; OwnPtr<WebVector<WebPermissionStatus>> statusPtr = permissionStatus.release(); @@ -30,14 +30,14 @@ // using the internal index obtained. for (size_t i = 0; i < m_callerIndexToInternalIndex->size(); ++i) { int internalIndex = m_callerIndexToInternalIndex->operator[](i); - result[i] = PermissionStatus::createAndListen(m_resolver->executionContext(), statusPtr->operator[](internalIndex), m_internalPermissions->operator[](internalIndex)); + result[i] = PermissionStatus::createAndListen(m_resolver->getExecutionContext(), statusPtr->operator[](internalIndex), m_internalPermissions->operator[](internalIndex)); } m_resolver->resolve(result); } void PermissionsCallback::onError() { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(); }
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp index 50ebc37..04f81fe 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp
@@ -33,7 +33,7 @@ // static PresentationAvailability* PresentationAvailability::take(ScriptPromiseResolver* resolver, const KURL& url, bool value) { - PresentationAvailability* presentationAvailability = new PresentationAvailability(resolver->executionContext(), url, value); + PresentationAvailability* presentationAvailability = new PresentationAvailability(resolver->getExecutionContext(), url, value); presentationAvailability->suspendIfNeeded(); presentationAvailability->updateListening(); return presentationAvailability; @@ -58,15 +58,15 @@ return EventTargetNames::PresentationAvailability; } -ExecutionContext* PresentationAvailability::executionContext() const +ExecutionContext* PresentationAvailability::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } bool PresentationAvailability::addEventListenerInternal(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, const EventListenerOptions& options) { if (eventType == EventTypeNames::change) - UseCounter::count(executionContext(), UseCounter::PresentationAvailabilityChangeEventListener); + UseCounter::count(getExecutionContext(), UseCounter::PresentationAvailabilityChangeEventListener); return EventTarget::addEventListenerInternal(eventType, listener, options); } @@ -115,11 +115,11 @@ void PresentationAvailability::updateListening() { - WebPresentationClient* client = presentationClient(executionContext()); + WebPresentationClient* client = presentationClient(getExecutionContext()); if (!client) return; - if (m_state == State::Active && (toDocument(executionContext())->pageVisibilityState() == PageVisibilityStateVisible)) + if (m_state == State::Active && (toDocument(getExecutionContext())->pageVisibilityState() == PageVisibilityStateVisible)) client->startListening(this); else client->stopListening(this);
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.h b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.h index ecc3f5206..06e454e8 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.h +++ b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.h
@@ -36,7 +36,7 @@ // EventTarget implementation. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // WebPresentationAvailabilityObserver implementation. void availabilityChanged(bool) override;
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityCallbacks.cpp b/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityCallbacks.cpp index c1e69eb..1b631ea 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityCallbacks.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityCallbacks.cpp
@@ -25,14 +25,14 @@ void PresentationAvailabilityCallbacks::onSuccess(bool value) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(PresentationAvailability::take(m_resolver.get(), m_url, value)); } void PresentationAvailabilityCallbacks::onError(const WebPresentationError& error) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(PresentationError::take(m_resolver.get(), error)); }
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityTest.cpp b/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityTest.cpp index 545a1404..664b623 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityTest.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityTest.cpp
@@ -27,12 +27,12 @@ void SetUp() override { - m_scope.scriptState()->setExecutionContext(&m_page->document()); + m_scope.getScriptState()->setExecutionContext(&m_page->document()); } Page& page() { return m_page->page(); } LocalFrame& frame() { return m_page->frame(); } - ScriptState* scriptState() { return m_scope.scriptState(); } + ScriptState* getScriptState() { return m_scope.getScriptState(); } private: V8TestingScope m_scope; @@ -42,7 +42,7 @@ TEST_F(PresentationAvailabilityTest, NoPageVisibilityChangeAfterDetach) { const KURL url = URLTestHelpers::toKURL("https://example.com"); - Persistent<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState()); + Persistent<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(getScriptState()); Persistent<PresentationAvailability> availability = PresentationAvailability::take(resolver, url, false); // These two calls should not crash.
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp b/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp index 716c872..9c1ee108 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
@@ -94,7 +94,7 @@ : m_PresentationConnection(PresentationConnection) , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) { - m_loader.start(m_PresentationConnection->executionContext(), blobDataHandle); + m_loader.start(m_PresentationConnection->getExecutionContext(), blobDataHandle); } ~BlobLoader() override { } @@ -145,9 +145,9 @@ ASSERT(resolver); ASSERT(client); ASSERT(request); - ASSERT(resolver->executionContext()->isDocument()); + ASSERT(resolver->getExecutionContext()->isDocument()); - Document* document = toDocument(resolver->executionContext()); + Document* document = toDocument(resolver->getExecutionContext()); if (!document->frame()) return nullptr; @@ -176,7 +176,7 @@ return EventTargetNames::PresentationConnection; } -ExecutionContext* PresentationConnection::executionContext() const +ExecutionContext* PresentationConnection::getExecutionContext() const { if (!frame()) return nullptr; @@ -186,15 +186,15 @@ bool PresentationConnection::addEventListenerInternal(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, const EventListenerOptions& options) { if (eventType == EventTypeNames::statechange) - Deprecation::countDeprecation(executionContext(), UseCounter::PresentationConnectionStateChangeEventListener); + Deprecation::countDeprecation(getExecutionContext(), UseCounter::PresentationConnectionStateChangeEventListener); else if (eventType == EventTypeNames::connect) - UseCounter::count(executionContext(), UseCounter::PresentationConnectionConnectEventListener); + UseCounter::count(getExecutionContext(), UseCounter::PresentationConnectionConnectEventListener); else if (eventType == EventTypeNames::close) - UseCounter::count(executionContext(), UseCounter::PresentationConnectionCloseEventListener); + UseCounter::count(getExecutionContext(), UseCounter::PresentationConnectionCloseEventListener); else if (eventType == EventTypeNames::terminate) - UseCounter::count(executionContext(), UseCounter::PresentationConnectionTerminateEventListener); + UseCounter::count(getExecutionContext(), UseCounter::PresentationConnectionTerminateEventListener); else if (eventType == EventTypeNames::message) - UseCounter::count(executionContext(), UseCounter::PresentationConnectionMessageEventListener); + UseCounter::count(getExecutionContext(), UseCounter::PresentationConnectionMessageEventListener); return EventTarget::addEventListenerInternal(eventType, listener, options); } @@ -258,12 +258,12 @@ } // The connection can send a message if there is a client available. - return !!presentationClient(executionContext()); + return !!presentationClient(getExecutionContext()); } void PresentationConnection::handleMessageQueue() { - WebPresentationClient* client = presentationClient(executionContext()); + WebPresentationClient* client = presentationClient(getExecutionContext()); if (!client) return; @@ -344,7 +344,7 @@ { if (m_state != WebPresentationConnectionState::Connected) return; - WebPresentationClient* client = presentationClient(executionContext()); + WebPresentationClient* client = presentationClient(getExecutionContext()); if (client) client->closeSession(m_url, m_id); @@ -355,7 +355,7 @@ { if (m_state != WebPresentationConnectionState::Connected) return; - WebPresentationClient* client = presentationClient(executionContext()); + WebPresentationClient* client = presentationClient(getExecutionContext()); if (client) client->terminateSession(m_url, m_id); @@ -402,7 +402,7 @@ ASSERT(!m_messages.isEmpty() && m_messages.first()->type == MessageTypeBlob); ASSERT(buffer && buffer->buffer()); // Send the loaded blob immediately here and continue processing the queue. - WebPresentationClient* client = presentationClient(executionContext()); + WebPresentationClient* client = presentationClient(getExecutionContext()); if (client) client->sendBlobData(m_url, m_id, static_cast<const uint8_t*>(buffer->data()), buffer->byteLength());
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnection.h b/third_party/WebKit/Source/modules/presentation/PresentationConnection.h index 0bcf82c..eb0f0c0 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationConnection.h +++ b/third_party/WebKit/Source/modules/presentation/PresentationConnection.h
@@ -41,7 +41,7 @@ // EventTarget implementation. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnectionCallbacks.cpp b/third_party/WebKit/Source/modules/presentation/PresentationConnectionCallbacks.cpp index 241a90a..ee05de9 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationConnectionCallbacks.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationConnectionCallbacks.cpp
@@ -25,14 +25,14 @@ { OwnPtr<WebPresentationConnectionClient> result(PresentationConnectionClient.release()); - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(PresentationConnection::take(m_resolver.get(), result.release(), m_request)); } void PresentationConnectionCallbacks::onError(const WebPresentationError& error) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(PresentationError::take(m_resolver.get(), error)); }
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.cpp b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.cpp index 8087825d..9d2bf95 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.cpp
@@ -22,7 +22,7 @@ return EventTargetNames::PresentationReceiver; } -ExecutionContext* PresentationReceiver::executionContext() const +ExecutionContext* PresentationReceiver::getExecutionContext() const { return frame() ? frame()->document() : nullptr; }
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.h b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.h index 412f222b..52055f14 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.h +++ b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.h
@@ -27,7 +27,7 @@ // EventTarget implementation. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; ScriptPromise getConnection(ScriptState*); ScriptPromise getConnections(ScriptState*);
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp b/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp index 381ce7a..66f1cce 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp
@@ -66,22 +66,22 @@ return EventTargetNames::PresentationRequest; } -ExecutionContext* PresentationRequest::executionContext() const +ExecutionContext* PresentationRequest::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } bool PresentationRequest::addEventListenerInternal(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, const EventListenerOptions& options) { if (eventType == EventTypeNames::connectionavailable) - UseCounter::count(executionContext(), UseCounter::PresentationRequestConnectionAvailableEventListener); + UseCounter::count(getExecutionContext(), UseCounter::PresentationRequestConnectionAvailableEventListener); return EventTarget::addEventListenerInternal(eventType, listener, options); } bool PresentationRequest::hasPendingActivity() const { - if (!executionContext() || executionContext()->activeDOMObjectsAreStopped()) + if (!getExecutionContext() || getExecutionContext()->activeDOMObjectsAreStopped()) return false; // Prevents garbage collecting of this object when not hold by another @@ -94,7 +94,7 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - Settings* contextSettings = settings(executionContext()); + Settings* contextSettings = settings(getExecutionContext()); bool isUserGestureRequired = !contextSettings || contextSettings->presentationRequiresUserGesture(); if (isUserGestureRequired && !UserGestureIndicator::processingUserGesture()) { @@ -102,7 +102,7 @@ return promise; } - WebPresentationClient* client = presentationClient(executionContext()); + WebPresentationClient* client = presentationClient(getExecutionContext()); if (!client) { resolver->reject(DOMException::create(InvalidStateError, "The PresentationRequest is no longer associated to a frame.")); return promise; @@ -117,7 +117,7 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - WebPresentationClient* client = presentationClient(executionContext()); + WebPresentationClient* client = presentationClient(getExecutionContext()); if (!client) { resolver->reject(DOMException::create(InvalidStateError, "The PresentationRequest is no longer associated to a frame.")); return promise; @@ -132,7 +132,7 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - WebPresentationClient* client = presentationClient(executionContext()); + WebPresentationClient* client = presentationClient(getExecutionContext()); if (!client) { resolver->reject(DOMException::create(InvalidStateError, "The object is no longer associated to a frame.")); return promise;
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationRequest.h b/third_party/WebKit/Source/modules/presentation/PresentationRequest.h index 84cdb97b..8e355b7a 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationRequest.h +++ b/third_party/WebKit/Source/modules/presentation/PresentationRequest.h
@@ -29,7 +29,7 @@ // EventTarget implementation. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject implementation. bool hasPendingActivity() const;
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushEvent.cpp b/third_party/WebKit/Source/modules/push_messaging/PushEvent.cpp index 82ee42e..d0c05b3 100644 --- a/third_party/WebKit/Source/modules/push_messaging/PushEvent.cpp +++ b/third_party/WebKit/Source/modules/push_messaging/PushEvent.cpp
@@ -36,9 +36,6 @@ PushMessageData* PushEvent::data() { - if (!m_data) - m_data = PushMessageData::create(); - return m_data.get(); }
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushManager.cpp b/third_party/WebKit/Source/modules/push_messaging/PushManager.cpp index 0f5a2ff..3233758e 100644 --- a/third_party/WebKit/Source/modules/push_messaging/PushManager.cpp +++ b/third_party/WebKit/Source/modules/push_messaging/PushManager.cpp
@@ -60,8 +60,8 @@ // The document context is the only reasonable context from which to ask the user for permission // to use the Push API. The embedder should persist the permission so that later calls in // different contexts can succeed. - if (scriptState->executionContext()->isDocument()) { - Document* document = toDocument(scriptState->executionContext()); + if (scriptState->getExecutionContext()->isDocument()) { + Document* document = toDocument(scriptState->getExecutionContext()); if (!document->domWindow() || !document->frame()) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "Document is detached from window.")); PushController::clientFrom(document->frame()).subscribe(m_registration->webRegistration(), toWebPushSubscriptionOptions(options), new PushSubscriptionCallbacks(resolver, m_registration)); @@ -83,8 +83,8 @@ ScriptPromise PushManager::permissionState(ScriptState* scriptState, const PushSubscriptionOptions& options) { - if (scriptState->executionContext()->isDocument()) { - Document* document = toDocument(scriptState->executionContext()); + if (scriptState->getExecutionContext()->isDocument()) { + Document* document = toDocument(scriptState->getExecutionContext()); if (!document->domWindow() || !document->frame()) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "Document is detached from window.")); }
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp b/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp index ea261745..a7b133d 100644 --- a/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp +++ b/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp
@@ -42,11 +42,7 @@ } ASSERT(messageData.isNull()); - return new PushMessageData(); -} - -PushMessageData::PushMessageData() -{ + return nullptr; } PushMessageData::PushMessageData(const char* data, unsigned bytesSize)
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushMessageData.h b/third_party/WebKit/Source/modules/push_messaging/PushMessageData.h index 9861206a..fffa8bd4 100644 --- a/third_party/WebKit/Source/modules/push_messaging/PushMessageData.h +++ b/third_party/WebKit/Source/modules/push_messaging/PushMessageData.h
@@ -24,10 +24,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static PushMessageData* create() - { - return new PushMessageData(); - } static PushMessageData* create(const String& data); static PushMessageData* create(const ArrayBufferOrArrayBufferViewOrUSVString& data); @@ -41,7 +37,6 @@ DECLARE_TRACE(); private: - PushMessageData(); PushMessageData(const char* data, unsigned bytesSize); Vector<char> m_data;
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushPermissionStatusCallbacks.cpp b/third_party/WebKit/Source/modules/push_messaging/PushPermissionStatusCallbacks.cpp index 455c690..20d6a68 100644 --- a/third_party/WebKit/Source/modules/push_messaging/PushPermissionStatusCallbacks.cpp +++ b/third_party/WebKit/Source/modules/push_messaging/PushPermissionStatusCallbacks.cpp
@@ -26,7 +26,7 @@ void PushPermissionStatusCallbacks::onError(const WebPushError& error) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(PushError::take(m_resolver.get(), error)); }
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushSubscriptionCallbacks.cpp b/third_party/WebKit/Source/modules/push_messaging/PushSubscriptionCallbacks.cpp index c854bee..b36197e 100644 --- a/third_party/WebKit/Source/modules/push_messaging/PushSubscriptionCallbacks.cpp +++ b/third_party/WebKit/Source/modules/push_messaging/PushSubscriptionCallbacks.cpp
@@ -26,7 +26,7 @@ void PushSubscriptionCallbacks::onSuccess(WebPassOwnPtr<WebPushSubscription> webPushSubscription) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(PushSubscription::take(m_resolver.get(), webPushSubscription.release(), m_serviceWorkerRegistration)); @@ -34,7 +34,7 @@ void PushSubscriptionCallbacks::onError(const WebPushError& error) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(PushError::take(m_resolver.get(), error)); }
diff --git a/third_party/WebKit/Source/modules/quota/DeprecatedStorageQuota.cpp b/third_party/WebKit/Source/modules/quota/DeprecatedStorageQuota.cpp index 7756a73..3d4024aa 100644 --- a/third_party/WebKit/Source/modules/quota/DeprecatedStorageQuota.cpp +++ b/third_party/WebKit/Source/modules/quota/DeprecatedStorageQuota.cpp
@@ -62,7 +62,7 @@ return; } - SecurityOrigin* securityOrigin = executionContext->securityOrigin(); + SecurityOrigin* securityOrigin = executionContext->getSecurityOrigin(); if (securityOrigin->isUnique()) { executionContext->postTask(BLINK_FROM_HERE, StorageErrorCallback::createSameThreadTask(errorCallback, NotSupportedError)); return;
diff --git a/third_party/WebKit/Source/modules/quota/StorageManager.cpp b/third_party/WebKit/Source/modules/quota/StorageManager.cpp index dd7cf49..d35efdf 100644 --- a/third_party/WebKit/Source/modules/quota/StorageManager.cpp +++ b/third_party/WebKit/Source/modules/quota/StorageManager.cpp
@@ -75,8 +75,8 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - ExecutionContext* executionContext = scriptState->executionContext(); - SecurityOrigin* securityOrigin = executionContext->securityOrigin(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); + SecurityOrigin* securityOrigin = executionContext->getSecurityOrigin(); // TODO(dgrogan): Is the isUnique() check covered by the later // isSecureContext() check? If so, maybe remove it. Write a test if it // stays. @@ -95,7 +95,7 @@ resolver->reject(DOMException::create(InvalidStateError, "In its current state, the global scope can't request permissions.")); return promise; } - permissionClient->requestPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new DurableStorageRequestCallbacks(resolver)); + permissionClient->requestPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new DurableStorageRequestCallbacks(resolver)); return promise; } @@ -104,12 +104,12 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - WebPermissionClient* permissionClient = Permissions::getClient(scriptState->executionContext()); + WebPermissionClient* permissionClient = Permissions::getClient(scriptState->getExecutionContext()); if (!permissionClient) { resolver->reject(DOMException::create(InvalidStateError, "In its current state, the global scope can't query permissions.")); return promise; } - permissionClient->queryPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new DurableStorageQueryCallbacks(resolver)); + permissionClient->queryPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new DurableStorageQueryCallbacks(resolver)); return promise; }
diff --git a/third_party/WebKit/Source/modules/quota/StorageQuota.cpp b/third_party/WebKit/Source/modules/quota/StorageQuota.cpp index 9ec34fe..3a92298 100644 --- a/third_party/WebKit/Source/modules/quota/StorageQuota.cpp +++ b/third_party/WebKit/Source/modules/quota/StorageQuota.cpp
@@ -86,7 +86,7 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - SecurityOrigin* securityOrigin = scriptState->executionContext()->securityOrigin(); + SecurityOrigin* securityOrigin = scriptState->getExecutionContext()->getSecurityOrigin(); if (securityOrigin->isUnique()) { resolver->reject(DOMError::create(NotSupportedError)); return promise; @@ -100,7 +100,7 @@ ScriptPromise StorageQuota::requestPersistentQuota(ScriptState* scriptState, unsigned long long newQuota) { - StorageQuotaClient* client = StorageQuotaClient::from(scriptState->executionContext()); + StorageQuotaClient* client = StorageQuotaClient::from(scriptState->getExecutionContext()); if (!client) { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise();
diff --git a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientation.cpp b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientation.cpp index e0afb083..616b951 100644 --- a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientation.cpp +++ b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientation.cpp
@@ -123,7 +123,7 @@ return EventTargetNames::ScreenOrientation; } -ExecutionContext* ScreenOrientation::executionContext() const +ExecutionContext* ScreenOrientation::getExecutionContext() const { if (!m_frame) return 0;
diff --git a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientation.h b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientation.h index a813e36..fa48114 100644 --- a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientation.h +++ b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientation.h
@@ -34,7 +34,7 @@ // EventTarget implementation. const WTF::AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; String type() const; unsigned short angle() const;
diff --git a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp index 84715af..43feeee 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp
@@ -63,7 +63,7 @@ ServiceWorkerGlobalScopeClient* client = ServiceWorkerGlobalScopeClient::from(executionContext); String scopePath = static_cast<KURL>(client->scope()).path(); - RefPtr<SecurityOrigin> origin = executionContext->securityOrigin(); + RefPtr<SecurityOrigin> origin = executionContext->getSecurityOrigin(); if (!options.hasScopes() || options.scopes().isEmpty()) { exceptionState.throwTypeError("At least one scope is required");
diff --git a/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp b/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp index 7bb33cc..8602f43 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp
@@ -35,7 +35,7 @@ if (!supplement) { supplement = new NavigatorServiceWorker(navigator); provideTo(navigator, supplementName(), supplement); - if (navigator.frame() && navigator.frame()->securityContext()->securityOrigin()->canAccessServiceWorkers()) { + if (navigator.frame() && navigator.frame()->securityContext()->getSecurityOrigin()->canAccessServiceWorkers()) { // Initialize ServiceWorkerContainer too. supplement->serviceWorker(ASSERT_NO_EXCEPTION); } @@ -55,13 +55,13 @@ ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(ExecutionContext* executionContext, Navigator& navigator, ExceptionState& exceptionState) { - ASSERT(!navigator.frame() || executionContext->securityOrigin()->canAccessCheckSuborigins(navigator.frame()->securityContext()->securityOrigin())); + ASSERT(!navigator.frame() || executionContext->getSecurityOrigin()->canAccessCheckSuborigins(navigator.frame()->securityContext()->getSecurityOrigin())); return NavigatorServiceWorker::from(navigator).serviceWorker(exceptionState); } ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(ExceptionState& exceptionState) { - if (frame() && !frame()->securityContext()->securityOrigin()->canAccessServiceWorkers()) { + if (frame() && !frame()->securityContext()->getSecurityOrigin()->canAccessServiceWorkers()) { if (frame()->securityContext()->isSandboxed(SandboxOrigin)) exceptionState.throwSecurityError("Service worker is disabled because the context is sandboxed and lacks the 'allow-same-origin' flag."); else @@ -70,7 +70,7 @@ } if (!m_serviceWorker && frame()) { ASSERT(frame()->domWindow()); - m_serviceWorker = ServiceWorkerContainer::create(frame()->domWindow()->executionContext()); + m_serviceWorker = ServiceWorkerContainer::create(frame()->domWindow()->getExecutionContext()); } return m_serviceWorker.get(); }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp b/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp index 7d90aee4..5c3f91d 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp
@@ -122,7 +122,7 @@ ASSERT(m_resolveType == Fulfilled || m_resolveType == Rejected); if (m_resolveType == Rejected) { m_observer->responseWasRejected(WebServiceWorkerResponseErrorPromiseRejected); - value = ScriptPromise::reject(value.scriptState(), value).getScriptValue(); + value = ScriptPromise::reject(value.getScriptState(), value).getScriptValue(); } else { m_observer->responseWasFulfilled(value); } @@ -147,7 +147,7 @@ void RespondWithObserver::didDispatchEvent(DispatchEventResult dispatchResult) { - ASSERT(executionContext()); + ASSERT(getExecutionContext()); if (m_state != Initial) return; @@ -156,7 +156,7 @@ return; } - ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID); + ServiceWorkerGlobalScopeClient::from(getExecutionContext())->didHandleFetchEvent(m_eventID); m_state = Done; } @@ -175,25 +175,25 @@ void RespondWithObserver::responseWasRejected(WebServiceWorkerResponseError error) { - ASSERT(executionContext()); - executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, getMessageForResponseError(error, m_requestURL))); + ASSERT(getExecutionContext()); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, getMessageForResponseError(error, m_requestURL))); // The default value of WebServiceWorkerResponse's status is 0, which maps // to a network error. WebServiceWorkerResponse webResponse; webResponse.setError(error); - ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID, webResponse); + ServiceWorkerGlobalScopeClient::from(getExecutionContext())->didHandleFetchEvent(m_eventID, webResponse); m_state = Done; } void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) { - ASSERT(executionContext()); - if (!V8Response::hasInstance(value.v8Value(), toIsolate(executionContext()))) { + ASSERT(getExecutionContext()); + if (!V8Response::hasInstance(value.v8Value(), toIsolate(getExecutionContext()))) { responseWasRejected(WebServiceWorkerResponseErrorNoV8Instance); return; } - Response* response = V8Response::toImplWithTypeCheck(toIsolate(executionContext()), value.v8Value()); + Response* response = V8Response::toImplWithTypeCheck(toIsolate(getExecutionContext()), value.v8Value()); // "If one of the following conditions is true, return a network error: // - |response|'s type is |error|. // - |request|'s mode is not |no-cors| and response's type is |opaque|. @@ -241,12 +241,12 @@ if (blobDataHandle) { webResponse.setBlobDataHandle(blobDataHandle); } else { - Stream* outStream = Stream::create(executionContext(), ""); + Stream* outStream = Stream::create(getExecutionContext(), ""); webResponse.setStreamURL(outStream->url()); - buffer->startLoading(executionContext(), FetchDataLoader::createLoaderAsStream(outStream), new NoopLoaderClient); + buffer->startLoading(getExecutionContext(), FetchDataLoader::createLoaderAsStream(outStream), new NoopLoaderClient); } } - ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID, webResponse); + ServiceWorkerGlobalScopeClient::from(getExecutionContext())->didHandleFetchEvent(m_eventID, webResponse); m_state = Done; }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp index 9ad3c6a..85047432 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp
@@ -130,7 +130,7 @@ ServiceWorker* existingWorker = static_cast<ServiceWorker*>(handle->serviceWorker()->proxy()); if (existingWorker) { - ASSERT(existingWorker->executionContext() == executionContext); + ASSERT(existingWorker->getExecutionContext() == executionContext); return existingWorker; }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerClients.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerClients.cpp index 63a51494..0e458ccf 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerClients.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerClients.cpp
@@ -69,7 +69,7 @@ void onSuccess(WebPassOwnPtr<WebServiceWorkerClientInfo> webClient) override { OwnPtr<WebServiceWorkerClientInfo> client = webClient.release(); - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (!client) { // Resolve the promise with undefined. @@ -81,7 +81,7 @@ void onError(const WebServiceWorkerError& error) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(ServiceWorkerError::take(m_resolver.get(), error)); } @@ -104,7 +104,7 @@ ScriptPromise ServiceWorkerClients::get(ScriptState* scriptState, const String& id) { - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); // TODO(jungkees): May be null due to worker termination: http://crbug.com/413518. if (!executionContext) return ScriptPromise(); @@ -118,7 +118,7 @@ ScriptPromise ServiceWorkerClients::matchAll(ScriptState* scriptState, const ClientQueryOptions& options) { - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); // FIXME: May be null due to worker termination: http://crbug.com/413518. if (!executionContext) return ScriptPromise(); @@ -135,7 +135,7 @@ ScriptPromise ServiceWorkerClients::claim(ScriptState* scriptState) { - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); // FIXME: May be null due to worker termination: http://crbug.com/413518. if (!executionContext) @@ -153,7 +153,7 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - ExecutionContext* context = scriptState->executionContext(); + ExecutionContext* context = scriptState->getExecutionContext(); KURL parsedUrl = KURL(toWorkerGlobalScope(context)->location()->url(), url); if (!parsedUrl.isValid()) { @@ -161,7 +161,7 @@ return promise; } - if (!context->securityOrigin()->canDisplay(parsedUrl)) { + if (!context->getSecurityOrigin()->canDisplay(parsedUrl)) { resolver->reject(V8ThrowException::createTypeError(scriptState->isolate(), "'" + parsedUrl.elidedString() + "' cannot be opened.")); return promise; }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp index 9b51861..8603e878 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
@@ -66,14 +66,14 @@ void onSuccess(WebPassOwnPtr<WebServiceWorkerRegistration::Handle> handle) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; - m_resolver->resolve(ServiceWorkerRegistration::getOrCreate(m_resolver->executionContext(), handle.release())); + m_resolver->resolve(ServiceWorkerRegistration::getOrCreate(m_resolver->getExecutionContext(), handle.release())); } void onError(const WebServiceWorkerError& error) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(ServiceWorkerError::take(m_resolver.get(), error)); } @@ -92,19 +92,19 @@ void onSuccess(WebPassOwnPtr<WebServiceWorkerRegistration::Handle> webPassHandle) override { OwnPtr<WebServiceWorkerRegistration::Handle> handle = webPassHandle.release(); - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (!handle) { // Resolve the promise with undefined. m_resolver->resolve(); return; } - m_resolver->resolve(ServiceWorkerRegistration::getOrCreate(m_resolver->executionContext(), handle.release())); + m_resolver->resolve(ServiceWorkerRegistration::getOrCreate(m_resolver->getExecutionContext(), handle.release())); } void onError(const WebServiceWorkerError& error) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(ServiceWorkerError::take(m_resolver.get(), error)); } @@ -128,14 +128,14 @@ handles.append(adoptPtr(handle)); } - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(ServiceWorkerRegistrationArray::take(m_resolver.get(), &handles)); } void onError(const WebServiceWorkerError& error) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(ServiceWorkerError::take(m_resolver.get(), error)); } @@ -155,8 +155,8 @@ { ASSERT(m_ready->getState() == ReadyProperty::Pending); - if (m_ready->executionContext() && !m_ready->executionContext()->activeDOMObjectsAreStopped()) - m_ready->resolve(ServiceWorkerRegistration::getOrCreate(m_ready->executionContext(), handle.release())); + if (m_ready->getExecutionContext() && !m_ready->getExecutionContext()->activeDOMObjectsAreStopped()) + m_ready->resolve(ServiceWorkerRegistration::getOrCreate(m_ready->getExecutionContext(), handle.release())); } private: @@ -200,12 +200,12 @@ return promise; } - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); // FIXME: May be null due to worker termination: http://crbug.com/413518. if (!executionContext) return ScriptPromise(); - RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); + RefPtr<SecurityOrigin> documentOrigin = executionContext->getSecurityOrigin(); String errorMessage; // Restrict to secure origins: https://w3c.github.io/webappsec/specs/powerfulfeatures/#settings-privileged if (!executionContext->isSecureContext(errorMessage)) { @@ -269,12 +269,12 @@ return promise; } - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); // FIXME: May be null due to worker termination: http://crbug.com/413518. if (!executionContext) return ScriptPromise(); - RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); + RefPtr<SecurityOrigin> documentOrigin = executionContext->getSecurityOrigin(); String errorMessage; if (!executionContext->isSecureContext(errorMessage)) { resolver->reject(DOMException::create(SecurityError, errorMessage)); @@ -309,8 +309,8 @@ return promise; } - ExecutionContext* executionContext = scriptState->executionContext(); - RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); + RefPtr<SecurityOrigin> documentOrigin = executionContext->getSecurityOrigin(); String errorMessage; if (!executionContext->isSecureContext(errorMessage)) { resolver->reject(DOMException::create(SecurityError, errorMessage)); @@ -330,12 +330,12 @@ ServiceWorkerContainer::ReadyProperty* ServiceWorkerContainer::createReadyProperty() { - return new ReadyProperty(executionContext(), this, ReadyProperty::Ready); + return new ReadyProperty(getExecutionContext(), this, ReadyProperty::Ready); } ScriptPromise ServiceWorkerContainer::ready(ScriptState* callerState) { - if (!executionContext()) + if (!getExecutionContext()) return ScriptPromise(); if (!callerState->world().isMainWorld()) { @@ -355,24 +355,24 @@ void ServiceWorkerContainer::setController(WebPassOwnPtr<WebServiceWorker::Handle> handle, bool shouldNotifyControllerChange) { - if (!executionContext()) + if (!getExecutionContext()) return; - m_controller = ServiceWorker::from(executionContext(), handle.release()); + m_controller = ServiceWorker::from(getExecutionContext(), handle.release()); if (m_controller) - UseCounter::count(executionContext(), UseCounter::ServiceWorkerControlledPage); + UseCounter::count(getExecutionContext(), UseCounter::ServiceWorkerControlledPage); if (shouldNotifyControllerChange) dispatchEvent(Event::create(EventTypeNames::controllerchange)); } void ServiceWorkerContainer::dispatchMessageEvent(WebPassOwnPtr<WebServiceWorker::Handle> handle, const WebString& message, const WebMessagePortChannelArray& webChannels) { - if (!executionContext() || !executionContext()->executingWindow()) + if (!getExecutionContext() || !getExecutionContext()->executingWindow()) return; - MessagePortArray* ports = MessagePort::toMessagePortArray(executionContext(), webChannels); + MessagePortArray* ports = MessagePort::toMessagePortArray(getExecutionContext(), webChannels); RefPtr<SerializedScriptValue> value = SerializedScriptValueFactory::instance().createFromWire(message); - ServiceWorker* source = ServiceWorker::from(executionContext(), handle.release()); - dispatchEvent(ServiceWorkerMessageEvent::create(ports, value, source, executionContext()->securityOrigin()->toString())); + ServiceWorker* source = ServiceWorker::from(getExecutionContext(), handle.release()); + dispatchEvent(ServiceWorkerMessageEvent::create(ports, value, source, getExecutionContext()->getSecurityOrigin()->toString())); } const AtomicString& ServiceWorkerContainer::interfaceName() const
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.h index 7430d2c..6365407 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.h +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.h
@@ -79,7 +79,7 @@ void dispatchMessageEvent(WebPassOwnPtr<WebServiceWorker::Handle>, const WebString& message, const WebMessagePortChannelArray&) override; // EventTarget overrides. - ExecutionContext* executionContext() const override { return ContextLifecycleObserver::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ContextLifecycleObserver::getExecutionContext(); } const AtomicString& interfaceName() const override; DEFINE_ATTRIBUTE_EVENT_LISTENER(controllerchange);
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp index cb4e2da8..a2409dd2 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp
@@ -158,9 +158,9 @@ V8GCController::collectAllGarbageForTesting(isolate()); } - ExecutionContext* executionContext() { return &(m_page->document()); } + ExecutionContext* getExecutionContext() { return &(m_page->document()); } v8::Isolate* isolate() { return v8::Isolate::GetCurrent(); } - ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } + ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } void provide(PassOwnPtr<WebServiceWorkerProvider> provider) { @@ -182,12 +182,12 @@ // the provider. provide(adoptPtr(new NotReachedWebServiceWorkerProvider())); - ServiceWorkerContainer* container = ServiceWorkerContainer::create(executionContext()); - ScriptState::Scope scriptScope(scriptState()); + ServiceWorkerContainer* container = ServiceWorkerContainer::create(getExecutionContext()); + ScriptState::Scope scriptScope(getScriptState()); RegistrationOptions options; options.setScope(scope); - ScriptPromise promise = container->registerServiceWorker(scriptState(), scriptURL, options); - expectRejected(scriptState(), promise, valueTest); + ScriptPromise promise = container->registerServiceWorker(getScriptState(), scriptURL, options); + expectRejected(getScriptState(), promise, valueTest); container->willBeDetachedFromFrame(); } @@ -196,10 +196,10 @@ { provide(adoptPtr(new NotReachedWebServiceWorkerProvider())); - ServiceWorkerContainer* container = ServiceWorkerContainer::create(executionContext()); - ScriptState::Scope scriptScope(scriptState()); - ScriptPromise promise = container->getRegistration(scriptState(), documentURL); - expectRejected(scriptState(), promise, valueTest); + ServiceWorkerContainer* container = ServiceWorkerContainer::create(getExecutionContext()); + ScriptState::Scope scriptScope(getScriptState()); + ScriptPromise promise = container->getRegistration(getScriptState(), documentURL); + expectRejected(getScriptState(), promise, valueTest); container->willBeDetachedFromFrame(); } @@ -325,14 +325,14 @@ StubWebServiceWorkerProvider stubProvider; provide(stubProvider.provider()); - ServiceWorkerContainer* container = ServiceWorkerContainer::create(executionContext()); + ServiceWorkerContainer* container = ServiceWorkerContainer::create(getExecutionContext()); // register { - ScriptState::Scope scriptScope(scriptState()); + ScriptState::Scope scriptScope(getScriptState()); RegistrationOptions options; options.setScope("y/"); - container->registerServiceWorker(scriptState(), "/x/y/worker.js", options); + container->registerServiceWorker(getScriptState(), "/x/y/worker.js", options); EXPECT_EQ(1ul, stubProvider.registerCallCount()); EXPECT_EQ(WebURL(KURL(KURL(), "http://localhost/x/y/")), stubProvider.registerScope()); @@ -349,11 +349,11 @@ StubWebServiceWorkerProvider stubProvider; provide(stubProvider.provider()); - ServiceWorkerContainer* container = ServiceWorkerContainer::create(executionContext()); + ServiceWorkerContainer* container = ServiceWorkerContainer::create(getExecutionContext()); { - ScriptState::Scope scriptScope(scriptState()); - container->getRegistration(scriptState(), ""); + ScriptState::Scope scriptScope(getScriptState()); + container->getRegistration(getScriptState(), ""); EXPECT_EQ(1ul, stubProvider.getRegistrationCallCount()); EXPECT_EQ(WebURL(KURL(KURL(), "http://localhost/x/index.html")), stubProvider.getRegistrationURL()); }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp index 595f827..a0cecf2 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp
@@ -130,7 +130,7 @@ ScriptPromise ServiceWorkerGlobalScope::skipWaiting(ScriptState* scriptState) { - ExecutionContext* executionContext = scriptState->executionContext(); + ExecutionContext* executionContext = scriptState->getExecutionContext(); // FIXME: short-term fix, see details at: https://codereview.chromium.org/535193002/. if (!executionContext) return ScriptPromise(); @@ -144,9 +144,9 @@ void ServiceWorkerGlobalScope::setRegistration(WebPassOwnPtr<WebServiceWorkerRegistration::Handle> handle) { - if (!executionContext()) + if (!getExecutionContext()) return; - m_registration = ServiceWorkerRegistration::getOrCreate(executionContext(), handle.release()); + m_registration = ServiceWorkerRegistration::getOrCreate(getExecutionContext(), handle.release()); } bool ServiceWorkerGlobalScope::addEventListenerInternal(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, const EventListenerOptions& options) @@ -203,7 +203,7 @@ // and get added to and retrieved from the ServiceWorker's script cache. // FIXME: Revisit in light of the solution to crbug/388375. for (Vector<String>::const_iterator it = urls.begin(); it != urls.end(); ++it) - executionContext()->removeURLFromMemoryCache(completeURL(*it)); + getExecutionContext()->removeURLFromMemoryCache(completeURL(*it)); WorkerGlobalScope::importScripts(urls, exceptionState); }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerRegistration.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerRegistration.cpp index 7d7dbb4..0f23f8f 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerRegistration.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerRegistration.cpp
@@ -30,23 +30,23 @@ void ServiceWorkerRegistration::setInstalling(WebPassOwnPtr<WebServiceWorker::Handle> handle) { - if (!executionContext()) + if (!getExecutionContext()) return; - m_installing = ServiceWorker::from(executionContext(), handle.release()); + m_installing = ServiceWorker::from(getExecutionContext(), handle.release()); } void ServiceWorkerRegistration::setWaiting(WebPassOwnPtr<WebServiceWorker::Handle> handle) { - if (!executionContext()) + if (!getExecutionContext()) return; - m_waiting = ServiceWorker::from(executionContext(), handle.release()); + m_waiting = ServiceWorker::from(getExecutionContext(), handle.release()); } void ServiceWorkerRegistration::setActive(WebPassOwnPtr<WebServiceWorker::Handle> handle) { - if (!executionContext()) + if (!getExecutionContext()) return; - m_active = ServiceWorker::from(executionContext(), handle.release()); + m_active = ServiceWorker::from(getExecutionContext(), handle.release()); } ServiceWorkerRegistration* ServiceWorkerRegistration::getOrCreate(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration::Handle> handle) @@ -55,7 +55,7 @@ ServiceWorkerRegistration* existingRegistration = static_cast<ServiceWorkerRegistration*>(handle->registration()->proxy()); if (existingRegistration) { - ASSERT(existingRegistration->executionContext() == executionContext); + ASSERT(existingRegistration->getExecutionContext() == executionContext); return existingRegistration; }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerRegistration.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerRegistration.h index 3325a8d..b28a3c2 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerRegistration.h +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerRegistration.h
@@ -38,7 +38,7 @@ public: // EventTarget overrides. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override { return ActiveDOMObject::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ActiveDOMObject::getExecutionContext(); } // WebServiceWorkerRegistrationProxy overrides. void dispatchUpdateFoundEvent() override; @@ -94,7 +94,7 @@ { HeapVector<Member<ServiceWorkerRegistration>> registrations; for (auto& registration : *webServiceWorkerRegistrations) - registrations.append(ServiceWorkerRegistration::getOrCreate(resolver->executionContext(), registration.release())); + registrations.append(ServiceWorkerRegistration::getOrCreate(resolver->getExecutionContext(), registration.release())); return registrations; } };
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerWindowClient.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerWindowClient.cpp index e4de294..3bf05a0 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerWindowClient.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerWindowClient.cpp
@@ -50,13 +50,13 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!scriptState->executionContext()->isWindowInteractionAllowed()) { + if (!scriptState->getExecutionContext()->isWindowInteractionAllowed()) { resolver->reject(DOMException::create(InvalidAccessError, "Not allowed to focus a window.")); return promise; } - scriptState->executionContext()->consumeWindowInteraction(); + scriptState->getExecutionContext()->consumeWindowInteraction(); - ServiceWorkerGlobalScopeClient::from(scriptState->executionContext())->focus(uuid(), new CallbackPromiseAdapter<ServiceWorkerWindowClient, ServiceWorkerError>(resolver)); + ServiceWorkerGlobalScopeClient::from(scriptState->getExecutionContext())->focus(uuid(), new CallbackPromiseAdapter<ServiceWorkerWindowClient, ServiceWorkerError>(resolver)); return promise; } @@ -64,14 +64,14 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - ExecutionContext* context = scriptState->executionContext(); + ExecutionContext* context = scriptState->getExecutionContext(); KURL parsedUrl = KURL(toWorkerGlobalScope(context)->location()->url(), url); if (!parsedUrl.isValid() || parsedUrl.protocolIsAbout()) { resolver->reject(V8ThrowException::createTypeError(scriptState->isolate(), "'" + url + "' is not a valid URL.")); return promise; } - if (!context->securityOrigin()->canDisplay(parsedUrl)) { + if (!context->getSecurityOrigin()->canDisplay(parsedUrl)) { resolver->reject(V8ThrowException::createTypeError(scriptState->isolate(), "'" + parsedUrl.elidedString() + "' cannot navigate.")); return promise; }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerWindowClientCallback.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerWindowClientCallback.cpp index f773917d..f6387fc 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerWindowClientCallback.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerWindowClientCallback.cpp
@@ -13,19 +13,19 @@ void NavigateClientCallback::onSuccess(WebPassOwnPtr<WebServiceWorkerClientInfo> clientInfo) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(ServiceWorkerWindowClient::take(m_resolver.get(), clientInfo.release())); } void NavigateClientCallback::onError(const WebServiceWorkerError& error) { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; if (error.errorType == WebServiceWorkerError::ErrorTypeNavigation) { - ScriptState::Scope scope(m_resolver->scriptState()); - m_resolver->reject(V8ThrowException::createTypeError(m_resolver->scriptState()->isolate(), error.message)); + ScriptState::Scope scope(m_resolver->getScriptState()); + m_resolver->reject(V8ThrowException::createTypeError(m_resolver->getScriptState()->isolate(), error.message)); return; }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.cpp b/third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.cpp index 53c60d24..4da54ff 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.cpp
@@ -69,7 +69,7 @@ ASSERT(m_resolveType == Fulfilled || m_resolveType == Rejected); if (m_resolveType == Rejected) { m_observer->reportError(value); - value = ScriptPromise::reject(value.scriptState(), value).getScriptValue(); + value = ScriptPromise::reject(value.getScriptState(), value).getScriptValue(); } m_observer->decrementPendingActivity(); m_observer = nullptr; @@ -93,7 +93,7 @@ // waitUntil() isn't called, that means between willDispatchEvent() and // didDispatchEvent(). if (m_type == NotificationClick) - executionContext()->allowWindowInteraction(); + getExecutionContext()->allowWindowInteraction(); incrementPendingActivity(); } @@ -113,7 +113,7 @@ return; } - if (!executionContext()) + if (!getExecutionContext()) return; // When handling a notificationclick event, we want to allow one window to @@ -157,10 +157,10 @@ void WaitUntilObserver::decrementPendingActivity() { ASSERT(m_pendingActivity > 0); - if (!executionContext() || (!m_hasError && --m_pendingActivity)) + if (!getExecutionContext() || (!m_hasError && --m_pendingActivity)) return; - ServiceWorkerGlobalScopeClient* client = ServiceWorkerGlobalScopeClient::from(executionContext()); + ServiceWorkerGlobalScopeClient* client = ServiceWorkerGlobalScopeClient::from(getExecutionContext()); WebServiceWorkerEventResult result = m_hasError ? WebServiceWorkerEventResultRejected : WebServiceWorkerEventResultCompleted; switch (m_type) { case Activate: @@ -192,9 +192,9 @@ void WaitUntilObserver::consumeWindowInteraction(Timer<WaitUntilObserver>*) { - if (!executionContext()) + if (!getExecutionContext()) return; - executionContext()->consumeWindowInteraction(); + getExecutionContext()->consumeWindowInteraction(); } DEFINE_TRACE(WaitUntilObserver)
diff --git a/third_party/WebKit/Source/modules/speech/DOMWindowSpeechSynthesis.cpp b/third_party/WebKit/Source/modules/speech/DOMWindowSpeechSynthesis.cpp index 0fe2b96a..a3d2118 100644 --- a/third_party/WebKit/Source/modules/speech/DOMWindowSpeechSynthesis.cpp +++ b/third_party/WebKit/Source/modules/speech/DOMWindowSpeechSynthesis.cpp
@@ -68,7 +68,7 @@ SpeechSynthesis* DOMWindowSpeechSynthesis::speechSynthesis() { if (!m_speechSynthesis && frame()) - m_speechSynthesis = SpeechSynthesis::create(frame()->domWindow()->executionContext()); + m_speechSynthesis = SpeechSynthesis::create(frame()->domWindow()->getExecutionContext()); return m_speechSynthesis; }
diff --git a/third_party/WebKit/Source/modules/speech/SpeechRecognition.cpp b/third_party/WebKit/Source/modules/speech/SpeechRecognition.cpp index 8bc405d5..90b0c97 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechRecognition.cpp +++ b/third_party/WebKit/Source/modules/speech/SpeechRecognition.cpp
@@ -156,9 +156,9 @@ return EventTargetNames::SpeechRecognition; } -ExecutionContext* SpeechRecognition::executionContext() const +ExecutionContext* SpeechRecognition::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } void SpeechRecognition::stop()
diff --git a/third_party/WebKit/Source/modules/speech/SpeechRecognition.h b/third_party/WebKit/Source/modules/speech/SpeechRecognition.h index 6321aa6..a216bbf 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechRecognition.h +++ b/third_party/WebKit/Source/modules/speech/SpeechRecognition.h
@@ -88,7 +88,7 @@ // EventTarget. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject. bool hasPendingActivity() const override;
diff --git a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp index bb2de9aa..5831f432 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp +++ b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp
@@ -49,15 +49,15 @@ m_platformSpeechSynthesizer = synthesizer; } -ExecutionContext* SpeechSynthesis::executionContext() const +ExecutionContext* SpeechSynthesis::getExecutionContext() const { - return ContextLifecycleObserver::executionContext(); + return ContextLifecycleObserver::getExecutionContext(); } void SpeechSynthesis::voicesDidChange() { m_voiceList.clear(); - if (executionContext() && !executionContext()->activeDOMObjectsAreStopped()) + if (getExecutionContext() && !getExecutionContext()->activeDOMObjectsAreStopped()) dispatchEvent(Event::create(EventTypeNames::voiceschanged)); } @@ -139,7 +139,7 @@ void SpeechSynthesis::fireEvent(const AtomicString& type, SpeechSynthesisUtterance* utterance, unsigned long charIndex, const String& name) { - if (executionContext() && !executionContext()->activeDOMObjectsAreStopped()) + if (getExecutionContext() && !getExecutionContext()->activeDOMObjectsAreStopped()) utterance->dispatchEvent(SpeechSynthesisEvent::create(type, utterance, charIndex, (currentTime() - utterance->startTime()), name)); }
diff --git a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.h b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.h index 50284c4..49e2b5fd 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.h +++ b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.h
@@ -62,7 +62,7 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(voiceschanged); - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/speech/SpeechSynthesisUtterance.cpp b/third_party/WebKit/Source/modules/speech/SpeechSynthesisUtterance.cpp index 21cd0e23..5809759 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechSynthesisUtterance.cpp +++ b/third_party/WebKit/Source/modules/speech/SpeechSynthesisUtterance.cpp
@@ -43,9 +43,9 @@ { } -ExecutionContext* SpeechSynthesisUtterance::executionContext() const +ExecutionContext* SpeechSynthesisUtterance::getExecutionContext() const { - return ContextLifecycleObserver::executionContext(); + return ContextLifecycleObserver::getExecutionContext(); } const AtomicString& SpeechSynthesisUtterance::interfaceName() const
diff --git a/third_party/WebKit/Source/modules/speech/SpeechSynthesisUtterance.h b/third_party/WebKit/Source/modules/speech/SpeechSynthesisUtterance.h index b040fddb..2df34c8 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechSynthesisUtterance.h +++ b/third_party/WebKit/Source/modules/speech/SpeechSynthesisUtterance.h
@@ -72,7 +72,7 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(mark); DEFINE_ATTRIBUTE_EVENT_LISTENER(boundary); - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; PlatformSpeechSynthesisUtterance* platformUtterance() const { return m_platformUtterance; }
diff --git a/third_party/WebKit/Source/modules/storage/DOMWindowStorage.cpp b/third_party/WebKit/Source/modules/storage/DOMWindowStorage.cpp index f197df5..878a11e 100644 --- a/third_party/WebKit/Source/modules/storage/DOMWindowStorage.cpp +++ b/third_party/WebKit/Source/modules/storage/DOMWindowStorage.cpp
@@ -73,7 +73,7 @@ return nullptr; String accessDeniedMessage = "Access is denied for this document."; - if (!document->securityOrigin()->canAccessLocalStorage()) { + if (!document->getSecurityOrigin()->canAccessLocalStorage()) { if (document->isSandboxed(SandboxOrigin)) exceptionState.throwSecurityError("The document is sandboxed and lacks the 'allow-same-origin' flag."); else if (document->url().protocolIs("data")) @@ -95,7 +95,7 @@ if (!page) return nullptr; - StorageArea* storageArea = StorageNamespaceController::from(page)->sessionStorage()->storageArea(document->securityOrigin()); + StorageArea* storageArea = StorageNamespaceController::from(page)->sessionStorage()->storageArea(document->getSecurityOrigin()); if (!storageArea->canAccessStorage(m_window->frame())) { exceptionState.throwSecurityError(accessDeniedMessage); return nullptr; @@ -113,7 +113,7 @@ if (!document) return nullptr; String accessDeniedMessage = "Access is denied for this document."; - if (!document->securityOrigin()->canAccessLocalStorage()) { + if (!document->getSecurityOrigin()->canAccessLocalStorage()) { if (document->isSandboxed(SandboxOrigin)) exceptionState.throwSecurityError("The document is sandboxed and lacks the 'allow-same-origin' flag."); else if (document->url().protocolIs("data")) @@ -133,7 +133,7 @@ FrameHost* host = document->frameHost(); if (!host || !host->settings().localStorageEnabled()) return nullptr; - StorageArea* storageArea = StorageNamespace::localStorageArea(document->securityOrigin()); + StorageArea* storageArea = StorageNamespace::localStorageArea(document->getSecurityOrigin()); if (!storageArea->canAccessStorage(m_window->frame())) { exceptionState.throwSecurityError(accessDeniedMessage); return nullptr;
diff --git a/third_party/WebKit/Source/modules/storage/InspectorDOMStorageAgent.cpp b/third_party/WebKit/Source/modules/storage/InspectorDOMStorageAgent.cpp index 6742f98..fb02193 100644 --- a/third_party/WebKit/Source/modules/storage/InspectorDOMStorageAgent.cpp +++ b/third_party/WebKit/Source/modules/storage/InspectorDOMStorageAgent.cpp
@@ -209,14 +209,14 @@ targetFrame = frame; if (isLocalStorage) - return StorageNamespace::localStorageArea(frame->document()->securityOrigin()); + return StorageNamespace::localStorageArea(frame->document()->getSecurityOrigin()); StorageNamespace* sessionStorage = StorageNamespaceController::from(m_page)->sessionStorage(); if (!sessionStorage) { if (errorString) *errorString = "SessionStorage is not supported"; return nullptr; } - return sessionStorage->storageArea(frame->document()->securityOrigin()); + return sessionStorage->storageArea(frame->document()->getSecurityOrigin()); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/storage/StorageArea.cpp b/third_party/WebKit/Source/modules/storage/StorageArea.cpp index 3cd8235..c92f402 100644 --- a/third_party/WebKit/Source/modules/storage/StorageArea.cpp +++ b/third_party/WebKit/Source/modules/storage/StorageArea.cpp
@@ -147,7 +147,7 @@ StorageNamespaceController* controller = StorageNamespaceController::from(frame->page()); if (!controller) return false; - bool result = controller->storageClient()->canAccessStorage(frame, m_storageType); + bool result = controller->getStorageClient()->canAccessStorage(frame, m_storageType); // Move attention to the new LocalFrame. LocalFrameLifecycleObserver::setContext(frame); m_canAccessStorageCachedResult = result; @@ -165,7 +165,7 @@ LocalFrame* localFrame = toLocalFrame(frame); LocalDOMWindow* localWindow = localFrame->localDOMWindow(); Storage* storage = DOMWindowStorage::from(*localWindow).optionalLocalStorage(); - if (storage && localFrame->document()->securityOrigin()->canAccess(securityOrigin) && !isEventSource(storage, sourceAreaInstance)) + if (storage && localFrame->document()->getSecurityOrigin()->canAccess(securityOrigin) && !isEventSource(storage, sourceAreaInstance)) localFrame->localDOMWindow()->enqueueWindowEvent(StorageEvent::create(EventTypeNames::storage, key, oldValue, newValue, pageURL, storage)); } if (InspectorDOMStorageAgent* agent = StorageNamespaceController::from(page)->inspectorAgent()) @@ -198,7 +198,7 @@ LocalFrame* localFrame = toLocalFrame(frame); LocalDOMWindow* localWindow = localFrame->localDOMWindow(); Storage* storage = DOMWindowStorage::from(*localWindow).optionalSessionStorage(); - if (storage && localFrame->document()->securityOrigin()->canAccess(securityOrigin) && !isEventSource(storage, sourceAreaInstance)) + if (storage && localFrame->document()->getSecurityOrigin()->canAccess(securityOrigin) && !isEventSource(storage, sourceAreaInstance)) localFrame->localDOMWindow()->enqueueWindowEvent(StorageEvent::create(EventTypeNames::storage, key, oldValue, newValue, pageURL, storage)); } if (InspectorDOMStorageAgent* agent = StorageNamespaceController::from(page)->inspectorAgent())
diff --git a/third_party/WebKit/Source/modules/storage/StorageNamespaceController.h b/third_party/WebKit/Source/modules/storage/StorageNamespaceController.h index 849bcb61..93dd6cb 100644 --- a/third_party/WebKit/Source/modules/storage/StorageNamespaceController.h +++ b/third_party/WebKit/Source/modules/storage/StorageNamespaceController.h
@@ -21,7 +21,7 @@ USING_FAST_MALLOC_WILL_BE_REMOVED(StorageNamespaceController); public: StorageNamespace* sessionStorage(bool optionalCreate = true); - StorageClient* storageClient() { return m_client; } + StorageClient* getStorageClient() { return m_client; } ~StorageNamespaceController(); static void provideStorageNamespaceTo(Page&, StorageClient*);
diff --git a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp index 4762dad..77e33cf6 100644 --- a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp
@@ -746,8 +746,8 @@ m_contextState = newState; // Notify context that state changed - if (executionContext()) - executionContext()->postTask(BLINK_FROM_HERE, createSameThreadTask(&AbstractAudioContext::notifyStateChange, this)); + if (getExecutionContext()) + getExecutionContext()->postTask(BLINK_FROM_HERE, createSameThreadTask(&AbstractAudioContext::notifyStateChange, this)); } void AbstractAudioContext::notifyStateChange() @@ -904,9 +904,9 @@ return EventTargetNames::AudioContext; } -ExecutionContext* AbstractAudioContext::executionContext() const +ExecutionContext* AbstractAudioContext::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } void AbstractAudioContext::startRendering() @@ -944,10 +944,10 @@ ActiveDOMObject::trace(visitor); } -SecurityOrigin* AbstractAudioContext::securityOrigin() const +SecurityOrigin* AbstractAudioContext::getSecurityOrigin() const { - if (executionContext()) - return executionContext()->securityOrigin(); + if (getExecutionContext()) + return getExecutionContext()->getSecurityOrigin(); return nullptr; }
diff --git a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h index 8ca7f63..ee3a493f 100644 --- a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h +++ b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h
@@ -237,7 +237,7 @@ // EventTarget const AtomicString& interfaceName() const final; - ExecutionContext* executionContext() const final; + ExecutionContext* getExecutionContext() const final; DEFINE_ATTRIBUTE_EVENT_LISTENER(statechange); @@ -250,7 +250,7 @@ virtual bool isContextClosed() const { return m_isCleared; } // Get the security origin for this audio context. - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; // Get the PeriodicWave for the specified oscillator type. The table is initialized internally // if necessary.
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioNode.cpp b/third_party/WebKit/Source/modules/webaudio/AudioNode.cpp index ef366e8..a4c84b52 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioNode.cpp
@@ -926,9 +926,9 @@ return EventTargetNames::AudioNode; } -ExecutionContext* AudioNode::executionContext() const +ExecutionContext* AudioNode::getExecutionContext() const { - return context()->executionContext(); + return context()->getExecutionContext(); } void AudioNode::didAddOutput(unsigned numberOfOutputs)
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioNode.h b/third_party/WebKit/Source/modules/webaudio/AudioNode.h index 7f0d35e..ee6aff5 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioNode.h +++ b/third_party/WebKit/Source/modules/webaudio/AudioNode.h
@@ -303,7 +303,7 @@ // EventTarget const AtomicString& interfaceName() const final; - ExecutionContext* executionContext() const final; + ExecutionContext* getExecutionContext() const final; // Called inside AudioHandler constructors. void didAddOutput(unsigned numberOfOutputs);
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp b/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp index 460eded..fc79f6e 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioScheduledSourceNode.cpp
@@ -209,8 +209,8 @@ { finishWithoutOnEnded(); - if (context()->executionContext()) { - context()->executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&AudioScheduledSourceHandler::notifyEnded, PassRefPtr<AudioScheduledSourceHandler>(this))); + if (context()->getExecutionContext()) { + context()->getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&AudioScheduledSourceHandler::notifyEnded, PassRefPtr<AudioScheduledSourceHandler>(this))); } }
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp index e75a3ae..15f24e6 100644 --- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp +++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
@@ -38,7 +38,7 @@ void BiquadDSPKernel::updateCoefficientsIfNecessary(int framesToProcess) { - if (biquadProcessor()->filterCoefficientsDirty()) { + if (getBiquadProcessor()->filterCoefficientsDirty()) { float cutoffFrequency[AudioUtilities::kRenderQuantumFrames]; float Q[AudioUtilities::kRenderQuantumFrames]; float gain[AudioUtilities::kRenderQuantumFrames]; @@ -47,17 +47,17 @@ RELEASE_ASSERT_WITH_SECURITY_IMPLICATION( static_cast<unsigned>(framesToProcess) <= AudioUtilities::kRenderQuantumFrames); - if (biquadProcessor()->hasSampleAccurateValues()) { - biquadProcessor()->parameter1().calculateSampleAccurateValues(cutoffFrequency, framesToProcess); - biquadProcessor()->parameter2().calculateSampleAccurateValues(Q, framesToProcess); - biquadProcessor()->parameter3().calculateSampleAccurateValues(gain, framesToProcess); - biquadProcessor()->parameter4().calculateSampleAccurateValues(detune, framesToProcess); + if (getBiquadProcessor()->hasSampleAccurateValues()) { + getBiquadProcessor()->parameter1().calculateSampleAccurateValues(cutoffFrequency, framesToProcess); + getBiquadProcessor()->parameter2().calculateSampleAccurateValues(Q, framesToProcess); + getBiquadProcessor()->parameter3().calculateSampleAccurateValues(gain, framesToProcess); + getBiquadProcessor()->parameter4().calculateSampleAccurateValues(detune, framesToProcess); updateCoefficients(framesToProcess, cutoffFrequency, Q, gain, detune); } else { - cutoffFrequency[0] = biquadProcessor()->parameter1().smoothedValue(); - Q[0] = biquadProcessor()->parameter2().smoothedValue(); - gain[0] = biquadProcessor()->parameter3().smoothedValue(); - detune[0] = biquadProcessor()->parameter4().smoothedValue(); + cutoffFrequency[0] = getBiquadProcessor()->parameter1().smoothedValue(); + Q[0] = getBiquadProcessor()->parameter2().smoothedValue(); + gain[0] = getBiquadProcessor()->parameter3().smoothedValue(); + detune[0] = getBiquadProcessor()->parameter4().smoothedValue(); updateCoefficients(1, cutoffFrequency, Q, gain, detune); } } @@ -78,7 +78,7 @@ normalizedFrequency *= pow(2, detune[k] / 1200); // Configure the biquad with the new filter parameters for the appropriate type of filter. - switch (biquadProcessor()->type()) { + switch (getBiquadProcessor()->type()) { case BiquadProcessor::LowPass: m_biquad.setLowpassParams(k, normalizedFrequency, Q[k]); break; @@ -118,7 +118,7 @@ { ASSERT(source); ASSERT(destination); - ASSERT(biquadProcessor()); + ASSERT(getBiquadProcessor()); // Recompute filter coefficients if any of the parameters have changed. // FIXME: as an optimization, implement a way that a Biquad object can simply copy its internal filter coefficients from another Biquad object. @@ -172,10 +172,10 @@ // FIXME: Simplify this: crbug.com/390266 MutexLocker processLocker(m_processLock); - cutoffFrequency = biquadProcessor()->parameter1().value(); - Q = biquadProcessor()->parameter2().value(); - gain = biquadProcessor()->parameter3().value(); - detune = biquadProcessor()->parameter4().value(); + cutoffFrequency = getBiquadProcessor()->parameter1().value(); + Q = getBiquadProcessor()->parameter2().value(); + gain = getBiquadProcessor()->parameter3().value(); + detune = getBiquadProcessor()->parameter4().value(); } updateCoefficients(1, &cutoffFrequency, &Q, &gain, &detune);
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h index 971ef5e..26dd73b 100644 --- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h +++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
@@ -55,7 +55,7 @@ protected: Biquad m_biquad; - BiquadProcessor* biquadProcessor() { return static_cast<BiquadProcessor*>(processor()); } + BiquadProcessor* getBiquadProcessor() { return static_cast<BiquadProcessor*>(processor()); } // To prevent audio glitches when parameters are changed, // dezippering is used to slowly change the parameters.
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp b/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp index abea4f4..45a2fc7 100644 --- a/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp
@@ -46,14 +46,14 @@ AudioNode::trace(visitor); } -BiquadProcessor* BiquadFilterNode::biquadProcessor() const +BiquadProcessor* BiquadFilterNode::getBiquadProcessor() const { return static_cast<BiquadProcessor*>(static_cast<AudioBasicProcessorHandler&>(handler()).processor()); } String BiquadFilterNode::type() const { - switch (const_cast<BiquadFilterNode*>(this)->biquadProcessor()->type()) { + switch (const_cast<BiquadFilterNode*>(this)->getBiquadProcessor()->type()) { case BiquadProcessor::LowPass: return "lowpass"; case BiquadProcessor::HighPass: @@ -101,7 +101,7 @@ if (type > BiquadProcessor::Allpass) return false; - biquadProcessor()->setType(static_cast<BiquadProcessor::FilterType>(type)); + getBiquadProcessor()->setType(static_cast<BiquadProcessor::FilterType>(type)); return true; } @@ -111,7 +111,7 @@ int n = std::min(frequencyHz->length(), std::min(magResponse->length(), phaseResponse->length())); if (n) - biquadProcessor()->getFrequencyResponse(n, frequencyHz->data(), magResponse->data(), phaseResponse->data()); + getBiquadProcessor()->getFrequencyResponse(n, frequencyHz->data(), magResponse->data(), phaseResponse->data()); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.h b/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.h index ad8ea745..1119629 100644 --- a/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.h +++ b/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.h
@@ -70,7 +70,7 @@ private: BiquadFilterNode(AbstractAudioContext&, float sampleRate); - BiquadProcessor* biquadProcessor() const; + BiquadProcessor* getBiquadProcessor() const; bool setType(unsigned); // Returns true on success. Member<AudioParam> m_frequency;
diff --git a/third_party/WebKit/Source/modules/webaudio/DefaultAudioDestinationNode.cpp b/third_party/WebKit/Source/modules/webaudio/DefaultAudioDestinationNode.cpp index 2bfb443..5321e321 100644 --- a/third_party/WebKit/Source/modules/webaudio/DefaultAudioDestinationNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/DefaultAudioDestinationNode.cpp
@@ -85,7 +85,7 @@ float hardwareSampleRate = AudioDestination::hardwareSampleRate(); WTF_LOG(WebAudio, ">>>> hardwareSampleRate = %f\n", hardwareSampleRate); - m_destination = AudioDestination::create(*this, m_inputDeviceId, m_numberOfInputChannels, channelCount(), hardwareSampleRate, context()->securityOrigin()); + m_destination = AudioDestination::create(*this, m_inputDeviceId, m_numberOfInputChannels, channelCount(), hardwareSampleRate, context()->getSecurityOrigin()); } void DefaultAudioDestinationHandler::startRendering()
diff --git a/third_party/WebKit/Source/modules/webaudio/DelayDSPKernel.cpp b/third_party/WebKit/Source/modules/webaudio/DelayDSPKernel.cpp index 001a5f73..784621b 100644 --- a/third_party/WebKit/Source/modules/webaudio/DelayDSPKernel.cpp +++ b/third_party/WebKit/Source/modules/webaudio/DelayDSPKernel.cpp
@@ -53,17 +53,17 @@ bool DelayDSPKernel::hasSampleAccurateValues() { - return delayProcessor()->delayTime().hasSampleAccurateValues(); + return getDelayProcessor()->delayTime().hasSampleAccurateValues(); } void DelayDSPKernel::calculateSampleAccurateValues(float* delayTimes, size_t framesToProcess) { - delayProcessor()->delayTime().calculateSampleAccurateValues(delayTimes, framesToProcess); + getDelayProcessor()->delayTime().calculateSampleAccurateValues(delayTimes, framesToProcess); } double DelayDSPKernel::delayTime(float) { - return delayProcessor()->delayTime().finalValue(); + return getDelayProcessor()->delayTime().finalValue(); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webaudio/DelayDSPKernel.h b/third_party/WebKit/Source/modules/webaudio/DelayDSPKernel.h index dba31b6a..d7871b12 100644 --- a/third_party/WebKit/Source/modules/webaudio/DelayDSPKernel.h +++ b/third_party/WebKit/Source/modules/webaudio/DelayDSPKernel.h
@@ -42,7 +42,7 @@ double delayTime(float sampleRate) override; private: - DelayProcessor* delayProcessor() { return static_cast<DelayProcessor*>(processor()); } + DelayProcessor* getDelayProcessor() { return static_cast<DelayProcessor*>(processor()); } }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.cpp b/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.cpp index a04a056..9750a6b 100644 --- a/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.cpp
@@ -135,13 +135,13 @@ bool MediaElementAudioSourceHandler::passesCurrentSrcCORSAccessCheck(const KURL& currentSrc) { ASSERT(isMainThread()); - return context()->securityOrigin() && context()->securityOrigin()->canRequest(currentSrc); + return context()->getSecurityOrigin() && context()->getSecurityOrigin()->canRequest(currentSrc); } void MediaElementAudioSourceHandler::printCORSMessage(const String& message) { - if (context()->executionContext()) { - context()->executionContext()->addConsoleMessage( + if (context()->getExecutionContext()) { + context()->getExecutionContext()->addConsoleMessage( ConsoleMessage::create(SecurityMessageSource, InfoMessageLevel, "MediaElementAudioSource outputs zeroes due to CORS access restrictions for " + message)); } @@ -160,7 +160,7 @@ outputBus->zero(); return; } - AudioSourceProvider& provider = mediaElement()->audioSourceProvider(); + AudioSourceProvider& provider = mediaElement()->getAudioSourceProvider(); // Grab data from the provider so that the element continues to make progress, even if // we're going to output silence anyway. if (m_multiChannelResampler.get()) { @@ -177,8 +177,8 @@ // Print a CORS message, but just once for each change in the current media // element source, and only if we have a document to print to. m_maybePrintCORSMessage = false; - if (context()->executionContext()) { - context()->executionContext()->postTask(BLINK_FROM_HERE, + if (context()->getExecutionContext()) { + context()->getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&MediaElementAudioSourceHandler::printCORSMessage, this, m_currentSrcString));
diff --git a/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.h b/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.h index fa5edd3..c8a460e 100644 --- a/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.h +++ b/third_party/WebKit/Source/modules/webaudio/MediaElementAudioSourceNode.h
@@ -81,7 +81,7 @@ OwnPtr<MultiChannelResampler> m_multiChannelResampler; // |m_passesCurrentSrcCORSAccessCheck| holds the value of - // context()->securityOrigin() && context()->securityOrigin()->canRequest(mediaElement()->currentSrc()), + // context()->getSecurityOrigin() && context()->getSecurityOrigin()->canRequest(mediaElement()->currentSrc()), // updated in the ctor and onCurrentSrcChanged() on the main thread and // used in passesCORSAccessCheck() on the audio thread, // protected by |m_processLock|.
diff --git a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioDestinationNode.cpp b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioDestinationNode.cpp index 297bb6d..2e2de3f 100644 --- a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioDestinationNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioDestinationNode.cpp
@@ -47,7 +47,7 @@ MediaStreamSourceVector audioSources; audioSources.append(m_source.get()); MediaStreamSourceVector videoSources; - m_stream = MediaStream::create(node.context()->executionContext(), MediaStreamDescriptor::create(audioSources, videoSources)); + m_stream = MediaStream::create(node.context()->getExecutionContext(), MediaStreamDescriptor::create(audioSources, videoSources)); MediaStreamCenter::instance().didCreateMediaStreamAndTracks(m_stream->descriptor()); m_source->setAudioFormat(numberOfChannels, node.context()->sampleRate());
diff --git a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.cpp b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.cpp index 4c1b3e8..573270f3 100644 --- a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.cpp
@@ -84,12 +84,12 @@ { AudioBus* outputBus = output(0).bus(); - if (!audioSourceProvider()) { + if (!getAudioSourceProvider()) { outputBus->zero(); return; } - if (!mediaStream() || m_sourceNumberOfChannels != outputBus->numberOfChannels()) { + if (!getMediaStream() || m_sourceNumberOfChannels != outputBus->numberOfChannels()) { outputBus->zero(); return; } @@ -99,7 +99,7 @@ // a format change, so we output silence in this case. MutexTryLocker tryLocker(m_processLock); if (tryLocker.locked()) { - audioSourceProvider()->provideInput(outputBus, numberOfFrames); + getAudioSourceProvider()->provideInput(outputBus, numberOfFrames); } else { // We failed to acquire the lock. outputBus->zero(); @@ -130,9 +130,9 @@ return static_cast<MediaStreamAudioSourceHandler&>(handler()); } -MediaStream* MediaStreamAudioSourceNode::mediaStream() const +MediaStream* MediaStreamAudioSourceNode::getMediaStream() const { - return mediaStreamAudioSourceHandler().mediaStream(); + return mediaStreamAudioSourceHandler().getMediaStream(); } void MediaStreamAudioSourceNode::setFormat(size_t numberOfChannels, float sourceSampleRate)
diff --git a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.h b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.h index d082be8b..4786ec4 100644 --- a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.h +++ b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.h
@@ -42,7 +42,7 @@ static PassRefPtr<MediaStreamAudioSourceHandler> create(AudioNode&, MediaStream&, MediaStreamTrack*, PassOwnPtr<AudioSourceProvider>); ~MediaStreamAudioSourceHandler() override; - MediaStream* mediaStream() { return m_mediaStream.get(); } + MediaStream* getMediaStream() { return m_mediaStream.get(); } // AudioHandler void process(size_t framesToProcess) override; @@ -51,7 +51,7 @@ // MediaStreamAudioSourceNode. void setFormat(size_t numberOfChannels, float sampleRate); - AudioSourceProvider* audioSourceProvider() const { return m_audioSourceProvider.get(); } + AudioSourceProvider* getAudioSourceProvider() const { return m_audioSourceProvider.get(); } private: MediaStreamAudioSourceHandler(AudioNode&, MediaStream&, MediaStreamTrack*, PassOwnPtr<AudioSourceProvider>); @@ -77,7 +77,7 @@ DECLARE_VIRTUAL_TRACE(); MediaStreamAudioSourceHandler& mediaStreamAudioSourceHandler() const; - MediaStream* mediaStream() const; + MediaStream* getMediaStream() const; // AudioSourceProviderClient functions: void setFormat(size_t numberOfChannels, float sampleRate) override;
diff --git a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.idl b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.idl index 6da028b..4828d9b 100644 --- a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.idl +++ b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioSourceNode.idl
@@ -23,5 +23,5 @@ */ interface MediaStreamAudioSourceNode : AudioSourceNode { - readonly attribute MediaStream mediaStream; + [ImplementedAs=getMediaStream] readonly attribute MediaStream mediaStream; };
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp index 1ac7fe9..2429c66 100644 --- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp +++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp
@@ -315,7 +315,7 @@ return; // Avoid firing the event if the document has already gone away. - if (executionContext()) { + if (getExecutionContext()) { // Call the offline rendering completion event listener and resolve the // promise too. dispatchEvent(OfflineAudioCompletionEvent::create(renderedBuffer));
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp index 4a3ce4a..ee8e116 100644 --- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp
@@ -200,8 +200,8 @@ ASSERT(!isMainThread()); // The actual rendering has been suspended. Notify the context. - if (context()->executionContext()) { - context()->executionContext()->postTask(BLINK_FROM_HERE, + if (context()->getExecutionContext()) { + context()->getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&OfflineAudioDestinationHandler::notifySuspend, this)); } } @@ -211,8 +211,8 @@ ASSERT(!isMainThread()); // The actual rendering has been completed. Notify the context. - if (context()->executionContext()) { - context()->executionContext()->postTask(BLINK_FROM_HERE, + if (context()->getExecutionContext()) { + context()->getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&OfflineAudioDestinationHandler::notifyComplete, this)); } }
diff --git a/third_party/WebKit/Source/modules/webaudio/ScriptProcessorNode.cpp b/third_party/WebKit/Source/modules/webaudio/ScriptProcessorNode.cpp index 7274ba1..b7f78f0 100644 --- a/third_party/WebKit/Source/modules/webaudio/ScriptProcessorNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/ScriptProcessorNode.cpp
@@ -161,10 +161,10 @@ // We're late in handling the previous request. The main thread must be very busy. // The best we can do is clear out the buffer ourself here. outputBuffer->zero(); - } else if (context()->executionContext()) { + } else if (context()->getExecutionContext()) { // Fire the event on the main thread with the appropriate buffer // index. - context()->executionContext()->postTask(BLINK_FROM_HERE, + context()->getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&ScriptProcessorHandler::fireProcessEvent, this, m_doubleBufferIndex)); } @@ -187,7 +187,7 @@ return; // Avoid firing the event if the document has already gone away. - if (node() && context() && context()->executionContext()) { + if (node() && context() && context()->getExecutionContext()) { // This synchronizes with process(). MutexLocker processLocker(m_processEventLock);
diff --git a/third_party/WebKit/Source/modules/webaudio/WaveShaperDSPKernel.cpp b/third_party/WebKit/Source/modules/webaudio/WaveShaperDSPKernel.cpp index a5ed118..2833319 100644 --- a/third_party/WebKit/Source/modules/webaudio/WaveShaperDSPKernel.cpp +++ b/third_party/WebKit/Source/modules/webaudio/WaveShaperDSPKernel.cpp
@@ -52,7 +52,7 @@ void WaveShaperDSPKernel::process(const float* source, float* destination, size_t framesToProcess) { - switch (waveShaperProcessor()->oversample()) { + switch (getWaveShaperProcessor()->oversample()) { case WaveShaperProcessor::OverSampleNone: processCurve(source, destination, framesToProcess); break; @@ -72,9 +72,9 @@ { ASSERT(source); ASSERT(destination); - ASSERT(waveShaperProcessor()); + ASSERT(getWaveShaperProcessor()); - DOMFloat32Array* curve = waveShaperProcessor()->curve(); + DOMFloat32Array* curve = getWaveShaperProcessor()->curve(); if (!curve) { // Act as "straight wire" pass-through if no curve is set. memcpy(destination, source, sizeof(float) * framesToProcess); @@ -175,7 +175,7 @@ size_t latencyFrames = 0; WaveShaperDSPKernel* kernel = const_cast<WaveShaperDSPKernel*>(this); - switch (kernel->waveShaperProcessor()->oversample()) { + switch (kernel->getWaveShaperProcessor()->oversample()) { case WaveShaperProcessor::OverSampleNone: break; case WaveShaperProcessor::OverSample2x:
diff --git a/third_party/WebKit/Source/modules/webaudio/WaveShaperDSPKernel.h b/third_party/WebKit/Source/modules/webaudio/WaveShaperDSPKernel.h index e75be26..7d8c2dd3 100644 --- a/third_party/WebKit/Source/modules/webaudio/WaveShaperDSPKernel.h +++ b/third_party/WebKit/Source/modules/webaudio/WaveShaperDSPKernel.h
@@ -59,7 +59,7 @@ void processCurve2x(const float* source, float* dest, size_t framesToProcess); void processCurve4x(const float* source, float* dest, size_t framesToProcess); - WaveShaperProcessor* waveShaperProcessor() { return static_cast<WaveShaperProcessor*>(processor()); } + WaveShaperProcessor* getWaveShaperProcessor() { return static_cast<WaveShaperProcessor*>(processor()); } // Oversampling. OwnPtr<AudioFloatArray> m_tempBuffer;
diff --git a/third_party/WebKit/Source/modules/webaudio/WaveShaperNode.cpp b/third_party/WebKit/Source/modules/webaudio/WaveShaperNode.cpp index 6a82ba2..83d0329 100644 --- a/third_party/WebKit/Source/modules/webaudio/WaveShaperNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/WaveShaperNode.cpp
@@ -40,7 +40,7 @@ handler().initialize(); } -WaveShaperProcessor* WaveShaperNode::waveShaperProcessor() const +WaveShaperProcessor* WaveShaperNode::getWaveShaperProcessor() const { return static_cast<WaveShaperProcessor*>(static_cast<AudioBasicProcessorHandler&>(handler()).processor()); } @@ -59,12 +59,12 @@ return; } - waveShaperProcessor()->setCurve(curve); + getWaveShaperProcessor()->setCurve(curve); } DOMFloat32Array* WaveShaperNode::curve() { - return waveShaperProcessor()->curve(); + return getWaveShaperProcessor()->curve(); } void WaveShaperNode::setOversample(const String& type) @@ -77,11 +77,11 @@ AbstractAudioContext::AutoLocker contextLocker(context()); if (type == "none") { - waveShaperProcessor()->setOversample(WaveShaperProcessor::OverSampleNone); + getWaveShaperProcessor()->setOversample(WaveShaperProcessor::OverSampleNone); } else if (type == "2x") { - waveShaperProcessor()->setOversample(WaveShaperProcessor::OverSample2x); + getWaveShaperProcessor()->setOversample(WaveShaperProcessor::OverSample2x); } else if (type == "4x") { - waveShaperProcessor()->setOversample(WaveShaperProcessor::OverSample4x); + getWaveShaperProcessor()->setOversample(WaveShaperProcessor::OverSample4x); } else { ASSERT_NOT_REACHED(); } @@ -89,7 +89,7 @@ String WaveShaperNode::oversample() const { - switch (const_cast<WaveShaperNode*>(this)->waveShaperProcessor()->oversample()) { + switch (const_cast<WaveShaperNode*>(this)->getWaveShaperProcessor()->oversample()) { case WaveShaperProcessor::OverSampleNone: return "none"; case WaveShaperProcessor::OverSample2x:
diff --git a/third_party/WebKit/Source/modules/webaudio/WaveShaperNode.h b/third_party/WebKit/Source/modules/webaudio/WaveShaperNode.h index fb05ea3..740af6d 100644 --- a/third_party/WebKit/Source/modules/webaudio/WaveShaperNode.h +++ b/third_party/WebKit/Source/modules/webaudio/WaveShaperNode.h
@@ -52,7 +52,7 @@ private: explicit WaveShaperNode(AbstractAudioContext&); - WaveShaperProcessor* waveShaperProcessor() const; + WaveShaperProcessor* getWaveShaperProcessor() const; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webdatabase/DOMWindowWebDatabase.cpp b/third_party/WebKit/Source/modules/webdatabase/DOMWindowWebDatabase.cpp index ab87d89..e66b55d5 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DOMWindowWebDatabase.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/DOMWindowWebDatabase.cpp
@@ -47,7 +47,7 @@ Database* database = nullptr; DatabaseManager& dbManager = DatabaseManager::manager(); DatabaseError error = DatabaseError::None; - if (RuntimeEnabledFeatures::databaseEnabled() && window.document()->securityOrigin()->canAccessDatabase()) { + if (RuntimeEnabledFeatures::databaseEnabled() && window.document()->getSecurityOrigin()->canAccessDatabase()) { String errorMessage; database = dbManager.openDatabase(window.document(), name, version, displayName, estimatedSize, creationCallback, error, errorMessage); ASSERT(database || error != DatabaseError::None);
diff --git a/third_party/WebKit/Source/modules/webdatabase/Database.cpp b/third_party/WebKit/Source/modules/webdatabase/Database.cpp index 545f8bce..32b524b 100644 --- a/third_party/WebKit/Source/modules/webdatabase/Database.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/Database.cpp
@@ -215,7 +215,7 @@ , m_transactionInProgress(false) , m_isTransactionQueueEnabled(true) { - m_contextThreadSecurityOrigin = m_databaseContext->securityOrigin()->isolatedCopy(); + m_contextThreadSecurityOrigin = m_databaseContext->getSecurityOrigin()->isolatedCopy(); m_databaseAuthorizer = DatabaseAuthorizer::create(infoTableName); @@ -224,11 +224,11 @@ { SafePointAwareMutexLocker locker(guidMutex()); - m_guid = guidForOriginAndName(securityOrigin()->toString(), name); + m_guid = guidForOriginAndName(getSecurityOrigin()->toString(), name); guidCount().add(m_guid); } - m_filename = DatabaseManager::manager().fullPathForDatabase(securityOrigin(), m_name); + m_filename = DatabaseManager::manager().fullPathForDatabase(getSecurityOrigin(), m_name); m_databaseThreadSecurityOrigin = m_contextThreadSecurityOrigin->isolatedCopy(); ASSERT(m_databaseContext->databaseThread()); @@ -260,13 +260,13 @@ bool Database::openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError& error, String& errorMessage) { TaskSynchronizer synchronizer; - if (!databaseContext()->databaseThreadAvailable()) + if (!getDatabaseContext()->databaseThreadAvailable()) return false; DatabaseTracker::tracker().prepareToOpenDatabase(this); bool success = false; OwnPtr<DatabaseOpenTask> task = DatabaseOpenTask::create(this, setVersionInNewDatabase, &synchronizer, error, errorMessage, success); - databaseContext()->databaseThread()->scheduleTask(task.release()); + getDatabaseContext()->databaseThread()->scheduleTask(task.release()); synchronizer.waitForTaskCompletion(); return success; @@ -274,8 +274,8 @@ void Database::close() { - ASSERT(databaseContext()->databaseThread()); - ASSERT(databaseContext()->databaseThread()->isDatabaseThread()); + ASSERT(getDatabaseContext()->databaseThread()); + ASSERT(getDatabaseContext()->databaseThread()->isDatabaseThread()); { MutexLocker locker(m_transactionInProgressMutex); @@ -294,7 +294,7 @@ } closeDatabase(); - databaseContext()->databaseThread()->recordDatabaseClosed(this); + getDatabaseContext()->databaseThread()->recordDatabaseClosed(this); } SQLTransactionBackend* Database::runTransaction(SQLTransaction* transaction, bool readOnly, const ChangeVersionData* data) @@ -330,11 +330,11 @@ if (m_isTransactionQueueEnabled && !m_transactionQueue.isEmpty()) transaction = m_transactionQueue.takeFirst(); - if (transaction && databaseContext()->databaseThreadAvailable()) { + if (transaction && getDatabaseContext()->databaseThreadAvailable()) { OwnPtr<DatabaseTransactionTask> task = DatabaseTransactionTask::create(transaction); WTF_LOG(StorageAPI, "Scheduling DatabaseTransactionTask %p for transaction %p\n", task.get(), task->transaction()); m_transactionInProgress = true; - databaseContext()->databaseThread()->scheduleTask(task.release()); + getDatabaseContext()->databaseThread()->scheduleTask(task.release()); } else { m_transactionInProgress = false; } @@ -342,22 +342,22 @@ void Database::scheduleTransactionStep(SQLTransactionBackend* transaction) { - if (!databaseContext()->databaseThreadAvailable()) + if (!getDatabaseContext()->databaseThreadAvailable()) return; OwnPtr<DatabaseTransactionTask> task = DatabaseTransactionTask::create(transaction); WTF_LOG(StorageAPI, "Scheduling DatabaseTransactionTask %p for the transaction step\n", task.get()); - databaseContext()->databaseThread()->scheduleTask(task.release()); + getDatabaseContext()->databaseThread()->scheduleTask(task.release()); } SQLTransactionClient* Database::transactionClient() const { - return databaseContext()->databaseThread()->transactionClient(); + return getDatabaseContext()->databaseThread()->transactionClient(); } SQLTransactionCoordinator* Database::transactionCoordinator() const { - return databaseContext()->databaseThread()->transactionCoordinator(); + return getDatabaseContext()->databaseThread()->transactionCoordinator(); } // static @@ -546,8 +546,8 @@ reportOpenDatabaseResult(0, -1, 0, WTF::monotonicallyIncreasingTime() - callStartTime); // OK - if (databaseContext()->databaseThread()) - databaseContext()->databaseThread()->recordDatabaseOpen(this); + if (getDatabaseContext()->databaseThread()) + getDatabaseContext()->databaseThread()->recordDatabaseOpen(this); return true; } @@ -712,7 +712,7 @@ { if (Platform::current()->databaseObserver()) { Platform::current()->databaseObserver()->reportOpenDatabaseResult( - createDatabaseIdentifierFromSecurityOrigin(securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(getSecurityOrigin()), stringIdentifier(), errorSite, webSqlErrorCode, sqliteErrorCode, duration); } @@ -722,7 +722,7 @@ { if (Platform::current()->databaseObserver()) { Platform::current()->databaseObserver()->reportChangeVersionResult( - createDatabaseIdentifierFromSecurityOrigin(securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(getSecurityOrigin()), stringIdentifier(), errorSite, webSqlErrorCode, sqliteErrorCode); } } @@ -731,7 +731,7 @@ { if (Platform::current()->databaseObserver()) { Platform::current()->databaseObserver()->reportStartTransactionResult( - createDatabaseIdentifierFromSecurityOrigin(securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(getSecurityOrigin()), stringIdentifier(), errorSite, webSqlErrorCode, sqliteErrorCode); } } @@ -740,7 +740,7 @@ { if (Platform::current()->databaseObserver()) { Platform::current()->databaseObserver()->reportCommitTransactionResult( - createDatabaseIdentifierFromSecurityOrigin(securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(getSecurityOrigin()), stringIdentifier(), errorSite, webSqlErrorCode, sqliteErrorCode); } } @@ -749,7 +749,7 @@ { if (Platform::current()->databaseObserver()) { Platform::current()->databaseObserver()->reportExecuteStatementResult( - createDatabaseIdentifierFromSecurityOrigin(securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(getSecurityOrigin()), stringIdentifier(), errorSite, webSqlErrorCode, sqliteErrorCode); } } @@ -758,27 +758,27 @@ { if (Platform::current()->databaseObserver()) { Platform::current()->databaseObserver()->reportVacuumDatabaseResult( - createDatabaseIdentifierFromSecurityOrigin(securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(getSecurityOrigin()), stringIdentifier(), sqliteErrorCode); } } void Database::logErrorMessage(const String& message) { - executionContext()->addConsoleMessage(ConsoleMessage::create(StorageMessageSource, ErrorMessageLevel, message)); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(StorageMessageSource, ErrorMessageLevel, message)); } -ExecutionContext* Database::executionContext() const +ExecutionContext* Database::getExecutionContext() const { - return databaseContext()->executionContext(); + return getDatabaseContext()->getExecutionContext(); } void Database::closeImmediately() { - ASSERT(executionContext()->isContextThread()); - if (databaseContext()->databaseThreadAvailable() && opened()) { + ASSERT(getExecutionContext()->isContextThread()); + if (getDatabaseContext()->databaseThreadAvailable() && opened()) { logErrorMessage("forcibly closing database"); - databaseContext()->databaseThread()->scheduleTask(DatabaseCloseTask::create(this, 0)); + getDatabaseContext()->databaseThread()->scheduleTask(DatabaseCloseTask::create(this, 0)); } } @@ -821,7 +821,7 @@ bool readOnly, const ChangeVersionData* changeVersionData) { - ASSERT(executionContext()->isContextThread()); + ASSERT(getExecutionContext()->isContextThread()); // FIXME: Rather than passing errorCallback to SQLTransaction and then // sometimes firing it ourselves, this code should probably be pushed down // into Database so that we only create the SQLTransaction if we're @@ -836,7 +836,7 @@ ASSERT(callback == originalErrorCallback); if (callback) { OwnPtr<SQLErrorData> error = SQLErrorData::create(SQLError::UNKNOWN_ERR, "database has been closed"); - executionContext()->postTask(BLINK_FROM_HERE, createSameThreadTask(&callTransactionErrorCallback, callback, error.release())); + getExecutionContext()->postTask(BLINK_FROM_HERE, createSameThreadTask(&callTransactionErrorCallback, callback, error.release())); } } } @@ -845,7 +845,7 @@ { // The task is constructed in a database thread, and destructed in the // context thread. - executionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&SQLTransaction::performPendingCallback, transaction)); + getExecutionContext()->postTask(BLINK_FROM_HERE, createCrossThreadTask(&SQLTransaction::performPendingCallback, transaction)); } Vector<String> Database::performGetTableNames() @@ -884,21 +884,21 @@ // this may not be true anymore. Vector<String> result; TaskSynchronizer synchronizer; - if (!databaseContext()->databaseThreadAvailable()) + if (!getDatabaseContext()->databaseThreadAvailable()) return result; OwnPtr<DatabaseTableNamesTask> task = DatabaseTableNamesTask::create(this, &synchronizer, result); - databaseContext()->databaseThread()->scheduleTask(task.release()); + getDatabaseContext()->databaseThread()->scheduleTask(task.release()); synchronizer.waitForTaskCompletion(); return result; } -SecurityOrigin* Database::securityOrigin() const +SecurityOrigin* Database::getSecurityOrigin() const { - if (executionContext()->isContextThread()) + if (getExecutionContext()->isContextThread()) return m_contextThreadSecurityOrigin.get(); - if (databaseContext()->databaseThread()->isDatabaseThread()) + if (getDatabaseContext()->databaseThread()->isDatabaseThread()) return m_databaseThreadSecurityOrigin.get(); return 0; }
diff --git a/third_party/WebKit/Source/modules/webdatabase/Database.h b/third_party/WebKit/Source/modules/webdatabase/Database.h index d76bc19..d9b8e64 100644 --- a/third_party/WebKit/Source/modules/webdatabase/Database.h +++ b/third_party/WebKit/Source/modules/webdatabase/Database.h
@@ -84,7 +84,7 @@ bool opened(); bool isNew() const { return m_new; } - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; String stringIdentifier() const; String displayName() const; unsigned long estimatedSize() const; @@ -108,8 +108,8 @@ void closeImmediately(); void closeDatabase(); - DatabaseContext* databaseContext() const { return m_databaseContext.get(); } - ExecutionContext* executionContext() const; + DatabaseContext* getDatabaseContext() const { return m_databaseContext.get(); } + ExecutionContext* getExecutionContext() const; private: class DatabaseOpenTask;
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseContext.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseContext.cpp index a03d118..5214070 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseContext.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseContext.cpp
@@ -190,17 +190,17 @@ bool DatabaseContext::allowDatabaseAccess() const { - return toDocument(executionContext())->isActive(); + return toDocument(getExecutionContext())->isActive(); } -SecurityOrigin* DatabaseContext::securityOrigin() const +SecurityOrigin* DatabaseContext::getSecurityOrigin() const { - return executionContext()->securityOrigin(); + return getExecutionContext()->getSecurityOrigin(); } bool DatabaseContext::isContextThread() const { - return executionContext()->isContextThread(); + return getExecutionContext()->isContextThread(); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseContext.h b/third_party/WebKit/Source/modules/webdatabase/DatabaseContext.h index 251f590..c71a676 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseContext.h +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseContext.h
@@ -64,7 +64,7 @@ bool allowDatabaseAccess() const; - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; bool isContextThread() const; private:
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseManager.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseManager.cpp index 060dfc51..282b43c 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseManager.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseManager.cpp
@@ -120,7 +120,7 @@ void DatabaseManager::registerDatabaseContext(DatabaseContext* databaseContext) { - ExecutionContext* context = databaseContext->executionContext(); + ExecutionContext* context = databaseContext->getExecutionContext(); m_contextMap.set(context, databaseContext); #if ENABLE(ASSERT) m_databaseContextRegisteredCount++; @@ -129,7 +129,7 @@ void DatabaseManager::unregisterDatabaseContext(DatabaseContext* databaseContext) { - ExecutionContext* context = databaseContext->executionContext(); + ExecutionContext* context = databaseContext->getExecutionContext(); ASSERT(m_contextMap.get(context)); #if ENABLE(ASSERT) m_databaseContextRegisteredCount--; @@ -169,7 +169,7 @@ static void logOpenDatabaseError(ExecutionContext* context, const String& name) { WTF_LOG(StorageAPI, "Database %s for origin %s not allowed to be established", name.ascii().data(), - context->securityOrigin()->toString().ascii().data()); + context->getSecurityOrigin()->toString().ascii().data()); } Database* DatabaseManager::openDatabaseInternal(ExecutionContext* context, @@ -215,11 +215,11 @@ return nullptr; databaseContextFor(context)->setHasOpenDatabases(); - DatabaseClient::from(context)->didOpenDatabase(database, context->securityOrigin()->host(), name, expectedVersion); + DatabaseClient::from(context)->didOpenDatabase(database, context->getSecurityOrigin()->host(), name, expectedVersion); if (database->isNew() && creationCallback) { WTF_LOG(StorageAPI, "Scheduling DatabaseCreationCallbackTask for database %p\n", database); - database->executionContext()->postTask(BLINK_FROM_HERE, DatabaseCreationCallbackTask::create(database, creationCallback)); + database->getExecutionContext()->postTask(BLINK_FROM_HERE, DatabaseCreationCallbackTask::create(database, creationCallback)); } ASSERT(database);
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.cpp index eea90240..e7710a7 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.cpp
@@ -58,7 +58,7 @@ ASSERT(!m_complete); #endif - if (!m_synchronizer && !m_database->databaseContext()->databaseThread()->isDatabaseOpen(m_database.get())) { + if (!m_synchronizer && !m_database->getDatabaseContext()->databaseThread()->isDatabaseOpen(m_database.get())) { taskCancelled(); #if !LOG_DISABLED m_complete = true;
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp index e64894d1..24f5626 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp
@@ -52,7 +52,7 @@ { if (Platform::current()->databaseObserver()) { Platform::current()->databaseObserver()->databaseClosed( - createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(database->getSecurityOrigin()), database->stringIdentifier()); } } @@ -70,7 +70,7 @@ bool DatabaseTracker::canEstablishDatabase(DatabaseContext* databaseContext, const String& name, const String& displayName, unsigned long estimatedSize, DatabaseError& error) { - ExecutionContext* executionContext = databaseContext->executionContext(); + ExecutionContext* executionContext = databaseContext->getExecutionContext(); bool success = DatabaseClient::from(executionContext)->allowDatabase(executionContext, name, displayName, estimatedSize); if (!success) error = DatabaseError::GenericSecurityError; @@ -88,7 +88,7 @@ if (!m_openDatabaseMap) m_openDatabaseMap = adoptPtr(new DatabaseOriginMap); - String originIdentifier = createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin()); + String originIdentifier = createDatabaseIdentifierFromSecurityOrigin(database->getSecurityOrigin()); DatabaseNameMap* nameMap = m_openDatabaseMap->get(originIdentifier); if (!nameMap) { nameMap = new DatabaseNameMap(); @@ -109,7 +109,7 @@ { { MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard); - String originIdentifier = createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin()); + String originIdentifier = createDatabaseIdentifierFromSecurityOrigin(database->getSecurityOrigin()); ASSERT(m_openDatabaseMap); DatabaseNameMap* nameMap = m_openDatabaseMap->get(originIdentifier); if (!nameMap) @@ -139,10 +139,10 @@ void DatabaseTracker::prepareToOpenDatabase(Database* database) { - ASSERT(database->databaseContext()->executionContext()->isContextThread()); + ASSERT(database->getDatabaseContext()->getExecutionContext()->isContextThread()); if (Platform::current()->databaseObserver()) { Platform::current()->databaseObserver()->databaseOpened( - createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(database->getSecurityOrigin()), database->stringIdentifier(), database->displayName(), database->estimatedSize()); @@ -159,7 +159,7 @@ unsigned long long spaceAvailable = 0; unsigned long long databaseSize = 0; QuotaTracker::instance().getDatabaseSizeAndSpaceAvailableToOrigin( - createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin()), + createDatabaseIdentifierFromSecurityOrigin(database->getSecurityOrigin()), database->stringIdentifier(), &databaseSize, &spaceAvailable); return databaseSize + spaceAvailable; } @@ -205,7 +205,7 @@ // We have to call closeImmediately() on the context thread. for (DatabaseSet::iterator it = databaseSet->begin(); it != databaseSet->end(); ++it) - (*it)->databaseContext()->executionContext()->postTask(BLINK_FROM_HERE, CloseOneDatabaseImmediatelyTask::create(originIdentifier, name, *it)); + (*it)->getDatabaseContext()->getExecutionContext()->postTask(BLINK_FROM_HERE, CloseOneDatabaseImmediatelyTask::create(originIdentifier, name, *it)); } void DatabaseTracker::closeOneDatabaseImmediately(const String& originIdentifier, const String& name, Database* database)
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLStatement.cpp b/third_party/WebKit/Source/modules/webdatabase/SQLStatement.cpp index 89b8347..95f3799 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLStatement.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/SQLStatement.cpp
@@ -56,7 +56,7 @@ , m_asyncOperationId(0) { if (hasCallback() || hasErrorCallback()) - m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(database->executionContext(), "SQLStatement"); + m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(database->getExecutionContext(), "SQLStatement"); } SQLStatement::~SQLStatement() @@ -96,7 +96,7 @@ SQLStatementErrorCallback* errorCallback = m_statementErrorCallback.release(); SQLErrorData* error = m_backend->sqlError(); - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(transaction->database()->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(transaction->database()->getExecutionContext(), m_asyncOperationId); // Call the appropriate statement callback and track if it resulted in an error, // because then we need to jump to the transaction error callback.
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLTransaction.cpp b/third_party/WebKit/Source/modules/webdatabase/SQLTransaction.cpp index a0feedb..a1df309 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLTransaction.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/SQLTransaction.cpp
@@ -65,7 +65,7 @@ , m_readOnly(readOnly) { ASSERT(m_database); - m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(db->executionContext(), "SQLTransaction"); + m_asyncOperationId = InspectorInstrumentation::traceAsyncOperationStarting(db->getExecutionContext(), "SQLTransaction"); } SQLTransaction::~SQLTransaction() @@ -154,7 +154,7 @@ // Spec 4.3.2 4: Invoke the transaction callback with the new SQLTransaction object if (SQLTransactionCallback* callback = m_callback.release()) { m_executeSqlAllowed = true; - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_database->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncCallbackStarting(m_database->getExecutionContext(), m_asyncOperationId); shouldDeliverErrorCallback = !callback->handleEvent(this); InspectorInstrumentation::traceAsyncCallbackCompleted(cookie); m_executeSqlAllowed = false; @@ -173,7 +173,7 @@ SQLTransactionState SQLTransaction::deliverTransactionErrorCallback() { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(m_database->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(m_database->getExecutionContext(), m_asyncOperationId); // Spec 4.3.2.10: If exists, invoke error callback with the last // error to have occurred in this transaction. @@ -232,7 +232,7 @@ SQLTransactionState SQLTransaction::deliverSuccessCallback() { - InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(m_database->executionContext(), m_asyncOperationId); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::traceAsyncOperationCompletedCallbackStarting(m_database->getExecutionContext(), m_asyncOperationId); // Spec 4.3.2.8: Deliver success callback. if (VoidCallback* successCallback = m_successCallback.release()) @@ -281,7 +281,7 @@ } int permissions = DatabaseAuthorizer::ReadWriteMask; - if (!m_database->databaseContext()->allowDatabaseAccess()) + if (!m_database->getDatabaseContext()->allowDatabaseAccess()) permissions |= DatabaseAuthorizer::NoAccessMask; else if (m_readOnly) permissions |= DatabaseAuthorizer::ReadOnlyMask;
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionBackend.cpp b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionBackend.cpp index c385a788..24dd8750 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionBackend.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionBackend.cpp
@@ -381,7 +381,7 @@ return; m_frontend = nullptr; // Break the reference cycle. See comment about the life-cycle above. - ASSERT(database()->databaseContext()->databaseThread()->isDatabaseThread()); + ASSERT(database()->getDatabaseContext()->databaseThread()->isDatabaseThread()); MutexLocker locker(m_statementMutex); m_statementQueue.clear(); @@ -525,7 +525,7 @@ void SQLTransactionBackend::notifyDatabaseThreadIsShuttingDown() { - ASSERT(database()->databaseContext()->databaseThread()->isDatabaseThread()); + ASSERT(database()->getDatabaseContext()->databaseThread()->isDatabaseThread()); // If the transaction is in progress, we should roll it back here, since this // is our last opportunity to do something related to this transaction on the
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionClient.cpp b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionClient.cpp index e88c926..5670e2f6 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionClient.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionClient.cpp
@@ -51,9 +51,9 @@ void SQLTransactionClient::didCommitWriteTransaction(Database* database) { - String originIdentifier = createDatabaseIdentifierFromSecurityOrigin(database->securityOrigin()); + String originIdentifier = createDatabaseIdentifierFromSecurityOrigin(database->getSecurityOrigin()); String databaseName = database->stringIdentifier(); - ExecutionContext* executionContext = database->databaseContext()->executionContext(); + ExecutionContext* executionContext = database->getDatabaseContext()->getExecutionContext(); if (!executionContext->isContextThread()) { executionContext->postTask(BLINK_FROM_HERE, createCrossThreadTask(&databaseModified, originIdentifier, databaseName)); } else { @@ -65,7 +65,7 @@ { // Chromium does not allow users to manually change the quota for an origin (for now, at least). // Don't do anything. - ASSERT(database->databaseContext()->executionContext()->isContextThread()); + ASSERT(database->getDatabaseContext()->getExecutionContext()->isContextThread()); return false; }
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp index db8d8d52..a0b60b8 100644 --- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp +++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -833,6 +833,7 @@ WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCanvas, PassOwnPtr<WebGraphicsContext3D> context, const WebGLContextAttributes& requestedAttributes) : CanvasRenderingContext(passedCanvas) + , m_isHidden(false) , m_contextLostMode(NotLostContext) , m_autoRecoveryMethod(Manual) , m_dispatchContextLostEventTimer(this, &WebGLRenderingContextBase::dispatchContextLostEvent) @@ -1214,8 +1215,14 @@ void WebGLRenderingContextBase::setIsHidden(bool hidden) { + m_isHidden = hidden; if (drawingBuffer()) drawingBuffer()->setIsHidden(hidden); + + if (!hidden && isContextLost() && m_restoreAllowed && m_autoRecoveryMethod == Auto) { + ASSERT(!m_restoreTimer.isActive()); + m_restoreTimer.startOneShot(0, BLINK_FROM_HERE); + } } bool WebGLRenderingContextBase::paintRenderingResultsToCanvas(SourceDrawingBuffer sourceBuffer) @@ -5901,7 +5908,7 @@ RefPtrWillBeRawPtr<WebGLContextEvent> event = WebGLContextEvent::create(EventTypeNames::webglcontextlost, false, true, ""); canvas()->dispatchEvent(event); m_restoreAllowed = event->defaultPrevented(); - if (m_restoreAllowed) { + if (m_restoreAllowed && !m_isHidden) { if (m_autoRecoveryMethod == Auto) m_restoreTimer.startOneShot(0, BLINK_FROM_HERE); }
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h index 0fbc8c3..0421b2aa 100644 --- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h +++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h
@@ -368,7 +368,8 @@ // Restore when resources are available. WhenAvailable, - // Restore as soon as possible. + // Restore as soon as possible, but only when + // the canvas is visible. Auto }; void loseContext(LostContextMode) override; @@ -493,6 +494,7 @@ RefPtr<WebGLContextGroup> m_contextGroup; + bool m_isHidden; LostContextMode m_contextLostMode; AutoRecoveryMethod m_autoRecoveryMethod; // Dispatches a context lost event once it is determined that one is needed.
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIAccess.cpp b/third_party/WebKit/Source/modules/webmidi/MIDIAccess.cpp index 47b3086..ec8f2c8 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIAccess.cpp +++ b/third_party/WebKit/Source/modules/webmidi/MIDIAccess.cpp
@@ -81,7 +81,7 @@ bool MIDIAccess::hasPendingActivity() const { - return m_hasPendingActivity && !executionContext()->activeDOMObjectsAreStopped(); + return m_hasPendingActivity && !getExecutionContext()->activeDOMObjectsAreStopped(); } MIDIInputMap* MIDIAccess::inputs() const @@ -164,7 +164,7 @@ // Convert from time in seconds which is based on the time coordinate system of monotonicallyIncreasingTime() // into time in milliseconds (a DOMHighResTimeStamp) according to the same time coordinate system as performance.now(). // This is how timestamps are defined in the Web MIDI spec. - Document* document = toDocument(executionContext()); + Document* document = toDocument(getExecutionContext()); ASSERT(document); double timeStampInMilliseconds = 1000 * document->loader()->timing().monotonicTimeToZeroBasedDocumentTime(timeStamp); @@ -185,7 +185,7 @@ // We need to translate it exactly to 0 seconds. timeStamp = 0; } else { - Document* document = toDocument(executionContext()); + Document* document = toDocument(getExecutionContext()); ASSERT(document); double documentStartTime = document->loader()->timing().referenceMonotonicTime(); timeStamp = documentStartTime + 0.001 * timeStampInMilliseconds;
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIAccess.h b/third_party/WebKit/Source/modules/webmidi/MIDIAccess.h index 110172a..b7e78cff 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIAccess.h +++ b/third_party/WebKit/Source/modules/webmidi/MIDIAccess.h
@@ -71,7 +71,7 @@ // EventTarget const AtomicString& interfaceName() const override { return EventTargetNames::MIDIAccess; } - ExecutionContext* executionContext() const override { return ActiveDOMObject::executionContext(); } + ExecutionContext* getExecutionContext() const override { return ActiveDOMObject::getExecutionContext(); } // ActiveDOMObject bool hasPendingActivity() const override;
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp index 40a3410..766c89c 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp +++ b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp
@@ -43,11 +43,11 @@ if (m_hasBeenDisposed) return; - if (!executionContext()) + if (!getExecutionContext()) return; if (!m_permissionResolved) { - Document* document = toDocument(executionContext()); + Document* document = toDocument(getExecutionContext()); ASSERT(document); if (MIDIController* controller = MIDIController::from(document->frame())) controller->cancelPermissionRequest(this); @@ -62,7 +62,7 @@ ScriptPromise promise = this->promise(); m_accessor = MIDIAccessor::create(this); - Document* document = toDocument(executionContext()); + Document* document = toDocument(getExecutionContext()); ASSERT(document); if (MIDIController* controller = MIDIController::from(document->frame())) controller->requestPermission(this, m_options); @@ -102,7 +102,7 @@ { ASSERT(m_accessor); if (success) { - resolve(MIDIAccess::create(m_accessor.release(), m_options.hasSysex() && m_options.sysex(), m_portDescriptors, executionContext())); + resolve(MIDIAccess::create(m_accessor.release(), m_options.hasSysex() && m_options.sysex(), m_portDescriptors, getExecutionContext())); } else { // The spec says the name is one of // - SecurityError @@ -134,14 +134,14 @@ reject(DOMException::create(SecurityError)); } -SecurityOrigin* MIDIAccessInitializer::securityOrigin() const +SecurityOrigin* MIDIAccessInitializer::getSecurityOrigin() const { - return executionContext()->securityOrigin(); + return getExecutionContext()->getSecurityOrigin(); } -ExecutionContext* MIDIAccessInitializer::executionContext() const +ExecutionContext* MIDIAccessInitializer::getExecutionContext() const { - return scriptState()->executionContext(); + return getScriptState()->getExecutionContext(); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.h b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.h index dd0cc7c..727630c 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.h +++ b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.h
@@ -62,12 +62,12 @@ void didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) override { } void resolvePermission(bool allowed); - SecurityOrigin* securityOrigin() const; + SecurityOrigin* getSecurityOrigin() const; private: MIDIAccessInitializer(ScriptState*, const MIDIOptions&); - ExecutionContext* executionContext() const; + ExecutionContext* getExecutionContext() const; ScriptPromise start(); void dispose();
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIOutput.cpp b/third_party/WebKit/Source/modules/webmidi/MIDIOutput.cpp index bb2a8dd..5cad1145 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIOutput.cpp +++ b/third_party/WebKit/Source/modules/webmidi/MIDIOutput.cpp
@@ -198,7 +198,7 @@ ASSERT(array); if (timestamp == 0.0) - timestamp = now(executionContext()); + timestamp = now(getExecutionContext()); // Implicit open. It does nothing if the port is already opened. // This should be performed even if |array| is invalid. @@ -211,7 +211,7 @@ void MIDIOutput::send(Vector<unsigned> unsignedData, double timestamp, ExceptionState& exceptionState) { if (timestamp == 0.0) - timestamp = now(executionContext()); + timestamp = now(getExecutionContext()); RefPtr<DOMUint8Array> array = DOMUint8Array::create(unsignedData.size()); DOMUint8Array::ValueType* const arrayData = array->data();
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIPort.cpp b/third_party/WebKit/Source/modules/webmidi/MIDIPort.cpp index 80d79cb..b90614a2 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIPort.cpp +++ b/third_party/WebKit/Source/modules/webmidi/MIDIPort.cpp
@@ -40,7 +40,7 @@ using PortState = MIDIAccessor::MIDIPortState; MIDIPort::MIDIPort(MIDIAccess* access, const String& id, const String& manufacturer, const String& name, TypeCode type, const String& version, PortState state) - : ActiveDOMObject(access->executionContext()) + : ActiveDOMObject(access->getExecutionContext()) , m_id(id) , m_manufacturer(manufacturer) , m_name(name) @@ -141,9 +141,9 @@ } } -ExecutionContext* MIDIPort::executionContext() const +ExecutionContext* MIDIPort::getExecutionContext() const { - return m_access->executionContext(); + return m_access->getExecutionContext(); } bool MIDIPort::hasPendingActivity() const
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIPort.h b/third_party/WebKit/Source/modules/webmidi/MIDIPort.h index 96066ce..e67c069d 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIPort.h +++ b/third_party/WebKit/Source/modules/webmidi/MIDIPort.h
@@ -82,7 +82,7 @@ // EventTarget const AtomicString& interfaceName() const override { return EventTargetNames::MIDIPort; } - ExecutionContext* executionContext() const final; + ExecutionContext* getExecutionContext() const final; // ActiveDOMObject bool hasPendingActivity() const override;
diff --git a/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp b/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp index 5e7da65..dff099f 100644 --- a/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp +++ b/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp
@@ -76,7 +76,7 @@ switch (m_state) { case Active: ASSERT(m_events.isEmpty()); - ASSERT(m_target->executionContext()); + ASSERT(m_target->getExecutionContext()); m_target->dispatchEvent(event); break; case Suspended: @@ -132,7 +132,7 @@ if (m_state == Stopped || m_state == Suspended) break; ASSERT(m_state == Active); - ASSERT(m_target->executionContext()); + ASSERT(m_target->getExecutionContext()); m_target->dispatchEvent(events.takeFirst()); // |this| can be stopped here. } @@ -238,7 +238,7 @@ void DOMWebSocket::logError(const String& message) { - executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); } DOMWebSocket* DOMWebSocket::create(ExecutionContext* context, const String& url, ExceptionState& exceptionState) @@ -277,13 +277,13 @@ void DOMWebSocket::connect(const String& url, const Vector<String>& protocols, ExceptionState& exceptionState) { - UseCounter::count(executionContext(), UseCounter::WebSocket); + UseCounter::count(getExecutionContext(), UseCounter::WebSocket); WTF_LOG(Network, "WebSocket %p connect() url='%s'", this, url.utf8().data()); m_url = KURL(KURL(), url); - if (executionContext()->securityContext().getInsecureRequestsPolicy() == SecurityContext::InsecureRequestsUpgrade && m_url.protocol() == "ws") { - UseCounter::count(executionContext(), UseCounter::UpgradeInsecureRequestsUpgradedRequest); + if (getExecutionContext()->securityContext().getInsecureRequestsPolicy() == SecurityContext::InsecureRequestsUpgrade && m_url.protocol() == "ws") { + UseCounter::count(getExecutionContext(), UseCounter::UpgradeInsecureRequestsUpgradedRequest); m_url.setProtocol("wss"); if (m_url.port() == 80) m_url.setPort(443); @@ -313,7 +313,7 @@ } // FIXME: Convert this to check the isolated world's Content Security Policy once webkit.org/b/104520 is solved. - if (!ContentSecurityPolicy::shouldBypassMainWorld(executionContext()) && !executionContext()->contentSecurityPolicy()->allowConnectToSource(m_url)) { + if (!ContentSecurityPolicy::shouldBypassMainWorld(getExecutionContext()) && !getExecutionContext()->contentSecurityPolicy()->allowConnectToSource(m_url)) { m_state = CLOSED; // The URL is safe to expose to JavaScript, as this check happens synchronously before redirection. exceptionState.throwSecurityError("Refused to connect to '" + m_url.elidedString() + "' because it violates the document's Content Security Policy."); @@ -343,7 +343,7 @@ if (!protocols.isEmpty()) protocolString = joinStrings(protocols, subprotocolSeperator()); - m_channel = createChannel(executionContext(), this); + m_channel = createChannel(getExecutionContext(), this); if (!m_channel->connect(m_url, protocolString)) { m_state = CLOSED; @@ -576,9 +576,9 @@ return EventTargetNames::DOMWebSocket; } -ExecutionContext* DOMWebSocket::executionContext() const +ExecutionContext* DOMWebSocket::getExecutionContext() const { - return ActiveDOMObject::executionContext(); + return ActiveDOMObject::getExecutionContext(); } void DOMWebSocket::contextDestroyed()
diff --git a/third_party/WebKit/Source/modules/websockets/DOMWebSocket.h b/third_party/WebKit/Source/modules/websockets/DOMWebSocket.h index 441e3ad4..6a27148 100644 --- a/third_party/WebKit/Source/modules/websockets/DOMWebSocket.h +++ b/third_party/WebKit/Source/modules/websockets/DOMWebSocket.h
@@ -111,7 +111,7 @@ // EventTarget functions. const AtomicString& interfaceName() const override; - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; // ActiveDOMObject functions. void contextDestroyed() override;
diff --git a/third_party/WebKit/Source/modules/websockets/DOMWebSocketTest.cpp b/third_party/WebKit/Source/modules/websockets/DOMWebSocketTest.cpp index dfd8d36..b344c42 100644 --- a/third_party/WebKit/Source/modules/websockets/DOMWebSocketTest.cpp +++ b/third_party/WebKit/Source/modules/websockets/DOMWebSocketTest.cpp
@@ -102,7 +102,7 @@ : m_pageHolder(DummyPageHolder::create()) , m_websocket(DOMWebSocketWithMockChannel::create(&m_pageHolder->document())) , m_executionScope(v8::Isolate::GetCurrent()) - , m_exceptionState(ExceptionState::ConstructionContext, "property", "interface", m_executionScope.scriptState()->context()->Global(), m_executionScope.isolate()) + , m_exceptionState(ExceptionState::ConstructionContext, "property", "interface", m_executionScope.getScriptState()->context()->Global(), m_executionScope.isolate()) { }
diff --git a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp index 797dab0..d833cf38 100644 --- a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp +++ b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp
@@ -87,7 +87,7 @@ : m_channel(channel) , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) { - m_loader.start(channel->executionContext(), blobDataHandle); + m_loader.start(channel->getExecutionContext(), blobDataHandle); } void DocumentWebSocketChannel::BlobLoader::cancel() @@ -137,7 +137,7 @@ if (MixedContentChecker::shouldBlockWebSocket(document()->frame(), url)) return false; } - if (MixedContentChecker::isMixedContent(document()->securityOrigin(), url)) { + if (MixedContentChecker::isMixedContent(document()->getSecurityOrigin(), url)) { String message = "Connecting to a non-secure WebSocket server from a secure origin is deprecated."; document()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message)); } @@ -158,7 +158,7 @@ if (document()->frame()) document()->frame()->loader().client()->dispatchWillOpenWebSocket(m_handle.get()); - m_handle->connect(url, webProtocols, WebSecurityOrigin(executionContext()->securityOrigin()), this); + m_handle->connect(url, webProtocols, WebSecurityOrigin(getExecutionContext()->getSecurityOrigin()), this); flowControlIfNecessary(); TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketCreate", TRACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketCreateEvent::data(document(), m_identifier, url, protocol)); @@ -238,7 +238,7 @@ InspectorInstrumentation::didReceiveWebSocketFrameError(document(), m_identifier, reason); const String message = "WebSocket connection to '" + m_url.elidedString() + "' failed: " + reason; - executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, level, message, sourceURL, lineNumber)); + getExecutionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, level, message, sourceURL, lineNumber)); if (m_client) m_client->didError(); @@ -382,7 +382,7 @@ Document* DocumentWebSocketChannel::document() { // This context is always a Document. See the constructor. - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); ASSERT(context->isDocument()); return toDocument(context); }
diff --git a/third_party/WebKit/Source/modules/webusb/USB.cpp b/third_party/WebKit/Source/modules/webusb/USB.cpp index 06204cf8..c35c88c 100644 --- a/third_party/WebKit/Source/modules/webusb/USB.cpp +++ b/third_party/WebKit/Source/modules/webusb/USB.cpp
@@ -63,11 +63,11 @@ public: using WebType = OwnPtr<WebVector<WebUSBDevice*>>; - static HeapVector<Member<USBDevice>> take(ScriptPromiseResolver*, PassOwnPtr<WebVector<WebUSBDevice*>> webDevices) + static HeapVector<Member<USBDevice>> take(ScriptPromiseResolver* resolver, PassOwnPtr<WebVector<WebUSBDevice*>> webDevices) { HeapVector<Member<USBDevice>> devices; for (const auto webDevice : *webDevices) - devices.append(USBDevice::create(adoptPtr(webDevice))); + devices.append(USBDevice::create(adoptPtr(webDevice), resolver->getExecutionContext())); return devices; } }; @@ -94,7 +94,7 @@ return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); String errorMessage; - if (!scriptState->executionContext()->isSecureContext(errorMessage)) + if (!scriptState->getExecutionContext()->isSecureContext(errorMessage)) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, errorMessage)); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); @@ -110,7 +110,7 @@ return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); String errorMessage; - if (!scriptState->executionContext()->isSecureContext(errorMessage)) + if (!scriptState->getExecutionContext()->isSecureContext(errorMessage)) return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, errorMessage)); if (!UserGestureIndicator::consumeUserGesture()) @@ -126,7 +126,7 @@ return promise; } -ExecutionContext* USB::executionContext() const +ExecutionContext* USB::getExecutionContext() const { return frame() ? frame()->document() : nullptr; } @@ -145,12 +145,12 @@ void USB::onDeviceConnected(WebPassOwnPtr<WebUSBDevice> device) { - dispatchEvent(USBConnectionEvent::create(EventTypeNames::connect, USBDevice::create(device.release()))); + dispatchEvent(USBConnectionEvent::create(EventTypeNames::connect, USBDevice::create(device.release(), getExecutionContext()))); } void USB::onDeviceDisconnected(WebPassOwnPtr<WebUSBDevice> device) { - dispatchEvent(USBConnectionEvent::create(EventTypeNames::disconnect, USBDevice::create(device.release()))); + dispatchEvent(USBConnectionEvent::create(EventTypeNames::disconnect, USBDevice::create(device.release(), getExecutionContext()))); } DEFINE_TRACE(USB)
diff --git a/third_party/WebKit/Source/modules/webusb/USB.h b/third_party/WebKit/Source/modules/webusb/USB.h index b4baae6b..fbad005d 100644 --- a/third_party/WebKit/Source/modules/webusb/USB.h +++ b/third_party/WebKit/Source/modules/webusb/USB.h
@@ -41,7 +41,7 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(disconnect); // EventTarget overrides. - ExecutionContext* executionContext() const override; + ExecutionContext* getExecutionContext() const override; const AtomicString& interfaceName() const override; // LocalFrameLifecycleObserver overrides.
diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp index 94d3fd9..d4bc001f 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp
@@ -26,6 +26,9 @@ namespace { +const char kOpenCloseInProgress[] = "An open() or close() task is in progress."; +const char kOpenRequired[] = "The device must be open()ed first."; + DOMException* convertControlTransferParameters( WebUSBDevice::TransferDirection direction, const USBControlTransferParameters& parameters, @@ -74,20 +77,53 @@ } } +class OpenClosePromiseAdapter : public WebCallbacks<void, const WebUSBError&> { +public: + OpenClosePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, bool desiredState) + : m_device(device) + , m_resolver(resolver) + , m_desiredState(desiredState) + { + } + + void onSuccess() override + { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) + return; + if (m_device) + m_device->onDeviceOpenedOrClosed(m_desiredState); + m_resolver->resolve(); + } + + void onError(const WebUSBError& e) override + { + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) + return; + if (m_device) + m_device->onDeviceOpenedOrClosed(!m_desiredState); + m_resolver->reject(USBError::take(m_resolver, e)); + } + +private: + WeakPersistent<USBDevice> m_device; + Persistent<ScriptPromiseResolver> m_resolver; + bool m_desiredState; // true: open, false: closed +}; + class GetConfigurationPromiseAdapter : public WebCallbacks<uint8_t, const WebUSBError&> { public: GetConfigurationPromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver) : m_device(device), m_resolver(resolver) {} void onSuccess(uint8_t value) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->resolve(USBConfiguration::createFromValue(m_device, value)); } void onError(const WebUSBError& e) override { - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) + if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; m_resolver->reject(USBError::take(m_resolver, e)); } @@ -192,6 +228,18 @@ } // namespace +// static +USBDevice* USBDevice::take(ScriptPromiseResolver* resolver, PassOwnPtr<WebUSBDevice> device) +{ + return USBDevice::create(device, resolver->getExecutionContext()); +} + +void USBDevice::onDeviceOpenedOrClosed(bool opened) +{ + m_opened = opened; + m_deviceStateChangeInProgress = false; +} + HeapVector<Member<USBConfiguration>> USBDevice::configurations() const { HeapVector<Member<USBConfiguration>> configurations; @@ -204,8 +252,14 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->open(new CallbackPromiseAdapter<void, USBError>(resolver)); - setContext(scriptState->executionContext()); + if (m_deviceStateChangeInProgress) { + resolver->reject(DOMException::create(InvalidStateError, kOpenCloseInProgress)); + } else if (m_opened) { + resolver->resolve(); + } else { + m_deviceStateChangeInProgress = true; + m_device->open(new OpenClosePromiseAdapter(this, resolver, true /* open */)); + } return promise; } @@ -213,8 +267,14 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->close(new CallbackPromiseAdapter<void, USBError>(resolver)); - setContext(nullptr); + if (m_deviceStateChangeInProgress) { + resolver->reject(DOMException::create(InvalidStateError, kOpenCloseInProgress)); + } else if (!m_opened) { + resolver->resolve(); + } else { + m_deviceStateChangeInProgress = true; + m_device->close(new OpenClosePromiseAdapter(this, resolver, false /* closed */)); + } return promise; } @@ -230,7 +290,10 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->setConfiguration(configurationValue, new CallbackPromiseAdapter<void, USBError>(resolver)); + if (!m_opened) + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else + m_device->setConfiguration(configurationValue, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -238,7 +301,10 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->claimInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); + if (!m_opened) + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else + m_device->claimInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -246,7 +312,10 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->releaseInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); + if (!m_opened) + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else + m_device->releaseInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -254,7 +323,10 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->setInterface(interfaceNumber, alternateSetting, new CallbackPromiseAdapter<void, USBError>(resolver)); + if (!m_opened) + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else + m_device->setInterface(interfaceNumber, alternateSetting, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -262,12 +334,19 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); + if (!m_opened) { + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + return promise; + } + WebUSBDevice::ControlTransferParameters parameters; DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::In, setup, ¶meters); - if (error) + if (error) { resolver->reject(error); - else - m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); + return promise; + } + + m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); return promise; } @@ -275,12 +354,19 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); + if (!m_opened) { + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + return promise; + } + WebUSBDevice::ControlTransferParameters parameters; DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters); - if (error) + if (error) { resolver->reject(error); - else - m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); + return promise; + } + + m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); return promise; } @@ -288,14 +374,20 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); + if (!m_opened) { + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + return promise; + } + WebUSBDevice::ControlTransferParameters parameters; DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters); if (error) { resolver->reject(error); - } else { - BufferSource buffer(data); - m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); + return promise; } + + BufferSource buffer(data); + m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); return promise; } @@ -303,7 +395,10 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); + if (!m_opened) + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else + m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -311,7 +406,10 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); + if (!m_opened) + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else + m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); return promise; } @@ -319,8 +417,12 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - BufferSource buffer(data); - m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); + if (!m_opened) { + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + } else { + BufferSource buffer(data); + m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); + } return promise; } @@ -328,7 +430,10 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousInputTransferResult, USBError>(resolver)); + if (!m_opened) + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else + m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousInputTransferResult, USBError>(resolver)); return promise; } @@ -336,8 +441,12 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - BufferSource buffer(data); - m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseAdapter<IsochronousOutputTransferResult, USBError>(resolver)); + if (!m_opened) { + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + } else { + BufferSource buffer(data); + m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseAdapter<IsochronousOutputTransferResult, USBError>(resolver)); + } return promise; } @@ -345,13 +454,17 @@ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); + if (!m_opened) + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else + m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } void USBDevice::contextDestroyed() { - m_device->close(new WebUSBDeviceCloseCallbacks()); + if (m_opened) + m_device->close(new WebUSBDeviceCloseCallbacks()); } DEFINE_TRACE(USBDevice)
diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.h b/third_party/WebKit/Source/modules/webusb/USBDevice.h index a561e08..aa6d419 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.h +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.h
@@ -30,26 +30,27 @@ public: using WebType = OwnPtr<WebUSBDevice>; - static USBDevice* create(PassOwnPtr<WebUSBDevice> device) + static USBDevice* create(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) { - return new USBDevice(device); + return new USBDevice(device, context); } - static USBDevice* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBDevice> device) - { - return create(device); - } + static USBDevice* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBDevice>); - explicit USBDevice(PassOwnPtr<WebUSBDevice> device) - : ContextLifecycleObserver(nullptr) + explicit USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) + : ContextLifecycleObserver(context) , m_device(device) + , m_opened(false) + , m_deviceStateChangeInProgress(false) { } virtual ~USBDevice() { } const WebUSBDeviceInfo& info() const { return m_device->info(); } + void onDeviceOpenedOrClosed(bool); + // IDL exposed interface: String guid() const { return info().guid; } uint8_t usbVersionMajor() { return info().usbVersionMajor; } uint8_t usbVersionMinor() { return info().usbVersionMinor; } @@ -66,6 +67,7 @@ String productName() const { return info().productName; } String serialNumber() const { return info().serialNumber; } HeapVector<Member<USBConfiguration>> configurations() const; + bool opened() const { return m_opened; } ScriptPromise open(ScriptState*); ScriptPromise close(ScriptState*); @@ -90,6 +92,8 @@ private: OwnPtr<WebUSBDevice> m_device; + bool m_opened; + bool m_deviceStateChangeInProgress; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.idl b/third_party/WebKit/Source/modules/webusb/USBDevice.idl index 6d384618..84c2382a 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.idl +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.idl
@@ -32,6 +32,7 @@ readonly attribute DOMString? productName; readonly attribute DOMString? serialNumber; readonly attribute sequence<USBConfiguration> configurations; + readonly attribute boolean opened; [CallWith=ScriptState] Promise<void> open(); [CallWith=ScriptState] Promise<void> close();
diff --git a/third_party/WebKit/Source/modules/worklet/Worklet.cpp b/third_party/WebKit/Source/modules/worklet/Worklet.cpp index 647ee587..a12d417 100644 --- a/third_party/WebKit/Source/modules/worklet/Worklet.cpp +++ b/third_party/WebKit/Source/modules/worklet/Worklet.cpp
@@ -24,13 +24,13 @@ Worklet::Worklet(LocalFrame* frame, ExecutionContext* executionContext) : ActiveDOMObject(executionContext) - , m_workletGlobalScope(WorkletGlobalScope::create(frame, executionContext->url(), executionContext->userAgent(), executionContext->securityOrigin(), toIsolate(executionContext))) + , m_workletGlobalScope(WorkletGlobalScope::create(frame, executionContext->url(), executionContext->userAgent(), executionContext->getSecurityOrigin(), toIsolate(executionContext))) { } ScriptPromise Worklet::import(ScriptState* scriptState, const String& url) { - KURL scriptURL = executionContext()->completeURL(url); + KURL scriptURL = getExecutionContext()->completeURL(url); if (!scriptURL.isValid()) { return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SyntaxError, "'" + url + "' is not a valid URL.")); } @@ -49,7 +49,8 @@ // NOTE: WorkerScriptLoader may synchronously invoke its callbacks // (resolving the promise) before we return it. m_scriptLoaders.append(WorkerScriptLoader::create()); - m_scriptLoaders.last()->loadAsynchronously(*executionContext(), scriptURL, DenyCrossOriginRequests, + m_scriptLoaders.last()->loadAsynchronously(*getExecutionContext(), scriptURL, DenyCrossOriginRequests, + getExecutionContext()->securityContext().addressSpace(), bind(&Worklet::onResponse, this), bind(&Worklet::onFinished, this, m_scriptLoaders.last().get(), resolver));
diff --git a/third_party/WebKit/Source/modules/worklet/WorkletGlobalScope.cpp b/third_party/WebKit/Source/modules/worklet/WorkletGlobalScope.cpp index 833e715..ed7b505 100644 --- a/third_party/WebKit/Source/modules/worklet/WorkletGlobalScope.cpp +++ b/third_party/WebKit/Source/modules/worklet/WorkletGlobalScope.cpp
@@ -63,9 +63,9 @@ // Until there are APIs that are available in worklets and that // require a privileged context test that checks ancestors, just do // a simple check here. - if (securityOrigin()->isPotentiallyTrustworthy()) + if (getSecurityOrigin()->isPotentiallyTrustworthy()) return true; - errorMessage = securityOrigin()->isPotentiallyTrustworthyErrorMessage(); + errorMessage = getSecurityOrigin()->isPotentiallyTrustworthyErrorMessage(); return false; }
diff --git a/third_party/WebKit/Source/modules/worklet/WorkletGlobalScope.h b/third_party/WebKit/Source/modules/worklet/WorkletGlobalScope.h index 2546c2f..e1d63579 100644 --- a/third_party/WebKit/Source/modules/worklet/WorkletGlobalScope.h +++ b/third_party/WebKit/Source/modules/worklet/WorkletGlobalScope.h
@@ -42,7 +42,7 @@ WorkletConsole* console(); // WorkerOrWorkletGlobalScope - ScriptWrappable* scriptWrappable() const final { return const_cast<WorkletGlobalScope*>(this); } + ScriptWrappable* getScriptWrappable() const final { return const_cast<WorkletGlobalScope*>(this); } WorkerOrWorkletScriptController* scriptController() final { return m_scriptController.get(); } // ScriptWrappable @@ -53,10 +53,10 @@ void disableEval(const String& errorMessage) final; String userAgent() const final { return m_userAgent; } SecurityContext& securityContext() final { return *this; } - EventQueue* eventQueue() const final { ASSERT_NOT_REACHED(); return nullptr; } // WorkletGlobalScopes don't have an event queue. + EventQueue* getEventQueue() const final { ASSERT_NOT_REACHED(); return nullptr; } // WorkletGlobalScopes don't have an event queue. bool isSecureContext(String& errorMessage, const SecureContextCheck = StandardSecureContextCheck) const final; - using SecurityContext::securityOrigin; + using SecurityContext::getSecurityOrigin; using SecurityContext::contentSecurityPolicy; DOMTimerCoordinator* timers() final { ASSERT_NOT_REACHED(); return nullptr; } // WorkletGlobalScopes don't have timers.
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn index f5d0ad2..8255b6a9 100644 --- a/third_party/WebKit/Source/platform/BUILD.gn +++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -564,6 +564,10 @@ group("blink_platform_unittests_data") { data = [ "testing/data/", + + # Required by some image decoder tests. + "image-decoders/testing/", + "../../LayoutTests/fast/images/resources/", ] }
diff --git a/third_party/WebKit/Source/platform/EncryptedMediaRequest.h b/third_party/WebKit/Source/platform/EncryptedMediaRequest.h index a260abf..6e396fa 100644 --- a/third_party/WebKit/Source/platform/EncryptedMediaRequest.h +++ b/third_party/WebKit/Source/platform/EncryptedMediaRequest.h
@@ -22,7 +22,7 @@ virtual WebString keySystem() const = 0; virtual const WebVector<WebMediaKeySystemConfiguration>& supportedConfigurations() const = 0; - virtual SecurityOrigin* securityOrigin() const = 0; + virtual SecurityOrigin* getSecurityOrigin() const = 0; virtual void requestSucceeded(WebContentDecryptionModuleAccess*) = 0; virtual void requestNotSupported(const WebString& errorMessage) = 0;
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in index 9e203cf4..a91cfa6 100644 --- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in +++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -170,7 +170,6 @@ ServiceWorkerClientAttributes status=stable ServiceWorkerExtendableMessageEvent status=experimental ServiceWorkerClientsGetID status=stable -ServiceWorkerPerformanceTimeline status=stable ServiceWorkerWindowClientNavigate status=stable ShadowDOMV1 status=experimental ShadowRootDelegatesFocus status=experimental
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi index 7162c928..3f0b043 100644 --- a/third_party/WebKit/Source/platform/blink_platform.gypi +++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -1165,6 +1165,7 @@ 'geometry/LayoutRectTest.cpp', 'geometry/LayoutRectOutsetsTest.cpp', 'geometry/RegionTest.cpp', + 'graphics/BitmapImageTest.cpp', 'graphics/CompositorMutableStateTest.cpp', 'graphics/ContiguousContainerTest.cpp', 'graphics/GraphicsContextTest.cpp', @@ -1181,6 +1182,12 @@ 'graphics/paint/PaintControllerTest.cpp', 'image-decoders/FastSharedBufferReaderTest.cpp', 'image-decoders/ImageDecoderTest.cpp', + 'image-decoders/ImageDecoderTestHelpers.cpp', + 'image-decoders/ImageDecoderTestHelpers.h', + 'image-decoders/bmp/BMPImageDecoderTest.cpp', + 'image-decoders/gif/GIFImageDecoderTest.cpp', + 'image-decoders/jpeg/JPEGImageDecoderTest.cpp', + 'image-decoders/webp/WEBPImageDecoderTest.cpp', 'inspector_protocol/ParserTest.cpp', 'mac/VersionUtilMacTest.mm', 'network/EncodedFormDataTest.cpp', @@ -1212,7 +1219,6 @@ # object. Do not add more unless the test requires a Platform object. # These tests are a part of the web:webkit_unit_tests binary. 'platform_web_unittest_files': [ - 'graphics/BitmapImageTest.cpp', 'graphics/Canvas2DLayerBridgeTest.cpp', 'graphics/DeferredImageDecoderTest.cpp', 'graphics/GraphicsLayerTest.cpp', @@ -1221,11 +1227,6 @@ 'graphics/ImageLayerChromiumTest.cpp', 'graphics/test/MockImageDecoder.h', 'graphics/test/MockWebGraphicsContext3D.h', - 'image-decoders/ImageDecoderTestHelpers.cpp', - 'image-decoders/bmp/BMPImageDecoderTest.cpp', - 'image-decoders/gif/GIFImageDecoderTest.cpp', - 'image-decoders/jpeg/JPEGImageDecoderTest.cpp', - 'image-decoders/webp/WEBPImageDecoderTest.cpp', 'threading/BackgroundTaskRunnerTest.cpp', ], 'platform_test_support_files': [
diff --git a/third_party/WebKit/Source/platform/blink_platform_unittests.isolate b/third_party/WebKit/Source/platform/blink_platform_unittests.isolate index 41eadba1..2e344787 100644 --- a/third_party/WebKit/Source/platform/blink_platform_unittests.isolate +++ b/third_party/WebKit/Source/platform/blink_platform_unittests.isolate
@@ -6,6 +6,9 @@ 'files': [ # Required by some font tests. 'testing/data/', + # Required by some image decoder tests. + 'image-decoders/testing/', + '../../LayoutTests/fast/images/resources/', ], }, 'conditions': [
diff --git a/third_party/WebKit/Source/platform/exported/WebEncryptedMediaRequest.cpp b/third_party/WebKit/Source/platform/exported/WebEncryptedMediaRequest.cpp index 4409af0..23e12ae9 100644 --- a/third_party/WebKit/Source/platform/exported/WebEncryptedMediaRequest.cpp +++ b/third_party/WebKit/Source/platform/exported/WebEncryptedMediaRequest.cpp
@@ -38,9 +38,9 @@ return m_private->supportedConfigurations(); } -WebSecurityOrigin WebEncryptedMediaRequest::securityOrigin() const +WebSecurityOrigin WebEncryptedMediaRequest::getSecurityOrigin() const { - return WebSecurityOrigin(m_private->securityOrigin()); + return WebSecurityOrigin(m_private->getSecurityOrigin()); } void WebEncryptedMediaRequest::requestSucceeded(WebContentDecryptionModuleAccess* access)
diff --git a/third_party/WebKit/Source/platform/exported/WebServiceWorkerRequest.cpp b/third_party/WebKit/Source/platform/exported/WebServiceWorkerRequest.cpp index 95bce10b..0ebeb76 100644 --- a/third_party/WebKit/Source/platform/exported/WebServiceWorkerRequest.cpp +++ b/third_party/WebKit/Source/platform/exported/WebServiceWorkerRequest.cpp
@@ -112,8 +112,12 @@ return m_private->blobDataHandle; } -void WebServiceWorkerRequest::setReferrer(const WebString& referrer, WebReferrerPolicy referrerPolicy) +void WebServiceWorkerRequest::setReferrer(const WebString& webReferrer, WebReferrerPolicy referrerPolicy) { + // WebString doesn't have the distinction between empty and null. We use + // the null WTFString for referrer. + ASSERT(Referrer::noReferrer() == String()); + String referrer = webReferrer.isEmpty() ? Referrer::noReferrer() : String(webReferrer); m_private->m_referrer = Referrer(referrer, static_cast<ReferrerPolicy>(referrerPolicy)); }
diff --git a/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp b/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp index 1b668a2ef..99e6a59 100644 --- a/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp +++ b/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp
@@ -180,8 +180,12 @@ m_private->m_resourceRequest->setHTTPHeaderField(name, value); } -void WebURLRequest::setHTTPReferrer(const WebString& referrer, WebReferrerPolicy referrerPolicy) +void WebURLRequest::setHTTPReferrer(const WebString& webReferrer, WebReferrerPolicy referrerPolicy) { + // WebString doesn't have the distinction between empty and null. We use + // the null WTFString for referrer. + ASSERT(Referrer::noReferrer() == String()); + String referrer = webReferrer.isEmpty() ? Referrer::noReferrer() : String(webReferrer); m_private->m_resourceRequest->setHTTPReferrer(Referrer(referrer, static_cast<ReferrerPolicy>(referrerPolicy))); }
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp index ace3224..06a002e 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
@@ -501,7 +501,7 @@ return; m_isHidden = newHiddenValue; - if (m_surface && isHidden() && !m_destructionInProgress && !m_hibernationScheduled) { + if (CANVAS2D_HIBERNATION_ENABLED && m_surface && isHidden() && !m_destructionInProgress && !m_hibernationScheduled) { if (m_layer) m_layer->clearTexture(); m_logger->reportHibernationEvent(HibernationScheduled);
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h index 19565bd1..b14738c 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h
@@ -53,6 +53,14 @@ class WebGraphicsContext3DProvider; class SharedContextRateLimiter; +#if OS(MACOSX) +// Canvas hibernation is currently disabled on MacOS X due to a bug that causes content loss +// TODO: Find a better fix for crbug.com/588434 +#define CANVAS2D_HIBERNATION_ENABLED 0 +#else +#define CANVAS2D_HIBERNATION_ENABLED 1 +#endif + class PLATFORM_EXPORT Canvas2DLayerBridge : public WebExternalTextureLayerClient, public WebThread::TaskObserver, public RefCounted<Canvas2DLayerBridge> { WTF_MAKE_NONCOPYABLE(Canvas2DLayerBridge); public:
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp index f106ed0..89f071d0 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp
@@ -462,7 +462,11 @@ virtual ~MockImageBuffer() { } }; +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycle) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycle) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -504,7 +508,11 @@ ::testing::Mock::VerifyAndClearExpectations(&mainMock); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, HibernationReEntry) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationReEntry) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -552,7 +560,11 @@ } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycleWithDeferredRenderingDisabled) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationLifeCycleWithDeferredRenderingDisabled) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -620,7 +632,11 @@ doneEvent->wait(); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernating) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernating) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -669,7 +685,11 @@ ::testing::Mock::VerifyAndClearExpectations(&mainMock); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, BackgroundRenderingWhileHibernatingWithDeferredRenderingDisabled) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_BackgroundRenderingWhileHibernatingWithDeferredRenderingDisabled) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -726,7 +746,11 @@ postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, DisableDeferredRenderingWhileHibernating) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_DisableDeferredRenderingWhileHibernating) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -782,7 +806,11 @@ postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernating) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernating) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -833,7 +861,11 @@ WaitableEvent* m_doneEvent; }; +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, TeardownWhileHibernationIsPending) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_TeardownWhileHibernationIsPending) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -871,7 +903,11 @@ ::testing::Mock::VerifyAndClearExpectations(&mainMock); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToPendingTeardown) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToPendingTeardown) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -903,7 +939,11 @@ ::testing::Mock::VerifyAndClearExpectations(&mainMock); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToVisibilityChange) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToVisibilityChange) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -938,7 +978,11 @@ ::testing::Mock::VerifyAndClearExpectations(&mainMock); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, HibernationAbortedDueToLostContext) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_HibernationAbortedDueToLostContext) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -971,7 +1015,11 @@ ::testing::Mock::VerifyAndClearExpectations(&mainMock); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileHibernating) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileHibernating) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); @@ -1006,7 +1054,11 @@ postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); } +#if CANVAS2D_HIBERNATION_ENABLED TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWhileBackgroundRendering) +#else +TEST_F(Canvas2DLayerBridgeTest, DISABLED_PrepareMailboxWhileBackgroundRendering) +#endif { MockCanvasContext mainMock; OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread"));
diff --git a/third_party/WebKit/Source/platform/graphics/GeneratedImage.cpp b/third_party/WebKit/Source/platform/graphics/GeneratedImage.cpp index 4d7ca669..afe68b2 100644 --- a/third_party/WebKit/Source/platform/graphics/GeneratedImage.cpp +++ b/third_party/WebKit/Source/platform/graphics/GeneratedImage.cpp
@@ -37,12 +37,6 @@ namespace blink { -void GeneratedImage::computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio) -{ - Image::computeIntrinsicDimensions(intrinsicSize, intrinsicRatio); - intrinsicRatio = FloatSize(); -} - void GeneratedImage::drawPattern(GraphicsContext& destContext, const FloatRect& srcRect, const FloatSize& scale, const FloatPoint& phase, SkXfermode::Mode compositeOp, const FloatRect& destRect, const FloatSize& repeatSpacing)
diff --git a/third_party/WebKit/Source/platform/graphics/GeneratedImage.h b/third_party/WebKit/Source/platform/graphics/GeneratedImage.h index 6409111..de9cb392 100644 --- a/third_party/WebKit/Source/platform/graphics/GeneratedImage.h +++ b/third_party/WebKit/Source/platform/graphics/GeneratedImage.h
@@ -38,7 +38,6 @@ bool usesContainerSize() const override { return true; } bool hasRelativeSize() const override { return true; } - void computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio) override; IntSize size() const override { return m_size; }
diff --git a/third_party/WebKit/Source/platform/graphics/Image.cpp b/third_party/WebKit/Source/platform/graphics/Image.cpp index 5ab1d6f4..36e0b9d 100644 --- a/third_party/WebKit/Source/platform/graphics/Image.cpp +++ b/third_party/WebKit/Source/platform/graphics/Image.cpp
@@ -259,11 +259,6 @@ PlatformInstrumentation::didDrawLazyPixelRef(imageID); } -void Image::computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio) -{ - intrinsicSize = intrinsicRatio = FloatSize(size()); -} - PassRefPtr<Image> Image::imageForDefaultFrame() { RefPtr<Image> image(this);
diff --git a/third_party/WebKit/Source/platform/graphics/Image.h b/third_party/WebKit/Source/platform/graphics/Image.h index 089832c..4d31e1d 100644 --- a/third_party/WebKit/Source/platform/graphics/Image.h +++ b/third_party/WebKit/Source/platform/graphics/Image.h
@@ -93,11 +93,6 @@ virtual bool usesContainerSize() const { return false; } virtual bool hasRelativeSize() const { return false; } - // Computes (extracts) the intrinsic dimensions and ratio from the Image. The intrinsic ratio - // will be the 'viewport' of the image. (Same as the dimensions for a raster image. For SVG - // images it can be the dimensions defined by the 'viewBox'.) - virtual void computeIntrinsicDimensions(FloatSize& intrinsicSize, FloatSize& intrinsicRatio); - virtual IntSize size() const = 0; IntRect rect() const { return IntRect(IntPoint(), size()); } int width() const { return size().width(); }
diff --git a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp index 88164b1..e57cbef 100644 --- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoderTest.cpp
@@ -45,7 +45,6 @@ const char decodersTestingDir[] = "Source/platform/image-decoders/testing"; const char layoutTestResourcesDir[] = "LayoutTests/fast/images/resources"; -const char webTestsDataDir[] = "Source/web/tests/data"; PassOwnPtr<ImageDecoder> createDecoder() { @@ -218,7 +217,7 @@ { OwnPtr<ImageDecoder> decoder = createDecoder(); - RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "broken.gif"); + RefPtr<SharedBuffer> data = readFile(decodersTestingDir, "broken.gif"); ASSERT_TRUE(data.get()); decoder->setData(data.get(), true); @@ -230,7 +229,7 @@ TEST(GIFImageDecoderTest, progressiveDecode) { - RefPtr<SharedBuffer> fullData = readFile(webTestsDataDir, "radient.gif"); + RefPtr<SharedBuffer> fullData = readFile(decodersTestingDir, "radient.gif"); ASSERT_TRUE(fullData.get()); const size_t fullLength = fullData->size(); @@ -338,8 +337,8 @@ TEST(GIFImageDecoderTest, badTerminator) { - RefPtr<SharedBuffer> referenceData = readFile(webTestsDataDir, "radient.gif"); - RefPtr<SharedBuffer> testData = readFile(webTestsDataDir, "radient-bad-terminator.gif"); + RefPtr<SharedBuffer> referenceData = readFile(decodersTestingDir, "radient.gif"); + RefPtr<SharedBuffer> testData = readFile(decodersTestingDir, "radient-bad-terminator.gif"); ASSERT_TRUE(referenceData.get()); ASSERT_TRUE(testData.get()); @@ -387,7 +386,7 @@ TEST(GIFImageDecoderTest, randomFrameDecode) { // Single frame image. - testRandomFrameDecode(webTestsDataDir, "radient.gif"); + testRandomFrameDecode(decodersTestingDir, "radient.gif"); // Multiple frame images. testRandomFrameDecode(layoutTestResourcesDir, "animated-gif-with-offsets.gif"); testRandomFrameDecode(layoutTestResourcesDir, "animated-10color.gif"); @@ -396,7 +395,7 @@ TEST(GIFImageDecoderTest, randomDecodeAfterClearFrameBufferCache) { // Single frame image. - testRandomDecodeAfterClearFrameBufferCache(webTestsDataDir, "radient.gif"); + testRandomDecodeAfterClearFrameBufferCache(decodersTestingDir, "radient.gif"); // Multiple frame images. testRandomDecodeAfterClearFrameBufferCache(layoutTestResourcesDir, "animated-gif-with-offsets.gif"); testRandomDecodeAfterClearFrameBufferCache(layoutTestResourcesDir, "animated-10color.gif"); @@ -465,7 +464,7 @@ OwnPtr<ImageDecoder> decoder = createDecoder(); // The image has 2 frames, with disposal method 4 and 5, respectively. - RefPtr<SharedBuffer> data = readFile(webTestsDataDir, "invalid-disposal-method.gif"); + RefPtr<SharedBuffer> data = readFile(decodersTestingDir, "invalid-disposal-method.gif"); ASSERT_TRUE(data.get()); decoder->setData(data.get(), true);
diff --git a/third_party/WebKit/Source/web/tests/data/broken.gif b/third_party/WebKit/Source/platform/image-decoders/testing/broken.gif similarity index 100% rename from third_party/WebKit/Source/web/tests/data/broken.gif rename to third_party/WebKit/Source/platform/image-decoders/testing/broken.gif Binary files differ
diff --git a/third_party/WebKit/Source/web/tests/data/invalid-disposal-method.gif b/third_party/WebKit/Source/platform/image-decoders/testing/invalid-disposal-method.gif similarity index 100% rename from third_party/WebKit/Source/web/tests/data/invalid-disposal-method.gif rename to third_party/WebKit/Source/platform/image-decoders/testing/invalid-disposal-method.gif Binary files differ
diff --git a/third_party/WebKit/Source/web/tests/data/radient-bad-terminator.gif b/third_party/WebKit/Source/platform/image-decoders/testing/radient-bad-terminator.gif similarity index 100% rename from third_party/WebKit/Source/web/tests/data/radient-bad-terminator.gif rename to third_party/WebKit/Source/platform/image-decoders/testing/radient-bad-terminator.gif Binary files differ
diff --git a/third_party/WebKit/Source/web/tests/data/radient.gif b/third_party/WebKit/Source/platform/image-decoders/testing/radient.gif similarity index 100% rename from third_party/WebKit/Source/web/tests/data/radient.gif rename to third_party/WebKit/Source/platform/image-decoders/testing/radient.gif Binary files differ
diff --git a/third_party/WebKit/Source/platform/mediastream/MediaStreamComponent.h b/third_party/WebKit/Source/platform/mediastream/MediaStreamComponent.h index 8a7824c..7594056 100644 --- a/third_party/WebKit/Source/platform/mediastream/MediaStreamComponent.h +++ b/third_party/WebKit/Source/platform/mediastream/MediaStreamComponent.h
@@ -68,7 +68,7 @@ void setEnabled(bool enabled) { m_enabled = enabled; } bool muted() const { return m_muted; } void setMuted(bool muted) { m_muted = muted; } - AudioSourceProvider* audioSourceProvider() { return &m_sourceProvider; } + AudioSourceProvider* getAudioSourceProvider() { return &m_sourceProvider; } void setSourceProvider(WebAudioSourceProvider* provider) { m_sourceProvider.wrap(provider); } ExtraData* extraData() const { return m_extraData.get(); }
diff --git a/third_party/WebKit/Source/platform/network/ResourceRequest.cpp b/third_party/WebKit/Source/platform/network/ResourceRequest.cpp index 23a3ba0..f96b02f 100644 --- a/third_party/WebKit/Source/platform/network/ResourceRequest.cpp +++ b/third_party/WebKit/Source/platform/network/ResourceRequest.cpp
@@ -30,6 +30,7 @@ #include "platform/RuntimeEnabledFeatures.h" #include "platform/weborigin/SecurityOrigin.h" #include "public/platform/Platform.h" +#include "public/platform/WebAddressSpace.h" #include "public/platform/WebURLRequest.h" namespace blink { @@ -373,11 +374,11 @@ return true; } -void ResourceRequest::setExternalRequestStateFromRequestorAddressSpace(WebURLRequest::AddressSpace requestorSpace) +void ResourceRequest::setExternalRequestStateFromRequestorAddressSpace(WebAddressSpace requestorSpace) { - static_assert(WebURLRequest::AddressSpaceLocal < WebURLRequest::AddressSpacePrivate, "Local is inside Private"); - static_assert(WebURLRequest::AddressSpaceLocal < WebURLRequest::AddressSpacePublic, "Local is inside Public"); - static_assert(WebURLRequest::AddressSpacePrivate < WebURLRequest::AddressSpacePublic, "Private is inside Public"); + static_assert(WebAddressSpaceLocal < WebAddressSpacePrivate, "Local is inside Private"); + static_assert(WebAddressSpaceLocal < WebAddressSpacePublic, "Local is inside Public"); + static_assert(WebAddressSpacePrivate < WebAddressSpacePublic, "Private is inside Public"); // TODO(mkwst): This only checks explicit IP addresses. We'll have to move all this up to //net and //content in // order to have any real impact on gateway attacks. That turns out to be a TON of work. https://crbug.com/378566 @@ -386,11 +387,11 @@ return; } - WebURLRequest::AddressSpace targetSpace = WebURLRequest::AddressSpacePublic; + WebAddressSpace targetSpace = WebAddressSpacePublic; if (Platform::current()->isReservedIPAddress(m_url.host())) - targetSpace = WebURLRequest::AddressSpacePrivate; + targetSpace = WebAddressSpacePrivate; if (SecurityOrigin::create(m_url)->isLocalhost()) - targetSpace = WebURLRequest::AddressSpaceLocal; + targetSpace = WebAddressSpaceLocal; m_isExternalRequest = requestorSpace > targetSpace; }
diff --git a/third_party/WebKit/Source/platform/network/ResourceRequest.h b/third_party/WebKit/Source/platform/network/ResourceRequest.h index 3eb22e04..5abfaec 100644 --- a/third_party/WebKit/Source/platform/network/ResourceRequest.h +++ b/third_party/WebKit/Source/platform/network/ResourceRequest.h
@@ -36,6 +36,7 @@ #include "platform/weborigin/KURL.h" #include "platform/weborigin/Referrer.h" #include "platform/weborigin/SecurityOrigin.h" +#include "public/platform/WebAddressSpace.h" #include "public/platform/WebURLRequest.h" #include "wtf/OwnPtr.h" @@ -240,7 +241,7 @@ // https://mikewest.github.io/cors-rfc1918/#external-request bool isExternalRequest() const { return m_isExternalRequest; } - void setExternalRequestStateFromRequestorAddressSpace(WebURLRequest::AddressSpace); + void setExternalRequestStateFromRequestorAddressSpace(WebAddressSpace); InputToLoadPerfMetricReportPolicy inputPerfMetricReportPolicy() const { return m_inputPerfMetricReportPolicy; } void setInputPerfMetricReportPolicy(InputToLoadPerfMetricReportPolicy inputPerfMetricReportPolicy) { m_inputPerfMetricReportPolicy = inputPerfMetricReportPolicy; }
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp index 7c8e82d..441a976 100644 --- a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp +++ b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp
@@ -373,10 +373,12 @@ void ScrollableArea::willRemoveScrollbar(Scrollbar& scrollbar, ScrollbarOrientation orientation) { - if (orientation == VerticalScrollbar) - scrollAnimator().willRemoveVerticalScrollbar(scrollbar); - else - scrollAnimator().willRemoveHorizontalScrollbar(scrollbar); + if (ScrollAnimatorBase* scrollAnimator = existingScrollAnimator()) { + if (orientation == VerticalScrollbar) + scrollAnimator->willRemoveVerticalScrollbar(scrollbar); + else + scrollAnimator->willRemoveHorizontalScrollbar(scrollbar); + } } void ScrollableArea::contentsResized()
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollableArea.h b/third_party/WebKit/Source/platform/scroll/ScrollableArea.h index 527cb60c..f371838 100644 --- a/third_party/WebKit/Source/platform/scroll/ScrollableArea.h +++ b/third_party/WebKit/Source/platform/scroll/ScrollableArea.h
@@ -282,6 +282,8 @@ EAGERLY_FINALIZE(); DECLARE_VIRTUAL_TRACE(); + virtual void clearScrollAnimators(); + protected: ScrollableArea(); @@ -296,8 +298,6 @@ friend class ProgrammaticScrollAnimator; void scrollPositionChanged(const DoublePoint&, ScrollType); - void clearScrollAnimators(); - bool horizontalScrollbarNeedsPaintInvalidation() const { return m_horizontalScrollbarNeedsPaintInvalidation; } bool verticalScrollbarNeedsPaintInvalidation() const { return m_verticalScrollbarNeedsPaintInvalidation; } bool scrollCornerNeedsPaintInvalidation() const { return m_scrollCornerNeedsPaintInvalidation; }
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InjectedScript.cpp b/third_party/WebKit/Source/platform/v8_inspector/InjectedScript.cpp index 27da771..82b6cf1b 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/InjectedScript.cpp +++ b/third_party/WebKit/Source/platform/v8_inspector/InjectedScript.cpp
@@ -188,27 +188,6 @@ *errorString = "Internal error"; } -void InjectedScript::getStepInPositions(ErrorString* errorString, v8::Local<v8::Object> callFrames, const String16& callFrameId, Maybe<Array<protocol::Debugger::Location>>* positions) -{ - v8::HandleScope handles(m_isolate); - V8FunctionCall function(m_client, context(), v8Value(), "getStepInPositions"); - function.appendArgument(callFrames); - function.appendArgument(callFrameId); - OwnPtr<protocol::Value> resultValue = makeCall(function); - if (resultValue) { - if (resultValue->type() == protocol::Value::TypeString) { - resultValue->asString(errorString); - return; - } - if (resultValue->type() == protocol::Value::TypeArray) { - protocol::ErrorSupport errors(errorString); - *positions = Array<protocol::Debugger::Location>::parse(resultValue.get(), &errors); - return; - } - } - *errorString = "Internal error"; -} - void InjectedScript::setVariableValue(ErrorString* errorString, v8::Local<v8::Object> callFrames, const protocol::Maybe<String16>& callFrameIdOpt,
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InjectedScript.h b/third_party/WebKit/Source/platform/v8_inspector/InjectedScript.h index cb1b96c..b5b94877 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/InjectedScript.h +++ b/third_party/WebKit/Source/platform/v8_inspector/InjectedScript.h
@@ -86,7 +86,6 @@ Maybe<bool>* wasThrown, Maybe<protocol::Runtime::ExceptionDetails>*); void restartFrame(ErrorString*, v8::Local<v8::Object> callFrames, const String16& callFrameId); - void getStepInPositions(ErrorString*, v8::Local<v8::Object> callFrames, const String16& callFrameId, Maybe<protocol::Array<protocol::Debugger::Location>>* positions); void setVariableValue(ErrorString*, v8::Local<v8::Object> callFrames, const Maybe<String16>& callFrameIdOpt, const Maybe<String16>& functionObjectIdOpt, int scopeNumber, const String16& variableName, const String16& newValueStr); void getFunctionDetails(ErrorString*, const String16& functionId, OwnPtr<protocol::Debugger::FunctionDetails>* result); void getGeneratorObjectDetails(ErrorString*, const String16& functionId, OwnPtr<protocol::Debugger::GeneratorObjectDetails>* result);
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js index e5bf86a..2713ce6 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js +++ b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js
@@ -906,22 +906,6 @@ }, /** - * @param {!JavaScriptCallFrame} topCallFrame - * @param {string} callFrameId - * @return {*} a stepIn position array ready for protocol JSON or a string error - */ - getStepInPositions: function(topCallFrame, callFrameId) - { - var callFrame = this._callFrameForId(topCallFrame, callFrameId); - if (!callFrame) - return "Could not find call frame with given id"; - var stepInPositionsUnpacked = JSON.parse(callFrame.stepInPositions); - if (typeof stepInPositionsUnpacked !== "object") - return "Step in positions not available"; - return stepInPositionsUnpacked; - }, - - /** * Either callFrameId or functionObjectId must be specified. * @param {!JavaScriptCallFrame} topCallFrame * @param {string|boolean} callFrameId or false
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp index 39c22c28..0db8693 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp +++ b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp
@@ -478,28 +478,6 @@ resume(errorString); } -void V8DebuggerAgentImpl::getStepInPositions(ErrorString* errorString, const String16& callFrameId, Maybe<Array<protocol::Debugger::Location>>* positions) -{ - if (!isPaused() || m_currentCallStack.IsEmpty()) { - *errorString = "Attempt to access callframe when debugger is not on pause"; - return; - } - OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameId); - if (!remoteId) { - *errorString = "Invalid call frame id"; - return; - } - InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.get()); - if (!injectedScript) { - *errorString = "Inspected frame has gone"; - return; - } - - v8::HandleScope scope(m_isolate); - v8::Local<v8::Object> callStack = m_currentCallStack.Get(m_isolate); - injectedScript->getStepInPositions(errorString, callStack, callFrameId, positions); -} - void V8DebuggerAgentImpl::getBacktrace(ErrorString* errorString, OwnPtr<Array<CallFrame>>* callFrames, Maybe<StackTrace>* asyncStackTrace) { if (!assertPaused(errorString))
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.h b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.h index 712aaa4e..3d5bf5c 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.h +++ b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.h
@@ -82,9 +82,6 @@ void continueToLocation(ErrorString*, PassOwnPtr<protocol::Debugger::Location>, const Maybe<bool>& interstateLocationOpt) override; - void getStepInPositions(ErrorString*, - const String16& callFrameId, - Maybe<protocol::Array<protocol::Debugger::Location>>* positions) override; void getBacktrace(ErrorString*, OwnPtr<protocol::Array<protocol::Debugger::CallFrame>>*, Maybe<protocol::Runtime::StackTrace>*) override;
diff --git a/third_party/WebKit/Source/platform/weborigin/Referrer.h b/third_party/WebKit/Source/platform/weborigin/Referrer.h index ad11411..5a303b8 100644 --- a/third_party/WebKit/Source/platform/weborigin/Referrer.h +++ b/third_party/WebKit/Source/platform/weborigin/Referrer.h
@@ -31,6 +31,7 @@ #ifndef Referrer_h #define Referrer_h +#include "platform/weborigin/KURL.h" #include "platform/weborigin/ReferrerPolicy.h" #include "wtf/Allocator.h" #include "wtf/text/WTFString.h" @@ -39,8 +40,12 @@ struct Referrer { DISALLOW_NEW(); - Referrer(const String& referrer, ReferrerPolicy referrerPolicy) : referrer(referrer), referrerPolicy(referrerPolicy) { } + Referrer(const String& referrer, ReferrerPolicy referrerPolicy) : referrer(referrer), referrerPolicy(referrerPolicy) + { + ASSERT(referrer == noReferrer() || KURL(KURL(), referrer).isValid()); + } Referrer() : referrerPolicy(ReferrerPolicyDefault) { } + static String noReferrer() { return String(); } AtomicString referrer; ReferrerPolicy referrerPolicy;
diff --git a/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp b/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp index 8f452d7..c47e789 100644 --- a/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp +++ b/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp
@@ -636,7 +636,7 @@ CheckHeaderFails("host"); CheckHeaderFails("keep-alive"); CheckHeaderFails("origin"); - CheckHeaderFails("referer"); + CheckHeaderFails("referer", "http://example.com/"); CheckHeaderFails("te"); CheckHeaderFails("trailer"); CheckHeaderFails("transfer-encoding");
diff --git a/third_party/WebKit/Source/web/AudioOutputDeviceClientImpl.cpp b/third_party/WebKit/Source/web/AudioOutputDeviceClientImpl.cpp index 398a5f6..a430be4 100644 --- a/third_party/WebKit/Source/web/AudioOutputDeviceClientImpl.cpp +++ b/third_party/WebKit/Source/web/AudioOutputDeviceClientImpl.cpp
@@ -29,7 +29,7 @@ ASSERT(context && context->isDocument()); Document* document = toDocument(context); WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(document->frame()); - webFrame->client()->checkIfAudioSinkExistsAndIsAuthorized(sinkId, WebSecurityOrigin(context->securityOrigin()), callbacks.leakPtr()); + webFrame->client()->checkIfAudioSinkExistsAndIsAuthorized(sinkId, WebSecurityOrigin(context->getSecurityOrigin()), callbacks.leakPtr()); } } // namespace blink
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn index 8a96b93..1df6a315 100644 --- a/third_party/WebKit/Source/web/BUILD.gn +++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -80,10 +80,6 @@ data = [ "tests/data/", "../core/paint/test_data/", - - # Required by some image decoder tests. - "../platform/image-decoders/testing/", - "../../LayoutTests/fast/images/resources/", ] }
diff --git a/third_party/WebKit/Source/web/ChromeClientImpl.cpp b/third_party/WebKit/Source/web/ChromeClientImpl.cpp index b099c8b..e2e82f9 100644 --- a/third_party/WebKit/Source/web/ChromeClientImpl.cpp +++ b/third_party/WebKit/Source/web/ChromeClientImpl.cpp
@@ -722,10 +722,10 @@ void ChromeClientImpl::postAccessibilityNotification(AXObject* obj, AXObjectCache::AXNotification notification) { // Alert assistive technology about the accessibility object notification. - if (!obj || !obj->document()) + if (!obj || !obj->getDocument()) return; - WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(obj->document()->axObjectCacheOwner().frame()); + WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(obj->getDocument()->axObjectCacheOwner().frame()); if (webframe && webframe->client()) webframe->client()->postAccessibilityEvent(WebAXObject(obj), toWebAXEvent(notification)); }
diff --git a/third_party/WebKit/Source/web/ContextFeaturesClientImpl.cpp b/third_party/WebKit/Source/web/ContextFeaturesClientImpl.cpp index f4bf9f0..066139c 100644 --- a/third_party/WebKit/Source/web/ContextFeaturesClientImpl.cpp +++ b/third_party/WebKit/Source/web/ContextFeaturesClientImpl.cpp
@@ -116,7 +116,7 @@ void ContextFeaturesCache::validateAgainst(Document* document) { - String currentDomain = document->securityOrigin()->domain(); + String currentDomain = document->getSecurityOrigin()->domain(); if (currentDomain == m_domain) return; m_domain = currentDomain;
diff --git a/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp b/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp index 4eead30..3dce1b8 100644 --- a/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp +++ b/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
@@ -268,7 +268,7 @@ // It mostly works to convert the security origin to a URL, but // extensions accessing that property will not get the correct value // in that case. See https://crbug.com/534561 - WebSecurityOrigin origin = m_webView->mainFrame()->securityOrigin(); + WebSecurityOrigin origin = m_webView->mainFrame()->getSecurityOrigin(); if (!origin.isNull()) data.pageURL = KURL(ParsedURLString, origin.toString()); } else {
diff --git a/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp b/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp index 2e93627..4ac562a 100644 --- a/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp +++ b/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
@@ -818,7 +818,7 @@ WebMediaSession* webMediaSession = nullptr; if (MediaSession* mediaSession = HTMLMediaElementMediaSession::session(htmlMediaElement)) - webMediaSession = mediaSession->webMediaSession(); + webMediaSession = mediaSession->getWebMediaSession(); HTMLMediaElementEncryptedMedia& encryptedMedia = HTMLMediaElementEncryptedMedia::from(htmlMediaElement); WebString sinkId(HTMLMediaElementAudioOutputDevice::sinkId(htmlMediaElement));
diff --git a/third_party/WebKit/Source/web/IndexedDBClientImpl.cpp b/third_party/WebKit/Source/web/IndexedDBClientImpl.cpp index 9069a510..5a1b900 100644 --- a/third_party/WebKit/Source/web/IndexedDBClientImpl.cpp +++ b/third_party/WebKit/Source/web/IndexedDBClientImpl.cpp
@@ -50,7 +50,7 @@ ASSERT_WITH_SECURITY_IMPLICATION(context->isDocument() || context->isWorkerGlobalScope()); if (context->isDocument()) { - WebSecurityOrigin origin(context->securityOrigin()); + WebSecurityOrigin origin(context->getSecurityOrigin()); Document* document = toDocument(context); WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(document->frame()); // FIXME: webFrame->contentSettingsClient() returns 0 in test_shell and content_shell http://crbug.com/137269
diff --git a/third_party/WebKit/Source/web/NotificationPermissionClientImpl.cpp b/third_party/WebKit/Source/web/NotificationPermissionClientImpl.cpp index 60c4c985..9334e3f 100644 --- a/third_party/WebKit/Source/web/NotificationPermissionClientImpl.cpp +++ b/third_party/WebKit/Source/web/NotificationPermissionClientImpl.cpp
@@ -61,7 +61,7 @@ { ASSERT(scriptState); - ExecutionContext* context = scriptState->executionContext(); + ExecutionContext* context = scriptState->getExecutionContext(); ASSERT(context && context->isDocument()); Document* document = toDocument(context); @@ -70,7 +70,7 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - webFrame->client()->requestNotificationPermission(WebSecurityOrigin(context->securityOrigin()), new WebNotificationPermissionCallbackImpl(resolver, deprecatedCallback)); + webFrame->client()->requestNotificationPermission(WebSecurityOrigin(context->getSecurityOrigin()), new WebNotificationPermissionCallbackImpl(resolver, deprecatedCallback)); return promise; }
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp index f187c2ab..283ccca 100644 --- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp +++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
@@ -230,7 +230,7 @@ void ServiceWorkerGlobalScopeProxy::didInitializeWorkerContext() { - ScriptState::Scope scope(workerGlobalScope()->scriptController()->scriptState()); + ScriptState::Scope scope(workerGlobalScope()->scriptController()->getScriptState()); client().didInitializeWorkerContext(workerGlobalScope()->scriptController()->context()); } @@ -297,7 +297,7 @@ { RespondWithObserver* observer = RespondWithObserver::create(workerGlobalScope(), eventID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext()); Request* request = Request::create(workerGlobalScope(), webRequest); - request->headers()->setGuard(Headers::ImmutableGuard); + request->getHeaders()->setGuard(Headers::ImmutableGuard); FetchEventInit eventInit; eventInit.setCancelable(true); eventInit.setRequest(request);
diff --git a/third_party/WebKit/Source/web/SharedWorkerRepositoryClientImpl.cpp b/third_party/WebKit/Source/web/SharedWorkerRepositoryClientImpl.cpp index 5a50eaa..bbe63674 100644 --- a/third_party/WebKit/Source/web/SharedWorkerRepositoryClientImpl.cpp +++ b/third_party/WebKit/Source/web/SharedWorkerRepositoryClientImpl.cpp
@@ -113,14 +113,14 @@ ASSERT(m_client); // No nested workers (for now) - connect() should only be called from document context. - ASSERT(worker->executionContext()->isDocument()); - Document* document = toDocument(worker->executionContext()); + ASSERT(worker->getExecutionContext()->isDocument()); + Document* document = toDocument(worker->getExecutionContext()); // TODO(estark): this is broken, as it only uses the first header // when multiple might have been sent. Fix by making the // SharedWorkerConnector interface take a map that can contain // multiple headers. - OwnPtr<Vector<CSPHeaderAndType>> headers = worker->executionContext()->contentSecurityPolicy()->headers(); + OwnPtr<Vector<CSPHeaderAndType>> headers = worker->getExecutionContext()->contentSecurityPolicy()->headers(); WebString header; WebContentSecurityPolicyType headerType = WebContentSecurityPolicyTypeReport; @@ -131,8 +131,8 @@ WebWorkerCreationError creationError; String unusedSecureContextError; - bool isSecureContext = worker->executionContext()->isSecureContext(unusedSecureContextError); - OwnPtr<WebSharedWorkerConnector> webWorkerConnector = adoptPtr(m_client->createSharedWorkerConnector(url, name, getId(document), header, headerType, isSecureContext ? WebSharedWorkerCreationContextTypeSecure : WebSharedWorkerCreationContextTypeNonsecure, &creationError)); + bool isSecureContext = worker->getExecutionContext()->isSecureContext(unusedSecureContextError); + OwnPtr<WebSharedWorkerConnector> webWorkerConnector = adoptPtr(m_client->createSharedWorkerConnector(url, name, getId(document), header, headerType, worker->getExecutionContext()->securityContext().addressSpace(), isSecureContext ? WebSharedWorkerCreationContextTypeSecure : WebSharedWorkerCreationContextTypeNonsecure, &creationError)); if (creationError != WebWorkerCreationErrorNone) { if (creationError == WebWorkerCreationErrorURLMismatch) { // Existing worker does not match this url, so return an error back to the caller.
diff --git a/third_party/WebKit/Source/web/SpeechRecognitionClientProxy.cpp b/third_party/WebKit/Source/web/SpeechRecognitionClientProxy.cpp index 8e6d9273..798091f 100644 --- a/third_party/WebKit/Source/web/SpeechRecognitionClientProxy.cpp +++ b/third_party/WebKit/Source/web/SpeechRecognitionClientProxy.cpp
@@ -64,7 +64,7 @@ WebMediaStreamTrack track; if (RuntimeEnabledFeatures::mediaStreamSpeechEnabled() && audioTrack) track.assign(audioTrack->component()); - WebSpeechRecognitionParams params(webSpeechGrammars, lang, continuous, interimResults, maxAlternatives, track, WebSecurityOrigin(recognition->executionContext()->securityOrigin())); + WebSpeechRecognitionParams params(webSpeechGrammars, lang, continuous, interimResults, maxAlternatives, track, WebSecurityOrigin(recognition->getExecutionContext()->getSecurityOrigin())); m_recognizer->start(recognition, params, this); }
diff --git a/third_party/WebKit/Source/web/StorageQuotaClientImpl.cpp b/third_party/WebKit/Source/web/StorageQuotaClientImpl.cpp index bc3ea503..29870a4 100644 --- a/third_party/WebKit/Source/web/StorageQuotaClientImpl.cpp +++ b/third_party/WebKit/Source/web/StorageQuotaClientImpl.cpp
@@ -77,8 +77,8 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (scriptState->executionContext()->isDocument()) { - Document* document = toDocument(scriptState->executionContext()); + if (scriptState->getExecutionContext()->isDocument()) { + Document* document = toDocument(scriptState->getExecutionContext()); WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(document->frame()); StorageQuotaCallbacks* callbacks = StorageQuotaCallbacksImpl::create(resolver); webFrame->client()->requestStorageQuota(WebStorageQuotaTypePersistent, newQuotaInBytes, callbacks);
diff --git a/third_party/WebKit/Source/web/SuspendableScriptExecutor.cpp b/third_party/WebKit/Source/web/SuspendableScriptExecutor.cpp index 5929784b0..451911c 100644 --- a/third_party/WebKit/Source/web/SuspendableScriptExecutor.cpp +++ b/third_party/WebKit/Source/web/SuspendableScriptExecutor.cpp
@@ -50,7 +50,7 @@ void SuspendableScriptExecutor::run() { - ExecutionContext* context = executionContext(); + ExecutionContext* context = getExecutionContext(); ASSERT(context); if (!context->activeDOMObjectsAreSuspended()) { suspendIfNeeded();
diff --git a/third_party/WebKit/Source/web/WebAXObject.cpp b/third_party/WebKit/Source/web/WebAXObject.cpp index ff44de7..ca85de8 100644 --- a/third_party/WebKit/Source/web/WebAXObject.cpp +++ b/third_party/WebKit/Source/web/WebAXObject.cpp
@@ -123,7 +123,7 @@ bool WebAXObject::updateLayoutAndCheckValidity() { if (!isDetached()) { - Document* document = m_private->document(); + Document* document = m_private->getDocument(); if (!document || !document->topDocument().view()) return false; document->view()->updateAllLifecyclePhases(); @@ -631,7 +631,7 @@ if (isDetached()) return WebRect(); - ASSERT(isLayoutClean(m_private->document())); + ASSERT(isLayoutClean(m_private->getDocument())); return pixelSnappedIntRect(m_private->elementRect()); } @@ -923,7 +923,7 @@ if (isDetached()) return; - Node* node = m_private->node(); + Node* node = m_private->getNode(); if (!node) return; @@ -1082,7 +1082,7 @@ if (isDetached()) return WebNode(); - Node* node = m_private->node(); + Node* node = m_private->getNode(); if (!node) return WebNode(); @@ -1094,7 +1094,7 @@ if (isDetached()) return WebDocument(); - Document* document = m_private->document(); + Document* document = m_private->getDocument(); if (!document) return WebDocument(); @@ -1106,11 +1106,11 @@ if (isDetached()) return false; - Document* document = m_private->document(); + Document* document = m_private->getDocument(); if (document) document->updateLayoutTree(); - Node* node = m_private->node(); + Node* node = m_private->getNode(); if (!node) return false; @@ -1122,11 +1122,11 @@ if (isDetached()) return WebString(); - Document* document = m_private->document(); + Document* document = m_private->getDocument(); if (document) document->updateLayoutTree(); - Node* node = m_private->node(); + Node* node = m_private->getNode(); if (!node) return WebString();
diff --git a/third_party/WebKit/Source/web/WebDevToolsFrontendImpl.cpp b/third_party/WebKit/Source/web/WebDevToolsFrontendImpl.cpp index 59d83a5..74edde68 100644 --- a/third_party/WebKit/Source/web/WebDevToolsFrontendImpl.cpp +++ b/third_party/WebKit/Source/web/WebDevToolsFrontendImpl.cpp
@@ -86,7 +86,7 @@ if (m_injectedScriptForOrigin.isEmpty()) return; - String origin = frame->securityOrigin().toString(); + String origin = frame->getSecurityOrigin().toString(); String script = m_injectedScriptForOrigin.get(origin); if (script.isEmpty()) return;
diff --git a/third_party/WebKit/Source/web/WebDocument.cpp b/third_party/WebKit/Source/web/WebDocument.cpp index 80aad5b..e1a0c23 100644 --- a/third_party/WebKit/Source/web/WebDocument.cpp +++ b/third_party/WebKit/Source/web/WebDocument.cpp
@@ -74,11 +74,11 @@ return constUnwrap<Document>()->url(); } -WebSecurityOrigin WebDocument::securityOrigin() const +WebSecurityOrigin WebDocument::getSecurityOrigin() const { if (!constUnwrap<Document>()) return WebSecurityOrigin(); - return WebSecurityOrigin(constUnwrap<Document>()->securityOrigin()); + return WebSecurityOrigin(constUnwrap<Document>()->getSecurityOrigin()); } bool WebDocument::isSecureContext(WebString& errorMessage) const
diff --git a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp index 40e9b35..8b94317e 100644 --- a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp +++ b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp
@@ -244,6 +244,7 @@ settings->setStrictMixedContentChecking(true); settings->setAllowDisplayOfInsecureContent(false); settings->setAllowRunningOfInsecureContent(false); + settings->setDataSaverEnabled(m_workerStartData.dataSaverEnabled); m_mainFrame = toWebLocalFrameImpl(WebLocalFrame::create(WebTreeScopeType::Document, this)); m_webView->setMainFrame(m_mainFrame.get()); m_mainFrame->setDevToolsAgentClient(this); @@ -292,6 +293,7 @@ *m_mainFrame->frame()->document(), m_workerStartData.scriptURL, DenyCrossOriginRequests, + m_mainFrame->frame()->document()->addressSpace(), nullptr, bind(&WebEmbeddedWorkerImpl::onScriptLoaderFinished, this)); // Do nothing here since onScriptLoaderFinished() might have been already @@ -347,7 +349,7 @@ Document* document = m_mainFrame->frame()->document(); // FIXME: this document's origin is pristine and without any extra privileges. (crbug.com/254993) - SecurityOrigin* starterOrigin = document->securityOrigin(); + SecurityOrigin* starterOrigin = document->getSecurityOrigin(); OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); provideContentSettingsClientToWorker(workerClients.get(), m_contentSettingsClient.release());
diff --git a/third_party/WebKit/Source/web/WebFrame.cpp b/third_party/WebKit/Source/web/WebFrame.cpp index 338b461..8f18567 100644 --- a/third_party/WebKit/Source/web/WebFrame.cpp +++ b/third_party/WebKit/Source/web/WebFrame.cpp
@@ -76,8 +76,8 @@ v8::HandleScope handleScope(v8::Isolate::GetCurrent()); HashMap<DOMWrapperWorld*, v8::Local<v8::Object>> globals; - oldFrame->windowProxyManager()->clearForNavigation(); - oldFrame->windowProxyManager()->releaseGlobals(globals); + oldFrame->getWindowProxyManager()->clearForNavigation(); + oldFrame->getWindowProxyManager()->releaseGlobals(globals); // Although the Document in this frame is now unloaded, many resources // associated with the frame itself have not yet been freed yet. @@ -105,7 +105,7 @@ toWebRemoteFrameImpl(frame)->initializeCoreFrame(host, owner, name, uniqueName); } - frame->toImplBase()->frame()->windowProxyManager()->setGlobals(globals); + frame->toImplBase()->frame()->getWindowProxyManager()->setGlobals(globals); m_parent = nullptr; @@ -117,9 +117,9 @@ toImplBase()->frame()->detach(FrameDetachType::Remove); } -WebSecurityOrigin WebFrame::securityOrigin() const +WebSecurityOrigin WebFrame::getSecurityOrigin() const { - return WebSecurityOrigin(toImplBase()->frame()->securityContext()->securityOrigin()); + return WebSecurityOrigin(toImplBase()->frame()->securityContext()->getSecurityOrigin()); }
diff --git a/third_party/WebKit/Source/web/WebGeolocationPermissionRequest.cpp b/third_party/WebKit/Source/web/WebGeolocationPermissionRequest.cpp index c19a1f0..29540c03 100644 --- a/third_party/WebKit/Source/web/WebGeolocationPermissionRequest.cpp +++ b/third_party/WebKit/Source/web/WebGeolocationPermissionRequest.cpp
@@ -43,9 +43,9 @@ m_private.reset(); } -WebSecurityOrigin WebGeolocationPermissionRequest::securityOrigin() const +WebSecurityOrigin WebGeolocationPermissionRequest::getSecurityOrigin() const { - return WebSecurityOrigin(m_private->executionContext()->securityOrigin()); + return WebSecurityOrigin(m_private->getExecutionContext()->getSecurityOrigin()); } void WebGeolocationPermissionRequest::setIsAllowed(bool allowed)
diff --git a/third_party/WebKit/Source/web/WebInputEventConversion.cpp b/third_party/WebKit/Source/web/WebInputEventConversion.cpp index d84c91f..1ae6a4ae 100644 --- a/third_party/WebKit/Source/web/WebInputEventConversion.cpp +++ b/third_party/WebKit/Source/web/WebInputEventConversion.cpp
@@ -509,6 +509,8 @@ movementX = event.movementX(); movementY = event.movementY(); clickCount = event.detail(); + + pointerType = WebPointerProperties::PointerType::Mouse; } // Generate a synthetic WebMouseEvent given a TouchEvent (eg. for emulating a mouse @@ -557,6 +559,8 @@ IntPoint localPoint = convertAbsoluteLocationForLayoutObject(touch->absoluteLocation(), *layoutObject); x = localPoint.x(); y = localPoint.y(); + + pointerType = WebPointerProperties::PointerType::Touch; } WebMouseWheelEventBuilder::WebMouseWheelEventBuilder(const Widget* widget, const LayoutObject* layoutObject, const WheelEvent& event) @@ -626,6 +630,7 @@ static WebTouchPoint toWebTouchPoint(const Touch* touch, const LayoutObject* layoutObject, WebTouchPoint::State state) { WebTouchPoint point; + point.pointerType = WebPointerProperties::PointerType::Touch; point.id = touch->identifier(); point.screenPosition = touch->screenLocation(); point.position = convertAbsoluteLocationForLayoutObjectFloat(touch->absoluteLocation(), *layoutObject);
diff --git a/third_party/WebKit/Source/web/WebKit.cpp b/third_party/WebKit/Source/web/WebKit.cpp index 3fa474fa..4921ba561 100644 --- a/third_party/WebKit/Source/web/WebKit.cpp +++ b/third_party/WebKit/Source/web/WebKit.cpp
@@ -107,10 +107,6 @@ V8Initializer::initializeMainThread(); - OwnPtr<V8IsolateInterruptor> interruptor = adoptPtr(new V8IsolateInterruptor(V8PerIsolateData::mainThreadIsolate())); - ThreadState::current()->addInterruptor(interruptor.release()); - ThreadState::current()->registerTraceDOMWrappers(V8PerIsolateData::mainThreadIsolate(), V8GCController::traceDOMWrappers); - // currentThread is null if we are running on a thread without a message loop. if (WebThread* currentThread = platform->currentThread()) { ASSERT(!s_endOfTaskRunner); @@ -156,11 +152,11 @@ s_webKitInitialized = true; WTF::Partitions::initialize(maxObservedSizeFunction); - ASSERT(platform); - Platform::initialize(platform); - WTF::initialize(adjustAmountOfExternalAllocatedMemory); WTF::initializeMainThread(callOnMainThreadFunction); + + ASSERT(platform); + Platform::initialize(platform); Heap::init(); ThreadState::attachMainThread(); @@ -200,12 +196,6 @@ s_endOfTaskRunner = nullptr; } - // Shutdown V8-related background threads before V8 is ramped down. Note - // that this will wait the thread to stop its operations. - ScriptStreamerThread::shutdown(); - - ThreadState::current()->unregisterTraceDOMWrappers(); - V8Initializer::shutdownMainThread(); modulesInitializer().shutdown(); @@ -229,8 +219,9 @@ ASSERT(!s_endOfTaskRunner); Heap::shutdown(); - WTF::shutdown(); Platform::shutdown(); + + WTF::shutdown(); WebPrerenderingSupport::shutdown(); WTF::Partitions::shutdown(); }
diff --git a/third_party/WebKit/Source/web/WebKitUnitTests.isolate b/third_party/WebKit/Source/web/WebKitUnitTests.isolate index 0c683ac1..e447327 100644 --- a/third_party/WebKit/Source/web/WebKitUnitTests.isolate +++ b/third_party/WebKit/Source/web/WebKitUnitTests.isolate
@@ -36,9 +36,6 @@ '<(PRODUCT_DIR)/content_shell.pak', 'tests/data/', '../core/paint/test_data/', - # Required by some image decoder tests. - '../platform/image-decoders/testing/', - '../../LayoutTests/fast/images/resources/', ], }, }],
diff --git a/third_party/WebKit/Source/web/WebMIDIPermissionRequest.cpp b/third_party/WebKit/Source/web/WebMIDIPermissionRequest.cpp index 504275c..be2b7ff 100644 --- a/third_party/WebKit/Source/web/WebMIDIPermissionRequest.cpp +++ b/third_party/WebKit/Source/web/WebMIDIPermissionRequest.cpp
@@ -56,9 +56,9 @@ return m_private.get() == n.m_private.get(); } -WebSecurityOrigin WebMIDIPermissionRequest::securityOrigin() const +WebSecurityOrigin WebMIDIPermissionRequest::getSecurityOrigin() const { - return WebSecurityOrigin(m_private->securityOrigin()); + return WebSecurityOrigin(m_private->getSecurityOrigin()); } void WebMIDIPermissionRequest::setIsAllowed(bool allowed)
diff --git a/third_party/WebKit/Source/web/WebMediaDevicesRequest.cpp b/third_party/WebKit/Source/web/WebMediaDevicesRequest.cpp index c86e9df7..a20f5815 100644 --- a/third_party/WebKit/Source/web/WebMediaDevicesRequest.cpp +++ b/third_party/WebKit/Source/web/WebMediaDevicesRequest.cpp
@@ -47,10 +47,10 @@ m_private.reset(); } -WebSecurityOrigin WebMediaDevicesRequest::securityOrigin() const +WebSecurityOrigin WebMediaDevicesRequest::getSecurityOrigin() const { - ASSERT(!isNull() && m_private->executionContext()); - return WebSecurityOrigin(m_private->executionContext()->securityOrigin()); + ASSERT(!isNull() && m_private->getExecutionContext()); + return WebSecurityOrigin(m_private->getExecutionContext()->getSecurityOrigin()); } WebDocument WebMediaDevicesRequest::ownerDocument() const
diff --git a/third_party/WebKit/Source/web/WebNode.cpp b/third_party/WebKit/Source/web/WebNode.cpp index e5bb1448..ed7f5ec5 100644 --- a/third_party/WebKit/Source/web/WebNode.cpp +++ b/third_party/WebKit/Source/web/WebNode.cpp
@@ -219,12 +219,12 @@ void WebNode::dispatchEvent(const WebDOMEvent& event) { if (!event.isNull()) - m_private->executionContext()->postSuspendableTask(adoptPtr(new NodeDispatchEventTask(m_private, event))); + m_private->getExecutionContext()->postSuspendableTask(adoptPtr(new NodeDispatchEventTask(m_private, event))); } void WebNode::simulateClick() { - m_private->executionContext()->postSuspendableTask(adoptPtr(new NodeDispatchSimulatedClickTask(m_private))); + m_private->getExecutionContext()->postSuspendableTask(adoptPtr(new NodeDispatchSimulatedClickTask(m_private))); } WebElementCollection WebNode::getElementsByHTMLTagName(const WebString& tag) const
diff --git a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp index d5933128..08a0799 100644 --- a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp +++ b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp
@@ -785,7 +785,7 @@ if (dragStatus == WebDragStatusUnknown) return; - DataTransfer* dataTransfer = event->dataTransfer(); + DataTransfer* dataTransfer = event->getDataTransfer(); WebDragData dragData = dataTransfer->dataObject()->toWebDragData(); WebDragOperationsMask dragOperationMask = static_cast<WebDragOperationsMask>(dataTransfer->sourceOperation()); WebPoint dragScreenLocation(event->screenX(), event->screenY());
diff --git a/third_party/WebKit/Source/web/WebSharedWorkerImpl.cpp b/third_party/WebKit/Source/web/WebSharedWorkerImpl.cpp index 002b61f..0344fbc 100644 --- a/third_party/WebKit/Source/web/WebSharedWorkerImpl.cpp +++ b/third_party/WebKit/Source/web/WebSharedWorkerImpl.cpp
@@ -87,6 +87,7 @@ , m_client(client) , m_pauseWorkerContextOnStart(false) , m_isPausedOnStart(false) + , m_creationAddressSpace(WebAddressSpacePublic) { } @@ -178,6 +179,7 @@ *m_loadingDocument.get(), m_url, DenyCrossOriginRequests, + m_creationAddressSpace, bind(&WebSharedWorkerImpl::didReceiveScriptLoaderResponse, this), bind(&WebSharedWorkerImpl::onScriptLoaderFinished, this)); // Do nothing here since onScriptLoaderFinished() might have been already @@ -292,10 +294,11 @@ workerGlobalScope->dispatchEvent(createConnectEvent(port)); } -void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType policyType) +void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType policyType, WebAddressSpace creationAddressSpace) { m_url = url; m_name = name; + m_creationAddressSpace = creationAddressSpace; initializeLoader(); } @@ -323,11 +326,11 @@ Document* document = m_mainFrame->frame()->document(); // FIXME: this document's origin is pristine and without any extra privileges. (crbug.com/254993) - SecurityOrigin* starterOrigin = document->securityOrigin(); + SecurityOrigin* starterOrigin = document->getSecurityOrigin(); OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::create()); - WebSecurityOrigin webSecurityOrigin(m_loadingDocument->securityOrigin()); + WebSecurityOrigin webSecurityOrigin(m_loadingDocument->getSecurityOrigin()); provideContentSettingsClientToWorker(workerClients.get(), adoptPtr(m_client->createWorkerContentSettingsClientProxy(webSecurityOrigin))); RefPtrWillBeRawPtr<ContentSecurityPolicy> contentSecurityPolicy = m_mainScriptLoader->releaseContentSecurityPolicy(); WorkerThreadStartMode startMode = m_workerInspectorProxy->workerStartMode(document);
diff --git a/third_party/WebKit/Source/web/WebSharedWorkerImpl.h b/third_party/WebKit/Source/web/WebSharedWorkerImpl.h index 2b1cd09..bf9ea663 100644 --- a/third_party/WebKit/Source/web/WebSharedWorkerImpl.h +++ b/third_party/WebKit/Source/web/WebSharedWorkerImpl.h
@@ -37,6 +37,7 @@ #include "core/workers/WorkerLoaderProxy.h" #include "core/workers/WorkerReportingProxy.h" #include "core/workers/WorkerThread.h" +#include "public/platform/WebAddressSpace.h" #include "public/web/WebContentSecurityPolicy.h" #include "public/web/WebDevToolsAgentClient.h" #include "public/web/WebFrameClient.h" @@ -97,7 +98,7 @@ void resumeStartup() override; // WebSharedWorker methods: - void startWorkerContext(const WebURL&, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType) override; + void startWorkerContext(const WebURL&, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType, WebAddressSpace) override; void connect(WebMessagePortChannel*) override; void terminateWorkerContext() override; @@ -158,6 +159,7 @@ WebURL m_url; WebString m_name; + WebAddressSpace m_creationAddressSpace; }; } // namespace blink
diff --git a/third_party/WebKit/Source/web/WebUserMediaRequest.cpp b/third_party/WebKit/Source/web/WebUserMediaRequest.cpp index aa4131e..0b7fa40f 100644 --- a/third_party/WebKit/Source/web/WebUserMediaRequest.cpp +++ b/third_party/WebKit/Source/web/WebUserMediaRequest.cpp
@@ -78,10 +78,10 @@ return m_private->videoConstraints(); } -WebSecurityOrigin WebUserMediaRequest::securityOrigin() const +WebSecurityOrigin WebUserMediaRequest::getSecurityOrigin() const { - ASSERT(!isNull() && m_private->executionContext()); - return WebSecurityOrigin(m_private->executionContext()->securityOrigin()); + ASSERT(!isNull() && m_private->getExecutionContext()); + return WebSecurityOrigin(m_private->getExecutionContext()->getSecurityOrigin()); } WebDocument WebUserMediaRequest::ownerDocument() const
diff --git a/third_party/WebKit/Source/web/WorkerGlobalScopeProxyProviderImpl.cpp b/third_party/WebKit/Source/web/WorkerGlobalScopeProxyProviderImpl.cpp index f351c47e..69cb3084 100644 --- a/third_party/WebKit/Source/web/WorkerGlobalScopeProxyProviderImpl.cpp +++ b/third_party/WebKit/Source/web/WorkerGlobalScopeProxyProviderImpl.cpp
@@ -47,8 +47,8 @@ WorkerGlobalScopeProxy* WorkerGlobalScopeProxyProviderImpl::createWorkerGlobalScopeProxy(Worker* worker) { - if (worker->executionContext()->isDocument()) { - Document* document = toDocument(worker->executionContext()); + if (worker->getExecutionContext()->isDocument()) { + Document* document = toDocument(worker->getExecutionContext()); WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(document->frame()); OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::create());
diff --git a/third_party/WebKit/Source/web/tests/MHTMLTest.cpp b/third_party/WebKit/Source/web/tests/MHTMLTest.cpp index f429275..5bf20f29 100644 --- a/third_party/WebKit/Source/web/tests/MHTMLTest.cpp +++ b/third_party/WebKit/Source/web/tests/MHTMLTest.cpp
@@ -194,7 +194,7 @@ EXPECT_STREQ(kFileURL, frame->domWindow()->location()->href().ascii().data()); - SecurityOrigin* origin = document->securityOrigin(); + SecurityOrigin* origin = document->getSecurityOrigin(); EXPECT_STRNE("localhost", origin->domain().ascii().data()); }
diff --git a/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp b/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp index e178f58e..4a777bf 100644 --- a/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp +++ b/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp
@@ -209,20 +209,9 @@ DefaultSettingOverride, RootLayerScrollsSettingOverride)); - -// Disable these tests on Mac OSX ASAN due to all these tests failing because of -// a user-after-free. crbug.com/582755. -#if OS(MACOSX) && defined(ADDRESS_SANITIZER) -#define MAYBE_TEST_P(test) TEST_P(ParameterizedVisualViewportTest, DISABLED_##test) -#define MAYBE_TEST_F(test) TEST_F(VisualViewportTest, DISABLED_##test) -#else -#define MAYBE_TEST_P(test) TEST_P(ParameterizedVisualViewportTest, test) -#define MAYBE_TEST_F(test) TEST_F(VisualViewportTest, test) -#endif - // Test that resizing the VisualViewport works as expected and that resizing the // WebView resizes the VisualViewport. -MAYBE_TEST_P(TestResize) +TEST_P(ParameterizedVisualViewportTest, TestResize) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -255,7 +244,7 @@ // unchanged from the user's perspective (shrinking the FrameView will clamp // the VisualViewport so we need to counter scroll the FrameView to make it // appear to stay still). This caused bugs like crbug.com/453859. -MAYBE_TEST_P(TestResizeAtFullyScrolledPreservesViewportLocation) +TEST_P(ParameterizedVisualViewportTest, TestResizeAtFullyScrolledPreservesViewportLocation) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(800, 600)); @@ -293,7 +282,7 @@ // Test that the VisualViewport works as expected in case of a scaled // and scrolled viewport - scroll down. -MAYBE_TEST_P(TestResizeAfterVerticalScroll) +TEST_P(ParameterizedVisualViewportTest, TestResizeAfterVerticalScroll) { /* 200 200 @@ -359,7 +348,7 @@ // Test that the VisualViewport works as expected in case if a scaled // and scrolled viewport - scroll right. -MAYBE_TEST_P(TestResizeAfterHorizontalScroll) +TEST_P(ParameterizedVisualViewportTest, TestResizeAfterHorizontalScroll) { /* 200 200 @@ -432,7 +421,7 @@ // Test that the container layer gets sized properly if the WebView is resized // prior to the VisualViewport being attached to the layer tree. -MAYBE_TEST_P(TestWebViewResizedBeforeAttachment) +TEST_P(ParameterizedVisualViewportTest, TestWebViewResizedBeforeAttachment) { initializeWithDesktopSettings(disableAcceleratedCompositing); webViewImpl()->resize(IntSize(320, 240)); @@ -448,7 +437,7 @@ // Make sure that the visibleRect method acurately reflects the scale and scroll location // of the viewport. -MAYBE_TEST_P(TestVisibleRect) +TEST_P(ParameterizedVisualViewportTest, TestVisibleRect) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -499,7 +488,7 @@ // Make sure that the visibleRectInDocument method acurately reflects the scale // and scroll location of the viewport relative to the document. -MAYBE_TEST_P(TestVisibleRectInDocument) +TEST_P(ParameterizedVisualViewportTest, TestVisibleRectInDocument) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(100, 400)); @@ -520,7 +509,7 @@ EXPECT_FLOAT_RECT_EQ(FloatRect(50, 115, 50, 200), visualViewport.visibleRectInDocument()); } -MAYBE_TEST_P(TestFractionalScrollOffsetIsNotOverwritten) +TEST_P(ParameterizedVisualViewportTest, TestFractionalScrollOffsetIsNotOverwritten) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(200, 250)); @@ -537,7 +526,7 @@ // Test that the viewport's scroll offset is always appropriately bounded such that the // visual viewport always stays within the bounds of the main frame. -MAYBE_TEST_P(TestOffsetClamping) +TEST_P(ParameterizedVisualViewportTest, TestOffsetClamping) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -582,7 +571,7 @@ // Test that the viewport can be scrolled around only within the main frame in the presence // of viewport resizes, as would be the case if the on screen keyboard came up. -MAYBE_TEST_P(TestOffsetClampingWithResize) +TEST_P(ParameterizedVisualViewportTest, TestOffsetClampingWithResize) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -634,7 +623,7 @@ // Test that the viewport is scrollable but bounded appropriately within the main frame // when we apply both scaling and resizes. -MAYBE_TEST_P(TestOffsetClampingWithResizeAndScale) +TEST_P(ParameterizedVisualViewportTest, TestOffsetClampingWithResizeAndScale) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -680,7 +669,7 @@ // The main FrameView's size should be set such that its the size of the visual viewport // at minimum scale. If there's no explicit minimum scale set, the FrameView should be // set to the content width and height derived by the aspect ratio. -MAYBE_TEST_P(TestFrameViewSizedToContent) +TEST_P(ParameterizedVisualViewportTest, TestFrameViewSizedToContent) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -699,7 +688,7 @@ // The main FrameView's size should be set such that its the size of the visual viewport // at minimum scale. On Desktop, the minimum scale is set at 1 so make sure the FrameView // is sized to the viewport. -MAYBE_TEST_P(TestFrameViewSizedToMinimumScale) +TEST_P(ParameterizedVisualViewportTest, TestFrameViewSizedToMinimumScale) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -716,7 +705,7 @@ // Test that attaching a new frame view resets the size of the inner viewport scroll // layer. crbug.com/423189. -MAYBE_TEST_P(TestAttachingNewFrameSetsInnerScrollLayerSize) +TEST_P(ParameterizedVisualViewportTest, TestAttachingNewFrameSetsInnerScrollLayerSize) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -750,7 +739,7 @@ // The main FrameView's size should be set such that its the size of the visual viewport // at minimum scale. Test that the FrameView is appropriately sized in the presence // of a viewport <meta> tag. -MAYBE_TEST_P(TestFrameViewSizedToViewportMetaMinimumScale) +TEST_P(ParameterizedVisualViewportTest, TestFrameViewSizedToViewportMetaMinimumScale) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(320, 240)); @@ -766,7 +755,7 @@ } // Test that the visual viewport still gets sized in AutoSize/AutoResize mode. -MAYBE_TEST_P(TestVisualViewportGetsSizeInAutoSizeMode) +TEST_P(ParameterizedVisualViewportTest, TestVisualViewportGetsSizeInAutoSizeMode) { initializeWithDesktopSettings(); @@ -782,7 +771,7 @@ } // Test that the text selection handle's position accounts for the visual viewport. -MAYBE_TEST_P(TestTextSelectionHandles) +TEST_P(ParameterizedVisualViewportTest, TestTextSelectionHandles) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(500, 800)); @@ -816,7 +805,7 @@ } // Test that the HistoryItem for the page stores the visual viewport's offset and scale. -MAYBE_TEST_P(TestSavedToHistoryItem) +TEST_P(ParameterizedVisualViewportTest, TestSavedToHistoryItem) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(200, 300)); @@ -840,7 +829,7 @@ } // Test restoring a HistoryItem properly restores the visual viewport's state. -MAYBE_TEST_P(TestRestoredFromHistoryItem) +TEST_P(ParameterizedVisualViewportTest, TestRestoredFromHistoryItem) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(200, 300)); @@ -864,7 +853,7 @@ // Test restoring a HistoryItem without the visual viewport offset falls back to distributing // the scroll offset between the main frame and the visual viewport. -MAYBE_TEST_F(TestRestoredFromLegacyHistoryItem) +TEST_F(VisualViewportTest, TestRestoredFromLegacyHistoryItem) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(100, 150)); @@ -891,7 +880,7 @@ // Test that navigation to a new page with a different sized main frame doesn't // clobber the history item's main frame scroll offset. crbug.com/371867 -MAYBE_TEST_P(TestNavigateToSmallerFrameViewHistoryItemClobberBug) +TEST_P(ParameterizedVisualViewportTest, TestNavigateToSmallerFrameViewHistoryItemClobberBug) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(400, 400)); @@ -925,7 +914,7 @@ // Test that the coordinates sent into moveRangeSelection are offset by the // visual viewport's location. -MAYBE_TEST_P(DISABLED_TestWebFrameRangeAccountsForVisualViewportScroll) +TEST_P(ParameterizedVisualViewportTest, DISABLED_TestWebFrameRangeAccountsForVisualViewportScroll) { initializeWithDesktopSettings(); webViewImpl()->settings()->setDefaultFontSize(12); @@ -959,7 +948,7 @@ } // Test that the scrollFocusedNodeIntoRect method works with the visual viewport. -MAYBE_TEST_P(DISABLED_TestScrollFocusedNodeIntoRect) +TEST_P(ParameterizedVisualViewportTest, DISABLED_TestScrollFocusedNodeIntoRect) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(500, 300)); @@ -1004,7 +993,7 @@ } // Test that resizing the WebView causes ViewportConstrained objects to relayout. -MAYBE_TEST_P(TestWebViewResizeCausesViewportConstrainedLayout) +TEST_P(ParameterizedVisualViewportTest, TestWebViewResizeCausesViewportConstrainedLayout) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(500, 300)); @@ -1037,7 +1026,7 @@ // Test that the context menu's location is correct in the presence of visual // viewport offset. -MAYBE_TEST_P(TestContextMenuShownInCorrectLocation) +TEST_P(ParameterizedVisualViewportTest, TestContextMenuShownInCorrectLocation) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(200, 300)); @@ -1090,7 +1079,7 @@ } // Test that the client is notified if page scroll events. -MAYBE_TEST_P(TestClientNotifiedOfScrollEvents) +TEST_P(ParameterizedVisualViewportTest, TestClientNotifiedOfScrollEvents) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(200, 300)); @@ -1183,7 +1172,7 @@ // Top controls can make an unscrollable page temporarily scrollable, causing // a scroll clamp when the page is resized. Make sure this bug is fixed. // crbug.com/437620 -MAYBE_TEST_F(TestResizeDoesntChangeScrollOffset) +TEST_F(VisualViewportTest, TestResizeDoesntChangeScrollOffset) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(980, 650)); @@ -1222,7 +1211,7 @@ frameView.contentsSize().height() - newHeight); } -MAYBE_TEST_F(TestTopControlsAdjustment) +TEST_F(VisualViewportTest, TestTopControlsAdjustment) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(500, 450)); @@ -1270,7 +1259,7 @@ frameView.scrollPosition()); } -MAYBE_TEST_F(TestTopControlsAdjustmentWithScale) +TEST_F(VisualViewportTest, TestTopControlsAdjustmentWithScale) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(500, 450)); @@ -1333,7 +1322,7 @@ } -MAYBE_TEST_F(TestTopControlsAdjustmentAndResize) +TEST_F(VisualViewportTest, TestTopControlsAdjustmentAndResize) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(500, 450)); @@ -1377,7 +1366,7 @@ // Tests that a resize due to top controls hiding doesn't incorrectly clamp the // main frame's scroll offset. crbug.com/428193. -MAYBE_TEST_F(TestTopControlHidingResizeDoesntClampMainFrame) +TEST_F(VisualViewportTest, TestTopControlHidingResizeDoesntClampMainFrame) { initializeWithAndroidSettings(); webViewImpl()->setTopControlsHeight(500, false); @@ -1404,7 +1393,7 @@ // Tests that the layout viewport's scroll layer bounds are updated in a compositing // change update. crbug.com/423188. -MAYBE_TEST_P(TestChangingContentSizeAffectsScrollBounds) +TEST_P(ParameterizedVisualViewportTest, TestChangingContentSizeAffectsScrollBounds) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(100, 150)); @@ -1426,7 +1415,7 @@ // Tests that resizing the visual viepwort keeps its bounds within the outer // viewport. -MAYBE_TEST_P(ResizeVisualViewportStaysWithinOuterViewport) +TEST_P(ParameterizedVisualViewportTest, ResizeVisualViewportStaysWithinOuterViewport) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(100, 200)); @@ -1446,7 +1435,7 @@ EXPECT_EQ(0, visualViewport.location().y()); } -MAYBE_TEST_P(ElementBoundsInViewportSpaceAccountsForViewport) +TEST_P(ParameterizedVisualViewportTest, ElementBoundsInViewportSpaceAccountsForViewport) { initializeWithAndroidSettings(); @@ -1478,8 +1467,7 @@ // Test that the various window.scroll and document.body.scroll properties and // methods work unchanged from the pre-virtual viewport mode. -// TODO(crbug.com/590435) -MAYBE_TEST_P(bodyAndWindowScrollPropertiesAccountForViewport) +TEST_P(ParameterizedVisualViewportTest, bodyAndWindowScrollPropertiesAccountForViewport) { initializeWithAndroidSettings(); @@ -1557,7 +1545,7 @@ // Tests that when a new frame is created, it is created with the intended // size (i.e. viewport at minimum scale, 100x200 / 0.5). -MAYBE_TEST_P(TestMainFrameInitializationSizing) +TEST_P(ParameterizedVisualViewportTest, TestMainFrameInitializationSizing) { initializeWithAndroidSettings(); @@ -1578,7 +1566,7 @@ } // Tests that the maximum scroll offset of the viewport can be fractional. -MAYBE_TEST_P(FractionalMaxScrollOffset) +TEST_P(ParameterizedVisualViewportTest, FractionalMaxScrollOffset) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(101, 201)); @@ -1597,7 +1585,7 @@ // Tests that the slow scrolling after an impl scroll on the visual viewport // is continuous. crbug.com/453460 was caused by the impl-path not updating the // ScrollAnimatorBase class. -MAYBE_TEST_P(SlowScrollAfterImplScroll) +TEST_P(ParameterizedVisualViewportTest, SlowScrollAfterImplScroll) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(800, 600)); @@ -1636,7 +1624,7 @@ settings->setAccessibilityEnabled(true); } -MAYBE_TEST_P(AccessibilityHitTestWhileZoomedIn) +TEST_P(ParameterizedVisualViewportTest, AccessibilityHitTestWhileZoomedIn) { initializeWithDesktopSettings(accessibilitySettings); @@ -1665,7 +1653,7 @@ } // Tests that the maximum scroll offset of the viewport can be fractional. -MAYBE_TEST_P(TestCoordinateTransforms) +TEST_P(ParameterizedVisualViewportTest, TestCoordinateTransforms) { initializeWithAndroidSettings(); webViewImpl()->resize(IntSize(800, 600)); @@ -1705,7 +1693,7 @@ // More specifically, it checks that the innerWidth and innerHeight window // properties will trigger a layout which will cause an update to viewport // constraints and a refreshed initial scale. crbug.com/466718 -MAYBE_TEST_P(WindowDimensionsOnLoad) +TEST_P(ParameterizedVisualViewportTest, WindowDimensionsOnLoad) { initializeWithAndroidSettings(); registerMockedHttpURLLoad("window_dimensions.html"); @@ -1721,7 +1709,7 @@ // width for a very wide page. That is, make that innerWidth/Height actually // trigger a layout of the content, and not just an update of the viepwort. // crbug.com/466718 -MAYBE_TEST_P(WindowDimensionsOnLoadWideContent) +TEST_P(ParameterizedVisualViewportTest, WindowDimensionsOnLoadWideContent) { initializeWithAndroidSettings(); registerMockedHttpURLLoad("window_dimensions_wide_div.html"); @@ -1733,7 +1721,7 @@ EXPECT_EQ(std::string("2000x1500"), std::string(output->innerHTML().ascii().data())); } -MAYBE_TEST_P(PinchZoomGestureScrollsVisualViewportOnly) +TEST_P(ParameterizedVisualViewportTest, PinchZoomGestureScrollsVisualViewportOnly) { initializeWithDesktopSettings(); webViewImpl()->resize(IntSize(100, 100));
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp index 972c7f4..5ba5650c 100644 --- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp +++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -7709,7 +7709,7 @@ popupView->setMainFrame(popupRemoteFrame); popupRemoteFrame->setOpener(mainFrame); popupRemoteFrame->setReplicatedOrigin(WebSecurityOrigin::createFromString("http://foo.com")); - EXPECT_FALSE(mainFrame->securityOrigin().canAccess(popupView->mainFrame()->securityOrigin())); + EXPECT_FALSE(mainFrame->getSecurityOrigin().canAccess(popupView->mainFrame()->getSecurityOrigin())); // Do a remote-to-local swap in the popup. FrameTestHelpers::TestWebFrameClient popupLocalClient; @@ -7718,7 +7718,7 @@ // The initial document created during the remote-to-local swap should have // inherited its opener's SecurityOrigin. - EXPECT_TRUE(mainFrame->securityOrigin().canAccess(popupView->mainFrame()->securityOrigin())); + EXPECT_TRUE(mainFrame->getSecurityOrigin().canAccess(popupView->mainFrame()->getSecurityOrigin())); popupView->close(); }
diff --git a/third_party/WebKit/Source/web/webkit_unit_tests.isolate b/third_party/WebKit/Source/web/webkit_unit_tests.isolate index d9d22f0..1b66043 100644 --- a/third_party/WebKit/Source/web/webkit_unit_tests.isolate +++ b/third_party/WebKit/Source/web/webkit_unit_tests.isolate
@@ -7,9 +7,6 @@ '<(PRODUCT_DIR)/content_shell.pak', 'tests/data/', '../core/paint/test_data/', - # Required by some image decoder tests. - '../platform/image-decoders/testing/', - '../../LayoutTests/fast/images/resources/', ], }, 'conditions': [
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/generate_results_dashboard.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/generate_results_dashboard.py index e8a18ca..8de8003 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/generate_results_dashboard.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/generate_results_dashboard.py
@@ -121,7 +121,7 @@ results_directories.sort(reverse=True, key=lambda x: self._filesystem.mtime(x)) current_failing_results_json_file = self._filesystem.join(results_directories[0], 'failing_results.json') input_json_string = self._filesystem.read_text_file(current_failing_results_json_file) - input_json_string = input_json_string[12:-2] # Remove preceeding string ADD_RESULTS( and ); at the end + input_json_string = input_json_string[12:-2] # Remove preceding string ADD_RESULTS( and ); at the end self._current_result_json_dict['tests'] = json.loads(input_json_string)['tests'] results_directories = results_directories[1:] @@ -133,7 +133,7 @@ failing_json_file_path = self._filesystem.join(json_file, 'failing_results.json') full_json_file_path = self._filesystem.join(json_file, 'full_results.json') json_string = self._filesystem.read_text_file(failing_json_file_path) - json_string = json_string[12:-2] # Remove preceeding string ADD_RESULTS( and ); at the end + json_string = json_string[12:-2] # Remove preceding string ADD_RESULTS( and ); at the end self._old_failing_results_list.append(json.loads(json_string)) json_string_full_result = self._filesystem.read_text_file(full_json_file_path) self._old_full_results_list.append(json.loads(json_string_full_result)) @@ -142,7 +142,7 @@ def generate(self): self._initialize() - # There must be atleast one archived result to be processed + # There must be at least one archived result to be processed if self._current_result_json_dict: process_json_data = ProcessJsonData(self._current_result_json_dict, self._old_failing_results_list, self._old_full_results_list) self._final_result = process_json_data.generate_archived_result()
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/layout_tests_mover.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/layout_tests_mover.py index d589925..1cfd7e3 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/layout_tests_mover.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/layout_tests_mover.py
@@ -225,7 +225,7 @@ updates = {} for file_path in references.keys(): root = self._filesystem.dirname(file_path) - # sript-tests/TEMPLATE.html files contain references which are written as if the file + # script-tests/TEMPLATE.html files contain references which are written as if the file # were in the parent directory. This special-casing is ugly, but there are plans to # remove script-tests. if root.endswith('script-tests') and file_path.endswith('TEMPLATE.html'):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/android.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/android.py index 026b70b..aa91d00c 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/android.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/android.py
@@ -688,12 +688,12 @@ def check_configuration(self): # Check that perf is installed if not self._android_commands.file_exists('/system/bin/perf'): - print "Cannot find /system/bin/perf on device %s" % self._android_commands.get_serial() + _log.error("Cannot find /system/bin/perf on device %s" % self._android_commands.get_serial()) return False # Check that the device is a userdebug build (or at least has the necessary libraries). if self._android_commands.run(['shell', 'getprop', 'ro.build.type']).strip() != 'userdebug': - print "Device %s is not flashed with a userdebug build of Android" % self._android_commands.get_serial() + _log.error("Device %s is not flashed with a userdebug build of Android" % self._android_commands.get_serial()) return False # FIXME: Check that the binary actually is perf-able (has stackframe pointers)? @@ -702,7 +702,7 @@ return True def print_setup_instructions(self): - print """ + _log.error(""" perf on android requires a 'userdebug' build of Android, see: http://source.android.com/source/building-devices.html" @@ -718,7 +718,7 @@ Googlers should read: http://goto.google.com/cr-android-perf-howto -""" +""") def attach_to_pid(self, pid): assert(pid) @@ -756,7 +756,7 @@ def profile_after_exit(self): perf_exitcode = self._perf_process.wait() if perf_exitcode != 0: - print "Perf failed (exit code: %i), can't process results." % perf_exitcode + _log.debug("Perf failed (exit code: %i), can't process results." % perf_exitcode) return self._android_commands.pull('/data/perf.data', self._output_path) @@ -772,9 +772,9 @@ perfhost_args = [perfhost_path] + perfhost_report_command + ['--call-graph', 'none'] perf_output = self._host.executive.run_command(perfhost_args) # We could save off the full -g report to a file if users found that useful. - print self._first_ten_lines_of_profile(perf_output) + _log.debug(self._first_ten_lines_of_profile(perf_output)) else: - print """ + _log.debug(""" Failed to find perfhost_linux binary, can't process samples from the device. perfhost_linux can be built from: @@ -786,14 +786,15 @@ http://goto.google.com/cr-android-perf-howto for instructions on installing pre-built copies of perfhost_linux http://crbug.com/165250 discusses making these pre-built binaries externally available. -""" +""") perfhost_display_patch = perfhost_path if perfhost_path else 'perfhost_linux' - print "To view the full profile, run:" - print ' '.join([perfhost_display_patch] + perfhost_report_command) + _log.debug("To view the full profile, run:") + _log.debug(' '.join([perfhost_display_patch] + perfhost_report_command)) class ChromiumAndroidDriver(driver.Driver): + def __init__(self, port, worker_number, pixel_tests, driver_details, android_devices, no_timeout=False): super(ChromiumAndroidDriver, self).__init__(port, worker_number, pixel_tests, no_timeout) self._in_fifo_path = driver_details.device_fifo_directory() + 'stdin.fifo' @@ -844,7 +845,7 @@ saved_kptr_restrict = self._android_commands.run(['shell', 'cat', KPTR_RESTRICT_PATH]).strip() self._android_commands.run(['shell', 'echo', '0', '>', KPTR_RESTRICT_PATH]) - print "Updating kallsyms file (%s) from device" % kallsyms_cache_path + _log.debug("Updating kallsyms file (%s) from device" % kallsyms_cache_path) self._android_commands.pull("/proc/kallsyms", kallsyms_cache_path) self._android_commands.run(['shell', 'echo', saved_kptr_restrict, '>', KPTR_RESTRICT_PATH]) @@ -860,7 +861,7 @@ symfs_path = env['ANDROID_SYMFS'] else: symfs_path = fs.join(self._port.results_directory(), 'symfs') - print "ANDROID_SYMFS not set, using %s" % symfs_path + _log.debug("ANDROID_SYMFS not set, using %s" % symfs_path) # find the installed path, and the path of the symboled built library # FIXME: We should get the install path from the device! @@ -869,7 +870,7 @@ assert(fs.exists(built_library_path)) # FIXME: Ideally we'd check the sha1's first and make a soft-link instead of copying (since we probably never care about windows). - print "Updating symfs libary (%s) from built copy (%s)" % (symfs_library_path, built_library_path) + _log.debug("Updating symfs library (%s) from built copy (%s)" % (symfs_library_path, built_library_path)) fs.maybe_make_directory(fs.dirname(symfs_library_path)) fs.copyfile(built_library_path, symfs_library_path)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py index 33685f43..1bb2831 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
@@ -736,8 +736,8 @@ if not reftest_list: reftest_list = [] for expectation, prefix in (('==', ''), ('!=', '-mismatch')): - for extention in Port._supported_file_extensions: - path = self.expected_filename(test_name, prefix + extention) + for extension in Port._supported_file_extensions: + path = self.expected_filename(test_name, prefix + extension) if self._filesystem.exists(path): reftest_list.append((expectation, path)) return reftest_list
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py index 8684a56..b355e556 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
@@ -69,7 +69,7 @@ try: return run(port, options, args, stderr, stdout).exit_code - # We need to still handle KeyboardInterrupt, atleast for webkitpy unittest cases. + # We need to still handle KeyboardInterrupt, at least for webkitpy unittest cases. except KeyboardInterrupt: return test_run_results.INTERRUPTED_EXIT_STATUS except test_run_results.TestRunException as e: @@ -111,7 +111,7 @@ "Specify multiple times for multiple sets of overrides."), optparse.make_option("--additional-platform-directory", action="append", default=[], help="Additional directory where to look for test " - "baselines (will take precendence over platform baselines). " + "baselines (will take precedence over platform baselines). " "Specify multiple times to add multiple search path entries."), optparse.make_option("--build-directory", help="Path to the directory under which build files are kept (should not include configuration)"), @@ -182,8 +182,10 @@ action="store_false", help="Don't check to see if the build is up-to-date."), optparse.make_option("--child-processes", help="Number of drivers to run in parallel."), - optparse.make_option("--enable-wptserve", dest="enable_wptserve", action="store_true", default=False, - help="Enable running web-plaform-tests using WPTserve instead of Apache."), + optparse.make_option("--enable-wptserve", dest="enable_wptserve", + action="store_true", default=False, + help="Enable running web-platform-tests using " + "WPTserve instead of Apache."), optparse.make_option("--disable-breakpad", action="store_true", help="Don't use breakpad to symbolize unexpected crashes."), optparse.make_option("--driver-logging", action="store_true", @@ -246,7 +248,8 @@ "'only' == only run the SKIP tests, " "'always' == always skip, even if listed on the command line.")), optparse.make_option('--fastest', action='store', type='float', - help='Run the N% fastest tests as well as any tests listed on the commandline'), + help='Run the N% fastest tests as well as any ' + 'tests listed on the command line'), optparse.make_option("--test-list", action="append", help="read list of tests to run from file", metavar="FILE"), optparse.make_option("--time-out-ms", @@ -329,7 +332,7 @@ if options.pixel_test_directories: options.pixel_tests = True - varified_dirs = set() + verified_dirs = set() pixel_test_directories = options.pixel_test_directories for directory in pixel_test_directories: # FIXME: we should support specifying the directories all the ways we support it for additional @@ -339,9 +342,9 @@ if not filesystem.isdir(filesystem.join(port.layout_tests_dir(), directory)): _log.warning("'%s' was passed to --pixel-test-directories, which doesn't seem to be a directory" % str(directory)) else: - varified_dirs.add(directory) + verified_dirs.add(directory) - options.pixel_test_directories = list(varified_dirs) + options.pixel_test_directories = list(verified_dirs) if options.run_singly: options.batch_size = 1
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_unittest.py index 79863db..9be70ec 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_unittest.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_unittest.py
@@ -460,10 +460,6 @@ tests_run = get_tests_run(['LayoutTests/passes/text.html']) self.assertEqual(['passes/text.html'], tests_run) - def test_single_skipped_file(self): - tests_run = get_tests_run(['failures/expected/keybaord.html']) - self.assertEqual([], tests_run) - def test_stderr_is_saved(self): host = MockHost() self.assertTrue(passing_run(host=host)) @@ -594,7 +590,7 @@ self.assertEqual(details.exit_code, test_run_results.EARLY_EXIT_STATUS) - # This checks that passes/text.html is considered SKIPped. + # This checks that passes/text.html is considered Skip-ped. self.assertTrue('"skipped":1' in host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) # This checks that we told the user we bailed out.
diff --git a/third_party/WebKit/public/blink_headers.gypi b/third_party/WebKit/public/blink_headers.gypi index 76a0f30..0033df8f 100644 --- a/third_party/WebKit/public/blink_headers.gypi +++ b/third_party/WebKit/public/blink_headers.gypi
@@ -9,6 +9,7 @@ "platform/FilePathConversion.h", "platform/URLConversion.h", "platform/UserMetricsAction.h", + "platform/WebAddressSpace.h", "platform/WebApiKeyValidator.h", "platform/WebApplicationCacheHost.h", "platform/WebApplicationCacheHostClient.h",
diff --git a/third_party/WebKit/public/platform/WebAddressSpace.h b/third_party/WebKit/public/platform/WebAddressSpace.h new file mode 100644 index 0000000..e5b5965 --- /dev/null +++ b/third_party/WebKit/public/platform/WebAddressSpace.h
@@ -0,0 +1,21 @@ +// Copyright (c) 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 WebAddressSpace_h +#define WebAddressSpace_h + +namespace blink { + +// The ordering is important, as it's used to determine whether preflights are required, +// as per https://mikewest.github.io/cors-rfc1918/#framework +enum WebAddressSpace { + WebAddressSpaceLocal = 0, // loopback, link local + WebAddressSpacePrivate, // Reserved by RFC1918 + WebAddressSpacePublic, // Everything else + WebAddressSpaceLast = WebAddressSpacePublic +}; + +} // namespace blink + +#endif // WebAddressSpace_h
diff --git a/third_party/WebKit/public/platform/WebCredential.h b/third_party/WebKit/public/platform/WebCredential.h index 23c70912..8586302 100644 --- a/third_party/WebKit/public/platform/WebCredential.h +++ b/third_party/WebKit/public/platform/WebCredential.h
@@ -37,7 +37,7 @@ #if INSIDE_BLINK BLINK_PLATFORM_EXPORT static WebCredential create(PlatformCredential*); BLINK_PLATFORM_EXPORT WebCredential& operator=(PlatformCredential*); - BLINK_PLATFORM_EXPORT PlatformCredential* platformCredential() const { return m_platformCredential.get(); } + BLINK_PLATFORM_EXPORT PlatformCredential* getPlatformCredential() const { return m_platformCredential.get(); } #endif protected:
diff --git a/third_party/WebKit/public/platform/WebEncryptedMediaRequest.h b/third_party/WebKit/public/platform/WebEncryptedMediaRequest.h index 16f5a60..f981f1b 100644 --- a/third_party/WebKit/public/platform/WebEncryptedMediaRequest.h +++ b/third_party/WebKit/public/platform/WebEncryptedMediaRequest.h
@@ -25,7 +25,7 @@ BLINK_PLATFORM_EXPORT WebString keySystem() const; BLINK_PLATFORM_EXPORT const WebVector<WebMediaKeySystemConfiguration>& supportedConfigurations() const; - BLINK_PLATFORM_EXPORT WebSecurityOrigin securityOrigin() const; + BLINK_PLATFORM_EXPORT WebSecurityOrigin getSecurityOrigin() const; BLINK_PLATFORM_EXPORT void requestSucceeded(WebContentDecryptionModuleAccess*); BLINK_PLATFORM_EXPORT void requestNotSupported(const WebString& errorMessage);
diff --git a/third_party/WebKit/public/platform/WebMediaPlayer.h b/third_party/WebKit/public/platform/WebMediaPlayer.h index 68a8803..9a5eb43 100644 --- a/third_party/WebKit/public/platform/WebMediaPlayer.h +++ b/third_party/WebKit/public/platform/WebMediaPlayer.h
@@ -173,7 +173,7 @@ unsigned texture, int level, int xoffset, int yoffset, bool premultiplyAlpha, bool flipY) { return false; } - virtual WebAudioSourceProvider* audioSourceProvider() { return nullptr; } + virtual WebAudioSourceProvider* getAudioSourceProvider() { return nullptr; } virtual void setContentDecryptionModule(WebContentDecryptionModule* cdm, WebContentDecryptionModuleResult result) { result.completeWithError(WebContentDecryptionModuleExceptionNotSupportedError, 0, "ERROR"); }
diff --git a/third_party/WebKit/public/platform/WebURLRequest.h b/third_party/WebKit/public/platform/WebURLRequest.h index fafa98c..66d86b95 100644 --- a/third_party/WebKit/public/platform/WebURLRequest.h +++ b/third_party/WebKit/public/platform/WebURLRequest.h
@@ -31,6 +31,7 @@ #ifndef WebURLRequest_h #define WebURLRequest_h +#include "WebAddressSpace.h" #include "WebCommon.h" #include "WebHTTPBody.h" #include "WebReferrerPolicy.h" @@ -64,14 +65,6 @@ PriorityVeryHigh, }; - // The ordering is important, as it's used to determine whether preflights are required, - // as per https://mikewest.github.io/cors-rfc1918/#framework - enum AddressSpace { - AddressSpaceLocal = 0, // loopback, link local - AddressSpacePrivate, // Reserved by RFC1918 - AddressSpacePublic // Everything else - }; - // Corresponds to Fetch's "context": http://fetch.spec.whatwg.org/#concept-request-context enum RequestContext { RequestContextUnspecified = 0,
diff --git a/third_party/WebKit/public/web/WebDocument.h b/third_party/WebKit/public/web/WebDocument.h index 2960c6d9..3db06b6a 100644 --- a/third_party/WebKit/public/web/WebDocument.h +++ b/third_party/WebKit/public/web/WebDocument.h
@@ -74,8 +74,8 @@ void assign(const WebDocument& e) { WebNode::assign(e); } BLINK_EXPORT WebURL url() const; - // Note: Security checks should use the securityOrigin(), not url(). - BLINK_EXPORT WebSecurityOrigin securityOrigin() const; + // Note: Security checks should use the getSecurityOrigin(), not url(). + BLINK_EXPORT WebSecurityOrigin getSecurityOrigin() const; BLINK_EXPORT bool isSecureContext(WebString& errorMessage) const; BLINK_EXPORT WebString encoding() const;
diff --git a/third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h b/third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h index 33f850e..3f54a7d4 100644 --- a/third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h +++ b/third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h
@@ -53,11 +53,13 @@ PauseAfterDownloadMode pauseAfterDownloadMode; WaitForDebuggerMode waitForDebuggerMode; WebSettings::V8CacheOptions v8CacheOptions; + bool dataSaverEnabled; WebEmbeddedWorkerStartData() : pauseAfterDownloadMode(DontPauseAfterDownload) , waitForDebuggerMode(DontWaitForDebugger) , v8CacheOptions(WebSettings::V8CacheOptionsDefault) + , dataSaverEnabled(false) { } };
diff --git a/third_party/WebKit/public/web/WebFrame.h b/third_party/WebKit/public/web/WebFrame.h index 4a1e5c7c..06264de 100644 --- a/third_party/WebKit/public/web/WebFrame.h +++ b/third_party/WebKit/public/web/WebFrame.h
@@ -159,7 +159,7 @@ virtual void setSharedWorkerRepositoryClient(WebSharedWorkerRepositoryClient*) = 0; // The security origin of this frame. - BLINK_EXPORT WebSecurityOrigin securityOrigin() const; + BLINK_EXPORT WebSecurityOrigin getSecurityOrigin() const; // Updates the sandbox flags in the frame's FrameOwner. This is used when // this frame's parent is in another process and it dynamically updates
diff --git a/third_party/WebKit/public/web/WebGeolocationPermissionRequest.h b/third_party/WebKit/public/web/WebGeolocationPermissionRequest.h index c9fe120d6..29d4c970 100644 --- a/third_party/WebKit/public/web/WebGeolocationPermissionRequest.h +++ b/third_party/WebKit/public/web/WebGeolocationPermissionRequest.h
@@ -42,7 +42,7 @@ class WebGeolocationPermissionRequest { public: ~WebGeolocationPermissionRequest() { reset(); } - BLINK_EXPORT WebSecurityOrigin securityOrigin() const; + BLINK_EXPORT WebSecurityOrigin getSecurityOrigin() const; BLINK_EXPORT void setIsAllowed(bool); #if BLINK_IMPLEMENTATION
diff --git a/third_party/WebKit/public/web/WebMediaDevicesRequest.h b/third_party/WebKit/public/web/WebMediaDevicesRequest.h index 469a6997..2b9a39cb 100644 --- a/third_party/WebKit/public/web/WebMediaDevicesRequest.h +++ b/third_party/WebKit/public/web/WebMediaDevicesRequest.h
@@ -55,7 +55,7 @@ BLINK_EXPORT bool equals(const WebMediaDevicesRequest&) const; BLINK_EXPORT void assign(const WebMediaDevicesRequest&); - BLINK_EXPORT WebSecurityOrigin securityOrigin() const; + BLINK_EXPORT WebSecurityOrigin getSecurityOrigin() const; BLINK_EXPORT WebDocument ownerDocument() const; BLINK_EXPORT void requestSucceeded(WebVector<WebMediaDeviceInfo>);
diff --git a/third_party/WebKit/public/web/WebSharedWorker.h b/third_party/WebKit/public/web/WebSharedWorker.h index 8143de2..f4e216d4 100644 --- a/third_party/WebKit/public/web/WebSharedWorker.h +++ b/third_party/WebKit/public/web/WebSharedWorker.h
@@ -31,6 +31,7 @@ #ifndef WebSharedWorker_h #define WebSharedWorker_h +#include "../platform/WebAddressSpace.h" #include "../platform/WebCommon.h" #include "WebContentSecurityPolicy.h" @@ -53,7 +54,8 @@ const WebURL& scriptURL, const WebString& name, const WebString& contentSecurityPolicy, - WebContentSecurityPolicyType) = 0; + WebContentSecurityPolicyType, + WebAddressSpace) = 0; // Sends a connect event to the SharedWorker context. virtual void connect(WebMessagePortChannel*) = 0;
diff --git a/third_party/WebKit/public/web/WebSharedWorkerRepositoryClient.h b/third_party/WebKit/public/web/WebSharedWorkerRepositoryClient.h index 6f76261..745a1e5 100644 --- a/third_party/WebKit/public/web/WebSharedWorkerRepositoryClient.h +++ b/third_party/WebKit/public/web/WebSharedWorkerRepositoryClient.h
@@ -34,6 +34,7 @@ #include "WebSharedWorkerConnector.h" #include "WebSharedWorkerCreationContextType.h" #include "WebSharedWorkerCreationErrors.h" +#include "public/platform/WebAddressSpace.h" namespace blink { @@ -47,7 +48,7 @@ typedef unsigned long long DocumentID; // Creates a new shared worker connector. This may return null. - virtual WebSharedWorkerConnector* createSharedWorkerConnector(const WebURL& url, const WebString& name, DocumentID id, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType, WebSharedWorkerCreationContextType, WebWorkerCreationError* error) { return 0; } + virtual WebSharedWorkerConnector* createSharedWorkerConnector(const WebURL& url, const WebString& name, DocumentID id, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType, WebAddressSpace, WebSharedWorkerCreationContextType, WebWorkerCreationError* error) { return 0; } // Invoked when a document has been detached. DocumentID can be re-used after documentDetached() is invoked. virtual void documentDetached(DocumentID) { }
diff --git a/third_party/WebKit/public/web/WebUserMediaRequest.h b/third_party/WebKit/public/web/WebUserMediaRequest.h index dd9d399..93d7405 100644 --- a/third_party/WebKit/public/web/WebUserMediaRequest.h +++ b/third_party/WebKit/public/web/WebUserMediaRequest.h
@@ -65,7 +65,7 @@ BLINK_EXPORT WebMediaConstraints audioConstraints() const; BLINK_EXPORT WebMediaConstraints videoConstraints() const; - BLINK_EXPORT WebSecurityOrigin securityOrigin() const; + BLINK_EXPORT WebSecurityOrigin getSecurityOrigin() const; BLINK_EXPORT WebDocument ownerDocument() const; BLINK_EXPORT void requestSucceeded(const WebMediaStream&);
diff --git a/third_party/WebKit/public/web/modules/webmidi/WebMIDIPermissionRequest.h b/third_party/WebKit/public/web/modules/webmidi/WebMIDIPermissionRequest.h index 7d69c4ce..3c20dfb 100644 --- a/third_party/WebKit/public/web/modules/webmidi/WebMIDIPermissionRequest.h +++ b/third_party/WebKit/public/web/modules/webmidi/WebMIDIPermissionRequest.h
@@ -56,7 +56,7 @@ reset(); } - BLINK_EXPORT WebSecurityOrigin securityOrigin() const; + BLINK_EXPORT WebSecurityOrigin getSecurityOrigin() const; BLINK_EXPORT void setIsAllowed(bool); BLINK_EXPORT bool equals(const WebMIDIPermissionRequest&) const;
diff --git a/third_party/closure_compiler/compiled_resources2.gyp b/third_party/closure_compiler/compiled_resources2.gyp index 817f782..df46c0cf 100644 --- a/third_party/closure_compiler/compiled_resources2.gyp +++ b/third_party/closure_compiler/compiled_resources2.gyp
@@ -19,6 +19,7 @@ '<(DEPTH)/chrome/browser/resources/history/compiled_resources2.gyp:*', '<(DEPTH)/chrome/browser/resources/md_downloads/compiled_resources2.gyp:*', '<(DEPTH)/chrome/browser/resources/md_history/compiled_resources2.gyp:*', + '<(DEPTH)/chrome/browser/resources/md_user_manager/compiled_resources2.gyp:*', '<(DEPTH)/chrome/browser/resources/settings/compiled_resources2.gyp:*', '<(DEPTH)/chrome/browser/resources/uber/compiled_resources2.gyp:*', '<(DEPTH)/ui/webui/resources/cr_elements/compiled_resources2.gyp:*',
diff --git a/third_party/libexif/BUILD.gn b/third_party/libexif/BUILD.gn deleted file mode 100644 index 43f3274..0000000 --- a/third_party/libexif/BUILD.gn +++ /dev/null
@@ -1,115 +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. - -# Linux should use system libexif - -config("libexif_public_config") { - include_dirs = [ "sources" ] -} - -config("libexif_warnings") { - if (is_clang) { - cflags = [ - "-Wno-enum-conversion", - "-Wno-switch", - "-Wno-format", - - # libexif uses fabs(int) to cast to float. - "-Wno-absolute-value", - ] - } -} - -libexif_sources = [ - "sources/libexif/canon/exif-mnote-data-canon.c", - "sources/libexif/canon/mnote-canon-entry.c", - "sources/libexif/canon/mnote-canon-tag.c", - "sources/libexif/exif-byte-order.c", - "sources/libexif/exif-content.c", - "sources/libexif/exif-data.c", - "sources/libexif/exif-entry.c", - "sources/libexif/exif-format.c", - "sources/libexif/exif-ifd.c", - "sources/libexif/exif-loader.c", - "sources/libexif/exif-log.c", - "sources/libexif/exif-mem.c", - "sources/libexif/exif-mnote-data.c", - "sources/libexif/exif-tag.c", - "sources/libexif/exif-utils.c", - "sources/libexif/fuji/exif-mnote-data-fuji.c", - "sources/libexif/fuji/mnote-fuji-entry.c", - "sources/libexif/fuji/mnote-fuji-tag.c", - "sources/libexif/olympus/exif-mnote-data-olympus.c", - "sources/libexif/olympus/mnote-olympus-entry.c", - "sources/libexif/olympus/mnote-olympus-tag.c", - "sources/libexif/pentax/exif-mnote-data-pentax.c", - "sources/libexif/pentax/mnote-pentax-entry.c", - "sources/libexif/pentax/mnote-pentax-tag.c", -] - -if (!is_linux || is_chromeos) { - loadable_module("libexif") { - if (is_mac) { - # Matches the output from GYP. - output_name = "exif" - } - sources = libexif_sources - - include_dirs = [ "sources" ] - - # TODO(GYP): Additional options for non-Windows platforms. - - if (is_win) { - import("//build/config/win/visual_studio_version.gni") - - if (visual_studio_version == "2013" || visual_studio_version == "2013e") { - defines = [ - # This seems like a hack, but this is what WebKit Win does. - # VS 2015 supports these natively so they cannot be #defines. - "snprintf=_snprintf", - "inline=__inline", - ] - } - - ldflags = [ "/DEF:" + rebase_path("libexif.def") ] - - cflags = [ "/wd4018" ] # Signed/unsigned mismatch in comparison. - - # TODO(GYP): Handle /analyze switch, when it will be used in GN. - } else if (is_linux) { - libs = [ "m" ] - } - - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ - "//build/config/compiler:no_chromium_code", - - # Must be after no_chromium_code for warning flags to be ordered properly. - ":libexif_warnings", - ] - - public_configs = [ ":libexif_public_config" ] - } -} - -if (is_linux) { - # used by libfuzzer fuzzers only atm. - source_set("libexif_fuzzers") { - sources = libexif_sources - - include_dirs = [ "sources" ] - - libs = [ "m" ] - - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ - "//build/config/compiler:no_chromium_code", - - # Must be after no_chromium_code for warning flags to be ordered properly. - ":libexif_warnings", - ] - - public_configs = [ ":libexif_public_config" ] - } -}
diff --git a/third_party/libexif/OWNERS b/third_party/libexif/OWNERS deleted file mode 100644 index e424ab1..0000000 --- a/third_party/libexif/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -thestig@chromium.org -vandebo@chromium.org
diff --git a/third_party/libexif/README.chromium b/third_party/libexif/README.chromium deleted file mode 100644 index 60facdc9..0000000 --- a/third_party/libexif/README.chromium +++ /dev/null
@@ -1,26 +0,0 @@ -Name: libexif -URL: http://libexif.sourceforge.net/ -Version: 0.6.21 -License: LGPL 2.1 -License File: sources/COPYING -Date: 2012-06-04 -Security Critical: yes - -Description: -libexif is a library for parsing, editing, and saving EXIF data. Many maker -notes from Canon, Casio, Epson, Fuji, Nikon, Olympus, Pentax and Sanyo cameras -are also supported. - -Local Modifications: -- Added license header to exif-mem.c. Please refer to chromium.patch. -- config.h and _stdint.h has been modified to build on all platforms. Please - refer to chromium.patch. -- Added BIND_TEXTDOMAIN macro to conditionally bind the text domain to locale - directory. Please refer to chromium.patch. -- Removed ABOUT-NLS, *.m4, *-m4, binary, ChangeLog, config*, contrib, depcomp, - INSTALL, install-sh, Makefile-files, *.sym, *.am, *.in, *.pc.in, *.spec, *.sh - and *.txt files. -- Removed "doc", "po", "NEWS", "mkinstalldirs", "missing", "nls" folders. -- Removed inline from exif_tag_table_count function in exif-tag.c, to build - cleanly with MSVC's non-standard inline rules. -- https://codereview.chromium.org/1585593002
diff --git a/third_party/libexif/README.security b/third_party/libexif/README.security deleted file mode 100644 index d194b904..0000000 --- a/third_party/libexif/README.security +++ /dev/null
@@ -1 +0,0 @@ -This library has NOT been approved for unsandboxed usage. Contact security@chromium.org for any questions.
diff --git a/third_party/libexif/chromium.patch b/third_party/libexif/chromium.patch deleted file mode 100644 index 79e6a77..0000000 --- a/third_party/libexif/chromium.patch +++ /dev/null
@@ -1,571 +0,0 @@ -diff -urN libexif-0.6.21/config.h libexif-0.6.21.modified/config.h ---- libexif-0.6.21/config.h 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/config.h 1969-12-31 16:00:00.000000000 -0800 -@@ -0,0 +1,360 @@ -+#if defined(_WIN32) -+/* config.h. Generated by configure. */ -+/* config.h.in. Generated from configure.ac by autoheader. */ -+ -+/* Define to 1 if translation of program messages to the user's native -+ language is requested. */ -+/* #undef ENABLE_NLS 1 */ -+ -+/* The gettext domain we're using */ -+/* #undef GETTEXT_PACKAGE "libexif-12" */ -+ -+/* Define locale directory. */ -+/* #undef LOCALEDIR "UTF-8" */ -+ -+/* Define to 1 if we want to bind text domain and enable GETTEXT_PACKAGE and -+ * LOCALE_DIR */ -+/* #undef BIND_TEXTDOMAIN 1 */ -+ -+/* Define if the GNU dcgettext() function is already present or preinstalled. -+ */ -+/* #undef HAVE_DCGETTEXT 1 */ -+ -+/* Define to 1 if you have the <dlfcn.h> header file. */ -+#define HAVE_DLFCN_H 1 -+ -+/* Define if the GNU gettext() function is already present or preinstalled. */ -+#define HAVE_GETTEXT 1 -+ -+/* Define if you have the iconv() function. */ -+#define HAVE_ICONV 1 -+ -+/* Define to 1 if you have the <inttypes.h> header file. */ -+#define HAVE_INTTYPES_H 1 -+ -+/* Define to 1 if you have the <memory.h> header file. */ -+#define HAVE_MEMORY_H 1 -+ -+/* Define to 1 if you have the <stdint.h> header file. */ -+/* #undef HAVE_STDINT_H 1 */ -+ -+/* Define to 1 if you have the <stdlib.h> header file. */ -+#define HAVE_STDLIB_H 1 -+ -+/* Define to 1 if you have the <strings.h> header file. */ -+#define HAVE_STRINGS_H 1 -+ -+/* Define to 1 if you have the <string.h> header file. */ -+#define HAVE_STRING_H 1 -+ -+/* Define to 1 if you have the <sys/stat.h> header file. */ -+#define HAVE_SYS_STAT_H 1 -+ -+/* Define to 1 if you have the <sys/types.h> header file. */ -+#define HAVE_SYS_TYPES_H 1 -+ -+/* Define to 1 if you have the <unistd.h> header file. */ -+#define HAVE_UNISTD_H 1 -+ -+/* Define as const if the declaration of iconv() needs const. */ -+#define ICONV_CONST -+ -+/* Name of package */ -+#define PACKAGE "libexif" -+ -+/* Define to the address where bug reports for this package should be sent. */ -+#define PACKAGE_BUGREPORT "libexif-devel@lists.sourceforge.net" -+ -+/* Define to the full name of this package. */ -+#define PACKAGE_NAME "EXIF library" -+ -+/* Define to the full name and version of this package. */ -+#define PACKAGE_STRING "EXIF library 0.6.21" -+ -+/* Define to the one symbol short name of this package. */ -+#define PACKAGE_TARNAME "libexif" -+ -+/* Define to the version of this package. */ -+#define PACKAGE_VERSION "0.6.21" -+ -+/* Define to 1 if you have the ANSI C header files. */ -+#define STDC_HEADERS 1 -+ -+/* Version number of package */ -+#define VERSION "0.6.21" -+ -+#elif !defined(__APPLE__) -+/* config.h. Generated by configure. */ -+/* config.h.in. Generated from configure.ac by autoheader. */ -+ -+/* #define __cplusplus 1 */ -+#define LOCALEDIR "UTF-8" -+ -+/* Define to 1 if translation of program messages to the user's native -+ language is requested. */ -+/* #undef ENABLE_NLS */ -+ -+/* The gettext domain we're using */ -+/* #undef GETTEXT_PACKAGE "libexif-12" */ -+ -+/* Define locale directory. */ -+/* #undef LOCALEDIR "UTF-8" */ -+ -+/* Define to 1 if we want to bind text domain and enable GETTEXT_PACKAGE and -+ * LOCALE_DIR */ -+/* #undef BIND_TEXTDOMAIN 1 */ -+ -+/* Define if the GNU dcgettext() function is already present or preinstalled. -+ */ -+#define HAVE_DCGETTEXT 1 -+ -+/* Define to 1 if you have the <dlfcn.h> header file. */ -+#define HAVE_DLFCN_H 1 -+ -+/* Define if the GNU gettext() function is already present or preinstalled. */ -+#define HAVE_GETTEXT 1 -+ -+/* Define if you have the iconv() function. */ -+#define HAVE_ICONV 1 -+ -+/* Define to 1 if you have the <inttypes.h> header file. */ -+#define HAVE_INTTYPES_H 1 -+ -+/* Define to 1 if you have the <memory.h> header file. */ -+#define HAVE_MEMORY_H 1 -+ -+/* Define to 1 if you have the <stdint.h> header file. */ -+#define HAVE_STDINT_H 1 -+ -+/* Define to 1 if you have the <stdlib.h> header file. */ -+#define HAVE_STDLIB_H 1 -+ -+/* Define to 1 if you have the <strings.h> header file. */ -+#define HAVE_STRINGS_H 1 -+ -+/* Define to 1 if you have the <string.h> header file. */ -+#define HAVE_STRING_H 1 -+ -+/* Define to 1 if you have the <sys/stat.h> header file. */ -+#define HAVE_SYS_STAT_H 1 -+ -+/* Define to 1 if you have the <sys/types.h> header file. */ -+#define HAVE_SYS_TYPES_H 1 -+ -+/* Define to 1 if you have the <unistd.h> header file. */ -+#define HAVE_UNISTD_H 1 -+ -+/* Define as const if the declaration of iconv() needs const. */ -+#define ICONV_CONST -+ -+/* Name of package */ -+#define PACKAGE "libexif" -+ -+/* Define to the address where bug reports for this package should be sent. */ -+#define PACKAGE_BUGREPORT "libexif-devel@lists.sourceforge.net" -+ -+/* Define to the full name of this package. */ -+#define PACKAGE_NAME "EXIF library" -+ -+/* Define to the full name and version of this package. */ -+#define PACKAGE_STRING "EXIF library 0.6.21" -+ -+/* Define to the one symbol short name of this package. */ -+#define PACKAGE_TARNAME "libexif" -+ -+/* Define to the version of this package. */ -+#define PACKAGE_VERSION "0.6.21" -+ -+/* Define to 1 if you have the ANSI C header files. */ -+#define STDC_HEADERS 1 -+ -+/* Version number of package */ -+#define VERSION "0.6.21" -+ -+/* Define to empty if `const' does not conform to ANSI C. */ -+/* #undef const */ -+#else // defined(__APPLE__) -+ -+// We need different definitions for the iPhone from desktop OS X, -+// we get the necessary #define from TargetConditionals.h -+#include <TargetConditionals.h> -+ -+#if TARGET_OS_IPHONE -+ -+/* config.h. Generated from config.h.in by configure. */ -+/* config.h.in. Generated from configure.ac by autoheader. */ -+ -+/* Define to 1 if translation of program messages to the user's native -+ language is requested. */ -+/* #undef ENABLE_NLS */ -+ -+/* The gettext domain we're using */ -+/* #undef GETTEXT_PACKAGE "libexif-12" */ -+ -+/* Define locale directory. */ -+/* #undef LOCALEDIR "UTF-8" */ -+ -+/* Define to 1 if we want to bind text domain and enable GETTEXT_PACKAGE and -+ * LOCALE_DIR */ -+/* #undef BIND_TEXTDOMAIN 1 */ -+ -+/* Define if the GNU dcgettext() function is already present or preinstalled. -+ */ -+/* #undef HAVE_DCGETTEXT */ -+ -+/* Define to 1 if you have the <dlfcn.h> header file. */ -+#define HAVE_DLFCN_H 1 -+ -+/* Define if the GNU gettext() function is already present or preinstalled. */ -+/* #undef HAVE_GETTEXT */ -+ -+/* Define if you have the iconv() function. */ -+/* #undef HAVE_ICONV */ -+ -+/* Define to 1 if you have the <inttypes.h> header file. */ -+#define HAVE_INTTYPES_H 1 -+ -+/* Define to 1 if you have the <memory.h> header file. */ -+#define HAVE_MEMORY_H 1 -+ -+/* Define to 1 if you have the <stdint.h> header file. */ -+#define HAVE_STDINT_H 1 -+ -+/* Define to 1 if you have the <stdlib.h> header file. */ -+#define HAVE_STDLIB_H 1 -+ -+/* Define to 1 if you have the <strings.h> header file. */ -+#define HAVE_STRINGS_H 1 -+ -+/* Define to 1 if you have the <string.h> header file. */ -+#define HAVE_STRING_H 1 -+ -+/* Define to 1 if you have the <sys/stat.h> header file. */ -+#define HAVE_SYS_STAT_H 1 -+ -+/* Define to 1 if you have the <sys/types.h> header file. */ -+#define HAVE_SYS_TYPES_H 1 -+ -+/* Define to 1 if you have the <unistd.h> header file. */ -+#define HAVE_UNISTD_H 1 -+ -+/* Define as const if the declaration of iconv() needs const. */ -+/* #undef ICONV_CONST */ -+ -+/* Name of package */ -+#define PACKAGE "libexif" -+ -+/* Define to the address where bug reports for this package should be sent. */ -+#define PACKAGE_BUGREPORT "libexif-devel@lists.sourceforge.net" -+ -+/* Define to the full name of this package. */ -+#define PACKAGE_NAME "EXIF library" -+ -+/* Define to the full name and version of this package. */ -+#define PACKAGE_STRING "EXIF library 0.6.21" -+ -+/* Define to the one symbol short name of this package. */ -+#define PACKAGE_TARNAME "libexif" -+ -+/* Define to the version of this package. */ -+#define PACKAGE_VERSION "0.6.21" -+ -+/* Define to 1 if you have the ANSI C header files. */ -+#define STDC_HEADERS 1 -+ -+/* Version number of package */ -+#define VERSION "0.6.21" -+ -+/* Define to empty if `const' does not conform to ANSI C. */ -+/* #undef const */ -+#else // !TARGET_OS_IPHONE -+ -+/* config.h. Generated from config.h.in by configure. */ -+/* config.h.in. Generated from configure.ac by autoheader. */ -+ -+/* Define to 1 if translation of program messages to the user's native -+ language is requested. */ -+/* #undef ENABLE_NLS */ -+ -+/* The gettext domain we're using */ -+/* #undef GETTEXT_PACKAGE "libexif-12" */ -+ -+/* Define locale directory. */ -+/* #undef LOCALEDIR "UTF-8" */ -+ -+/* Define to 1 if we want to bind text domain and enable GETTEXT_PACKAGE and -+ * LOCALE_DIR */ -+/* #undef BIND_TEXTDOMAIN 1 */ -+ -+/* Define if the GNU dcgettext() function is already present or preinstalled. -+ */ -+/* #undef HAVE_DCGETTEXT */ -+ -+/* Define to 1 if you have the <dlfcn.h> header file. */ -+#define HAVE_DLFCN_H 1 -+ -+/* Define if the GNU gettext() function is already present or preinstalled. */ -+/* #undef HAVE_GETTEXT */ -+ -+/* Define if you have the iconv() function. */ -+#define HAVE_ICONV 1 -+ -+/* Define to 1 if you have the <inttypes.h> header file. */ -+#define HAVE_INTTYPES_H 1 -+ -+/* Define to 1 if you have the <memory.h> header file. */ -+#define HAVE_MEMORY_H 1 -+ -+/* Define to 1 if you have the <stdint.h> header file. */ -+#define HAVE_STDINT_H 1 -+ -+/* Define to 1 if you have the <stdlib.h> header file. */ -+#define HAVE_STDLIB_H 1 -+ -+/* Define to 1 if you have the <strings.h> header file. */ -+#define HAVE_STRINGS_H 1 -+ -+/* Define to 1 if you have the <string.h> header file. */ -+#define HAVE_STRING_H 1 -+ -+/* Define to 1 if you have the <sys/stat.h> header file. */ -+#define HAVE_SYS_STAT_H 1 -+ -+/* Define to 1 if you have the <sys/types.h> header file. */ -+#define HAVE_SYS_TYPES_H 1 -+ -+/* Define to 1 if you have the <unistd.h> header file. */ -+#define HAVE_UNISTD_H 1 -+ -+/* Define as const if the declaration of iconv() needs const. */ -+#define ICONV_CONST -+ -+/* Name of package */ -+#define PACKAGE "libexif" -+ -+/* Define to the address where bug reports for this package should be sent. */ -+#define PACKAGE_BUGREPORT "libexif-devel@lists.sourceforge.net" -+ -+/* Define to the full name of this package. */ -+#define PACKAGE_NAME "EXIF library" -+ -+/* Define to the full name and version of this package. */ -+#define PACKAGE_STRING "EXIF library 0.6.21" -+ -+/* Define to the one symbol short name of this package. */ -+#define PACKAGE_TARNAME "libexif" -+ -+/* Define to the version of this package. */ -+#define PACKAGE_VERSION "0.6.21" -+ -+/* Define to 1 if you have the ANSI C header files. */ -+#define STDC_HEADERS 1 -+ -+/* Version number of package */ -+#define VERSION "0.6.21" -+ -+/* Define to empty if `const' does not conform to ANSI C. */ -+/* #undef const */ -+#endif // TARGET_OS_IPHONE -+ -+#endif // _WIN32 -diff -urN libexif-0.6.21/libexif/canon/mnote-canon-tag.c libexif-0.6.21.modified/libexif/canon/mnote-canon-tag.c ---- libexif-0.6.21/libexif/canon/mnote-canon-tag.c 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/canon/mnote-canon-tag.c 1969-12-31 16:00:00.000000000 -0800 -@@ -160,7 +160,9 @@ - { - unsigned int i; - -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - for (i = 0; i < sizeof (table) / sizeof (table[0]); i++) - if (table[i].tag == t) return (_(table[i].title)); - return NULL; -@@ -194,7 +196,9 @@ - if (table[i].tag == t) { - if (!table[i].description || !*table[i].description) - return ""; -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - return _(table[i].description); - } - return NULL; -diff -urN libexif-0.6.21/libexif/exif-entry.c libexif-0.6.21.modified/libexif/exif-entry.c ---- libexif-0.6.21/libexif/exif-entry.c 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/exif-entry.c 1969-12-31 16:00:00.000000000 -0800 -@@ -860,7 +860,9 @@ - * - * bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - */ -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - - if (!e || !e->parent || !e->parent->parent || !maxlen) - return val; -diff -urN libexif-0.6.21/libexif/exif-format.c libexif-0.6.21.modified/libexif/exif-format.c ---- libexif-0.6.21/libexif/exif-format.c 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/exif-format.c 1969-12-31 16:00:00.000000000 -0800 -@@ -61,7 +61,9 @@ - * - * bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - */ -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - - for (i = 0; ExifFormatTable[i].name; i++) - if (ExifFormatTable[i].format == format) -diff -urN libexif-0.6.21/libexif/exif-mem.c libexif-0.6.21.modified/libexif/exif-mem.c ---- libexif-0.6.21/libexif/exif-mem.c 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/exif-mem.c 1969-12-31 16:00:00.000000000 -0800 -@@ -1,3 +1,23 @@ -+ /* exif-mem.c -+ * -+ * Copyright (c) 2003 Lutz Mueller <lutz@users.sourceforge.net> -+ * -+ * This library is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2 of the License, or (at your option) any later version. -+ * -+ * This library is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with this library; if not, write to the -+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -+ * Boston, MA 02110-1301 USA. -+ */ -+ - #include <libexif/exif-mem.h> - - #include <stdlib.h> -diff -urN libexif-0.6.21/libexif/exif-tag.c libexif-0.6.21.modified/libexif/exif-tag.c ---- libexif-0.6.21/libexif/exif-tag.c 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/exif-tag.c 1969-12-31 16:00:00.000000000 -0800 -@@ -877,7 +877,7 @@ - * Return the number of entries in the EXIF tag table, including the - * terminating NULL entry. - */ --inline unsigned int -+unsigned int - exif_tag_table_count (void) - { - return sizeof (ExifTagTable) / sizeof (ExifTagTable[0]); -@@ -990,7 +990,9 @@ - * - * bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - */ -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - return _(ExifTagTable[i].title); - } - -@@ -1024,7 +1026,9 @@ - * - * bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - */ -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - return _(ExifTagTable[i].description); - } - -diff -urN libexif-0.6.21/libexif/exif-utils.h libexif-0.6.21.modified/libexif/exif-utils.h ---- libexif-0.6.21/libexif/exif-utils.h 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/exif-utils.h 1969-12-31 16:00:00.000000000 -0800 -@@ -31,6 +31,7 @@ - #include <libexif/exif-format.h> - #include <libexif/_stdint.h> - -+#include "config.h" - - /* If these definitions don't work for you, please let us fix the - * macro generating _stdint.h */ -diff -urN libexif-0.6.21/libexif/fuji/mnote-fuji-tag.c libexif-0.6.21.modified/libexif/fuji/mnote-fuji-tag.c ---- libexif-0.6.21/libexif/fuji/mnote-fuji-tag.c 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/fuji/mnote-fuji-tag.c 1969-12-31 16:00:00.000000000 -0800 -@@ -83,7 +83,9 @@ - { - unsigned int i; - -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - for (i = 0; i < sizeof (table) / sizeof (table[0]); i++) - if (table[i].tag == t) return (_(table[i].title)); - return NULL; -@@ -98,7 +100,9 @@ - if (table[i].tag == t) { - if (!table[i].description || !*table[i].description) - return ""; -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - return _(table[i].description); - } - return NULL; -diff -urN libexif-0.6.21/libexif/olympus/mnote-olympus-tag.c libexif-0.6.21.modified/libexif/olympus/mnote-olympus-tag.c ---- libexif-0.6.21/libexif/olympus/mnote-olympus-tag.c 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/olympus/mnote-olympus-tag.c 1969-12-31 16:00:00.000000000 -0800 -@@ -208,7 +208,9 @@ - { - unsigned int i; - -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - for (i = 0; i < sizeof (table) / sizeof (table[0]); i++) - if (table[i].tag == t) return (_(table[i].title)); - return NULL; -@@ -223,7 +225,9 @@ - if (table[i].tag == t) { - if (!table[i].description || !*table[i].description) - return ""; -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - return _(table[i].description); - } - return NULL; -diff -urN libexif-0.6.21/libexif/pentax/mnote-pentax-tag.c libexif-0.6.21.modified/libexif/pentax/mnote-pentax-tag.c ---- libexif-0.6.21/libexif/pentax/mnote-pentax-tag.c 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/pentax/mnote-pentax-tag.c 1969-12-31 16:00:00.000000000 -0800 -@@ -153,7 +153,9 @@ - { - unsigned int i; - -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - for (i = 0; i < sizeof (table) / sizeof (table[0]); i++) - if (table[i].tag == t) return (_(table[i].title)); - return NULL; -@@ -168,7 +170,9 @@ - if (table[i].tag == t) { - if (!table[i].description || !*table[i].description) - return ""; -+#if defined(BIND_TEXTDOMAIN) - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); -+#endif - return _(table[i].description); - } - return NULL; -diff -urN libexif-0.6.21/libexif/_stdint.h libexif-0.6.21.modified/libexif/_stdint.h ---- libexif-0.6.21/libexif/_stdint.h 1969-12-31 16:00:00.000000000 -0800 -+++ libexif-0.6.21.modified/libexif/_stdint.h 1969-12-31 16:00:00.000000000 -0800 -@@ -1,2 +1,15 @@ - /* This file is generated automatically by configure */ -+#if defined(_WIN32) -+// Define C99 equivalent types. -+typedef signed char int8_t; -+typedef signed short int16_t; -+typedef signed int int32_t; -+typedef signed long long int64_t; -+typedef signed long long ssize_t; -+typedef unsigned char uint8_t; -+typedef unsigned short uint16_t; -+typedef unsigned int uint32_t; -+typedef unsigned long long uint64_t; -+#else - #include <stdint.h> -+#endif
diff --git a/third_party/libexif/libexif.def b/third_party/libexif/libexif.def deleted file mode 100644 index e0238a1e..0000000 --- a/third_party/libexif/libexif.def +++ /dev/null
@@ -1,145 +0,0 @@ -LIBRARY "libexif" -EXPORTS - -exif_array_set_byte_order @1 -exif_byte_order_get_name @2 -exif_content_add_entry @3 -exif_content_dump @4 -exif_content_fix @5 -exif_content_foreach_entry @6 -exif_content_free @7 -exif_content_get_entry @8 -exif_content_get_ifd @9 -exif_content_log @10 -exif_content_new @11 -exif_content_new_mem @12 -exif_content_ref @13 -exif_content_remove_entry @14 -exif_content_unref @15 -exif_convert_utf16_to_utf8 @16 -exif_data_dump @17 -exif_data_fix @18 -exif_data_foreach_content @19 -exif_data_free @20 -exif_data_get_byte_order @21 -exif_data_get_data_type @22 -exif_data_get_log @23 -exif_data_get_mnote_data @24 -exif_data_load_data @25 -exif_data_log @26 -exif_data_new @27 -exif_data_new_from_data @28 -exif_data_new_from_file @29 -exif_data_new_mem @30 -exif_data_option_get_description @31 -exif_data_option_get_name @32 -exif_data_ref @33 -exif_data_save_data @34 -exif_data_set_byte_order @35 -exif_data_set_data_type @36 -exif_data_set_option @37 -exif_data_unref @38 -exif_data_unset_option @39 -exif_entry_dump @40 -exif_entry_fix @41 -exif_entry_free @42 -exif_entry_get_value @43 -exif_entry_initialize @44 -exif_entry_new @45 -exif_entry_new_mem @46 -exif_entry_ref @47 -exif_entry_unref @48 -exif_format_get_name @49 -exif_format_get_size @50 -exif_get_long @51 -exif_get_rational @52 -exif_get_short @53 -exif_get_slong @54 -exif_get_srational @55 -exif_get_sshort @56 -exif_ifd_get_name @57 -exif_loader_get_buf @58 -exif_loader_get_data @59 -exif_loader_log @60 -exif_loader_new @61 -exif_loader_new_mem @62 -exif_loader_ref @63 -exif_loader_reset @64 -exif_loader_unref @65 -exif_loader_write @66 -exif_loader_write_file @67 -exif_log @68 -exif_log_code_get_message @69 -exif_log_code_get_title @70 -exif_log_free @71 -exif_log_new @72 -exif_log_new_mem @73 -exif_log_ref @74 -exif_log_set_func @75 -exif_log_unref @76 -exif_logv @77 -exif_mem_alloc @78 -exif_mem_free @79 -exif_mem_new @80 -exif_mem_new_default @81 -exif_mem_realloc @82 -exif_mem_ref @83 -exif_mem_unref @84 -exif_mnote_data_canon_identify @85 -exif_mnote_data_canon_new @86 -exif_mnote_data_construct @87 -exif_mnote_data_count @88 -exif_mnote_data_fuji_identify @89 -exif_mnote_data_fuji_new @90 -exif_mnote_data_get_description @91 -exif_mnote_data_get_id @92 -exif_mnote_data_get_name @93 -exif_mnote_data_get_title @94 -exif_mnote_data_get_value @95 -exif_mnote_data_load @96 -exif_mnote_data_log @97 -exif_mnote_data_olympus_identify @98 -exif_mnote_data_olympus_new @99 -exif_mnote_data_pentax_identify @100 -exif_mnote_data_pentax_new @101 -exif_mnote_data_ref @102 -exif_mnote_data_save @103 -exif_mnote_data_set_byte_order @104 -exif_mnote_data_set_offset @105 -exif_mnote_data_unref @106 -exif_set_long @107 -exif_set_rational @108 -exif_set_short @109 -exif_set_slong @110 -exif_set_srational @111 -exif_set_sshort @112 -exif_tag_from_name @113 -exif_tag_get_description @114 -exif_tag_get_description_in_ifd @115 -exif_tag_get_name @116 -exif_tag_get_name_in_ifd @117 -exif_tag_get_support_level_in_ifd @118 -exif_tag_get_title @119 -exif_tag_get_title_in_ifd @120 -exif_tag_table_count @121 -exif_tag_table_get_name @122 -exif_tag_table_get_tag @123 -mnote_canon_entry_count_values @124 -mnote_canon_entry_get_value @125 -mnote_canon_tag_get_description @126 -mnote_canon_tag_get_name @127 -mnote_canon_tag_get_name_sub @128 -mnote_canon_tag_get_title @129 -mnote_canon_tag_get_title_sub @130 -mnote_fuji_entry_get_value @131 -mnote_fuji_tag_get_description @132 -mnote_fuji_tag_get_name @133 -mnote_fuji_tag_get_title @134 -mnote_olympus_entry_get_value @135 -mnote_olympus_tag_get_description @136 -mnote_olympus_tag_get_name @137 -mnote_olympus_tag_get_title @138 -mnote_pentax_entry_get_value @139 -mnote_pentax_tag_get_description @140 -mnote_pentax_tag_get_name @141 -mnote_pentax_tag_get_title @142
diff --git a/third_party/libexif/libexif.gyp b/third_party/libexif/libexif.gyp deleted file mode 100644 index 510e6f5..0000000 --- a/third_party/libexif/libexif.gyp +++ /dev/null
@@ -1,133 +0,0 @@ -# Copyright (c) 2012 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -{ - 'variables': { - 'conditions': [ - ['OS == "linux" and chromeos==0', { - 'use_system_libexif%': 1, - }, { # OS != "linux" and chromeos==0 - 'use_system_libexif%': 0, - }], - ], - }, - 'conditions': [ - ['use_system_libexif==0', { - 'targets': [ - { - 'target_name': 'libexif', - 'type': 'loadable_module', - 'sources': [ - 'sources/libexif/exif-byte-order.c', - 'sources/libexif/exif-content.c', - 'sources/libexif/exif-data.c', - 'sources/libexif/exif-entry.c', - 'sources/libexif/exif-format.c', - 'sources/libexif/exif-ifd.c', - 'sources/libexif/exif-loader.c', - 'sources/libexif/exif-log.c', - 'sources/libexif/exif-mem.c', - 'sources/libexif/exif-mnote-data.c', - 'sources/libexif/exif-tag.c', - 'sources/libexif/exif-utils.c', - 'sources/libexif/canon/exif-mnote-data-canon.c', - 'sources/libexif/canon/mnote-canon-entry.c', - 'sources/libexif/canon/mnote-canon-tag.c', - 'sources/libexif/fuji/exif-mnote-data-fuji.c', - 'sources/libexif/fuji/mnote-fuji-entry.c', - 'sources/libexif/fuji/mnote-fuji-tag.c', - 'sources/libexif/olympus/exif-mnote-data-olympus.c', - 'sources/libexif/olympus/mnote-olympus-entry.c', - 'sources/libexif/olympus/mnote-olympus-tag.c', - 'sources/libexif/pentax/exif-mnote-data-pentax.c', - 'sources/libexif/pentax/mnote-pentax-entry.c', - 'sources/libexif/pentax/mnote-pentax-tag.c', - ], - 'include_dirs': [ - 'sources', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'sources', - ], - }, - 'variables': { - 'clang_warning_flags': [ - '-Wno-enum-conversion', - '-Wno-switch', - '-Wno-format', - # libexif uses fabs(int) to cast to float. - '-Wno-absolute-value', - ], - }, - 'conditions': [ - ['os_posix==1 and OS!="mac"', { - 'cflags!': ['-fvisibility=hidden'], - 'libraries': ['-lm'], - }], - ['OS=="mac"', { - 'conditions': [ - ['mac_breakpad==1', { - 'variables': { - 'mac_real_dsym': 1, - }, - }], - ], - 'xcode_settings': { - 'GCC_SYMBOLS_PRIVATE_EXTERN': 'NO', # no -fvisibility=hidden - }, - }], - ['OS=="win"', { - 'product_name': 'libexif', - 'sources': [ - 'libexif.def', - ], - 'conditions': [ - ['MSVS_VERSION < "2015"', { - 'defines': [ - # This seems like a hack, but this is what Safari Win does. - # Luckily it is no longer needed/allowed with VS 2015. - 'snprintf=_snprintf', - ], - }], - ], - 'defines': [ - 'inline=__inline', - ], - 'msvs_disabled_warnings': [ - 4018, # size/unsigned mismatch - 4267, # size_t -> ExifLong truncation on amd64 - ], - # As of VS 2013 Update 3, building this project with /analyze hits - # an internal compiler error on exif-entry.c. This halts the build - # and prevents subsequent analysis. Therefore, /analyze is - # disabled for this project. See this bug for details: - # https://connect.microsoft.com/VisualStudio/feedback/details/1014689/internal-compiler-error - 'msvs_settings': { - 'VCCLCompilerTool': { - 'AdditionalOptions!': [ '/analyze:WX-' ] - }, - }, - }], - ], - }, - ], - }, { # 'use_system_libexif!=0 - 'targets': [ - { - 'target_name': 'libexif', - 'type': 'none', - 'direct_dependent_settings': { - 'cflags': [ - '<!@(<(pkg-config) --cflags libexif)', - ], - 'defines': [ - 'USE_SYSTEM_LIBEXIF', - ], - }, - } - ], - }], - ] -}
diff --git a/third_party/qcms/BUILD.gn b/third_party/qcms/BUILD.gn index cfb042b..9c015d1 100644 --- a/third_party/qcms/BUILD.gn +++ b/third_party/qcms/BUILD.gn
@@ -49,9 +49,11 @@ } } -if (!disable_qcms && (current_cpu == "x86" || current_cpu == "x64")) { +if (!disable_qcms) { executable("qcms_tests") { - defines = [ "SSE2_ENABLE" ] + if (current_cpu == "x86" || current_cpu == "x64") { + defines = [ "SSE2_ENABLE" ] + } sources = [ "src/tests/qcms_test_internal_srgb.c", "src/tests/qcms_test_main.c",
diff --git a/third_party/qcms/README.chromium b/third_party/qcms/README.chromium index feb63dc..17ddb5d 100644 --- a/third_party/qcms/README.chromium +++ b/third_party/qcms/README.chromium
@@ -141,6 +141,8 @@ - https://code.google.com/p/chromium/issues/detail?id=495196 - Add qcms_profile_ntsc_relative_gamut_size api - https://code.google.com/p/chromium/issues/detail?id=582870 + - Fix build issue of qcms_tests for MIPS Linux + - https://code.google.com/p/chromium/issues/detail?id=590227 For the Chromium changes, since the import, in a patch format run: git diff b8456f38 src
diff --git a/third_party/qcms/qcms.gyp b/third_party/qcms/qcms.gyp index 9e19a447..2bade45 100644 --- a/third_party/qcms/qcms.gyp +++ b/third_party/qcms/qcms.gyp
@@ -76,9 +76,6 @@ 'target_name': 'qcms_tests', 'product_name': 'qcms_tests', 'type': 'executable', - 'defines': [ - 'SSE2_ENABLE', - ], 'dependencies': [ 'qcms', ], @@ -89,15 +86,18 @@ ], }], ['target_arch=="ia32" or target_arch=="x64"', { - 'sources': [ - 'src/tests/qcms_test_tetra_clut_rgba.c', - 'src/tests/qcms_test_main.c', - 'src/tests/qcms_test_internal_srgb.c', - 'src/tests/qcms_test_munsell.c', - 'src/tests/qcms_test_ntsc_gamut.c', + 'defines': [ + 'SSE2_ENABLE', ], }], ], + 'sources': [ + 'src/tests/qcms_test_main.c', + 'src/tests/qcms_test_internal_srgb.c', + 'src/tests/qcms_test_munsell.c', + 'src/tests/qcms_test_ntsc_gamut.c', + 'src/tests/qcms_test_tetra_clut_rgba.c', + ], }, ], }],
diff --git a/third_party/qcms/src/tests/qcms_test_internal_srgb.c b/third_party/qcms/src/tests/qcms_test_internal_srgb.c index 055a889..58855a1 100644 --- a/third_party/qcms/src/tests/qcms_test_internal_srgb.c +++ b/third_party/qcms/src/tests/qcms_test_internal_srgb.c
@@ -9,6 +9,7 @@ #include <stdint.h> #include <stdlib.h> +// Colorant matrix for the official sRGB IEC61966-2.1 color (D50) primaries. static s15Fixed16Number sRGB_reference[3][3] = { {0x06fa2 /*0.436066*/, /*0.385147*/ 0x06299, /*0.143066*/ 0x024a0}, {0x038f5 /*0.222488*/, /*0.716873*/ 0x0b785, /*0.060608*/ 0x00f84},
diff --git a/third_party/qcms/src/tests/qcms_test_tetra_clut_rgba.c b/third_party/qcms/src/tests/qcms_test_tetra_clut_rgba.c index e1fc5b9..81b6ee32 100644 --- a/third_party/qcms/src/tests/qcms_test_tetra_clut_rgba.c +++ b/third_party/qcms/src/tests/qcms_test_tetra_clut_rgba.c
@@ -19,11 +19,26 @@ size_t length, qcms_format_type output_format); +#ifdef SSE2_ENABLE extern void qcms_transform_data_tetra_clut_rgba_sse2(qcms_transform *transform, unsigned char *src, unsigned char *dest, size_t length, qcms_format_type output_format); +#else +void qcms_transform_data_tetra_clut_rgba_dummy(qcms_transform *transform, + unsigned char *src, + unsigned char *dest, + size_t length, + qcms_format_type output_format) +{ + (void)(transform); + (void)(src); + (void)(dest); + (void)(length); + (void)(output_format); +} +#endif static float *create_lut(size_t lutSize) { @@ -123,7 +138,11 @@ memcpy(src1, src0, length * pixel_size); #define TRANSFORM_TEST0 qcms_transform_data_tetra_clut_rgba +#ifdef SSE2_ENABLE #define TRANSFORM_TEST1 qcms_transform_data_tetra_clut_rgba_sse2 +#else +#define TRANSFORM_TEST1 qcms_transform_data_tetra_clut_rgba_dummy +#endif TIME(TRANSFORM_TEST0(&transform0, src0, dst0, length, format), &time0); TIME(TRANSFORM_TEST1(&transform1, src1, dst1, length, format), &time1);
diff --git a/tools/android/loading/analyze.py b/tools/android/loading/analyze.py index 17ab7705..4b72ec6 100755 --- a/tools/android/loading/analyze.py +++ b/tools/android/loading/analyze.py
@@ -25,15 +25,14 @@ from pylib import constants import activity_lens -import chrome_setup import content_classification_lens +import controller import device_setup import frame_load_lens import loading_model import loading_trace import model_graph import options -import trace_recorder # TODO(mattcary): logging.info isn't that useful, as the whole (tools) world @@ -109,18 +108,21 @@ Returns: JSON dict of logged information (ie, a dict that describes JSON). """ - device = device_setup.GetFirstDevice() if not OPTIONS.local else None + if OPTIONS.local: + chrome_ctl = controller.LocalChromeController() + else: + chrome_ctl = controller.RemoteChromeController( + device_setup.GetFirstDevice()) + clear_cache = (clear_cache_override if clear_cache_override is not None else OPTIONS.clear_cache) - - with device_setup.DeviceConnection(device) as connection: - additional_metadata = {} - if OPTIONS.local: - additional_metadata = chrome_setup.SetUpEmulationAndReturnMetadata( - connection, OPTIONS.emulate_device, OPTIONS.emulate_network) - trace = trace_recorder.MonitorUrl(connection, url, clear_cache=clear_cache) - trace.metadata.update(additional_metadata) - return trace.ToJsonDict() + chrome_ctl.SetClearCache(clear_cache) + if OPTIONS.emulate_device: + chrome_ctl.SetDeviceEmulation(OPTIONS.emulate_device) + if OPTIONS.emulate_network: + chrome_ctl.SetNetworkEmulation(OPTIONS.emulate_network) + trace = loading_trace.LoadingTrace.FromUrlAndController(url, chrome_ctl) + return trace.ToJsonDict() def _FullFetch(url, json_output, prefetch):
diff --git a/tools/android/loading/controller.py b/tools/android/loading/controller.py index 28b3e97..09c794b 100644 --- a/tools/android/loading/controller.py +++ b/tools/android/loading/controller.py
@@ -10,6 +10,8 @@ """ import contextlib +import datetime +import logging import os import shutil import subprocess @@ -50,14 +52,23 @@ self._metadata = {} self._emulated_device = None self._emulated_network = None + self._clear_cache = False def AddChromeArgument(self, arg): """Add command-line argument to the chrome execution.""" self._chrome_args.append(arg) + def SetClearCache(self, clear_cache=True): + self._clear_cache = clear_cache + @contextlib.contextmanager def Open(self): - """Context that returns a connection/chrome instance.""" + """Context that returns a connection/chrome instance. + + Returns: + DevToolsConnection instance for which monitoring has been set up but not + started. + """ raise NotImplementedError def ChromeMetadata(self): @@ -98,6 +109,11 @@ emulation.SetUpNetworkEmulation(connection, **self._emulated_network) self._metadata.update(self._emulated_network) + self._metadata.update(date=datetime.datetime.utcnow().isoformat(), + seconds_since_epoch=time.time()) + if self._clear_cache: + connection.AddHook(connection.ClearCache) + class RemoteChromeController(ChromeControllerBase): """A controller for an android device, aka remote chrome instance.""" @@ -125,7 +141,7 @@ self._device.KillAll(package_info.package, quiet=True) with device_setup.FlagReplacer( - self._device, command_line_path, self._chrome_flags): + self._device, command_line_path, self._chrome_args): start_intent = intent.Intent( package=package_info.package, activity=package_info.activity, data='about:blank') @@ -190,19 +206,23 @@ binary_filename = OPTIONS.local_binary profile_dir = OPTIONS.local_profile_dir using_temp_profile_dir = profile_dir is None - flags = self._chrome_flags + flags = self._chrome_args if using_temp_profile_dir: profile_dir = tempfile.mkdtemp() - flags = '--user-data-dir=%s' + flags + flags = ['--user-data-dir=%s' % profile_dir] + flags chrome_out = None if OPTIONS.local_noisy else file('/dev/null', 'w') process = subprocess.Popen( [binary_filename] + flags, shell=False, stderr=chrome_out) try: time.sleep(10) - connection = devtools_monitor.DevToolsConnection( - OPTIONS.devtools_hostname, OPTIONS.devtools_port) - self._StartConnection(connection) - yield connection + process_result = process.poll() + if process_result is not None: + logging.error('Unexpected process exit: %s', process_result) + else: + connection = devtools_monitor.DevToolsConnection( + OPTIONS.devtools_hostname, OPTIONS.devtools_port) + self._StartConnection(connection) + yield connection finally: process.kill() if using_temp_profile_dir:
diff --git a/tools/android/loading/devtools_monitor.py b/tools/android/loading/devtools_monitor.py index 110aa79..1ea5d91 100644 --- a/tools/android/loading/devtools_monitor.py +++ b/tools/android/loading/devtools_monitor.py
@@ -20,7 +20,7 @@ from telemetry.internal.backends.chrome_inspector import websocket -DEFAULT_TIMEOUT = 10 # seconds +DEFAULT_TIMEOUT_SECONDS = 10 # seconds class DevToolsConnectionException(Exception): @@ -98,7 +98,6 @@ self._scoped_states = {} self._domains_to_enable = set() self._tearing_down_tracing = False - self._set_up = False self._please_stop = False self._hooks = [] @@ -209,14 +208,23 @@ self.SyncRequest('Network.clearBrowserCache') def AddHook(self, hook): - """Add hook to be run on monitoring setup. + """Add hook to be run on monitoring start. Args: hook: a function. """ self._hooks.append(hook) - def SetUpMonitoring(self): + def MonitorUrl(self, url, timeout_seconds=DEFAULT_TIMEOUT_SECONDS): + """Navigate to url and dispatch monitoring loop. + + Unless you have registered a listener that will call StopMonitoring, this + will run until timeout from chrome. + + Args: + url: (str) a URL to navigate to before starting monitoring loop.\ + timeout_seconds: timeout in seconds for monitoring loop. + """ for domain in self._domains_to_enable: self._ws.RegisterDomain(domain, self._OnDataReceived) if domain != self.TRACING_DOMAIN: @@ -226,28 +234,20 @@ for scoped_state in self._scoped_states: self.SyncRequestNoResponse(scoped_state, self._scoped_states[scoped_state][0]) - for hook in self._hooks: hook() - self._tearing_down_tracing = False - self._set_up = True - def StartMonitoring(self, timeout=DEFAULT_TIMEOUT): - """Starts monitoring. + self.SendAndIgnoreResponse('Page.navigate', {'url': url}) - DevToolsConnection.SetUpMonitoring() has to be called first. - """ - assert self._set_up, 'DevToolsConnection.SetUpMonitoring not called.' - self._Dispatch(timeout=timeout) + self._Dispatch(timeout=timeout_seconds) self._TearDownMonitoring() def StopMonitoring(self): """Stops the monitoring.""" self._please_stop = True - def _Dispatch(self, kind='Monitoring', - timeout=DEFAULT_TIMEOUT): + def _Dispatch(self, timeout, kind='Monitoring'): self._please_stop = False while not self._please_stop: try: @@ -262,7 +262,7 @@ logging.info('Fetching tracing') self.SyncRequestNoResponse(self.TRACING_END_METHOD) self._tearing_down_tracing = True - self._Dispatch(kind='Tracing', timeout=self.TRACING_TIMEOUT) + self._Dispatch(timeout=self.TRACING_TIMEOUT, kind='Tracing') for scoped_state in self._scoped_states: self.SyncRequestNoResponse(scoped_state, self._scoped_states[scoped_state][1])
diff --git a/tools/android/loading/loading_trace.py b/tools/android/loading/loading_trace.py index 344baeb2..50dbc23 100644 --- a/tools/android/loading/loading_trace.py +++ b/tools/android/loading/loading_trace.py
@@ -6,6 +6,7 @@ import json +import devtools_monitor import page_track import request_track import tracing @@ -68,3 +69,28 @@ """Returns an instance from a json file saved by ToJsonFile().""" with open(json_path) as input_file: return cls.FromJsonDict(json.load(input_file)) + + @classmethod + def FromUrlAndController( + cls, url, controller, categories=None, + timeout_seconds=devtools_monitor.DEFAULT_TIMEOUT_SECONDS): + """Create a loading trace by using controller to fetch url. + + Args: + url: (str) url to fetch. + controller: (ChromeControllerBase) controller to manage the connection. + categories: TracingTrack categories to capture. + timeout_seconds: monitoring connection timeout in seconds. + + Returns: + LoadingTrace instance. + """ + with controller.Open() as connection: + page = page_track.PageTrack(connection) + request = request_track.RequestTrack(connection) + trace = tracing.TracingTrack( + connection, + categories=(tracing.DEFAULT_CATEGORIES if categories is None + else categories)) + connection.MonitorUrl(url, timeout_seconds=timeout_seconds) + return cls(url, controller.ChromeMetadata(), page, request, trace)
diff --git a/tools/android/loading/trace_recorder.py b/tools/android/loading/trace_recorder.py index de59b35..7c9e822 100755 --- a/tools/android/loading/trace_recorder.py +++ b/tools/android/loading/trace_recorder.py
@@ -3,7 +3,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -"""Loading trace recorder.""" +"""Loading trace recorder. DEPRECATED!""" import argparse import datetime @@ -32,9 +32,11 @@ def MonitorUrl(connection, url, clear_cache=False, categories=tracing.DEFAULT_CATEGORIES, - timeout=devtools_monitor.DEFAULT_TIMEOUT): + timeout=devtools_monitor.DEFAULT_TIMEOUT_SECONDS): """Monitor a URL via a trace recorder. + DEPRECATED! Use LoadingTrace.FromUrlAndController instead. + Args: connection: A devtools_monitor.DevToolsConnection instance. url: url to navigate to as string.
diff --git a/tools/auto_bisect/bisect_perf_regression.py b/tools/auto_bisect/bisect_perf_regression.py index dc8d199..d1f28c4e 100755 --- a/tools/auto_bisect/bisect_perf_regression.py +++ b/tools/auto_bisect/bisect_perf_regression.py
@@ -2145,6 +2145,23 @@ return (run_results_tot, run_results_reverted) + def PostBisectResults(self, bisect_results): + """Posts bisect results to Perf Dashboard.""" + bisect_utils.OutputAnnotationStepStart('Post Results') + + results = bisect_results_json.Get( + bisect_results, self.opts, self.depot_registry) + data = {'data': results} + request = urllib2.Request(PERF_DASH_RESULTS_URL) + request.add_header('Content-Type', 'application/json') + try: + urllib2.urlopen(request, json.dumps(data)) + except urllib2.URLError as e: + print 'Failed to post bisect results. Error: %s.' % e + bisect_utils.OutputAnnotationStepWarning() + + bisect_utils.OutputAnnotationStepClosed() + def _RunTestWithAnnotations( self, step_text, error_text, head_revision, target_depot, command_to_run, metric, force_build): @@ -2509,24 +2526,6 @@ return os.name in supported -def _PostBisectResults(bisect_results, opts, src_cwd): - """Posts bisect results to Perf Dashboard.""" - bisect_utils.OutputAnnotationStepStart('Post Results') - - results = bisect_results_json.Get( - bisect_results, opts, DepotDirectoryRegistry(src_cwd)) - data = {'data': results} - request = urllib2.Request(PERF_DASH_RESULTS_URL) - request.add_header('Content-Type', 'application/json') - try: - urllib2.urlopen(request, json.dumps(data)) - except urllib2.URLError as e: - print 'Failed to post bisect results. Error: %s.' % e - bisect_utils.OutputAnnotationStepWarning() - - bisect_utils.OutputAnnotationStepClosed() - - def RemoveBuildFiles(build_type): """Removes build files from previous runs.""" out_dir = os.path.join('out', build_type) @@ -2881,7 +2880,7 @@ if results.error: raise RuntimeError(results.error) bisect_test.printer.FormatAndPrintResults(results) - _PostBisectResults(results, opts, os.getcwd()) + bisect_test.PostBisectResults(results) return 0 finally: bisect_test.PerformCleanup()
diff --git a/tools/auto_bisect/bisect_perf_regression_test.py b/tools/auto_bisect/bisect_perf_regression_test.py index 918334b..22ad7c3 100644 --- a/tools/auto_bisect/bisect_perf_regression_test.py +++ b/tools/auto_bisect/bisect_perf_regression_test.py
@@ -370,8 +370,9 @@ 'try_job_id': 1234, }) opts = bisect_perf_regression.BisectOptions.FromDict(options_dict) + bisect_instance = _GetBisectPerformanceMetricsInstance(options_dict) results = _SampleBisecResult(opts) - bisect_perf_regression._PostBisectResults(results, opts, os.getcwd()) + bisect_instance.PostBisectResults(results) call_args = _GetMockCallArg(mock_urlopen, 0) self.assertIsNotNone(call_args)
diff --git a/tools/clang/plugins/CMakeLists.txt b/tools/clang/plugins/CMakeLists.txt index 04de853e..6be8b2eb 100644 --- a/tools/clang/plugins/CMakeLists.txt +++ b/tools/clang/plugins/CMakeLists.txt
@@ -1,7 +1,8 @@ set(plugin_sources ChromeClassTester.cpp FindBadConstructsAction.cpp - FindBadConstructsConsumer.cpp) + FindBadConstructsConsumer.cpp + CheckIPCVisitor.cpp) if(WIN32) # Clang doesn't support loadable modules on Windows. Unfortunately, building
diff --git a/tools/clang/plugins/CheckIPCVisitor.cpp b/tools/clang/plugins/CheckIPCVisitor.cpp new file mode 100644 index 0000000..b123b01 --- /dev/null +++ b/tools/clang/plugins/CheckIPCVisitor.cpp
@@ -0,0 +1,288 @@ +// Copyright (c) 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 "CheckIPCVisitor.h" + +using namespace clang; + +namespace chrome_checker { + +namespace { + +const char kWriteParamBadType[] = + "[chromium-ipc] IPC::WriteParam() is called on blacklisted type '%0'%1."; + +const char kTupleBadType[] = + "[chromium-ipc] IPC tuple references banned type '%0'%1."; + +const char kWriteParamBadSignature[] = + "[chromium-ipc] IPC::WriteParam() is expected to have two arguments."; + +const char kNoteSeeHere[] = + "see here"; + +} // namespace + +CheckIPCVisitor::CheckIPCVisitor(CompilerInstance& compiler) + : compiler_(compiler), context_(nullptr) { + auto& diagnostics = compiler_.getDiagnostics(); + error_write_param_bad_type_ = diagnostics.getCustomDiagID( + DiagnosticsEngine::Error, kWriteParamBadType); + error_tuple_bad_type_ = diagnostics.getCustomDiagID( + DiagnosticsEngine::Error, kTupleBadType); + error_write_param_bad_signature_ = diagnostics.getCustomDiagID( + DiagnosticsEngine::Error, kWriteParamBadSignature); + note_see_here_ = diagnostics.getCustomDiagID( + DiagnosticsEngine::Note, kNoteSeeHere); + + blacklisted_typedefs_ = llvm::StringSet<>({ + "intmax_t", + "uintmax_t", + "intptr_t", + "uintptr_t", + "wint_t", + "size_t", + "rsize_t", + "ssize_t", + "ptrdiff_t", + "dev_t", + "off_t", + "clock_t", + "time_t", + "suseconds_t" + }); +} + +void CheckIPCVisitor::BeginDecl(Decl* decl) { + decl_stack_.push_back(decl); +} + +void CheckIPCVisitor::EndDecl() { + decl_stack_.pop_back(); +} + +void CheckIPCVisitor::VisitTemplateSpecializationType( + TemplateSpecializationType* spec) { + ValidateCheckedTuple(spec); +} + +void CheckIPCVisitor::VisitCallExpr(CallExpr* call_expr) { + ValidateWriteParam(call_expr); +} + +bool CheckIPCVisitor::ValidateWriteParam(const CallExpr* call_expr) { + const FunctionDecl* callee_decl = call_expr->getDirectCallee(); + if (!callee_decl || + callee_decl->getQualifiedNameAsString() != "IPC::WriteParam") { + return true; + } + + return ValidateWriteParamSignature(call_expr) && + ValidateWriteParamArgument(call_expr->getArg(1)); +} + +// Checks that IPC::WriteParam() has expected signature. +bool CheckIPCVisitor::ValidateWriteParamSignature( + const CallExpr* call_expr) { + if (call_expr->getNumArgs() != 2) { + compiler_.getDiagnostics().Report( + call_expr->getExprLoc(), error_write_param_bad_signature_); + return false; + } + return true; +} + +// Checks that IPC::WriteParam() argument type is allowed. +// See CheckType() for specifics. +bool CheckIPCVisitor::ValidateWriteParamArgument(const Expr* arg_expr) { + if (auto* parent_fn_decl = GetParentDecl<FunctionDecl>()) { + auto template_kind = parent_fn_decl->getTemplatedKind(); + if (template_kind != FunctionDecl::TK_NonTemplate && + template_kind != FunctionDecl::TK_FunctionTemplate) { + // Skip all specializations - we don't check WriteParam() on dependent + // types (typedef info gets lost), and we checked all non-dependent uses + // earlier (when we checked the template itself). + return true; + } + } + + QualType arg_type; + + arg_expr = arg_expr->IgnoreImplicit(); + if (auto* cast_expr = dyn_cast<ExplicitCastExpr>(arg_expr)) { + arg_type = cast_expr->getTypeAsWritten(); + } else { + arg_type = arg_expr->getType(); + } + + CheckDetails details; + if (CheckType(arg_type, &details)) { + return true; + } + + ReportCheckError(details, + arg_expr->getExprLoc(), + error_write_param_bad_type_); + + return false; +} + +// Checks that IPC::CheckedTuple<> is specialized with allowed types. +// See CheckType() above for specifics. +bool CheckIPCVisitor::ValidateCheckedTuple( + const TemplateSpecializationType* spec) { + TemplateDecl* decl = spec->getTemplateName().getAsTemplateDecl(); + if (!decl || decl->getQualifiedNameAsString() != "IPC::CheckedTuple") { + return true; + } + + bool valid = true; + for (unsigned i = 0; i != spec->getNumArgs(); ++i) { + const TemplateArgument& arg = spec->getArg(i); + CheckDetails details; + if (CheckTemplateArgument(arg, &details)) { + continue; + } + + valid = false; + + auto* parent_decl = GetParentDecl<Decl>(); + ReportCheckError( + details, + parent_decl ? parent_decl->getLocStart() : SourceLocation(), + error_tuple_bad_type_); + } + + return valid; +} + +template <typename T> +const T* CheckIPCVisitor::GetParentDecl() const { + for (auto i = decl_stack_.rbegin(); i != decl_stack_.rend(); ++i) { + if (auto* parent = dyn_cast_or_null<T>(*i)) { + return parent; + } + } + return nullptr; +} + + +bool CheckIPCVisitor::IsBlacklistedType(QualType type) const { + return context_->hasSameUnqualifiedType(type, context_->LongTy) || + context_->hasSameUnqualifiedType(type, context_->UnsignedLongTy); +} + +bool CheckIPCVisitor::IsBlacklistedTypedef(const TypedefNameDecl* tdef) const { + return blacklisted_typedefs_.find(tdef->getName()) != + blacklisted_typedefs_.end(); +} + +// Checks that integer type is allowed (not blacklisted). +bool CheckIPCVisitor::CheckIntegerType(QualType type, + CheckDetails* details) const { + bool seen_typedef = false; + while (true) { + details->exit_type = type; + + if (auto* tdef = dyn_cast<TypedefType>(type)) { + if (IsBlacklistedTypedef(tdef->getDecl())) { + return false; + } + details->typedefs.push_back(tdef); + seen_typedef = true; + } + + QualType desugared_type = + type->getLocallyUnqualifiedSingleStepDesugaredType(); + if (desugared_type == type) { + break; + } + + type = desugared_type; + } + + return seen_typedef || !IsBlacklistedType(type); +} + +// Checks that |type| is allowed (not blacklisted), recursively visiting +// template specializations. +bool CheckIPCVisitor::CheckType(QualType type, CheckDetails* details) const { + if (type->isReferenceType()) { + type = type->getPointeeType(); + } + type = type.getLocalUnqualifiedType(); + + if (details->entry_type.isNull()) { + details->entry_type = type; + } + + if (type->isIntegerType()) { + return CheckIntegerType(type, details); + } + + while (true) { + if (auto* spec = dyn_cast<TemplateSpecializationType>(type)) { + for (const TemplateArgument& arg: *spec) { + if (!CheckTemplateArgument(arg, details)) { + return false; + } + } + return true; + } + + if (auto* record = dyn_cast<RecordType>(type)) { + if (auto* spec = dyn_cast<ClassTemplateSpecializationDecl>( + record->getDecl())) { + const TemplateArgumentList& args = spec->getTemplateArgs(); + for (unsigned i = 0; i != args.size(); ++i) { + if (!CheckTemplateArgument(args[i], details)) { + return false; + } + } + } + return true; + } + + if (auto* tdef = dyn_cast<TypedefType>(type)) { + details->typedefs.push_back(tdef); + } + + QualType desugared_type = + type->getLocallyUnqualifiedSingleStepDesugaredType(); + if (desugared_type == type) { + break; + } + + type = desugared_type; + } + + return true; +} + +bool CheckIPCVisitor::CheckTemplateArgument(const TemplateArgument& arg, + CheckDetails* details) const { + return arg.getKind() != TemplateArgument::Type || + CheckType(arg.getAsType(), details); +} + +void CheckIPCVisitor::ReportCheckError(const CheckDetails& details, + SourceLocation loc, + unsigned error) { + DiagnosticsEngine& diagnostics = compiler_.getDiagnostics(); + + std::string entry_type = details.entry_type.getAsString(); + std::string exit_type = details.exit_type.getAsString(); + + std::string via; + if (entry_type != exit_type) { + via = " via '" + entry_type + "'"; + } + diagnostics.Report(loc, error) << exit_type << via; + + for (const TypedefType* tdef: details.typedefs) { + diagnostics.Report(tdef->getDecl()->getLocation(), note_see_here_); + } +} + +} // namespace chrome_checker
diff --git a/tools/clang/plugins/CheckIPCVisitor.h b/tools/clang/plugins/CheckIPCVisitor.h new file mode 100644 index 0000000..1ba488e --- /dev/null +++ b/tools/clang/plugins/CheckIPCVisitor.h
@@ -0,0 +1,101 @@ +// Copyright (c) 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. + +// This check ensures that 32/64-bit unstable types are not used in IPC. +// +// A type (or typedef) is unstable if it changes size between 32/ 64-bit +// platforms. However, it's impossible to accurately identify unstable +// typedefs, because their definitions rely on the preprocessor. For +// example uintptr_t is either unsigned int or unsigned long. +// +// So we're not trying to be accurate, and just blacklisting some types +// that are known to be unstable: +// 1. Types: long / unsigned long (but not typedefs to) +// 2. Typedefs: intmax_t, uintmax_t, intptr_t, uintptr_t, wint_t, +// size_t, rsize_t, ssize_t, ptrdiff_t, dev_t, off_t, clock_t, +// time_t, suseconds_t (including typedefs to) +// +// Additionally, templates referencing blacklisted types (e.g. vector<long>) +// are also blacklisted. +// +// Blacklisted types are checked in: +// 1. IPC::WriteParam() calls +// 2. IPC::CheckedTuple<> specializations +// + +#ifndef TOOLS_CLANG_PLUGINS_CHECKIPC_VISITOR_H_ +#define TOOLS_CLANG_PLUGINS_CHECKIPC_VISITOR_H_ + +#include <vector> + +#include "clang/AST/AST.h" +#include "clang/AST/ASTConsumer.h" +#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/Frontend/CompilerInstance.h" +#include "llvm/ADT/StringSet.h" + +namespace chrome_checker { + +class CheckIPCVisitor { + public: + explicit CheckIPCVisitor(clang::CompilerInstance& compiler); + + void set_context(clang::ASTContext* context) { context_ = context; } + + bool should_visit_template_instantiations() const { return true; } + + void BeginDecl(clang::Decl* decl); + void EndDecl(); + void VisitTemplateSpecializationType( + clang::TemplateSpecializationType* spec); + void VisitCallExpr(clang::CallExpr* call_expr); + + private: + // ValidateXXX functions return false if validation failed and diagnostic + // was reported. They return true otherwise (not applicable / validation + // succeeded). + + bool ValidateWriteParam(const clang::CallExpr* call_expr); + bool ValidateWriteParamSignature(const clang::CallExpr* call_expr); + bool ValidateWriteParamArgument(const clang::Expr* arg_expr); + bool ValidateCheckedTuple( + const clang::TemplateSpecializationType* spec); + + template <typename T> + const T* GetParentDecl() const; + + bool IsBlacklistedType(clang::QualType type) const; + bool IsBlacklistedTypedef(const clang::TypedefNameDecl* tdef) const; + + struct CheckDetails { + clang::QualType entry_type; + clang::QualType exit_type; + llvm::SmallVector<const clang::TypedefType*, 5> typedefs; + }; + + bool CheckType(clang::QualType type, CheckDetails* details) const; + bool CheckIntegerType(clang::QualType type, CheckDetails* details) const; + bool CheckTemplateArgument(const clang::TemplateArgument& arg, + CheckDetails* details) const; + + void ReportCheckError(const CheckDetails& details, + clang::SourceLocation loc, + unsigned error); + + clang::CompilerInstance& compiler_; + clang::ASTContext* context_; + + unsigned error_write_param_bad_type_; + unsigned error_tuple_bad_type_; + unsigned error_write_param_bad_signature_; + unsigned note_see_here_; + + std::vector<const clang::Decl*> decl_stack_; + + llvm::StringSet<> blacklisted_typedefs_; +}; + +} // namespace chrome_checker + +#endif // TOOLS_CLANG_PLUGINS_CHECKIPC_VISITOR_H_
diff --git a/tools/clang/plugins/FindBadConstructsAction.cpp b/tools/clang/plugins/FindBadConstructsAction.cpp index ad9fc55..f857ac2b 100644 --- a/tools/clang/plugins/FindBadConstructsAction.cpp +++ b/tools/clang/plugins/FindBadConstructsAction.cpp
@@ -21,7 +21,7 @@ : visitor_(*instance, options) {} void HandleTranslationUnit(clang::ASTContext& context) override { - visitor_.TraverseDecl(context.getTranslationUnitDecl()); + visitor_.Traverse(context); } private: @@ -63,6 +63,8 @@ options_.check_implicit_copy_ctors = true; } else if (args[i] == "no-realpath") { options_.no_realpath = true; + } else if (args[i] == "check-ipc") { + options_.check_ipc = true; } else { parsed = false; llvm::errs() << "Unknown clang plugin argument: " << args[i] << "\n";
diff --git a/tools/clang/plugins/FindBadConstructsConsumer.cpp b/tools/clang/plugins/FindBadConstructsConsumer.cpp index d1fc29d..46c7b8f 100644 --- a/tools/clang/plugins/FindBadConstructsConsumer.cpp +++ b/tools/clang/plugins/FindBadConstructsConsumer.cpp
@@ -103,6 +103,10 @@ FindBadConstructsConsumer::FindBadConstructsConsumer(CompilerInstance& instance, const Options& options) : ChromeClassTester(instance, options) { + if (options.check_ipc) { + ipc_visitor_.reset(new CheckIPCVisitor(instance)); + } + // Messages for virtual method specifiers. diag_method_requires_override_ = diagnostic().getCustomDiagID(getErrorLevel(), kMethodRequiresOverride); @@ -136,6 +140,24 @@ DiagnosticsEngine::Note, kNoteProtectedNonVirtualDtor); } +void FindBadConstructsConsumer::Traverse(ASTContext& context) { + if (ipc_visitor_) ipc_visitor_->set_context(&context); + RecursiveASTVisitor::TraverseDecl(context.getTranslationUnitDecl()); + if (ipc_visitor_) ipc_visitor_->set_context(nullptr); +} + +bool FindBadConstructsConsumer::shouldVisitTemplateInstantiations() const { + return RecursiveASTVisitor::shouldVisitTemplateInstantiations() || + (ipc_visitor_ && ipc_visitor_->should_visit_template_instantiations()); +} + +bool FindBadConstructsConsumer::TraverseDecl(Decl* decl) { + if (ipc_visitor_) ipc_visitor_->BeginDecl(decl); + bool result = RecursiveASTVisitor::TraverseDecl(decl); + if (ipc_visitor_) ipc_visitor_->EndDecl(); + return result; +} + bool FindBadConstructsConsumer::VisitDecl(clang::Decl* decl) { clang::TagDecl* tag_decl = dyn_cast<clang::TagDecl>(decl); if (tag_decl && tag_decl->isCompleteDefinition()) @@ -143,6 +165,17 @@ return true; } +bool FindBadConstructsConsumer::VisitTemplateSpecializationType( + TemplateSpecializationType* spec) { + if (ipc_visitor_) ipc_visitor_->VisitTemplateSpecializationType(spec); + return true; +} + +bool FindBadConstructsConsumer::VisitCallExpr(CallExpr* call_expr) { + if (ipc_visitor_) ipc_visitor_->VisitCallExpr(call_expr); + return true; +} + void FindBadConstructsConsumer::CheckChromeClass(SourceLocation record_location, CXXRecordDecl* record) { // By default, the clang checker doesn't check some types (templates, etc).
diff --git a/tools/clang/plugins/FindBadConstructsConsumer.h b/tools/clang/plugins/FindBadConstructsConsumer.h index 8f8fc87..fb8d1d6 100644 --- a/tools/clang/plugins/FindBadConstructsConsumer.h +++ b/tools/clang/plugins/FindBadConstructsConsumer.h
@@ -20,6 +20,8 @@ #ifndef TOOLS_CLANG_PLUGINS_FINDBADCONSTRUCTSCONSUMER_H_ #define TOOLS_CLANG_PLUGINS_FINDBADCONSTRUCTSCONSUMER_H_ +#include <memory> + #include "clang/AST/AST.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/Attr.h" @@ -29,6 +31,7 @@ #include "clang/Basic/SourceManager.h" #include "clang/Basic/SourceLocation.h" +#include "CheckIPCVisitor.h" #include "ChromeClassTester.h" #include "Options.h" #include "SuppressibleDiagnosticBuilder.h" @@ -43,8 +46,14 @@ FindBadConstructsConsumer(clang::CompilerInstance& instance, const Options& options); + void Traverse(clang::ASTContext& context); + // RecursiveASTVisitor: + bool shouldVisitTemplateInstantiations() const; + bool TraverseDecl(clang::Decl* decl); bool VisitDecl(clang::Decl* decl); + bool VisitTemplateSpecializationType(clang::TemplateSpecializationType* spec); + bool VisitCallExpr(clang::CallExpr* call_expr); // ChromeClassTester overrides: void CheckChromeClass(clang::SourceLocation record_location, @@ -110,6 +119,8 @@ unsigned diag_note_implicit_dtor_; unsigned diag_note_public_dtor_; unsigned diag_note_protected_non_virtual_dtor_; + + std::unique_ptr<CheckIPCVisitor> ipc_visitor_; }; } // namespace chrome_checker
diff --git a/tools/clang/plugins/Options.h b/tools/clang/plugins/Options.h index e56084e..684dab52b 100644 --- a/tools/clang/plugins/Options.h +++ b/tools/clang/plugins/Options.h
@@ -17,10 +17,10 @@ // This is needed during the migration from ASTConsumer approach to the // RecursiveASTVisitor approach. See https://crbug.com/436357 for details. bool check_implicit_copy_ctors = false; - // This is needed for some distributed build-sytems to respect banned // paths. See https://crbug.com/583454 for details. bool no_realpath = false; + bool check_ipc = false; }; } // namespace chrome_checker
diff --git a/tools/clang/plugins/tests/ipc.cpp b/tools/clang/plugins/tests/ipc.cpp new file mode 100644 index 0000000..d2bcef1 --- /dev/null +++ b/tools/clang/plugins/tests/ipc.cpp
@@ -0,0 +1,353 @@ +// Copyright (c) 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. + +// Blacklisted typedefs +typedef __INTMAX_TYPE__ intmax_t; +typedef __UINTMAX_TYPE__ uintmax_t; +typedef int intptr_t; +typedef unsigned int uintptr_t; +typedef __WINT_TYPE__ wint_t; +typedef __SIZE_TYPE__ size_t; +typedef __SIZE_TYPE__ rsize_t; +typedef long ssize_t; +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef unsigned int dev_t; +typedef int off_t; +typedef long clock_t; +typedef int time_t; +typedef long suseconds_t; + +// Other typedefs +typedef int int32_t; +typedef unsigned int uint32_t; +typedef long int64_t; +typedef unsigned long uint64_t; + +namespace std { + +template <class T> +struct allocator {}; + +template <class T, class A = allocator<T>> +struct vector {}; + +template <class F, class S> +struct pair {}; + +} // namespace std + +namespace base { + +class Pickle {}; + +template <class T, class... Ts> +struct Tuple { + T value; +}; + +} // namespace base + +namespace IPC { + +template <class... T> +struct CheckedTuple { + typedef base::Tuple<T...> Tuple; +}; + +template <class T> +struct ParamTraits { + static void Write(base::Pickle*, const T&) {} +}; + +template <class T> +void WriteParam(base::Pickle* pickle, const T& value) { + ParamTraits<T>::Write(pickle, value); +} + +} // namespace IPC + + +/* Test IPC::WriteParam() usage in templates. ERRORS: 6 */ + +struct Data { + uint32_t value; + size_t size; +}; + +template <> +struct IPC::ParamTraits<Data> { + static void Write(base::Pickle* pickle, const Data& p) { + // OK: WriteParam() called in explicit specialization + WriteParam(pickle, p.value); // OK + WriteParam(pickle, p.size); // ERROR + } +}; + +template <class T> +struct Container { + T value; +}; + +template <class T> +struct IPC::ParamTraits<Container<T>> { + static void Write(base::Pickle* pickle, const Container<T>& container) { + // NOT CHECKED: T is not explicitly referenced + IPC::WriteParam(pickle, container.value); // NOT CHECKED + WriteParam(pickle, container.value); // NOT CHECKED + + // NOT CHECKED: T explicitly referenced + IPC::WriteParam<T>(pickle, container.value); // NOT CHECKED + WriteParam<T>(pickle, container.value); // NOT CHECKED + + // OK: explicit cast to non-dependent allowed type + WriteParam(pickle, static_cast<uint32_t>(container.value)); // OK + + // ERROR: explicit cast to non-dependent banned type + WriteParam(pickle, static_cast<long>(container.value)); // ERROR + } +}; + +template <class T, class... Ts> +struct MultiContainer { + T value; +}; + +template <class T, class... Ts> +struct IPC::ParamTraits<MultiContainer<T, Ts...>> { + static void Write(base::Pickle* pickle, + const MultiContainer<T, Ts...>& container) { + // NOT CHECKED: template argument explicitly referenced + bool helper[] = { + (WriteParam<Ts>(pickle, container.value), true)... // NOT CHECKED + }; + (void)helper; + } +}; + +template <class T> +struct SomeClass { + static void Write(base::Pickle* pickle) { + // NOT CHECKED: WriteParam() calls on dependent types + IPC::WriteParam(pickle, T(0)); // NOT CHECKED + + // Non-dependent types are checked + IPC::WriteParam(pickle, size_t(0)); // ERROR + IPC::WriteParam(pickle, uint64_t(0)); // OK + } + + template <class U> + static void WriteEx(base::Pickle* pickle) { + // NOT CHECKED: WriteParam() calls on dependent types + IPC::WriteParam(pickle, U(0)); // NOT CHECKED + + // Non-dependent types are checked + IPC::WriteParam(pickle, time_t(0)); // ERROR + IPC::WriteParam(pickle, uint32_t(0)); // OK + } +}; + +template <class T> +void SomeWriteFunction(base::Pickle* pickle) { + // NOT CHECKED: WriteParam() calls on dependent types + IPC::WriteParam(pickle, T(0)); // NOT CHECKED + + // Non-dependent types are checked + IPC::WriteParam(pickle, long(0)); // ERROR + IPC::WriteParam(pickle, char(0)); // OK + + [&](){ + IPC::WriteParam(pickle, T(0)); // NOT CHECKED + + IPC::WriteParam(pickle, clock_t(0)); // ERROR + IPC::WriteParam(pickle, int64_t(0)); // OK + }(); +} + +void TestWriteParamInTemplates() { + // These specializations call WriteParam() on various banned types, either + // because they were specified directly (long) or because non-blacklisted + // typedef (uint64_t) was stripped down to its underlying type, which is + // blacklisted when used as is (unsigned long). + // However, since it's hard (if not impossible) to check specializations + // properly, we're simply not checking them. + SomeClass<long>::Write(nullptr); + SomeClass<long>::WriteEx<uint64_t>(nullptr); + SomeWriteFunction<uint64_t>(nullptr); +} + + +/* Test IPC::CheckedTuple. ERRORS: 5 */ + +#define IPC_TUPLE(...) IPC::CheckedTuple<__VA_ARGS__>::Tuple + +#define IPC_MESSAGE_DECL(name, id, in_tuple) \ + struct name ## Meta_ ## id { \ + using InTuple = in_tuple; \ + }; + +#define IPC_TEST_MESSAGE(id, in) \ + IPC_MESSAGE_DECL(TestMessage, id, IPC_TUPLE in) + +struct Empty {}; + +IPC_TEST_MESSAGE(__COUNTER__, (bool, size_t, Empty, long)) // 2 ERRORs + +typedef std::vector<long> long1D; +typedef std::vector<long1D> long2D; +IPC_TEST_MESSAGE(__COUNTER__, (bool, long2D)) // ERROR + +IPC_TEST_MESSAGE(__COUNTER__, (char, short, std::pair<size_t, bool>)) // ERROR + +IPC_TEST_MESSAGE(__COUNTER__, (std::vector<std::vector<long&>&>&)) // ERROR + + +/* Check IPC::WriteParam() arguments. ERRORS: 30 */ + +// ERRORS: 21 +void TestWriteParamArgument() { + #define CALL_WRITEPARAM(Type) \ + { \ + Type p; \ + IPC::WriteParam(nullptr, p); \ + } + + // ERROR: blacklisted types / typedefs + CALL_WRITEPARAM(long) // ERROR + CALL_WRITEPARAM(unsigned long) // ERROR + CALL_WRITEPARAM(intmax_t) // ERROR + CALL_WRITEPARAM(uintmax_t) // ERROR + CALL_WRITEPARAM(intptr_t) // ERROR + CALL_WRITEPARAM(uintptr_t) // ERROR + CALL_WRITEPARAM(wint_t) // ERROR + CALL_WRITEPARAM(size_t) // ERROR + CALL_WRITEPARAM(rsize_t) // ERROR + CALL_WRITEPARAM(ssize_t) // ERROR + CALL_WRITEPARAM(ptrdiff_t) // ERROR + CALL_WRITEPARAM(dev_t) // ERROR + CALL_WRITEPARAM(off_t) // ERROR + CALL_WRITEPARAM(clock_t) // ERROR + CALL_WRITEPARAM(time_t) // ERROR + CALL_WRITEPARAM(suseconds_t) // ERROR + + // ERROR: typedef to blacklisted typedef + typedef size_t my_size; + CALL_WRITEPARAM(my_size) // ERROR + + // ERROR: expression ends up with type "unsigned long" + { + uint64_t p = 0; + IPC::WriteParam(nullptr, p + 1); // ERROR + } + + // ERROR: long chain of typedefs, ends up with blacklisted typedef + { + typedef size_t my_size_base; + typedef const my_size_base my_size; + typedef my_size& my_size_ref; + my_size_ref p = 0; + IPC::WriteParam(nullptr, p); // ERROR + } + + // ERROR: template specialization references blacklisted type + CALL_WRITEPARAM(std::vector<long>) // ERROR + CALL_WRITEPARAM(std::vector<size_t>) // ERROR + + // OK: typedef to blacklisted type + typedef long my_long; + CALL_WRITEPARAM(my_long) // OK + + // OK: other types / typedefs + CALL_WRITEPARAM(char) // OK + CALL_WRITEPARAM(int) // OK + CALL_WRITEPARAM(uint32_t) // OK + CALL_WRITEPARAM(int64_t) // OK + + // OK: long chain of typedefs, ends up with non-blacklisted typedef + { + typedef uint32_t my_int_base; + typedef const my_int_base my_int; + typedef my_int& my_int_ref; + my_int_ref p = 0; + IPC::WriteParam(nullptr, p); // OK + } + + // OK: template specialization references non-blacklisted type + CALL_WRITEPARAM(std::vector<char>) // OK + CALL_WRITEPARAM(std::vector<my_long>) // OK + + #undef CALL_WRITEPARAM +} + +struct Provider { + typedef unsigned int flags; + + short get_short() const { return 0; } + uint64_t get_uint64() const { return 0; } + long get_long() const { return 0; } + unsigned int get_uint() const { return 0; } + flags get_flags() const { return 0; } + size_t get_size() const { return 0; } + + const std::vector<size_t>& get_sizes() const { return sizes_data; } + const std::vector<uint64_t>& get_uint64s() const { return uint64s_data; } + + template <class T> + T get() const { return T(); } + + short short_data; + unsigned int uint_data; + flags flags_data; + long long_data; + size_t size_data; + uint64_t uint64_data; + std::vector<size_t> sizes_data; + std::vector<uint64_t> uint64s_data; +}; + +// ERRORS: 9 +void TestWriteParamMemberArgument() { + Provider p; + + IPC::WriteParam(nullptr, p.get<short>()); // OK + IPC::WriteParam(nullptr, p.get_short()); // OK + IPC::WriteParam(nullptr, p.short_data); // OK + + IPC::WriteParam(nullptr, p.get<unsigned int>()); // OK + IPC::WriteParam(nullptr, p.get_uint()); // OK + IPC::WriteParam(nullptr, p.uint_data); // OK + + IPC::WriteParam(nullptr, p.get<Provider::flags>()); // OK + IPC::WriteParam(nullptr, p.get_flags()); // OK + IPC::WriteParam(nullptr, p.flags_data); // OK + + IPC::WriteParam(nullptr, p.get<long>()); // ERROR + IPC::WriteParam(nullptr, p.get_long()); // ERROR + IPC::WriteParam(nullptr, p.long_data); // ERROR + + // This one is flaky and depends on whether size_t is typedefed to a + // blacklisted type (unsigned long). + //IPC::WriteParam(nullptr, p.get<size_t>()); // ERROR + IPC::WriteParam(nullptr, p.get_size()); // ERROR + IPC::WriteParam(nullptr, p.size_data); // ERROR + + // Information about uint64_t gets lost, and plugin sees WriteParam() + // call on unsigned long, which is blacklisted. + IPC::WriteParam(nullptr, p.get<uint64_t>()); // ERROR + IPC::WriteParam(nullptr, p.get_uint64()); // OK + IPC::WriteParam(nullptr, p.uint64_data); // OK + + // Same thing here, WriteParam() sees vector<unsigned long>, and denies it. + IPC::WriteParam(nullptr, p.get<std::vector<uint64_t>>()); // ERROR + IPC::WriteParam(nullptr, p.get_uint64s()); // OK + IPC::WriteParam(nullptr, p.uint64s_data); // OK + + // This one is flaky and depends on whether size_t is typedefed to a + // blacklisted type (unsigned long). + //IPC::WriteParam(nullptr, p.get<std::vector<size_t>>()); + IPC::WriteParam(nullptr, p.get_sizes()); // ERROR + IPC::WriteParam(nullptr, p.sizes_data); // ERROR +} + + +/* ERRORS: 41 */
diff --git a/tools/clang/plugins/tests/ipc.flags b/tools/clang/plugins/tests/ipc.flags new file mode 100644 index 0000000..33926b6 --- /dev/null +++ b/tools/clang/plugins/tests/ipc.flags
@@ -0,0 +1 @@ +-ferror-limit=0 -Xclang -plugin-arg-find-bad-constructs -Xclang check-ipc -fno-delayed-template-parsing \ No newline at end of file
diff --git a/tools/clang/plugins/tests/ipc.txt b/tools/clang/plugins/tests/ipc.txt new file mode 100644 index 0000000..fbca40b --- /dev/null +++ b/tools/clang/plugins/tests/ipc.txt
@@ -0,0 +1,224 @@ +ipc.cpp:83:26: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t'. + WriteParam(pickle, p.size); // ERROR + ^ +ipc.cpp:107:24: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'long'. + WriteParam(pickle, static_cast<long>(container.value)); // ERROR + ^ +ipc.cpp:135:29: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t'. + IPC::WriteParam(pickle, size_t(0)); // ERROR + ^ +ipc.cpp:145:29: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'time_t'. + IPC::WriteParam(pickle, time_t(0)); // ERROR + ^ +ipc.cpp:156:27: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'long'. + IPC::WriteParam(pickle, long(0)); // ERROR + ^ +ipc.cpp:162:29: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'clock_t'. + IPC::WriteParam(pickle, clock_t(0)); // ERROR + ^ +ipc.cpp:194:1: error: [chromium-ipc] IPC tuple references banned type 'size_t'. +IPC_TEST_MESSAGE(__COUNTER__, (bool, size_t, Empty, long)) // 2 ERRORs +^ +ipc.cpp:190:3: note: expanded from macro 'IPC_TEST_MESSAGE' + IPC_MESSAGE_DECL(TestMessage, id, IPC_TUPLE in) + ^ +ipc.cpp:186:5: note: expanded from macro 'IPC_MESSAGE_DECL' + using InTuple = in_tuple; \ + ^ +ipc.cpp:194:1: error: [chromium-ipc] IPC tuple references banned type 'long'. +ipc.cpp:190:3: note: expanded from macro 'IPC_TEST_MESSAGE' + IPC_MESSAGE_DECL(TestMessage, id, IPC_TUPLE in) + ^ +ipc.cpp:186:5: note: expanded from macro 'IPC_MESSAGE_DECL' + using InTuple = in_tuple; \ + ^ +ipc.cpp:198:1: error: [chromium-ipc] IPC tuple references banned type 'long' via 'long2D'. +IPC_TEST_MESSAGE(__COUNTER__, (bool, long2D)) // ERROR +^ +ipc.cpp:190:3: note: expanded from macro 'IPC_TEST_MESSAGE' + IPC_MESSAGE_DECL(TestMessage, id, IPC_TUPLE in) + ^ +ipc.cpp:186:5: note: expanded from macro 'IPC_MESSAGE_DECL' + using InTuple = in_tuple; \ + ^ +ipc.cpp:197:29: note: see here +typedef std::vector<long1D> long2D; + ^ +ipc.cpp:196:27: note: see here +typedef std::vector<long> long1D; + ^ +ipc.cpp:200:1: error: [chromium-ipc] IPC tuple references banned type 'size_t' via 'std::pair<size_t, _Bool>'. +IPC_TEST_MESSAGE(__COUNTER__, (char, short, std::pair<size_t, bool>)) // ERROR +^ +ipc.cpp:190:3: note: expanded from macro 'IPC_TEST_MESSAGE' + IPC_MESSAGE_DECL(TestMessage, id, IPC_TUPLE in) + ^ +ipc.cpp:186:5: note: expanded from macro 'IPC_MESSAGE_DECL' + using InTuple = in_tuple; \ + ^ +ipc.cpp:202:1: error: [chromium-ipc] IPC tuple references banned type 'long' via 'std::vector<std::vector<long &> &>'. +IPC_TEST_MESSAGE(__COUNTER__, (std::vector<std::vector<long&>&>&)) // ERROR +^ +ipc.cpp:190:3: note: expanded from macro 'IPC_TEST_MESSAGE' + IPC_MESSAGE_DECL(TestMessage, id, IPC_TUPLE in) + ^ +ipc.cpp:186:5: note: expanded from macro 'IPC_MESSAGE_DECL' + using InTuple = in_tuple; \ + ^ +ipc.cpp:216:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'long'. + CALL_WRITEPARAM(long) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:217:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'unsigned long'. + CALL_WRITEPARAM(unsigned long) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:218:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'intmax_t'. + CALL_WRITEPARAM(intmax_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:219:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'uintmax_t'. + CALL_WRITEPARAM(uintmax_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:220:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'intptr_t'. + CALL_WRITEPARAM(intptr_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:221:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'uintptr_t'. + CALL_WRITEPARAM(uintptr_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:222:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'wint_t'. + CALL_WRITEPARAM(wint_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:223:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t'. + CALL_WRITEPARAM(size_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:224:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'rsize_t'. + CALL_WRITEPARAM(rsize_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:225:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'ssize_t'. + CALL_WRITEPARAM(ssize_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:226:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'ptrdiff_t'. + CALL_WRITEPARAM(ptrdiff_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:227:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'dev_t'. + CALL_WRITEPARAM(dev_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:228:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'off_t'. + CALL_WRITEPARAM(off_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:229:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'clock_t'. + CALL_WRITEPARAM(clock_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:230:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'time_t'. + CALL_WRITEPARAM(time_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:231:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'suseconds_t'. + CALL_WRITEPARAM(suseconds_t) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:235:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t' via 'my_size'. + CALL_WRITEPARAM(my_size) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:234:18: note: see here + typedef size_t my_size; + ^ +ipc.cpp:240:32: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'unsigned long'. + IPC::WriteParam(nullptr, p + 1); // ERROR + ^ +ipc.cpp:249:30: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t' via 'my_size'. + IPC::WriteParam(nullptr, p); // ERROR + ^ +ipc.cpp:246:32: note: see here + typedef const my_size_base my_size; + ^ +ipc.cpp:245:20: note: see here + typedef size_t my_size_base; + ^ +ipc.cpp:253:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'long' via 'std::vector<long>'. + CALL_WRITEPARAM(std::vector<long>) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:254:3: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t' via 'std::vector<size_t>'. + CALL_WRITEPARAM(std::vector<size_t>) // ERROR + ^ +ipc.cpp:212:32: note: expanded from macro 'CALL_WRITEPARAM' + IPC::WriteParam(nullptr, p); \ + ^ +ipc.cpp:324:28: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'long'. + IPC::WriteParam(nullptr, p.get<long>()); // ERROR + ^ +ipc.cpp:325:28: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'long'. + IPC::WriteParam(nullptr, p.get_long()); // ERROR + ^ +ipc.cpp:326:30: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'long'. + IPC::WriteParam(nullptr, p.long_data); // ERROR + ^ +ipc.cpp:331:28: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t'. + IPC::WriteParam(nullptr, p.get_size()); // ERROR + ^ +ipc.cpp:332:30: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t'. + IPC::WriteParam(nullptr, p.size_data); // ERROR + ^ +ipc.cpp:336:28: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'unsigned long'. + IPC::WriteParam(nullptr, p.get<uint64_t>()); // ERROR + ^ +ipc.cpp:341:28: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'unsigned long' via 'struct std::vector<unsigned long, struct std::allocator<unsigned long> >'. + IPC::WriteParam(nullptr, p.get<std::vector<uint64_t>>()); // ERROR + ^ +ipc.cpp:348:28: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t' via 'std::vector<size_t>'. + IPC::WriteParam(nullptr, p.get_sizes()); // ERROR + ^ +ipc.cpp:349:30: error: [chromium-ipc] IPC::WriteParam() is called on blacklisted type 'size_t' via 'std::vector<size_t>'. + IPC::WriteParam(nullptr, p.sizes_data); // ERROR + ^ +41 errors generated.
diff --git a/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp b/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp index d0352ea..3d12b5f 100644 --- a/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp +++ b/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
@@ -640,8 +640,7 @@ // matches |g|. auto method_decl_matcher = id("decl", - cxxMethodDecl(isBlinkOrWTFMethod(), - unless(anyOf(is_generated, + cxxMethodDecl(unless(anyOf(is_generated, // Overloaded operators have special names // and should never be renamed. isOverloadedOperator(), @@ -649,7 +648,11 @@ // conversion functions should not be // considered for renaming. cxxConstructorDecl(), cxxDestructorDecl(), - cxxConversionDecl())))); + cxxConversionDecl())), + // Check this last after excluding things, to avoid + // asserts about overriding non-blink and blink for the + // same method. + isBlinkOrWTFMethod())); MethodDeclRewriter method_decl_rewriter(&replacements); match_finder.addMatcher(method_decl_matcher, &method_decl_rewriter);
diff --git a/tools/clang/rewrite_to_chrome_style/tests/macros-expected.cc b/tools/clang/rewrite_to_chrome_style/tests/macros-expected.cc index f03e3a3..2dcda6f 100644 --- a/tools/clang/rewrite_to_chrome_style/tests/macros-expected.cc +++ b/tools/clang/rewrite_to_chrome_style/tests/macros-expected.cc
@@ -37,4 +37,17 @@ } } +#define CALL_METHOD_FROM_MACRO() \ + void CallMethodFromMacro() { Method(); } \ + void Pmethod() override {} + +struct WithMacroP { + virtual void Pmethod() {} +}; + +struct WithMacro : public WithMacroP { + void Method() {} + CALL_METHOD_FROM_MACRO(); +}; + } // namespace blink
diff --git a/tools/clang/rewrite_to_chrome_style/tests/macros-original.cc b/tools/clang/rewrite_to_chrome_style/tests/macros-original.cc index 3b6fdb5..ab68484 100644 --- a/tools/clang/rewrite_to_chrome_style/tests/macros-original.cc +++ b/tools/clang/rewrite_to_chrome_style/tests/macros-original.cc
@@ -37,4 +37,17 @@ } } +#define CALL_METHOD_FROM_MACRO() \ + void callMethodFromMacro() { method(); } \ + void pmethod() override {} + +struct WithMacroP { + virtual void pmethod() {} +}; + +struct WithMacro : public WithMacroP { + void method() {} + CALL_METHOD_FROM_MACRO(); +}; + } // namespace blink
diff --git a/tools/gn/label_ptr.h b/tools/gn/label_ptr.h index 4ce20a6..c0b2d636 100644 --- a/tools/gn/label_ptr.h +++ b/tools/gn/label_ptr.h
@@ -56,7 +56,7 @@ // To do a brute-force search by label: // std::find_if(vect.begin(), vect.end(), LabelPtrLabelEquals<Config>(label)); template<typename T> -struct LabelPtrLabelEquals : public std::unary_function<Label, bool> { +struct LabelPtrLabelEquals { explicit LabelPtrLabelEquals(const Label& l) : label(l) {} bool operator()(const LabelPtrPair<T>& arg) const { @@ -69,7 +69,7 @@ // To do a brute-force search by object pointer: // std::find_if(vect.begin(), vect.end(), LabelPtrPtrEquals<Config>(config)); template<typename T> -struct LabelPtrPtrEquals : public std::unary_function<T, bool> { +struct LabelPtrPtrEquals { explicit LabelPtrPtrEquals(const T* p) : ptr(p) {} bool operator()(const LabelPtrPair<T>& arg) const { @@ -82,9 +82,7 @@ // To sort by label: // std::sort(vect.begin(), vect.end(), LabelPtrLabelLess<Config>()); template<typename T> -struct LabelPtrLabelLess : public std::binary_function<LabelPtrPair<T>, - LabelPtrPair<T>, - bool> { +struct LabelPtrLabelLess { bool operator()(const LabelPtrPair<T>& a, const LabelPtrPair<T>& b) const { return a.label < b.label; }
diff --git a/tools/ipc_fuzzer/message_replay/replay_process.cc b/tools/ipc_fuzzer/message_replay/replay_process.cc index 114ebd7..54b56de8 100644 --- a/tools/ipc_fuzzer/message_replay/replay_process.cc +++ b/tools/ipc_fuzzer/message_replay/replay_process.cc
@@ -112,8 +112,10 @@ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( switches::kMojoChannelToken); channel_ = IPC::ChannelProxy::Create( - IPC::ChannelMojo::CreateClientFactory(token), this, - io_thread_.task_runner()); + IPC::ChannelMojo::CreateClientFactory(mojo::edk::CreateChildMessagePipe( + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + switches::kMojoChannelToken))), + this, io_thread_.task_runner()); } else { std::string channel_name = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
diff --git a/tools/mb/mb.py b/tools/mb/mb.py index 258df687..09c8ebcd 100755 --- a/tools/mb/mb.py +++ b/tools/mb/mb.py
@@ -305,6 +305,28 @@ if not mixin in referenced_mixins: errs.append('Unreferenced mixin "%s".' % mixin) + # Check that 'chromium' bots which build public artifacts do not include + # the chrome_with_codecs 'mixin'. + if not 'chromium' in self.masters: + errs.append('Missing "chromium" master. Please update this proprietary ' + 'codecs check with the name of the master responsible for ' + 'public build artifacts.') + else: + for builder in self.masters['chromium']: + config = self.masters['chromium'][builder] + def RecurseMixins(current_mixin): + if current_mixin == 'chrome_with_codecs': + errs.append('Public artifact builder "%s" can not contain the ' + '"chrome_with_codecs" mixin.' % builder) + return + if not 'mixins' in self.mixins[current_mixin]: + return + for mixin in self.mixins[current_mixin]['mixins']: + RecurseMixins(mixin) + + for mixin in self.configs[config]: + RecurseMixins(mixin) + if errs: raise MBErr(('mb config file %s has problems:' % self.args.config_file) + '\n ' + '\n '.join(errs))
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 61517195..a08ad20 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -12,24 +12,24 @@ 'android_cast_gyp_debug_static_bot': ['android', 'cast', 'gyp', 'debug_static_bot'], 'android_clang_asan_gyp_debug_bot': ['android', 'clang', 'asan', 'gyp', 'debug_bot'], 'android_clang_asan_gyp_debug_trybot': ['android', 'clang', 'asan', 'gyp', 'debug_trybot'], - 'android_gn_debug_bot': ['android', 'chrome_with_codecs', 'gn', 'debug_bot'], - 'android_gn_debug_static_bot': ['android', 'chrome_with_codecs', 'gn', 'debug_static_bot'], - 'android_gn_debug_static_bot_arm64': ['android', 'chrome_with_codecs', 'gn', 'debug_static_bot', 'arm64'], - 'android_gn_debug_static_bot_mipsel': ['android', 'chrome_with_codecs', 'gn', 'debug_static_bot', 'mipsel'], - 'android_gn_debug_static_bot_x64': ['android', 'chrome_with_codecs', 'gn', 'debug_static_bot', 'x64'], - 'android_gn_debug_static_bot_x86': ['android', 'chrome_with_codecs', 'gn', 'debug_static_bot', 'x86'], - 'android_gn_debug_trybot': ['android', 'chrome_with_codecs', 'gn', 'debug_trybot'], - 'android_gn_debug_trybot_mipsel': ['android', 'chrome_with_codecs', 'gn', 'debug_trybot', 'mipsel'], - 'android_gn_debug_trybot_x64': ['android', 'chrome_with_codecs', 'gn', 'debug_trybot', 'x64'], - 'android_gn_debug_trybot_x86': ['android', 'chrome_with_codecs', 'gn', 'debug_trybot', 'x86'], + 'android_gn_debug_bot': ['android', 'gn', 'debug_bot'], + 'android_gn_debug_static_bot': ['android', 'gn', 'debug_static_bot'], + 'android_gn_debug_static_bot_arm64': ['android', 'gn', 'debug_static_bot', 'arm64'], + 'android_gn_debug_static_bot_mipsel': ['android', 'gn', 'debug_static_bot', 'mipsel'], + 'android_gn_debug_static_bot_x64': ['android', 'gn', 'debug_static_bot', 'x64'], + 'android_gn_debug_static_bot_x86': ['android', 'gn', 'debug_static_bot', 'x86'], + 'android_gn_debug_trybot': ['android', 'gn', 'debug_trybot'], + 'android_gn_debug_trybot_mipsel': ['android', 'gn', 'debug_trybot', 'mipsel'], + 'android_gn_debug_trybot_x64': ['android', 'gn', 'debug_trybot', 'x64'], + 'android_gn_debug_trybot_x86': ['android', 'gn', 'debug_trybot', 'x86'], 'android_gn_release_bot': ['android', 'gn', 'release_bot'], 'android_gn_release_trybot': ['android', 'gn', 'release_trybot'], 'android_gyp_debug_static_bot': ['android', 'gyp', 'debug_static_bot'], 'android_gyp_debug_static_bot_arm64': ['android', 'gyp', 'debug_static_bot', 'arm64'], - 'android_gyp_debug_trybot': ['android', 'chrome_with_codecs', 'gyp', 'debug_trybot'], - 'android_gyp_debug_trybot_arm64': ['android', 'chrome_with_codecs', 'gyp', 'debug_trybot', 'arm64'], + 'android_gyp_debug_trybot': ['android', 'gyp', 'debug_trybot'], + 'android_gyp_debug_trybot_arm64': ['android', 'gyp', 'debug_trybot', 'arm64'], 'android_gyp_release_bot': ['android', 'gyp', 'release_bot'], - 'android_gyp_release_bot_minimal_symbols': ['android', 'gyp', 'release_bot_minimal_symbols'], + 'android_without_codecs_gyp_release_bot_minimal_symbols': ['android_without_codecs', 'gyp', 'release_bot_minimal_symbols'], 'android_gyp_release_trybot': ['android', 'gyp', 'release_trybot'], 'cast_gn_release_bot': ['cast', 'gn', 'release_bot'], 'cast_gn_release_trybot': ['cast', 'gn', 'release_trybot'], @@ -96,7 +96,7 @@ 'noswarming_gyp_release_bot_mac_strip': ['noswarming', 'gyp', 'release_bot', 'mac_strip'], 'noswarming_gyp_release_bot_x86': ['noswarming', 'gyp', 'release_bot', 'x86'], - 'swarming_android_gn_release_bot_minimal_symbols': ['swarming', 'android', 'chrome_with_codecs', 'gn', 'release_bot_minimal_symbols'], + 'swarming_android_gn_release_bot_minimal_symbols': ['swarming', 'android', 'gn', 'release_bot_minimal_symbols'], 'swarming_asan_lsan_gyp_release_trybot': ['swarming', 'asan', 'lsan', 'release_trybot'], 'swarming_msan_gyp_release_trybot': ['swarming', 'chromeos', 'msan', 'gyp', 'release_trybot'], 'swarming_deterministic_gyp_release_bot': ['swarming', 'deterministic', 'gyp', 'release_bot'], @@ -145,7 +145,6 @@ 'swarming_tsan_gyp_release_trybot': ['swarming', 'disable_nacl', 'tsan', 'gyp', 'release_trybot'], # Configurations that build with proprietary codecs enabled. - 'android_gn_release_bot_chrome_with_codecs': ['android', 'gn', 'release_bot', 'chrome_with_codecs'], 'gn_debug_bot_minimal_symbols_chrome_with_codecs': ['gn', 'debug_bot_minimal_symbols', 'chrome_with_codecs'], 'gn_debug_static_bot_chrome_with_codecs': ['gn', 'debug_static_bot', 'chrome_with_codecs'], 'gn_release_bot_chrome_with_codecs': ['gn', 'release_bot', 'chrome_with_codecs'], @@ -186,7 +185,15 @@ # This is a dict mapping a given 'mixin' name to a dict of settings that # mb should use. See //tools/mb/docs/user_guide.md for more information. 'mixins': { + # We build Android with codecs on most bots to ensure maximum test coverage, + # but use 'android_without_codecs' on bots responsible for building publicly + # advertised non-Official Android builds -- which are not allowed to have + # proprietary codecs enabled. 'android': { + 'mixins': ['android_without_codecs', 'chrome_with_codecs'], + }, + + 'android_without_codecs': { 'gn_args': 'target_os="android"', 'gyp_defines': 'OS=android', }, @@ -490,12 +497,16 @@ 'chrome.continuous': { 'precise64 trunk': 'gn_official', }, + # Take care when changing any of these builders to ensure that you do not + # include a configuration with 'chrome_with_codecs' since these builders + # generated publicly advertised non-Official builds which are not allowed to + # have proprietary codecs enabled. 'chromium': { 'Win': 'noswarming_gyp_release_bot', 'Mac': 'noswarming_gyp_release_bot_mac_strip', 'Linux x64': 'noswarming_gn_release_bot', 'Linux': 'noswarming_gyp_release_bot_x86', - 'Android': 'android_gyp_release_bot_minimal_symbols', + 'Android': 'android_without_codecs_gyp_release_bot_minimal_symbols', }, 'chromium.android': { 'Android GN Builder (dbg)': 'android_gn_debug_bot', @@ -680,7 +691,7 @@ 'Linux Release dEQP (NVIDIA)': 'none', }, 'chromium.webrtc.fyi': { - 'Android GN': 'android_gn_release_bot_chrome_with_codecs', + 'Android GN': 'android_gn_release_bot', 'Android GN (dbg)': 'android_gn_debug_bot', 'Linux Builder': 'gn_release_bot_chrome_with_codecs', 'Mac GN': 'gn_release_bot_chrome_with_codecs',
diff --git a/tools/mb/mb_unittest.py b/tools/mb/mb_unittest.py index b836ab04..6a0218c 100755 --- a/tools/mb/mb_unittest.py +++ b/tools/mb/mb_unittest.py
@@ -113,6 +113,7 @@ 'unsupported': ['gn', 'fake_feature2'], }, 'masters': { + 'chromium': {}, 'fake_master': { 'fake_builder': 'gyp_rel_bot', 'fake_gn_builder': 'gn_rel_bot', @@ -148,6 +149,46 @@ """ +TEST_BAD_CONFIG = """\ +{ + 'common_dev_configs': ['gn_rel_bot_1'], + 'configs': { + 'gn_rel_bot_1': ['gn', 'rel', 'chrome_with_codecs'], + 'gn_rel_bot_2': ['gn', 'rel', 'bad_nested_config'], + }, + 'masters': { + 'chromium': { + 'a': 'gn_rel_bot_1', + 'b': 'gn_rel_bot_2', + }, + }, + 'mixins': { + 'gn': {'type': 'gn'}, + 'chrome_with_codecs': { + 'gn_args': 'proprietary_codecs=true', + }, + 'bad_nested_config': { + 'mixins': ['chrome_with_codecs'], + }, + 'rel': { + 'gn_args': 'is_debug=false', + }, + }, + 'private_configs': ['private'], + 'unsupported_configs': ['unsupported'], +} +""" + + +TEST_BAD_CONFIG_ERR = """\ +mb config file /fake_src/tools/mb/mb_config.pyl has problems: + Config "gn_rel_bot_1" used by a bot is also listed in "common_dev_configs". + Unknown config "unsupported" referenced from "unsupported_configs". + Unknown config "private" referenced from "private_configs". + Public artifact builder "a" can not contain the "chrome_with_codecs" mixin. + Public artifact builder "b" can not contain the "chrome_with_codecs" mixin.""" + + class UnitTest(unittest.TestCase): def fake_mbw(self, files=None, win32=False): mbw = FakeMBW(win32=win32) @@ -157,13 +198,19 @@ mbw.files[path] = contents return mbw - def check(self, args, mbw=None, files=None, out=None, err=None, ret=None): + def check(self, args, mbw=None, files=None, out=None, err=None, ret=None, + exception=None): if not mbw: mbw = self.fake_mbw(files) mbw.ParseArgs(args) - actual_ret = mbw.args.func() - if ret is not None: - self.assertEqual(actual_ret, ret) + + actual_ret = None + if exception is not None: + self.assertRaisesRegexp(Exception, exception, mbw.args.func) + else: + actual_ret = mbw.args.func() + + self.assertEqual(actual_ret, ret) if out is not None: self.assertEqual(mbw.out, out) if err is not None: @@ -363,7 +410,7 @@ def test_gyp_crosscompile(self): mbw = self.fake_mbw() - self.check(['gen', '-c', 'private', '//out/Release'], mbw=mbw) + self.check(['gen', '-c', 'private', '//out/Release'], mbw=mbw, ret=0) self.assertTrue(mbw.cross_compile) def test_gyp_gen(self): @@ -398,10 +445,14 @@ finally: sys.stdout = orig_stdout - def test_validate(self): self.check(['validate'], ret=0) + def test_bad_validate(self): + mbw = self.fake_mbw() + mbw.files[mbw.default_config] = TEST_BAD_CONFIG + self.check(['validate'], mbw=mbw, exception=TEST_BAD_CONFIG_ERR) + if __name__ == '__main__': unittest.main()
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index df9fa85..25c1791 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -7850,6 +7850,21 @@ </description> </action> +<action name="MediaRouter_Ui_Dialog_Blur"> + <owner>apacible@chromium.org</owner> + <description> + User clicked outside the Media Router dialog, possibly in an effort to close + the dialog. + </description> +</action> + +<action name="MediaRouter_Ui_Dialog_ESCToClose"> + <owner>apacible@chromium.org</owner> + <description> + User closed the Media Router dialog by pressing the ESC key. + </description> +</action> + <action name="MediaRouter_Ui_Navigate_Help"> <owner>apacible@chromium.org</owner> <description>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 82f8b6b6..3819685 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -5138,6 +5138,28 @@ <summary>Number of tries before successful ping. 99 means giving up.</summary> </histogram> +<histogram name="ComponentUpdater.Calls" enum="ComponentUpdaterCalls"> + <owner>sorin@chromium.org</owner> + <summary> + The number of times the component updater called UpdateClient::Install or + UpdateClient::Update. These correspond to the number of manual component + update checks performed as a result of a user action, and the number of + automated component update checks. + </summary> +</histogram> + +<histogram name="ComponentUpdater.UpdateCompleteResult" enum="BooleanError"> + <owner>sorin@chromium.org</owner> + <summary>The result of an install or an update check.</summary> +</histogram> + +<histogram name="ComponentUpdater.UpdateCompleteTime" units="ms"> + <owner>sorin@chromium.org</owner> + <summary> + Time to complete an Install or an Update component update call. + </summary> +</histogram> + <histogram name="Compositing.Browser.DisplayListRecordingSource.UpdateInvalidatedAreaPerMs" units="pixels/ms"> @@ -6337,6 +6359,15 @@ <summary>Cryptohome errors.</summary> </histogram> +<histogram name="Cryptohome.MigrationToGaiaId" + enum="CryptohomeMigrationToGaiaId"> + <owner>alemate@chromium.org</owner> + <summary> + This is the status of cryptohome migration to GaiaId. Every time user logs + in current migration status is recorded. + </summary> +</histogram> + <histogram name="Cryptohome.TimeToInitPkcs11" units="ms"> <owner>dkrahn@chromium.org</owner> <summary> @@ -7343,6 +7374,9 @@ </histogram> <histogram name="DefaultBrowser.SetDefaultAsyncDuration" units="ms"> + <obsolete> + Deprecated 2016/03. The async set-as-default experiments are finished. + </obsolete> <owner>pmonette@chromium.org</owner> <summary> How long it took to set Chrome as the default browser asynchronously in @@ -28651,6 +28685,16 @@ </summary> </histogram> +<histogram name="Net.TokenBinding.StoreEphemerality" + enum="TokenBinding.StoreEphemerality"> + <owner>nharper@chromium.org</owner> + <summary> + For each request on a connection where Channel ID was sent, this logs + whether the Cookie store and the Channel ID store were ephemeral or + persistent. + </summary> +</histogram> + <histogram name="Net.TokenBinding.Support" enum="TokenBinding.Support"> <owner>nharper@chromium.org</owner> <summary> @@ -61259,6 +61303,11 @@ <int value="2" label="Successful first layout"/> </enum> +<enum name="ComponentUpdaterCalls" type="int"> + <int value="0" label="Install"/> + <int value="1" label="Update"/> +</enum> + <enum name="CompositedScrolling" type="int"> <int value="0" label="Is scrollable area"/> <int value="1" label="Needs to be stacking container"/> @@ -62087,6 +62136,13 @@ <int value="17" label="TSS invalid handle"/> </enum> +<enum name="CryptohomeMigrationToGaiaId" type="int"> + <int value="0" label="Not started"/> + <int value="1" label="Already migrated"/> + <int value="2" label="Success"/> + <int value="3" label="Failure"/> +</enum> + <enum name="CTRequirementCompliance" type="int"> <obsolete> Deprecated 1/2016. @@ -72256,7 +72312,6 @@ <int value="-1930720286" label="nacl-debug-mask"/> <int value="-1928198763" label="enable-async-dns"/> <int value="-1925117279" label="disable-quic-https"/> - <int value="-1919308574" label="enable-ime-thread"/> <int value="-1915854488" label="enable-offline-pages"/> <int value="-1911153473" label="enable-easy-signin"/> <int value="-1892555086" label="disable-compositor-animation-timelines"/> @@ -72754,7 +72809,6 @@ <int value="1820451991" label="enable-offline-auto-reload"/> <int value="1821723343" label="disable-saml-signin"/> <int value="1828660283" label="enable-webfonts-intervention-trigger"/> - <int value="1840930186" label="disable-ime-thread"/> <int value="1844110073" label="enable-app-view"/> <int value="1847024354" label="enable-hotword-hardware"/> <int value="1855524566" label="allow-insecure-websocket-from-https-origin"/> @@ -82483,6 +82537,26 @@ <int value="5" label="Error looking up request key"/> </enum> +<enum name="TokenBinding.StoreEphemerality" type="int"> + <int value="0" label="CID_EPHEMERAL_COOKIE_EPHEMERAL"> + This value has been deprecated and replaced by EPHEMERAL_MATCH and + EPHEMERAL_MISMATCH. + </int> + <int value="1" label="CID_EPHEMERAL_COOKIE_PERSISTENT"/> + <int value="2" label="CID_PERSISTENT_COOKIE_EPHEMERAL"/> + <int value="3" label="CID_PERSISTENT_COOKIE_PERSISTENT"> + This value has been deprecated and replaced by PERSISTENT_MATCH and + PERSISTENT_MISMATCH. + </int> + <int value="4" label="NO_COOKIE_STORE"/> + <int value="5" label="NO_CHANNEL_ID_STORE"/> + <int value="6" label="KNOWN_MISMATCH"/> + <int value="7" label="EPHEMERAL_MATCH"/> + <int value="8" label="EPHEMERAL_MISMATCH"/> + <int value="9" label="PERSISTENT_MATCH"/> + <int value="10" label="PERSISTENT_MISMATCH"/> +</enum> + <enum name="TokenBinding.Support" type="int"> <int value="0" label="DISABLED"/> <int value="1" label="CLIENT_ONLY"/> @@ -84221,6 +84295,9 @@ </histogram_suffixes> <histogram_suffixes name="AttemptResultCode"> + <obsolete> + Deprecated 2016/03. The async set-as-default experiments are finished. + </obsolete> <suffix name="Success"/> <suffix name="Failure"/> <suffix name="Abandoned"/>
diff --git a/tools/perf/benchmarks/v8.py b/tools/perf/benchmarks/v8.py index 1215877..aebdf64 100644 --- a/tools/perf/benchmarks/v8.py +++ b/tools/perf/benchmarks/v8.py
@@ -118,3 +118,22 @@ @classmethod def ShouldTearDownStateAfterEachStoryRun(cls): return True + + +class V8TodoMVC(perf_benchmark.PerfBenchmark): + """Measures V8 Execution metrics on the TodoMVC examples.""" + page_set = page_sets.TodoMVCPageSet + + def CreateTimelineBasedMeasurementOptions(self): + category_filter = tracing_category_filter.TracingCategoryFilter('v8') + options = timeline_based_measurement.Options(category_filter) + options.SetLegacyTimelineBasedMetrics([v8_execution.V8ExecutionMetric()]) + return options + + @classmethod + def Name(cls): + return 'v8.todomvc' + + @classmethod + def ShouldTearDownStateAfterEachStoryRun(cls): + return True
diff --git a/tools/perf/page_sets/blink_memory_mobile.py b/tools/perf/page_sets/blink_memory_mobile.py index cec25c8..40b5f13 100644 --- a/tools/perf/page_sets/blink_memory_mobile.py +++ b/tools/perf/page_sets/blink_memory_mobile.py
@@ -117,7 +117,7 @@ self.AddStory(BlinkMemoryMobilePage( 'https://en.blog.wordpress.com/2012/09/04/freshly-pressed-editors-picks-for-august-2012/', page_set=self, - name='Wordpress')) + name='Wordpress')) # Why: Renderer memory usage is high. self.AddStory(BlinkMemoryMobilePage(
diff --git a/tools/perf/page_sets/data/todomvc.json b/tools/perf/page_sets/data/todomvc.json new file mode 100644 index 0000000..995e6d2 --- /dev/null +++ b/tools/perf/page_sets/data/todomvc.json
@@ -0,0 +1,16 @@ +{ + "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", + "archives": { + "todomvc_000.wpr": [ + "Dart", + "Ember.js", + "React", + "AngularJS", + "Closure", + "Backbone.js", + "Vanilla JS", + "Polymer", + "GWT" + ] + } +} \ No newline at end of file
diff --git a/tools/perf/page_sets/data/todomvc_000.wpr.sha1 b/tools/perf/page_sets/data/todomvc_000.wpr.sha1 new file mode 100644 index 0000000..c5da61d --- /dev/null +++ b/tools/perf/page_sets/data/todomvc_000.wpr.sha1
@@ -0,0 +1 @@ +e6c75c01e8343d921f56f21dab28a85beaf9ab78 \ No newline at end of file
diff --git a/tools/perf/page_sets/google_pages.py b/tools/perf/page_sets/google_pages.py index 6cca0ebf..fc52d69 100644 --- a/tools/perf/page_sets/google_pages.py +++ b/tools/perf/page_sets/google_pages.py
@@ -21,7 +21,6 @@ url=url, page_set=page_set, name=name, credentials_path='data/credentials.json', shared_page_state_class=shared_page_state_class) - self.archive_data_file = 'data/google_pages.json' self.credentials = credentials self.script_to_evaluate_on_commit = _DeterministicPerformanceCounters()
diff --git a/tools/perf/page_sets/intl_ja_zh.py b/tools/perf/page_sets/intl_ja_zh.py index 18ba26c..984f8b8 100644 --- a/tools/perf/page_sets/intl_ja_zh.py +++ b/tools/perf/page_sets/intl_ja_zh.py
@@ -12,7 +12,6 @@ super(IntlJaZhPage, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state.SharedDesktopPageState) - self.archive_data_file = 'data/intl_ja_zh.json' class IntlJaZhPageSet(story.StorySet):
diff --git a/tools/perf/page_sets/intl_ko_th_vi.py b/tools/perf/page_sets/intl_ko_th_vi.py index 4f26c14..0615044 100644 --- a/tools/perf/page_sets/intl_ko_th_vi.py +++ b/tools/perf/page_sets/intl_ko_th_vi.py
@@ -12,7 +12,6 @@ super(IntlKoThViPage, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state.SharedDesktopPageState) - self.archive_data_file = 'data/intl_ko_th_vi.json' class IntlKoThViPageSet(story.StorySet):
diff --git a/tools/perf/page_sets/key_search_mobile.py b/tools/perf/page_sets/key_search_mobile.py index be5c04b..595630f3 100644 --- a/tools/perf/page_sets/key_search_mobile.py +++ b/tools/perf/page_sets/key_search_mobile.py
@@ -12,7 +12,6 @@ super(KeySearchMobilePage, self).__init__( url=url, page_set=page_set, credentials_path = 'data/credentials.json', shared_page_state_class=shared_page_state.SharedMobilePageState) - self.archive_data_file = 'data/key_search_mobile.json' def RunPageInteractions(self, action_runner): with action_runner.CreateGestureInteraction('ScrollAction'):
diff --git a/tools/perf/page_sets/memory_health_story.py b/tools/perf/page_sets/memory_health_story.py index aad57d4..e9e912d9 100644 --- a/tools/perf/page_sets/memory_health_story.py +++ b/tools/perf/page_sets/memory_health_story.py
@@ -36,7 +36,6 @@ super(ForegroundPage, self).__init__( url=url, page_set=story_set, name=name, shared_page_state_class=shared_page_state.SharedMobilePageState) - self.archive_data_file = story_set.archive_data_file def _TakeMemoryMeasurement(self, action_runner, phase): action_runner.Wait(1) # See crbug.com/540022#c17.
diff --git a/tools/perf/page_sets/pathological_mobile_sites.py b/tools/perf/page_sets/pathological_mobile_sites.py index aeb77ca..9ccb7d6 100644 --- a/tools/perf/page_sets/pathological_mobile_sites.py +++ b/tools/perf/page_sets/pathological_mobile_sites.py
@@ -12,7 +12,6 @@ super(PathologicalMobileSitesPage, self).__init__( url=url, page_set=page_set, credentials_path='data/credentials.json', shared_page_state_class=shared_page_state.SharedMobilePageState) - self.archive_data_file = 'data/pathological_mobile_sites.json' def RunPageInteractions(self, action_runner): with action_runner.CreateGestureInteraction('ScrollAction'):
diff --git a/tools/perf/page_sets/service_worker_micro_benchmark.py b/tools/perf/page_sets/service_worker_micro_benchmark.py index c1e9758b..93f8e35 100644 --- a/tools/perf/page_sets/service_worker_micro_benchmark.py +++ b/tools/perf/page_sets/service_worker_micro_benchmark.py
@@ -6,9 +6,6 @@ from telemetry import story -archive_data_file_path = 'data/service_worker_micro_benchmark.json' - - class ServiceWorkerBenchmarkPage(page.Page): """Page for workload to measure some specific functions in JS""" @@ -22,7 +19,7 @@ def __init__(self): super(ServiceWorkerMicroBenchmarkPageSet, self).__init__( - archive_data_file=archive_data_file_path, + archive_data_file='data/service_worker_micro_benchmark.json', cloud_storage_bucket=story.PUBLIC_BUCKET) # pylint: disable=line-too-long
diff --git a/tools/perf/page_sets/simple_mobile_sites.py b/tools/perf/page_sets/simple_mobile_sites.py index 9f477cbe..7957288 100644 --- a/tools/perf/page_sets/simple_mobile_sites.py +++ b/tools/perf/page_sets/simple_mobile_sites.py
@@ -14,7 +14,6 @@ page_set=page_set, shared_page_state_class=shared_page_state.Shared10InchTabletPageState, credentials_path='data/credentials.json') - self.archive_data_file = 'data/simple_mobile_sites.json' def RunNavigateSteps(self, action_runner): super(SimplePage, self).RunNavigateSteps(action_runner)
diff --git a/tools/perf/page_sets/todomvc.py b/tools/perf/page_sets/todomvc.py new file mode 100644 index 0000000..5536c83 --- /dev/null +++ b/tools/perf/page_sets/todomvc.py
@@ -0,0 +1,44 @@ +# 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. + +from telemetry.page import page as page_module +from telemetry.page import shared_page_state +from telemetry import story + + +URL_LIST = [ + ('Polymer', 'http://todomvc.com/examples/polymer'), + ('AngularJS', 'http://todomvc.com/examples/angularjs'), + ('React', 'http://todomvc.com/examples/react'), + ('Backbone.js', 'http://todomvc.com/examples/backbone'), + ('Ember.js', 'http://todomvc.com/examples/emberjs'), + ('Closure', 'http://todomvc.com/examples/closure'), + ('GWT', 'http://todomvc.com/examples/gwt'), + ('Dart', 'http://todomvc.com/examples/vanilladart/build/web'), + ('Vanilla JS', 'http://todomvc.com/examples/vanillajs'), +] + + +class TodoMVCPage(page_module.Page): + + def __init__(self, url, page_set, name): + super(TodoMVCPage, self).__init__( + url=url, page_set=page_set, name=name, + shared_page_state_class=shared_page_state.SharedDesktopPageState) + + def RunPageInteractions(self, action_runner): + pass + + +class TodoMVCPageSet(story.StorySet): + + """ TodoMVC examples """ + + def __init__(self): + super(TodoMVCPageSet, self).__init__( + archive_data_file='data/todomvc.json', + cloud_storage_bucket=story.PUBLIC_BUCKET) + + for name, url in URL_LIST: + self.AddStory(TodoMVCPage(url, self, name))
diff --git a/tools/perf/page_sets/top_25_repaint.py b/tools/perf/page_sets/top_25_repaint.py index 3266033..69bfc53 100644 --- a/tools/perf/page_sets/top_25_repaint.py +++ b/tools/perf/page_sets/top_25_repaint.py
@@ -11,14 +11,11 @@ class TopRepaintPage(page_module.Page): - def __init__(self, url, page_set, mode, width, height, name='', - credentials=None): + def __init__(self, url, page_set, mode, width, height, name=''): super(TopRepaintPage, self).__init__( url=url, page_set=page_set, name=name, credentials_path='data/credentials.json', shared_page_state_class=shared_page_state.SharedDesktopPageState) - self.archive_data_file = 'data/top_25_repaint.json' - self.credentials = credentials self._mode = mode self._width = width self._height = height
diff --git a/tools/perf/page_sets/tough_pinch_zoom_cases.py b/tools/perf/page_sets/tough_pinch_zoom_cases.py index 7dac307..2aa0151 100644 --- a/tools/perf/page_sets/tough_pinch_zoom_cases.py +++ b/tools/perf/page_sets/tough_pinch_zoom_cases.py
@@ -13,7 +13,6 @@ url=url, page_set=page_set, name=name, shared_page_state_class=shared_page_state.SharedDesktopPageState, credentials_path = 'data/credentials.json') - self.archive_data_file = 'data/tough_pinch_zoom_cases.json' self.target_scale_factor = page_set.target_scale_factor def RunPinchGesture(self, action_runner, left_anchor_ratio=0.5,
diff --git a/tools/perf/page_sets/typical_25.py b/tools/perf/page_sets/typical_25.py index a9fba3c8..04177d0aa 100644 --- a/tools/perf/page_sets/typical_25.py +++ b/tools/perf/page_sets/typical_25.py
@@ -43,7 +43,6 @@ super(Typical25Page, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state_class) - self.archive_data_file = 'data/typical_25.json' self._run_no_page_interactions = run_no_page_interactions def RunPageInteractions(self, action_runner):
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn index 64c008d..377f53f 100644 --- a/ui/accessibility/BUILD.gn +++ b/ui/accessibility/BUILD.gn
@@ -74,6 +74,7 @@ public_deps = [ ":ax_gen", "//base", + "//base:i18n", "//ui/base", "//ui/gfx", "//ui/gfx/geometry",
diff --git a/ui/accessibility/accessibility.gyp b/ui/accessibility/accessibility.gyp index f32ca767..9d25f32 100644 --- a/ui/accessibility/accessibility.gyp +++ b/ui/accessibility/accessibility.gyp
@@ -17,6 +17,7 @@ 'hard_dependency': 1, 'dependencies': [ '../../base/base.gyp:base', + '../../base/base.gyp:base_i18n', '../gfx/gfx.gyp:gfx', '../gfx/gfx.gyp:gfx_geometry', 'ax_gen',
diff --git a/ui/accessibility/ax_text_utils.cc b/ui/accessibility/ax_text_utils.cc index 1e68559..698e53b 100644 --- a/ui/accessibility/ax_text_utils.cc +++ b/ui/accessibility/ax_text_utils.cc
@@ -4,6 +4,7 @@ #include "ui/accessibility/ax_text_utils.h" +#include "base/i18n/break_iterator.h" #include "base/logging.h" #include "base/strings/string_util.h" @@ -25,7 +26,16 @@ return start_offset + 1; else return start_offset; - } else if (boundary == LINE_BOUNDARY) { + } + + base::i18n::BreakIterator word_iter(text, + base::i18n::BreakIterator::BREAK_WORD); + if (boundary == WORD_BOUNDARY) { + if (!word_iter.Init()) + return start_offset; + } + + if (boundary == LINE_BOUNDARY) { if (direction == FORWARDS_DIRECTION) { for (size_t j = 0; j < line_breaks.size(); ++j) { size_t line_break = line_breaks[j] >= 0 ? line_breaks[j] : 0; @@ -62,8 +72,12 @@ NOTREACHED(); // These are handled above. break; case WORD_BOUNDARY: - if (base::IsUnicodeWhitespace(text[pos])) - return result; + if (word_iter.IsStartOfWord(result)) { + // If we are searching forward and we are still at the start offset, + // we need to find the next word. + if (direction == BACKWARDS_DIRECTION || result != start_offset) + return result; + } break; case PARAGRAPH_BOUNDARY: if (text[pos] == '\n') @@ -89,4 +103,4 @@ } } -} // Namespace ui +} // namespace ui
diff --git a/ui/accessibility/ax_text_utils_unittest.cc b/ui/accessibility/ax_text_utils_unittest.cc index 1c2a4a1e..2c7f491 100644 --- a/ui/accessibility/ax_text_utils_unittest.cc +++ b/ui/accessibility/ax_text_utils_unittest.cc
@@ -10,6 +10,49 @@ namespace ui { +TEST(AXTextUtils, FindAccessibleTextBoundaryWord) { + const base::string16 text = + base::UTF8ToUTF16("Hello there.This/is\ntesting."); + const size_t text_length = text.length(); + std::vector<int> line_start_offsets; + line_start_offsets.push_back(19); + size_t result; + + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 0, FORWARDS_DIRECTION); + EXPECT_EQ(6UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 5, BACKWARDS_DIRECTION); + EXPECT_EQ(0UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 6, FORWARDS_DIRECTION); + EXPECT_EQ(12UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 11, BACKWARDS_DIRECTION); + EXPECT_EQ(6UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 12, BACKWARDS_DIRECTION); + EXPECT_EQ(12UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 15, FORWARDS_DIRECTION); + EXPECT_EQ(17UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 15, BACKWARDS_DIRECTION); + EXPECT_EQ(12UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 16, FORWARDS_DIRECTION); + EXPECT_EQ(17UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 17, FORWARDS_DIRECTION); + EXPECT_EQ(20UL, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + 20, FORWARDS_DIRECTION); + EXPECT_EQ(text_length, result); + result = FindAccessibleTextBoundary(text, line_start_offsets, WORD_BOUNDARY, + text_length, BACKWARDS_DIRECTION); + EXPECT_EQ(20UL, result); +} + TEST(AXTextUtils, FindAccessibleTextBoundaryLine) { const base::string16 text = base::UTF8ToUTF16("Line 1.\nLine 2\n\t"); const size_t text_length = text.length(); @@ -18,7 +61,6 @@ line_start_offsets.push_back(15); size_t result; - // Basic cases. result = FindAccessibleTextBoundary(text, line_start_offsets, LINE_BOUNDARY, 5, FORWARDS_DIRECTION); @@ -30,9 +72,7 @@ 10, FORWARDS_DIRECTION); EXPECT_EQ(15UL, result); - // Edge cases. - result = FindAccessibleTextBoundary(text, line_start_offsets, LINE_BOUNDARY, text_length, BACKWARDS_DIRECTION); EXPECT_EQ(15UL, result); @@ -68,4 +108,4 @@ EXPECT_EQ(text_length, result); } -} // Namespace ui. +} // namespace ui
diff --git a/ui/android/java/src/org/chromium/ui/DropdownAdapter.java b/ui/android/java/src/org/chromium/ui/DropdownAdapter.java index ecfb8bfcc..ecad3ce 100644 --- a/ui/android/java/src/org/chromium/ui/DropdownAdapter.java +++ b/ui/android/java/src/org/chromium/ui/DropdownAdapter.java
@@ -77,18 +77,20 @@ } } + DropdownItem item = getItem(position); + // Note: trying to set the height of the root LinearLayout breaks accessibility, // so we have to adjust the height of this LinearLayout that wraps the TextViews instead. // If you need to modify this layout, don't forget to test it with TalkBack and make sure // it doesn't regress. // http://crbug.com/429364 View wrapper = layout.findViewById(R.id.dropdown_label_wrapper); - wrapper.setLayoutParams( - new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, height, 1)); + if (item.isMultilineLabel()) height = LayoutParams.WRAP_CONTENT; + wrapper.setLayoutParams(new LinearLayout.LayoutParams(0, height, 1)); - DropdownItem item = getItem(position); TextView labelView = (TextView) layout.findViewById(R.id.dropdown_label); labelView.setText(item.getLabel()); + labelView.setSingleLine(!item.isMultilineLabel()); labelView.setEnabled(item.isEnabled()); if (item.isGroupHeader()) {
diff --git a/ui/android/java/src/org/chromium/ui/DropdownItem.java b/ui/android/java/src/org/chromium/ui/DropdownItem.java index 4b89a498..dc4468c 100644 --- a/ui/android/java/src/org/chromium/ui/DropdownItem.java +++ b/ui/android/java/src/org/chromium/ui/DropdownItem.java
@@ -31,4 +31,8 @@ * Returns true if the item should be a group header in the dropdown. */ boolean isGroupHeader(); + /** + * Returns whether the label should be displayed over multiple lines. + */ + boolean isMultilineLabel(); }
diff --git a/ui/android/java/src/org/chromium/ui/autofill/AutofillSuggestion.java b/ui/android/java/src/org/chromium/ui/autofill/AutofillSuggestion.java index 9403658..475cedcb 100644 --- a/ui/android/java/src/org/chromium/ui/autofill/AutofillSuggestion.java +++ b/ui/android/java/src/org/chromium/ui/autofill/AutofillSuggestion.java
@@ -15,6 +15,7 @@ private final int mIconId; private final int mSuggestionId; private final boolean mDeletable; + private final boolean mIsMultilineLabel; /** * Constructs a Autofill suggestion container. @@ -22,14 +23,16 @@ * @param sublabel The describing sublabel of the Autofill suggestion. * @param suggestionId The type of suggestion. * @param deletable Whether the item can be deleted by the user. + * @param multilineLabel Whether the label is displayed over multiple lines. */ - public AutofillSuggestion( - String label, String sublabel, int iconId, int suggestionId, boolean deletable) { + public AutofillSuggestion(String label, String sublabel, int iconId, int suggestionId, + boolean deletable, boolean multilineLabel) { mLabel = label; mSublabel = sublabel; mIconId = iconId; mSuggestionId = suggestionId; mDeletable = deletable; + mIsMultilineLabel = multilineLabel; } @Override @@ -57,6 +60,11 @@ return false; } + @Override + public boolean isMultilineLabel() { + return mIsMultilineLabel; + } + public int getSuggestionId() { return mSuggestionId; }
diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java index e8a52fa..b519c3a 100644 --- a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java +++ b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
@@ -53,10 +53,13 @@ /** * Calculates the minimum device width in dp. This method is not affected by Android N * multi-window. - * @param context Android's context. + * + * @param context {@link Context} used to get the Application Context. * @return The smaller of device width and height in dp. */ public static int getSmallestDeviceWidthDp(Context context) { + assert context.getApplicationContext() != null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { DisplayMetrics metrics = new DisplayMetrics(); // The Application Context must be used instead of the regular Context, because
diff --git a/ui/base/l10n/l10n_util_collator.h b/ui/base/l10n/l10n_util_collator.h index d2b95f26..423f17a 100644 --- a/ui/base/l10n/l10n_util_collator.h +++ b/ui/base/l10n/l10n_util_collator.h
@@ -22,10 +22,7 @@ // Used by SortStringsUsingMethod. Invokes a method on the objects passed to // operator (), comparing the string results using a collator. template <class T, class Method> -class StringMethodComparatorWithCollator - : public std::binary_function<const base::string16&, - const base::string16&, - bool> { +class StringMethodComparatorWithCollator { public: StringMethodComparatorWithCollator(icu::Collator* collator, Method method) : collator_(collator), @@ -46,10 +43,7 @@ // Used by SortStringsUsingMethod. Invokes a method on the objects passed to // operator (), comparing the string results using <. template <class T, class Method> -class StringMethodComparator - : public std::binary_function<const base::string16&, - const base::string16&, - bool> { +class StringMethodComparator { public: explicit StringMethodComparator(Method method) : method_(method) { } @@ -88,9 +82,7 @@ // const base::string16& GetStringKey() const; // This uses the locale specified in the constructor. template <class Element> -class StringComparator : public std::binary_function<const Element&, - const Element&, - bool> { +class StringComparator { public: explicit StringComparator(icu::Collator* collator) : collator_(collator) { }
diff --git a/ui/events/blink/blink_event_util.cc b/ui/events/blink/blink_event_util.cc index 00bff44e..135c58e9 100644 --- a/ui/events/blink/blink_event_util.cc +++ b/ui/events/blink/blink_event_util.cc
@@ -23,6 +23,7 @@ using blink::WebGestureEvent; using blink::WebInputEvent; +using blink::WebPointerProperties; using blink::WebTouchEvent; using blink::WebTouchPoint; @@ -81,30 +82,11 @@ return WebTouchPoint::StateUndefined; } -WebTouchPoint::PointerType ToWebTouchPointPointerType(const MotionEvent& event, - size_t pointer_index) { - switch (event.GetToolType(pointer_index)) { - case MotionEvent::TOOL_TYPE_UNKNOWN: - return WebTouchPoint::PointerType::Unknown; - case MotionEvent::TOOL_TYPE_FINGER: - return WebTouchPoint::PointerType::Touch; - case MotionEvent::TOOL_TYPE_STYLUS: - return WebTouchPoint::PointerType::Pen; - case MotionEvent::TOOL_TYPE_MOUSE: - return WebTouchPoint::PointerType::Mouse; - case MotionEvent::TOOL_TYPE_ERASER: - return WebTouchPoint::PointerType::Unknown; - } - NOTREACHED() << "Invalid MotionEvent::ToolType = " - << event.GetToolType(pointer_index); - return WebTouchPoint::PointerType::Unknown; -} - WebTouchPoint CreateWebTouchPoint(const MotionEvent& event, size_t pointer_index) { WebTouchPoint touch; touch.id = event.GetPointerId(pointer_index); - touch.pointerType = ToWebTouchPointPointerType(event, pointer_index); + touch.pointerType = ToWebPointerType(event.GetToolType(pointer_index)); touch.state = ToWebTouchPointState(event, pointer_index); touch.position.x = event.GetX(pointer_index); touch.position.y = event.GetY(pointer_index); @@ -462,4 +444,22 @@ return scaled_event; } +WebPointerProperties::PointerType ToWebPointerType( + MotionEvent::ToolType tool_type) { + switch (tool_type) { + case MotionEvent::TOOL_TYPE_UNKNOWN: + return WebPointerProperties::PointerType::Unknown; + case MotionEvent::TOOL_TYPE_FINGER: + return WebPointerProperties::PointerType::Touch; + case MotionEvent::TOOL_TYPE_STYLUS: + return WebPointerProperties::PointerType::Pen; + case MotionEvent::TOOL_TYPE_MOUSE: + return WebPointerProperties::PointerType::Mouse; + case MotionEvent::TOOL_TYPE_ERASER: + return WebPointerProperties::PointerType::Unknown; + } + NOTREACHED() << "Invalid MotionEvent::ToolType = " << tool_type; + return WebPointerProperties::PointerType::Unknown; +} + } // namespace ui
diff --git a/ui/events/blink/blink_event_util.h b/ui/events/blink/blink_event_util.h index a320c23..bee5c7a 100644 --- a/ui/events/blink/blink_event_util.h +++ b/ui/events/blink/blink_event_util.h
@@ -6,6 +6,8 @@ #define UI_EVENTS_BLINK_BLINK_EVENT_UTIL_H_ #include "base/memory/scoped_ptr.h" +#include "third_party/WebKit/public/web/WebInputEvent.h" +#include "ui/events/gesture_detection/motion_event.h" namespace base { class TimeDelta; @@ -46,6 +48,9 @@ const blink::WebInputEvent& event, float scale); +blink::WebPointerProperties::PointerType ToWebPointerType( + MotionEvent::ToolType tool_type); + } // namespace ui #endif // UI_EVENTS_BLINK_BLINK_EVENT_UTIL_H_
diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h index ffac1cf..680f6d6 100644 --- a/ui/gl/gl_surface.h +++ b/ui/gl/gl_surface.h
@@ -42,6 +42,7 @@ SURFACE_RGB565, SURFACE_OSMESA_BGRA, SURFACE_OSMESA_RGBA, + SURFACE_SURFACELESS, SURFACE_DEFAULT = SURFACE_ARGB8888 };
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc index a38ada3..502e697 100644 --- a/ui/gl/gl_surface_egl.cc +++ b/ui/gl/gl_surface_egl.cc
@@ -283,6 +283,10 @@ } #endif + EGLint surface_type = (format == GLSurface::SURFACE_SURFACELESS) + ? EGL_DONT_CARE + : EGL_WINDOW_BIT | EGL_PBUFFER_BIT; + EGLint config_attribs_8888[] = { EGL_BUFFER_SIZE, buffer_size, EGL_ALPHA_SIZE, alpha_size, @@ -290,7 +294,7 @@ EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_RENDERABLE_TYPE, renderable_type, - EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT, + EGL_SURFACE_TYPE, surface_type, EGL_NONE }; @@ -301,7 +305,7 @@ EGL_GREEN_SIZE, 6, EGL_RED_SIZE, 5, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT, + EGL_SURFACE_TYPE, surface_type, EGL_NONE }; if (format == GLSurface::SURFACE_RGB565) { @@ -436,8 +440,7 @@ } } -GLSurfaceEGL::GLSurfaceEGL() : - config_(nullptr) {} +GLSurfaceEGL::GLSurfaceEGL() {} bool GLSurfaceEGL::InitializeOneOff() { static bool initialized = false; @@ -1072,6 +1075,11 @@ SurfacelessEGL::SurfacelessEGL(const gfx::Size& size) : size_(size) { + format_ = GLSurface::SURFACE_SURFACELESS; +} + +bool SurfacelessEGL::Initialize() { + return Initialize(SURFACE_SURFACELESS); } bool SurfacelessEGL::Initialize(GLSurface::Format format) {
diff --git a/ui/gl/gl_surface_egl.h b/ui/gl/gl_surface_egl.h index 174715d3..6d72e9a4 100644 --- a/ui/gl/gl_surface_egl.h +++ b/ui/gl/gl_surface_egl.h
@@ -72,8 +72,8 @@ protected: ~GLSurfaceEGL() override; - EGLConfig config_; - GLSurface::Format format_; + EGLConfig config_ = nullptr; + GLSurface::Format format_ = GLSurface::SURFACE_DEFAULT; private: DISALLOW_COPY_AND_ASSIGN(GLSurfaceEGL); @@ -188,6 +188,7 @@ explicit SurfacelessEGL(const gfx::Size& size); // Implement GLSurface. + bool Initialize() override; bool Initialize(GLSurface::Format format) override; void Destroy() override; bool IsOffscreen() override;
diff --git a/ui/gl/gl_surface_ozone.cc b/ui/gl/gl_surface_ozone.cc index 2ca519d..d28d081 100644 --- a/ui/gl/gl_surface_ozone.cc +++ b/ui/gl/gl_surface_ozone.cc
@@ -55,6 +55,15 @@ return eglGetConfigAttrib(display, config, attribute, value); } +// Populates EglConfigCallbacks with appropriate callbacks. +ui::EglConfigCallbacks GetEglConfigCallbacks(EGLDisplay display) { + ui::EglConfigCallbacks callbacks; + callbacks.choose_config = base::Bind(EglChooseConfig, display); + callbacks.get_config_attribute = base::Bind(EglGetConfigAttribute, display); + callbacks.get_last_error_string = base::Bind(&ui::GetLastEGLErrorString); + return callbacks; +} + void WaitForFence(EGLDisplay display, EGLSyncKHR fence) { eglClientWaitSyncKHR(display, fence, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR); @@ -137,14 +146,8 @@ EGLConfig GLSurfaceOzoneEGL::GetConfig() { if (!config_) { - // Setup callbacks for configuring EGL on platform. - EGLDisplay display = GetDisplay(); - ui::EglConfigCallbacks egl; - egl.choose_config = base::Bind(EglChooseConfig, display); - egl.get_config_attribute = base::Bind(EglGetConfigAttribute, display); - egl.get_last_error_string = base::Bind(&ui::GetLastEGLErrorString); - - config_ = ozone_surface_->GetEGLSurfaceConfig(egl); + ui::EglConfigCallbacks callbacks = GetEglConfigCallbacks(GetDisplay()); + config_ = ozone_surface_->GetEGLSurfaceConfig(callbacks); } if (config_) return config_; @@ -208,6 +211,7 @@ int width, int height, const SwapCompletionCallback& callback) override; + EGLConfig GetConfig() override; protected: struct PendingFrame { @@ -399,6 +403,16 @@ SwapBuffersAsync(callback); } +EGLConfig GLSurfaceOzoneSurfaceless::GetConfig() { + if (!config_) { + ui::EglConfigCallbacks callbacks = GetEglConfigCallbacks(GetDisplay()); + config_ = ozone_surface_->GetEGLSurfaceConfig(callbacks); + } + if (config_) + return config_; + return SurfacelessEGL::GetConfig(); +} + GLSurfaceOzoneSurfaceless::~GLSurfaceOzoneSurfaceless() { Destroy(); // The EGL surface must be destroyed before SurfaceOzone. }
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator.h b/ui/ozone/platform/drm/gpu/drm_overlay_validator.h index 4ff1f78a..29b5235 100644 --- a/ui/ozone/platform/drm/gpu/drm_overlay_validator.h +++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator.h
@@ -66,11 +66,7 @@ ScanoutBufferGenerator* buffer_generator_; // Not owned. // List of all configurations which have been validated. - base::MRUCacheBase<OverlayPlaneList, - OverlayHintsList, - std::less<OverlayPlaneList>, - base::MRUCacheNullDeletor<OverlayHintsList>> - overlay_hints_cache_; + base::MRUCache<OverlayPlaneList, OverlayHintsList> overlay_hints_cache_; DISALLOW_COPY_AND_ASSIGN(DrmOverlayValidator); };
diff --git a/ui/ozone/platform/drm/host/drm_overlay_manager.h b/ui/ozone/platform/drm/host/drm_overlay_manager.h index 7dc667a9..6c364d0e 100644 --- a/ui/ozone/platform/drm/host/drm_overlay_manager.h +++ b/ui/ozone/platform/drm/host/drm_overlay_manager.h
@@ -55,11 +55,7 @@ // List of all OverlayCheck_Params which have been validated in GPU side. // Value is set to true if we are waiting for validation results from GPU. - base::MRUCacheBase<std::vector<OverlayCheck_Params>, - bool, - std::less<std::vector<OverlayCheck_Params>>, - base::MRUCacheNullDeletor<bool>> - cache_; + base::MRUCache<std::vector<OverlayCheck_Params>, bool> cache_; DISALLOW_COPY_AND_ASSIGN(DrmOverlayManager); };
diff --git a/ui/strings/translations/ui_strings_zh-CN.xtb b/ui/strings/translations/ui_strings_zh-CN.xtb index 075fdbb..4bbe719 100644 --- a/ui/strings/translations/ui_strings_zh-CN.xtb +++ b/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -144,6 +144,6 @@ <translation id="9044832324875206639">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation> <translation id="9170848237812810038">撤消(&U)</translation> <translation id="928465423150706909">移至行末</translation> -<translation id="932327136139879170">家庭</translation> +<translation id="932327136139879170">首页</translation> <translation id="945522503751344254">发送反馈</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/views/border.cc b/ui/views/border.cc index 9b87180e..a7a1144 100644 --- a/ui/views/border.cc +++ b/ui/views/border.cc
@@ -99,7 +99,7 @@ } gfx::Insets RoundedRectBorder::GetInsets() const { - return gfx::Insets(thickness_, thickness_, thickness_, thickness_); + return gfx::Insets(thickness_); } gfx::Size RoundedRectBorder::GetMinimumSize() const { @@ -184,8 +184,7 @@ // static scoped_ptr<Border> Border::CreateSolidBorder(int thickness, SkColor color) { - return make_scoped_ptr(new SolidSidedBorder( - gfx::Insets(thickness, thickness, thickness, thickness), color)); + return make_scoped_ptr(new SolidSidedBorder(gfx::Insets(thickness), color)); } // static
diff --git a/ui/views/bubble/bubble_border.cc b/ui/views/bubble/bubble_border.cc index d17b13d..ec7fc07 100644 --- a/ui/views/bubble/bubble_border.cc +++ b/ui/views/bubble/bubble_border.cc
@@ -254,7 +254,7 @@ // The insets contain the stroke and shadow pixels outside the bubble fill. const int inset = GetBorderThickness(); if ((arrow_paint_type_ == PAINT_NONE) || !has_arrow(arrow_)) - return gfx::Insets(inset, inset, inset, inset); + return gfx::Insets(inset); int first_inset = inset; int second_inset = std::max(inset, images_->arrow_thickness);
diff --git a/ui/views/bubble/bubble_delegate.cc b/ui/views/bubble/bubble_delegate.cc index 698c4a4a..5850c3f 100644 --- a/ui/views/bubble/bubble_delegate.cc +++ b/ui/views/bubble/bubble_delegate.cc
@@ -317,10 +317,7 @@ void BubbleDelegateView::HandleVisibilityChanged(Widget* widget, bool visible) { if (widget == GetWidget() && anchor_widget() && anchor_widget()->GetTopLevelWidget()) { - if (visible) - anchor_widget()->GetTopLevelWidget()->DisableInactiveRendering(); - else - anchor_widget()->GetTopLevelWidget()->EnableInactiveRendering(); + anchor_widget()->GetTopLevelWidget()->SetAlwaysRenderAsActive(visible); } // Fire AX_EVENT_ALERT for bubbles marked as AX_ROLE_ALERT_DIALOG; this
diff --git a/ui/views/bubble/bubble_dialog_delegate.cc b/ui/views/bubble/bubble_dialog_delegate.cc index a893bcf2..dfbf2eaa 100644 --- a/ui/views/bubble/bubble_dialog_delegate.cc +++ b/ui/views/bubble/bubble_dialog_delegate.cc
@@ -320,10 +320,7 @@ bool visible) { if (widget == GetWidget() && anchor_widget() && anchor_widget()->GetTopLevelWidget()) { - if (visible) - anchor_widget()->GetTopLevelWidget()->DisableInactiveRendering(); - else - anchor_widget()->GetTopLevelWidget()->EnableInactiveRendering(); + anchor_widget()->GetTopLevelWidget()->SetAlwaysRenderAsActive(visible); } // Fire AX_EVENT_ALERT for bubbles marked as AX_ROLE_ALERT_DIALOG; this
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc index 552a1342..adaffa5 100644 --- a/ui/views/bubble/bubble_frame_view_unittest.cc +++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -64,8 +64,7 @@ class TestBubbleFrameView : public BubbleFrameView { public: TestBubbleFrameView(ViewsTestBase* test_base) - : BubbleFrameView(gfx::Insets(), - gfx::Insets(kMargin, kMargin, kMargin, kMargin)), + : BubbleFrameView(gfx::Insets(), gfx::Insets(kMargin)), test_base_(test_base), available_bounds_(gfx::Rect(0, 0, 1000, 1000)) { SetBubbleBorder(scoped_ptr<BubbleBorder>(
diff --git a/ui/views/bubble/bubble_window_targeter_unittest.cc b/ui/views/bubble/bubble_window_targeter_unittest.cc index 8ae398f..f40aa326 100644 --- a/ui/views/bubble/bubble_window_targeter_unittest.cc +++ b/ui/views/bubble/bubble_window_targeter_unittest.cc
@@ -100,7 +100,7 @@ EXPECT_EQ(bubble_window, targeter->FindTargetForEvent(root, &move1)); } { - bubble_delegate()->set_margins(gfx::Insets(20, 20, 20, 20)); + bubble_delegate()->set_margins(gfx::Insets(20)); ui::MouseEvent move1(ui::ET_MOUSE_MOVED, bubble_bounds.origin(), bubble_bounds.origin(), ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE); @@ -110,7 +110,7 @@ bubble_window->SetEventTargeter(scoped_ptr<ui::EventTargeter>( new BubbleWindowTargeter(bubble_delegate()))); { - bubble_delegate()->set_margins(gfx::Insets(20, 20, 20, 20)); + bubble_delegate()->set_margins(gfx::Insets(20)); ui::MouseEvent move1(ui::ET_MOUSE_MOVED, bubble_bounds.origin(), bubble_bounds.origin(), ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE);
diff --git a/ui/views/controls/button/blue_button.cc b/ui/views/controls/button/blue_button.cc index 3740bb11..12ea638 100644 --- a/ui/views/controls/button/blue_button.cc +++ b/ui/views/controls/button/blue_button.cc
@@ -53,7 +53,7 @@ scoped_ptr<LabelButtonBorder> BlueButton::CreateDefaultBorder() const { // Insets for splitting the images. - const gfx::Insets insets(5, 5, 5, 5); + const gfx::Insets insets(5); scoped_ptr<LabelButtonAssetBorder> button_border( new LabelButtonAssetBorder(style())); ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
diff --git a/ui/views/controls/button/label_button_border.cc b/ui/views/controls/button/label_button_border.cc index c93215e2..f90b8fa 100644 --- a/ui/views/controls/button/label_button_border.cc +++ b/ui/views/controls/button/label_button_border.cc
@@ -69,13 +69,10 @@ } LabelButtonAssetBorder::LabelButtonAssetBorder(Button::ButtonStyle style) { - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); - const gfx::Insets insets(kButtonInsets, - kButtonInsets, - kButtonInsets, - kButtonInsets); - set_insets(GetDefaultInsetsForStyle(style)); + + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + const gfx::Insets insets(kButtonInsets); if (style == Button::STYLE_BUTTON) { SetPainter(false, Button::STATE_NORMAL, Painter::CreateImagePainter( @@ -116,9 +113,9 @@ Button::ButtonStyle style) { gfx::Insets insets; if (style == Button::STYLE_BUTTON) { - insets = gfx::Insets(8, 13, 8, 13); + insets = gfx::Insets(8, 13); } else if (style == Button::STYLE_TEXTBUTTON) { - insets = gfx::Insets(5, 6, 5, 6); + insets = gfx::Insets(5, 6); } else { NOTREACHED(); }
diff --git a/ui/views/controls/scrollbar/cocoa_scroll_bar.h b/ui/views/controls/scrollbar/cocoa_scroll_bar.h index d3c9ba5f..786c6b1e 100644 --- a/ui/views/controls/scrollbar/cocoa_scroll_bar.h +++ b/ui/views/controls/scrollbar/cocoa_scroll_bar.h
@@ -7,31 +7,49 @@ #include "base/macros.h" #import "base/mac/scoped_nsobject.h" +#include "ui/compositor/layer_animation_observer.h" +#include "ui/gfx/animation/linear_animation.h" #import "ui/views/cocoa/views_scrollbar_bridge.h" #include "ui/views/controls/scrollbar/base_scroll_bar.h" #include "ui/views/views_export.h" namespace views { +class CocoaScrollBarThumb; + // The transparent scrollbar for Mac which overlays its contents. class VIEWS_EXPORT CocoaScrollBar : public BaseScrollBar, - public ViewsScrollbarBridgeDelegate { + public ViewsScrollbarBridgeDelegate, + public ui::ImplicitAnimationObserver, + public gfx::AnimationDelegate { public: explicit CocoaScrollBar(bool horizontal); ~CocoaScrollBar() override; - // Called by CocoaScrollBarThumb when the mouse enters or exits the view. - void OnMouseEnteredScrollbarThumb(const ui::MouseEvent& event); - - // ScrollDelegate: - bool OnScroll(float dx, float dy) override; + // BaseScrollBar: + void ScrollToPosition(int position) override; // ViewsScrollbarBridgeDelegate: void OnScrollerStyleChanged() override; + // View: + bool OnMousePressed(const ui::MouseEvent& event) override; + void OnMouseReleased(const ui::MouseEvent& event) override; + void OnMouseEntered(const ui::MouseEvent& event) override; + void OnMouseExited(const ui::MouseEvent& event) override; + + // ui::ImplicitAnimationObserver: + void OnImplicitAnimationsCompleted() override; + + // gfx::AnimationDelegate: + void AnimationProgressed(const gfx::Animation* animation) override; + // Returns the scroller style. NSScrollerStyle GetScrollerStyle() const { return scroller_style_; } + // Returns true if the opacity is 0.0. + bool IsScrollbarFullyHidden() const; + protected: // BaseScrollBar: gfx::Rect GetTrackBounds() const override; @@ -50,15 +68,45 @@ void ShowScrollbar(); void HideScrollbar(); + // Returns true if the scrollbar is in a hover or pressed state. + bool IsHoverOrPressedState() const; + + // Updates the thickness of the scrollbar according to the current state of + // the expand animation. + void UpdateScrollbarThickness(); + + // Resets the scrolltrack and the thickness if the scrollbar is not hidden + // and is not in a hover/pressed state. + void ResetOverlayScrollbar(); + + // Returns the thickness of the scrollbar. + int ScrollbarThickness() const; + + // Sets the scrolltrack's visibility and then repaints it. + void SetScrolltrackVisible(bool visible); + + // Converts GetThumb() into a CocoaScrollBarThumb object and returns it. + CocoaScrollBarThumb* GetCocoaScrollBarThumb() const; + // Scroller style the scrollbar is using. NSScrollerStyle scroller_style_; // Timer that will start the scrollbar's hiding animation when it reaches 0. base::Timer hide_scrollbar_timer_; + // Linear animation that expands an overlay scrollbar when hovered. + gfx::LinearAnimation expand_animation_; + + // True when the scrollbar is expanded. + bool is_expanded_; + // True when the scrolltrack should be drawn. bool has_scrolltrack_; + // True when the scrollbar has started dragging since it was last shown. + // This is set to false when we begin to hide the scrollbar. + bool did_start_dragging_; + // The bridge for NSScroller. base::scoped_nsobject<ViewsScrollbarBridge> bridge_;
diff --git a/ui/views/controls/scrollbar/cocoa_scroll_bar.mm b/ui/views/controls/scrollbar/cocoa_scroll_bar.mm index 6eb38d4..37e0cb8 100644 --- a/ui/views/controls/scrollbar/cocoa_scroll_bar.mm +++ b/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
@@ -20,20 +20,29 @@ // The length of the fade animation. const int kFadeDurationMs = 240; +// The length of the expand animation. +const int kExpandDurationMs = 120; + // How long we should wait before hiding the scrollbar. const int kScrollbarHideTimeoutMs = 500; -// The width of the scrollbar. -const int kScrollbarWidth = 15; +// How many frames per second to target for the expand animation. +const int kExpandFrameRateHz = 60; -// The width of the scrollbar thumb. -const int kScrollbarThumbWidth = 10; +// The thickness of the normal and expanded scrollbars. +const int kScrollbarThickness = 12; +const int kExpandedScrollbarThickness = 16; + +// The thickness of the scrollbar thumb. +const int kScrollbarThumbThickness = 8; // The width of the scroller track border. const int kScrollerTrackBorderWidth = 1; -// The amount the thumb is inset from both the ends and the sides of the track. -const int kScrollbarThumbInset = 3; +// The amount the thumb is inset from both the ends and the sides of the normal +// and expanded tracks. +const int kScrollbarThumbInset = 2; +const int kExpandedScrollbarThumbInset = 3; // Scrollbar thumb colors. const SkColor kScrollerDefaultThumbColor = SkColorSetARGB(0x38, 0, 0, 0); @@ -47,6 +56,8 @@ const SkColor kScrollerTrackInnerBorderColor = SkColorSetRGB(0xE4, 0xE4, 0xE4); const SkColor kScrollerTrackOuterBorderColor = SkColorSetRGB(0xEF, 0xEF, 0xEF); +} // namespace + ////////////////////////////////////////////////////////////////// // CocoaScrollBarThumb @@ -55,16 +66,27 @@ explicit CocoaScrollBarThumb(CocoaScrollBar* scroll_bar); ~CocoaScrollBarThumb() override; - // Returns true if the thumb is in hover or pressed state. - bool IsStateHoverOrPressed(); + // Returns true if the thumb is in hovered state. + bool IsStateHovered() const; + + // Returns true if the thumb is in pressed state. + bool IsStatePressed() const; protected: // View: gfx::Size GetPreferredSize() const override; void OnPaint(gfx::Canvas* canvas) override; + bool OnMousePressed(const ui::MouseEvent& event) override; + void OnMouseReleased(const ui::MouseEvent& event) override; void OnMouseEntered(const ui::MouseEvent& event) override; + void OnMouseExited(const ui::MouseEvent& event) override; private: + // Converts scroll_bar() into a CocoaScrollBar object and returns it. + CocoaScrollBar* cocoa_scroll_bar() { + return static_cast<CocoaScrollBar*>(scroll_bar()); + } + DISALLOW_COPY_AND_ASSIGN(CocoaScrollBarThumb); }; @@ -80,23 +102,23 @@ CocoaScrollBarThumb::~CocoaScrollBarThumb() {} -bool CocoaScrollBarThumb::IsStateHoverOrPressed() { - CustomButton::ButtonState state = GetState(); - return state == CustomButton::STATE_HOVERED || - state == CustomButton::STATE_PRESSED; +bool CocoaScrollBarThumb::IsStateHovered() const { + return GetState() == CustomButton::STATE_HOVERED; +} + +bool CocoaScrollBarThumb::IsStatePressed() const { + return GetState() == CustomButton::STATE_PRESSED; } gfx::Size CocoaScrollBarThumb::GetPreferredSize() const { - return gfx::Size(kScrollbarThumbWidth, kScrollbarThumbWidth); + return gfx::Size(kScrollbarThumbThickness, kScrollbarThumbThickness); } void CocoaScrollBarThumb::OnPaint(gfx::Canvas* canvas) { - CocoaScrollBar* scrollbar = static_cast<CocoaScrollBar*>(scroll_bar()); - DCHECK(scrollbar); - SkColor thumb_color = kScrollerDefaultThumbColor; - if (scrollbar->GetScrollerStyle() == NSScrollerStyleOverlay || - IsStateHoverOrPressed()) { + if (cocoa_scroll_bar()->GetScrollerStyle() == NSScrollerStyleOverlay || + IsStateHovered() || + IsStatePressed()) { thumb_color = kScrollerHoverThumbColor; } @@ -105,17 +127,36 @@ paint.setAntiAlias(true); paint.setStyle(SkPaint::kFill_Style); paint.setColor(thumb_color); - const SkScalar radius = std::min(local_bounds.width(), local_bounds.height()); + const SkScalar radius = + std::min(local_bounds.width(), local_bounds.height()); canvas->DrawRoundRect(local_bounds, radius, paint); } +bool CocoaScrollBarThumb::OnMousePressed(const ui::MouseEvent& event) { + // Ignore the mouse press if the scrollbar is hidden. + if (cocoa_scroll_bar()->IsScrollbarFullyHidden()) + return false; + + return BaseScrollBarThumb::OnMousePressed(event); +} + +void CocoaScrollBarThumb::OnMouseReleased(const ui::MouseEvent& event) { + BaseScrollBarThumb::OnMouseReleased(event); + scroll_bar()->OnMouseReleased(event); +} + void CocoaScrollBarThumb::OnMouseEntered(const ui::MouseEvent& event) { BaseScrollBarThumb::OnMouseEntered(event); - CocoaScrollBar* scrollbar = static_cast<CocoaScrollBar*>(scroll_bar()); - scrollbar->OnMouseEnteredScrollbarThumb(event); + scroll_bar()->OnMouseEntered(event); } -} // namespace +void CocoaScrollBarThumb::OnMouseExited(const ui::MouseEvent& event) { + // The thumb should remain pressed when dragged, even if the mouse leaves + // the scrollview. The thumb will be set back to its hover or normal state + // when the mouse is released. + if (GetState() != CustomButton::STATE_PRESSED) + SetState(CustomButton::STATE_NORMAL); +} ////////////////////////////////////////////////////////////////// // CocoaScrollBar class @@ -126,7 +167,10 @@ FROM_HERE, base::TimeDelta::FromMilliseconds(kScrollbarHideTimeoutMs), base::Bind(&CocoaScrollBar::HideScrollbar, base::Unretained(this)), - false) { + false), + expand_animation_(kExpandDurationMs, kExpandFrameRateHz, this), + is_expanded_(false), + did_start_dragging_(false) { bridge_.reset([[ViewsScrollbarBridge alloc] initWithDelegate:this]); scroller_style_ = [ViewsScrollbarBridge getPreferredScrollerStyle]; @@ -145,10 +189,17 @@ gfx::Rect CocoaScrollBar::GetTrackBounds() const { gfx::Rect local_bounds(GetLocalBounds()); - local_bounds.Inset(kScrollbarThumbInset, kScrollbarThumbInset); + + int inset = kScrollbarThumbInset; + if (is_expanded_) { + inset = expand_animation_. + CurrentValueBetween(kScrollbarThumbInset, + kExpandedScrollbarThumbInset); + } + local_bounds.Inset(inset, inset); gfx::Size track_size = local_bounds.size(); - track_size.SetToMax(GetThumb()->size()); + track_size.SetToMax(GetThumb()->GetPreferredSize()); local_bounds.set_size(track_size); return local_bounds; } @@ -157,18 +208,32 @@ // CocoaScrollBar, ScrollBar: int CocoaScrollBar::GetLayoutSize() const { - return scroller_style_ == NSScrollerStyleOverlay ? 0 : kScrollbarWidth; + return scroller_style_ == NSScrollerStyleOverlay ? 0 : ScrollbarThickness(); } int CocoaScrollBar::GetContentOverlapSize() const { - return scroller_style_ == NSScrollerStyleLegacy ? 0 : kScrollbarWidth; + return scroller_style_ == NSScrollerStyleLegacy ? 0 : ScrollbarThickness(); } ////////////////////////////////////////////////////////////////// -// CocoaScrollBar::Views: +// CocoaScrollBar::View: void CocoaScrollBar::Layout() { - GetThumb()->SetBoundsRect(GetTrackBounds()); + // Set the thickness of the thumb according to the track bounds. + // The length of the thumb is set by BaseScrollBar::Update(). + gfx::Rect thumb_bounds(GetThumb()->bounds()); + gfx::Rect track_bounds(GetTrackBounds()); + if (IsHorizontal()) { + GetThumb()->SetBounds(thumb_bounds.x(), + track_bounds.y(), + thumb_bounds.width(), + track_bounds.height()); + } else { + GetThumb()->SetBounds(track_bounds.x(), + thumb_bounds.y(), + track_bounds.width(), + thumb_bounds.height()); + } } gfx::Size CocoaScrollBar::GetPreferredSize() const { @@ -217,28 +282,60 @@ canvas->DrawRect(outer_border, paint); } -void CocoaScrollBar::OnMouseEnteredScrollbarThumb(const ui::MouseEvent& event) { +bool CocoaScrollBar::OnMousePressed(const ui::MouseEvent& event) { + // Ignore the mouse press if the scrollbar is hidden. + if (IsScrollbarFullyHidden()) + return false; + + return BaseScrollBar::OnMousePressed(event); +} + +void CocoaScrollBar::OnMouseReleased(const ui::MouseEvent& event) { + ResetOverlayScrollbar(); +} + +void CocoaScrollBar::OnMouseEntered(const ui::MouseEvent& event) { if (scroller_style_ != NSScrollerStyleOverlay) return; - // If the scrollbar thumb has not compeletely faded away, then reshow it when + // If the scrollbar thumb did not completely fade away, then reshow it when // the mouse enters the scrollbar thumb. - if (layer()->opacity()) + if (!IsScrollbarFullyHidden()) ShowScrollbar(); + // Expand the scrollbar. If the scrollbar is hidden, don't animate it. + if (!is_expanded_) { + SetScrolltrackVisible(true); + + is_expanded_ = true; + if (IsScrollbarFullyHidden()) { + expand_animation_.SetCurrentValue(1.0); + UpdateScrollbarThickness(); + } else { + expand_animation_.Start(); + } + } + hide_scrollbar_timer_.Reset(); } -////////////////////////////////////////////////////////////////// -// CocoaScrollBar::ScrollDelegate: +void CocoaScrollBar::OnMouseExited(const ui::MouseEvent& event) { + ResetOverlayScrollbar(); +} -bool CocoaScrollBar::OnScroll(float dx, float dy) { - bool did_scroll = BaseScrollBar::OnScroll(dx, dy); - if (did_scroll && scroller_style_ == NSScrollerStyleOverlay) { +////////////////////////////////////////////////////////////////// +// CocoaScrollBar::BaseScrollBar: + +void CocoaScrollBar::ScrollToPosition(int position) { + BaseScrollBar::ScrollToPosition(position); + + if (GetCocoaScrollBarThumb()->IsStatePressed()) + did_start_dragging_ = true; + + if (scroller_style_ == NSScrollerStyleOverlay) { ShowScrollbar(); hide_scrollbar_timer_.Reset(); } - return did_scroll; } ////////////////////////////////////////////////////////////////// @@ -250,6 +347,10 @@ if (scroller_style_ == scroller_style) return; + // Cancel all of the animations. + expand_animation_.Stop(); + layer()->GetAnimator()->AbortAllAnimations(); + scroller_style_ = scroller_style; // Ensure that the ScrollView updates the scrollbar's layout. @@ -259,43 +360,111 @@ if (scroller_style_ == NSScrollerStyleOverlay) { // Hide the scrollbar, but don't fade out. layer()->SetOpacity(0.0); + ResetOverlayScrollbar(); } else { + is_expanded_ = false; + SetScrolltrackVisible(true); ShowScrollbar(); } } ////////////////////////////////////////////////////////////////// +// CocoaScrollBar::ImplicitAnimationObserver: + +void CocoaScrollBar::OnImplicitAnimationsCompleted() { + DCHECK_EQ(scroller_style_, NSScrollerStyleOverlay); + ResetOverlayScrollbar(); +} + +////////////////////////////////////////////////////////////////// +// CocoaScrollBar::AnimationDelegate: + +void CocoaScrollBar::AnimationProgressed(const gfx::Animation* animation) { + DCHECK(is_expanded_); + UpdateScrollbarThickness(); +} + +////////////////////////////////////////////////////////////////// +// CocoaScrollBar, public: + +bool CocoaScrollBar::IsScrollbarFullyHidden() const { + return layer()->opacity() == 0.0; +} + +////////////////////////////////////////////////////////////////// // CocoaScrollBar, private: +// TODO(spqchan): Animate the scrollbar shrinking back to its original +// thickness when the scrollbar fades away so that it'll look less janky. void CocoaScrollBar::HideScrollbar() { DCHECK_EQ(scroller_style_, NSScrollerStyleOverlay); - // If the thumb is in a hover or pressed state, we don't want the scrollbar - // to disappear. As such, we should reset the timer. - CocoaScrollBarThumb* thumb = static_cast<CocoaScrollBarThumb*>(GetThumb()); - if (thumb->IsStateHoverOrPressed()) { + // Don't disappear if the scrollbar is hovered, or pressed but not dragged. + // This behavior matches the Cocoa scrollbars, but differs from the Blink + // scrollbars which would just disappear. + CocoaScrollBarThumb* thumb = GetCocoaScrollBarThumb(); + if (IsMouseHovered() || thumb->IsStateHovered() || + (thumb->IsStatePressed() && !did_start_dragging_)) { hide_scrollbar_timer_.Reset(); return; } + did_start_dragging_ = false; + ui::ScopedLayerAnimationSettings animation(layer()->GetAnimator()); animation.SetTransitionDuration( base::TimeDelta::FromMilliseconds(kFadeDurationMs)); + animation.AddObserver(this); layer()->SetOpacity(0.0); } void CocoaScrollBar::ShowScrollbar() { // Updates the scrolltrack and repaint it, if necessary. - CocoaScrollBarThumb* thumb = static_cast<CocoaScrollBarThumb*>(GetThumb()); - bool has_scrolltrack = scroller_style_ == NSScrollerStyleLegacy || - thumb->IsStateHoverOrPressed(); - if (has_scrolltrack_ != has_scrolltrack) { - has_scrolltrack_ = has_scrolltrack; - SchedulePaint(); - } - layer()->SetOpacity(1.0); hide_scrollbar_timer_.Stop(); } +bool CocoaScrollBar::IsHoverOrPressedState() const { + CocoaScrollBarThumb* thumb = GetCocoaScrollBarThumb(); + return thumb->IsStateHovered() || + thumb->IsStatePressed() || + IsMouseHovered(); +} + +void CocoaScrollBar::UpdateScrollbarThickness() { + int thickness = ScrollbarThickness(); + if (IsHorizontal()) + SetBounds(x(), bounds().bottom() - thickness, width(), thickness); + else + SetBounds(bounds().right() - thickness, y(), thickness, height()); +} + +void CocoaScrollBar::ResetOverlayScrollbar() { + if (!IsHoverOrPressedState() && IsScrollbarFullyHidden()) { + if (is_expanded_) { + is_expanded_ = false; + expand_animation_.Stop(); + UpdateScrollbarThickness(); + } + SetScrolltrackVisible(false); + } +} + +int CocoaScrollBar::ScrollbarThickness() const { + if (scroller_style_ == NSScrollerStyleLegacy || !is_expanded_) + return kScrollbarThickness; + + return expand_animation_. + CurrentValueBetween(kScrollbarThickness, kExpandedScrollbarThickness); +} + +void CocoaScrollBar::SetScrolltrackVisible(bool visible) { + has_scrolltrack_ = visible; + SchedulePaint(); +} + +CocoaScrollBarThumb* CocoaScrollBar::GetCocoaScrollBarThumb() const { + return static_cast<CocoaScrollBarThumb*>(GetThumb()); +} + } // namespace views
diff --git a/ui/views/layout/box_layout.cc b/ui/views/layout/box_layout.cc index 10f82b9a..9c3922e7 100644 --- a/ui/views/layout/box_layout.cc +++ b/ui/views/layout/box_layout.cc
@@ -15,8 +15,6 @@ int between_child_spacing) : orientation_(orientation), inside_border_insets_(inside_border_vertical_spacing, - inside_border_horizontal_spacing, - inside_border_vertical_spacing, inside_border_horizontal_spacing), between_child_spacing_(between_child_spacing), main_axis_alignment_(MAIN_AXIS_ALIGNMENT_START),
diff --git a/ui/views/view.cc b/ui/views/view.cc index 9edda26..4c62a00 100644 --- a/ui/views/view.cc +++ b/ui/views/view.cc
@@ -106,7 +106,6 @@ enabled_(true), notify_enter_exit_on_child_(false), registered_for_visible_bounds_notification_(false), - clip_insets_(0, 0, 0, 0), needs_layout_(true), snap_layer_to_pixel_boundary_(false), flip_canvas_on_paint_for_rtl_ui_(false),
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc index f79b3c4..92cc44e 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -600,12 +600,13 @@ GetWidget()->GetRootView()->SchedulePaint(); } -void DesktopWindowTreeHostWin::EnableInactiveRendering() { - native_widget_delegate_->EnableInactiveRendering(); +void DesktopWindowTreeHostWin::SetAlwaysRenderAsActive( + bool always_render_as_active) { + native_widget_delegate_->SetAlwaysRenderAsActive(always_render_as_active); } -bool DesktopWindowTreeHostWin::IsInactiveRenderingDisabled() { - return native_widget_delegate_->IsInactiveRenderingDisabled(); +bool DesktopWindowTreeHostWin::IsAlwaysRenderAsActive() { + return native_widget_delegate_->IsAlwaysRenderAsActive(); } bool DesktopWindowTreeHostWin::CanResize() const { @@ -693,7 +694,7 @@ } void DesktopWindowTreeHostWin::HandleAppDeactivated() { - native_widget_delegate_->EnableInactiveRendering(); + native_widget_delegate_->SetAlwaysRenderAsActive(false); } void DesktopWindowTreeHostWin::HandleActivationChanged(bool active) {
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h index 963658a..dee68df 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
@@ -129,8 +129,8 @@ bool IsWidgetWindow() const override; bool IsUsingCustomFrame() const override; void SchedulePaint() override; - void EnableInactiveRendering() override; - bool IsInactiveRenderingDisabled() override; + void SetAlwaysRenderAsActive(bool always_render_as_active) override; + bool IsAlwaysRenderAsActive() override; bool CanResize() const override; bool CanMaximize() const override; bool CanMinimize() const override;
diff --git a/ui/views/widget/native_widget_delegate.h b/ui/views/widget/native_widget_delegate.h index 224972c..1e8ad05 100644 --- a/ui/views/widget/native_widget_delegate.h +++ b/ui/views/widget/native_widget_delegate.h
@@ -51,8 +51,12 @@ // Returns true if the window can be activated. virtual bool CanActivate() const = 0; - virtual bool IsInactiveRenderingDisabled() const = 0; - virtual void EnableInactiveRendering() = 0; + // Prevents the window from being rendered as deactivated. This state is + // reset automatically as soon as the window becomes activated again. There is + // no ability to control the state through this API as this leads to sync + // problems. + virtual void SetAlwaysRenderAsActive(bool always_render_as_active) = 0; + virtual bool IsAlwaysRenderAsActive() const = 0; // Called when the activation state of a window has changed. virtual void OnNativeWidgetActivationChanged(bool active) = 0;
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index 3effd1b4..ffc5e0d 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -153,7 +153,7 @@ ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET), is_secondary_widget_(true), frame_type_(FRAME_TYPE_DEFAULT), - disable_inactive_rendering_(false), + always_render_as_active_(false), widget_closed_(false), saved_show_state_(ui::SHOW_STATE_DEFAULT), focus_on_creation_(true), @@ -256,7 +256,6 @@ return native_widget ? native_widget->GetWidget() : NULL; } - // static void Widget::GetAllChildWidgets(gfx::NativeView native_view, Widgets* children) { @@ -662,10 +661,6 @@ return native_widget_->IsActive(); } -void Widget::DisableInactiveRendering() { - SetInactiveRenderingDisabled(true); -} - void Widget::SetAlwaysOnTop(bool on_top) { native_widget_->SetAlwaysOnTop(on_top); } @@ -986,7 +981,7 @@ // In screen coordinate. gfx::Point mouse_location = EventMonitor::GetLastMouseLocation(); if (!GetWindowBoundsInScreen().Contains(mouse_location)) - return; + return; // Convert: screen coordinate -> widget coordinate. View::ConvertPointFromScreen(root_view_.get(), &mouse_location); @@ -1010,8 +1005,7 @@ non_client_view_->SizeConstraintsChanged(); } -void Widget::OnOwnerClosing() { -} +void Widget::OnOwnerClosing() {} //////////////////////////////////////////////////////////////////////////////// // Widget, NativeWidgetDelegate implementation: @@ -1028,12 +1022,8 @@ return widget_delegate_->CanActivate(); } -bool Widget::IsInactiveRenderingDisabled() const { - return disable_inactive_rendering_; -} - -void Widget::EnableInactiveRendering() { - SetInactiveRenderingDisabled(false); +bool Widget::IsAlwaysRenderAsActive() const { + return always_render_as_active_; } void Widget::OnNativeWidgetActivationChanged(bool active) { @@ -1380,22 +1370,24 @@ root_view_.reset(); } -void Widget::OnDragWillStart() { -} +void Widget::OnDragWillStart() {} -void Widget::OnDragComplete() { -} +void Widget::OnDragComplete() {} //////////////////////////////////////////////////////////////////////////////// // Widget, private: -void Widget::SetInactiveRenderingDisabled(bool value) { - if (value == disable_inactive_rendering_) +void Widget::SetAlwaysRenderAsActive(bool always_render_as_active) { + if (always_render_as_active_ == always_render_as_active) return; - disable_inactive_rendering_ = value; - if (non_client_view_) - non_client_view_->SetInactiveRenderingDisabled(value); + always_render_as_active_ = always_render_as_active; + + // If active, the frame should already be painted. Otherwise, + // |always_render_as_active_| just changed, and the widget is inactive, so + // schedule a repaint. + if (non_client_view_ && !IsActive()) + non_client_view_->frame_view()->SchedulePaint(); } void Widget::SaveWindowPlacement() {
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index 456cbb56..3512453 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h
@@ -500,12 +500,6 @@ // Returns whether the Widget is the currently active window. virtual bool IsActive() const; - // Prevents the window from being rendered as deactivated. This state is - // reset automatically as soon as the window becomes activated again. There is - // no ability to control the state through this API as this leads to sync - // problems. - void DisableInactiveRendering(); - // Sets the widget to be on top of all other widgets in the windowing system. void SetAlwaysOnTop(bool on_top); @@ -777,8 +771,8 @@ bool IsModal() const override; bool IsDialogBox() const override; bool CanActivate() const override; - bool IsInactiveRenderingDisabled() const override; - void EnableInactiveRendering() override; + bool IsAlwaysRenderAsActive() const override; + void SetAlwaysRenderAsActive(bool always_render_as_active) override; void OnNativeWidgetActivationChanged(bool active) override; void OnNativeFocus() override; void OnNativeBlur() override; @@ -843,10 +837,6 @@ friend class CustomButtonTest; friend class TextfieldTest; - // Sets the value of |disable_inactive_rendering_|. If the value changes, - // both the NonClientView and WidgetDelegate are notified. - void SetInactiveRenderingDisabled(bool value); - // Persists the window's restored position and "show" state using the // window delegate. void SaveWindowPlacement(); @@ -913,7 +903,7 @@ // True when the window should be rendered as active, regardless of whether // or not it actually is. - bool disable_inactive_rendering_; + bool always_render_as_active_; // Set to true if the widget is in the process of closing. bool widget_closed_;
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc index 3e8015af..f68663b 100644 --- a/ui/views/widget/widget_unittest.cc +++ b/ui/views/widget/widget_unittest.cc
@@ -625,7 +625,6 @@ widget->Activate(); widget->Deactivate(); widget->IsActive(); - widget->DisableInactiveRendering(); widget->SetAlwaysOnTop(true); widget->IsAlwaysOnTop(); widget->Maximize();
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index 88387d4..590b087 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -1600,7 +1600,7 @@ // cleared before it is converted to BOOL. BOOL active = static_cast<BOOL>(LOWORD(w_param)); - bool inactive_rendering_disabled = delegate_->IsInactiveRenderingDisabled(); + bool render_as_active = delegate_->IsAlwaysRenderAsActive(); if (!delegate_->IsWidgetWindow()) { SetMsgHandled(FALSE); @@ -1611,8 +1611,8 @@ return TRUE; // On activation, lift any prior restriction against rendering as inactive. - if (active && inactive_rendering_disabled) - delegate_->EnableInactiveRendering(); + if (active && render_as_active) + delegate_->SetAlwaysRenderAsActive(false); if (delegate_->IsUsingCustomFrame()) { // TODO(beng, et al): Hack to redraw this window and child windows @@ -1640,7 +1640,7 @@ } return DefWindowProcWithRedrawLock( - WM_NCACTIVATE, inactive_rendering_disabled || active, 0); + WM_NCACTIVATE, render_as_active || active, 0); } LRESULT HWNDMessageHandler::OnNCCalcSize(BOOL mode, LPARAM l_param) {
diff --git a/ui/views/win/hwnd_message_handler_delegate.h b/ui/views/win/hwnd_message_handler_delegate.h index 55ac440..3e68197 100644 --- a/ui/views/win/hwnd_message_handler_delegate.h +++ b/ui/views/win/hwnd_message_handler_delegate.h
@@ -37,8 +37,8 @@ virtual bool IsUsingCustomFrame() const = 0; virtual void SchedulePaint() = 0; - virtual void EnableInactiveRendering() = 0; - virtual bool IsInactiveRenderingDisabled() = 0; + virtual void SetAlwaysRenderAsActive(bool always_render_as_active) = 0; + virtual bool IsAlwaysRenderAsActive() = 0; virtual bool CanResize() const = 0; virtual bool CanMaximize() const = 0;
diff --git a/ui/views/window/non_client_view.cc b/ui/views/window/non_client_view.cc index 7670a2eb..1a2a2c8 100644 --- a/ui/views/window/non_client_view.cc +++ b/ui/views/window/non_client_view.cc
@@ -84,10 +84,6 @@ SchedulePaint(); } -void NonClientView::SetInactiveRenderingDisabled(bool disable) { - frame_view_->SetInactiveRenderingDisabled(disable); -} - gfx::Rect NonClientView::GetWindowBoundsForClientBounds( const gfx::Rect client_bounds) const { return frame_view_->GetWindowBoundsForClientBounds(client_bounds); @@ -244,20 +240,8 @@ NonClientFrameView::~NonClientFrameView() { } -void NonClientFrameView::SetInactiveRenderingDisabled(bool disable) { - if (inactive_rendering_disabled_ == disable) - return; - - bool should_paint_as_active_old = ShouldPaintAsActive(); - inactive_rendering_disabled_ = disable; - - // The widget schedules a paint when the activation changes. - if (should_paint_as_active_old != ShouldPaintAsActive()) - SchedulePaint(); -} - bool NonClientFrameView::ShouldPaintAsActive() const { - return inactive_rendering_disabled_ || GetWidget()->IsActive(); + return GetWidget()->IsAlwaysRenderAsActive() || GetWidget()->IsActive(); } int NonClientFrameView::GetHTComponentForFrame(const gfx::Point& point, @@ -320,7 +304,7 @@ //////////////////////////////////////////////////////////////////////////////// // NonClientFrameView, protected: -NonClientFrameView::NonClientFrameView() : inactive_rendering_disabled_(false) { +NonClientFrameView::NonClientFrameView() { SetEventTargeter( scoped_ptr<views::ViewTargeter>(new views::ViewTargeter(this))); }
diff --git a/ui/views/window/non_client_view.h b/ui/views/window/non_client_view.h index 65ac395..d88e762 100644 --- a/ui/views/window/non_client_view.h +++ b/ui/views/window/non_client_view.h
@@ -42,14 +42,9 @@ ~NonClientFrameView() override; - // Sets whether the window should be rendered as active regardless of the - // actual active state. Used when bubbles become active to make their parent - // appear active. A value of true makes the window render as active always, - // false gives normal behavior. - void SetInactiveRenderingDisabled(bool disable); - // Used to determine if the frame should be painted as active. Keyed off the - // window's actual active state and |inactive_rendering_disabled_|. + // window's actual active state and whether the widget should be rendered as + // active. bool ShouldPaintAsActive() const; // Helper for non-client view implementations to determine which area of the @@ -102,11 +97,6 @@ // View: void OnBoundsChanged(const gfx::Rect& previous_bounds) override; - - private: - // Prevents the non-client frame view from being rendered as inactive when - // true. - bool inactive_rendering_disabled_; }; //////////////////////////////////////////////////////////////////////////////// @@ -174,11 +164,6 @@ // or frame style. void UpdateFrame(); - // Prevents the window from being rendered as deactivated when |disable| is - // true, until called with |disable| false. Used when a sub-window is to be - // shown that shouldn't visually de-activate the window. - void SetInactiveRenderingDisabled(bool disable); - // Returns the bounds of the window required to display the content area at // the specified bounds. gfx::Rect GetWindowBoundsForClientBounds(const gfx::Rect client_bounds) const;